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); } }); }