From 9992c6d03fa95c49589567ea040b822e99389520 Mon Sep 17 00:00:00 2001 From: TWME <65117253+TWME-TW@users.noreply.github.com> Date: Fri, 22 May 2026 10:23:55 +0800 Subject: [PATCH] Log pattern setBlocks for block sets Add handling for setBlocks calls that use block sets and generic BlockStateHolder patterns. Imported java.util.Set and added an override for the generic > setBlocks to delegate to the Pattern variant, plus a new setBlocks(Set, Pattern) override that checks the WORLDEDIT config, processes each target position to record previous block state and container contents (unless FAWE), and posts WorldEditLogger events before delegating to eventExtent. Includes a new helper processPatternToBlocks and documents limitations around reading container/NBT data from the WorldEdit API. --- .../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 1cab14def..4bf9e6303 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, Pattern pattern) { for (BlockVector3 position : region.clone()) { BlockState oldBlock = eventExtent.getBlock(position);