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