Răsfoiți Sursa

Condensing entity tracking into a single set of storage, to reduce CPU use. Also handily causes invalid falling blocks to be removed. (Fell out of the world, etc)

Glitchfinder 12 ani în urmă
părinte
comite
ca2673f258

+ 7 - 12
src/main/java/com/gmail/nossr50/listeners/EntityListener.java

@@ -58,20 +58,15 @@ public class EntityListener implements Listener {
         Entity entity = event.getEntity();
 
         if (entity instanceof FallingBlock) {
-            int entityID = entity.getEntityId();
             Block block = event.getBlock();
-            Material type = block.getType();
 
-            if (type == Material.SAND || type == Material.GRAVEL) {
-                if (mcMMO.placeStore.isTrue(block)) {
-                    mcMMO.placeStore.setFalse(block);
-                    plugin.addToFallingBlockTracker(entityID, block);
-                }
-
-                if (plugin.fallingBlockIsTracked(entityID)) {
-                    mcMMO.placeStore.setTrue(block);
-                    plugin.removeFromFallingBlockTracker(entityID);
-                }
+            if (mcMMO.placeStore.isTrue(block) && !mcMMO.placeStore.isSpawnedMob(entity)) {
+                mcMMO.placeStore.setFalse(block);
+                mcMMO.placeStore.addSpawnedMob(entity);
+            }
+	    else if (mcMMO.placeStore.isSpawnedMob(entity)) {
+                mcMMO.placeStore.setTrue(block);
+                mcMMO.placeStore.removeSpawnedMob(entity);
             }
         }
     }

+ 0 - 39
src/main/java/com/gmail/nossr50/mcMMO.java

@@ -97,7 +97,6 @@ public class mcMMO extends JavaPlugin {
 
     private HashMap<String, String> aliasMap = new HashMap<String, String>(); //Alias - Command
     private HashMap<Integer, String> tntTracker = new HashMap<Integer, String>();
-    private HashMap<Integer, Block> fallingBlockTracker = new HashMap<Integer, Block>();
 
     private static Database database;
     public static mcMMO p;
@@ -521,44 +520,6 @@ public class mcMMO extends JavaPlugin {
         tntTracker.remove(tntID);
     }
 
-    /**
-     * Add an ID value to the FallingBlock tracker.
-     *
-     * @param fallingBlockID The EntityID of the FallingBlock
-     */
-    public void addToFallingBlockTracker(int fallingBlockID, Block sourceBlock) {
-        fallingBlockTracker.put(fallingBlockID, sourceBlock);
-    }
-
-    /**
-     * Check to see if a given FallingBlock Entity is tracked.
-     *
-     * @param tntID The EntityID of the FallingBlock
-     * @return true if the FallingBlock is being tracked, false otherwise
-     */
-    public boolean fallingBlockIsTracked(int fallingBlockID) {
-        return fallingBlockTracker.containsKey(fallingBlockID);
-    }
-
-    /**
-     * Get the initial location of the FallingBlock.
-     *
-     * @param fallingBlockID The EntityID of the FallingBlock
-     * @return the Player who detonated it
-     */
-    public Block getSourceBlock(int fallingBlockID) {
-        return fallingBlockTracker.get(fallingBlockID);
-    }
-
-    /**
-     * Remove FallingBlock from the tracker after it lands.
-     *
-     * @param fallingBlockID The EntityID of the FallingBlock
-     */
-    public void removeFromFallingBlockTracker(int fallingBlockID) {
-        fallingBlockTracker.remove(fallingBlockID);
-    }
-
     public static String getMainDirectory() {
         return mainDirectory;
     }

+ 7 - 88
src/main/java/com/gmail/nossr50/util/blockmeta/chunkmeta/HashChunkManager.java

@@ -29,7 +29,6 @@ public class HashChunkManager implements ChunkManager {
     public ArrayList<BlockStoreConversionZDirectory> converters = new ArrayList<BlockStoreConversionZDirectory>();
     private HashMap<UUID, Boolean> oldData = new HashMap<UUID, Boolean>();
     private List<Entity> spawnedMobs = new ArrayList<Entity>();
-    private List<Entity> spawnedPets = new ArrayList<Entity>();
     private List<Entity> mobsToRemove = new ArrayList<Entity>();
     private List<String> savedChunks = new ArrayList<String>();
     private List<Entity> checkedMobs = new ArrayList<Entity>();
@@ -174,26 +173,21 @@ public class HashChunkManager implements ChunkManager {
             store.put(world.getName() + "," + cx + "," + cz, in);
 
             List<UUID> mobs = in.getSpawnedMobs();
-            List<UUID> pets = in.getSpawnedPets();
 
-            if (mobs.isEmpty() && pets.isEmpty())
+            if (mobs.isEmpty())
                 return;
 
             iteratingMobs = true;
 
-            for (LivingEntity entity : world.getLivingEntities()) {
+            for (Entity entity : world.getEntities()) {
                 if (mobs.contains(entity.getUniqueId()))
                     addSpawnedMob(entity);
-
-                if (pets.contains(entity.getUniqueId()))
-                    addSpawnedPet(entity);
             }
 
             if(safeToRemoveMobs)
                 iteratingMobs = false;
 
             in.clearSpawnedMobs();
-            in.clearSpawnedPets();
         }
     }
 
@@ -217,20 +211,8 @@ public class HashChunkManager implements ChunkManager {
                 removalCheckedMobs.add(entity);
             }
 
-            List<Entity> tempSpawnedPets = new ArrayList<Entity>(spawnedPets);
-            tempSpawnedPets.remove(removalCheckedMobs);
-            tempSpawnedPets.remove(checkedMobs);
-            for (Entity entity : tempSpawnedPets) {
-                if (!isEntityInChunk(entity, cx, cz, world))
-                    continue;
-
-                mobsToRemove.add(entity);
-                removalCheckedMobs.add(entity);
-            }
-
             if (safeToRemoveMobs) {
                 spawnedMobs.remove(mobsToRemove);
-                spawnedPets.remove(mobsToRemove);
                 mobsToRemove.clear();
                 removalCheckedMobs.clear();
                 iteratingMobs = false;
@@ -258,19 +240,6 @@ public class HashChunkManager implements ChunkManager {
                 unloaded = true;
                 break;
             }
-
-            if (!unloaded) {
-                List<Entity> tempSpawnedPets = new ArrayList<Entity>(spawnedPets);
-                tempSpawnedPets.remove(checkedMobs);
-                for (Entity entity : tempSpawnedPets) {
-                    if (!isEntityInChunk(entity, cx, cz, world))
-                        continue;
-
-                    loadChunk(cx, cz, world);
-                    unloaded = true;
-                    break;
-                }
-            }
         }
 
         if (!store.containsKey(world.getName() + "," + cx + "," + cz) && unloaded) {
@@ -291,16 +260,6 @@ public class HashChunkManager implements ChunkManager {
                 checkedMobs.add(entity);
             }
 
-            List<Entity> tempSpawnedPets = new ArrayList<Entity>(spawnedPets);
-            tempSpawnedPets.remove(checkedMobs);
-            for (Entity entity : tempSpawnedPets) {
-                if (!isEntityInChunk(entity, cx, cz, world))
-                    continue;
-
-                out.addSpawnedPet(entity.getUniqueId());
-                checkedMobs.add(entity);
-            }
-
             if (!out.isDirty())
                 return;
 
@@ -389,20 +348,6 @@ public class HashChunkManager implements ChunkManager {
             saveChunk(cx, cz, world);
         }
 
-        List<Entity> tempSpawnedPets = new ArrayList<Entity>(spawnedPets);
-        tempSpawnedPets.remove(checkedMobs);
-        for (Entity entity : tempSpawnedPets) {
-            World entityWorld = entity.getWorld();
-
-            if (world != entityWorld)
-                continue;
-
-            int cx = entity.getLocation().getChunk().getX();
-            int cz = entity.getLocation().getChunk().getZ();
-
-            saveChunk(cx, cz, world);
-        }
-
         savingWorld = false;
         savedChunks.clear();
         checkedMobs.clear();
@@ -452,25 +397,9 @@ public class HashChunkManager implements ChunkManager {
             unloadChunk(cx, cz, world);
         }
 
-        List<Entity> tempSpawnedPets = new ArrayList<Entity>(spawnedPets);
-	tempSpawnedPets.remove(checkedMobs);
-        tempSpawnedMobs.remove(removalCheckedMobs);
-        for (Entity entity : tempSpawnedPets) {
-            World entityWorld = entity.getWorld();
-
-            if (world != entityWorld)
-                continue;
-
-            int cx = entity.getLocation().getChunk().getX();
-            int cz = entity.getLocation().getChunk().getZ();
-
-            unloadChunk(cx, cz, world);
-        }
-
         safeToRemoveMobs = true;
 
         spawnedMobs.remove(mobsToRemove);
-        spawnedPets.remove(mobsToRemove);
         mobsToRemove.clear();
         checkedMobs.clear();
         removalCheckedMobs.clear();
@@ -642,7 +571,7 @@ public class HashChunkManager implements ChunkManager {
     }
 
     public boolean isSpawnedPet(Entity entity) {
-        return spawnedPets.contains(entity);
+        return spawnedMobs.contains(entity);
     }
 
     public void addSpawnedMob(Entity entity) {
@@ -651,8 +580,8 @@ public class HashChunkManager implements ChunkManager {
     }
 
     public void addSpawnedPet(Entity entity) {
-        if (!isSpawnedPet(entity))
-            spawnedPets.add(entity);
+        if (!isSpawnedMob(entity))
+            spawnedMobs.add(entity);
     }
 
     public void removeSpawnedMob(Entity entity) {
@@ -661,8 +590,8 @@ public class HashChunkManager implements ChunkManager {
     }
 
     public void removeSpawnedPet(Entity entity) {
-        if (isSpawnedPet(entity))
-            spawnedPets.remove(entity);
+        if (isSpawnedMob(entity))
+            spawnedMobs.remove(entity);
     }
 
     public synchronized void cleanMobLists() {
@@ -680,17 +609,7 @@ public class HashChunkManager implements ChunkManager {
                 mobsToRemove.add(entity);
         }
 
-        List<Entity> tempSpawnedPets = new ArrayList<Entity>(spawnedPets);
-        for (Entity entity : tempSpawnedPets) {
-            if (entity.isDead())
-                mobsToRemove.add(entity);
-
-            if (!entity.isValid())
-                mobsToRemove.add(entity);
-        }
-
         spawnedMobs.remove(mobsToRemove);
-        spawnedPets.remove(mobsToRemove);
         mobsToRemove.clear();
     }
 }

+ 14 - 12
src/main/java/com/gmail/nossr50/util/blockmeta/chunkmeta/PrimitiveChunkStore.java

@@ -17,13 +17,12 @@ public class PrimitiveChunkStore implements ChunkStore {
     transient private boolean dirty = false;
     /** X, Z, Y */
     public boolean[][][] store;
-    private static final int CURRENT_VERSION = 6;
+    private static final int CURRENT_VERSION = 7;
     private static final int MAGIC_NUMBER = 0xEA5EDEBB;
     private int cx;
     private int cz;
     private UUID worldUid;
     private List<UUID> spawnedMobs = new ArrayList<UUID>();
-    private List<UUID> spawnedPets = new ArrayList<UUID>();
     transient private int worldHeight;
     
     transient private int xBitShifts;
@@ -110,7 +109,7 @@ public class PrimitiveChunkStore implements ChunkStore {
     }
 
     public boolean isSpawnedPet(UUID id) {
-        return spawnedPets.contains(id);
+        return spawnedMobs.contains(id);
     }
 
     public void addSpawnedMob(UUID id) {
@@ -122,7 +121,7 @@ public class PrimitiveChunkStore implements ChunkStore {
 
     public void addSpawnedPet(UUID id) {
         if (!isSpawnedPet(id)) {
-            spawnedPets.add(id);
+            spawnedMobs.add(id);
             dirty = true;
         }
     }
@@ -136,7 +135,7 @@ public class PrimitiveChunkStore implements ChunkStore {
 
     public void removeSpawnedPet(UUID id) {
         if (isSpawnedPet(id)) {
-            spawnedPets.remove(id);
+            spawnedMobs.remove(id);
             dirty = true;
         }
     }
@@ -149,8 +148,8 @@ public class PrimitiveChunkStore implements ChunkStore {
     }
 
     public void clearSpawnedPets() {
-        if (!spawnedPets.isEmpty()) {
-            spawnedPets.clear();
+        if (!spawnedMobs.isEmpty()) {
+            spawnedMobs.clear();
             dirty = true;
         }
     }
@@ -160,7 +159,7 @@ public class PrimitiveChunkStore implements ChunkStore {
     }
 
     public List<UUID> getSpawnedPets() {
-        return spawnedPets;
+        return spawnedMobs;
     }
 
     private void writeObject(ObjectOutputStream out) throws IOException {
@@ -174,7 +173,6 @@ public class PrimitiveChunkStore implements ChunkStore {
         out.writeObject(store);
 
         out.writeObject(spawnedMobs);
-        out.writeObject(spawnedPets);
 
         dirty = false;
     }
@@ -209,15 +207,19 @@ public class PrimitiveChunkStore implements ChunkStore {
                 fixArray();
             if (fileVersionNumber < 6) {
                 spawnedMobs = new ArrayList<UUID>();
-                spawnedPets = new ArrayList<UUID>();
             }
             dirty = true;
         }
 
-        if (fileVersionNumber >= 6) {
+        if (fileVersionNumber == 6) {
             //What do we want to do about this? These casts are unchecked.
             spawnedMobs = (ArrayList<UUID>) in.readObject();
-            spawnedPets = (ArrayList<UUID>) in.readObject();
+            List<UUID> spawnedPets = (ArrayList<UUID>) in.readObject();
+            spawnedMobs.addAll(spawnedPets);
+        }
+
+        if(fileVersionNumber >= 7) {
+            spawnedMobs = (ArrayList<UUID>) in.readObject();
         }
     }