001 package net.minecraft.entity; 002 003 import java.util.HashSet; 004 import java.util.Iterator; 005 import java.util.List; 006 import java.util.Set; 007 008 import cpw.mods.fml.common.network.FMLNetworkHandler; 009 import net.minecraft.entity.boss.EntityDragon; 010 import net.minecraft.entity.item.EntityBoat; 011 import net.minecraft.entity.item.EntityEnderCrystal; 012 import net.minecraft.entity.item.EntityEnderEye; 013 import net.minecraft.entity.item.EntityEnderPearl; 014 import net.minecraft.entity.item.EntityExpBottle; 015 import net.minecraft.entity.item.EntityFallingSand; 016 import net.minecraft.entity.item.EntityFireworkRocket; 017 import net.minecraft.entity.item.EntityItem; 018 import net.minecraft.entity.item.EntityItemFrame; 019 import net.minecraft.entity.item.EntityMinecart; 020 import net.minecraft.entity.item.EntityPainting; 021 import net.minecraft.entity.item.EntityTNTPrimed; 022 import net.minecraft.entity.item.EntityXPOrb; 023 import net.minecraft.entity.passive.IAnimals; 024 import net.minecraft.entity.player.EntityPlayer; 025 import net.minecraft.entity.player.EntityPlayerMP; 026 import net.minecraft.entity.projectile.EntityArrow; 027 import net.minecraft.entity.projectile.EntityEgg; 028 import net.minecraft.entity.projectile.EntityFireball; 029 import net.minecraft.entity.projectile.EntityFishHook; 030 import net.minecraft.entity.projectile.EntityPotion; 031 import net.minecraft.entity.projectile.EntitySmallFireball; 032 import net.minecraft.entity.projectile.EntitySnowball; 033 import net.minecraft.entity.projectile.EntityWitherSkull; 034 import net.minecraft.item.Item; 035 import net.minecraft.item.ItemMap; 036 import net.minecraft.item.ItemStack; 037 import net.minecraft.network.packet.Packet; 038 import net.minecraft.network.packet.Packet17Sleep; 039 import net.minecraft.network.packet.Packet20NamedEntitySpawn; 040 import net.minecraft.network.packet.Packet23VehicleSpawn; 041 import net.minecraft.network.packet.Packet24MobSpawn; 042 import net.minecraft.network.packet.Packet25EntityPainting; 043 import net.minecraft.network.packet.Packet26EntityExpOrb; 044 import net.minecraft.network.packet.Packet28EntityVelocity; 045 import net.minecraft.network.packet.Packet31RelEntityMove; 046 import net.minecraft.network.packet.Packet32EntityLook; 047 import net.minecraft.network.packet.Packet33RelEntityMoveLook; 048 import net.minecraft.network.packet.Packet34EntityTeleport; 049 import net.minecraft.network.packet.Packet35EntityHeadRotation; 050 import net.minecraft.network.packet.Packet39AttachEntity; 051 import net.minecraft.network.packet.Packet40EntityMetadata; 052 import net.minecraft.network.packet.Packet41EntityEffect; 053 import net.minecraft.network.packet.Packet5PlayerInventory; 054 import net.minecraft.potion.PotionEffect; 055 import net.minecraft.util.MathHelper; 056 import net.minecraft.world.storage.MapData; 057 058 public class EntityTrackerEntry 059 { 060 public Entity myEntity; 061 public int blocksDistanceThreshold; 062 063 /** check for sync when ticks % updateFrequency==0 */ 064 public int updateFrequency; 065 public int lastScaledXPosition; 066 public int lastScaledYPosition; 067 public int lastScaledZPosition; 068 public int lastYaw; 069 public int lastPitch; 070 public int lastHeadMotion; 071 public double motionX; 072 public double motionY; 073 public double motionZ; 074 public int ticks = 0; 075 private double posX; 076 private double posY; 077 private double posZ; 078 079 /** set to true on first sendLocationToClients */ 080 private boolean isDataInitialized = false; 081 private boolean sendVelocityUpdates; 082 083 /** 084 * every 400 ticks a full teleport packet is sent, rather than just a "move me +x" command, so that position 085 * remains fully synced. 086 */ 087 private int ticksSinceLastForcedTeleport = 0; 088 private Entity field_85178_v; 089 private boolean ridingEntity = false; 090 public boolean playerEntitiesUpdated = false; 091 public Set trackedPlayers = new HashSet(); 092 093 public EntityTrackerEntry(Entity par1Entity, int par2, int par3, boolean par4) 094 { 095 this.myEntity = par1Entity; 096 this.blocksDistanceThreshold = par2; 097 this.updateFrequency = par3; 098 this.sendVelocityUpdates = par4; 099 this.lastScaledXPosition = MathHelper.floor_double(par1Entity.posX * 32.0D); 100 this.lastScaledYPosition = MathHelper.floor_double(par1Entity.posY * 32.0D); 101 this.lastScaledZPosition = MathHelper.floor_double(par1Entity.posZ * 32.0D); 102 this.lastYaw = MathHelper.floor_float(par1Entity.rotationYaw * 256.0F / 360.0F); 103 this.lastPitch = MathHelper.floor_float(par1Entity.rotationPitch * 256.0F / 360.0F); 104 this.lastHeadMotion = MathHelper.floor_float(par1Entity.setRotationYawHead() * 256.0F / 360.0F); 105 } 106 107 public boolean equals(Object par1Obj) 108 { 109 return par1Obj instanceof EntityTrackerEntry ? ((EntityTrackerEntry)par1Obj).myEntity.entityId == this.myEntity.entityId : false; 110 } 111 112 public int hashCode() 113 { 114 return this.myEntity.entityId; 115 } 116 117 /** 118 * also sends velocity, rotation, and riding info. 119 */ 120 public void sendLocationToAllClients(List par1List) 121 { 122 this.playerEntitiesUpdated = false; 123 124 if (!this.isDataInitialized || this.myEntity.getDistanceSq(this.posX, this.posY, this.posZ) > 16.0D) 125 { 126 this.posX = this.myEntity.posX; 127 this.posY = this.myEntity.posY; 128 this.posZ = this.myEntity.posZ; 129 this.isDataInitialized = true; 130 this.playerEntitiesUpdated = true; 131 this.sendEventsToPlayers(par1List); 132 } 133 134 if (this.field_85178_v != this.myEntity.ridingEntity) 135 { 136 this.field_85178_v = this.myEntity.ridingEntity; 137 this.sendPacketToAllTrackingPlayers(new Packet39AttachEntity(this.myEntity, this.myEntity.ridingEntity)); 138 } 139 140 if (this.myEntity instanceof EntityItemFrame && this.ticks % 10 == 0) 141 { 142 EntityItemFrame var23 = (EntityItemFrame)this.myEntity; 143 ItemStack var24 = var23.getDisplayedItem(); 144 145 if (var24 != null && var24.getItem() instanceof ItemMap) 146 { 147 MapData var26 = Item.map.getMapData(var24, this.myEntity.worldObj); 148 Iterator var29 = par1List.iterator(); 149 150 while (var29.hasNext()) 151 { 152 EntityPlayer var30 = (EntityPlayer)var29.next(); 153 EntityPlayerMP var31 = (EntityPlayerMP)var30; 154 var26.updateVisiblePlayers(var31, var24); 155 156 if (var31.playerNetServerHandler.packetSize() <= 5) 157 { 158 Packet var32 = Item.map.createMapDataPacket(var24, this.myEntity.worldObj, var31); 159 160 if (var32 != null) 161 { 162 var31.playerNetServerHandler.sendPacketToPlayer(var32); 163 } 164 } 165 } 166 } 167 168 DataWatcher var28 = this.myEntity.getDataWatcher(); 169 170 if (var28.hasChanges()) 171 { 172 this.sendPacketToAllAssociatedPlayers(new Packet40EntityMetadata(this.myEntity.entityId, var28, false)); 173 } 174 } 175 else if (this.ticks++ % this.updateFrequency == 0 || this.myEntity.isAirBorne) 176 { 177 int var2; 178 int var3; 179 180 if (this.myEntity.ridingEntity == null) 181 { 182 ++this.ticksSinceLastForcedTeleport; 183 var2 = this.myEntity.myEntitySize.multiplyBy32AndRound(this.myEntity.posX); 184 var3 = MathHelper.floor_double(this.myEntity.posY * 32.0D); 185 int var4 = this.myEntity.myEntitySize.multiplyBy32AndRound(this.myEntity.posZ); 186 int var5 = MathHelper.floor_float(this.myEntity.rotationYaw * 256.0F / 360.0F); 187 int var6 = MathHelper.floor_float(this.myEntity.rotationPitch * 256.0F / 360.0F); 188 int var7 = var2 - this.lastScaledXPosition; 189 int var8 = var3 - this.lastScaledYPosition; 190 int var9 = var4 - this.lastScaledZPosition; 191 Object var10 = null; 192 boolean var11 = Math.abs(var7) >= 4 || Math.abs(var8) >= 4 || Math.abs(var9) >= 4 || this.ticks % 60 == 0; 193 boolean var12 = Math.abs(var5 - this.lastYaw) >= 4 || Math.abs(var6 - this.lastPitch) >= 4; 194 195 if (var7 >= -128 && var7 < 128 && var8 >= -128 && var8 < 128 && var9 >= -128 && var9 < 128 && this.ticksSinceLastForcedTeleport <= 400 && !this.ridingEntity) 196 { 197 if (var11 && var12) 198 { 199 var10 = new Packet33RelEntityMoveLook(this.myEntity.entityId, (byte)var7, (byte)var8, (byte)var9, (byte)var5, (byte)var6); 200 } 201 else if (var11) 202 { 203 var10 = new Packet31RelEntityMove(this.myEntity.entityId, (byte)var7, (byte)var8, (byte)var9); 204 } 205 else if (var12) 206 { 207 var10 = new Packet32EntityLook(this.myEntity.entityId, (byte)var5, (byte)var6); 208 } 209 } 210 else 211 { 212 this.ticksSinceLastForcedTeleport = 0; 213 var10 = new Packet34EntityTeleport(this.myEntity.entityId, var2, var3, var4, (byte)var5, (byte)var6); 214 } 215 216 if (this.sendVelocityUpdates) 217 { 218 double var13 = this.myEntity.motionX - this.motionX; 219 double var15 = this.myEntity.motionY - this.motionY; 220 double var17 = this.myEntity.motionZ - this.motionZ; 221 double var19 = 0.02D; 222 double var21 = var13 * var13 + var15 * var15 + var17 * var17; 223 224 if (var21 > var19 * var19 || var21 > 0.0D && this.myEntity.motionX == 0.0D && this.myEntity.motionY == 0.0D && this.myEntity.motionZ == 0.0D) 225 { 226 this.motionX = this.myEntity.motionX; 227 this.motionY = this.myEntity.motionY; 228 this.motionZ = this.myEntity.motionZ; 229 this.sendPacketToAllTrackingPlayers(new Packet28EntityVelocity(this.myEntity.entityId, this.motionX, this.motionY, this.motionZ)); 230 } 231 } 232 233 if (var10 != null) 234 { 235 this.sendPacketToAllTrackingPlayers((Packet)var10); 236 } 237 238 DataWatcher var33 = this.myEntity.getDataWatcher(); 239 240 if (var33.hasChanges()) 241 { 242 this.sendPacketToAllAssociatedPlayers(new Packet40EntityMetadata(this.myEntity.entityId, var33, false)); 243 } 244 245 if (var11) 246 { 247 this.lastScaledXPosition = var2; 248 this.lastScaledYPosition = var3; 249 this.lastScaledZPosition = var4; 250 } 251 252 if (var12) 253 { 254 this.lastYaw = var5; 255 this.lastPitch = var6; 256 } 257 258 this.ridingEntity = false; 259 } 260 else 261 { 262 var2 = MathHelper.floor_float(this.myEntity.rotationYaw * 256.0F / 360.0F); 263 var3 = MathHelper.floor_float(this.myEntity.rotationPitch * 256.0F / 360.0F); 264 boolean var25 = Math.abs(var2 - this.lastYaw) >= 4 || Math.abs(var3 - this.lastPitch) >= 4; 265 266 if (var25) 267 { 268 this.sendPacketToAllTrackingPlayers(new Packet32EntityLook(this.myEntity.entityId, (byte)var2, (byte)var3)); 269 this.lastYaw = var2; 270 this.lastPitch = var3; 271 } 272 273 this.lastScaledXPosition = this.myEntity.myEntitySize.multiplyBy32AndRound(this.myEntity.posX); 274 this.lastScaledYPosition = MathHelper.floor_double(this.myEntity.posY * 32.0D); 275 this.lastScaledZPosition = this.myEntity.myEntitySize.multiplyBy32AndRound(this.myEntity.posZ); 276 DataWatcher var27 = this.myEntity.getDataWatcher(); 277 278 if (var27.hasChanges()) 279 { 280 this.sendPacketToAllAssociatedPlayers(new Packet40EntityMetadata(this.myEntity.entityId, var27, false)); 281 } 282 283 this.ridingEntity = true; 284 } 285 286 var2 = MathHelper.floor_float(this.myEntity.setRotationYawHead() * 256.0F / 360.0F); 287 288 if (Math.abs(var2 - this.lastHeadMotion) >= 4) 289 { 290 this.sendPacketToAllTrackingPlayers(new Packet35EntityHeadRotation(this.myEntity.entityId, (byte)var2)); 291 this.lastHeadMotion = var2; 292 } 293 294 this.myEntity.isAirBorne = false; 295 } 296 297 if (this.myEntity.velocityChanged) 298 { 299 this.sendPacketToAllAssociatedPlayers(new Packet28EntityVelocity(this.myEntity)); 300 this.myEntity.velocityChanged = false; 301 } 302 } 303 304 /** 305 * if this is a player, then it is not informed 306 */ 307 public void sendPacketToAllTrackingPlayers(Packet par1Packet) 308 { 309 Iterator var2 = this.trackedPlayers.iterator(); 310 311 while (var2.hasNext()) 312 { 313 EntityPlayerMP var3 = (EntityPlayerMP)var2.next(); 314 var3.playerNetServerHandler.sendPacketToPlayer(par1Packet); 315 } 316 } 317 318 /** 319 * if this is a player, then it recieves the message also 320 */ 321 public void sendPacketToAllAssociatedPlayers(Packet par1Packet) 322 { 323 this.sendPacketToAllTrackingPlayers(par1Packet); 324 325 if (this.myEntity instanceof EntityPlayerMP) 326 { 327 ((EntityPlayerMP)this.myEntity).playerNetServerHandler.sendPacketToPlayer(par1Packet); 328 } 329 } 330 331 public void informAllAssociatedPlayersOfItemDestruction() 332 { 333 Iterator var1 = this.trackedPlayers.iterator(); 334 335 while (var1.hasNext()) 336 { 337 EntityPlayerMP var2 = (EntityPlayerMP)var1.next(); 338 var2.destroyedItemsNetCache.add(Integer.valueOf(this.myEntity.entityId)); 339 } 340 } 341 342 public void removeFromWatchingList(EntityPlayerMP par1EntityPlayerMP) 343 { 344 if (this.trackedPlayers.contains(par1EntityPlayerMP)) 345 { 346 par1EntityPlayerMP.destroyedItemsNetCache.add(Integer.valueOf(this.myEntity.entityId)); 347 this.trackedPlayers.remove(par1EntityPlayerMP); 348 } 349 } 350 351 /** 352 * if the player is more than the distance threshold (typically 64) then the player is removed instead 353 */ 354 public void tryStartWachingThis(EntityPlayerMP par1EntityPlayerMP) 355 { 356 if (par1EntityPlayerMP != this.myEntity) 357 { 358 double var2 = par1EntityPlayerMP.posX - (double)(this.lastScaledXPosition / 32); 359 double var4 = par1EntityPlayerMP.posZ - (double)(this.lastScaledZPosition / 32); 360 361 if (var2 >= (double)(-this.blocksDistanceThreshold) && var2 <= (double)this.blocksDistanceThreshold && var4 >= (double)(-this.blocksDistanceThreshold) && var4 <= (double)this.blocksDistanceThreshold) 362 { 363 if (!this.trackedPlayers.contains(par1EntityPlayerMP) && this.isPlayerWatchingThisChunk(par1EntityPlayerMP)) 364 { 365 this.trackedPlayers.add(par1EntityPlayerMP); 366 Packet var6 = this.getPacketForThisEntity(); 367 par1EntityPlayerMP.playerNetServerHandler.sendPacketToPlayer(var6); 368 369 if (!this.myEntity.getDataWatcher().func_92034_d()) 370 { 371 par1EntityPlayerMP.playerNetServerHandler.sendPacketToPlayer(new Packet40EntityMetadata(this.myEntity.entityId, this.myEntity.getDataWatcher(), true)); 372 } 373 374 this.motionX = this.myEntity.motionX; 375 this.motionY = this.myEntity.motionY; 376 this.motionZ = this.myEntity.motionZ; 377 378 int posX = MathHelper.floor_double(this.myEntity.posX * 32.0D); 379 int posY = MathHelper.floor_double(this.myEntity.posY * 32.0D); 380 int posZ = MathHelper.floor_double(this.myEntity.posZ * 32.0D); 381 if (posX != this.lastScaledXPosition || posY != this.lastScaledYPosition || posZ != this.lastScaledZPosition) 382 { 383 FMLNetworkHandler.makeEntitySpawnAdjustment(this.myEntity.entityId, par1EntityPlayerMP, this.lastScaledXPosition, this.lastScaledYPosition, this.lastScaledZPosition); 384 } 385 386 if (this.sendVelocityUpdates && !(var6 instanceof Packet24MobSpawn)) 387 { 388 par1EntityPlayerMP.playerNetServerHandler.sendPacketToPlayer(new Packet28EntityVelocity(this.myEntity.entityId, this.myEntity.motionX, this.myEntity.motionY, this.myEntity.motionZ)); 389 } 390 391 if (this.myEntity.ridingEntity != null) 392 { 393 par1EntityPlayerMP.playerNetServerHandler.sendPacketToPlayer(new Packet39AttachEntity(this.myEntity, this.myEntity.ridingEntity)); 394 } 395 396 if (this.myEntity instanceof EntityLiving) 397 { 398 for (int var7 = 0; var7 < 5; ++var7) 399 { 400 ItemStack var8 = ((EntityLiving)this.myEntity).getCurrentItemOrArmor(var7); 401 402 if (var8 != null) 403 { 404 par1EntityPlayerMP.playerNetServerHandler.sendPacketToPlayer(new Packet5PlayerInventory(this.myEntity.entityId, var7, var8)); 405 } 406 } 407 } 408 409 if (this.myEntity instanceof EntityPlayer) 410 { 411 EntityPlayer var11 = (EntityPlayer)this.myEntity; 412 413 if (var11.isPlayerSleeping()) 414 { 415 par1EntityPlayerMP.playerNetServerHandler.sendPacketToPlayer(new Packet17Sleep(this.myEntity, 0, MathHelper.floor_double(this.myEntity.posX), MathHelper.floor_double(this.myEntity.posY), MathHelper.floor_double(this.myEntity.posZ))); 416 } 417 } 418 419 if (this.myEntity instanceof EntityLiving) 420 { 421 EntityLiving var10 = (EntityLiving)this.myEntity; 422 Iterator var12 = var10.getActivePotionEffects().iterator(); 423 424 while (var12.hasNext()) 425 { 426 PotionEffect var9 = (PotionEffect)var12.next(); 427 par1EntityPlayerMP.playerNetServerHandler.sendPacketToPlayer(new Packet41EntityEffect(this.myEntity.entityId, var9)); 428 } 429 } 430 } 431 } 432 else if (this.trackedPlayers.contains(par1EntityPlayerMP)) 433 { 434 this.trackedPlayers.remove(par1EntityPlayerMP); 435 par1EntityPlayerMP.destroyedItemsNetCache.add(Integer.valueOf(this.myEntity.entityId)); 436 } 437 } 438 } 439 440 private boolean isPlayerWatchingThisChunk(EntityPlayerMP par1EntityPlayerMP) 441 { 442 return par1EntityPlayerMP.getServerForPlayer().getPlayerManager().isPlayerWatchingChunk(par1EntityPlayerMP, this.myEntity.chunkCoordX, this.myEntity.chunkCoordZ); 443 } 444 445 public void sendEventsToPlayers(List par1List) 446 { 447 for (int var2 = 0; var2 < par1List.size(); ++var2) 448 { 449 this.tryStartWachingThis((EntityPlayerMP)par1List.get(var2)); 450 } 451 } 452 453 private Packet getPacketForThisEntity() 454 { 455 if (this.myEntity.isDead) 456 { 457 System.out.println("Fetching addPacket for removed entity"); 458 } 459 460 Packet pkt = FMLNetworkHandler.getEntitySpawningPacket(this.myEntity); 461 462 if (pkt != null) 463 { 464 return pkt; 465 } 466 467 if (this.myEntity instanceof EntityItem) 468 { 469 return new Packet23VehicleSpawn(this.myEntity, 2, 1); 470 } 471 else if (this.myEntity instanceof EntityPlayerMP) 472 { 473 return new Packet20NamedEntitySpawn((EntityPlayer)this.myEntity); 474 } 475 else 476 { 477 if (this.myEntity instanceof EntityMinecart) 478 { 479 EntityMinecart var1 = (EntityMinecart)this.myEntity; 480 481 if (var1.minecartType == 0) 482 { 483 return new Packet23VehicleSpawn(this.myEntity, 10); 484 } 485 486 if (var1.minecartType == 1) 487 { 488 return new Packet23VehicleSpawn(this.myEntity, 11); 489 } 490 491 if (var1.minecartType == 2) 492 { 493 return new Packet23VehicleSpawn(this.myEntity, 12); 494 } 495 } 496 497 if (this.myEntity instanceof EntityBoat) 498 { 499 return new Packet23VehicleSpawn(this.myEntity, 1); 500 } 501 else if (!(this.myEntity instanceof IAnimals) && !(this.myEntity instanceof EntityDragon)) 502 { 503 if (this.myEntity instanceof EntityFishHook) 504 { 505 EntityPlayer var8 = ((EntityFishHook)this.myEntity).angler; 506 return new Packet23VehicleSpawn(this.myEntity, 90, var8 != null ? var8.entityId : this.myEntity.entityId); 507 } 508 else if (this.myEntity instanceof EntityArrow) 509 { 510 Entity var7 = ((EntityArrow)this.myEntity).shootingEntity; 511 return new Packet23VehicleSpawn(this.myEntity, 60, var7 != null ? var7.entityId : this.myEntity.entityId); 512 } 513 else if (this.myEntity instanceof EntitySnowball) 514 { 515 return new Packet23VehicleSpawn(this.myEntity, 61); 516 } 517 else if (this.myEntity instanceof EntityPotion) 518 { 519 return new Packet23VehicleSpawn(this.myEntity, 73, ((EntityPotion)this.myEntity).getPotionDamage()); 520 } 521 else if (this.myEntity instanceof EntityExpBottle) 522 { 523 return new Packet23VehicleSpawn(this.myEntity, 75); 524 } 525 else if (this.myEntity instanceof EntityEnderPearl) 526 { 527 return new Packet23VehicleSpawn(this.myEntity, 65); 528 } 529 else if (this.myEntity instanceof EntityEnderEye) 530 { 531 return new Packet23VehicleSpawn(this.myEntity, 72); 532 } 533 else if (this.myEntity instanceof EntityFireworkRocket) 534 { 535 return new Packet23VehicleSpawn(this.myEntity, 76); 536 } 537 else 538 { 539 Packet23VehicleSpawn var2; 540 541 if (this.myEntity instanceof EntityFireball) 542 { 543 EntityFireball var6 = (EntityFireball)this.myEntity; 544 var2 = null; 545 byte var3 = 63; 546 547 if (this.myEntity instanceof EntitySmallFireball) 548 { 549 var3 = 64; 550 } 551 else if (this.myEntity instanceof EntityWitherSkull) 552 { 553 var3 = 66; 554 } 555 556 if (var6.shootingEntity != null) 557 { 558 var2 = new Packet23VehicleSpawn(this.myEntity, var3, ((EntityFireball)this.myEntity).shootingEntity.entityId); 559 } 560 else 561 { 562 var2 = new Packet23VehicleSpawn(this.myEntity, var3, 0); 563 } 564 565 var2.speedX = (int)(var6.accelerationX * 8000.0D); 566 var2.speedY = (int)(var6.accelerationY * 8000.0D); 567 var2.speedZ = (int)(var6.accelerationZ * 8000.0D); 568 return var2; 569 } 570 else if (this.myEntity instanceof EntityEgg) 571 { 572 return new Packet23VehicleSpawn(this.myEntity, 62); 573 } 574 else if (this.myEntity instanceof EntityTNTPrimed) 575 { 576 return new Packet23VehicleSpawn(this.myEntity, 50); 577 } 578 else if (this.myEntity instanceof EntityEnderCrystal) 579 { 580 return new Packet23VehicleSpawn(this.myEntity, 51); 581 } 582 else if (this.myEntity instanceof EntityFallingSand) 583 { 584 EntityFallingSand var5 = (EntityFallingSand)this.myEntity; 585 return new Packet23VehicleSpawn(this.myEntity, 70, var5.blockID | var5.metadata << 16); 586 } 587 else if (this.myEntity instanceof EntityPainting) 588 { 589 return new Packet25EntityPainting((EntityPainting)this.myEntity); 590 } 591 else if (this.myEntity instanceof EntityItemFrame) 592 { 593 EntityItemFrame var4 = (EntityItemFrame)this.myEntity; 594 var2 = new Packet23VehicleSpawn(this.myEntity, 71, var4.hangingDirection); 595 var2.xPosition = MathHelper.floor_float((float)(var4.xPosition * 32)); 596 var2.yPosition = MathHelper.floor_float((float)(var4.yPosition * 32)); 597 var2.zPosition = MathHelper.floor_float((float)(var4.zPosition * 32)); 598 return var2; 599 } 600 else if (this.myEntity instanceof EntityXPOrb) 601 { 602 return new Packet26EntityExpOrb((EntityXPOrb)this.myEntity); 603 } 604 else 605 { 606 throw new IllegalArgumentException("Don\'t know how to add " + this.myEntity.getClass() + "!"); 607 } 608 } 609 } 610 else 611 { 612 this.lastHeadMotion = MathHelper.floor_float(this.myEntity.setRotationYawHead() * 256.0F / 360.0F); 613 return new Packet24MobSpawn((EntityLiving)this.myEntity); 614 } 615 } 616 } 617 618 public void removePlayerFromTracker(EntityPlayerMP par1EntityPlayerMP) 619 { 620 if (this.trackedPlayers.contains(par1EntityPlayerMP)) 621 { 622 this.trackedPlayers.remove(par1EntityPlayerMP); 623 par1EntityPlayerMP.destroyedItemsNetCache.add(Integer.valueOf(this.myEntity.entityId)); 624 } 625 } 626 }