001package net.minecraft.tileentity; 002 003import cpw.mods.fml.relauncher.Side; 004import cpw.mods.fml.relauncher.SideOnly; 005import java.util.ArrayList; 006import java.util.Iterator; 007import java.util.List; 008import net.minecraft.entity.Entity; 009import net.minecraft.entity.EntityList; 010import net.minecraft.entity.EntityLiving; 011import net.minecraft.nbt.NBTBase; 012import net.minecraft.nbt.NBTTagCompound; 013import net.minecraft.nbt.NBTTagList; 014import net.minecraft.util.AxisAlignedBB; 015import net.minecraft.util.WeightedRandom; 016import net.minecraft.world.World; 017 018public abstract class MobSpawnerBaseLogic 019{ 020 public int field_98286_b = 20; 021 private String field_98288_a = "Pig"; 022 private List field_98285_e = null; 023 private WeightedRandomMinecart field_98282_f = null; 024 public double field_98287_c; 025 public double field_98284_d = 0.0D; 026 private int field_98283_g = 200; 027 private int field_98293_h = 800; 028 private int field_98294_i = 4; 029 private Entity field_98291_j; 030 private int field_98292_k = 6; 031 private int field_98289_l = 16; 032 private int field_98290_m = 4; 033 034 public String func_98276_e() 035 { 036 if (this.func_98269_i() == null) 037 { 038 if (this.field_98288_a.equals("Minecart")) 039 { 040 this.field_98288_a = "MinecartRideable"; 041 } 042 043 return this.field_98288_a; 044 } 045 else 046 { 047 return this.func_98269_i().field_98223_c; 048 } 049 } 050 051 public void func_98272_a(String par1Str) 052 { 053 this.field_98288_a = par1Str; 054 } 055 056 public boolean func_98279_f() 057 { 058 return this.func_98271_a().getClosestPlayer((double)this.func_98275_b() + 0.5D, (double)this.func_98274_c() + 0.5D, (double)this.func_98266_d() + 0.5D, (double)this.field_98289_l) != null; 059 } 060 061 public void func_98278_g() 062 { 063 if (this.func_98279_f()) 064 { 065 double d0; 066 067 if (this.func_98271_a().isRemote) 068 { 069 double d1 = (double)((float)this.func_98275_b() + this.func_98271_a().rand.nextFloat()); 070 double d2 = (double)((float)this.func_98274_c() + this.func_98271_a().rand.nextFloat()); 071 d0 = (double)((float)this.func_98266_d() + this.func_98271_a().rand.nextFloat()); 072 this.func_98271_a().spawnParticle("smoke", d1, d2, d0, 0.0D, 0.0D, 0.0D); 073 this.func_98271_a().spawnParticle("flame", d1, d2, d0, 0.0D, 0.0D, 0.0D); 074 075 if (this.field_98286_b > 0) 076 { 077 --this.field_98286_b; 078 } 079 080 this.field_98284_d = this.field_98287_c; 081 this.field_98287_c = (this.field_98287_c + (double)(1000.0F / ((float)this.field_98286_b + 200.0F))) % 360.0D; 082 } 083 else 084 { 085 if (this.field_98286_b == -1) 086 { 087 this.func_98273_j(); 088 } 089 090 if (this.field_98286_b > 0) 091 { 092 --this.field_98286_b; 093 return; 094 } 095 096 boolean flag = false; 097 098 for (int i = 0; i < this.field_98294_i; ++i) 099 { 100 Entity entity = EntityList.createEntityByName(this.func_98276_e(), this.func_98271_a()); 101 102 if (entity == null) 103 { 104 return; 105 } 106 107 int j = this.func_98271_a().getEntitiesWithinAABB(entity.getClass(), AxisAlignedBB.getAABBPool().getAABB((double)this.func_98275_b(), (double)this.func_98274_c(), (double)this.func_98266_d(), (double)(this.func_98275_b() + 1), (double)(this.func_98274_c() + 1), (double)(this.func_98266_d() + 1)).expand((double)(this.field_98290_m * 2), 4.0D, (double)(this.field_98290_m * 2))).size(); 108 109 if (j >= this.field_98292_k) 110 { 111 this.func_98273_j(); 112 return; 113 } 114 115 d0 = (double)this.func_98275_b() + (this.func_98271_a().rand.nextDouble() - this.func_98271_a().rand.nextDouble()) * (double)this.field_98290_m; 116 double d3 = (double)(this.func_98274_c() + this.func_98271_a().rand.nextInt(3) - 1); 117 double d4 = (double)this.func_98266_d() + (this.func_98271_a().rand.nextDouble() - this.func_98271_a().rand.nextDouble()) * (double)this.field_98290_m; 118 EntityLiving entityliving = entity instanceof EntityLiving ? (EntityLiving)entity : null; 119 entity.setLocationAndAngles(d0, d3, d4, this.func_98271_a().rand.nextFloat() * 360.0F, 0.0F); 120 121 if (entityliving == null || entityliving.getCanSpawnHere()) 122 { 123 this.func_98265_a(entity); 124 this.func_98271_a().playAuxSFX(2004, this.func_98275_b(), this.func_98274_c(), this.func_98266_d(), 0); 125 126 if (entityliving != null) 127 { 128 entityliving.spawnExplosionParticle(); 129 } 130 131 flag = true; 132 } 133 } 134 135 if (flag) 136 { 137 this.func_98273_j(); 138 } 139 } 140 } 141 } 142 143 public Entity func_98265_a(Entity par1Entity) 144 { 145 if (this.func_98269_i() != null) 146 { 147 NBTTagCompound nbttagcompound = new NBTTagCompound(); 148 par1Entity.addEntityID(nbttagcompound); 149 Iterator iterator = this.func_98269_i().field_98222_b.getTags().iterator(); 150 151 while (iterator.hasNext()) 152 { 153 NBTBase nbtbase = (NBTBase)iterator.next(); 154 nbttagcompound.setTag(nbtbase.getName(), nbtbase.copy()); 155 } 156 157 par1Entity.readFromNBT(nbttagcompound); 158 159 if (par1Entity.worldObj != null) 160 { 161 par1Entity.worldObj.spawnEntityInWorld(par1Entity); 162 } 163 164 NBTTagCompound nbttagcompound1; 165 166 for (Entity entity1 = par1Entity; nbttagcompound.hasKey("Riding"); nbttagcompound = nbttagcompound1) 167 { 168 nbttagcompound1 = nbttagcompound.getCompoundTag("Riding"); 169 Entity entity2 = EntityList.createEntityByName(nbttagcompound1.getString("id"), this.func_98271_a()); 170 171 if (entity2 != null) 172 { 173 NBTTagCompound nbttagcompound2 = new NBTTagCompound(); 174 entity2.addEntityID(nbttagcompound2); 175 Iterator iterator1 = nbttagcompound1.getTags().iterator(); 176 177 while (iterator1.hasNext()) 178 { 179 NBTBase nbtbase1 = (NBTBase)iterator1.next(); 180 nbttagcompound2.setTag(nbtbase1.getName(), nbtbase1.copy()); 181 } 182 183 entity2.readFromNBT(nbttagcompound2); 184 entity2.setLocationAndAngles(entity1.posX, entity1.posY, entity1.posZ, entity1.rotationYaw, entity1.rotationPitch); 185 this.func_98271_a().spawnEntityInWorld(entity2); 186 entity1.mountEntity(entity2); 187 } 188 189 entity1 = entity2; 190 } 191 } 192 else if (par1Entity instanceof EntityLiving && par1Entity.worldObj != null) 193 { 194 ((EntityLiving)par1Entity).initCreature(); 195 this.func_98271_a().spawnEntityInWorld(par1Entity); 196 } 197 198 return par1Entity; 199 } 200 201 private void func_98273_j() 202 { 203 if (this.field_98293_h <= this.field_98283_g) 204 { 205 this.field_98286_b = this.field_98283_g; 206 } 207 else 208 { 209 int i = this.field_98293_h - this.field_98283_g; 210 this.field_98286_b = this.field_98283_g + this.func_98271_a().rand.nextInt(i); 211 } 212 213 if (this.field_98285_e != null && this.field_98285_e.size() > 0) 214 { 215 this.func_98277_a((WeightedRandomMinecart)WeightedRandom.getRandomItem(this.func_98271_a().rand, this.field_98285_e)); 216 } 217 218 this.func_98267_a(1); 219 } 220 221 public void func_98270_a(NBTTagCompound par1NBTTagCompound) 222 { 223 this.field_98288_a = par1NBTTagCompound.getString("EntityId"); 224 this.field_98286_b = par1NBTTagCompound.getShort("Delay"); 225 226 if (par1NBTTagCompound.hasKey("SpawnPotentials")) 227 { 228 this.field_98285_e = new ArrayList(); 229 NBTTagList nbttaglist = par1NBTTagCompound.getTagList("SpawnPotentials"); 230 231 for (int i = 0; i < nbttaglist.tagCount(); ++i) 232 { 233 this.field_98285_e.add(new WeightedRandomMinecart(this, (NBTTagCompound)nbttaglist.tagAt(i))); 234 } 235 } 236 else 237 { 238 this.field_98285_e = null; 239 } 240 241 if (par1NBTTagCompound.hasKey("SpawnData")) 242 { 243 this.func_98277_a(new WeightedRandomMinecart(this, par1NBTTagCompound.getCompoundTag("SpawnData"), this.field_98288_a)); 244 } 245 else 246 { 247 this.func_98277_a((WeightedRandomMinecart)null); 248 } 249 250 if (par1NBTTagCompound.hasKey("MinSpawnDelay")) 251 { 252 this.field_98283_g = par1NBTTagCompound.getShort("MinSpawnDelay"); 253 this.field_98293_h = par1NBTTagCompound.getShort("MaxSpawnDelay"); 254 this.field_98294_i = par1NBTTagCompound.getShort("SpawnCount"); 255 } 256 257 if (par1NBTTagCompound.hasKey("MaxNearbyEntities")) 258 { 259 this.field_98292_k = par1NBTTagCompound.getShort("MaxNearbyEntities"); 260 this.field_98289_l = par1NBTTagCompound.getShort("RequiredPlayerRange"); 261 } 262 263 if (par1NBTTagCompound.hasKey("SpawnRange")) 264 { 265 this.field_98290_m = par1NBTTagCompound.getShort("SpawnRange"); 266 } 267 268 if (this.func_98271_a() != null && this.func_98271_a().isRemote) 269 { 270 this.field_98291_j = null; 271 } 272 } 273 274 public void func_98280_b(NBTTagCompound par1NBTTagCompound) 275 { 276 par1NBTTagCompound.setString("EntityId", this.func_98276_e()); 277 par1NBTTagCompound.setShort("Delay", (short)this.field_98286_b); 278 par1NBTTagCompound.setShort("MinSpawnDelay", (short)this.field_98283_g); 279 par1NBTTagCompound.setShort("MaxSpawnDelay", (short)this.field_98293_h); 280 par1NBTTagCompound.setShort("SpawnCount", (short)this.field_98294_i); 281 par1NBTTagCompound.setShort("MaxNearbyEntities", (short)this.field_98292_k); 282 par1NBTTagCompound.setShort("RequiredPlayerRange", (short)this.field_98289_l); 283 par1NBTTagCompound.setShort("SpawnRange", (short)this.field_98290_m); 284 285 if (this.func_98269_i() != null) 286 { 287 par1NBTTagCompound.setCompoundTag("SpawnData", (NBTTagCompound)this.func_98269_i().field_98222_b.copy()); 288 } 289 290 if (this.func_98269_i() != null || this.field_98285_e != null && this.field_98285_e.size() > 0) 291 { 292 NBTTagList nbttaglist = new NBTTagList(); 293 294 if (this.field_98285_e != null && this.field_98285_e.size() > 0) 295 { 296 Iterator iterator = this.field_98285_e.iterator(); 297 298 while (iterator.hasNext()) 299 { 300 WeightedRandomMinecart weightedrandomminecart = (WeightedRandomMinecart)iterator.next(); 301 nbttaglist.appendTag(weightedrandomminecart.func_98220_a()); 302 } 303 } 304 else 305 { 306 nbttaglist.appendTag(this.func_98269_i().func_98220_a()); 307 } 308 309 par1NBTTagCompound.setTag("SpawnPotentials", nbttaglist); 310 } 311 } 312 313 public boolean func_98268_b(int par1) 314 { 315 if (par1 == 1 && this.func_98271_a().isRemote) 316 { 317 this.field_98286_b = this.field_98283_g; 318 return true; 319 } 320 else 321 { 322 return false; 323 } 324 } 325 326 @SideOnly(Side.CLIENT) 327 public Entity func_98281_h() 328 { 329 if (this.field_98291_j == null) 330 { 331 Entity entity = EntityList.createEntityByName(this.func_98276_e(), (World)null); 332 entity = this.func_98265_a(entity); 333 this.field_98291_j = entity; 334 } 335 336 return this.field_98291_j; 337 } 338 339 public WeightedRandomMinecart func_98269_i() 340 { 341 return this.field_98282_f; 342 } 343 344 public void func_98277_a(WeightedRandomMinecart par1WeightedRandomMinecart) 345 { 346 this.field_98282_f = par1WeightedRandomMinecart; 347 } 348 349 public abstract void func_98267_a(int i); 350 351 public abstract World func_98271_a(); 352 353 public abstract int func_98275_b(); 354 355 public abstract int func_98274_c(); 356 357 public abstract int func_98266_d(); 358}