diff --git a/SpigotCore_Main/src/de/steamwar/entity/REntityServer.java b/SpigotCore_Main/src/de/steamwar/entity/REntityServer.java index ecc59c7..df18398 100644 --- a/SpigotCore_Main/src/de/steamwar/entity/REntityServer.java +++ b/SpigotCore_Main/src/de/steamwar/entity/REntityServer.java @@ -47,8 +47,17 @@ public class REntityServer implements Listener { private static final HashSet emptyPlayers = new HashSet<>(0); private static final Class useEntity = Reflection.getClass("{nms.network.protocol.game}.PacketPlayInUseEntity"); + private static final Class useEntityEnumAction = Reflection.getClass("{nms.network.protocol.game}.PacketPlayInUseEntity$EnumEntityUseAction"); private static final Reflection.FieldAccessor useEntityTarget = Reflection.getField(useEntity, int.class, 0); - private static final Reflection.FieldAccessor useEntityAction = Reflection.getField(useEntity, int.class, 1); + private static final Reflection.FieldAccessor useEntityAction = (Reflection.FieldAccessor) Reflection.getField(useEntity, useEntityEnumAction, 0); + private static final Reflection.MethodInvoker useEntityGetAction; + static { + if (useEntityEnumAction.isEnum()) { + useEntityGetAction = null; + } else { + useEntityGetAction = Reflection.getMethod(useEntity, "a"); + } + } private final ConcurrentHashMap entityMap = new ConcurrentHashMap<>(); private final HashMap> entities = new HashMap<>(); @@ -64,7 +73,15 @@ public class REntityServer implements Listener { REntity entity = entityMap.get(target); if (entity == null) return packet; - EntityAction action = useEntityAction.get(packet) == 1 ? EntityAction.ATTACK : EntityAction.INTERACT; + Object entityAction = useEntityAction.get(packet); + int entityActionOrdinal; + if (useEntityEnumAction.isEnum()) { + entityActionOrdinal = ((Enum) entityAction).ordinal(); + } else { + entityActionOrdinal = ((Enum) useEntityGetAction.invoke(entityAction)).ordinal(); + } + + EntityAction action = entityActionOrdinal == 1 ? EntityAction.ATTACK : EntityAction.INTERACT; Bukkit.getScheduler().runTask(Core.getInstance(), () -> { callback.onAction(player, entity, action); });