From 155e60c3070013c14b015276bfa932674a633f9a Mon Sep 17 00:00:00 2001 From: TWME <65117253+TWME-TW@users.noreply.github.com> Date: Thu, 14 May 2026 00:00:01 +0800 Subject: [PATCH 1/2] =?UTF-8?q?feat(block-filter):=20=E6=B7=BB=E5=8A=A0?= =?UTF-8?q?=E5=8D=80=E5=A1=8A=E9=81=8E=E6=BF=BE=E5=8A=9F=E8=83=BD=EF=BC=8C?= =?UTF-8?q?=E5=8C=85=E6=8B=AC=E7=99=BD=E5=90=8D=E5=96=AE=E5=92=8C=E9=BB=91?= =?UTF-8?q?=E5=90=8D=E5=96=AE=E8=A8=AD=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dev/twme/debugstickpro/DebugStickPro.java | 37 ++++++++++---- .../twme/debugstickpro/config/ConfigFile.java | 19 +++++-- .../debugstickpro/config/ConfigLoader.java | 22 +++++--- .../mode/classic/ClassicLeftClick.java | 16 ++++-- .../mode/copy/CopyLeftClick.java | 17 ++++--- .../utils/AutoCheckCanChangeUtil.java | 13 +++-- .../debugstickpro/utils/BlockFilterUtil.java | 50 +++++++++++++++++++ src/main/resources/config.yml | 19 ++++++- src/main/resources/plugin.yml | 4 ++ 9 files changed, 159 insertions(+), 38 deletions(-) create mode 100644 src/main/java/dev/twme/debugstickpro/utils/BlockFilterUtil.java diff --git a/src/main/java/dev/twme/debugstickpro/DebugStickPro.java b/src/main/java/dev/twme/debugstickpro/DebugStickPro.java index 9672407..e49bcd2 100644 --- a/src/main/java/dev/twme/debugstickpro/DebugStickPro.java +++ b/src/main/java/dev/twme/debugstickpro/DebugStickPro.java @@ -1,6 +1,16 @@ package dev.twme.debugstickpro; +import java.util.UUID; + +import org.bukkit.Bukkit; +import org.bukkit.entity.Player; +import org.bukkit.event.Listener; +import org.bukkit.inventory.ItemStack; +import org.bukkit.plugin.java.JavaPlugin; +import org.bukkit.scheduler.BukkitScheduler; + import com.github.retrooper.packetevents.PacketEvents; + import dev.twme.debugstickpro.blockdatautil.BlockDataSeparater; import dev.twme.debugstickpro.commands.MainCommand; import dev.twme.debugstickpro.commands.MainCommandTabComplete; @@ -9,7 +19,22 @@ import dev.twme.debugstickpro.display.ActionBarDisplayTask; import dev.twme.debugstickpro.hook.CoreProtectUtil; import dev.twme.debugstickpro.hook.PlaceholderAPIUtil; -import dev.twme.debugstickpro.listeners.*; +import dev.twme.debugstickpro.listeners.BlockBreakEventListener; +import dev.twme.debugstickpro.listeners.BlockPlaceEventListenerCanBuildChecker; +import dev.twme.debugstickpro.listeners.ChunkLoadEventListener; +import dev.twme.debugstickpro.listeners.ChunkUnloadEventListener; +import dev.twme.debugstickpro.listeners.FreezeBlockIsolationListener; +import dev.twme.debugstickpro.listeners.LeftClickListener; +import dev.twme.debugstickpro.listeners.PlayerChangeDebugStickModeEventListener; +import dev.twme.debugstickpro.listeners.PlayerChangedWorldEventListener; +import dev.twme.debugstickpro.listeners.PlayerDropItemListener; +import dev.twme.debugstickpro.listeners.PlayerItemHeldListener; +import dev.twme.debugstickpro.listeners.PlayerJoinListener; +import dev.twme.debugstickpro.listeners.PlayerLocaleChangeEventListener; +import dev.twme.debugstickpro.listeners.PlayerQuitListener; +import dev.twme.debugstickpro.listeners.PlayerSwapHandItemsEventListener; +import dev.twme.debugstickpro.listeners.RightClickListener; +import dev.twme.debugstickpro.listeners.WorldUnloadEventListener; import dev.twme.debugstickpro.localization.LangFileManager; import dev.twme.debugstickpro.localization.PlayerLanguageManager; import dev.twme.debugstickpro.mode.freeze.FreezeBlockManager; @@ -22,14 +47,6 @@ import me.tofaa.entitylib.APIConfig; import me.tofaa.entitylib.EntityLib; import me.tofaa.entitylib.spigot.SpigotEntityLibPlatform; -import org.bukkit.Bukkit; -import org.bukkit.entity.Player; -import org.bukkit.event.Listener; -import org.bukkit.inventory.ItemStack; -import org.bukkit.plugin.java.JavaPlugin; -import org.bukkit.scheduler.BukkitScheduler; - -import java.util.UUID; public final class DebugStickPro extends JavaPlugin { /** @@ -46,7 +63,7 @@ public final class DebugStickPro extends JavaPlugin { /** * This is the version of the plugin */ - public static final int CONFIG_VERSION = 6; + public static final int CONFIG_VERSION = 7; /** * This is the version of the language file diff --git a/src/main/java/dev/twme/debugstickpro/config/ConfigFile.java b/src/main/java/dev/twme/debugstickpro/config/ConfigFile.java index bcbfcc4..b55571c 100644 --- a/src/main/java/dev/twme/debugstickpro/config/ConfigFile.java +++ b/src/main/java/dev/twme/debugstickpro/config/ConfigFile.java @@ -1,11 +1,12 @@ package dev.twme.debugstickpro.config; -import net.kyori.adventure.text.Component; -import org.bukkit.Material; - import java.util.ArrayList; import java.util.HashSet; +import org.bukkit.Material; + +import net.kyori.adventure.text.Component; + public class ConfigFile { public static int ConfigVersion; @@ -49,6 +50,18 @@ public static class AutoRegionProtection { public static boolean Enabled; } + public static class BlockFilter { + public static class Whitelist { + public static boolean Enabled; + public static HashSet Blocks; + } + + public static class Blacklist { + public static boolean Enabled; + public static HashSet Blocks; + } + } + public static class BlockDataFilter { public static class Whitelist { public static boolean Enabled; diff --git a/src/main/java/dev/twme/debugstickpro/config/ConfigLoader.java b/src/main/java/dev/twme/debugstickpro/config/ConfigLoader.java index 36cc737..46dcf4d 100644 --- a/src/main/java/dev/twme/debugstickpro/config/ConfigLoader.java +++ b/src/main/java/dev/twme/debugstickpro/config/ConfigLoader.java @@ -1,19 +1,20 @@ package dev.twme.debugstickpro.config; -import dev.twme.debugstickpro.DebugStickPro; -import dev.twme.debugstickpro.utils.Log; -import net.kyori.adventure.text.Component; -import net.kyori.adventure.text.format.TextDecoration; -import net.kyori.adventure.text.minimessage.MiniMessage; -import org.bukkit.Material; -import org.bukkit.configuration.file.YamlConfiguration; - import java.io.File; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Date; import java.util.HashSet; +import org.bukkit.Material; +import org.bukkit.configuration.file.YamlConfiguration; + +import dev.twme.debugstickpro.DebugStickPro; +import dev.twme.debugstickpro.utils.Log; +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.format.TextDecoration; +import net.kyori.adventure.text.minimessage.MiniMessage; + public class ConfigLoader { private final static ConfigLoader instance = new ConfigLoader(); private File file; @@ -96,6 +97,11 @@ private void loadValues() { ConfigFile.AutoRegionProtection.Enabled = config.getBoolean("AutoRegionProtection.Enabled"); + ConfigFile.BlockFilter.Whitelist.Enabled = config.getBoolean("BlockFilter.Whitelist.Enabled"); + ConfigFile.BlockFilter.Whitelist.Blocks = new HashSet<>(config.getStringList("BlockFilter.Whitelist.Blocks")); + ConfigFile.BlockFilter.Blacklist.Enabled = config.getBoolean("BlockFilter.Blacklist.Enabled"); + ConfigFile.BlockFilter.Blacklist.Blocks = new HashSet<>(config.getStringList("BlockFilter.Blacklist.Blocks")); + ConfigFile.BlockDataFilter.Whitelist.Enabled = config.getBoolean("BlockDataFilter.Whitelist.Enabled"); ConfigFile.BlockDataFilter.Whitelist.Whitelist = new HashSet<>(config.getStringList("BlockDataFilter.Whitelist.Whitelist")); ConfigFile.BlockDataFilter.Blacklist.Enabled = config.getBoolean("BlockDataFilter.Blacklist.Enabled"); diff --git a/src/main/java/dev/twme/debugstickpro/mode/classic/ClassicLeftClick.java b/src/main/java/dev/twme/debugstickpro/mode/classic/ClassicLeftClick.java index 939fb33..f765ff5 100644 --- a/src/main/java/dev/twme/debugstickpro/mode/classic/ClassicLeftClick.java +++ b/src/main/java/dev/twme/debugstickpro/mode/classic/ClassicLeftClick.java @@ -1,14 +1,16 @@ package dev.twme.debugstickpro.mode.classic; -import dev.twme.debugstickpro.blockdatautil.BlockDataSeparater; -import dev.twme.debugstickpro.blockdatautil.SubBlockData; -import dev.twme.debugstickpro.playerdata.PlayerData; +import java.util.ArrayList; +import java.util.UUID; + import org.bukkit.Bukkit; import org.bukkit.block.Block; import org.bukkit.entity.Player; -import java.util.ArrayList; -import java.util.UUID; +import dev.twme.debugstickpro.blockdatautil.BlockDataSeparater; +import dev.twme.debugstickpro.blockdatautil.SubBlockData; +import dev.twme.debugstickpro.playerdata.PlayerData; +import dev.twme.debugstickpro.utils.BlockFilterUtil; public class ClassicLeftClick { @@ -24,6 +26,10 @@ public static void changeSelectedSubBlockType(UUID playerUUID, PlayerData player return; } + if (!BlockFilterUtil.isAllowed(playerUUID, block)) { + return; + } + ArrayList subBlockDataList = BlockDataSeparater.separate(block, playerUUID); if (subBlockDataList.isEmpty()) { diff --git a/src/main/java/dev/twme/debugstickpro/mode/copy/CopyLeftClick.java b/src/main/java/dev/twme/debugstickpro/mode/copy/CopyLeftClick.java index af53489..e58dbd6 100644 --- a/src/main/java/dev/twme/debugstickpro/mode/copy/CopyLeftClick.java +++ b/src/main/java/dev/twme/debugstickpro/mode/copy/CopyLeftClick.java @@ -1,19 +1,20 @@ package dev.twme.debugstickpro.mode.copy; -import dev.twme.debugstickpro.blockdatautil.BlockDataSeparater; -import dev.twme.debugstickpro.blockdatautil.SubBlockData; -import dev.twme.debugstickpro.events.CopyModeCopyBlockDataEvent; -import dev.twme.debugstickpro.playerdata.PlayerData; -import dev.twme.debugstickpro.playerdata.PlayerDataManager; -import dev.twme.debugstickpro.utils.AutoCheckCanChangeUtil; +import java.util.ArrayList; +import java.util.UUID; + import org.bukkit.Bukkit; import org.bukkit.Material; import org.bukkit.block.Block; import org.bukkit.block.Skull; import org.bukkit.entity.Player; -import java.util.ArrayList; -import java.util.UUID; +import dev.twme.debugstickpro.blockdatautil.BlockDataSeparater; +import dev.twme.debugstickpro.blockdatautil.SubBlockData; +import dev.twme.debugstickpro.events.CopyModeCopyBlockDataEvent; +import dev.twme.debugstickpro.playerdata.PlayerData; +import dev.twme.debugstickpro.playerdata.PlayerDataManager; +import dev.twme.debugstickpro.utils.AutoCheckCanChangeUtil; public class CopyLeftClick { public static void onLeftClick(UUID playerUUID, PlayerData playerData) { diff --git a/src/main/java/dev/twme/debugstickpro/utils/AutoCheckCanChangeUtil.java b/src/main/java/dev/twme/debugstickpro/utils/AutoCheckCanChangeUtil.java index 6b05f4e..31eb072 100644 --- a/src/main/java/dev/twme/debugstickpro/utils/AutoCheckCanChangeUtil.java +++ b/src/main/java/dev/twme/debugstickpro/utils/AutoCheckCanChangeUtil.java @@ -1,13 +1,14 @@ package dev.twme.debugstickpro.utils; -import dev.twme.debugstickpro.config.ConfigFile; -import dev.twme.debugstickpro.listeners.BlockPlaceEventListenerCanBuildChecker; +import java.util.UUID; + import org.bukkit.Bukkit; import org.bukkit.World; import org.bukkit.block.Block; import org.bukkit.entity.Player; -import java.util.UUID; +import dev.twme.debugstickpro.config.ConfigFile; +import dev.twme.debugstickpro.listeners.BlockPlaceEventListenerCanBuildChecker; public final class AutoCheckCanChangeUtil { /** @@ -51,6 +52,12 @@ public static boolean canChange(UUID playerUUID, Block block) { } } + if (canChange) { + if (!BlockFilterUtil.isAllowed(playerUUID, block)) { + canChange = false; + } + } + return canChange; } } diff --git a/src/main/java/dev/twme/debugstickpro/utils/BlockFilterUtil.java b/src/main/java/dev/twme/debugstickpro/utils/BlockFilterUtil.java new file mode 100644 index 0000000..da1c4be --- /dev/null +++ b/src/main/java/dev/twme/debugstickpro/utils/BlockFilterUtil.java @@ -0,0 +1,50 @@ +package dev.twme.debugstickpro.utils; + +import java.util.UUID; + +import org.bukkit.block.Block; +import org.bukkit.entity.Player; + +import dev.twme.debugstickpro.config.ConfigFile; + +public final class BlockFilterUtil { + + /** + * Check if the block is allowed by the BlockFilter settings. + * + * @param playerUUID player UUID + * @param block the block to check + * @return true if the block is allowed, false if it is filtered out + */ + public static boolean isAllowed(UUID playerUUID, Block block) { + Player player = org.bukkit.Bukkit.getPlayer(playerUUID); + if (player == null) { + return false; + } + + // bypass permission + if (player.hasPermission("debugstickpro.bypassblockfilter")) { + return true; + } + + String materialName = block.getType().name(); + + // Whitelist check + if (ConfigFile.BlockFilter.Whitelist.Enabled) { + boolean inWhitelist = ConfigFile.BlockFilter.Whitelist.Blocks.contains("*") + || ConfigFile.BlockFilter.Whitelist.Blocks.contains(materialName); + if (!inWhitelist) { + return false; + } + } + + // Blacklist check (takes precedence) + if (ConfigFile.BlockFilter.Blacklist.Enabled) { + if (ConfigFile.BlockFilter.Blacklist.Blocks.contains(materialName)) { + return false; + } + } + + return true; + } +} diff --git a/src/main/resources/config.yml b/src/main/resources/config.yml index b52e41b..4422eca 100644 --- a/src/main/resources/config.yml +++ b/src/main/resources/config.yml @@ -1,5 +1,5 @@ # Don't touch this value -ConfigVersion: 6 +ConfigVersion: 7 Language: # Language files are located in the "lang" folder. @@ -86,6 +86,23 @@ BlockDataFilter: - "AgeableData" - "WaterloggedData" +BlockFilter: + Whitelist: + # If enabled, the debug stick will only work on the specified blocks. + Enabled: false + # Options to fill: https://hub.spigotmc.org/javadocs/bukkit/org/bukkit/Material.html + Blocks: + - "*" + Blacklist: + # If enabled, the debug stick will not work on the specified blocks. + # This option takes precedence over the whitelist. + # Permission bypass: debugstickpro.bypassblockfilter + Enabled: false + # Options to fill: https://hub.spigotmc.org/javadocs/bukkit/org/bukkit/Material.html + Blocks: + - "BEDROCK" + - "BARRIER" + ModeSetting: ClassicMode: # If enabled, when switching modes, the selected BlockData type will be cleared. diff --git a/src/main/resources/plugin.yml b/src/main/resources/plugin.yml index d9b9229..73159e0 100644 --- a/src/main/resources/plugin.yml +++ b/src/main/resources/plugin.yml @@ -59,6 +59,9 @@ permissions: default: op # Per-type bypass pattern: # debugstickpro.bypassblacklist. + debugstickpro.bypassblockfilter: + description: Allows bypass block material filter (BlockFilter whitelist/blacklist) + default: op debugstickpro.basic: description: Allows basic usage of the DebugStickPro default: op @@ -77,3 +80,4 @@ permissions: - debugstickpro.reload - debugstickpro.bypassregion - debugstickpro.bypassblacklist + - debugstickpro.bypassblockfilter From fe0564ed000dc84ff810dc38086a39aabb3b2519 Mon Sep 17 00:00:00 2001 From: TWME <65117253+TWME-TW@users.noreply.github.com> Date: Thu, 14 May 2026 00:12:24 +0800 Subject: [PATCH 2/2] =?UTF-8?q?fix(block-filter):=20=E4=BF=AE=E6=AD=A3?= =?UTF-8?q?=E5=8D=80=E5=A1=8A=E9=81=8E=E6=BF=BE=E5=8A=9F=E8=83=BD=E7=9A=84?= =?UTF-8?q?=E5=8F=83=E6=95=B8=E9=A1=9E=E5=9E=8B=EF=BC=8C=E6=94=B9=E7=82=BA?= =?UTF-8?q?=E4=BD=BF=E7=94=A8=20Player=20=E7=89=A9=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../mode/classic/ClassicLeftClick.java | 2 +- .../utils/AutoCheckCanChangeUtil.java | 22 ++++++++----------- .../debugstickpro/utils/BlockFilterUtil.java | 14 +++++++----- src/main/resources/config.yml | 2 +- src/main/resources/plugin.yml | 2 +- 5 files changed, 21 insertions(+), 21 deletions(-) diff --git a/src/main/java/dev/twme/debugstickpro/mode/classic/ClassicLeftClick.java b/src/main/java/dev/twme/debugstickpro/mode/classic/ClassicLeftClick.java index f765ff5..caca31d 100644 --- a/src/main/java/dev/twme/debugstickpro/mode/classic/ClassicLeftClick.java +++ b/src/main/java/dev/twme/debugstickpro/mode/classic/ClassicLeftClick.java @@ -26,7 +26,7 @@ public static void changeSelectedSubBlockType(UUID playerUUID, PlayerData player return; } - if (!BlockFilterUtil.isAllowed(playerUUID, block)) { + if (!BlockFilterUtil.isAllowed(player, block)) { return; } diff --git a/src/main/java/dev/twme/debugstickpro/utils/AutoCheckCanChangeUtil.java b/src/main/java/dev/twme/debugstickpro/utils/AutoCheckCanChangeUtil.java index 31eb072..5163c88 100644 --- a/src/main/java/dev/twme/debugstickpro/utils/AutoCheckCanChangeUtil.java +++ b/src/main/java/dev/twme/debugstickpro/utils/AutoCheckCanChangeUtil.java @@ -20,12 +20,12 @@ public final class AutoCheckCanChangeUtil { */ public static boolean canChange(UUID playerUUID, Block block) { Player player = Bukkit.getPlayer(playerUUID); - World world = block.getWorld(); - - if (player.hasPermission("debugstickpro.bypassregion")) { - return true; + if (player == null) { + return false; } + World world = block.getWorld(); + boolean canChange = true; if (ConfigFile.WhitelistWorlds.Enabled) { @@ -44,18 +44,14 @@ public static boolean canChange(UUID playerUUID, Block block) { } } - if (ConfigFile.AutoRegionProtection.Enabled) { - if (canChange) { - if (!BlockPlaceEventListenerCanBuildChecker.canBuild(block, playerUUID)) { - canChange = false; - } + if (ConfigFile.AutoRegionProtection.Enabled && canChange && !player.hasPermission("debugstickpro.bypassregion")) { + if (!BlockPlaceEventListenerCanBuildChecker.canBuild(block, playerUUID)) { + canChange = false; } } - if (canChange) { - if (!BlockFilterUtil.isAllowed(playerUUID, block)) { - canChange = false; - } + if (canChange && !BlockFilterUtil.isAllowed(player, block)) { + canChange = false; } return canChange; diff --git a/src/main/java/dev/twme/debugstickpro/utils/BlockFilterUtil.java b/src/main/java/dev/twme/debugstickpro/utils/BlockFilterUtil.java index da1c4be..56b4d49 100644 --- a/src/main/java/dev/twme/debugstickpro/utils/BlockFilterUtil.java +++ b/src/main/java/dev/twme/debugstickpro/utils/BlockFilterUtil.java @@ -2,6 +2,7 @@ import java.util.UUID; +import org.bukkit.Bukkit; import org.bukkit.block.Block; import org.bukkit.entity.Player; @@ -12,17 +13,16 @@ public final class BlockFilterUtil { /** * Check if the block is allowed by the BlockFilter settings. * - * @param playerUUID player UUID - * @param block the block to check + * @param player the player to check + * @param block the block to check * @return true if the block is allowed, false if it is filtered out */ - public static boolean isAllowed(UUID playerUUID, Block block) { - Player player = org.bukkit.Bukkit.getPlayer(playerUUID); + public static boolean isAllowed(Player player, Block block) { if (player == null) { return false; } - // bypass permission + // Bypass permission applies to both whitelist and blacklist. if (player.hasPermission("debugstickpro.bypassblockfilter")) { return true; } @@ -47,4 +47,8 @@ public static boolean isAllowed(UUID playerUUID, Block block) { return true; } + + public static boolean isAllowed(UUID playerUUID, Block block) { + return isAllowed(Bukkit.getPlayer(playerUUID), block); + } } diff --git a/src/main/resources/config.yml b/src/main/resources/config.yml index 4422eca..892a0a6 100644 --- a/src/main/resources/config.yml +++ b/src/main/resources/config.yml @@ -87,6 +87,7 @@ BlockDataFilter: - "WaterloggedData" BlockFilter: + # Permission bypass for both whitelist and blacklist: debugstickpro.bypassblockfilter Whitelist: # If enabled, the debug stick will only work on the specified blocks. Enabled: false @@ -96,7 +97,6 @@ BlockFilter: Blacklist: # If enabled, the debug stick will not work on the specified blocks. # This option takes precedence over the whitelist. - # Permission bypass: debugstickpro.bypassblockfilter Enabled: false # Options to fill: https://hub.spigotmc.org/javadocs/bukkit/org/bukkit/Material.html Blocks: diff --git a/src/main/resources/plugin.yml b/src/main/resources/plugin.yml index 73159e0..c661b08 100644 --- a/src/main/resources/plugin.yml +++ b/src/main/resources/plugin.yml @@ -60,7 +60,7 @@ permissions: # Per-type bypass pattern: # debugstickpro.bypassblacklist. debugstickpro.bypassblockfilter: - description: Allows bypass block material filter (BlockFilter whitelist/blacklist) + description: Allows bypassing the BlockFilter whitelist and blacklist default: op debugstickpro.basic: description: Allows basic usage of the DebugStickPro