From a65dc4966bada9554ebd8ea82e61b72298364e50 Mon Sep 17 00:00:00 2001 From: Jeremy Wood Date: Wed, 14 Nov 2012 15:11:55 -0500 Subject: [PATCH] Now removes projectiles shot by the entities removed by the purger. Should fix #958. --- .../utils/SimpleWorldPurger.java | 31 +++++++++++++++++-- 1 file changed, 28 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/onarandombox/MultiverseCore/utils/SimpleWorldPurger.java b/src/main/java/com/onarandombox/MultiverseCore/utils/SimpleWorldPurger.java index abfcd5df..37ea6338 100644 --- a/src/main/java/com/onarandombox/MultiverseCore/utils/SimpleWorldPurger.java +++ b/src/main/java/com/onarandombox/MultiverseCore/utils/SimpleWorldPurger.java @@ -10,7 +10,6 @@ package com.onarandombox.MultiverseCore.utils; import com.onarandombox.MultiverseCore.MultiverseCore; import com.onarandombox.MultiverseCore.api.MultiverseWorld; import com.onarandombox.MultiverseCore.api.WorldPurger; - import org.bukkit.World; import org.bukkit.command.CommandSender; import org.bukkit.entity.Animals; @@ -18,11 +17,14 @@ import org.bukkit.entity.Entity; import org.bukkit.entity.EntityType; import org.bukkit.entity.Ghast; import org.bukkit.entity.Golem; +import org.bukkit.entity.LivingEntity; import org.bukkit.entity.Monster; +import org.bukkit.entity.Projectile; import org.bukkit.entity.Slime; import org.bukkit.entity.Squid; import java.util.ArrayList; +import java.util.Iterator; import java.util.List; import java.util.logging.Level; @@ -86,18 +88,41 @@ public class SimpleWorldPurger implements WorldPurger { if (world == null) { return; } + int projectilesKilled = 0; int entitiesKilled = 0; boolean specifiedAll = thingsToKill.contains("ALL"); boolean specifiedAnimals = thingsToKill.contains("ANIMALS") || specifiedAll; boolean specifiedMonsters = thingsToKill.contains("MONSTERS") || specifiedAll; - for (Entity e : world.getEntities()) { + List worldEntities = world.getEntities(); + List livingEntities = new ArrayList(worldEntities.size()); + List projectiles = new ArrayList(worldEntities.size()); + for (final Entity e : worldEntities) { + if (e instanceof Projectile) { + final Projectile p = (Projectile) e; + if (p.getShooter() != null) { + projectiles.add((Projectile) e); + } + } else if (e instanceof LivingEntity) { + livingEntities.add((LivingEntity) e); + } + } + for (final LivingEntity e : livingEntities) { if (killDecision(e, thingsToKill, negateAnimals, negateMonsters, specifiedAnimals, specifiedMonsters)) { + final Iterator it = projectiles.iterator(); + while (it.hasNext()) { + final Projectile p = it.next(); + if (p.getShooter().equals(e)) { + p.remove(); + it.remove(); + projectilesKilled++; + } + } e.remove(); entitiesKilled++; } } if (sender != null) { - sender.sendMessage(entitiesKilled + " entities purged from the world '" + world.getName() + "'"); + sender.sendMessage(entitiesKilled + " entities purged from the world '" + world.getName() + "' along with " + projectilesKilled + " projectiles that belonged to them."); } }