mirror of
https://github.com/mcMMO-Dev/mcMMO.git
synced 2024-11-23 05:36:46 +01:00
Adding a cleanup task to remove invalid entities from the spawned mob storage.
This commit is contained in:
parent
2513b4ca23
commit
637e826c1b
@ -67,6 +67,7 @@ import com.gmail.nossr50.locale.LocaleLoader;
|
|||||||
import com.gmail.nossr50.party.PartyManager;
|
import com.gmail.nossr50.party.PartyManager;
|
||||||
import com.gmail.nossr50.runnables.BleedTimer;
|
import com.gmail.nossr50.runnables.BleedTimer;
|
||||||
import com.gmail.nossr50.runnables.ChunkletUnloader;
|
import com.gmail.nossr50.runnables.ChunkletUnloader;
|
||||||
|
import com.gmail.nossr50.runnables.MobStoreCleaner;
|
||||||
import com.gmail.nossr50.runnables.SaveTimer;
|
import com.gmail.nossr50.runnables.SaveTimer;
|
||||||
import com.gmail.nossr50.runnables.SkillMonitor;
|
import com.gmail.nossr50.runnables.SkillMonitor;
|
||||||
import com.gmail.nossr50.runnables.SpoutStart;
|
import com.gmail.nossr50.runnables.SpoutStart;
|
||||||
@ -230,6 +231,9 @@ public class mcMMO extends JavaPlugin {
|
|||||||
|
|
||||||
// Get our ChunkletManager
|
// Get our ChunkletManager
|
||||||
placeStore = ChunkManagerFactory.getChunkManager();
|
placeStore = ChunkManagerFactory.getChunkManager();
|
||||||
|
|
||||||
|
// Automatically starts and stores itself
|
||||||
|
MobStoreCleaner cleaner = new MobStoreCleaner();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
42
src/main/java/com/gmail/nossr50/runnables/MobStoreCleaner.java
Executable file
42
src/main/java/com/gmail/nossr50/runnables/MobStoreCleaner.java
Executable file
@ -0,0 +1,42 @@
|
|||||||
|
package com.gmail.nossr50.runnables;
|
||||||
|
|
||||||
|
import java.lang.Runnable;
|
||||||
|
|
||||||
|
import org.bukkit.Bukkit;
|
||||||
|
import org.bukkit.scheduler.BukkitScheduler;
|
||||||
|
|
||||||
|
import com.gmail.nossr50.mcMMO;
|
||||||
|
|
||||||
|
public class MobStoreCleaner implements Runnable
|
||||||
|
{
|
||||||
|
private int taskID;
|
||||||
|
|
||||||
|
public MobStoreCleaner()
|
||||||
|
{
|
||||||
|
taskID = -1;
|
||||||
|
start();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void start()
|
||||||
|
{
|
||||||
|
if (taskID >= 0)
|
||||||
|
return;
|
||||||
|
|
||||||
|
BukkitScheduler scheduler = Bukkit.getServer().getScheduler();
|
||||||
|
taskID = scheduler.scheduleSyncRepeatingTask(mcMMO.p, this, 12000, 12000);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void stop()
|
||||||
|
{
|
||||||
|
if(taskID < 0)
|
||||||
|
return;
|
||||||
|
|
||||||
|
Bukkit.getServer().getScheduler().cancelTask(taskID);
|
||||||
|
taskID = -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void run()
|
||||||
|
{
|
||||||
|
mcMMO.p.placeStore.cleanMobLists();
|
||||||
|
}
|
||||||
|
}
|
@ -173,4 +173,5 @@ public interface ChunkManager {
|
|||||||
public void addSpawnedPet(Entity entity);
|
public void addSpawnedPet(Entity entity);
|
||||||
public void removeSpawnedMob(Entity entity);
|
public void removeSpawnedMob(Entity entity);
|
||||||
public void removeSpawnedPet(Entity entity);
|
public void removeSpawnedPet(Entity entity);
|
||||||
|
public void cleanMobLists();
|
||||||
}
|
}
|
||||||
|
@ -32,9 +32,12 @@ public class HashChunkManager implements ChunkManager {
|
|||||||
private List<Entity> spawnedMobs = new ArrayList<Entity>();
|
private List<Entity> spawnedMobs = new ArrayList<Entity>();
|
||||||
private List<Entity> spawnedPets = new ArrayList<Entity>();
|
private List<Entity> spawnedPets = new ArrayList<Entity>();
|
||||||
private List<Entity> mobsToRemove = new ArrayList<Entity>();
|
private List<Entity> mobsToRemove = new ArrayList<Entity>();
|
||||||
|
private List<Entity> tempSpawnedMobs = new ArrayList<Entity>();
|
||||||
|
private List<Entity> tempSpawnedPets = new ArrayList<Entity>();
|
||||||
private List<String> savedChunks = new ArrayList<String>();
|
private List<String> savedChunks = new ArrayList<String>();
|
||||||
private boolean safeToRemoveMobs = true;
|
private boolean safeToRemoveMobs = true;
|
||||||
private boolean savingWorld = false;
|
private boolean savingWorld = false;
|
||||||
|
private boolean iteratingMobs = false;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public synchronized void closeAll() {
|
public synchronized void closeAll() {
|
||||||
@ -174,6 +177,8 @@ public class HashChunkManager implements ChunkManager {
|
|||||||
if (mobs.isEmpty() && pets.isEmpty())
|
if (mobs.isEmpty() && pets.isEmpty())
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
iteratingMobs = true;
|
||||||
|
|
||||||
for (LivingEntity entity : world.getLivingEntities()) {
|
for (LivingEntity entity : world.getLivingEntities()) {
|
||||||
if (mobs.contains(entity.getUniqueId()))
|
if (mobs.contains(entity.getUniqueId()))
|
||||||
addSpawnedMob(entity);
|
addSpawnedMob(entity);
|
||||||
@ -182,6 +187,9 @@ public class HashChunkManager implements ChunkManager {
|
|||||||
addSpawnedPet(entity);
|
addSpawnedPet(entity);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if(safeToRemoveMobs)
|
||||||
|
iteratingMobs = false;
|
||||||
|
|
||||||
in.clearSpawnedMobs();
|
in.clearSpawnedMobs();
|
||||||
in.clearSpawnedPets();
|
in.clearSpawnedPets();
|
||||||
}
|
}
|
||||||
@ -194,6 +202,8 @@ public class HashChunkManager implements ChunkManager {
|
|||||||
if (store.containsKey(world.getName() + "," + cx + "," + cz)) {
|
if (store.containsKey(world.getName() + "," + cx + "," + cz)) {
|
||||||
store.remove(world.getName() + "," + cx + "," + cz);
|
store.remove(world.getName() + "," + cx + "," + cz);
|
||||||
|
|
||||||
|
iteratingMobs = true;
|
||||||
|
|
||||||
for (Entity entity : spawnedMobs) {
|
for (Entity entity : spawnedMobs) {
|
||||||
if (!isEntityInChunk(entity, cx, cz, world))
|
if (!isEntityInChunk(entity, cx, cz, world))
|
||||||
continue;
|
continue;
|
||||||
@ -212,6 +222,7 @@ public class HashChunkManager implements ChunkManager {
|
|||||||
spawnedMobs.remove(mobsToRemove);
|
spawnedMobs.remove(mobsToRemove);
|
||||||
spawnedPets.remove(mobsToRemove);
|
spawnedPets.remove(mobsToRemove);
|
||||||
mobsToRemove.clear();
|
mobsToRemove.clear();
|
||||||
|
iteratingMobs = false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -226,7 +237,7 @@ public class HashChunkManager implements ChunkManager {
|
|||||||
|
|
||||||
boolean unloaded = false;
|
boolean unloaded = false;
|
||||||
if (!store.containsKey(world.getName() + "," + cx + "," + cz)) {
|
if (!store.containsKey(world.getName() + "," + cx + "," + cz)) {
|
||||||
List<Entity> tempSpawnedMobs = new ArrayList<Entity>(spawnedMobs);
|
tempSpawnedMobs = new ArrayList<Entity>(spawnedMobs);
|
||||||
for (Entity entity : tempSpawnedMobs) {
|
for (Entity entity : tempSpawnedMobs) {
|
||||||
if (!isEntityInChunk(entity, cx, cz, world))
|
if (!isEntityInChunk(entity, cx, cz, world))
|
||||||
continue;
|
continue;
|
||||||
@ -237,7 +248,7 @@ public class HashChunkManager implements ChunkManager {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (!unloaded) {
|
if (!unloaded) {
|
||||||
List<Entity> tempSpawnedPets = new ArrayList<Entity>(spawnedPets);
|
tempSpawnedPets = new ArrayList<Entity>(spawnedPets);
|
||||||
for (Entity entity : tempSpawnedPets) {
|
for (Entity entity : tempSpawnedPets) {
|
||||||
if (!isEntityInChunk(entity, cx, cz, world))
|
if (!isEntityInChunk(entity, cx, cz, world))
|
||||||
continue;
|
continue;
|
||||||
@ -257,7 +268,7 @@ public class HashChunkManager implements ChunkManager {
|
|||||||
if (store.containsKey(world.getName() + "," + cx + "," + cz)) {
|
if (store.containsKey(world.getName() + "," + cx + "," + cz)) {
|
||||||
ChunkStore out = store.get(world.getName() + "," + cx + "," + cz);
|
ChunkStore out = store.get(world.getName() + "," + cx + "," + cz);
|
||||||
|
|
||||||
List<Entity> tempSpawnedMobs = new ArrayList<Entity>(spawnedMobs);
|
tempSpawnedMobs = new ArrayList<Entity>(spawnedMobs);
|
||||||
for (Entity entity : tempSpawnedMobs) {
|
for (Entity entity : tempSpawnedMobs) {
|
||||||
if (!isEntityInChunk(entity, cx, cz, world))
|
if (!isEntityInChunk(entity, cx, cz, world))
|
||||||
continue;
|
continue;
|
||||||
@ -265,7 +276,7 @@ public class HashChunkManager implements ChunkManager {
|
|||||||
out.addSpawnedMob(entity.getUniqueId());
|
out.addSpawnedMob(entity.getUniqueId());
|
||||||
}
|
}
|
||||||
|
|
||||||
List<Entity> tempSpawnedPets = new ArrayList<Entity>(spawnedPets);
|
tempSpawnedPets = new ArrayList<Entity>(spawnedPets);
|
||||||
for (Entity entity : tempSpawnedPets) {
|
for (Entity entity : tempSpawnedPets) {
|
||||||
if (!isEntityInChunk(entity, cx, cz, world))
|
if (!isEntityInChunk(entity, cx, cz, world))
|
||||||
continue;
|
continue;
|
||||||
@ -345,7 +356,7 @@ public class HashChunkManager implements ChunkManager {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
List<Entity> tempSpawnedMobs = new ArrayList<Entity>(spawnedMobs);
|
tempSpawnedMobs = new ArrayList<Entity>(spawnedMobs);
|
||||||
for (Entity entity : tempSpawnedMobs) {
|
for (Entity entity : tempSpawnedMobs) {
|
||||||
World entityWorld = entity.getWorld();
|
World entityWorld = entity.getWorld();
|
||||||
|
|
||||||
@ -358,7 +369,7 @@ public class HashChunkManager implements ChunkManager {
|
|||||||
saveChunk(cx, cz, world);
|
saveChunk(cx, cz, world);
|
||||||
}
|
}
|
||||||
|
|
||||||
List<Entity> tempSpawnedPets = new ArrayList<Entity>(spawnedPets);
|
tempSpawnedPets = new ArrayList<Entity>(spawnedPets);
|
||||||
for (Entity entity : tempSpawnedPets) {
|
for (Entity entity : tempSpawnedPets) {
|
||||||
World entityWorld = entity.getWorld();
|
World entityWorld = entity.getWorld();
|
||||||
|
|
||||||
@ -404,7 +415,7 @@ public class HashChunkManager implements ChunkManager {
|
|||||||
|
|
||||||
safeToRemoveMobs = false;
|
safeToRemoveMobs = false;
|
||||||
|
|
||||||
List<Entity> tempSpawnedMobs = new ArrayList<Entity>(spawnedMobs);
|
tempSpawnedMobs = new ArrayList<Entity>(spawnedMobs);
|
||||||
for (Entity entity : tempSpawnedMobs) {
|
for (Entity entity : tempSpawnedMobs) {
|
||||||
World entityWorld = entity.getWorld();
|
World entityWorld = entity.getWorld();
|
||||||
|
|
||||||
@ -417,7 +428,7 @@ public class HashChunkManager implements ChunkManager {
|
|||||||
unloadChunk(cx, cz, world);
|
unloadChunk(cx, cz, world);
|
||||||
}
|
}
|
||||||
|
|
||||||
List<Entity> tempSpawnedPets = new ArrayList<Entity>(spawnedPets);
|
tempSpawnedPets = new ArrayList<Entity>(spawnedPets);
|
||||||
for (Entity entity : tempSpawnedPets) {
|
for (Entity entity : tempSpawnedPets) {
|
||||||
World entityWorld = entity.getWorld();
|
World entityWorld = entity.getWorld();
|
||||||
|
|
||||||
@ -625,4 +636,33 @@ public class HashChunkManager implements ChunkManager {
|
|||||||
if (isSpawnedPet(entity))
|
if (isSpawnedPet(entity))
|
||||||
spawnedPets.remove(entity);
|
spawnedPets.remove(entity);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public synchronized void cleanMobLists() {
|
||||||
|
if (!safeToRemoveMobs || iteratingMobs)
|
||||||
|
return;
|
||||||
|
|
||||||
|
mobsToRemove.clear();
|
||||||
|
|
||||||
|
tempSpawnedMobs = new ArrayList(spawnedMobs);
|
||||||
|
for (Entity entity : tempSpawnedMobs) {
|
||||||
|
if (entity.isDead())
|
||||||
|
mobsToRemove.add(entity);
|
||||||
|
|
||||||
|
if (!entity.isValid())
|
||||||
|
mobsToRemove.add(entity);
|
||||||
|
}
|
||||||
|
|
||||||
|
tempSpawnedPets = new ArrayList(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();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -94,4 +94,5 @@ public class NullChunkManager implements ChunkManager {
|
|||||||
public void addSpawnedPet(Entity entity) {}
|
public void addSpawnedPet(Entity entity) {}
|
||||||
public void removeSpawnedMob(Entity entity) {}
|
public void removeSpawnedMob(Entity entity) {}
|
||||||
public void removeSpawnedPet(Entity entity) {}
|
public void removeSpawnedPet(Entity entity) {}
|
||||||
|
public synchronized void cleanMobLists() {}
|
||||||
}
|
}
|
Loading…
Reference in New Issue
Block a user