(Possibly) fix invisible bosses.

Unsurprisingly, MobArena's monster handling is sub-optimal, possibly
due to premature optimization. Before, when e.g. a Creeper boss would
explode, it would not be removed from the bosses collection, and thus
the ability thread would continue on running.

This patch adds a tiny bit of overhead w.r.t. removing dead monsters,
but it fixes the issue with Creeper bosses, and with a bit of luck,
mcMMO will not cause issues anymore (yet to be tested).
This commit is contained in:
Andreas Troelsen
2013-02-16 14:51:02 +01:00
parent cc1187b7f6
commit 7e1b2c2b9f
4 changed files with 19 additions and 6 deletions
@@ -314,7 +314,8 @@ public class ArenaListener
if (!monsters.getMonsters().contains(event.getEntity()) && !arena.getRegion().contains(event.getLocation(), 10))
return;
monsters.removeMonster(event.getEntity());
// The generic remove method removes bosses as well
monsters.remove(event.getEntity());
// Cancel if the arena isn't running
if (!arena.isRunning()) {
@@ -235,7 +235,7 @@ public class MASpawnThread implements Runnable
}
if (e.isDead() || !region.contains(e.getLocation())) {
monsterManager.removeMonster(e);
monsterManager.remove(e);
e.remove();
}
}
@@ -248,10 +248,6 @@ public class MASpawnThread implements Runnable
continue;
}
// TODO remove debug message
Location l = p.getLocation();
System.out.println("Player: " + p.getName() + " found at location:" + l.getX() + ", " + l.getY() + ", " + l.getZ());
Messenger.tellPlayer(p, "Leaving so soon?");
p.getInventory().clear();
arena.playerLeave(p);
@@ -59,6 +59,19 @@ public class MonsterManager
}
}
public void remove(Entity e) {
if (monsters.remove(e)) {
sheep.remove(e);
golems.remove(e);
pets.remove(e);
suppliers.remove(e);
MABoss boss = bosses.remove(e);
if (boss != null) {
boss.setDead(true);
}
}
}
public Set<LivingEntity> getMonsters() {
return monsters;
}
@@ -38,6 +38,9 @@ public class BossAbilityThread implements Runnable
if (bosses.isEmpty()) {
return;
}
for (MABoss boss : bosses) {
if (boss.isDead()) return;
}
// Get the next ability in the list.
Ability ability = abilities.get(counter++ % abilities.size());