package net.minecraft.world.gen.structure;
import java.util.Arrays;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Random;
import java.util.Map.Entry;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.util.MathHelper;
import net.minecraft.world.World;
import net.minecraft.world.biome.BiomeGenBase;
public class MapGenVillage extends MapGenStructure
{
/** A list of all the biomes villages can spawn in. */
public static List villageSpawnBiomes = Arrays.asList(new BiomeGenBase[] {BiomeGenBase.plains, BiomeGenBase.desert, BiomeGenBase.savanna});
/** World terrain type, 0 for normal, 1 for flat map */
private int terrainType;
private int field_82665_g;
private int field_82666_h;
private static final String __OBFID = "CL_00000514";
public MapGenVillage()
{
this.field_82665_g = 32;
this.field_82666_h = 8;
}
public MapGenVillage(Map p_i2093_1_)
{
this();
Iterator iterator = p_i2093_1_.entrySet().iterator();
while (iterator.hasNext())
{
Entry entry = (Entry)iterator.next();
if (((String)entry.getKey()).equals("size"))
{
this.terrainType = MathHelper.parseIntWithDefaultAndMax((String)entry.getValue(), this.terrainType, 0);
}
else if (((String)entry.getKey()).equals("distance"))
{
this.field_82665_g = MathHelper.parseIntWithDefaultAndMax((String)entry.getValue(), this.field_82665_g, this.field_82666_h + 1);
}
}
}
public String getStructureName()
{
return "Village";
}
protected boolean canSpawnStructureAtCoords(int p_75047_1_, int p_75047_2_)
{
int k = p_75047_1_;
int l = p_75047_2_;
if (p_75047_1_ < 0)
{
p_75047_1_ -= this.field_82665_g - 1;
}
if (p_75047_2_ < 0)
{
p_75047_2_ -= this.field_82665_g - 1;
}
int i1 = p_75047_1_ / this.field_82665_g;
int j1 = p_75047_2_ / this.field_82665_g;
Random random = this.worldObj.setRandomSeed(i1, j1, 10387312);
i1 *= this.field_82665_g;
j1 *= this.field_82665_g;
i1 += random.nextInt(this.field_82665_g - this.field_82666_h);
j1 += random.nextInt(this.field_82665_g - this.field_82666_h);
if (k == i1 && l == j1)
{
boolean flag = this.worldObj.getWorldChunkManager().areBiomesViable(k * 16 + 8, l * 16 + 8, 0, villageSpawnBiomes);
if (flag)
{
return true;
}
}
return false;
}
protected StructureStart getStructureStart(int p_75049_1_, int p_75049_2_)
{
return new MapGenVillage.Start(this.worldObj, this.rand, p_75049_1_, p_75049_2_, this.terrainType);
}
public static class Start extends StructureStart
{
/** well ... thats what it does */
private boolean hasMoreThanTwoComponents;
private static final String __OBFID = "CL_00000515";
public Start() {}
public Start(World p_i2092_1_, Random p_i2092_2_, int p_i2092_3_, int p_i2092_4_, int p_i2092_5_)
{
super(p_i2092_3_, p_i2092_4_);
List list = StructureVillagePieces.getStructureVillageWeightedPieceList(p_i2092_2_, p_i2092_5_);
StructureVillagePieces.Start start = new StructureVillagePieces.Start(p_i2092_1_.getWorldChunkManager(), 0, p_i2092_2_, (p_i2092_3_ << 4) + 2, (p_i2092_4_ << 4) + 2, list, p_i2092_5_);
this.components.add(start);
start.buildComponent(start, this.components, p_i2092_2_);
List list1 = start.field_74930_j;
List list2 = start.field_74932_i;
int l;
while (!list1.isEmpty() || !list2.isEmpty())
{
StructureComponent structurecomponent;
if (list1.isEmpty())
{
l = p_i2092_2_.nextInt(list2.size());
structurecomponent = (StructureComponent)list2.remove(l);
structurecomponent.buildComponent(start, this.components, p_i2092_2_);
}
else
{
l = p_i2092_2_.nextInt(list1.size());
structurecomponent = (StructureComponent)list1.remove(l);
structurecomponent.buildComponent(start, this.components, p_i2092_2_);
}
}
this.updateBoundingBox();
l = 0;
Iterator iterator = this.components.iterator();
while (iterator.hasNext())
{
StructureComponent structurecomponent1 = (StructureComponent)iterator.next();
if (!(structurecomponent1 instanceof StructureVillagePieces.Road))
{
++l;
}
}
this.hasMoreThanTwoComponents = l > 2;
}
/**
* currently only defined for Villages, returns true if Village has more than 2 non-road components
*/
public boolean isSizeableStructure()
{
return this.hasMoreThanTwoComponents;
}
public void func_143022_a(NBTTagCompound p_143022_1_)
{
super.func_143022_a(p_143022_1_);
p_143022_1_.setBoolean("Valid", this.hasMoreThanTwoComponents);
}
public void func_143017_b(NBTTagCompound p_143017_1_)
{
super.func_143017_b(p_143017_1_);
this.hasMoreThanTwoComponents = p_143017_1_.getBoolean("Valid");
}
}
}