From ce3e203bc1f290e24a29da81e2844b1b2c6474dc Mon Sep 17 00:00:00 2001 From: Eric Stokes Date: Tue, 28 Jun 2011 20:02:40 -0600 Subject: [PATCH] Think I've finished the Purge Command. It's untested. o.O --- .../MultiverseCore/MVEntityListener.java | 2 - .../MultiverseCore/MultiverseCore.java | 83 ++-------- .../command/commands/PurgeCommand.java | 31 +++- src/com/onarandombox/utils/PurgeWorlds.java | 155 +++++++++--------- 4 files changed, 123 insertions(+), 148 deletions(-) diff --git a/src/com/onarandombox/MultiverseCore/MVEntityListener.java b/src/com/onarandombox/MultiverseCore/MVEntityListener.java index 3bd6b665..f9e22a8f 100644 --- a/src/com/onarandombox/MultiverseCore/MVEntityListener.java +++ b/src/com/onarandombox/MultiverseCore/MVEntityListener.java @@ -54,8 +54,6 @@ public class MVEntityListener extends EntityListener { CreatureType creature = event.getCreatureType(); - // event.getEntity().getWorld().spawnCreature(arg0, arg1); - MVWorld mvworld = this.plugin.getMVWorld(world.getName()); // TODO: Look of this and see if there's a cleaner/better method of doing so... diff --git a/src/com/onarandombox/MultiverseCore/MultiverseCore.java b/src/com/onarandombox/MultiverseCore/MultiverseCore.java index ac827913..47a09b43 100644 --- a/src/com/onarandombox/MultiverseCore/MultiverseCore.java +++ b/src/com/onarandombox/MultiverseCore/MultiverseCore.java @@ -49,6 +49,7 @@ import com.onarandombox.MultiverseCore.command.QueuedCommand; import com.onarandombox.MultiverseCore.command.commands.*; import com.onarandombox.MultiverseCore.configuration.DefaultConfiguration; import com.onarandombox.utils.DebugLog; +import com.onarandombox.utils.PurgeWorlds; import com.onarandombox.utils.UpdateChecker; public class MultiverseCore extends JavaPlugin { @@ -93,7 +94,7 @@ public class MultiverseCore extends JavaPlugin { // HashMap to contain information relating to the Players. public HashMap playerSessions = new HashMap(); - + private PurgeWorlds worldPurger; @Override public void onLoad() { @@ -115,8 +116,10 @@ public class MultiverseCore extends JavaPlugin { this.registerEvents(); // Setup Permissions, we'll do an initial check for the Permissions plugin then fall back on isOP(). this.setupPermissions(); - // Setup thte command manager + // Setup the command manager this.commandManager = new CommandManager(this); + // Setup the world purger + this.worldPurger = new PurgeWorlds(this); // Setup iConomy. this.setupEconomy(); // Call the Function to assign all the Commands to their Class. @@ -129,9 +132,6 @@ public class MultiverseCore extends JavaPlugin { // When called with null, it tries to load ALL // this function will be called every time a plugin registers a new envtype with MV this.loadWorlds(true); - - // Purge Worlds of old Monsters/Animals which don't adhere to the setup. - this.purgeWorlds(); } /** @@ -217,69 +217,6 @@ public class MultiverseCore extends JavaPlugin { this.debug = this.configMV.getBoolean("debug", false); } - /** - * Purge the Worlds of Entities that are disallowed. - */ - public void purgeWorlds() { - if (this.worlds.size() <= 0) - return; - - // TODO: Need a better method than this... too messy and atm it's not complete. - - Set worldKeys = this.worlds.keySet(); - for (String key : worldKeys) { - World world = getServer().getWorld(key); - if (world == null) - continue; - MVWorld mvworld = this.worlds.get(key); - List monsters = mvworld.getMonsterList(); - List animals = mvworld.getAnimalList(); - System.out.print("Monster Size:" + monsters.size() + " - " + "Animal Size: " + animals.size()); - for (Entity e : world.getEntities()) { - String creatureName = e.toString().replaceAll("Craft", "").toLowerCase(); - // Check against Monsters - if (e instanceof Slime || e instanceof Monster) { - // If Monsters are disabled and there's no exceptions we can simply remove them. - if (mvworld.allowMonsterSpawning() == false && !(monsters.size() > 0)) { - e.remove(); - continue; - } - // If monsters are enabled and there's no exceptions we can continue to the next set. - if (mvworld.allowMonsterSpawning() == true && !(monsters.size() > 0)) { - continue; - } - - if (monsters.contains(creatureName.toUpperCase())) { - if (mvworld.allowMonsterSpawning()) { - System.out.print(creatureName + " - Removed"); - e.remove(); - continue; - } - } - } - // Check against Animals - if (e instanceof Squid || e instanceof Animals) { - // If Animals are disabled and there's no exceptions we can simply remove them. - if (mvworld.allowAnimalSpawning() == false && !(animals.size() > 0)) { - e.remove(); - continue; - } - // If Animals are enabled and there's no exceptions we can continue to the next set. - if (mvworld.allowAnimalSpawning() == true && !(animals.size() > 0)) { - continue; - } - if (animals.contains(creatureName.toUpperCase())) { - if (mvworld.allowAnimalSpawning()) { - System.out.print(creatureName + " - Removed"); - e.remove(); - continue; - } - } - } - } - } - } - /** * Register Multiverse-Core commands to DThielke's Command Manager. */ @@ -430,7 +367,9 @@ public class MultiverseCore extends JavaPlugin { log(Level.INFO, "Loading World & Settings - '" + name + "' - " + env); } } - this.worlds.put(name, new MVWorld(world, this.configWorlds, this, seed, generator)); + MVWorld mvworld = new MVWorld(world, this.configWorlds, this, seed, generator); + this.worldPurger.purgeWorld(null, mvworld); + this.worlds.put(name, mvworld); return true; } @@ -569,6 +508,10 @@ public class MultiverseCore extends JavaPlugin { return this.ph; } + public PurgeWorlds getWorldPurger() { + return this.worldPurger; + } + /** * onCommand */ @@ -662,8 +605,6 @@ public class MultiverseCore extends JavaPlugin { // TODO: Find out where to put these next 3 methods! I just stuck them here for now --FF - - public Collection getMVWorlds() { return this.worlds.values(); } diff --git a/src/com/onarandombox/MultiverseCore/command/commands/PurgeCommand.java b/src/com/onarandombox/MultiverseCore/command/commands/PurgeCommand.java index 3f25c0de..0e63a42b 100644 --- a/src/com/onarandombox/MultiverseCore/command/commands/PurgeCommand.java +++ b/src/com/onarandombox/MultiverseCore/command/commands/PurgeCommand.java @@ -1,12 +1,15 @@ package com.onarandombox.MultiverseCore.command.commands; import java.util.ArrayList; -import java.util.List; +import java.util.Collections; import org.bukkit.ChatColor; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; +import sun.tools.tree.ArrayAccessExpression; + +import com.onarandombox.MultiverseCore.MVWorld; import com.onarandombox.MultiverseCore.MultiverseCore; import com.onarandombox.MultiverseCore.command.BaseCommand; import com.onarandombox.utils.PurgeWorlds; @@ -36,8 +39,32 @@ public class PurgeCommand extends BaseCommand { sender.sendMessage(this.usage); return; } + String worldName = null; + String deathName = null; + if(args.length == 1) { + worldName = p.getWorld().getName(); + deathName = args[0]; + } else { + worldName = args[0]; + deathName = args[1]; + } + + if(!this.plugin.isMVWorld(worldName)) { + sender.sendMessage("Multiverse doesn't know about " + worldName); + sender.sendMessage("... so It cannot be purged"); + return; + } + MVWorld world = this.plugin.getMVWorld(worldName); + System.out.println("Purged"); - this.plugin.purgeWorlds(); + PurgeWorlds purger = this.plugin.getWorldPurger(); + ArrayList thingsToKill = new ArrayList(); + if(deathName.equalsIgnoreCase("all") || deathName.equalsIgnoreCase("animals") || deathName.equalsIgnoreCase("monsters")) { + thingsToKill.add(deathName.toUpperCase()); + } else { + Collections.addAll(thingsToKill, deathName.split(",")); + } + purger.purgeWorld(sender, world, thingsToKill, false, false); return; } diff --git a/src/com/onarandombox/utils/PurgeWorlds.java b/src/com/onarandombox/utils/PurgeWorlds.java index ac06418f..8ec2d7da 100644 --- a/src/com/onarandombox/utils/PurgeWorlds.java +++ b/src/com/onarandombox/utils/PurgeWorlds.java @@ -1,26 +1,12 @@ package com.onarandombox.utils; +import java.util.ArrayList; import java.util.List; -import java.util.Set; import org.bukkit.World; import org.bukkit.command.CommandSender; -import org.bukkit.entity.Animals; -import org.bukkit.entity.Chicken; -import org.bukkit.entity.Cow; -import org.bukkit.entity.Creeper; -import org.bukkit.entity.Entity; -import org.bukkit.entity.Ghast; -import org.bukkit.entity.Giant; -import org.bukkit.entity.Monster; -import org.bukkit.entity.Pig; -import org.bukkit.entity.PigZombie; -import org.bukkit.entity.Sheep; -import org.bukkit.entity.Skeleton; -import org.bukkit.entity.Slime; -import org.bukkit.entity.Spider; -import org.bukkit.entity.Squid; -import org.bukkit.entity.Zombie; +import org.bukkit.entity.*; + import com.onarandombox.MultiverseCore.MVWorld; import com.onarandombox.MultiverseCore.MultiverseCore; @@ -33,78 +19,101 @@ public class PurgeWorlds { this.plugin = plugin; } - public void purge(World w, List creatures) { - purge(null, w, creatures); - } - - public void purge(CommandSender sender, World w, List creatures) { - - List entities = w.getEntities(); - int count = 0; - - for (Entity e : entities) { - if ((((e instanceof Creeper)) && (creatures.contains("CREEPER"))) || (((e instanceof Skeleton)) && (creatures.contains("SKELETON"))) || (((e instanceof Spider)) && (creatures.contains("SPIDER"))) - || (((e instanceof Zombie)) && (creatures.contains("ZOMBIE"))) || (((e instanceof Ghast)) && (creatures.contains("GHAST"))) || (((e instanceof PigZombie)) && (creatures.contains("PIGZOMBIE"))) - || (((e instanceof Giant)) && (creatures.contains("GIANT"))) || (((e instanceof Slime)) && (creatures.contains("SLIME"))) || (((e instanceof Chicken)) && (creatures.contains("CHICKEN"))) - || (((e instanceof Cow)) && (creatures.contains("COW"))) || (((e instanceof Sheep)) && (creatures.contains("SHEEP"))) || (((e instanceof Pig)) && (creatures.contains("PIG"))) - || (((e instanceof Squid)) && (creatures.contains("SQUID"))) || creatures.contains("*")) { - e.remove(); - count++; - } - } - - if (sender != null) { - sender.sendMessage(count + " Entities Purged from " + w.getName()); - } - } - /** * Synchronizes the given world with it's settings */ - public void purgeWorlds(MVWorld world) { - - } - - public void purgeWorlds(CommandSender sender, List worlds, List whatToKill) { - if (worlds.isEmpty()) + public void purgeWorlds(CommandSender sender, List worlds) { + if (worlds == null || worlds.isEmpty()) { return; - - for (MVWorld mvworld : worlds) { - World world = this.plugin.getServer().getWorld(mvworld.getName()); - if (world == null) - continue; - List monsters = mvworld.getMonsterList(); - List animals = mvworld.getAnimalList(); - System.out.print("Monster Size:" + monsters.size() + " - " + "Animal Size: " + animals.size()); - for (Entity e : world.getEntities()) { - String creatureName = e.toString().replaceAll("Craft", "").toLowerCase(); - // Check against Monsters - killMonster(mvworld, e, creatureName); - // Check against Animals - killCreature(mvworld, e, creatureName); - } + } + for (MVWorld world : worlds) { + this.purgeWorld(sender, world); } } + /** + * Convince method for clearing all the animals that do not belong according to the config. + * @param sender + * @param world + */ + public void purgeWorld(CommandSender sender, MVWorld world) { + if (world == null) { + return; + } + ArrayList allMobs = new ArrayList(world.getAnimalList()); + allMobs.addAll(world.getMonsterList()); + purgeWorld(sender, world, allMobs, world.allowAnimalSpawning(), world.allowMonsterSpawning()); + } - private boolean killCreature(MVWorld mvworld, Entity e, String creatureName) { + public void purgeWorld(CommandSender sender, MVWorld mvworld, List thingsToKill, boolean negateAnimals, boolean negateMonsters) { + if (mvworld == null) + return; + World world = this.plugin.getServer().getWorld(mvworld.getName()); + if (world == null) { + return; + } + int entitiesKilled = 0; + //System.out.print("Monster Size:" + monstersToKill.size() + " - " + "Animal Size: " + creaturesToKill.size()); + for (Entity e : world.getEntities()) { + + // Check against Monsters + if (killMonster(mvworld, e, thingsToKill, negateMonsters)) { + entitiesKilled++; + continue; + } + // Check against Animals + if (this.killCreature(mvworld, e, thingsToKill, negateAnimals)) { + entitiesKilled++; + continue; + } + } + System.out.print(entitiesKilled + " entities killed in " + mvworld.getName()); + entitiesKilled = 0; + } + + private boolean killCreature(MVWorld mvworld, Entity e, List creaturesToKill, boolean negate) { String entityName = e.toString().replaceAll("Craft", "").toUpperCase(); if (e instanceof Squid || e instanceof Animals) { - if (entityName.contains(creatureName.toUpperCase())) { - System.out.print(creatureName + " - Removed"); - e.remove(); - return true; + if (creaturesToKill.contains(entityName) || creaturesToKill.contains("ALL") || creaturesToKill.contains("CREATURES")) { + if (!negate) { + System.out.print(entityName + " - Removed"); + e.remove(); + return true; + } + } else { + if (negate) { + System.out.print(entityName + " - Removed"); + e.remove(); + return true; + } } } return false; } - private boolean killMonster(MVWorld mvworld, Entity e, String creatureName) { + /** + * Will kill the monster if it's in the list UNLESS the NEGATE boolean is set, then it will kill it if it's NOT + * + * @param mvworld + * @param e + * @param creaturesToKill + * @param negate + * @return + */ + private boolean killMonster(MVWorld mvworld, Entity e, List creaturesToKill, boolean negate) { String entityName = e.toString().replaceAll("Craft", "").toUpperCase(); if (e instanceof Slime || e instanceof Monster) { - if (entityName.contains(creatureName.toUpperCase())) { - System.out.print(creatureName + " - Removed"); - e.remove(); - return true; + if (creaturesToKill.contains(entityName) || creaturesToKill.contains("ALL") || creaturesToKill.contains("MONSTERS")) { + if (!negate) { + System.out.print(entityName + " - Removed"); + e.remove(); + return true; + } + } else { + if (negate) { + System.out.print(entityName + " - Removed"); + e.remove(); + return true; + } } } return false;