mirror of
				https://github.com/mcMMO-Dev/mcMMO.git
				synced 2025-11-04 02:53:43 +01:00 
			
		
		
		
	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)
This commit is contained in:
		@@ -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);
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 
 | 
			
		||||
@@ -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;
 | 
			
		||||
    }
 | 
			
		||||
 
 | 
			
		||||
@@ -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();
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -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();
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user