diff --git a/core/src/main/java/com/boydti/fawe/object/pattern/IdDataMaskPattern.java b/core/src/main/java/com/boydti/fawe/object/pattern/IdDataMaskPattern.java new file mode 100644 index 00000000..943d6d15 --- /dev/null +++ b/core/src/main/java/com/boydti/fawe/object/pattern/IdDataMaskPattern.java @@ -0,0 +1,29 @@ +package com.boydti.fawe.object.pattern; + +import com.boydti.fawe.FaweCache; +import com.sk89q.worldedit.Vector; +import com.sk89q.worldedit.blocks.BaseBlock; +import com.sk89q.worldedit.extent.Extent; +import com.sk89q.worldedit.function.pattern.AbstractPattern; +import com.sk89q.worldedit.function.pattern.Pattern; + +public class IdDataMaskPattern extends AbstractPattern { + private final Extent extent; + private final Pattern pattern; + private final int mask; + + public IdDataMaskPattern(Extent extent, Pattern parent, int mask) { + this.extent = extent; + this.pattern = parent; + this.mask = mask; + } + + @Override + public BaseBlock apply(Vector position) { + BaseBlock oldBlock = extent.getBlock(position); + BaseBlock newBlock = pattern.apply(position); + int oldData = oldBlock.getData(); + int newData = newBlock.getData() + oldData - (oldData & mask); + return FaweCache.getBlock(newBlock.getId(), newData); + } +} diff --git a/core/src/main/java/com/sk89q/worldedit/extension/factory/HashTagPatternParser.java b/core/src/main/java/com/sk89q/worldedit/extension/factory/HashTagPatternParser.java index 68f8d3a6..48dccee0 100644 --- a/core/src/main/java/com/sk89q/worldedit/extension/factory/HashTagPatternParser.java +++ b/core/src/main/java/com/sk89q/worldedit/extension/factory/HashTagPatternParser.java @@ -7,6 +7,7 @@ import com.boydti.fawe.object.pattern.DataPattern; import com.boydti.fawe.object.pattern.ExistingPattern; import com.boydti.fawe.object.pattern.ExpressionPattern; import com.boydti.fawe.object.pattern.FullClipboardPattern; +import com.boydti.fawe.object.pattern.IdDataMaskPattern; import com.boydti.fawe.object.pattern.IdPattern; import com.boydti.fawe.object.pattern.Linear3DBlockPattern; import com.boydti.fawe.object.pattern.LinearBlockPattern; @@ -168,6 +169,14 @@ public class HashTagPatternParser extends FaweParser { throw new InputParseException("No session is available, so no clipboard is available"); } } + case "#iddatamask": { + String[] split = rest.split(":", 1); + if (split.length != 2) { + throw new InputParseException("#iddatamask::"); + } + int mask = Integer.parseInt(split[0]); + return new IdDataMaskPattern(Request.request().getExtent(), catchSuggestion(input, split[1], context), mask); + } case "#id": { return new IdPattern(Request.request().getExtent(), catchSuggestion(input, rest, context)); }