package net.minecraft.server;
import com.google.common.collect.Lists;
import com.google.common.collect.Sets;
import com.koloboke.collect.set.hash.HashObjSets;
import java.util.Arrays;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Random;
import java.util.Set;
import java.util.Map.Entry;
public class WorldGenMonument extends StructureGenerator {
private int d;
private int h;
public static final List<BiomeBase> a = Arrays.asList(new BiomeBase[] { Biomes.a, Biomes.z, Biomes.i, Biomes.l, Biomes.m});
public static final List<BiomeBase> b = Arrays.asList(new BiomeBase[] { Biomes.z});
private static final List<BiomeBase.BiomeMeta> i = Lists.newArrayList();
public WorldGenMonument() {
this.d = 32;
this.h = 5;
}
public WorldGenMonument(Map<String, String> map) {
this();
Iterator iterator = map.entrySet().iterator();
while (iterator.hasNext()) {
Entry entry = (Entry) iterator.next();
if (((String) entry.getKey()).equals("spacing")) {
this.d = MathHelper.a((String) entry.getValue(), this.d, 1);
} else if (((String) entry.getKey()).equals("separation")) {
this.h = MathHelper.a((String) entry.getValue(), this.h, 1);
}
}
}
@Override
public String a() {
return "Monument";
}
@Override
protected boolean a(int i, int j) {
int k = i;
int l = j;
if (i < 0) {
i -= this.d - 1;
}
if (j < 0) {
j -= this.d - 1;
}
int i1 = i / this.d;
int j1 = j / this.d;
Random random = this.g.a(i1, j1, this.g.spigotConfig.monumentSeed); // Spigot
i1 *= this.d;
j1 *= this.d;
i1 += (random.nextInt(this.d - this.h) + random.nextInt(this.d - this.h)) / 2;
j1 += (random.nextInt(this.d - this.h) + random.nextInt(this.d - this.h)) / 2;
if (k == i1 && l == j1) {
if (!this.g.getWorldChunkManager().a(k * 16 + 8, l * 16 + 8, 16, WorldGenMonument.b)) {
return false;
}
boolean flag = this.g.getWorldChunkManager().a(k * 16 + 8, l * 16 + 8, 29, WorldGenMonument.a);
if (flag) {
return true;
}
}
return false;
}
@Override
public BlockPosition getNearestGeneratedFeature(World world, BlockPosition blockposition, boolean flag) {
this.g = world;
return a(world, this, blockposition, this.d, this.h, this.g.spigotConfig.monumentSeed, true, 100, flag); // Spigot
}
@Override
protected StructureStart b(int i, int j) {
return new WorldGenMonument.WorldGenMonumentStart(this.g, this.f, i, j);
}
public List<BiomeBase.BiomeMeta> b() {
return WorldGenMonument.i;
}
static {
WorldGenMonument.i.add(new BiomeBase.BiomeMeta(EntityGuardian.class, 1, 2, 4));
}
public static class WorldGenMonumentStart extends StructureStart {
private final Set<ChunkCoordIntPair> c = HashObjSets.newMutableSet();
private boolean d;
public WorldGenMonumentStart() {}
public WorldGenMonumentStart(World world, Random random, int i, int j) {
super(i, j);
this.b(world, random, i, j);
}
private void b(World world, Random random, int i, int j) {
random.setSeed(world.getSeed());
long k = random.nextLong();
long l = random.nextLong();
long i1 = i * k;
long j1 = j * l;
random.setSeed(i1 ^ j1 ^ world.getSeed());
int k1 = i * 16 + 8 - 29;
int l1 = j * 16 + 8 - 29;
EnumDirection enumdirection = EnumDirection.EnumDirectionLimit.HORIZONTAL.a(random);
this.a.add(new WorldGenMonumentPieces.WorldGenMonumentPiece1(random, k1, l1, enumdirection));
this.d();
this.d = true;
}
@Override
public void a(World world, Random random, StructureBoundingBox structureboundingbox) {
if (!this.d) {
this.a.clear();
this.b(world, random, this.e(), this.f());
}
super.a(world, random, structureboundingbox);
}
@Override
public boolean a(ChunkCoordIntPair chunkcoordintpair) {
return this.c.contains(chunkcoordintpair) ? false : super.a(chunkcoordintpair);
}
@Override
public void b(ChunkCoordIntPair chunkcoordintpair) {
super.b(chunkcoordintpair);
this.c.add(chunkcoordintpair);
}
@Override
public void a(NBTTagCompound nbttagcompound) {
super.a(nbttagcompound);
NBTTagList nbttaglist = new NBTTagList();
Iterator iterator = this.c.iterator();
while (iterator.hasNext()) {
ChunkCoordIntPair chunkcoordintpair = (ChunkCoordIntPair) iterator.next();
NBTTagCompound nbttagcompound1 = new NBTTagCompound();
nbttagcompound1.setInt("X", chunkcoordintpair.x);
nbttagcompound1.setInt("Z", chunkcoordintpair.z);
nbttaglist.add(nbttagcompound1);
}
nbttagcompound.set("Processed", nbttaglist);
}
@Override
public void b(NBTTagCompound nbttagcompound) {
super.b(nbttagcompound);
if (nbttagcompound.hasKeyOfType("Processed", 9)) {
NBTTagList nbttaglist = nbttagcompound.getList("Processed", 10);
for (int i = 0; i < nbttaglist.size(); ++i) {
NBTTagCompound nbttagcompound1 = nbttaglist.get(i);
this.c.add(new ChunkCoordIntPair(nbttagcompound1.getInt("X"), nbttagcompound1.getInt("Z")));
}
}
}
}
}