From 504b4a613f70c72365697108ed811302c998645c Mon Sep 17 00:00:00 2001 From: sk89q Date: Sat, 4 Jun 2011 11:42:45 -0700 Subject: [PATCH] Added support for combined masks. --- .../java/com/sk89q/worldedit/WorldEdit.java | 41 +++++++++---- .../worldedit/commands/ToolUtilCommands.java | 2 +- .../sk89q/worldedit/masks/CombinedMask.java | 60 +++++++++++++++++++ 3 files changed, 90 insertions(+), 13 deletions(-) create mode 100644 src/main/java/com/sk89q/worldedit/masks/CombinedMask.java diff --git a/src/main/java/com/sk89q/worldedit/WorldEdit.java b/src/main/java/com/sk89q/worldedit/WorldEdit.java index 754a67d9f..da88f289e 100644 --- a/src/main/java/com/sk89q/worldedit/WorldEdit.java +++ b/src/main/java/com/sk89q/worldedit/WorldEdit.java @@ -403,33 +403,50 @@ public class WorldEdit { * blocks to include when replacing. * * @param player - * @param list + * @param maskString * @return * @throws UnknownItemException * @throws DisallowedItemException */ - public Mask getBlockMask(LocalPlayer player, String list) + public Mask getBlockMask(LocalPlayer player, String maskString) throws UnknownItemException, DisallowedItemException { - if (list.charAt(0) == '#') { - if (list.equalsIgnoreCase("#existing")) { - return new ExistingBlockMask(); + Mask mask = null; + + for (String component : maskString.split(" ")) { + Mask current = null; + + if (component.charAt(0) == '#') { + if (component.equalsIgnoreCase("#existing")) { + current = new ExistingBlockMask(); + } else { + throw new UnknownItemException(component); + } } else { - throw new UnknownItemException(list); + if (component.charAt(0) == '!' && component.length() > 1) { + current = new InvertedBlockTypeMask( + getBlockIDs(player, component.substring(1), true)); + } else { + current = new BlockTypeMask(getBlockIDs(player, component, true)); + } } - } else { - if (list.charAt(0) == '!' && list.length() > 1) { - return new InvertedBlockTypeMask( - getBlockIDs(player, list.substring(1), true)); + + if (mask == null) { + mask = current; + } else if (mask instanceof CombinedMask) { + ((CombinedMask) mask).add(current); } else { - return new BlockTypeMask(getBlockIDs(player, list, true)); + mask = new CombinedMask(mask); + ((CombinedMask) mask).add(current); } } + + return mask; } /** * Get a list of blocks as a set. * - *@param player + * @param player * @param list * @param allBlocksAllowed * @return set diff --git a/src/main/java/com/sk89q/worldedit/commands/ToolUtilCommands.java b/src/main/java/com/sk89q/worldedit/commands/ToolUtilCommands.java index aa1e71610..fcd3ddbab 100644 --- a/src/main/java/com/sk89q/worldedit/commands/ToolUtilCommands.java +++ b/src/main/java/com/sk89q/worldedit/commands/ToolUtilCommands.java @@ -87,7 +87,7 @@ public class ToolUtilCommands { session.getBrushTool(player.getItemInHand()).setMask(null); player.print("Brush mask disabled."); } else { - Mask mask = we.getBlockMask(player, args.getString(0)); + Mask mask = we.getBlockMask(player, args.getJoinedStrings(0)); session.getBrushTool(player.getItemInHand()).setMask(mask); player.print("Brush mask set."); } diff --git a/src/main/java/com/sk89q/worldedit/masks/CombinedMask.java b/src/main/java/com/sk89q/worldedit/masks/CombinedMask.java new file mode 100644 index 000000000..166a21251 --- /dev/null +++ b/src/main/java/com/sk89q/worldedit/masks/CombinedMask.java @@ -0,0 +1,60 @@ +// $Id$ +/* + * WorldEdit + * Copyright (C) 2010, 2011 sk89q + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . +*/ + +package com.sk89q.worldedit.masks; + +import java.util.ArrayList; +import java.util.List; +import com.sk89q.worldedit.EditSession; +import com.sk89q.worldedit.Vector; + +public class CombinedMask implements Mask { + + private List masks = new ArrayList(); + + public CombinedMask() { + } + + public CombinedMask(Mask mask) { + masks.add(mask); + } + + public void add(Mask mask) { + masks.add(mask); + } + + public boolean remove(Mask mask) { + return masks.remove(mask); + } + + public boolean has(Mask mask) { + return masks.contains(mask); + } + + public boolean matches(EditSession editSession, Vector pos) { + for (Mask mask : masks) { + if (!mask.matches(editSession, pos)) { + return false; + } + } + + return true; + } + +}