From 6707c55f67cdda6bcc09a7c6be9fa37ce443bcd3 Mon Sep 17 00:00:00 2001 From: TWME <65117253+TWME-TW@users.noreply.github.com> Date: Fri, 22 May 2026 11:03:39 +0800 Subject: [PATCH 1/2] Apply Mask when processing pattern blocks Pass the Mask into processPatternToBlocks and add a masked overload that skips positions where mask.test(...) is false. The new method collects old block state, material, location, base block info, and container contents (skipped for FAWE), then calls WorldEditLogger.postProcess for each affected position. This ensures WorldEdit replaceBlocks respects the provided mask when logging changes. --- .../worldedit/CoreProtectLogger.java | 20 ++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/src/main/java/net/coreprotect/worldedit/CoreProtectLogger.java b/src/main/java/net/coreprotect/worldedit/CoreProtectLogger.java index 1cab14def..a60e6073d 100755 --- a/src/main/java/net/coreprotect/worldedit/CoreProtectLogger.java +++ b/src/main/java/net/coreprotect/worldedit/CoreProtectLogger.java @@ -83,7 +83,7 @@ public int replaceBlocks(final Region region, final Mask mask, final Pattern pat if (!Config.getConfig(world).WORLDEDIT) { return eventExtent.replaceBlocks(region, mask, pattern); } - processPatternToBlocks(world, region, pattern); + processPatternToBlocks(world, region, mask, pattern); return eventExtent.replaceBlocks(region, mask, pattern); } @@ -97,6 +97,24 @@ public int setBlocks(Region region, Pattern pattern) throws MaxChangedBlocksExce return eventExtent.setBlocks(region, pattern); } + private void processPatternToBlocks(org.bukkit.World world, Region region, Mask mask, Pattern pattern) { + for (BlockVector3 position : region.clone()) { + if (!mask.test(position)) { + continue; + } + BlockState oldBlock = eventExtent.getBlock(position); + Material oldType = BukkitAdapter.adapt(oldBlock.getBlockType()); + Location location = new Location(world, position.getBlockX(), position.getBlockY(), position.getBlockZ()); + BaseBlock baseBlock = WorldEditLogger.getBaseBlock(eventExtent, position, location, oldType, oldBlock); + + // No clear way to get container content data from within the WorldEdit API + // Data may be available by converting oldBlock.toBaseBlock().getNbtData() + // e.g. BaseBlock block = eventWorld.getBlock(position); + ItemStack[] containerData = CoreProtectEditSessionEvent.isFAWE() ? null : ItemUtils.getContainerContents(oldType, null, location); + WorldEditLogger.postProcess(eventExtent, eventActor, position, location, pattern.applyBlock(position), baseBlock, oldType, oldBlock, containerData); + } + } + private void processPatternToBlocks(org.bukkit.World world, Region region, Pattern pattern) { for (BlockVector3 position : region.clone()) { BlockState oldBlock = eventExtent.getBlock(position); From 319c276e0f82f0099eb4d19995bbfe8f187063ca Mon Sep 17 00:00:00 2001 From: TWME <65117253+TWME-TW@users.noreply.github.com> Date: Wed, 3 Jun 2026 22:33:25 +0800 Subject: [PATCH 2/2] Restore missing WorldEdit API overrides in replaceBlocks fix Restores the setBlocks(Region,B), setBlocks(Set,Pattern) overrides and the processPatternToBlocks(Set) helper that were present in fix-fawe but accidentally dropped when creating the masked replaceBlocks fix. This ensures full API compatibility while keeping the mask-aware logging introduced for FAWE replaceBlocks (#624). --- .../worldedit/CoreProtectLogger.java | 32 +++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/src/main/java/net/coreprotect/worldedit/CoreProtectLogger.java b/src/main/java/net/coreprotect/worldedit/CoreProtectLogger.java index a60e6073d..85245cc5c 100755 --- a/src/main/java/net/coreprotect/worldedit/CoreProtectLogger.java +++ b/src/main/java/net/coreprotect/worldedit/CoreProtectLogger.java @@ -1,5 +1,7 @@ package net.coreprotect.worldedit; +import java.util.Set; + import org.bukkit.Location; import org.bukkit.Material; import org.bukkit.inventory.ItemStack; @@ -87,6 +89,11 @@ public int replaceBlocks(final Region region, final Mask mask, final Pattern pat return eventExtent.replaceBlocks(region, mask, pattern); } + @Override + public > int setBlocks(Region region, B block) throws MaxChangedBlocksException { + return this.setBlocks(region, (Pattern) block); + } + @Override public int setBlocks(Region region, Pattern pattern) throws MaxChangedBlocksException { org.bukkit.World world = BukkitAdapter.adapt(eventWorld); @@ -97,6 +104,31 @@ public int setBlocks(Region region, Pattern pattern) throws MaxChangedBlocksExce return eventExtent.setBlocks(region, pattern); } + @Override + public int setBlocks(Set vset, Pattern pattern) { + org.bukkit.World world = BukkitAdapter.adapt(eventWorld); + if (!Config.getConfig(world).WORLDEDIT) { + return eventExtent.setBlocks(vset, pattern); + } + processPatternToBlocks(world, vset, pattern); + return eventExtent.setBlocks(vset, pattern); + } + + private void processPatternToBlocks(org.bukkit.World world, Set vset, Pattern pattern) { + for (BlockVector3 position : vset) { + BlockState oldBlock = eventExtent.getBlock(position); + Material oldType = BukkitAdapter.adapt(oldBlock.getBlockType()); + Location location = new Location(world, position.getBlockX(), position.getBlockY(), position.getBlockZ()); + BaseBlock baseBlock = WorldEditLogger.getBaseBlock(eventExtent, position, location, oldType, oldBlock); + + // No clear way to get container content data from within the WorldEdit API + // Data may be available by converting oldBlock.toBaseBlock().getNbtData() + // e.g. BaseBlock block = eventWorld.getBlock(position); + ItemStack[] containerData = CoreProtectEditSessionEvent.isFAWE() ? null : ItemUtils.getContainerContents(oldType, null, location); + WorldEditLogger.postProcess(eventExtent, eventActor, position, location, pattern.applyBlock(position), baseBlock, oldType, oldBlock, containerData); + } + } + private void processPatternToBlocks(org.bukkit.World world, Region region, Mask mask, Pattern pattern) { for (BlockVector3 position : region.clone()) { if (!mask.test(position)) {