diff --git a/runelite-api/src/main/java/net/runelite/api/Client.java b/runelite-api/src/main/java/net/runelite/api/Client.java index 42e468825a..beb6316e56 100644 --- a/runelite-api/src/main/java/net/runelite/api/Client.java +++ b/runelite-api/src/main/java/net/runelite/api/Client.java @@ -346,6 +346,8 @@ public interface Client extends GameEngine boolean hasHintArrow(); + HintArrowType getHintArrowType(); + void clearHintArrow(); void setHintArrow(WorldPoint point); @@ -354,6 +356,12 @@ public interface Client extends GameEngine void setHintArrow(NPC npc); + WorldPoint getHintArrowPoint(); + + Player getHintArrowPlayer(); + + NPC getHintArrowNpc(); + boolean isInterpolatePlayerAnimations(); void setInterpolatePlayerAnimations(boolean interpolate); diff --git a/runelite-mixins/src/main/java/net/runelite/mixins/RSClientMixin.java b/runelite-mixins/src/main/java/net/runelite/mixins/RSClientMixin.java index 5dea999406..f2123e43ef 100644 --- a/runelite-mixins/src/main/java/net/runelite/mixins/RSClientMixin.java +++ b/runelite-mixins/src/main/java/net/runelite/mixins/RSClientMixin.java @@ -884,6 +884,29 @@ public abstract class RSClientMixin implements RSClient return client.getHintArrowTargetType() != HintArrowType.NONE.getValue(); } + @Inject + @Override + public HintArrowType getHintArrowType() + { + int type = client.getHintArrowTargetType(); + if (type == HintArrowType.NPC.getValue()) + { + return HintArrowType.NPC; + } + else if (type == HintArrowType.PLAYER.getValue()) + { + return HintArrowType.PLAYER; + } + else if (type == HintArrowType.WORLD_POSITION.getValue()) + { + return HintArrowType.WORLD_POSITION; + } + else + { + return HintArrowType.NONE; + } + } + @Inject @Override public void clearHintArrow() @@ -919,6 +942,60 @@ public abstract class RSClientMixin implements RSClient client.setHintArrowOffsetY(LOCAL_TILE_SIZE / 2); } + @Inject + @Override + public WorldPoint getHintArrowPoint() + { + if (getHintArrowType() == HintArrowType.WORLD_POSITION) + { + int x = client.getHintArrowX(); + int y = client.getHintArrowY(); + return new WorldPoint(x, y, client.getPlane()); + } + + return null; + } + + @Inject + @Override + public Player getHintArrowPlayer() + { + if (getHintArrowType() == HintArrowType.PLAYER) + { + int idx = client.getHintArrowPlayerTargetIdx(); + RSPlayer[] players = client.getCachedPlayers(); + + if (idx < 0 || idx >= players.length) + { + return null; + } + + return players[idx]; + } + + return null; + } + + @Inject + @Override + public NPC getHintArrowNpc() + { + if (getHintArrowType() == HintArrowType.NPC) + { + int idx = client.getHintArrowNpcTargetIdx(); + RSNPC[] npcs = client.getCachedNPCs(); + + if (idx < 0 || idx >= npcs.length) + { + return null; + } + + return npcs[idx]; + } + + return null; + } + @Copy("menuAction") static void rs$menuAction(int var0, int var1, int var2, int var3, String var4, String var5, int var6, int var7) {