From 43bba317e5119018f2f8dd4a01f7f1d70ea03184 Mon Sep 17 00:00:00 2001 From: X1337X Date: Thu, 11 Aug 2011 21:44:54 +0100 Subject: [PATCH] Added overlay and underlay masks --- .../java/com/sk89q/worldedit/WorldEdit.java | 94 ++++++++++++++++--- .../worldedit/masks/UnderOverlayMask.java | 46 +++++++++ 2 files changed, 125 insertions(+), 15 deletions(-) create mode 100644 src/main/java/com/sk89q/worldedit/masks/UnderOverlayMask.java diff --git a/src/main/java/com/sk89q/worldedit/WorldEdit.java b/src/main/java/com/sk89q/worldedit/WorldEdit.java index 090d9d7ad..f9a8841a9 100644 --- a/src/main/java/com/sk89q/worldedit/WorldEdit.java +++ b/src/main/java/com/sk89q/worldedit/WorldEdit.java @@ -26,14 +26,8 @@ import java.lang.reflect.Method; import javax.script.ScriptException; -import com.sk89q.minecraft.util.commands.CommandException; -import com.sk89q.minecraft.util.commands.CommandPermissionsException; -import com.sk89q.minecraft.util.commands.CommandUsageException; -import com.sk89q.minecraft.util.commands.CommandsManager; -import com.sk89q.minecraft.util.commands.Logging; -import com.sk89q.minecraft.util.commands.MissingNestedCommandException; -import com.sk89q.minecraft.util.commands.UnhandledCommandException; -import com.sk89q.minecraft.util.commands.WrappedCommandException; +import com.sk89q.minecraft.util.commands.*; + import com.sk89q.util.StringUtil; import com.sk89q.worldedit.bags.BlockBag; import com.sk89q.worldedit.blocks.*; @@ -467,7 +461,7 @@ public class WorldEdit { return new RandomFillPattern(blockChances); } - /** + /** * Get a block mask. Block masks are used to determine which * blocks to include when replacing. * @@ -480,11 +474,10 @@ public class WorldEdit { public Mask getBlockMask(LocalPlayer player, LocalSession session, String maskString) throws WorldEditException { Mask mask = null; - + for (String component : maskString.split(" ")) { Mask current = null; - - if (component.length() == 0) { + if (component.length() == 0) { continue; } @@ -495,10 +488,82 @@ public class WorldEdit { || component.equalsIgnoreCase("#region") || component.equalsIgnoreCase("#sel")) { current = new RegionMask(session.getSelection(player.getWorld())); - } else { + } + else { throw new UnknownItemException(component); } - } else { + } + else if (component.charAt(0) == '>') { + LocalWorld world = player.getWorld(); + Set set = new HashSet(); + String ids = component.replaceAll(">,", ""); + if(ids.equalsIgnoreCase("*")){ + current = new UnderOverlayMask(set,true,true); + } + else{ + String[] split = ids.split(","); + for(String sid :split){ + try{ + int pid = Integer.parseInt(sid); + if(!world.isValidBlockType(pid)){ + throw new UnknownItemException(sid); + } + else{ + set.add(pid); + } + }catch(NumberFormatException e){ + BlockType type = BlockType.lookup(sid); + int id = type.getID(); + if(!world.isValidBlockType(id)){ + throw new UnknownItemException(sid); + } + else{ + set.add(id); + } + } + current = new UnderOverlayMask(set, true, false); + } + } + } + else if (component.charAt(0) == '<') { + LocalWorld world = player.getWorld(); + Set set = new HashSet(); + + + String ids = component.replaceAll("<,", ""); + if(ids.equalsIgnoreCase("*")){ + current = new UnderOverlayMask(set,false,true); + } + else{ + String[] split = ids.split(","); + for(String sid :split){ + try{ + int pid = Integer.parseInt(sid); + if(!world.isValidBlockType(pid)){ + throw new UnknownItemException(sid); + } + else{ + set.add(pid); + } + }catch(NumberFormatException e){ + BlockType type = BlockType.lookup(sid); + int id = type.getID(); + if(!world.isValidBlockType(id)){ + throw new UnknownItemException(sid); + } + else{ + set.add(id); + + } + + } + current = new UnderOverlayMask(set, false, false); + } + } + } + + else { + if (component.charAt(0) == '!' && component.length() > 1) { current = new InvertedBlockTypeMask( getBlockIDs(player, component.substring(1), true)); @@ -519,7 +584,6 @@ public class WorldEdit { return mask; } - /** * Get a list of blocks as a set. * diff --git a/src/main/java/com/sk89q/worldedit/masks/UnderOverlayMask.java b/src/main/java/com/sk89q/worldedit/masks/UnderOverlayMask.java new file mode 100644 index 000000000..73c84bad0 --- /dev/null +++ b/src/main/java/com/sk89q/worldedit/masks/UnderOverlayMask.java @@ -0,0 +1,46 @@ + +package com.sk89q.worldedit.masks; + +import java.util.HashSet; +import java.util.Set; + +import com.sk89q.worldedit.EditSession; +import com.sk89q.worldedit.Vector; + +/** + * + * @author 1337 + */ +public class UnderOverlayMask implements Mask{ + boolean overlay; + boolean wildcard; + Set ids = new HashSet(); + public UnderOverlayMask(Set ids,boolean overlay,boolean wildcard){ + addAll(ids); + this.overlay = overlay; + this.wildcard = wildcard; + + } + public void addAll(Set ids){ + this.ids.addAll(ids); + } + public boolean matches(EditSession editSession, Vector pos) { + if(!wildcard){ + int id = editSession.getBlock(pos.setY(pos.getBlockY() + (overlay ? -1 :1))).getType(); + if(overlay){ +return ids.contains(id); + } + else if(!overlay){ + return ids.contains(id); + } + } + else{ + return (overlay ? editSession.getBlock(pos.setY(pos.getBlockY() + 1)).getType() != 0: editSession.getBlock(pos.setY(pos.getBlockY() - 1)).getType() != 0); + } + return false; + } + + + } + +