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] =?UTF-8?q?fix(furniture):=20=E4=BF=AE=E5=A4=8D=E5=AE=B6?= =?UTF-8?q?=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); } }); }