001 package net.minecraft.village; 002 003 import java.util.Iterator; 004 import java.util.List; 005 import net.minecraft.entity.EnumCreatureType; 006 import net.minecraft.entity.monster.EntityZombie; 007 import net.minecraft.entity.player.EntityPlayer; 008 import net.minecraft.util.ChunkCoordinates; 009 import net.minecraft.util.MathHelper; 010 import net.minecraft.util.Vec3; 011 import net.minecraft.world.SpawnerAnimals; 012 import net.minecraft.world.World; 013 014 public class VillageSiege 015 { 016 private World worldObj; 017 private boolean field_75535_b = false; 018 private int field_75536_c = -1; 019 private int field_75533_d; 020 private int field_75534_e; 021 022 /** Instance of Village. */ 023 private Village theVillage; 024 private int field_75532_g; 025 private int field_75538_h; 026 private int field_75539_i; 027 028 public VillageSiege(World par1World) 029 { 030 this.worldObj = par1World; 031 } 032 033 /** 034 * Runs a single tick for the village siege 035 */ 036 public void tick() 037 { 038 boolean var1 = false; 039 040 if (var1) 041 { 042 if (this.field_75536_c == 2) 043 { 044 this.field_75533_d = 100; 045 return; 046 } 047 } 048 else 049 { 050 if (this.worldObj.isDaytime()) 051 { 052 this.field_75536_c = 0; 053 return; 054 } 055 056 if (this.field_75536_c == 2) 057 { 058 return; 059 } 060 061 if (this.field_75536_c == 0) 062 { 063 float var2 = this.worldObj.getCelestialAngle(0.0F); 064 065 if ((double)var2 < 0.5D || (double)var2 > 0.501D) 066 { 067 return; 068 } 069 070 this.field_75536_c = this.worldObj.rand.nextInt(10) == 0 ? 1 : 2; 071 this.field_75535_b = false; 072 073 if (this.field_75536_c == 2) 074 { 075 return; 076 } 077 } 078 } 079 080 if (!this.field_75535_b) 081 { 082 if (!this.func_75529_b()) 083 { 084 return; 085 } 086 087 this.field_75535_b = true; 088 } 089 090 if (this.field_75534_e > 0) 091 { 092 --this.field_75534_e; 093 } 094 else 095 { 096 this.field_75534_e = 2; 097 098 if (this.field_75533_d > 0) 099 { 100 this.spawnZombie(); 101 --this.field_75533_d; 102 } 103 else 104 { 105 this.field_75536_c = 2; 106 } 107 } 108 } 109 110 private boolean func_75529_b() 111 { 112 List var1 = this.worldObj.playerEntities; 113 Iterator var2 = var1.iterator(); 114 115 while (var2.hasNext()) 116 { 117 EntityPlayer var3 = (EntityPlayer)var2.next(); 118 this.theVillage = this.worldObj.villageCollectionObj.findNearestVillage((int)var3.posX, (int)var3.posY, (int)var3.posZ, 1); 119 120 if (this.theVillage != null && this.theVillage.getNumVillageDoors() >= 10 && this.theVillage.getTicksSinceLastDoorAdding() >= 20 && this.theVillage.getNumVillagers() >= 20) 121 { 122 ChunkCoordinates var4 = this.theVillage.getCenter(); 123 float var5 = (float)this.theVillage.getVillageRadius(); 124 boolean var6 = false; 125 int var7 = 0; 126 127 while (true) 128 { 129 if (var7 < 10) 130 { 131 this.field_75532_g = var4.posX + (int)((double)(MathHelper.cos(this.worldObj.rand.nextFloat() * (float)Math.PI * 2.0F) * var5) * 0.9D); 132 this.field_75538_h = var4.posY; 133 this.field_75539_i = var4.posZ + (int)((double)(MathHelper.sin(this.worldObj.rand.nextFloat() * (float)Math.PI * 2.0F) * var5) * 0.9D); 134 var6 = false; 135 Iterator var8 = this.worldObj.villageCollectionObj.getVillageList().iterator(); 136 137 while (var8.hasNext()) 138 { 139 Village var9 = (Village)var8.next(); 140 141 if (var9 != this.theVillage && var9.isInRange(this.field_75532_g, this.field_75538_h, this.field_75539_i)) 142 { 143 var6 = true; 144 break; 145 } 146 } 147 148 if (var6) 149 { 150 ++var7; 151 continue; 152 } 153 } 154 155 if (var6) 156 { 157 return false; 158 } 159 160 Vec3 var10 = this.func_75527_a(this.field_75532_g, this.field_75538_h, this.field_75539_i); 161 162 if (var10 != null) 163 { 164 this.field_75534_e = 0; 165 this.field_75533_d = 20; 166 return true; 167 } 168 169 break; 170 } 171 } 172 } 173 174 return false; 175 } 176 177 private boolean spawnZombie() 178 { 179 Vec3 var1 = this.func_75527_a(this.field_75532_g, this.field_75538_h, this.field_75539_i); 180 181 if (var1 == null) 182 { 183 return false; 184 } 185 else 186 { 187 EntityZombie var2; 188 189 try 190 { 191 var2 = new EntityZombie(this.worldObj); 192 var2.initCreature(); 193 var2.setVillager(false); 194 } 195 catch (Exception var4) 196 { 197 var4.printStackTrace(); 198 return false; 199 } 200 201 var2.setLocationAndAngles(var1.xCoord, var1.yCoord, var1.zCoord, this.worldObj.rand.nextFloat() * 360.0F, 0.0F); 202 this.worldObj.spawnEntityInWorld(var2); 203 ChunkCoordinates var3 = this.theVillage.getCenter(); 204 var2.setHomeArea(var3.posX, var3.posY, var3.posZ, this.theVillage.getVillageRadius()); 205 return true; 206 } 207 } 208 209 private Vec3 func_75527_a(int par1, int par2, int par3) 210 { 211 for (int var4 = 0; var4 < 10; ++var4) 212 { 213 int var5 = par1 + this.worldObj.rand.nextInt(16) - 8; 214 int var6 = par2 + this.worldObj.rand.nextInt(6) - 3; 215 int var7 = par3 + this.worldObj.rand.nextInt(16) - 8; 216 217 if (this.theVillage.isInRange(var5, var6, var7) && SpawnerAnimals.canCreatureTypeSpawnAtLocation(EnumCreatureType.monster, this.worldObj, var5, var6, var7)) 218 { 219 this.worldObj.getWorldVec3Pool().getVecFromPool((double)var5, (double)var6, (double)var7); 220 } 221 } 222 223 return null; 224 } 225 }