package net.minecraft.entity; import java.util.Collection; import java.util.HashSet; import java.util.Iterator; import java.util.List; import java.util.Set; import net.minecraft.block.Block; import net.minecraft.entity.ai.attributes.ServersideAttributeMap; import net.minecraft.entity.boss.EntityDragon; import net.minecraft.entity.item.EntityBoat; import net.minecraft.entity.item.EntityEnderCrystal; import net.minecraft.entity.item.EntityEnderEye; import net.minecraft.entity.item.EntityEnderPearl; import net.minecraft.entity.item.EntityExpBottle; import net.minecraft.entity.item.EntityFallingBlock; import net.minecraft.entity.item.EntityFireworkRocket; import net.minecraft.entity.item.EntityItem; import net.minecraft.entity.item.EntityItemFrame; import net.minecraft.entity.item.EntityMinecart; import net.minecraft.entity.item.EntityPainting; import net.minecraft.entity.item.EntityTNTPrimed; import net.minecraft.entity.item.EntityXPOrb; import net.minecraft.entity.passive.IAnimals; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.player.EntityPlayerMP; import net.minecraft.entity.projectile.EntityArrow; import net.minecraft.entity.projectile.EntityEgg; import net.minecraft.entity.projectile.EntityFireball; import net.minecraft.entity.projectile.EntityFishHook; import net.minecraft.entity.projectile.EntityPotion; import net.minecraft.entity.projectile.EntitySmallFireball; import net.minecraft.entity.projectile.EntitySnowball; import net.minecraft.entity.projectile.EntityWitherSkull; import net.minecraft.init.Items; import net.minecraft.item.ItemMap; import net.minecraft.item.ItemStack; import net.minecraft.network.Packet; import net.minecraft.network.play.server.S04PacketEntityEquipment; import net.minecraft.network.play.server.S0APacketUseBed; import net.minecraft.network.play.server.S0CPacketSpawnPlayer; import net.minecraft.network.play.server.S0EPacketSpawnObject; import net.minecraft.network.play.server.S0FPacketSpawnMob; import net.minecraft.network.play.server.S10PacketSpawnPainting; import net.minecraft.network.play.server.S11PacketSpawnExperienceOrb; import net.minecraft.network.play.server.S12PacketEntityVelocity; import net.minecraft.network.play.server.S14PacketEntity; import net.minecraft.network.play.server.S18PacketEntityTeleport; import net.minecraft.network.play.server.S19PacketEntityHeadLook; import net.minecraft.network.play.server.S1BPacketEntityAttach; import net.minecraft.network.play.server.S1CPacketEntityMetadata; import net.minecraft.network.play.server.S1DPacketEntityEffect; import net.minecraft.network.play.server.S20PacketEntityProperties; import net.minecraft.potion.PotionEffect; import net.minecraft.util.MathHelper; import net.minecraft.world.storage.MapData; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import cpw.mods.fml.common.network.internal.FMLNetworkHandler; public class EntityTrackerEntry { private static final Logger logger = LogManager.getLogger(); /** The entity that this EntityTrackerEntry tracks. */ public Entity trackedEntity; public int trackingDistanceThreshold; /** check for sync when ticks % updateFrequency==0 */ public int updateFrequency; /** The encoded entity X position. */ public int encodedPosX; /** The encoded entity Y position. */ public int encodedPosY; /** The encoded entity Z position. */ public int encodedPosZ; /** The encoded entity yaw rotation. */ public int encodedRotationYaw; /** The encoded entity pitch rotation. */ public int encodedRotationPitch; public int lastHeadMotion; public double lastTrackedEntityMotionX; public double lastTrackedEntityMotionY; public double motionZ; public int updateCounter; private double lastTrackedEntityPosX; private double lastTrackedEntityPosY; private double lastTrackedEntityPosZ; private boolean firstUpdateDone; private boolean sendVelocityUpdates; /** * every 400 ticks a full teleport packet is sent, rather than just a "move me +x" command, so that position * remains fully synced. */ private int ticksSinceLastForcedTeleport; private Entity field_85178_v; private boolean ridingEntity; public boolean playerEntitiesUpdated; /** Holds references to all the players that are currently receiving position updates for this entity. */ public Set trackingPlayers = new HashSet(); private static final String __OBFID = "CL_00001443"; public EntityTrackerEntry(Entity p_i1525_1_, int p_i1525_2_, int p_i1525_3_, boolean p_i1525_4_) { this.trackedEntity = p_i1525_1_; this.trackingDistanceThreshold = p_i1525_2_; this.updateFrequency = p_i1525_3_; this.sendVelocityUpdates = p_i1525_4_; this.encodedPosX = MathHelper.floor_double(p_i1525_1_.posX * 32.0D); this.encodedPosY = MathHelper.floor_double(p_i1525_1_.posY * 32.0D); this.encodedPosZ = MathHelper.floor_double(p_i1525_1_.posZ * 32.0D); this.encodedRotationYaw = MathHelper.floor_float(p_i1525_1_.rotationYaw * 256.0F / 360.0F); this.encodedRotationPitch = MathHelper.floor_float(p_i1525_1_.rotationPitch * 256.0F / 360.0F); this.lastHeadMotion = MathHelper.floor_float(p_i1525_1_.getRotationYawHead() * 256.0F / 360.0F); } public boolean equals(Object p_equals_1_) { return p_equals_1_ instanceof EntityTrackerEntry ? ((EntityTrackerEntry)p_equals_1_).trackedEntity.getEntityId() == this.trackedEntity.getEntityId() : false; } public int hashCode() { return this.trackedEntity.getEntityId(); } public void updatePlayerList(List p_73122_1_) { this.playerEntitiesUpdated = false; if (!this.firstUpdateDone || this.trackedEntity.getDistanceSq(this.lastTrackedEntityPosX, this.lastTrackedEntityPosY, this.lastTrackedEntityPosZ) > 16.0D) { this.lastTrackedEntityPosX = this.trackedEntity.posX; this.lastTrackedEntityPosY = this.trackedEntity.posY; this.lastTrackedEntityPosZ = this.trackedEntity.posZ; this.firstUpdateDone = true; this.playerEntitiesUpdated = true; this.updatePlayerEntities(p_73122_1_); } if (this.field_85178_v != this.trackedEntity.ridingEntity || this.trackedEntity.ridingEntity != null && this.updateCounter % 60 == 0) { this.field_85178_v = this.trackedEntity.ridingEntity; this.func_151259_a(new S1BPacketEntityAttach(0, this.trackedEntity, this.trackedEntity.ridingEntity)); } if (this.trackedEntity instanceof EntityItemFrame && this.updateCounter % 10 == 0) { EntityItemFrame entityitemframe = (EntityItemFrame)this.trackedEntity; ItemStack itemstack = entityitemframe.getDisplayedItem(); if (itemstack != null && itemstack.getItem() instanceof ItemMap) { MapData mapdata = Items.filled_map.getMapData(itemstack, this.trackedEntity.worldObj); Iterator iterator = p_73122_1_.iterator(); while (iterator.hasNext()) { EntityPlayer entityplayer = (EntityPlayer)iterator.next(); EntityPlayerMP entityplayermp = (EntityPlayerMP)entityplayer; mapdata.updateVisiblePlayers(entityplayermp, itemstack); Packet packet = Items.filled_map.createMapDataPacket(itemstack, this.trackedEntity.worldObj, entityplayermp); if (packet != null) { entityplayermp.playerNetServerHandler.sendPacket(packet); } } } this.sendMetadataToAllAssociatedPlayers(); } else if (this.updateCounter % this.updateFrequency == 0 || this.trackedEntity.isAirBorne || this.trackedEntity.getDataWatcher().hasObjectChanged()) { int i; int j; if (this.trackedEntity.ridingEntity == null) { ++this.ticksSinceLastForcedTeleport; i = this.trackedEntity.myEntitySize.multiplyBy32AndRound(this.trackedEntity.posX); j = MathHelper.floor_double(this.trackedEntity.posY * 32.0D); int k = this.trackedEntity.myEntitySize.multiplyBy32AndRound(this.trackedEntity.posZ); int l = MathHelper.floor_float(this.trackedEntity.rotationYaw * 256.0F / 360.0F); int i1 = MathHelper.floor_float(this.trackedEntity.rotationPitch * 256.0F / 360.0F); int j1 = i - this.encodedPosX; int k1 = j - this.encodedPosY; int l1 = k - this.encodedPosZ; Object object = null; boolean flag = Math.abs(j1) >= 4 || Math.abs(k1) >= 4 || Math.abs(l1) >= 4 || this.updateCounter % 60 == 0; boolean flag1 = Math.abs(l - this.encodedRotationYaw) >= 4 || Math.abs(i1 - this.encodedRotationPitch) >= 4; if (this.updateCounter > 0 || this.trackedEntity instanceof EntityArrow) { if (j1 >= -128 && j1 < 128 && k1 >= -128 && k1 < 128 && l1 >= -128 && l1 < 128 && this.ticksSinceLastForcedTeleport <= 400 && !this.ridingEntity) { if (flag && flag1) { object = new S14PacketEntity.S17PacketEntityLookMove(this.trackedEntity.getEntityId(), (byte)j1, (byte)k1, (byte)l1, (byte)l, (byte)i1); } else if (flag) { object = new S14PacketEntity.S15PacketEntityRelMove(this.trackedEntity.getEntityId(), (byte)j1, (byte)k1, (byte)l1); } else if (flag1) { object = new S14PacketEntity.S16PacketEntityLook(this.trackedEntity.getEntityId(), (byte)l, (byte)i1); } } else { this.ticksSinceLastForcedTeleport = 0; object = new S18PacketEntityTeleport(this.trackedEntity.getEntityId(), i, j, k, (byte)l, (byte)i1); } } if (this.sendVelocityUpdates) { double d0 = this.trackedEntity.motionX - this.lastTrackedEntityMotionX; double d1 = this.trackedEntity.motionY - this.lastTrackedEntityMotionY; double d2 = this.trackedEntity.motionZ - this.motionZ; double d3 = 0.02D; double d4 = d0 * d0 + d1 * d1 + d2 * d2; if (d4 > d3 * d3 || d4 > 0.0D && this.trackedEntity.motionX == 0.0D && this.trackedEntity.motionY == 0.0D && this.trackedEntity.motionZ == 0.0D) { this.lastTrackedEntityMotionX = this.trackedEntity.motionX; this.lastTrackedEntityMotionY = this.trackedEntity.motionY; this.motionZ = this.trackedEntity.motionZ; this.func_151259_a(new S12PacketEntityVelocity(this.trackedEntity.getEntityId(), this.lastTrackedEntityMotionX, this.lastTrackedEntityMotionY, this.motionZ)); } } if (object != null) { this.func_151259_a((Packet)object); } this.sendMetadataToAllAssociatedPlayers(); if (flag) { this.encodedPosX = i; this.encodedPosY = j; this.encodedPosZ = k; } if (flag1) { this.encodedRotationYaw = l; this.encodedRotationPitch = i1; } this.ridingEntity = false; } else { i = MathHelper.floor_float(this.trackedEntity.rotationYaw * 256.0F / 360.0F); j = MathHelper.floor_float(this.trackedEntity.rotationPitch * 256.0F / 360.0F); boolean flag2 = Math.abs(i - this.encodedRotationYaw) >= 4 || Math.abs(j - this.encodedRotationPitch) >= 4; if (flag2) { this.func_151259_a(new S14PacketEntity.S16PacketEntityLook(this.trackedEntity.getEntityId(), (byte)i, (byte)j)); this.encodedRotationYaw = i; this.encodedRotationPitch = j; } this.encodedPosX = this.trackedEntity.myEntitySize.multiplyBy32AndRound(this.trackedEntity.posX); this.encodedPosY = MathHelper.floor_double(this.trackedEntity.posY * 32.0D); this.encodedPosZ = this.trackedEntity.myEntitySize.multiplyBy32AndRound(this.trackedEntity.posZ); this.sendMetadataToAllAssociatedPlayers(); this.ridingEntity = true; } i = MathHelper.floor_float(this.trackedEntity.getRotationYawHead() * 256.0F / 360.0F); if (Math.abs(i - this.lastHeadMotion) >= 4) { this.func_151259_a(new S19PacketEntityHeadLook(this.trackedEntity, (byte)i)); this.lastHeadMotion = i; } this.trackedEntity.isAirBorne = false; } ++this.updateCounter; if (this.trackedEntity.velocityChanged) { this.func_151261_b(new S12PacketEntityVelocity(this.trackedEntity)); this.trackedEntity.velocityChanged = false; } } /** * Sends the entity metadata (DataWatcher) and attributes to all players tracking this entity, including the entity * itself if a player. */ private void sendMetadataToAllAssociatedPlayers() { DataWatcher datawatcher = this.trackedEntity.getDataWatcher(); if (datawatcher.hasObjectChanged()) { this.func_151261_b(new S1CPacketEntityMetadata(this.trackedEntity.getEntityId(), datawatcher, false)); } if (this.trackedEntity instanceof EntityLivingBase) { ServersideAttributeMap serversideattributemap = (ServersideAttributeMap)((EntityLivingBase)this.trackedEntity).getAttributeMap(); Set set = serversideattributemap.getAttributeInstanceSet(); if (!set.isEmpty()) { this.func_151261_b(new S20PacketEntityProperties(this.trackedEntity.getEntityId(), set)); } set.clear(); } } public void func_151259_a(Packet p_151259_1_) { Iterator iterator = this.trackingPlayers.iterator(); while (iterator.hasNext()) { EntityPlayerMP entityplayermp = (EntityPlayerMP)iterator.next(); entityplayermp.playerNetServerHandler.sendPacket(p_151259_1_); } } public void func_151261_b(Packet p_151261_1_) { this.func_151259_a(p_151261_1_); if (this.trackedEntity instanceof EntityPlayerMP) { ((EntityPlayerMP)this.trackedEntity).playerNetServerHandler.sendPacket(p_151261_1_); } } public void sendDestroyEntityPacketToTrackedPlayers() { Iterator iterator = this.trackingPlayers.iterator(); while (iterator.hasNext()) { EntityPlayerMP entityplayermp = (EntityPlayerMP)iterator.next(); entityplayermp.func_152339_d(this.trackedEntity); } } public void removeFromTrackedPlayers(EntityPlayerMP p_73118_1_) { if (this.trackingPlayers.contains(p_73118_1_)) { p_73118_1_.func_152339_d(this.trackedEntity); this.trackingPlayers.remove(p_73118_1_); } } public void updatePlayerEntity(EntityPlayerMP p_73117_1_) { if (p_73117_1_ != this.trackedEntity) { double d0 = p_73117_1_.posX - (double)(this.encodedPosX / 32); double d1 = p_73117_1_.posZ - (double)(this.encodedPosZ / 32); if (d0 >= (double)(-this.trackingDistanceThreshold) && d0 <= (double)this.trackingDistanceThreshold && d1 >= (double)(-this.trackingDistanceThreshold) && d1 <= (double)this.trackingDistanceThreshold) { if (!this.trackingPlayers.contains(p_73117_1_) && (this.isPlayerWatchingThisChunk(p_73117_1_) || this.trackedEntity.forceSpawn)) { this.trackingPlayers.add(p_73117_1_); Packet packet = this.func_151260_c(); p_73117_1_.playerNetServerHandler.sendPacket(packet); if (!this.trackedEntity.getDataWatcher().getIsBlank()) { p_73117_1_.playerNetServerHandler.sendPacket(new S1CPacketEntityMetadata(this.trackedEntity.getEntityId(), this.trackedEntity.getDataWatcher(), true)); } if (this.trackedEntity instanceof EntityLivingBase) { ServersideAttributeMap serversideattributemap = (ServersideAttributeMap)((EntityLivingBase)this.trackedEntity).getAttributeMap(); Collection collection = serversideattributemap.getWatchedAttributes(); if (!collection.isEmpty()) { p_73117_1_.playerNetServerHandler.sendPacket(new S20PacketEntityProperties(this.trackedEntity.getEntityId(), collection)); } } this.lastTrackedEntityMotionX = this.trackedEntity.motionX; this.lastTrackedEntityMotionY = this.trackedEntity.motionY; this.motionZ = this.trackedEntity.motionZ; int posX = MathHelper.floor_double(this.trackedEntity.posX * 32.0D); int posY = MathHelper.floor_double(this.trackedEntity.posY * 32.0D); int posZ = MathHelper.floor_double(this.trackedEntity.posZ * 32.0D); if (posX != this.encodedPosX || posY != this.encodedPosY || posZ != this.encodedPosZ) { FMLNetworkHandler.makeEntitySpawnAdjustment(this.trackedEntity, p_73117_1_, this.encodedPosX, this.encodedPosY, this.encodedPosZ); } if (this.sendVelocityUpdates && !(packet instanceof S0FPacketSpawnMob)) { p_73117_1_.playerNetServerHandler.sendPacket(new S12PacketEntityVelocity(this.trackedEntity.getEntityId(), this.trackedEntity.motionX, this.trackedEntity.motionY, this.trackedEntity.motionZ)); } if (this.trackedEntity.ridingEntity != null) { p_73117_1_.playerNetServerHandler.sendPacket(new S1BPacketEntityAttach(0, this.trackedEntity, this.trackedEntity.ridingEntity)); } if (this.trackedEntity instanceof EntityLiving && ((EntityLiving)this.trackedEntity).getLeashedToEntity() != null) { p_73117_1_.playerNetServerHandler.sendPacket(new S1BPacketEntityAttach(1, this.trackedEntity, ((EntityLiving)this.trackedEntity).getLeashedToEntity())); } if (this.trackedEntity instanceof EntityLivingBase) { for (int i = 0; i < 5; ++i) { ItemStack itemstack = ((EntityLivingBase)this.trackedEntity).getEquipmentInSlot(i); if (itemstack != null) { p_73117_1_.playerNetServerHandler.sendPacket(new S04PacketEntityEquipment(this.trackedEntity.getEntityId(), i, itemstack)); } } } if (this.trackedEntity instanceof EntityPlayer) { EntityPlayer entityplayer = (EntityPlayer)this.trackedEntity; if (entityplayer.isPlayerSleeping()) { p_73117_1_.playerNetServerHandler.sendPacket(new S0APacketUseBed(entityplayer, MathHelper.floor_double(this.trackedEntity.posX), MathHelper.floor_double(this.trackedEntity.posY), MathHelper.floor_double(this.trackedEntity.posZ))); } } if (this.trackedEntity instanceof EntityLivingBase) { EntityLivingBase entitylivingbase = (EntityLivingBase)this.trackedEntity; Iterator iterator = entitylivingbase.getActivePotionEffects().iterator(); while (iterator.hasNext()) { PotionEffect potioneffect = (PotionEffect)iterator.next(); p_73117_1_.playerNetServerHandler.sendPacket(new S1DPacketEntityEffect(this.trackedEntity.getEntityId(), potioneffect)); } } net.minecraftforge.event.ForgeEventFactory.onStartEntityTracking(trackedEntity, p_73117_1_); } } else if (this.trackingPlayers.contains(p_73117_1_)) { this.trackingPlayers.remove(p_73117_1_); p_73117_1_.func_152339_d(this.trackedEntity); net.minecraftforge.event.ForgeEventFactory.onStopEntityTracking(trackedEntity, p_73117_1_); } } } private boolean isPlayerWatchingThisChunk(EntityPlayerMP p_73121_1_) { return p_73121_1_.getServerForPlayer().getPlayerManager().isPlayerWatchingChunk(p_73121_1_, this.trackedEntity.chunkCoordX, this.trackedEntity.chunkCoordZ); } public void updatePlayerEntities(List p_73125_1_) { for (int i = 0; i < p_73125_1_.size(); ++i) { this.updatePlayerEntity((EntityPlayerMP)p_73125_1_.get(i)); } } private Packet func_151260_c() { if (this.trackedEntity.isDead) { logger.warn("Fetching addPacket for removed entity"); } Packet pkt = FMLNetworkHandler.getEntitySpawningPacket(this.trackedEntity); if (pkt != null) { return pkt; } if (this.trackedEntity instanceof EntityItem) { return new S0EPacketSpawnObject(this.trackedEntity, 2, 1); } else if (this.trackedEntity instanceof EntityPlayerMP) { return new S0CPacketSpawnPlayer((EntityPlayer)this.trackedEntity); } else if (this.trackedEntity instanceof EntityMinecart) { EntityMinecart entityminecart = (EntityMinecart)this.trackedEntity; return new S0EPacketSpawnObject(this.trackedEntity, 10, entityminecart.getMinecartType()); } else if (this.trackedEntity instanceof EntityBoat) { return new S0EPacketSpawnObject(this.trackedEntity, 1); } else if (!(this.trackedEntity instanceof IAnimals) && !(this.trackedEntity instanceof EntityDragon)) { if (this.trackedEntity instanceof EntityFishHook) { EntityPlayer entityplayer = ((EntityFishHook)this.trackedEntity).angler; return new S0EPacketSpawnObject(this.trackedEntity, 90, entityplayer != null ? entityplayer.getEntityId() : this.trackedEntity.getEntityId()); } else if (this.trackedEntity instanceof EntityArrow) { Entity entity = ((EntityArrow)this.trackedEntity).shootingEntity; return new S0EPacketSpawnObject(this.trackedEntity, 60, entity != null ? entity.getEntityId() : this.trackedEntity.getEntityId()); } else if (this.trackedEntity instanceof EntitySnowball) { return new S0EPacketSpawnObject(this.trackedEntity, 61); } else if (this.trackedEntity instanceof EntityPotion) { return new S0EPacketSpawnObject(this.trackedEntity, 73, ((EntityPotion)this.trackedEntity).getPotionDamage()); } else if (this.trackedEntity instanceof EntityExpBottle) { return new S0EPacketSpawnObject(this.trackedEntity, 75); } else if (this.trackedEntity instanceof EntityEnderPearl) { return new S0EPacketSpawnObject(this.trackedEntity, 65); } else if (this.trackedEntity instanceof EntityEnderEye) { return new S0EPacketSpawnObject(this.trackedEntity, 72); } else if (this.trackedEntity instanceof EntityFireworkRocket) { return new S0EPacketSpawnObject(this.trackedEntity, 76); } else { S0EPacketSpawnObject s0epacketspawnobject; if (this.trackedEntity instanceof EntityFireball) { EntityFireball entityfireball = (EntityFireball)this.trackedEntity; s0epacketspawnobject = null; byte b0 = 63; if (this.trackedEntity instanceof EntitySmallFireball) { b0 = 64; } else if (this.trackedEntity instanceof EntityWitherSkull) { b0 = 66; } if (entityfireball.shootingEntity != null) { s0epacketspawnobject = new S0EPacketSpawnObject(this.trackedEntity, b0, ((EntityFireball)this.trackedEntity).shootingEntity.getEntityId()); } else { s0epacketspawnobject = new S0EPacketSpawnObject(this.trackedEntity, b0, 0); } s0epacketspawnobject.func_149003_d((int)(entityfireball.accelerationX * 8000.0D)); s0epacketspawnobject.func_149000_e((int)(entityfireball.accelerationY * 8000.0D)); s0epacketspawnobject.func_149007_f((int)(entityfireball.accelerationZ * 8000.0D)); return s0epacketspawnobject; } else if (this.trackedEntity instanceof EntityEgg) { return new S0EPacketSpawnObject(this.trackedEntity, 62); } else if (this.trackedEntity instanceof EntityTNTPrimed) { return new S0EPacketSpawnObject(this.trackedEntity, 50); } else if (this.trackedEntity instanceof EntityEnderCrystal) { return new S0EPacketSpawnObject(this.trackedEntity, 51); } else if (this.trackedEntity instanceof EntityFallingBlock) { EntityFallingBlock entityfallingblock = (EntityFallingBlock)this.trackedEntity; return new S0EPacketSpawnObject(this.trackedEntity, 70, Block.getIdFromBlock(entityfallingblock.getBlock()) | entityfallingblock.metadata << 16); } else if (this.trackedEntity instanceof EntityPainting) { return new S10PacketSpawnPainting((EntityPainting)this.trackedEntity); } else if (this.trackedEntity instanceof EntityItemFrame) { EntityItemFrame entityitemframe = (EntityItemFrame)this.trackedEntity; s0epacketspawnobject = new S0EPacketSpawnObject(this.trackedEntity, 71, entityitemframe.hangingDirection); s0epacketspawnobject.func_148996_a(MathHelper.floor_float((float)(entityitemframe.field_146063_b * 32))); s0epacketspawnobject.func_148995_b(MathHelper.floor_float((float)(entityitemframe.field_146064_c * 32))); s0epacketspawnobject.func_149005_c(MathHelper.floor_float((float)(entityitemframe.field_146062_d * 32))); return s0epacketspawnobject; } else if (this.trackedEntity instanceof EntityLeashKnot) { EntityLeashKnot entityleashknot = (EntityLeashKnot)this.trackedEntity; s0epacketspawnobject = new S0EPacketSpawnObject(this.trackedEntity, 77); s0epacketspawnobject.func_148996_a(MathHelper.floor_float((float)(entityleashknot.field_146063_b * 32))); s0epacketspawnobject.func_148995_b(MathHelper.floor_float((float)(entityleashknot.field_146064_c * 32))); s0epacketspawnobject.func_149005_c(MathHelper.floor_float((float)(entityleashknot.field_146062_d * 32))); return s0epacketspawnobject; } else if (this.trackedEntity instanceof EntityXPOrb) { return new S11PacketSpawnExperienceOrb((EntityXPOrb)this.trackedEntity); } else { throw new IllegalArgumentException("Don\'t know how to add " + this.trackedEntity.getClass() + "!"); } } } else { this.lastHeadMotion = MathHelper.floor_float(this.trackedEntity.getRotationYawHead() * 256.0F / 360.0F); return new S0FPacketSpawnMob((EntityLivingBase)this.trackedEntity); } } /** * Remove a tracked player from our list and tell the tracked player to destroy us from their world. */ public void removeTrackedPlayerSymmetric(EntityPlayerMP p_73123_1_) { if (this.trackingPlayers.contains(p_73123_1_)) { this.trackingPlayers.remove(p_73123_1_); p_73123_1_.func_152339_d(this.trackedEntity); } } }