diff --git a/runelite-api/src/main/java/net/runelite/api/Perspective.java b/runelite-api/src/main/java/net/runelite/api/Perspective.java index 5fa47381fd..bc1b52270f 100644 --- a/runelite-api/src/main/java/net/runelite/api/Perspective.java +++ b/runelite-api/src/main/java/net/runelite/api/Perspective.java @@ -218,6 +218,22 @@ public class Perspective return new Point(x, y); } + public static Point regionToWorld(Client client, Point point) + { + int baseX = client.getBaseX(); + int baseY = client.getBaseY(); + int x = point.getX() + baseX; + int y = point.getY() + baseY; + return new Point(x, y); + } + + public static Point regionToLocal(Client client, Point point) + { + int x = point.getX() << LOCAL_COORD_BITS; + int y = point.getY() << LOCAL_COORD_BITS; + return new Point(x, y); + } + /** * Calculates a tile polygon from offset worldToScreen() points. * diff --git a/runelite-api/src/main/java/net/runelite/api/Tile.java b/runelite-api/src/main/java/net/runelite/api/Tile.java index 58954c405a..ecb997db40 100644 --- a/runelite-api/src/main/java/net/runelite/api/Tile.java +++ b/runelite-api/src/main/java/net/runelite/api/Tile.java @@ -47,5 +47,7 @@ public interface Tile Point getWorldLocation(); + Point getRegionLocation(); + Point getLocalLocation(); } diff --git a/runelite-mixins/src/main/java/net/runelite/mixins/RSTileMixin.java b/runelite-mixins/src/main/java/net/runelite/mixins/RSTileMixin.java index 68d8e88990..df1a529667 100644 --- a/runelite-mixins/src/main/java/net/runelite/mixins/RSTileMixin.java +++ b/runelite-mixins/src/main/java/net/runelite/mixins/RSTileMixin.java @@ -24,26 +24,40 @@ */ package net.runelite.mixins; -import static net.runelite.api.Perspective.LOCAL_COORD_BITS; +import net.runelite.api.Perspective; import net.runelite.api.Point; import net.runelite.api.mixins.Inject; import net.runelite.api.mixins.Mixin; +import net.runelite.api.mixins.Shadow; +import net.runelite.rs.api.RSClient; import net.runelite.rs.api.RSTile; @Mixin(RSTile.class) public abstract class RSTileMixin implements RSTile { + @Shadow("clientInstance") + private static RSClient client; + @Inject @Override public Point getWorldLocation() { - return new Point(getLocalLocation().getX() << LOCAL_COORD_BITS, getLocalLocation().getX() << LOCAL_COORD_BITS); + Point regionLocation = getRegionLocation(); + return Perspective.regionToWorld(client, regionLocation); + } + + @Inject + @Override + public Point getRegionLocation() + { + return new Point(getX(), getY()); } @Inject @Override public Point getLocalLocation() { - return new Point(getX(), getY()); + Point regionLocation = getRegionLocation(); + return Perspective.regionToLocal(client, regionLocation); } }