From b25e01d34935b3f97756d2b971829d758e5c8ebb Mon Sep 17 00:00:00 2001 From: TWME <65117253+TWME-TW@users.noreply.github.com> Date: Wed, 3 Jun 2026 22:47:08 +0800 Subject: [PATCH] feat: enhance block replacement functionality in CoreProtectLogger --- .../worldedit/CoreProtectLogger.java | 52 ++++++++++++++++++- 1 file changed, 51 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..e114b8cf8 100755 --- a/src/main/java/net/coreprotect/worldedit/CoreProtectLogger.java +++ b/src/main/java/net/coreprotect/worldedit/CoreProtectLogger.java @@ -22,6 +22,8 @@ import net.coreprotect.config.Config; import net.coreprotect.utility.ItemUtils; +import java.util.Set; + public class CoreProtectLogger extends AbstractDelegateExtent { private final Actor eventActor; private final World eventWorld; @@ -83,10 +85,15 @@ 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); } + @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,49 @@ 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)) { + 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);