From cf53e4b2430f367bdc49789e5ffe3f30331eb7d6 Mon Sep 17 00:00:00 2001 From: XiaoMoMi Date: Tue, 1 Apr 2025 04:12:21 +0800 Subject: [PATCH] improve MEG compatibility --- .../compatibility/modelengine/ModelEngineUtils.java | 12 ++++++++++++ .../bukkit/plugin/network/BukkitNetworkManager.java | 6 ++++++ .../bukkit/plugin/network/PacketConsumers.java | 9 ++++++++- 3 files changed, 26 insertions(+), 1 deletion(-) diff --git a/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/modelengine/ModelEngineUtils.java b/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/modelengine/ModelEngineUtils.java index 8276dac0c..a2f952689 100644 --- a/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/modelengine/ModelEngineUtils.java +++ b/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/modelengine/ModelEngineUtils.java @@ -12,4 +12,16 @@ public class ModelEngineUtils { ActiveModel activeModel = ModelEngineAPI.createActiveModel(id); modeledEntity.addModel(activeModel, true); } + + public static int interactionToBaseEntity(int entityId) { + ActiveModel activeModel = ModelEngineAPI.getInteractionTracker().getModelRelay(entityId); + if (activeModel != null) { + ModeledEntity modeledEntity = activeModel.getModeledEntity(); + if (modeledEntity == null) { + return entityId; + } + return modeledEntity.getBase().getEntityId(); + } + return entityId; + } } diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/BukkitNetworkManager.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/BukkitNetworkManager.java index 939cf62f8..c87622e84 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/BukkitNetworkManager.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/network/BukkitNetworkManager.java @@ -69,6 +69,11 @@ public class BukkitNetworkManager implements NetworkManager, Listener, PluginMes private boolean active; private boolean init; + private static boolean hasModelEngine; + + public static boolean hasModelEngine() { + return hasModelEngine; + } public BukkitNetworkManager(BukkitCraftEngine plugin) { this.plugin = plugin; @@ -111,6 +116,7 @@ public class BukkitNetworkManager implements NetworkManager, Listener, PluginMes } }; this.active = true; + this.hasModelEngine = Bukkit.getPluginManager().getPlugin("ModelEngine") != null; instance = this; } 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 b32e40ab0..781568391 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 @@ -9,6 +9,7 @@ import net.momirealms.craftengine.bukkit.api.CraftEngineFurniture; import net.momirealms.craftengine.bukkit.api.event.FurnitureBreakEvent; import net.momirealms.craftengine.bukkit.api.event.FurnitureInteractEvent; 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.FastNMS; @@ -671,7 +672,13 @@ public class PacketConsumers { try { Player player = (Player) user.platformPlayer(); if (player == null) return; - int entityId = (int) Reflections.field$ServerboundInteractPacket$entityId.get(packet); + int entityId; + if (BukkitNetworkManager.hasModelEngine()) { + int fakeId = (int) Reflections.field$ServerboundInteractPacket$entityId.get(packet); + entityId = ModelEngineUtils.interactionToBaseEntity(fakeId); + } else { + entityId = Reflections.field$ServerboundInteractPacket$entityId.getInt(packet); + } Object action = Reflections.field$ServerboundInteractPacket$action.get(packet); Object actionType = Reflections.method$ServerboundInteractPacket$Action$getType.invoke(action); if (actionType == null) return;