    001    package net.minecraft.src;
    002
    003    import java.util.ArrayList;
    004    import java.util.HashSet;
    005    import java.util.Iterator;
    006    import java.util.Set;
    007
    008    import cpw.mods.fml.common.registry.EntityRegistry;
    009
    010    public class EntityTracker
    011    {
    012        private final WorldServer theWorld;
    013        private Set trackedEntities = new HashSet();
    014        private IntHashMap trackedEntityIDs = new IntHashMap();
    015        private int entityViewDistance;
    016
    017        public EntityTracker(WorldServer par1WorldServer)
    018        {
    019            this.theWorld = par1WorldServer;
    020            this.entityViewDistance = par1WorldServer.getMinecraftServer().getConfigurationManager().getEntityViewDistance();
    021        }
    022
    023        /**
    024         * if entity is a player sends all tracked events to the player, otherwise, adds with a visibility and update arate
    025         * based on the class type
    026         */
    027        public void addEntityToTracker(Entity par1Entity)
    028        {
    029            if (EntityRegistry.instance().tryTrackingEntity(this, par1Entity))
    030            {
    031                return;
    032            }
    033            if (par1Entity instanceof EntityPlayerMP)
    034            {
    035                this.addEntityToTracker(par1Entity, 512, 2);
    036                EntityPlayerMP var2 = (EntityPlayerMP)par1Entity;
    037                Iterator var3 = this.trackedEntities.iterator();
    038
    039                while (var3.hasNext())
    040                {
    041                    EntityTrackerEntry var4 = (EntityTrackerEntry)var3.next();
    042
    043                    if (var4.myEntity != var2)
    044                    {
    045                        var4.tryStartWachingThis(var2);
    046                    }
    047                }
    048            }
    049            else if (par1Entity instanceof EntityFishHook)
    050            {
    051                this.addEntityToTracker(par1Entity, 64, 5, true);
    052            }
    053            else if (par1Entity instanceof EntityArrow)
    054            {
    055                this.addEntityToTracker(par1Entity, 64, 20, false);
    056            }
    057            else if (par1Entity instanceof EntitySmallFireball)
    058            {
    059                this.addEntityToTracker(par1Entity, 64, 10, false);
    060            }
    061            else if (par1Entity instanceof EntityFireball)
    062            {
    063                this.addEntityToTracker(par1Entity, 64, 10, false);
    064            }
    065            else if (par1Entity instanceof EntitySnowball)
    066            {
    067                this.addEntityToTracker(par1Entity, 64, 10, true);
    068            }
    069            else if (par1Entity instanceof EntityEnderPearl)
    070            {
    071                this.addEntityToTracker(par1Entity, 64, 10, true);
    072            }
    073            else if (par1Entity instanceof EntityEnderEye)
    074            {
    075                this.addEntityToTracker(par1Entity, 64, 4, true);
    076            }
    077            else if (par1Entity instanceof EntityEgg)
    078            {
    079                this.addEntityToTracker(par1Entity, 64, 10, true);
    080            }
    081            else if (par1Entity instanceof EntityPotion)
    082            {
    083                this.addEntityToTracker(par1Entity, 64, 10, true);
    084            }
    085            else if (par1Entity instanceof EntityExpBottle)
    086            {
    087                this.addEntityToTracker(par1Entity, 64, 10, true);
    088            }
    089            else if (par1Entity instanceof EntityItem)
    090            {
    091                this.addEntityToTracker(par1Entity, 64, 20, true);
    092            }
    093            else if (par1Entity instanceof EntityMinecart)
    094            {
    095                this.addEntityToTracker(par1Entity, 80, 3, true);
    096            }
    097            else if (par1Entity instanceof EntityBoat)
    098            {
    099                this.addEntityToTracker(par1Entity, 80, 3, true);
    100            }
    101            else if (par1Entity instanceof EntitySquid)
    102            {
    103                this.addEntityToTracker(par1Entity, 64, 3, true);
    104            }
    105            else if (par1Entity instanceof EntityWither)
    106            {
    107                this.addEntityToTracker(par1Entity, 80, 3, false);
    108            }
    109            else if (par1Entity instanceof EntityBat)
    110            {
    111                this.addEntityToTracker(par1Entity, 80, 3, false);
    112            }
    113            else if (par1Entity instanceof IAnimals)
    114            {
    115                this.addEntityToTracker(par1Entity, 80, 3, true);
    116            }
    117            else if (par1Entity instanceof EntityDragon)
    118            {
    119                this.addEntityToTracker(par1Entity, 160, 3, true);
    120            }
    121            else if (par1Entity instanceof EntityTNTPrimed)
    122            {
    123                this.addEntityToTracker(par1Entity, 160, 10, true);
    124            }
    125            else if (par1Entity instanceof EntityFallingSand)
    126            {
    127                this.addEntityToTracker(par1Entity, 160, 20, true);
    128            }
    129            else if (par1Entity instanceof EntityPainting)
    130            {
    131                this.addEntityToTracker(par1Entity, 160, Integer.MAX_VALUE, false);
    132            }
    133            else if (par1Entity instanceof EntityXPOrb)
    134            {
    135                this.addEntityToTracker(par1Entity, 160, 20, true);
    136            }
    137            else if (par1Entity instanceof EntityEnderCrystal)
    138            {
    139                this.addEntityToTracker(par1Entity, 256, Integer.MAX_VALUE, false);
    140            }
    141            else if (par1Entity instanceof EntityItemFrame)
    142            {
    143                this.addEntityToTracker(par1Entity, 160, Integer.MAX_VALUE, false);
    144            }
    145        }
    146
    147        public void addEntityToTracker(Entity par1Entity, int par2, int par3)
    148        {
    149            this.addEntityToTracker(par1Entity, par2, par3, false);
    150        }
    151
    152        public void addEntityToTracker(Entity par1Entity, int par2, int par3, boolean par4)
    153        {
    154            if (par2 > this.entityViewDistance)
    155            {
    156                par2 = this.entityViewDistance;
    157            }
    158
    159            if (this.trackedEntityIDs.containsItem(par1Entity.entityId))
    160            {
    161                throw new IllegalStateException("Entity is already tracked!");
    162            }
    163            else
    164            {
    165                EntityTrackerEntry var5 = new EntityTrackerEntry(par1Entity, par2, par3, par4);
    166                this.trackedEntities.add(var5);
    167                this.trackedEntityIDs.addKey(par1Entity.entityId, var5);
    168                var5.sendEventsToPlayers(this.theWorld.playerEntities);
    169            }
    170        }
    171
    172        public void removeEntityFromAllTrackingPlayers(Entity par1Entity)
    173        {
    174            if (par1Entity instanceof EntityPlayerMP)
    175            {
    176                EntityPlayerMP var2 = (EntityPlayerMP)par1Entity;
    177                Iterator var3 = this.trackedEntities.iterator();
    178
    179                while (var3.hasNext())
    180                {
    181                    EntityTrackerEntry var4 = (EntityTrackerEntry)var3.next();
    182                    var4.removeFromWatchingList(var2);
    183                }
    184            }
    185
    186            EntityTrackerEntry var5 = (EntityTrackerEntry)this.trackedEntityIDs.removeObject(par1Entity.entityId);
    187
    188            if (var5 != null)
    189            {
    190                this.trackedEntities.remove(var5);
    191                var5.informAllAssociatedPlayersOfItemDestruction();
    192            }
    193        }
    194
    195        public void updateTrackedEntities()
    196        {
    197            ArrayList var1 = new ArrayList();
    198            Iterator var2 = this.trackedEntities.iterator();
    199
    200            while (var2.hasNext())
    201            {
    202                EntityTrackerEntry var3 = (EntityTrackerEntry)var2.next();
    203                var3.sendLocationToAllClients(this.theWorld.playerEntities);
    204
    205                if (var3.playerEntitiesUpdated && var3.myEntity instanceof EntityPlayerMP)
    206                {
    207                    var1.add((EntityPlayerMP)var3.myEntity);
    208                }
    209            }
    210
    211            var2 = var1.iterator();
    212
    213            while (var2.hasNext())
    214            {
    215                EntityPlayerMP var7 = (EntityPlayerMP)var2.next();
    216                EntityPlayerMP var4 = var7;
    217                Iterator var5 = this.trackedEntities.iterator();
    218
    219                while (var5.hasNext())
    220                {
    221                    EntityTrackerEntry var6 = (EntityTrackerEntry)var5.next();
    222
    223                    if (var6.myEntity != var4)
    224                    {
    225                        var6.tryStartWachingThis(var4);
    226                    }
    227                }
    228            }
    229        }
    230
    231        /**
    232         * does not send the packet to the entity if the entity is a player
    233         */
    234        public void sendPacketToAllPlayersTrackingEntity(Entity par1Entity, Packet par2Packet)
    235        {
    236            EntityTrackerEntry var3 = (EntityTrackerEntry)this.trackedEntityIDs.lookup(par1Entity.entityId);
    237
    238            if (var3 != null)
    239            {
    240                var3.sendPacketToAllTrackingPlayers(par2Packet);
    241            }
    242        }
    243
    244        /**
    245         * sends to the entity if the entity is a player
    246         */
    247        public void sendPacketToAllAssociatedPlayers(Entity par1Entity, Packet par2Packet)
    248        {
    249            EntityTrackerEntry var3 = (EntityTrackerEntry)this.trackedEntityIDs.lookup(par1Entity.entityId);
    250
    251            if (var3 != null)
    252            {
    253                var3.sendPacketToAllAssociatedPlayers(par2Packet);
    254            }
    255        }
    256
    257        public void removeAllTrackingPlayers(EntityPlayerMP par1EntityPlayerMP)
    258        {
    259            Iterator var2 = this.trackedEntities.iterator();
    260
    261            while (var2.hasNext())
    262            {
    263                EntityTrackerEntry var3 = (EntityTrackerEntry)var2.next();
    264                var3.removePlayerFromTracker(par1EntityPlayerMP);
    265            }
    266        }
    267
    268        public void func_85172_a(EntityPlayerMP par1EntityPlayerMP, Chunk par2Chunk)
    269        {
    270            Iterator var3 = this.trackedEntities.iterator();
    271
    272            while (var3.hasNext())
    273            {
    274                EntityTrackerEntry var4 = (EntityTrackerEntry)var3.next();
    275
    276                if (var4.myEntity != par1EntityPlayerMP && var4.myEntity.chunkCoordX == par2Chunk.xPosition && var4.myEntity.chunkCoordZ == par2Chunk.zPosition)
    277                {
    278                    var4.tryStartWachingThis(par1EntityPlayerMP);
    279                }
    280            }
    281        }
    282    }