From aaccfc7c48d64feb0c9929ecc6fcfc538dcfeda8 Mon Sep 17 00:00:00 2001 From: jhqwqmc <2110242767@qq.com> Date: Mon, 31 Mar 2025 20:24:51 +0800 Subject: [PATCH] =?UTF-8?q?fix(bukkit):=20=E5=8F=AF=E4=BB=A5=E8=BA=B2?= =?UTF-8?q?=E9=81=BF=E4=B8=8B=E7=A2=B0=E6=92=9E=E5=AE=9E=E4=BD=93?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../furniture/BukkitFurnitureManager.java | 17 +++++++++++++++++ .../craftengine/bukkit/util/Reflections.java | 18 ++++++++++++++++++ 2 files changed, 35 insertions(+) diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/entity/furniture/BukkitFurnitureManager.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/entity/furniture/BukkitFurnitureManager.java index 02ec11299..9772d52a9 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/entity/furniture/BukkitFurnitureManager.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/entity/furniture/BukkitFurnitureManager.java @@ -1,8 +1,10 @@ package net.momirealms.craftengine.bukkit.entity.furniture; import net.momirealms.craftengine.bukkit.nms.CollisionEntity; +import net.momirealms.craftengine.bukkit.nms.FastNMS; import net.momirealms.craftengine.bukkit.plugin.BukkitCraftEngine; import net.momirealms.craftengine.bukkit.util.EntityUtils; +import net.momirealms.craftengine.bukkit.util.Reflections; import net.momirealms.craftengine.core.entity.furniture.*; import net.momirealms.craftengine.core.loot.LootTable; import net.momirealms.craftengine.core.pack.Pack; @@ -388,6 +390,7 @@ public class BukkitFurnitureManager implements FurnitureManager { int z = location.getBlockZ(); if (!world.getBlockAt(x, y - 1, z).getType().isSolid()) return false; if (!world.getBlockAt(x, y, z).isPassable()) return false; + if (isEntityBlocking(location)) return false; return world.getBlockAt(x, y + 1, z).isPassable(); } @@ -409,4 +412,18 @@ public class BukkitFurnitureManager implements FurnitureManager { } return null; } + + private boolean isEntityBlocking(Location location) { + World world = location.getWorld(); + if (world == null) return true; + try { + Collection nearbyEntities = world.getNearbyEntities(location, 0.5, 2, 0.5); + for (Entity bukkitEntity : nearbyEntities) { + if (bukkitEntity instanceof Player) continue; + Object nmsEntity = Reflections.method$CraftEntity$getHandle.invoke(bukkitEntity); + return (boolean) Reflections.method$Entity$canBeCollidedWith.invoke(nmsEntity); + } + } catch (Exception ignored) {} + return false; + } } diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/Reflections.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/Reflections.java index f86339c9a..54a5dfa74 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/Reflections.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/util/Reflections.java @@ -5898,4 +5898,22 @@ public class Reflections { clazz$FriendlyByteBuf, clazz$FriendlyByteBuf, int[].class ) ); + + public static final Method method$Entity$canBeCollidedWith = requireNonNull( + VersionHelper.isVersionNewerThan1_20_5() + ? ReflectionUtils.getMethod(clazz$Entity, boolean.class, new String[]{"canBeCollidedWith"}) + : VersionHelper.isVersionNewerThan1_20_3() + ? ReflectionUtils.getMethod(clazz$Entity, boolean.class, new String[]{"bz"}) + : VersionHelper.isVersionNewerThan1_20_2() + ? ReflectionUtils.getMethod(clazz$Entity, boolean.class, new String[]{"bx"}) + : VersionHelper.isVersionNewerThan1_20() + ? ReflectionUtils.getMethod(clazz$Entity, boolean.class, new String[]{"bu"}) + : ReflectionUtils.getMethod(clazz$Entity, boolean.class, new String[]{"canBeCollidedWith", "bu", "bx", "bz"}) + ); + + public static final Method method$CraftEntity$getHandle = requireNonNull( + ReflectionUtils.getMethod( + clazz$CraftEntity, clazz$Entity, 0 + ) + ); }