package net.CyanWool.api.entity; import java.util.Collection; import java.util.HashSet; import java.util.Set; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentMap; import net.CyanWool.api.Server; import net.CyanWool.api.world.Chunk; import net.CyanWool.api.world.Location; public class EntityManager { private ConcurrentMap<Integer, Entity> entities = new ConcurrentHashMap<Integer, Entity>(); private Set<Integer> usedIds = new HashSet<Integer>(); private int last = 0; private Server server; public EntityManager(Server server) { this.server = server; } public Collection<Entity> getAll() { return entities.values(); } public Entity getEntity(int id) { return entities.get(id); } public synchronized void register(final Entity entity) { if (getEntity(entity.getEntityID()) != null) { return; // IMPOSIBBLEEE } int startedAt = last; for (int id = last + 1; id != startedAt; ++id) { if (id == -1 || id == 0) continue; if (usedIds.add(id)) { entity.setEntityID(id); last = id; break; } } entities.put(entity.getEntityID(), entity); Location loc = entity.getLocation(); loc.getChunk().getEntities().add(entity); loc.getWorld().getEntities().add(entity); // REMOVED// // getServer().getScheduler().runTaskRepeat(new Runnable() { // @Override // public void run() { // //getServer().broadcastMessage("fuu"); // entity.onTick(); // } // }, 1, 1); } public synchronized void unregister(Entity entity) { entities.remove(entity.getEntityID()); usedIds.remove(entity.getEntityID()); // Iterator<Entity> it = // entity.getLocation().getChunk().getEntities().iterator(); // while (it.hasNext()) { // Entity ent = it.next(); // if (ent.getEntityID() == entity.getEntityID()) { // it.remove(); // } // } for (Entity ent : entity.getLocation().getChunk().getEntities()) { if (ent.getEntityID() == entity.getEntityID()) { entity.getLocation().getChunk().getEntities().remove(ent); break; } } // Iterator<Entity> it2 = entity.getWorld().getEntities().iterator(); // while (it2.hasNext()) { // Entity ent = it2.next(); // if (ent.getEntityID() == entity.getEntityID()) { // it2.remove(); // } // } for (Entity ent : entity.getWorld().getEntities()) { if (ent.getEntityID() == entity.getEntityID()) { entity.getWorld().getEntities().remove(ent); break; } } } public void moveToOtherLocation(Entity entity, Location loc) { Chunk prev = entity.getLocation().getChunk(); Chunk next = loc.getChunk(); if (!prev.equals(next)) { // Iterator<Entity> it = prev.getEntities().iterator(); // while (it.hasNext()) { // Entity ent = it.next(); // if (ent.getEntityID() == entity.getEntityID()) { // it.remove(); // } // } for (Entity ent : prev.getEntities()) { if (ent.getEntityID() == entity.getEntityID()) { prev.getEntities().remove(ent); break; } } next.getEntities().add(entity); } } public Server getServer() { return server; } }