import java.util.ArrayList; import java.util.ConcurrentModificationException; import java.util.HashSet; import java.util.Iterator; import java.util.Set; import java.util.concurrent.DelayQueue; import net.minecraft.server.MinecraftServer; public class OEntityTracker { // hMod: New fields to store the runnables in. private static final DelayQueue<DelayedTask> delayQueue = new DelayQueue<DelayedTask>(); private Set<OEntityTrackerEntry> a = new HashSet(); private OMCHashTable b = new OMCHashTable(); private MinecraftServer c; private int d; public OEntityTracker(MinecraftServer paramMinecraftServer) { c = paramMinecraftServer; d = paramMinecraftServer.f.a(); } public void a(OEntity paramOEntity) { OEntityPlayerMP localOEntityPlayerMP; if ((paramOEntity instanceof OEntityPlayerMP)) { a(paramOEntity, 512, 2); localOEntityPlayerMP = (OEntityPlayerMP) paramOEntity; for (OEntityTrackerEntry localOEntityTrackerEntry : a) if (localOEntityTrackerEntry.a != localOEntityPlayerMP) localOEntityTrackerEntry.b(localOEntityPlayerMP); } else if ((paramOEntity instanceof OEntityFish)) a(paramOEntity, 64, 5, true); else if ((paramOEntity instanceof OEntityArrow)) a(paramOEntity, 64, 5, true); else if ((paramOEntity instanceof OEntitySnowball)) a(paramOEntity, 64, 5, true); else if ((paramOEntity instanceof OEntityEgg)) a(paramOEntity, 64, 5, true); else if ((paramOEntity instanceof OEntityItem)) a(paramOEntity, 64, 20, true); else if ((paramOEntity instanceof OEntityMinecart)) a(paramOEntity, 160, 5, true); else if ((paramOEntity instanceof OEntityBoat)) a(paramOEntity, 160, 5, true); else if ((paramOEntity instanceof OEntitySquid)) a(paramOEntity, 160, 3, true); else if ((paramOEntity instanceof OIAnimals)) a(paramOEntity, 160, 3); else if ((paramOEntity instanceof OEntityTNTPrimed)) a(paramOEntity, 160, 10, true); else if ((paramOEntity instanceof OEntityFallingSand)) a(paramOEntity, 160, 20, true); else if ((paramOEntity instanceof OEntityPainting)) a(paramOEntity, 160, 2147483647, false); } public void a(OEntity paramOEntity, int paramInt1, int paramInt2) { a(paramOEntity, paramInt1, paramInt2, false); } public void a(OEntity paramOEntity, int paramInt1, int paramInt2, boolean paramBoolean) { if (paramInt1 > d) paramInt1 = d; if (b.b(paramOEntity.aB)) throw new IllegalStateException("Entity is already tracked!"); OEntityTrackerEntry localOEntityTrackerEntry = new OEntityTrackerEntry(paramOEntity, paramInt1, paramInt2, paramBoolean); a.add(localOEntityTrackerEntry); b.a(paramOEntity.aB, localOEntityTrackerEntry); localOEntityTrackerEntry.b(c.e.d); } public void b(OEntity paramOEntity) { Object localObject; if ((paramOEntity instanceof OEntityPlayerMP)) { localObject = (OEntityPlayerMP) paramOEntity; for (OEntityTrackerEntry localOEntityTrackerEntry : a) localOEntityTrackerEntry.a((OEntityPlayerMP) localObject); } localObject = b.d(paramOEntity.aB); if (localObject != null) { a.remove(localObject); ((OEntityTrackerEntry) localObject).a(); } } public void a() { try { Object localObject; ArrayList localArrayList = new ArrayList(); for (Iterator localIterator1 = a.iterator(); localIterator1.hasNext();) { localObject = (OEntityTrackerEntry) localIterator1.next(); ((OEntityTrackerEntry) localObject).a(c.e.d); if ((((OEntityTrackerEntry) localObject).m) && ((((OEntityTrackerEntry) localObject).a instanceof OEntityPlayerMP))) localArrayList.add(((OEntityTrackerEntry) localObject).a); } for (int i = 0; i < localArrayList.size(); i++) { localObject = localArrayList.get(i); for (OEntityTrackerEntry localOEntityTrackerEntry : a) if (localOEntityTrackerEntry.a != localObject) localOEntityTrackerEntry.b((OEntityPlayerMP) localObject); } } catch (ConcurrentModificationException e) { // people seem to get this exception often, lets just catch so it // doesn't crash the server. MinecraftServer.a.warning("hMod WARNING: ConcurrentModificationException in OEntityTracker:"); e.printStackTrace(); } // hMod: Execute runnables contained in eventQueue. for (DelayedTask task = delayQueue.poll(); task != null; task = delayQueue.poll()) // should we catch exceptions here? task.run(); } // hMod: Allow adding of tasks to the queue public static void add(Runnable task, long delayMillis) { // j.u.concurent.* classes are thread safe delayQueue.add(new DelayedTask(task, delayMillis)); } // hMod: deprecated. Use server.addToServerQueue(). @Deprecated public synchronized static void add(Runnable r) { add(r, 0L); } public void a(OEntity paramOEntity, OPacket paramOPacket) { OEntityTrackerEntry localOEntityTrackerEntry = (OEntityTrackerEntry) b.a(paramOEntity.aB); if (localOEntityTrackerEntry != null) localOEntityTrackerEntry.a(paramOPacket); } public void b(OEntity paramOEntity, OPacket paramOPacket) { OEntityTrackerEntry localOEntityTrackerEntry = (OEntityTrackerEntry) b.a(paramOEntity.aB); if (localOEntityTrackerEntry != null) localOEntityTrackerEntry.b(paramOPacket); } public void a(OEntityPlayerMP paramOEntityPlayerMP) { for (OEntityTrackerEntry localOEntityTrackerEntry : a) localOEntityTrackerEntry.c(paramOEntityPlayerMP); } }