From e7a2386466b78a14e1407d7f68dfc5df371681de Mon Sep 17 00:00:00 2001 From: halogly Date: Tue, 22 Jul 2025 18:08:19 +0800 Subject: [PATCH] =?UTF-8?q?=E7=A7=BB=E9=99=A4=E4=B8=80=E5=A0=86if=E5=88=A4?= =?UTF-8?q?=E6=96=AD=EF=BC=8C=E4=BD=BF=E7=94=A8=E6=98=A0=E5=B0=84=E5=A4=84?= =?UTF-8?q?=E7=90=86=E5=8F=AF=E4=BA=A4=E4=BA=92=E5=AE=9E=E4=BD=93?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../bukkit/util/InteractUtils.java | 114 ++++++++++-------- .../craftengine/core/entity/EntityKeys.java | 33 ++++- 2 files changed, 97 insertions(+), 50 deletions(-) diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/InteractUtils.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/InteractUtils.java index 9ff03e35c..ea50ffd26 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/InteractUtils.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/InteractUtils.java @@ -14,14 +14,13 @@ import net.momirealms.craftengine.core.plugin.config.Config; import net.momirealms.craftengine.core.util.Direction; import net.momirealms.craftengine.core.util.Key; import net.momirealms.craftengine.core.util.QuadFunction; -import net.momirealms.craftengine.core.util.VersionHelper; +import net.momirealms.craftengine.core.util.TriFunction; import net.momirealms.craftengine.core.world.BlockHitResult; import net.momirealms.craftengine.core.world.BlockPos; import org.bukkit.block.data.BlockData; import org.bukkit.block.data.type.Bell; import org.bukkit.block.data.type.ChiseledBookshelf; import org.bukkit.entity.*; -import org.bukkit.entity.minecart.RideableMinecart; import org.bukkit.inventory.ItemStack; import org.jetbrains.annotations.Nullable; @@ -31,7 +30,7 @@ public class InteractUtils { private static final Map, BlockData, BlockHitResult, Boolean>> INTERACTIONS = new HashMap<>(); private static final Map, BlockData, BlockHitResult, Boolean>> WILL_CONSUME = new HashMap<>(); private static final Key NOTE_BLOCK_TOP_INSTRUMENTS = Key.of("minecraft:noteblock_top_instruments"); - private static final Set INTERACTABLE_ENTITIES = new HashSet<>(); + private static final Map, Boolean>> ENTITY_INTERACTIONS = new HashMap<>(); private InteractUtils() {} @@ -286,34 +285,63 @@ public class InteractUtils { } static { - registerInteractableEntity(EntityKeys.ALLAY); - registerInteractableEntity(EntityKeys.HORSE); - registerInteractableEntity(EntityKeys.ZOMBIE_HORSE); - registerInteractableEntity(EntityKeys.SKELETON_HORSE); - registerInteractableEntity(EntityKeys.DONKEY); - registerInteractableEntity(EntityKeys.MULE); - registerInteractableEntity(EntityKeys.VILLAGER); - registerInteractableEntity(EntityKeys.WANDERING_TRADER); - registerInteractableEntity(EntityKeys.LLAMA); - registerInteractableEntity(EntityKeys.TRADER_LLAMA); - registerInteractableEntity(EntityKeys.CAMEL); - registerInteractableEntity(EntityKeys.ITEM_FRAME); - registerInteractableEntity(EntityKeys.GLOW_ITEM_FRAME); - registerInteractableEntity(EntityKeys.INTERACTION); - if (VersionHelper.isOrAbove1_20_5()) { - registerInteractableEntity(EntityKeys.CHEST_MINECART); - registerInteractableEntity(EntityKeys.FURNACE_MINECART); - registerInteractableEntity(EntityKeys.HOPPER_MINECART); - registerInteractableEntity(EntityKeys.COMMAND_BLOCK_MINECART); - } else { - registerInteractableEntity(EntityKeys.MINECART_CHEST); - registerInteractableEntity(EntityKeys.MINECART_FURNACE); - registerInteractableEntity(EntityKeys.MINECART_HOPPER); - registerInteractableEntity(EntityKeys.MINECART_COMMAND); - } - if (VersionHelper.isOrAbove1_21_6()) { - registerInteractableEntity(EntityKeys.HAPPY_GHAST); - } + // 忽视潜行的交互实体 + registerEntityInteraction(EntityKeys.ALLAY, (player, entity, item) -> true); + registerEntityInteraction(EntityKeys.HORSE, (player, entity, item) -> true); + registerEntityInteraction(EntityKeys.ZOMBIE_HORSE, (player, entity, item) -> true); + registerEntityInteraction(EntityKeys.SKELETON_HORSE, (player, entity, item) -> true); + registerEntityInteraction(EntityKeys.DONKEY, (player, entity, item) -> true); + registerEntityInteraction(EntityKeys.MULE, (player, entity, item) -> true); + registerEntityInteraction(EntityKeys.VILLAGER, (player, entity, item) -> true); + registerEntityInteraction(EntityKeys.WANDERING_TRADER, (player, entity, item) -> true); + registerEntityInteraction(EntityKeys.LLAMA, (player, entity, item) -> true); + registerEntityInteraction(EntityKeys.TRADER_LLAMA, (player, entity, item) -> true); + registerEntityInteraction(EntityKeys.CAMEL, (player, entity, item) -> true); + registerEntityInteraction(EntityKeys.ITEM_FRAME, (player, entity, item) -> true); + registerEntityInteraction(EntityKeys.GLOW_ITEM_FRAME, (player, entity, item) -> true); + registerEntityInteraction(EntityKeys.INTERACTION, (player, entity, item) -> true); + // 潜行时不可交互 + registerEntityInteraction(EntityKeys.ACACIA_BOAT, (player, entity, item) -> !player.isSneaking()); + registerEntityInteraction(EntityKeys.BAMBOO_BOAT, (player, entity, item) -> !player.isSneaking()); + registerEntityInteraction(EntityKeys.BIRCH_BOAT, (player, entity, item) -> !player.isSneaking()); + registerEntityInteraction(EntityKeys.CHERRY_BOAT, (player, entity, item) -> !player.isSneaking()); + registerEntityInteraction(EntityKeys.DARK_OAK_BOAT, (player, entity, item) -> !player.isSneaking()); + registerEntityInteraction(EntityKeys.JUNGLE_BOAT, (player, entity, item) -> !player.isSneaking()); + registerEntityInteraction(EntityKeys.MANGROVE_BOAT, (player, entity, item) -> !player.isSneaking()); + registerEntityInteraction(EntityKeys.OAK_BOAT, (player, entity, item) -> !player.isSneaking()); + registerEntityInteraction(EntityKeys.SPRUCE_BOAT, (player, entity, item) -> !player.isSneaking()); + registerEntityInteraction(EntityKeys.MINECART, (player, entity, item) -> !player.isSneaking()); + // 始终可交互的箱子类船车 + registerEntityInteraction(EntityKeys.ACACIA_CHEST_BOAT, (player, entity, item) -> true); + registerEntityInteraction(EntityKeys.BAMBOO_CHEST_BOAT, (player, entity, item) -> true); + registerEntityInteraction(EntityKeys.BIRCH_CHEST_BOAT, (player, entity, item) -> true); + registerEntityInteraction(EntityKeys.CHERRY_CHEST_BOAT, (player, entity, item) -> true); + registerEntityInteraction(EntityKeys.DARK_OAK_CHEST_BOAT, (player, entity, item) -> true); + registerEntityInteraction(EntityKeys.JUNGLE_CHEST_BOAT, (player, entity, item) -> true); + registerEntityInteraction(EntityKeys.MANGROVE_CHEST_BOAT, (player, entity, item) -> true); + registerEntityInteraction(EntityKeys.OAK_CHEST_BOAT, (player, entity, item) -> true); + registerEntityInteraction(EntityKeys.SPRUCE_CHEST_BOAT, (player, entity, item) -> true); + registerEntityInteraction(EntityKeys.CHEST_MINECART, (player, entity, item) -> true); + registerEntityInteraction(EntityKeys.FURNACE_MINECART, (player, entity, item) -> true); + registerEntityInteraction(EntityKeys.HOPPER_MINECART, (player, entity, item) -> true); + registerEntityInteraction(EntityKeys.COMMAND_BLOCK_MINECART, (player, entity, item) -> true); + //<1.20.5 + registerEntityInteraction(EntityKeys.MINECART_CHEST, (player, entity, item) -> true); + registerEntityInteraction(EntityKeys.MINECART_HOPPER, (player, entity, item) -> true); + registerEntityInteraction(EntityKeys.MINECART_FURNACE, (player, entity, item) -> true); + registerEntityInteraction(EntityKeys.MINECART_COMMAND, (player, entity, item) -> true); + // 有鞍 + 非潜行可交互(如猪、炽足兽) + registerEntityInteraction(EntityKeys.PIG, (player, entity, item) -> + entity instanceof Steerable steerable && steerable.hasSaddle() && !player.isSneaking()); + registerEntityInteraction(EntityKeys.STRIDER, (player, entity, item) -> + entity instanceof Steerable steerable && steerable.hasSaddle() && !player.isSneaking()); + // 是宠物,且主人是玩家(忽视潜行) + registerEntityInteraction(EntityKeys.WOLF, (player, entity, item) -> EntityUtils.isPetOwner(player, entity)); + registerEntityInteraction(EntityKeys.CAT, (player, entity, item) -> EntityUtils.isPetOwner(player, entity)); + registerEntityInteraction(EntityKeys.PARROT, (player, entity, item) -> EntityUtils.isPetOwner(player, entity)); + // 快乐恶魂(装备挽具、受潜行影响) + registerEntityInteraction(EntityKeys.HAPPY_GHAST, (player, entity, item) -> + EntityUtils.isHappyGhastRideable(entity) && !player.isSneaking()); } private static void registerInteraction(Key key, QuadFunction, BlockData, BlockHitResult, Boolean> function) { @@ -330,10 +358,10 @@ public class InteractUtils { } } - private static void registerInteractableEntity(Key key) { - var previous = INTERACTABLE_ENTITIES.add(key); - if (!previous) { - CraftEngine.instance().logger().warn("Duplicated interaction check: " + key); + private static void registerEntityInteraction(Key key, TriFunction, Boolean> function) { + var previous = ENTITY_INTERACTIONS.put(key, function); + if (previous != null) { + CraftEngine.instance().logger().warn("Duplicated entity interaction check: " + key); } } @@ -346,18 +374,10 @@ public class InteractUtils { } } - public static boolean isEntityInteractable(Player player, Entity entity, Item item) { -// Object entityType = FastNMS.INSTANCE.method$CraftEntityType$toNMSEntityType(entity.getType()); - Key entityType = Key.of(String.valueOf(entity.getType())); - if (EntityUtils.isPetOwner(player, entity)) return true; - if (EntityUtils.isPiglinWithGoldIngot(entity, item)) return true; - if (!player.isSneaking()) { - if (EntityUtils.isHappyGhastRideable(entity)) return true; - if (entity instanceof Boat) return true; - if (entity instanceof RideableMinecart) return true; - if (entity instanceof Steerable steerable && steerable.hasSaddle()) return true; - } - return entity instanceof ChestBoat || INTERACTABLE_ENTITIES.contains(entityType); + public static boolean isEntityInteractable(Player player, Entity entity, @Nullable Item item) { + Key key = Key.of(String.valueOf(entity.getType())); + TriFunction, Boolean> func = ENTITY_INTERACTIONS.get(key); + return func != null && func.apply(player, entity, item); } public static boolean willConsume(Player player, BlockData state, BlockHitResult hit, @Nullable Item item) { diff --git a/core/src/main/java/net/momirealms/craftengine/core/entity/EntityKeys.java b/core/src/main/java/net/momirealms/craftengine/core/entity/EntityKeys.java index 4b34d4c20..8691c0912 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/entity/EntityKeys.java +++ b/core/src/main/java/net/momirealms/craftengine/core/entity/EntityKeys.java @@ -19,16 +19,43 @@ public class EntityKeys { public static final Key ITEM_FRAME = Key.of("minecraft:ITEM_FRAME"); public static final Key GLOW_ITEM_FRAME = Key.of("minecraft:GLOW_ITEM_FRAME"); public static final Key INTERACTION = Key.of("minecraft:INTERACTION"); - // ≥1.20.5 + + public static final Key ACACIA_BOAT = Key.of("minecraft:ACACIA_BOAT"); + public static final Key BAMBOO_BOAT = Key.of("minecraft:BAMBOO_BOAT"); + public static final Key BIRCH_BOAT = Key.of("minecraft:BIRCH_BOAT"); + public static final Key CHERRY_BOAT = Key.of("minecraft:CHERRY_BOAT"); + public static final Key DARK_OAK_BOAT = Key.of("minecraft:DARK_OAK_BOAT"); + public static final Key JUNGLE_BOAT = Key.of("minecraft:JUNGLE_BOAT"); + public static final Key MANGROVE_BOAT = Key.of("minecraft:MANGROVE_BOAT"); + public static final Key OAK_BOAT = Key.of("minecraft:OAK_BOAT"); + public static final Key SPRUCE_BOAT = Key.of("minecraft:SPRUCE_BOAT"); + public static final Key MINECART = Key.of("minecraft:MINECART"); + + public static final Key ACACIA_CHEST_BOAT = Key.of("minecraft:ACACIA_CHEST_BOAT"); + public static final Key BAMBOO_CHEST_BOAT = Key.of("minecraft:BAMBOO_CHEST_BOAT"); + public static final Key BIRCH_CHEST_BOAT = Key.of("minecraft:BIRCH_CHEST_BOAT"); + public static final Key CHERRY_CHEST_BOAT = Key.of("minecraft:CHERRY_CHEST_BOAT"); + public static final Key DARK_OAK_CHEST_BOAT = Key.of("minecraft:DARK_OAK_CHEST_BOAT"); + public static final Key JUNGLE_CHEST_BOAT = Key.of("minecraft:JUNGLE_CHEST_BOAT"); + public static final Key MANGROVE_CHEST_BOAT = Key.of("minecraft:MANGROVE_CHEST_BOAT"); + public static final Key OAK_CHEST_BOAT = Key.of("minecraft:OAK_CHEST_BOAT"); + public static final Key SPRUCE_CHEST_BOAT = Key.of("minecraft:SPRUCE_CHEST_BOAT"); public static final Key CHEST_MINECART = Key.of("minecraft:CHEST_MINECART"); public static final Key FURNACE_MINECART = Key.of("minecraft:FURNACE_MINECART"); public static final Key HOPPER_MINECART = Key.of("minecraft:HOPPER_MINECART"); public static final Key COMMAND_BLOCK_MINECART = Key.of("minecraft:COMMAND_BLOCK_MINECART"); - // <1.20.5 + //<1.20.5 public static final Key MINECART_CHEST = Key.of("minecraft:MINECART_CHEST"); public static final Key MINECART_FURNACE = Key.of("minecraft:MINECART_FURNACE"); public static final Key MINECART_HOPPER = Key.of("minecraft:MINECART_HOPPER"); public static final Key MINECART_COMMAND = Key.of("minecraft:MINECART_COMMAND"); - // ≥1.21.6 + + public static final Key PIG = Key.of("minecraft:PIG"); + public static final Key STRIDER = Key.of("minecraft:STRIDER"); + + public static final Key WOLF = Key.of("minecraft:WOLF"); + public static final Key CAT = Key.of("minecraft:CAT"); + public static final Key PARROT = Key.of("minecraft:PARROT"); + public static final Key HAPPY_GHAST = Key.of("minecraft:HAPPY_GHAST"); }