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 }