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 for (int var6 = 0; var6 < var1.size(); ++var6)
212 {
213 EntityPlayerMP var7 = (EntityPlayerMP)var1.get(var6);
214 Iterator var4 = this.trackedEntities.iterator();
215
216 while (var4.hasNext())
217 {
218 EntityTrackerEntry var5 = (EntityTrackerEntry)var4.next();
219
220 if (var5.myEntity != var7)
221 {
222 var5.tryStartWachingThis(var7);
223 }
224 }
225 }
226 }
227
228 /**
229 * does not send the packet to the entity if the entity is a player
230 */
231 public void sendPacketToAllPlayersTrackingEntity(Entity par1Entity, Packet par2Packet)
232 {
233 EntityTrackerEntry var3 = (EntityTrackerEntry)this.trackedEntityIDs.lookup(par1Entity.entityId);
234
235 if (var3 != null)
236 {
237 var3.sendPacketToAllTrackingPlayers(par2Packet);
238 }
239 }
240
241 /**
242 * sends to the entity if the entity is a player
243 */
244 public void sendPacketToAllAssociatedPlayers(Entity par1Entity, Packet par2Packet)
245 {
246 EntityTrackerEntry var3 = (EntityTrackerEntry)this.trackedEntityIDs.lookup(par1Entity.entityId);
247
248 if (var3 != null)
249 {
250 var3.sendPacketToAllAssociatedPlayers(par2Packet);
251 }
252 }
253
254 public void removeAllTrackingPlayers(EntityPlayerMP par1EntityPlayerMP)
255 {
256 Iterator var2 = this.trackedEntities.iterator();
257
258 while (var2.hasNext())
259 {
260 EntityTrackerEntry var3 = (EntityTrackerEntry)var2.next();
261 var3.removePlayerFromTracker(par1EntityPlayerMP);
262 }
263 }
264
265 public void func_85172_a(EntityPlayerMP par1EntityPlayerMP, Chunk par2Chunk)
266 {
267 Iterator var3 = this.trackedEntities.iterator();
268
269 while (var3.hasNext())
270 {
271 EntityTrackerEntry var4 = (EntityTrackerEntry)var3.next();
272
273 if (var4.myEntity != par1EntityPlayerMP && var4.myEntity.chunkCoordX == par2Chunk.xPosition && var4.myEntity.chunkCoordZ == par2Chunk.zPosition)
274 {
275 var4.tryStartWachingThis(par1EntityPlayerMP);
276 }
277 }
278 }
279 }