From 2947505ba012d319d53fd55d6652de23f068cf9e Mon Sep 17 00:00:00 2001 From: jhqwqmc <2110242767@qq.com> Date: Tue, 1 Apr 2025 06:28:51 +0800 Subject: [PATCH 1/9] =?UTF-8?q?fix(bukkit):=20=E4=BF=AE=E5=A4=8D=E7=8E=A9?= =?UTF-8?q?=E5=AE=B6=E8=BD=BD=E5=85=B7=E5=9D=90=E9=AA=91=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../bukkit/entity/furniture/BukkitFurnitureManager.java | 4 ++-- .../craftengine/bukkit/entity/furniture/LoadedFurniture.java | 5 +++++ gradle.properties | 2 +- 3 files changed, 8 insertions(+), 3 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 7f6fa3f4d..043418e5b 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 @@ -377,7 +377,7 @@ public class BukkitFurnitureManager implements FurnitureManager { Location vehicleLocation = vehicle.getLocation(); Location originalLocation = vehicleLocation.clone(); originalLocation.setY(furniture.location().getY()); - Location targetLocation = originalLocation.clone().add(vehicleLocation.getDirection()); + Location targetLocation = originalLocation.clone().add(vehicleLocation.getDirection().multiply(1.1)); if (!isSafeLocation(targetLocation)) { targetLocation = findSafeLocationNearby(originalLocation); if (targetLocation == null) return; @@ -426,7 +426,7 @@ public class BukkitFurnitureManager implements FurnitureManager { World world = location.getWorld(); if (world == null) return true; try { - Collection nearbyEntities = world.getNearbyEntities(location, 0.5, 2, 0.5); + Collection nearbyEntities = world.getNearbyEntities(location, 0.38, 2, 0.38); for (Entity bukkitEntity : nearbyEntities) { if (bukkitEntity instanceof Player) continue; Object nmsEntity = FastNMS.INSTANCE.method$CraftEntity$getHandle(bukkitEntity); diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/entity/furniture/LoadedFurniture.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/entity/furniture/LoadedFurniture.java index 6d79a3080..abd3c4cae 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/entity/furniture/LoadedFurniture.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/entity/furniture/LoadedFurniture.java @@ -135,6 +135,11 @@ public class LoadedFurniture { double z2 = z - offset2.z(); Object aabb = FastNMS.INSTANCE.constructor$AABB(x1, y1, z1, x2, y2, z2); CollisionEntity entity = FastNMS.INSTANCE.createCollisionEntity(world, aabb, x, y, z, collider.canBeHitByProjectile()); + fakeEntityIds.add(entity.getId()); + mainEntityIds.add(entity.getId()); + for (HitBox hitBox : placement.hitBoxes()) { + this.hitBoxes.put(entity.getId(), hitBox); + } FastNMS.INSTANCE.method$LevelWriter$addFreshEntity(world, entity); this.collisionEntities[i] = entity; } diff --git a/gradle.properties b/gradle.properties index 08a87bf87..3d8f43a14 100644 --- a/gradle.properties +++ b/gradle.properties @@ -49,7 +49,7 @@ mojang_brigadier_version=1.0.18 byte_buddy_version=1.15.11 snake_yaml_version=2.3 anti_grief_version=0.13 -nms_helper_version=0.26 +nms_helper_version=0.27 # Ignite Dependencies mixinextras_version=0.4.1 mixin_version=0.15.2+mixin.0.8.7 From 1973a37e57f3ef5fbbbc4076bf3a86b992b64ad8 Mon Sep 17 00:00:00 2001 From: jhqwqmc <2110242767@qq.com> Date: Tue, 1 Apr 2025 06:59:56 +0800 Subject: [PATCH 2/9] =?UTF-8?q?fix(bukkit):=20=E4=BF=AE=E5=A4=8D=E7=8E=A9?= =?UTF-8?q?=E5=AE=B6=E8=BD=BD=E5=85=B7=E5=9D=90=E9=AA=91=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../craftengine/bukkit/entity/furniture/LoadedFurniture.java | 5 ----- .../craftengine/bukkit/plugin/network/PacketConsumers.java | 4 ++++ gradle.properties | 2 +- 3 files changed, 5 insertions(+), 6 deletions(-) diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/entity/furniture/LoadedFurniture.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/entity/furniture/LoadedFurniture.java index abd3c4cae..6d79a3080 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/entity/furniture/LoadedFurniture.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/entity/furniture/LoadedFurniture.java @@ -135,11 +135,6 @@ public class LoadedFurniture { double z2 = z - offset2.z(); Object aabb = FastNMS.INSTANCE.constructor$AABB(x1, y1, z1, x2, y2, z2); CollisionEntity entity = FastNMS.INSTANCE.createCollisionEntity(world, aabb, x, y, z, collider.canBeHitByProjectile()); - fakeEntityIds.add(entity.getId()); - mainEntityIds.add(entity.getId()); - for (HitBox hitBox : placement.hitBoxes()) { - this.hitBoxes.put(entity.getId(), hitBox); - } FastNMS.INSTANCE.method$LevelWriter$addFreshEntity(world, entity); this.collisionEntities[i] = entity; } 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 cd71a2638..e90e59dfb 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.momirealms.craftengine.bukkit.block.BukkitBlockManager; import net.momirealms.craftengine.bukkit.compatibility.modelengine.ModelEngineUtils; import net.momirealms.craftengine.bukkit.entity.furniture.BukkitFurnitureManager; import net.momirealms.craftengine.bukkit.entity.furniture.LoadedFurniture; +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.plugin.user.BukkitServerPlayer; @@ -625,6 +626,9 @@ public class PacketConsumers { event.setCancelled(true); } } + } else if (entityType.equals(CollisionEntity.class)) { + // 取消服务端碰撞实体 + event.setCancelled(true); } } catch (Exception e) { CraftEngine.instance().logger().warn("Failed to handle ClientboundAddEntityPacket", e); diff --git a/gradle.properties b/gradle.properties index 3d8f43a14..08a87bf87 100644 --- a/gradle.properties +++ b/gradle.properties @@ -49,7 +49,7 @@ mojang_brigadier_version=1.0.18 byte_buddy_version=1.15.11 snake_yaml_version=2.3 anti_grief_version=0.13 -nms_helper_version=0.27 +nms_helper_version=0.26 # Ignite Dependencies mixinextras_version=0.4.1 mixin_version=0.15.2+mixin.0.8.7 From 1d81ad072e626bce2cde3143bf3bb16469feceae Mon Sep 17 00:00:00 2001 From: jhqwqmc <2110242767@qq.com> Date: Tue, 1 Apr 2025 07:31:09 +0800 Subject: [PATCH 3/9] =?UTF-8?q?fix(bukkit):=20=E4=BF=AE=E5=A4=8D=E7=8E=A9?= =?UTF-8?q?=E5=AE=B6=E8=BD=BD=E5=85=B7=E5=9D=90=E9=AA=91=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../entity/furniture/BukkitFurnitureManager.java | 16 ++++++++++++++++ .../bukkit/entity/furniture/LoadedFurniture.java | 4 ++++ .../bukkit/plugin/network/PacketConsumers.java | 8 ++++++-- .../craftengine/bukkit/util/Reflections.java | 12 ++++++++++++ 4 files changed, 38 insertions(+), 2 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 043418e5b..77e8964d3 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 @@ -3,6 +3,7 @@ package net.momirealms.craftengine.bukkit.entity.furniture; import net.momirealms.craftengine.bukkit.compatibility.bettermodel.BetterModelModel; import net.momirealms.craftengine.bukkit.compatibility.modelengine.ModelEngineModel; import net.momirealms.craftengine.bukkit.entity.furniture.hitbox.InteractionHitBox; +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; @@ -26,6 +27,7 @@ import org.jetbrains.annotations.NotNull; import org.joml.Vector3f; import javax.annotation.Nullable; +import java.lang.reflect.InvocationTargetException; import java.nio.file.Path; import java.util.*; import java.util.concurrent.ConcurrentHashMap; @@ -42,6 +44,7 @@ public class BukkitFurnitureManager implements FurnitureManager { private final Map furnitureByBaseEntityId = new ConcurrentHashMap<>(256, 0.5f); private final Map furnitureByEntityId = new ConcurrentHashMap<>(512, 0.5f); + private final Map furnitureByCollisionEntitiesId = new ConcurrentHashMap<>(256, 0.5f); // Event listeners private final Listener dismountListener; private final FurnitureEventListener furnitureEventListener; @@ -270,6 +273,11 @@ public class BukkitFurnitureManager implements FurnitureManager { return this.furnitureByEntityId.get(entityId); } + @Nullable + public LoadedFurniture getLoadedFurnitureByCollisionEntityId(int entityId) { + return this.furnitureByCollisionEntitiesId.get(entityId); + } + protected void handleBaseFurnitureUnload(Entity entity) { int id = entity.getEntityId(); LoadedFurniture furniture = this.furnitureByBaseEntityId.remove(id); @@ -348,6 +356,14 @@ public class BukkitFurnitureManager implements FurnitureManager { for (int entityId : loadedFurniture.entityIds()) { this.furnitureByEntityId.put(entityId, loadedFurniture); } + for (CollisionEntity collisionEntity : loadedFurniture.collisionEntities()) { + try { + int collisionEntityId = (int) Reflections.method$Entity$getId.invoke(collisionEntity); + this.furnitureByCollisionEntitiesId.put(collisionEntityId, loadedFurniture); + } catch (IllegalAccessException | InvocationTargetException e) { + throw new RuntimeException(e); + } + } return loadedFurniture; } diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/entity/furniture/LoadedFurniture.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/entity/furniture/LoadedFurniture.java index 6d79a3080..b35a11ee5 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/entity/furniture/LoadedFurniture.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/entity/furniture/LoadedFurniture.java @@ -240,6 +240,10 @@ public class LoadedFurniture { return Collections.unmodifiableList(this.fakeEntityIds); } + public CollisionEntity[] collisionEntities() { + return this.collisionEntities; + } + @NotNull public AnchorType anchorType() { return this.anchorType; 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 e90e59dfb..f59be62d1 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 @@ -626,9 +626,13 @@ public class PacketConsumers { event.setCancelled(true); } } - } else if (entityType.equals(CollisionEntity.class)) { + } else if (entityType == Reflections.instance$EntityType$INTERACTION) { // 取消服务端碰撞实体 - event.setCancelled(true); + int entityId = (int) Reflections.field$ClientboundAddEntityPacket$entityId.get(packet); + LoadedFurniture furniture = BukkitFurnitureManager.instance().getLoadedFurnitureByCollisionEntityId(entityId); + if (furniture != null) { + event.setCancelled(true); + } } } catch (Exception e) { CraftEngine.instance().logger().warn("Failed to handle ClientboundAddEntityPacket", e); 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 073b30bdf..5a7fda845 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 @@ -5917,4 +5917,16 @@ public class Reflections { clazz$CraftEntity, clazz$Entity, 0 ) ); + + public static final Method method$Entity$getId = requireNonNull( + VersionHelper.isVersionNewerThan1_20_5() + ? ReflectionUtils.getMethod(clazz$Entity, int.class, new String[]{"getId"}) + : VersionHelper.isVersionNewerThan1_20_3() + ? ReflectionUtils.getMethod(clazz$Entity, int.class, new String[]{"aj"}) + : VersionHelper.isVersionNewerThan1_20_2() + ? ReflectionUtils.getMethod(clazz$Entity, int.class, new String[]{"ah"}) + : VersionHelper.isVersionNewerThan1_20() + ? ReflectionUtils.getMethod(clazz$Entity, int.class, new String[]{"af"}) + : ReflectionUtils.getMethod(clazz$Entity, int.class, new String[]{"getId", "aj", "ah", "af"}) + ); } From 207254537ba9a71654e2fb28bf941c27f95e740e Mon Sep 17 00:00:00 2001 From: jhqwqmc <2110242767@qq.com> Date: Tue, 1 Apr 2025 07:32:05 +0800 Subject: [PATCH 4/9] =?UTF-8?q?fix(bukkit):=20=E4=BF=AE=E5=A4=8D=E7=8E=A9?= =?UTF-8?q?=E5=AE=B6=E8=BD=BD=E5=85=B7=E5=9D=90=E9=AA=91=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/net/momirealms/craftengine/bukkit/util/Reflections.java | 1 + 1 file changed, 1 insertion(+) 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 5a7fda845..16ecc73d9 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 @@ -38,6 +38,7 @@ import java.util.function.Consumer; import static java.util.Objects.requireNonNull; +@SuppressWarnings("unused") public class Reflections { public static void init() { From 624e00d3f42093a4ff9a41c64d105c759ed547bb Mon Sep 17 00:00:00 2001 From: jhqwqmc <2110242767@qq.com> Date: Tue, 1 Apr 2025 07:42:56 +0800 Subject: [PATCH 5/9] =?UTF-8?q?feat(entity):=20=E9=81=BF=E5=85=8D=E4=BD=BF?= =?UTF-8?q?=E7=94=A8=E9=BB=98=E8=AE=A4=E9=A2=9C=E8=89=B2=E7=9A=84=E6=BD=9C?= =?UTF-8?q?=E5=BD=B1=E8=B4=9D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../bukkit/entity/furniture/hitbox/ShulkerHitBox.java | 1 + 1 file changed, 1 insertion(+) diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/entity/furniture/hitbox/ShulkerHitBox.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/entity/furniture/hitbox/ShulkerHitBox.java index 57aa921a4..6c6abb60a 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/entity/furniture/hitbox/ShulkerHitBox.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/entity/furniture/hitbox/ShulkerHitBox.java @@ -37,6 +37,7 @@ public class ShulkerHitBox extends AbstractHitBox { this.interactionEntity = interactionEntity; ShulkerData.Peek.addEntityDataIfNotDefaultValue(peek, this.cachedShulkerValues); + ShulkerData.Color.addEntityDataIfNotDefaultValue((byte) 0, this.cachedShulkerValues); // ShulkerData.AttachFace.addEntityDataIfNotDefaultValue(DirectionUtils.toNMSDirection(direction), this.cachedShulkerValues); ShulkerData.NoGravity.addEntityDataIfNotDefaultValue(true, this.cachedShulkerValues); ShulkerData.Silent.addEntityDataIfNotDefaultValue(true, this.cachedShulkerValues); From 28f67441899665a56e7e89c4ea39c71043bb4a57 Mon Sep 17 00:00:00 2001 From: jhqwqmc <2110242767@qq.com> Date: Tue, 1 Apr 2025 08:27:23 +0800 Subject: [PATCH 6/9] =?UTF-8?q?fix(furniture):=20=E4=BF=AE=E5=A4=8D?= =?UTF-8?q?=E5=AE=B6=E5=85=B7=E4=BA=92=E5=8A=A8=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../furniture/hitbox/ShulkerHitBox.java | 13 +++++++---- .../plugin/network/PacketConsumers.java | 22 +++++++++++-------- 2 files changed, 22 insertions(+), 13 deletions(-) diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/entity/furniture/hitbox/ShulkerHitBox.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/entity/furniture/hitbox/ShulkerHitBox.java index 6c6abb60a..2c3362f93 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/entity/furniture/hitbox/ShulkerHitBox.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/entity/furniture/hitbox/ShulkerHitBox.java @@ -45,7 +45,7 @@ public class ShulkerHitBox extends AbstractHitBox { ShulkerData.SharedFlags.addEntityDataIfNotDefaultValue((byte) 0x20, this.cachedShulkerValues); // 不可见 if (this.interactionEntity) { - InteractionEntityData.Height.addEntityDataIfNotDefaultValue((float) ((1 + getPeekHeight(peek)) * scale) + 0.001f, cachedInteractionValues); + InteractionEntityData.Height.addEntityDataIfNotDefaultValue(getPeekHeight(peek, scale) + 0.001f, cachedInteractionValues); InteractionEntityData.Width.addEntityDataIfNotDefaultValue((float) scale + 0.001f, cachedInteractionValues); InteractionEntityData.Responsive.addEntityDataIfNotDefaultValue(interactive, cachedInteractionValues); } @@ -57,12 +57,17 @@ public class ShulkerHitBox extends AbstractHitBox { true, position(), (float) scale(), - 1 + getPeekHeight(peek()) + getPeekHeight(peek(), scale()) )); } - private static float getPeekHeight(byte peek) { - return (float) (0.5F - Math.sin((0.5F + peek * 0.01F) * 3.1415927F) * 0.5F); + private static float getPeekHeight(byte peek, double scale) { + double sineValue = Math.sin( + (0.5 + peek * 0.01) * Math.PI + ); + return (float) ( + (1.0 + (0.5 - sineValue * 0.5)) * scale + ); } public boolean interactionEntity() { 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 f59be62d1..3fb3111fa 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,7 +12,6 @@ import net.momirealms.craftengine.bukkit.block.BukkitBlockManager; import net.momirealms.craftengine.bukkit.compatibility.modelengine.ModelEngineUtils; import net.momirealms.craftengine.bukkit.entity.furniture.BukkitFurnitureManager; import net.momirealms.craftengine.bukkit.entity.furniture.LoadedFurniture; -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.plugin.user.BukkitServerPlayer; @@ -691,21 +690,26 @@ public class PacketConsumers { Object actionType = Reflections.method$ServerboundInteractPacket$Action$getType.invoke(action); if (actionType == null) return; LoadedFurniture furniture = BukkitFurnitureManager.instance().getLoadedFurnitureByEntityId(entityId); - if (furniture == null) return; + if (furniture == null) { + furniture = BukkitFurnitureManager.instance().getLoadedFurnitureByCollisionEntityId(entityId); + player.sendMessage("Interact with " + entityId + " " + actionType + " " + furniture); + if (furniture == null) return; + } Location location = furniture.baseEntity().getLocation(); BukkitServerPlayer serverPlayer = (BukkitServerPlayer) user; if (serverPlayer.isSpectatorMode() || serverPlayer.isAdventureMode()) return; + LoadedFurniture finalFurniture = furniture; BukkitCraftEngine.instance().scheduler().sync().run(() -> { if (actionType == Reflections.instance$ServerboundInteractPacket$ActionType$ATTACK) { - if (furniture.isValid()) { + if (finalFurniture.isValid()) { if (!BukkitCraftEngine.instance().antiGrief().canBreak(player, location)) { return; } - FurnitureBreakEvent breakEvent = new FurnitureBreakEvent(serverPlayer.platformPlayer(), furniture); + FurnitureBreakEvent breakEvent = new FurnitureBreakEvent(serverPlayer.platformPlayer(), finalFurniture); if (EventUtils.fireAndCheckCancel(breakEvent)) { return; } - CraftEngineFurniture.remove(furniture, serverPlayer, !serverPlayer.isCreativeMode(), true); + CraftEngineFurniture.remove(finalFurniture, serverPlayer, !serverPlayer.isCreativeMode(), true); } } else if (actionType == Reflections.instance$ServerboundInteractPacket$ActionType$INTERACT_AT) { InteractionHand hand; @@ -721,15 +725,15 @@ public class PacketConsumers { } catch (ReflectiveOperationException e) { throw new RuntimeException("Failed to get interaction hand from interact packet", e); } - FurnitureInteractEvent interactEvent = new FurnitureInteractEvent(serverPlayer.platformPlayer(), furniture, hand, interactionPoint); + FurnitureInteractEvent interactEvent = new FurnitureInteractEvent(serverPlayer.platformPlayer(), finalFurniture, hand, interactionPoint); if (EventUtils.fireAndCheckCancel(interactEvent)) { return; } if (player.isSneaking()) return; - furniture.findFirstAvailableSeat(entityId).ifPresent(seatPos -> { - if (furniture.tryOccupySeat(seatPos)) { - furniture.spawnSeatEntityForPlayer(Objects.requireNonNull(player.getPlayer()), seatPos); + finalFurniture.findFirstAvailableSeat(entityId).ifPresent(seatPos -> { + if (finalFurniture.tryOccupySeat(seatPos)) { + finalFurniture.spawnSeatEntityForPlayer(Objects.requireNonNull(player.getPlayer()), seatPos); } }); } From 8c0210d3439604e531885a2a7263f8666124ae20 Mon Sep 17 00:00:00 2001 From: jhqwqmc <2110242767@qq.com> Date: Tue, 1 Apr 2025 08:39:17 +0800 Subject: [PATCH 7/9] =?UTF-8?q?fix(furniture):=20=E4=BF=AE=E5=A4=8D?= =?UTF-8?q?=E5=AE=B6=E5=85=B7=E4=BA=92=E5=8A=A8=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../furniture/BukkitFurnitureManager.java | 4 ++++ .../entity/furniture/LoadedFurniture.java | 10 +++++++++ .../plugin/network/PacketConsumers.java | 22 ++++++++----------- 3 files changed, 23 insertions(+), 13 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 77e8964d3..20150b906 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 @@ -360,6 +360,10 @@ public class BukkitFurnitureManager implements FurnitureManager { try { int collisionEntityId = (int) Reflections.method$Entity$getId.invoke(collisionEntity); this.furnitureByCollisionEntitiesId.put(collisionEntityId, loadedFurniture); + this.furnitureByEntityId.put(collisionEntityId, loadedFurniture); + for (HitBox hitBox : loadedFurniture.placement().hitBoxes()) { + loadedFurniture.hitBoxes().put(collisionEntityId, hitBox); + } } catch (IllegalAccessException | InvocationTargetException e) { throw new RuntimeException(e); } diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/entity/furniture/LoadedFurniture.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/entity/furniture/LoadedFurniture.java index b35a11ee5..7f2f9c3e0 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/entity/furniture/LoadedFurniture.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/entity/furniture/LoadedFurniture.java @@ -41,6 +41,7 @@ public class LoadedFurniture { private final Map hitBoxes; private final boolean minimized; private final boolean hasExternalModel; + private final CustomFurniture.Placement placement; // seats private final Set occupiedSeats = Collections.synchronizedSet(new HashSet<>()); private final Vector seats = new Vector<>(); @@ -64,6 +65,7 @@ public class LoadedFurniture { mainEntityIds.add(this.baseEntityId); CustomFurniture.Placement placement = furniture.getPlacement(anchorType); + this.placement = placement; // bind external furniture Optional optionalExternal = placement.externalModel(); if (optionalExternal.isPresent()) { @@ -263,6 +265,14 @@ public class LoadedFurniture { return hasExternalModel; } + public CustomFurniture.Placement placement() { + return this.placement; + } + + public Map hitBoxes() { + return this.hitBoxes; + } + public void spawnSeatEntityForPlayer(org.bukkit.entity.Player player, Seat seat) { Location location = this.calculateSeatLocation(seat); Entity seatEntity = seat.limitPlayerRotation() ? 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 3fb3111fa..1669ce1c3 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 @@ -690,26 +690,22 @@ public class PacketConsumers { Object actionType = Reflections.method$ServerboundInteractPacket$Action$getType.invoke(action); if (actionType == null) return; LoadedFurniture furniture = BukkitFurnitureManager.instance().getLoadedFurnitureByEntityId(entityId); - if (furniture == null) { - furniture = BukkitFurnitureManager.instance().getLoadedFurnitureByCollisionEntityId(entityId); - player.sendMessage("Interact with " + entityId + " " + actionType + " " + furniture); - if (furniture == null) return; - } + player.sendMessage("Interact with " + entityId + " " + actionType + " " + furniture); + if (furniture == null) return; Location location = furniture.baseEntity().getLocation(); BukkitServerPlayer serverPlayer = (BukkitServerPlayer) user; if (serverPlayer.isSpectatorMode() || serverPlayer.isAdventureMode()) return; - LoadedFurniture finalFurniture = furniture; BukkitCraftEngine.instance().scheduler().sync().run(() -> { if (actionType == Reflections.instance$ServerboundInteractPacket$ActionType$ATTACK) { - if (finalFurniture.isValid()) { + if (furniture.isValid()) { if (!BukkitCraftEngine.instance().antiGrief().canBreak(player, location)) { return; } - FurnitureBreakEvent breakEvent = new FurnitureBreakEvent(serverPlayer.platformPlayer(), finalFurniture); + FurnitureBreakEvent breakEvent = new FurnitureBreakEvent(serverPlayer.platformPlayer(), furniture); if (EventUtils.fireAndCheckCancel(breakEvent)) { return; } - CraftEngineFurniture.remove(finalFurniture, serverPlayer, !serverPlayer.isCreativeMode(), true); + CraftEngineFurniture.remove(furniture, serverPlayer, !serverPlayer.isCreativeMode(), true); } } else if (actionType == Reflections.instance$ServerboundInteractPacket$ActionType$INTERACT_AT) { InteractionHand hand; @@ -725,15 +721,15 @@ public class PacketConsumers { } catch (ReflectiveOperationException e) { throw new RuntimeException("Failed to get interaction hand from interact packet", e); } - FurnitureInteractEvent interactEvent = new FurnitureInteractEvent(serverPlayer.platformPlayer(), finalFurniture, hand, interactionPoint); + FurnitureInteractEvent interactEvent = new FurnitureInteractEvent(serverPlayer.platformPlayer(), furniture, hand, interactionPoint); if (EventUtils.fireAndCheckCancel(interactEvent)) { return; } if (player.isSneaking()) return; - finalFurniture.findFirstAvailableSeat(entityId).ifPresent(seatPos -> { - if (finalFurniture.tryOccupySeat(seatPos)) { - finalFurniture.spawnSeatEntityForPlayer(Objects.requireNonNull(player.getPlayer()), seatPos); + furniture.findFirstAvailableSeat(entityId).ifPresent(seatPos -> { + if (furniture.tryOccupySeat(seatPos)) { + furniture.spawnSeatEntityForPlayer(Objects.requireNonNull(player.getPlayer()), seatPos); } }); } From b504be805edbfe3a659d9025dc87c17aa2e34cfe Mon Sep 17 00:00:00 2001 From: jhqwqmc <2110242767@qq.com> Date: Tue, 1 Apr 2025 09:02:20 +0800 Subject: [PATCH 8/9] =?UTF-8?q?fix(furniture):=20=E4=BF=AE=E5=A4=8D?= =?UTF-8?q?=E5=AE=B6=E5=85=B7=E4=BA=92=E5=8A=A8=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../bukkit/entity/furniture/BukkitFurnitureManager.java | 3 --- .../bukkit/entity/furniture/LoadedFurniture.java | 6 ++++++ .../craftengine/bukkit/plugin/network/PacketConsumers.java | 1 - 3 files changed, 6 insertions(+), 4 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 20150b906..de45c5ed7 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 @@ -361,9 +361,6 @@ public class BukkitFurnitureManager implements FurnitureManager { int collisionEntityId = (int) Reflections.method$Entity$getId.invoke(collisionEntity); this.furnitureByCollisionEntitiesId.put(collisionEntityId, loadedFurniture); this.furnitureByEntityId.put(collisionEntityId, loadedFurniture); - for (HitBox hitBox : loadedFurniture.placement().hitBoxes()) { - loadedFurniture.hitBoxes().put(collisionEntityId, hitBox); - } } catch (IllegalAccessException | InvocationTargetException e) { throw new RuntimeException(e); } diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/entity/furniture/LoadedFurniture.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/entity/furniture/LoadedFurniture.java index 7f2f9c3e0..36b7e93c6 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/entity/furniture/LoadedFurniture.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/entity/furniture/LoadedFurniture.java @@ -99,6 +99,7 @@ public class LoadedFurniture { } for (HitBox hitBox : placement.hitBoxes()) { int[] ids = hitBox.acquireEntityIds(Reflections.instance$Entity$ENTITY_COUNTER::incrementAndGet); + int lastEntityId = -1; for (int entityId : ids) { fakeEntityIds.add(entityId); mainEntityIds.add(entityId); @@ -109,6 +110,11 @@ public class LoadedFurniture { } }); this.hitBoxes.put(entityId, hitBox); + lastEntityId = entityId; + } + // 预测添加一个CollisionEntity + if (lastEntityId != -1) { + this.hitBoxes.put(lastEntityId + 1, hitBox); } } try { 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 1669ce1c3..c3782a22c 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 @@ -690,7 +690,6 @@ public class PacketConsumers { Object actionType = Reflections.method$ServerboundInteractPacket$Action$getType.invoke(action); if (actionType == null) return; LoadedFurniture furniture = BukkitFurnitureManager.instance().getLoadedFurnitureByEntityId(entityId); - player.sendMessage("Interact with " + entityId + " " + actionType + " " + furniture); if (furniture == null) return; Location location = furniture.baseEntity().getLocation(); BukkitServerPlayer serverPlayer = (BukkitServerPlayer) user; From fb203b8716dbf3dbabaf62db3cd8f7d5079be38e Mon Sep 17 00:00:00 2001 From: jhqwqmc <2110242767@qq.com> Date: Tue, 1 Apr 2025 09:14:42 +0800 Subject: [PATCH 9/9] =?UTF-8?q?fix(furniture):=20=E4=BF=AE=E5=A4=8D?= =?UTF-8?q?=E5=AE=B6=E5=85=B7=E4=BA=92=E5=8A=A8=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../bukkit/entity/furniture/BukkitFurnitureManager.java | 1 - .../bukkit/entity/furniture/LoadedFurniture.java | 6 ------ 2 files changed, 7 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 de45c5ed7..77e8964d3 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 @@ -360,7 +360,6 @@ public class BukkitFurnitureManager implements FurnitureManager { try { int collisionEntityId = (int) Reflections.method$Entity$getId.invoke(collisionEntity); this.furnitureByCollisionEntitiesId.put(collisionEntityId, loadedFurniture); - this.furnitureByEntityId.put(collisionEntityId, loadedFurniture); } catch (IllegalAccessException | InvocationTargetException e) { throw new RuntimeException(e); } diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/entity/furniture/LoadedFurniture.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/entity/furniture/LoadedFurniture.java index 36b7e93c6..7f2f9c3e0 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/entity/furniture/LoadedFurniture.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/entity/furniture/LoadedFurniture.java @@ -99,7 +99,6 @@ public class LoadedFurniture { } for (HitBox hitBox : placement.hitBoxes()) { int[] ids = hitBox.acquireEntityIds(Reflections.instance$Entity$ENTITY_COUNTER::incrementAndGet); - int lastEntityId = -1; for (int entityId : ids) { fakeEntityIds.add(entityId); mainEntityIds.add(entityId); @@ -110,11 +109,6 @@ public class LoadedFurniture { } }); this.hitBoxes.put(entityId, hitBox); - lastEntityId = entityId; - } - // 预测添加一个CollisionEntity - if (lastEntityId != -1) { - this.hitBoxes.put(lastEntityId + 1, hitBox); } } try {