Browse Source

Merge pull request #530 from Glitchfinder/master

Updating entity tracking and such.
Glitchfinder 12 years ago
parent
commit
fc38bbd179

+ 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;
     }

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

@@ -17,9 +17,9 @@ import org.bukkit.Bukkit;
 import org.bukkit.World;
 import org.bukkit.block.Block;
 import org.bukkit.entity.Entity;
+import org.bukkit.entity.FallingBlock;
 import org.bukkit.entity.LivingEntity;
 
-import com.gmail.nossr50.runnables.ChunkletUnloader;
 import com.gmail.nossr50.runnables.blockstoreconversion.BlockStoreConversionZDirectory;
 
 import org.getspout.spoutapi.chunkstore.mcMMOSimpleRegionFile;
@@ -30,7 +30,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>();
@@ -175,9 +174,8 @@ 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;
@@ -185,16 +183,17 @@ public class HashChunkManager implements ChunkManager {
             for (LivingEntity entity : world.getLivingEntities()) {
                 if (mobs.contains(entity.getUniqueId()))
                     addSpawnedMob(entity);
+            }
 
-                if (pets.contains(entity.getUniqueId()))
-                    addSpawnedPet(entity);
+            for(FallingBlock entity: world.getEntitiesByClass(FallingBlock.class)) {
+                if (mobs.contains(entity.getUniqueId()))
+                    addSpawnedMob(entity);
             }
 
             if(safeToRemoveMobs)
                 iteratingMobs = false;
 
             in.clearSpawnedMobs();
-            in.clearSpawnedPets();
         }
     }
 
@@ -218,20 +217,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;
@@ -259,19 +246,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) {
@@ -292,16 +266,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;
 
@@ -346,7 +310,7 @@ public class HashChunkManager implements ChunkManager {
         if (world == null)
             return;
 
-        ChunkletUnloader.addToList(cx, cz, world);
+        unloadChunk(cx, cz, world);
     }
 
     @Override
@@ -390,20 +354,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();
@@ -453,25 +403,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();
@@ -643,7 +577,7 @@ public class HashChunkManager implements ChunkManager {
     }
 
     public boolean isSpawnedPet(Entity entity) {
-        return spawnedPets.contains(entity);
+        return spawnedMobs.contains(entity);
     }
 
     public void addSpawnedMob(Entity entity) {
@@ -652,8 +586,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) {
@@ -662,8 +596,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() {
@@ -681,17 +615,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();
         }
     }