From 069be96fd3d546c4c9ec8dbb8991c690efe18a54 Mon Sep 17 00:00:00 2001 From: XiaoMoMi Date: Fri, 13 Jun 2025 17:21:12 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E5=B0=9D=E8=AF=95=E7=A0=B4?= =?UTF-8?q?=E5=9D=8F=E5=AE=B6=E5=85=B7=E4=BA=8B=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../api/event/FurnitureAttemptBreakEvent.java | 56 +++++++++++++++++++ .../bukkit/block/BlockEventListener.java | 2 +- .../plugin/network/PacketConsumers.java | 12 +++- 3 files changed, 66 insertions(+), 4 deletions(-) create mode 100644 bukkit/src/main/java/net/momirealms/craftengine/bukkit/api/event/FurnitureAttemptBreakEvent.java diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/api/event/FurnitureAttemptBreakEvent.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/api/event/FurnitureAttemptBreakEvent.java new file mode 100644 index 000000000..6a26aab44 --- /dev/null +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/api/event/FurnitureAttemptBreakEvent.java @@ -0,0 +1,56 @@ +package net.momirealms.craftengine.bukkit.api.event; + +import net.momirealms.craftengine.bukkit.entity.furniture.BukkitFurniture; +import org.bukkit.Location; +import org.bukkit.entity.Player; +import org.bukkit.event.Cancellable; +import org.bukkit.event.HandlerList; +import org.bukkit.event.player.PlayerEvent; +import org.jetbrains.annotations.NotNull; + +public class FurnitureAttemptBreakEvent extends PlayerEvent implements Cancellable { + private static final HandlerList HANDLER_LIST = new HandlerList(); + private boolean cancelled; + private final BukkitFurniture furniture; + + public FurnitureAttemptBreakEvent(@NotNull Player player, + @NotNull BukkitFurniture furniture) { + super(player); + this.furniture = furniture; + } + + @NotNull + public Player player() { + return getPlayer(); + } + + @NotNull + public BukkitFurniture furniture() { + return this.furniture; + } + + @NotNull + public Location location() { + return this.furniture.location(); + } + + @NotNull + public static HandlerList getHandlerList() { + return HANDLER_LIST; + } + + @NotNull + public HandlerList getHandlers() { + return getHandlerList(); + } + + @Override + public boolean isCancelled() { + return this.cancelled; + } + + @Override + public void setCancelled(boolean cancel) { + this.cancelled = cancel; + } +} diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/BlockEventListener.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/BlockEventListener.java index 3cefc336a..7bb781fd2 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/BlockEventListener.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/block/BlockEventListener.java @@ -347,7 +347,7 @@ public class BlockEventListener implements Listener { Block block = blocks.get(i); Location location = block.getLocation(); BlockPos blockPos = new BlockPos(location.getBlockX(), location.getBlockY(), location.getBlockZ()); - ImmutableBlockState state = manager.getImmutableBlockState(BlockStateUtils.blockDataToId(block.getBlockData())); + ImmutableBlockState state = this.manager.getImmutableBlockState(BlockStateUtils.blockDataToId(block.getBlockData())); if (state != null && !state.isEmpty()) { WorldPosition position = new WorldPosition(world, Vec3d.atCenterOf(blockPos)); ContextHolder.Builder builder = ContextHolder.builder() diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/PacketConsumers.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/PacketConsumers.java index df11ad10b..d58934ded 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/PacketConsumers.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/PacketConsumers.java @@ -12,6 +12,7 @@ import net.kyori.adventure.text.TranslationArgument; import net.momirealms.craftengine.bukkit.api.CraftEngineFurniture; import net.momirealms.craftengine.bukkit.api.event.FurnitureBreakEvent; import net.momirealms.craftengine.bukkit.api.event.FurnitureInteractEvent; +import net.momirealms.craftengine.bukkit.api.event.FurnitureAttemptBreakEvent; import net.momirealms.craftengine.bukkit.block.BukkitBlockManager; import net.momirealms.craftengine.bukkit.entity.furniture.BukkitFurniture; import net.momirealms.craftengine.bukkit.entity.furniture.BukkitFurnitureManager; @@ -1539,9 +1540,14 @@ public class PacketConsumers { mainThreadTask = () -> { // todo 冒险模式破坏工具白名单 if (serverPlayer.isAdventureMode() || - !furniture.isValid() || - !BukkitCraftEngine.instance().antiGrief().canBreak(platformPlayer, location) - ) return; + !furniture.isValid()) return; + + FurnitureAttemptBreakEvent preBreakEvent = new FurnitureAttemptBreakEvent(serverPlayer.platformPlayer(), furniture); + if (EventUtils.fireAndCheckCancel(preBreakEvent)) + return; + + if (!BukkitCraftEngine.instance().antiGrief().canBreak(platformPlayer, location)) + return; FurnitureBreakEvent breakEvent = new FurnitureBreakEvent(serverPlayer.platformPlayer(), furniture); if (EventUtils.fireAndCheckCancel(breakEvent))