blob: e28b83a0abdb64d3c1e09349c349f01a6ee5cada [file] [log] [blame] [raw]
package net.glowstone.generator.structures;
import java.util.HashMap;
import java.util.Map;
import java.util.Random;
import org.bukkit.Location;
import org.bukkit.World;
import org.bukkit.block.Biome;
/**
* Desert temple, jungle temple, or witch hut.
*/
public class GlowTemple extends GlowStructure {
private static final int MIN_DISTANCE = 8;
private static final int MAX_DISTANCE = 32;
private final Map<Biome, TempleType> types = new HashMap<>();
/**
* Creates a structure with no pieces.
*
* @param world the world to generate in
* @param chunkX the chunk X coordinate
* @param chunkZ the chunk Z coordinate
*/
public GlowTemple(World world, int chunkX, int chunkZ) {
super(world, chunkX, chunkZ);
types.put(Biome.DESERT, TempleType.DESERT_TEMPLE);
types.put(Biome.DESERT_HILLS, TempleType.DESERT_TEMPLE);
types.put(Biome.JUNGLE, TempleType.JUNGLE_TEMPLE);
types.put(Biome.JUNGLE_HILLS, TempleType.JUNGLE_TEMPLE);
types.put(Biome.SWAMPLAND, TempleType.WITCH_HUT);
}
/**
* Creates a random temple or witch hut.
*
* @param world the world to generate in
* @param random the PRNG that will choose this temple's orientation
* @param chunkX the chunk X coordinate
* @param chunkZ the chunk Z coordinate
*/
public GlowTemple(World world, Random random, int chunkX, int chunkZ) {
this(world, chunkX, chunkZ);
int x = chunkX << 4;
int z = chunkZ << 4;
Biome biome = world.getBiome(x + 8, z + 8);
if (types.containsKey(biome)) {
switch (types.get(biome)) {
case JUNGLE_TEMPLE:
addPiece(new GlowJungleTemple(random,
new Location(world, x, world.getSeaLevel(), z)));
break;
case WITCH_HUT:
addPiece(
new GlowWitchHut(random, new Location(world, x, world.getSeaLevel(), z)));
break;
default:
addPiece(new GlowDesertTemple(random,
new Location(world, x, world.getSeaLevel(), z)));
}
wrapAllPieces();
}
}
@Override
public boolean shouldGenerate(Random random) {
Biome biome = world.getBiome((chunkX << 4) + 8, (chunkZ << 4) + 8);
if (types.containsKey(biome)) {
int x = chunkX < 0 ? (chunkX - MAX_DISTANCE - 1) / MAX_DISTANCE : chunkX / MAX_DISTANCE;
int z = chunkZ < 0 ? (chunkZ - MAX_DISTANCE - 1) / MAX_DISTANCE : chunkZ / MAX_DISTANCE;
x = x * MAX_DISTANCE + random.nextInt(MAX_DISTANCE - MIN_DISTANCE);
z = z * MAX_DISTANCE + random.nextInt(MAX_DISTANCE - MIN_DISTANCE);
if (x == chunkX && z == chunkZ) {
return true;
}
}
return false;
}
public enum TempleType {
DESERT_TEMPLE,
JUNGLE_TEMPLE,
WITCH_HUT
}
}