package amidst.map.layers;
import java.awt.Point;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Random;
import amidst.Options;
import amidst.map.Fragment;
import amidst.map.IconLayer;
import amidst.map.MapObjectStronghold;
import amidst.minecraft.Biome;
import amidst.minecraft.MinecraftUtil;
import amidst.version.VersionInfo;
public class StrongholdLayer extends IconLayer {
public static StrongholdLayer instance;
private static final Biome[] biomesDefault = {
Biome.desert,
Biome.forest,
Biome.extremeHills,
Biome.swampland
};
private static final Biome[] biomes1_0 = {
Biome.desert,
Biome.forest,
Biome.extremeHills,
Biome.swampland,
Biome.taiga,
Biome.icePlains,
Biome.iceMountains
};
private static final Biome[] biomes1_1 = {
Biome.desert,
Biome.forest,
Biome.extremeHills,
Biome.swampland,
Biome.taiga,
Biome.icePlains,
Biome.iceMountains,
Biome.desertHills,
Biome.forestHills,
Biome.extremeHillsEdge
};
private static final Biome[] biomes12w03a = {
Biome.desert,
Biome.forest,
Biome.extremeHills,
Biome.swampland,
Biome.taiga,
Biome.icePlains,
Biome.iceMountains,
Biome.desertHills,
Biome.forestHills,
Biome.extremeHillsEdge,
Biome.jungle,
Biome.jungleHills
};
private MapObjectStronghold[] strongholds = new MapObjectStronghold[3];
public StrongholdLayer() {
instance = this;
}
@Override
public boolean isVisible() {
return Options.instance.showStrongholds.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();
if (checkChunk(chunkX, chunkY)) { // TODO: This does not need a per-chunk test!
// FIXME: Possible use of checkChunk causing negative icons to be misaligned!
frag.addObject(new MapObjectStronghold(x << 4, y << 4).setParent(this));
}
}
}
}
public void findStrongholds() {
Random random = new Random();
random.setSeed(Options.instance.seed);
// TODO: Replace this system!
Biome[] validBiomes = biomesDefault;
if (MinecraftUtil.getVersion() == VersionInfo.V1_9pre6 || MinecraftUtil.getVersion() == VersionInfo.V1_0)
validBiomes = biomes1_0;
if (MinecraftUtil.getVersion() == VersionInfo.V1_1)
validBiomes = biomes1_1;
if (MinecraftUtil.getVersion().isAtLeast(VersionInfo.V12w03a))
validBiomes = biomes12w03a;
List<Biome> biomeArrayList = Arrays.asList(validBiomes);
if (MinecraftUtil.getVersion().isAtLeast(VersionInfo.V13w36a)) {
biomeArrayList = new ArrayList<Biome>();
for (int i = 0; i < Biome.biomes.length; i++) {
if ((Biome.biomes[i] != null) && (Biome.biomes[i].type.value1 > 0f)) {
biomeArrayList.add(Biome.biomes[i]);
}
}
}
double angle = random.nextDouble() * 3.141592653589793D * 2.0D;
for (int i = 0; i < 3; i++) {
double distance = (1.25D + random.nextDouble()) * 32.0D;
int x = (int)Math.round(Math.cos(angle) * distance);
int y = (int)Math.round(Math.sin(angle) * distance);
Point strongholdLocation = MinecraftUtil.findValidLocation((x << 4) + 8, (y << 4) + 8, 112, biomeArrayList, random);
if (strongholdLocation != null) {
x = strongholdLocation.x >> 4;
y = strongholdLocation.y >> 4;
}
strongholds[i] = new MapObjectStronghold((x << 4), (y << 4));
angle += 6.283185307179586D / 3.0D;
}
}
public boolean checkChunk(int chunkX, int chunkY) {
for (int i = 0; i < 3; i++) {
int strongholdChunkX = strongholds[i].x >> 4;
int strongholdChunkY = strongholds[i].y >> 4;
if ((strongholdChunkX == chunkX) && (strongholdChunkY == chunkY))
return true;
}
return false;
}
public MapObjectStronghold[] getStrongholds() {
return strongholds;
}
@Override
public void reload() {
findStrongholds();
}
}