package net.minecraft.server;
import com.google.common.collect.Lists;
import it.unimi.dsi.fastutil.objects.ObjectIterator;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Random;
import java.util.Map.Entry;
public class WorldGenStronghold extends StructureGenerator {
private final List<BiomeBase> a;
private boolean b;
private ChunkCoordIntPair[] d;
private double h;
private int i;
public WorldGenStronghold() {
this.d = new ChunkCoordIntPair[128];
this.h = 32.0D;
this.i = 3;
this.a = Lists.newArrayList();
Iterator iterator = BiomeBase.REGISTRY_ID.iterator();
while (iterator.hasNext()) {
BiomeBase biomebase = (BiomeBase) iterator.next();
if (biomebase != null && biomebase.j() > 0.0F) {
this.a.add(biomebase);
}
}
}
public WorldGenStronghold(Map<String, String> map) {
this();
Iterator iterator = map.entrySet().iterator();
while (iterator.hasNext()) {
Entry entry = (Entry) iterator.next();
if (((String) entry.getKey()).equals("distance")) {
this.h = MathHelper.a((String) entry.getValue(), this.h, 1.0D);
} else if (((String) entry.getKey()).equals("count")) {
this.d = new ChunkCoordIntPair[MathHelper.a((String) entry.getValue(), this.d.length, 1)];
} else if (((String) entry.getKey()).equals("spread")) {
this.i = MathHelper.a((String) entry.getValue(), this.i, 1);
}
}
}
public String a() {
return "Stronghold";
}
public BlockPosition getNearestGeneratedFeature(World world, BlockPosition blockposition, boolean flag) {
this.g = world; // Paper
if (!this.b) {
this.c();
this.b = true;
}
BlockPosition blockposition1 = null;
BlockPosition.MutableBlockPosition blockposition_mutableblockposition = new BlockPosition.MutableBlockPosition(0, 0, 0);
double d0 = Double.MAX_VALUE;
ChunkCoordIntPair[] achunkcoordintpair = this.d;
int i = achunkcoordintpair.length;
for (int j = 0; j < i; ++j) {
ChunkCoordIntPair chunkcoordintpair = achunkcoordintpair[j];
blockposition_mutableblockposition.c((chunkcoordintpair.x << 4) + 8, 32, (chunkcoordintpair.z << 4) + 8);
double d1 = blockposition_mutableblockposition.n(blockposition);
if (blockposition1 == null) {
blockposition1 = new BlockPosition(blockposition_mutableblockposition);
d0 = d1;
} else if (d1 < d0) {
blockposition1 = new BlockPosition(blockposition_mutableblockposition);
d0 = d1;
}
}
return blockposition1;
}
protected boolean a(int i, int j) {
if (!this.b) {
this.c();
this.b = true;
}
ChunkCoordIntPair[] achunkcoordintpair = this.d;
int k = achunkcoordintpair.length;
for (int l = 0; l < k; ++l) {
ChunkCoordIntPair chunkcoordintpair = achunkcoordintpair[l];
if (i == chunkcoordintpair.x && j == chunkcoordintpair.z) {
return true;
}
}
return false;
}
private void c() {
this.a(this.g);
int i = 0;
ObjectIterator objectiterator = this.c.values().iterator();
while (objectiterator.hasNext()) {
StructureStart structurestart = (StructureStart) objectiterator.next();
if (i < this.d.length) {
this.d[i++] = new ChunkCoordIntPair(structurestart.e(), structurestart.f());
}
}
Random random = new Random();
random.setSeed(this.g.getSeed());
double d0 = random.nextDouble() * 3.141592653589793D * 2.0D;
int j = 0;
int k = 0;
int l = this.c.size();
if (l < this.d.length) {
for (int i1 = 0; i1 < this.d.length; ++i1) {
double d1 = 4.0D * this.h + this.h * (double) j * 6.0D + (random.nextDouble() - 0.5D) * this.h * 2.5D;
int j1 = (int) Math.round(Math.cos(d0) * d1);
int k1 = (int) Math.round(Math.sin(d0) * d1);
BlockPosition blockposition = this.g.getWorldChunkManager().a((j1 << 4) + 8, (k1 << 4) + 8, 112, this.a, random);
if (blockposition != null) {
j1 = blockposition.getX() >> 4;
k1 = blockposition.getZ() >> 4;
}
if (i1 >= l) {
this.d[i1] = new ChunkCoordIntPair(j1, k1);
}
d0 += 6.283185307179586D / (double) this.i;
++k;
if (k == this.i) {
++j;
k = 0;
this.i += 2 * this.i / (j + 1);
this.i = Math.min(this.i, this.d.length - i1);
d0 += random.nextDouble() * 3.141592653589793D * 2.0D;
}
}
}
}
protected StructureStart b(int i, int j) {
WorldGenStronghold.WorldGenStronghold2Start worldgenstronghold_worldgenstronghold2start;
for (worldgenstronghold_worldgenstronghold2start = new WorldGenStronghold.WorldGenStronghold2Start(this.g, this.f, i, j); worldgenstronghold_worldgenstronghold2start.c().isEmpty() || ((WorldGenStrongholdPieces.WorldGenStrongholdStart) worldgenstronghold_worldgenstronghold2start.c().get(0)).b == null; worldgenstronghold_worldgenstronghold2start = new WorldGenStronghold.WorldGenStronghold2Start(this.g, this.f, i, j)) {
;
}
return worldgenstronghold_worldgenstronghold2start;
}
public static class WorldGenStronghold2Start extends StructureStart {
public WorldGenStronghold2Start() {}
public WorldGenStronghold2Start(World world, Random random, int i, int j) {
super(i, j);
WorldGenStrongholdPieces.b();
WorldGenStrongholdPieces.WorldGenStrongholdStart worldgenstrongholdpieces_worldgenstrongholdstart = new WorldGenStrongholdPieces.WorldGenStrongholdStart(0, random, (i << 4) + 2, (j << 4) + 2);
this.a.add(worldgenstrongholdpieces_worldgenstrongholdstart);
worldgenstrongholdpieces_worldgenstrongholdstart.a((StructurePiece) worldgenstrongholdpieces_worldgenstrongholdstart, this.a, random);
List list = worldgenstrongholdpieces_worldgenstrongholdstart.c;
while (!list.isEmpty()) {
int k = random.nextInt(list.size());
StructurePiece structurepiece = (StructurePiece) list.remove(k);
structurepiece.a((StructurePiece) worldgenstrongholdpieces_worldgenstrongholdstart, this.a, random);
}
this.d();
this.a(world, random, 10);
}
}
}