From ae667cf16e3358fe2f6cc4b5e312e1f98976618e Mon Sep 17 00:00:00 2001 From: Maddy Miller Date: Wed, 2 Apr 2025 23:12:21 +1000 Subject: [PATCH] Add an adjacent option for the offset mark parser --- .../factory/parser/mask/OffsetMaskParser.java | 12 ++++++++---- .../sk89q/worldedit/function/mask/OffsetsMask.java | 12 +++++++++++- 2 files changed, 19 insertions(+), 5 deletions(-) diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/extension/factory/parser/mask/OffsetMaskParser.java b/worldedit-core/src/main/java/com/sk89q/worldedit/extension/factory/parser/mask/OffsetMaskParser.java index 22109076fe..78b3afe52d 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/extension/factory/parser/mask/OffsetMaskParser.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/extension/factory/parser/mask/OffsetMaskParser.java @@ -39,10 +39,10 @@ public OffsetMaskParser(WorldEdit worldEdit) { @Override public Stream getSuggestions(String input, ParserContext context) { if (input.isEmpty()) { - return Stream.of(">", "<"); + return Stream.of(">", "<", "~"); } final char firstChar = input.charAt(0); - if (firstChar != '>' && firstChar != '<') { + if (firstChar != '>' && firstChar != '<' && firstChar != '~') { return Stream.empty(); } return worldEdit.getMaskFactory().getSuggestions(input.substring(1), context).stream().map(s -> firstChar + s); @@ -51,7 +51,7 @@ public Stream getSuggestions(String input, ParserContext context) { @Override public Mask parseFromInput(String input, ParserContext context) throws InputParseException { final char firstChar = input.charAt(0); - if (firstChar != '>' && firstChar != '<') { + if (firstChar != '>' && firstChar != '<' && firstChar != '~') { return null; } @@ -61,6 +61,10 @@ public Mask parseFromInput(String input, ParserContext context) throws InputPars } else { submask = new ExistingBlockMask(context.requireExtent()); } - return OffsetsMask.single(submask, BlockVector3.at(0, firstChar == '>' ? -1 : 1, 0)); + if (firstChar == '~') { + return OffsetsMask.adjacent(submask); + } else { + return OffsetsMask.single(submask, BlockVector3.at(0, firstChar == '>' ? -1 : 1, 0)); + } } } diff --git a/worldedit-core/src/main/java/com/sk89q/worldedit/function/mask/OffsetsMask.java b/worldedit-core/src/main/java/com/sk89q/worldedit/function/mask/OffsetsMask.java index 77140b1d4f..7e6f9118c5 100644 --- a/worldedit-core/src/main/java/com/sk89q/worldedit/function/mask/OffsetsMask.java +++ b/worldedit-core/src/main/java/com/sk89q/worldedit/function/mask/OffsetsMask.java @@ -53,6 +53,16 @@ public static OffsetsMask single(Mask mask, BlockVector3 offset) { return builder(mask).maxMatches(1).offsets(ImmutableList.of(offset)).build(); } + /** + * Create an offsets mask for any adjacent offset. + * + * @param mask the mask to use + * @return the new offsets mask + */ + public static OffsetsMask adjacent(Mask mask) { + return builder(mask).minMatches(1).offsets(OFFSET_LIST).build(); + } + /** * Create a new builder, using the given mask. * @param mask the mask to use @@ -157,7 +167,7 @@ private OffsetsMask(Mask mask, boolean excludeSelf, int minMatches, int maxMatch checkArgument(minMatches <= maxMatches, "minMatches must be less than or equal to maxMatches"); checkArgument(minMatches >= 0, "minMatches must be greater than or equal to 0"); checkArgument(minMatches <= offsets.size(), "minMatches must be less than or equal to the number of offsets"); - checkArgument(offsets.size() > 0, "offsets must have at least one element"); + checkArgument(!offsets.isEmpty(), "offsets must have at least one element"); this.mask = mask; this.excludeSelf = excludeSelf;