mirror of
https://github.com/mcMMO-Dev/mcMMO.git
synced 2024-11-26 23:26:45 +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:
parent
d09526e470
commit
ca2673f258
@ -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)) {
|
||||
if (mcMMO.placeStore.isTrue(block) && !mcMMO.placeStore.isSpawnedMob(entity)) {
|
||||
mcMMO.placeStore.setFalse(block);
|
||||
plugin.addToFallingBlockTracker(entityID, block);
|
||||
mcMMO.placeStore.addSpawnedMob(entity);
|
||||
}
|
||||
|
||||
if (plugin.fallingBlockIsTracked(entityID)) {
|
||||
else if (mcMMO.placeStore.isSpawnedMob(entity)) {
|
||||
mcMMO.placeStore.setTrue(block);
|
||||
plugin.removeFromFallingBlockTracker(entityID);
|
||||
}
|
||||
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();
|
||||
}
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user