From 650ec799bc28d0843020dd579f30d84c6b91976f Mon Sep 17 00:00:00 2001 From: XiaoMoMi Date: Mon, 7 Apr 2025 05:02:20 +0800 Subject: [PATCH] =?UTF-8?q?=E5=86=8D=E4=BF=AE=E5=A4=8D=EF=BC=8C=E4=B8=8D?= =?UTF-8?q?=E4=B8=80=E5=AE=9A=E6=98=AF=E6=9C=80=E4=BD=B3=E6=96=B9=E6=A1=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../furniture/BukkitFurnitureManager.java | 28 +++++++++++++------ 1 file changed, 20 insertions(+), 8 deletions(-) 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 7a4a58789..0c970796b 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 @@ -291,19 +291,31 @@ public class BukkitFurnitureManager extends AbstractFurnitureManager { if (previous != null) return; Location location = display.getLocation(); - if (!VersionHelper.isVersionNewerThan1_20_2() || !FastNMS.INSTANCE.isPreventingStatusUpdates(location.getWorld(), location.getBlockX() >> 4, location.getBlockZ() >> 4)) { + boolean above1_20_1 = VersionHelper.isVersionNewerThan1_20_2(); + boolean preventChange = FastNMS.INSTANCE.isPreventingStatusUpdates(location.getWorld(), location.getBlockX() >> 4, location.getBlockZ() >> 4); + if (above1_20_1) { + if (!preventChange) { + LoadedFurniture furniture = addNewFurniture(display, customFurniture, getAnchorType(display, customFurniture)); + furniture.initializeColliders(); + for (Player player : display.getTrackedPlayers()) { + this.plugin.adapt(player).furnitureView().computeIfAbsent(furniture.baseEntityId(), k -> new ArrayList<>()).addAll(furniture.fakeEntityIds()); + this.plugin.networkManager().sendPacket(player, furniture.spawnPacket(player)); + } + } + } else { LoadedFurniture furniture = addNewFurniture(display, customFurniture, getAnchorType(display, customFurniture)); for (Player player : display.getTrackedPlayers()) { this.plugin.adapt(player).furnitureView().computeIfAbsent(furniture.baseEntityId(), k -> new ArrayList<>()).addAll(furniture.fakeEntityIds()); this.plugin.networkManager().sendPacket(player, furniture.spawnPacket(player)); } - return; + if (preventChange) { + this.plugin.scheduler().sync().runLater(furniture::initializeColliders, 1, location.getWorld(), location.getBlockX() >> 4, location.getBlockZ() >> 4); + } else { + furniture.initializeColliders(); + } } - if (depth > 2) return; - this.plugin.scheduler().sync().runLater(() -> { - handleBaseEntityLoadLate(display, depth + 1); - }, 1, location.getWorld(), location.getBlockX() >> 4, location.getBlockZ() >> 4); + this.plugin.scheduler().sync().runLater(() -> handleBaseEntityLoadLate(display, depth + 1), 1, location.getWorld(), location.getBlockX() >> 4, location.getBlockZ() >> 4); } protected void handleCollisionEntityLoadLate(Shulker shulker, int depth) { @@ -340,7 +352,8 @@ public class BukkitFurnitureManager extends AbstractFurnitureManager { CustomFurniture customFurniture = optionalFurniture.get(); LoadedFurniture previous = this.furnitureByRealEntityId.get(display.getEntityId()); if (previous != null) return; - addNewFurniture(display, customFurniture, getAnchorType(display, customFurniture)); + LoadedFurniture furniture = addNewFurniture(display, customFurniture, getAnchorType(display, customFurniture)); + furniture.initializeColliders(); // safely do it here return; } // Remove the entity if it's not a valid furniture @@ -384,7 +397,6 @@ public class BukkitFurnitureManager extends AbstractFurnitureManager { int collisionEntityId = FastNMS.INSTANCE.method$Entity$getId(collisionEntity); this.furnitureByRealEntityId.put(collisionEntityId, loadedFurniture); } - loadedFurniture.initializeColliders(); return loadedFurniture; }