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