package net.minecraft.village; import com.google.common.collect.Lists; import com.mojang.authlib.GameProfile; import java.util.Iterator; import java.util.List; import java.util.TreeMap; import java.util.UUID; import net.minecraft.block.Block; import net.minecraft.block.BlockDoor; import net.minecraft.block.material.Material; import net.minecraft.entity.EntityLivingBase; import net.minecraft.entity.monster.EntityIronGolem; import net.minecraft.entity.passive.EntityVillager; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.nbt.NBTTagList; import net.minecraft.server.MinecraftServer; import net.minecraft.server.management.PlayerProfileCache; import net.minecraft.util.AxisAlignedBB; import net.minecraft.util.BlockPos; import net.minecraft.util.MathHelper; import net.minecraft.util.Vec3; import net.minecraft.world.World; public class Village { private World worldObj; private final List<VillageDoorInfo> villageDoorInfoList = Lists.<VillageDoorInfo>newArrayList(); /** * This is the sum of all door coordinates and used to calculate the actual village center by dividing by the number * of doors. */ private BlockPos centerHelper = BlockPos.ORIGIN; /** This is the actual village center. */ private BlockPos center = BlockPos.ORIGIN; private int villageRadius; private int lastAddDoorTimestamp; private int tickCounter; private int numVillagers; /** Timestamp of tick count when villager last bred */ private int noBreedTicks; private TreeMap<String, Integer> playerReputation = new TreeMap(); private List<Village.VillageAggressor> villageAgressors = Lists.<Village.VillageAggressor>newArrayList(); private int numIronGolems; public Village() { } public Village(World worldIn) { this.worldObj = worldIn; } public void setWorld(World worldIn) { this.worldObj = worldIn; } /** * Called periodically by VillageCollection */ public void tick(int p_75560_1_) { this.tickCounter = p_75560_1_; this.removeDeadAndOutOfRangeDoors(); this.removeDeadAndOldAgressors(); if (p_75560_1_ % 20 == 0) { this.updateNumVillagers(); } if (p_75560_1_ % 30 == 0) { this.updateNumIronGolems(); } int i = this.numVillagers / 10; if (this.numIronGolems < i && this.villageDoorInfoList.size() > 20 && this.worldObj.rand.nextInt(7000) == 0) { Vec3 vec3 = this.func_179862_a(this.center, 2, 4, 2); if (vec3 != null) { EntityIronGolem entityirongolem = new EntityIronGolem(this.worldObj); entityirongolem.setPosition(vec3.xCoord, vec3.yCoord, vec3.zCoord); this.worldObj.spawnEntityInWorld(entityirongolem); ++this.numIronGolems; } } } private Vec3 func_179862_a(BlockPos p_179862_1_, int p_179862_2_, int p_179862_3_, int p_179862_4_) { for (int i = 0; i < 10; ++i) { BlockPos blockpos = p_179862_1_.add(this.worldObj.rand.nextInt(16) - 8, this.worldObj.rand.nextInt(6) - 3, this.worldObj.rand.nextInt(16) - 8); if (this.func_179866_a(blockpos) && this.func_179861_a(new BlockPos(p_179862_2_, p_179862_3_, p_179862_4_), blockpos)) { return new Vec3((double)blockpos.getX(), (double)blockpos.getY(), (double)blockpos.getZ()); } } return null; } private boolean func_179861_a(BlockPos p_179861_1_, BlockPos p_179861_2_) { if (!World.doesBlockHaveSolidTopSurface(this.worldObj, p_179861_2_.down())) { return false; } else { int i = p_179861_2_.getX() - p_179861_1_.getX() / 2; int j = p_179861_2_.getZ() - p_179861_1_.getZ() / 2; for (int k = i; k < i + p_179861_1_.getX(); ++k) { for (int l = p_179861_2_.getY(); l < p_179861_2_.getY() + p_179861_1_.getY(); ++l) { for (int i1 = j; i1 < j + p_179861_1_.getZ(); ++i1) { if (this.worldObj.getBlockState(new BlockPos(k, l, i1)).getBlock().isNormalCube()) { return false; } } } } return true; } } private void updateNumIronGolems() { List<EntityIronGolem> list = this.worldObj.<EntityIronGolem>getEntitiesWithinAABB(EntityIronGolem.class, new AxisAlignedBB((double)(this.center.getX() - this.villageRadius), (double)(this.center.getY() - 4), (double)(this.center.getZ() - this.villageRadius), (double)(this.center.getX() + this.villageRadius), (double)(this.center.getY() + 4), (double)(this.center.getZ() + this.villageRadius))); this.numIronGolems = list.size(); } private void updateNumVillagers() { List<EntityVillager> list = this.worldObj.<EntityVillager>getEntitiesWithinAABB(EntityVillager.class, new AxisAlignedBB((double)(this.center.getX() - this.villag