diff --git a/src/main/java/com/sk89q/worldedit/LocalWorld.java b/src/main/java/com/sk89q/worldedit/LocalWorld.java index 48725bd87..77a4a7043 100644 --- a/src/main/java/com/sk89q/worldedit/LocalWorld.java +++ b/src/main/java/com/sk89q/worldedit/LocalWorld.java @@ -256,7 +256,7 @@ public abstract class LocalWorld { } /** - * Kill mobs in an area. + * Kill mobs in an area, excluding pet wolves. * * @param origin * @param radius @@ -264,6 +264,16 @@ public abstract class LocalWorld { */ public abstract int killMobs(Vector origin, int radius); + /** + * Kill mobs in an area. + * + * @param origin + * @param radius + * @param killPets + * @return + */ + public abstract int killMobs(Vector origin, int radius, boolean killPets); + /** * Remove entities in an area. * diff --git a/src/main/java/com/sk89q/worldedit/bukkit/BukkitWorld.java b/src/main/java/com/sk89q/worldedit/bukkit/BukkitWorld.java index 4dbc39be3..1c3700513 100644 --- a/src/main/java/com/sk89q/worldedit/bukkit/BukkitWorld.java +++ b/src/main/java/com/sk89q/worldedit/bukkit/BukkitWorld.java @@ -391,7 +391,7 @@ public class BukkitWorld extends LocalWorld { } /** - * Kill mobs in an area. + * Kill mobs in an area, excluding tamed wolves. * * @param origin * @param radius -1 for all mobs @@ -399,12 +399,27 @@ public class BukkitWorld extends LocalWorld { */ @Override public int killMobs(Vector origin, int radius) { + return killMobs(origin, radius, false); + } + + /** + * Kill mobs in an area. + * + * @param origin + * @param radius -1 for all mobs + * @param killPets true to kill tames wolves + * @return + */ + @Override + public int killMobs(Vector origin, int radius, boolean killPets) { int num = 0; double radiusSq = Math.pow(radius, 2); for (LivingEntity ent : world.getLivingEntities()) { - if ((ent instanceof Creature || ent instanceof Ghast || ent instanceof Slime) - && !(ent instanceof Wolf)) { + if (!killPets && ent instanceof Wolf && ((Wolf) ent).isTamed()) { + continue; // tamed wolf + } + if (ent instanceof Creature || ent instanceof Ghast || ent instanceof Slime) { if (radius == -1 || origin.distanceSq(BukkitUtil.toVector(ent.getLocation())) <= radiusSq) { ent.remove(); diff --git a/src/main/java/com/sk89q/worldedit/commands/RegionCommands.java b/src/main/java/com/sk89q/worldedit/commands/RegionCommands.java index e97fbb058..d14c0696b 100644 --- a/src/main/java/com/sk89q/worldedit/commands/RegionCommands.java +++ b/src/main/java/com/sk89q/worldedit/commands/RegionCommands.java @@ -29,6 +29,7 @@ import com.sk89q.worldedit.filtering.GaussianKernel; import com.sk89q.worldedit.filtering.HeightMapFilter; import com.sk89q.worldedit.patterns.*; import com.sk89q.worldedit.regions.Region; +import com.sk89q.worldedit.regions.RegionOperationException; /** * Region related commands. @@ -182,6 +183,7 @@ public class RegionCommands { @Command( aliases = {"/move"}, usage = "[count] [direction] [leave-id]", + flags = "s", desc = "Move the contents of the selection", min = 0, max = 3 @@ -205,6 +207,20 @@ public class RegionCommands { int affected = editSession.moveCuboidRegion(session.getSelection(player.getWorld()), dir, count, true, replace); + + if (args.hasFlag('s')) { + try { + Region region = session.getSelection(player.getWorld()); + region.expand(dir.multiply(count)); + region.contract(dir.multiply(count)); + + session.getRegionSelector().learnChanges(); + session.getRegionSelector().explainRegionAdjust(player, session); + } catch (RegionOperationException e) { + player.printError(e.getMessage()); + } + } + player.print(affected + " blocks moved."); } @@ -212,7 +228,7 @@ public class RegionCommands { @Command( aliases = {"/stack"}, usage = "[count] [direction]", - flags = "a", + flags = "sa", desc = "Repeat the contents of the selection", min = 0, max = 2 @@ -228,6 +244,20 @@ public class RegionCommands { int affected = editSession.stackCuboidRegion(session.getSelection(player.getWorld()), dir, count, !args.hasFlag('a')); + + if (args.hasFlag('s')) { + try { + Region region = session.getSelection(player.getWorld()); + region.expand(dir.multiply(count)); + region.contract(dir.multiply(count)); + + session.getRegionSelector().learnChanges(); + session.getRegionSelector().explainRegionAdjust(player, session); + } catch (RegionOperationException e) { + player.printError(e.getMessage()); + } + } + player.print(affected + " blocks changed. Undo with //undo"); } diff --git a/src/main/java/com/sk89q/worldedit/commands/UtilityCommands.java b/src/main/java/com/sk89q/worldedit/commands/UtilityCommands.java index 1edb512be..6d9ce9f43 100644 --- a/src/main/java/com/sk89q/worldedit/commands/UtilityCommands.java +++ b/src/main/java/com/sk89q/worldedit/commands/UtilityCommands.java @@ -307,6 +307,7 @@ public class UtilityCommands { @Command( aliases = {"butcher"}, usage = "[radius]", + flags = "p", desc = "Kill all or nearby mobs", min = 0, max = 1 @@ -320,7 +321,7 @@ public class UtilityCommands { Math.max(1, args.getInteger(0)) : -1; Vector origin = session.getPlacementPosition(player); - int killed = player.getWorld().killMobs(origin, radius); + int killed = player.getWorld().killMobs(origin, radius, args.hasFlag('p')); player.print("Killed " + killed + " mobs."); }