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 IAnimals)
106 {
107 this.addEntityToTracker(par1Entity, 80, 3, true);
108 }
109 else if (par1Entity instanceof EntityDragon)
110 {
111 this.addEntityToTracker(par1Entity, 160, 3, true);
112 }
113 else if (par1Entity instanceof EntityTNTPrimed)
114 {
115 this.addEntityToTracker(par1Entity, 160, 10, true);
116 }
117 else if (par1Entity instanceof EntityFallingSand)
118 {
119 this.addEntityToTracker(par1Entity, 160, 20, true);
120 }
121 else if (par1Entity instanceof EntityPainting)
122 {
123 this.addEntityToTracker(par1Entity, 160, Integer.MAX_VALUE, false);
124 }
125 else if (par1Entity instanceof EntityXPOrb)
126 {
127 this.addEntityToTracker(par1Entity, 160, 20, true);
128 }
129 else if (par1Entity instanceof EntityEnderCrystal)
130 {
131 this.addEntityToTracker(par1Entity, 256, Integer.MAX_VALUE, false);
132 }
133 }
134
135 public void addEntityToTracker(Entity par1Entity, int par2, int par3)
136 {
137 this.addEntityToTracker(par1Entity, par2, par3, false);
138 }
139
140 public void addEntityToTracker(Entity par1Entity, int par2, int par3, boolean par4)
141 {
142 if (par2 > this.entityViewDistance)
143 {
144 par2 = this.entityViewDistance;
145 }
146
147 if (this.trackedEntityIDs.containsItem(par1Entity.entityId))
148 {
149 throw new IllegalStateException("Entity is already tracked!");
150 }
151 else
152 {
153 EntityTrackerEntry var5 = new EntityTrackerEntry(par1Entity, par2, par3, par4);
154 this.trackedEntities.add(var5);
155 this.trackedEntityIDs.addKey(par1Entity.entityId, var5);
156 var5.sendEventsToPlayers(this.theWorld.playerEntities);
157 }
158 }
159
160 public void removeEntityFromAllTrackingPlayers(Entity par1Entity)
161 {
162 if (par1Entity instanceof EntityPlayerMP)
163 {
164 EntityPlayerMP var2 = (EntityPlayerMP)par1Entity;
165 Iterator var3 = this.trackedEntities.iterator();
166
167 while (var3.hasNext())
168 {
169 EntityTrackerEntry var4 = (EntityTrackerEntry)var3.next();
170 var4.removeFromWatchingList(var2);
171 }
172 }
173
174 EntityTrackerEntry var5 = (EntityTrackerEntry)this.trackedEntityIDs.removeObject(par1Entity.entityId);
175
176 if (var5 != null)
177 {
178 this.trackedEntities.remove(var5);
179 var5.informAllAssociatedPlayersOfItemDestruction();
180 }
181 }
182
183 public void updateTrackedEntities()
184 {
185 ArrayList var1 = new ArrayList();
186 Iterator var2 = this.trackedEntities.iterator();
187
188 while (var2.hasNext())
189 {
190 EntityTrackerEntry var3 = (EntityTrackerEntry)var2.next();
191 var3.sendLocationToAllClients(this.theWorld.playerEntities);
192
193 if (var3.playerEntitiesUpdated && var3.myEntity instanceof EntityPlayerMP)
194 {
195 var1.add((EntityPlayerMP)var3.myEntity);
196 }
197 }
198
199 var2 = var1.iterator();
200
201 while (var2.hasNext())
202 {
203 EntityPlayerMP var7 = (EntityPlayerMP)var2.next();
204 EntityPlayerMP var4 = var7;
205 Iterator var5 = this.trackedEntities.iterator();
206
207 while (var5.hasNext())
208 {
209 EntityTrackerEntry var6 = (EntityTrackerEntry)var5.next();
210
211 if (var6.myEntity != var4)
212 {
213 var6.tryStartWachingThis(var4);
214 }
215 }
216 }
217 }
218
219 /**
220 * does not send the packet to the entity if the entity is a player
221 */
222 public void sendPacketToAllPlayersTrackingEntity(Entity par1Entity, Packet par2Packet)
223 {
224 EntityTrackerEntry var3 = (EntityTrackerEntry)this.trackedEntityIDs.lookup(par1Entity.entityId);
225
226 if (var3 != null)
227 {
228 var3.sendPacketToAllTrackingPlayers(par2Packet);
229 }
230 }
231
232 /**
233 * sends to the entity if the entity is a player
234 */
235 public void sendPacketToAllAssociatedPlayers(Entity par1Entity, Packet par2Packet)
236 {
237 EntityTrackerEntry var3 = (EntityTrackerEntry)this.trackedEntityIDs.lookup(par1Entity.entityId);
238
239 if (var3 != null)
240 {
241 var3.sendPacketToAllAssociatedPlayers(par2Packet);
242 }
243 }
244
245 public void removeAllTrackingPlayers(EntityPlayerMP par1EntityPlayerMP)
246 {
247 Iterator var2 = this.trackedEntities.iterator();
248
249 while (var2.hasNext())
250 {
251 EntityTrackerEntry var3 = (EntityTrackerEntry)var2.next();
252 var3.removePlayerFromTracker(par1EntityPlayerMP);
253 }
254 }
255 }