package amidst.map.layers; import java.util.Arrays; import java.util.List; import java.util.Random; import amidst.Options; import amidst.logging.Log; import amidst.map.Fragment; import amidst.map.IconLayer; import amidst.map.MapObjectDesertTemple; import amidst.map.MapObjectJungleTemple; import amidst.map.MapObjectWitchHut; import amidst.minecraft.Biome; import amidst.minecraft.MinecraftUtil; import amidst.version.VersionInfo; public class TempleLayer extends IconLayer { public static List<Biome> validBiomes; private Random random = new Random(); public TempleLayer() { validBiomes = getValidBiomes(); } @Override public boolean isVisible() { return Options.instance.showTemples.get(); } @Override public void generateMapObjects(Fragment frag) { int size = Fragment.SIZE >> 4; for (int x = 0; x < size; x++) { for (int y = 0; y < size; y++) { int chunkX = x + frag.getChunkX(); int chunkY = y + frag.getChunkY(); Biome chunkBiome = checkChunk(chunkX, chunkY); if (chunkBiome != null) { if (chunkBiome == Biome.swampland) { frag.addObject(new MapObjectWitchHut(x << 4, y << 4).setParent(this)); } else if (chunkBiome.name.contains("Jungle")) { frag.addObject(new MapObjectJungleTemple(x << 4, y << 4).setParent(this)); } else if (chunkBiome.name.contains("Desert")) { frag.addObject(new MapObjectDesertTemple(x << 4, y << 4).setParent(this)); } else { Log.e("No known structure for this biome type. checkChunk() may be faulting."); } } } } } public List<Biome> getValidBiomes() { Biome[] validBiomes; if (MinecraftUtil.getVersion().isAtLeast(VersionInfo.V1_4_2)) { validBiomes = new Biome[] { Biome.desert, Biome.desertHills, Biome.jungle, Biome.jungleHills, Biome.swampland }; } else if (MinecraftUtil.getVersion().isAtLeast(VersionInfo.V12w22a)) { validBiomes = new Biome[] { Biome.desert, Biome.desertHills, Biome.jungle }; } else { validBiomes = new Biome[] { Biome.desert, Biome.desertHills }; } return Arrays.asList(validBiomes); } /** * @return null if there is no structure in the chunk, otherwise * returns the biome (from validBiomes) that determines the type * of structure. */ public Biome checkChunk(int chunkX, int chunkY) { Biome result = null; int maxDistanceBetweenScatteredFeatures = 32; int minDistanceBetweenScatteredFeatures = 8; int k = chunkX; int m = chunkY; if (chunkX < 0) chunkX -= maxDistanceBetweenScatteredFeatures - 1; if (chunkY < 0) chunkY -= maxDistanceBetweenScatteredFeatures - 1; int n = chunkX / maxDistanceBetweenScatteredFeatures; int i1 = chunkY / maxDistanceBetweenScatteredFeatures; long l1 = n * 341873128712L + i1 * 132897987541L + Options.instance.seed + 14357617; random.setSeed(l1); n *= maxDistanceBetweenScatteredFeatures; i1 *= maxDistanceBetweenScatteredFeatures; n += random.nextInt(maxDistanceBetweenScatteredFeatures - minDistanceBetweenScatteredFeatures); i1 += random.nextInt(maxDistanceBetweenScatteredFeatures - minDistanceBetweenScatteredFeatures); if (k == n && m == i1) { // This is a potential feature biome // Since the structure-size that would be passed to MinecraftUtil.isValidBiome() // is 0, we can use MinecraftUtil.getBiomeAt() here instead, which tells us what kind of // structure it is. Biome chunkBiome = MinecraftUtil.getBiomeAt(k * 16 + 8, m * 16 + 8); if (validBiomes.contains(chunkBiome)) result = chunkBiome; } return result; } }