From 002876c3e672343fe4f49562a61cf8c77d7f1df4 Mon Sep 17 00:00:00 2001 From: XiaoMoMi Date: Sun, 13 Apr 2025 15:50:39 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E4=B8=80=E4=BA=9Bbug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../craftengine/bukkit/item/ItemEventListener.java | 9 ++++----- .../bukkit/item/behavior/AxeItemBehavior.java | 4 ++++ .../bukkit/item/behavior/BlockItemBehavior.java | 2 ++ .../bukkit/item/behavior/BoneMealItemBehavior.java | 4 ++++ .../bukkit/item/behavior/BucketItemBehavior.java | 1 + .../bukkit/item/behavior/FurnitureItemBehavior.java | 3 +++ .../bukkit/item/behavior/WaterBucketItemBehavior.java | 1 + .../bukkit/plugin/network/PacketConsumers.java | 4 +++- .../craftengine/bukkit/world/BukkitWorldBlock.java | 2 +- gradle.properties | 2 +- .../net/momirealms/craftengine/mod/CraftEngineBlock.java | 1 + 11 files changed, 25 insertions(+), 8 deletions(-) diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/ItemEventListener.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/ItemEventListener.java index 93d669faf..f10b37e8a 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/ItemEventListener.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/ItemEventListener.java @@ -78,15 +78,15 @@ public class ItemEventListener implements Listener { @EventHandler public void onInteractAir(PlayerInteractEvent event) { - if (event.getAction() != Action.RIGHT_CLICK_AIR) return; + if (event.getAction() != Action.RIGHT_CLICK_AIR) + return; Player bukkitPlayer = event.getPlayer(); BukkitServerPlayer player = this.plugin.adapt(bukkitPlayer); InteractionHand hand = event.getHand() == EquipmentSlot.HAND ? InteractionHand.MAIN_HAND : InteractionHand.OFF_HAND; if (cancelEventIfHasInteraction(event, player, hand)) { return; } - - if (player.isSpectatorMode() || player.isAdventureMode()) { + if (player.isSpectatorMode()) { return; } @@ -149,9 +149,8 @@ public class ItemEventListener implements Listener { return; } - // TODO We need to further investigate how to handle adventure mode // no spectator interactions - if (player.isSpectatorMode() || player.isAdventureMode()) { + if (player.isSpectatorMode()) { return; } diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/behavior/AxeItemBehavior.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/behavior/AxeItemBehavior.java index c19b855ed..5b85ac0fc 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/behavior/AxeItemBehavior.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/behavior/AxeItemBehavior.java @@ -53,6 +53,10 @@ public class AxeItemBehavior extends ItemBehavior { } Player player = context.getPlayer(); + // no adventure mode + if (player.isAdventureMode()) { + return InteractionResult.PASS; + } Item offHandItem = (Item) player.getItemInHand(InteractionHand.OFF_HAND); // is using a shield diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/behavior/BlockItemBehavior.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/behavior/BlockItemBehavior.java index 563a4cfb7..14702bf00 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/behavior/BlockItemBehavior.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/behavior/BlockItemBehavior.java @@ -90,6 +90,8 @@ public class BlockItemBehavior extends ItemBehavior { Block againstBlock = world.getBlockAt(againstPos.x(), againstPos.y(), againstPos.z()); org.bukkit.entity.Player bukkitPlayer = (org.bukkit.entity.Player) player.platformPlayer(); + // todo adventure check + // trigger event CustomBlockAttemptPlaceEvent attemptPlaceEvent = new CustomBlockAttemptPlaceEvent(bukkitPlayer, placeLocation.clone(), blockStateToPlace, DirectionUtils.toBlockFace(context.getClickedFace()), bukkitBlock, context.getHand()); diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/behavior/BoneMealItemBehavior.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/behavior/BoneMealItemBehavior.java index 4a71f53bf..fcac2aa5c 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/behavior/BoneMealItemBehavior.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/behavior/BoneMealItemBehavior.java @@ -26,6 +26,10 @@ public class BoneMealItemBehavior extends ItemBehavior { @Override public InteractionResult useOnBlock(UseOnContext context) { + if (context.getPlayer().isAdventureMode()) { + return InteractionResult.PASS; + } + BukkitWorldBlock clicked = (BukkitWorldBlock) context.getLevel().getBlockAt(context.getClickedPos()); Block block = clicked.block(); ImmutableBlockState state = BukkitBlockManager.instance().getImmutableBlockState(BlockStateUtils.blockDataToId(block.getBlockData())); diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/behavior/BucketItemBehavior.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/behavior/BucketItemBehavior.java index 1c1e279a6..e8f90596f 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/behavior/BucketItemBehavior.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/behavior/BucketItemBehavior.java @@ -34,6 +34,7 @@ public class BucketItemBehavior extends ItemBehavior { @SuppressWarnings("unchecked") @Override public InteractionResult useOnBlock(UseOnContext context) { + if (context.getPlayer().isAdventureMode()) return InteractionResult.PASS; BukkitWorldBlock clicked = (BukkitWorldBlock) context.getLevel().getBlockAt(context.getClickedPos()); Block block = clicked.block(); ImmutableBlockState state = BukkitBlockManager.instance().getImmutableBlockState(BlockStateUtils.blockDataToId(block.getBlockData())); diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/behavior/FurnitureItemBehavior.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/behavior/FurnitureItemBehavior.java index 76f777fbd..6c3db214d 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/behavior/FurnitureItemBehavior.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/behavior/FurnitureItemBehavior.java @@ -67,6 +67,9 @@ public class FurnitureItemBehavior extends ItemBehavior { } Player player = context.getPlayer(); + + // todo adventure check + int gameTicks = player.gameTicks(); if (!player.updateLastSuccessfulInteractionTick(gameTicks)) { return InteractionResult.FAIL; diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/behavior/WaterBucketItemBehavior.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/behavior/WaterBucketItemBehavior.java index 49c60ee74..1ec481214 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/behavior/WaterBucketItemBehavior.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/item/behavior/WaterBucketItemBehavior.java @@ -31,6 +31,7 @@ public class WaterBucketItemBehavior extends ItemBehavior { @SuppressWarnings("unchecked") @Override public InteractionResult useOnBlock(UseOnContext context) { + if (context.getPlayer().isAdventureMode()) return InteractionResult.PASS; BlockPos pos = context.getClickedPos(); BukkitWorldBlock clicked = (BukkitWorldBlock) context.getLevel().getBlockAt(pos); Block block = clicked.block(); 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 052bab0d8..76235e0dd 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 @@ -1566,9 +1566,11 @@ public class PacketConsumers { if (actionType == null) return; Location location = furniture.baseEntity().getLocation(); BukkitServerPlayer serverPlayer = (BukkitServerPlayer) user; - if (serverPlayer.isSpectatorMode() || serverPlayer.isAdventureMode()) return; + if (serverPlayer.isSpectatorMode()) return; BukkitCraftEngine.instance().scheduler().sync().run(() -> { if (actionType == Reflections.instance$ServerboundInteractPacket$ActionType$ATTACK) { + // todo 冒险模式破坏工具白名单 + if (serverPlayer.isAdventureMode()) return; if (furniture.isValid()) { if (!BukkitCraftEngine.instance().antiGrief().canBreak(player, location)) { return; diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/world/BukkitWorldBlock.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/world/BukkitWorldBlock.java index c1addb16d..105ac4443 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/world/BukkitWorldBlock.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/world/BukkitWorldBlock.java @@ -55,7 +55,7 @@ public class BukkitWorldBlock implements WorldBlock { Object serverLevel = FastNMS.INSTANCE.field$CraftWorld$ServerLevel(block.getWorld()); Object fluidData = Reflections.method$Level$getFluidState.invoke(serverLevel, LocationUtils.toBlockPos(location.getBlockX(), location.getBlockY(), location.getBlockZ())); if (fluidData == null) return false; - return (boolean) Reflections.method$FluidState$isSource.invoke(fluidData); + return Reflections.method$FluidState$getType.invoke(fluidData) == Reflections.instance$Fluids$WATER; } catch (ReflectiveOperationException e) { CraftEngine.instance().logger().warn("Failed to check if water source is available", e); return false; diff --git a/gradle.properties b/gradle.properties index 6eaaf29c6..e889758ae 100644 --- a/gradle.properties +++ b/gradle.properties @@ -2,7 +2,7 @@ org.gradle.jvmargs=-Xmx1G # Project settings # Rule: [major update].[feature update].[bug fix] -project_version=0.0.47.1 +project_version=0.0.47.2 config_version=25 lang_version=4 project_group=net.momirealms diff --git a/server-mod/src/main/java/net/momirealms/craftengine/mod/CraftEngineBlock.java b/server-mod/src/main/java/net/momirealms/craftengine/mod/CraftEngineBlock.java index f7d481ee7..200eeb700 100644 --- a/server-mod/src/main/java/net/momirealms/craftengine/mod/CraftEngineBlock.java +++ b/server-mod/src/main/java/net/momirealms/craftengine/mod/CraftEngineBlock.java @@ -17,6 +17,7 @@ import net.minecraft.world.phys.shapes.VoxelShape; import net.momirealms.craftengine.mod.util.NoteBlockUtils; import net.momirealms.craftengine.shared.ObjectHolder; import net.momirealms.craftengine.shared.block.*; +import org.bukkit.entity.Player; import org.jetbrains.annotations.NotNull; public class CraftEngineBlock