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    }