package com.earth2me.essentials.commands; import com.earth2me.essentials.CommandSource; import static com.earth2me.essentials.I18n.tl; import com.earth2me.essentials.Mob; import com.earth2me.essentials.User; import java.util.ArrayList; import java.util.List; import java.util.Locale; import org.bukkit.Chunk; import org.bukkit.Server; import org.bukkit.World; import org.bukkit.entity.*; // This could be rewritten in a simpler form if we made a mapping of all Entity names to their types (which would also provide possible mod support) public class Commandremove extends EssentialsCommand { public Commandremove() { super("remove"); } @Override protected void run(final Server server, final User user, final String commandLabel, final String[] args) throws Exception { World world = user.getWorld(); int radius = 0; if (args.length < 1) { throw new NotEnoughArgumentsException(); } if (args.length >= 2) { try { radius = Integer.parseInt(args[1]); } catch (NumberFormatException e) { world = ess.getWorld(args[1]); } } if (args.length >= 3) { // This is to prevent breaking the old syntax radius = 0; world = ess.getWorld(args[2]); } parseCommand(server, user.getSource(), args, world, radius); } @Override protected void run(final Server server, final CommandSource sender, final String commandLabel, final String[] args) throws Exception { if (args.length < 2) { throw new NotEnoughArgumentsException(); } World world = ess.getWorld(args[1]); parseCommand(server, sender, args, world, 0); } private void parseCommand(Server server, CommandSource sender, String[] args, World world, int radius) throws Exception { List types = new ArrayList(); List customTypes = new ArrayList(); if (world == null) { throw new Exception(tl("invalidWorld")); } if (args[0].contentEquals("*") || args[0].contentEquals("all")) { types.add(0, "ALL"); } else { for (String entityType : args[0].split(",")) { ToRemove toRemove; try { toRemove = ToRemove.valueOf(entityType.toUpperCase(Locale.ENGLISH)); } catch (Exception e) { try { toRemove = ToRemove.valueOf(entityType.concat("S").toUpperCase(Locale.ENGLISH)); } catch (Exception ee) { toRemove = ToRemove.CUSTOM; customTypes.add(entityType); } } types.add(toRemove.toString()); } } removeHandler(sender, types, customTypes, world, radius); } private void removeHandler(CommandSource sender, List types, List customTypes, World world, int radius) { int removed = 0; if (radius > 0) { radius *= radius; } ArrayList removeTypes = new ArrayList(); ArrayList customRemoveTypes = new ArrayList(); for (String s : types) { removeTypes.add(ToRemove.valueOf(s)); } boolean warnUser = false; for (String s : customTypes) { Mob mobType = Mob.fromName(s); if (mobType == null) { warnUser = true; } else { customRemoveTypes.add(mobType); } } if (warnUser) { sender.sendMessage(tl("invalidMob")); } for (Chunk chunk : world.getLoadedChunks()) { for (Entity e : chunk.getEntities()) { if (radius > 0) { if (sender.getPlayer().getLocation().distanceSquared(e.getLocation()) > radius) { continue; } } if (e instanceof HumanEntity) { continue; } for (ToRemove toRemove : removeTypes) { // We should skip any TAMED animals unless we are specifially targetting them. if (e instanceof Tameable && ((Tameable)e).isTamed() && !removeTypes.contains(ToRemove.TAMED)) { continue; } // We should skip any NAMED animals unless we are specifially targetting them. if (e instanceof LivingEntity && ((LivingEntity)e).getCustomName() != null && !removeTypes.contains(ToRemove.NAMED)) { continue; } switch (toRemove) { case TAMED: if (e instanceof Tameable && ((Tameable)e).isTamed()) { e.remove(); removed++; } break; case NAMED: if (e instanceof LivingEntity && ((LivingEntity)e).getCustomName() != null) { e.remove(); removed++; } break; case DROPS: if (e instanceof Item) { e.remove(); removed++; } break; case ARROWS: if (e instanceof Projectile) { e.remove(); removed++; } break; case BOATS: if (e instanceof Boat) { e.remove(); removed++; } break; case MINECARTS: if (e instanceof Minecart) { e.remove(); removed++; } break; case XP: if (e instanceof ExperienceOrb) { e.remove(); removed++; } break; case PAINTINGS: if (e instanceof Painting) { e.remove(); removed++; } break; case ITEMFRAMES: if (e instanceof ItemFrame) { e.remove(); removed++; } break; case ENDERCRYSTALS: if (e instanceof EnderCrystal) { e.remove(); removed++; } break; case AMBIENT: if (e instanceof Flying) { e.remove(); removed++; } break; case HOSTILE: case MONSTERS: if (e instanceof Monster || e instanceof ComplexLivingEntity || e instanceof Flying || e instanceof Slime) { e.remove(); removed++; } break; case PASSIVE: case ANIMALS: if (e instanceof Animals || e instanceof NPC || e instanceof Snowman || e instanceof WaterMob || e instanceof Ambient) { e.remove(); removed++; } break; case MOBS: if (e instanceof Animals || e instanceof NPC || e instanceof Snowman || e instanceof WaterMob || e instanceof Monster || e instanceof ComplexLivingEntity || e instanceof Flying || e instanceof Slime || e instanceof Ambient) { e.remove(); removed++; } break; case ENTITIES: case ALL: if (e instanceof Entity) { e.remove(); removed++; } break; case CUSTOM: for (Mob type : customRemoveTypes) { if (e.getType() == type.getType()) { e.remove(); removed++; } } break; } } } } sender.sendMessage(tl("removed", removed)); } private enum ToRemove { DROPS, ARROWS, BOATS, MINECARTS, XP, PAINTINGS, ITEMFRAMES, ENDERCRYSTALS, HOSTILE, MONSTERS, PASSIVE, ANIMALS, AMBIENT, MOBS, ENTITIES, ALL, CUSTOM, TAMED, NAMED } }