Merge pull request #914 from Abextm/point

Type safe coordinates
This commit is contained in:
Adam
2018-03-09 23:07:57 -05:00
committed by GitHub
47 changed files with 550 additions and 286 deletions

View File

@@ -47,6 +47,11 @@
<artifactId>lombok</artifactId> <artifactId>lombok</artifactId>
<scope>provided</scope> <scope>provided</scope>
</dependency> </dependency>
<dependency>
<groupId>com.google.code.findbugs</groupId>
<artifactId>jsr305</artifactId>
<version>1.3.9</version>
</dependency>
<dependency> <dependency>
<groupId>junit</groupId> <groupId>junit</groupId>

View File

@@ -27,6 +27,8 @@ package net.runelite.api;
import java.awt.Graphics2D; import java.awt.Graphics2D;
import java.awt.Polygon; import java.awt.Polygon;
import java.awt.image.BufferedImage; import java.awt.image.BufferedImage;
import net.runelite.api.coords.LocalPoint;
import net.runelite.api.coords.WorldPoint;
public interface Actor extends Renderable public interface Actor extends Renderable
{ {
@@ -40,9 +42,9 @@ public interface Actor extends Renderable
int getHealth(); int getHealth();
Point getWorldLocation(); WorldPoint getWorldLocation();
Point getLocalLocation(); LocalPoint getLocalLocation();
int getOrientation(); int getOrientation();
@@ -62,8 +64,6 @@ public interface Actor extends Renderable
Point getMinimapLocation(); Point getMinimapLocation();
Point getRegionLocation();
/** /**
* Returns the logical height of the actor's model. This is roughly where the health bar is drawn. * Returns the logical height of the actor's model. This is roughly where the health bar is drawn.
*/ */

View File

@@ -28,6 +28,8 @@ import java.awt.Canvas;
import java.awt.Dimension; import java.awt.Dimension;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import javax.annotation.Nullable;
import net.runelite.api.coords.LocalPoint;
import net.runelite.api.widgets.Widget; import net.runelite.api.widgets.Widget;
import net.runelite.api.widgets.WidgetInfo; import net.runelite.api.widgets.WidgetInfo;
@@ -184,7 +186,8 @@ public interface Client extends GameEngine
SpritePixels createSpritePixels(int[] pixels, int width, int height); SpritePixels createSpritePixels(int[] pixels, int width, int height);
Point getSceneDestinationLocation(); @Nullable
LocalPoint getLocalDestinationLocation();
List<Projectile> getProjectiles(); List<Projectile> getProjectiles();

View File

@@ -34,6 +34,7 @@ import java.awt.image.BufferedImage;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import net.runelite.api.coords.LocalPoint;
import net.runelite.api.model.Jarvis; import net.runelite.api.model.Jarvis;
import net.runelite.api.model.Triangle; import net.runelite.api.model.Triangle;
import net.runelite.api.model.Vertex; import net.runelite.api.model.Vertex;
@@ -59,25 +60,6 @@ public class Perspective
} }
} }
/**
* Check if a world location is in the scene
* @param point world location
* @return
*/
public static boolean isWorldInScene(Client client, Point point)
{
int x = point.getX();
int y = point.getY();
int baseX = client.getBaseX();
int baseY = client.getBaseY();
int maxX = baseX + SCENE_SIZE;
int maxY = baseY + SCENE_SIZE;
return x >= baseX && x < maxX && y >= baseY && y < maxY;
}
/** /**
* Translates two-dimensional ground coordinates within the 3D world to * Translates two-dimensional ground coordinates within the 3D world to
* their corresponding coordinates on the game screen. * their corresponding coordinates on the game screen.
@@ -217,7 +199,7 @@ public class Perspective
{ {
int angle = client.getMapAngle() & 0x7FF; int angle = client.getMapAngle() & 0x7FF;
Point localLocation = client.getLocalPlayer().getLocalLocation(); LocalPoint localLocation = client.getLocalPlayer().getLocalLocation();
x = x / 32 - localLocation.getX() / 32; x = x / 32 - localLocation.getX() / 32;
y = y / 32 - localLocation.getY() / 32; y = y / 32 - localLocation.getY() / 32;
@@ -276,45 +258,6 @@ public class Perspective
return 0; return 0;
} }
public static Point worldToLocal(Client client, Point point)
{
if (!isWorldInScene(client, point))
{
return null;
}
int baseX = client.getBaseX();
int baseY = client.getBaseY();
int x = ((point.getX() - baseX) << LOCAL_COORD_BITS) + (1 << LOCAL_COORD_BITS - 1) - 1;
int y = ((point.getY() - baseY) << LOCAL_COORD_BITS) + (1 << LOCAL_COORD_BITS - 1) - 1;
return new Point(x, y);
}
public static Point localToWorld(Client client, Point point)
{
int x = (point.getX() >>> LOCAL_COORD_BITS) + client.getBaseX();
int y = (point.getY() >>> LOCAL_COORD_BITS) + client.getBaseY();
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. * Calculates a tile polygon from offset worldToScreen() points.
* *
@@ -323,7 +266,7 @@ public class Perspective
* @return a {@link Polygon} on screen corresponding to the given * @return a {@link Polygon} on screen corresponding to the given
* localLocation. * localLocation.
*/ */
public static Polygon getCanvasTilePoly(Client client, Point localLocation) public static Polygon getCanvasTilePoly(Client client, LocalPoint localLocation)
{ {
return getCanvasTileAreaPoly(client, localLocation, 1); return getCanvasTileAreaPoly(client, localLocation, 1);
} }
@@ -337,7 +280,7 @@ public class Perspective
* size = 3 * size = 3
* @return a polygon representing the tiles in the area * @return a polygon representing the tiles in the area
*/ */
public static Polygon getCanvasTileAreaPoly(Client client, Point localLocation, int size) public static Polygon getCanvasTileAreaPoly(Client client, LocalPoint localLocation, int size)
{ {
int plane = client.getPlane(); int plane = client.getPlane();
int halfTile = LOCAL_TILE_SIZE / 2; int halfTile = LOCAL_TILE_SIZE / 2;
@@ -386,7 +329,7 @@ public class Perspective
* @return a {@link Point} on screen corresponding to the given * @return a {@link Point} on screen corresponding to the given
* localLocation. * localLocation.
*/ */
public static Point getCanvasTextLocation(Client client, Graphics2D graphics, Point localLocation, String text, int zOffset) public static Point getCanvasTextLocation(Client client, Graphics2D graphics, LocalPoint localLocation, String text, int zOffset)
{ {
int plane = client.getPlane(); int plane = client.getPlane();
@@ -415,7 +358,7 @@ public class Perspective
* @return a {@link Point} on screen corresponding to the given * @return a {@link Point} on screen corresponding to the given
* localLocation. * localLocation.
*/ */
public static Point getCanvasImageLocation(Client client, Graphics2D graphics, Point localLocation, BufferedImage image, int zOffset) public static Point getCanvasImageLocation(Client client, Graphics2D graphics, LocalPoint localLocation, BufferedImage image, int zOffset)
{ {
int plane = client.getPlane(); int plane = client.getPlane();
@@ -441,7 +384,7 @@ public class Perspective
* @return a {@link Point} on screen corresponding to the given * @return a {@link Point} on screen corresponding to the given
* localLocation. * localLocation.
*/ */
public static Point getMiniMapImageLocation(Client client, Point localLocation, BufferedImage image) public static Point getMiniMapImageLocation(Client client, LocalPoint localLocation, BufferedImage image)
{ {
Point p = Perspective.worldToMiniMap(client, localLocation.getX(), localLocation.getY()); Point p = Perspective.worldToMiniMap(client, localLocation.getX(), localLocation.getY());
@@ -467,7 +410,7 @@ public class Perspective
* @return a {@link Point} on screen corresponding to the given * @return a {@link Point} on screen corresponding to the given
* localLocation. * localLocation.
*/ */
public static Point getCanvasSpriteLocation(Client client, Graphics2D graphics, Point localLocation, SpritePixels sprite, int zOffset) public static Point getCanvasSpriteLocation(Client client, Graphics2D graphics, LocalPoint localLocation, SpritePixels sprite, int zOffset)
{ {
int plane = client.getPlane(); int plane = client.getPlane();
@@ -713,7 +656,7 @@ public class Perspective
* @return a {@link Point} on screen corresponding to the given * @return a {@link Point} on screen corresponding to the given
* localLocation. * localLocation.
*/ */
public static Point getCanvasTextMiniMapLocation(Client client, Graphics2D graphics, Point localLocation, String text) public static Point getCanvasTextMiniMapLocation(Client client, Graphics2D graphics, LocalPoint localLocation, String text)
{ {
Point p = Perspective.worldToMiniMap(client, localLocation.getX(), localLocation.getY()); Point p = Perspective.worldToMiniMap(client, localLocation.getX(), localLocation.getY());

View File

@@ -1,39 +0,0 @@
/*
* Copyright (c) 2018 Abex
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice, this
* list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
* ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
package net.runelite.api;
import lombok.Value;
import net.runelite.api.Point;
@Value
public class Point3D
{
private final int X, Y, Z;
public Point toPoint()
{
return new Point(X, Y);
}
}

View File

@@ -24,6 +24,9 @@
*/ */
package net.runelite.api; package net.runelite.api;
import net.runelite.api.coords.LocalPoint;
import net.runelite.api.coords.WorldPoint;
public interface Tile public interface Tile
{ {
/** /**
@@ -45,11 +48,11 @@ public interface Tile
SceneTileModel getSceneTileModel(); SceneTileModel getSceneTileModel();
Point getWorldLocation(); WorldPoint getWorldLocation();
Point getRegionLocation(); Point getRegionLocation();
Point getLocalLocation(); LocalPoint getLocalLocation();
int getPlane(); int getPlane();
} }

View File

@@ -27,6 +27,8 @@ package net.runelite.api;
import java.awt.Graphics2D; import java.awt.Graphics2D;
import java.awt.Polygon; import java.awt.Polygon;
import java.awt.geom.Area; import java.awt.geom.Area;
import net.runelite.api.coords.LocalPoint;
import net.runelite.api.coords.WorldPoint;
public interface TileObject public interface TileObject
{ {
@@ -36,13 +38,13 @@ public interface TileObject
int getY(); int getY();
int getPlane();
int getId(); int getId();
Point getWorldLocation(); WorldPoint getWorldLocation();
Point getLocalLocation(); LocalPoint getLocalLocation();
Point getRegionLocation();
Point getCanvasLocation(); Point getCanvasLocation();

View File

@@ -0,0 +1,113 @@
/*
* Copyright (c) 2018 Abex
* Copyright (c) 2017, Adam <Adam@sigterm.info>
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice, this
* list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
* ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
package net.runelite.api.coords;
import javax.annotation.Nullable;
import lombok.Value;
import net.runelite.api.Client;
import net.runelite.api.Perspective;
/**
* A LocolPoint is a Two-Dimensional point in the local coordinate space. Because the local coordinate space moves,
* it is not safe to keep a LocalPoint after a loading zone. The unit is 1/128th of a Tile
*/
@Value
public class LocalPoint
{
private final int x, y;
/**
* Returns a LocalPoint of the center of the passed tile
*
* @return LocalPoint if in scene, otherwise null
*/
@Nullable
public static LocalPoint fromWorld(Client client, WorldPoint world)
{
if (client.getPlane() != world.getPlane())
{
return null;
}
return fromWorld(client, world.getX(), world.getY());
}
/**
* Returns a LocalPoint of the center of the passed tile
*
* @return LocalPoint if in scene, otherwise null
*/
public static LocalPoint fromWorld(Client client, int x, int y)
{
if (!WorldPoint.isInScene(client, x, y))
{
return null;
}
int baseX = client.getBaseX();
int baseY = client.getBaseY();
return fromRegion(x - baseX, y - baseY);
}
/**
* Find the distance from this point to another point
*
* @param other
* @return
*/
public int distanceTo(LocalPoint other)
{
return (int) Math.hypot(getX() - other.getX(), getY() - other.getY());
}
/**
* Returns a LocalPoint of the center of the passed tile
*/
public static LocalPoint fromRegion(int x, int y)
{
return new LocalPoint(
(x << Perspective.LOCAL_COORD_BITS) + (1 << Perspective.LOCAL_COORD_BITS - 1) - 1,
(y << Perspective.LOCAL_COORD_BITS) + (1 << Perspective.LOCAL_COORD_BITS - 1) - 1
);
}
/**
* Returns the X coordinate in Region space (tiles)
*/
public int getRegionX()
{
return x >>> Perspective.LOCAL_COORD_BITS;
}
/**
* Returns the Y coordinate in Region space (tiles)
*/
public int getRegionY()
{
return y >>> Perspective.LOCAL_COORD_BITS;
}
}

View File

@@ -0,0 +1,138 @@
/*
* Copyright (c) 2018 Abex
* Copyright (c) 2017, Adam <Adam@sigterm.info>
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice, this
* list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
* ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
package net.runelite.api.coords;
import lombok.Value;
import net.runelite.api.Client;
import net.runelite.api.Perspective;
import net.runelite.api.Point;
/**
* WorldPoint is a Three-Dimensional point representing the location of a Tile
*/
@Value
public class WorldPoint
{
/**
* The X coordinate of the Point.
* Units are in tiles
*/
private final int x;
/**
* The Y coordinate of the Point.
* Units are in tiles
*/
private final int y;
/**
* The plane coordinate of the Point.
*/
private final int plane;
public static boolean isInScene(Client client, int x, int y)
{
int baseX = client.getBaseX();
int baseY = client.getBaseY();
int maxX = baseX + Perspective.SCENE_SIZE;
int maxY = baseY + Perspective.SCENE_SIZE;
return x >= baseX && x < maxX && y >= baseY && y < maxY;
}
public boolean isInScene(Client client)
{
return client.getPlane() == plane && isInScene(client, x, y);
}
/**
* Returns a WorldPoint containing the passed LocalPoint
*/
public static WorldPoint fromLocal(Client client, LocalPoint local)
{
return fromLocal(client, local.getX(), local.getY(), client.getPlane());
}
/**
* Returns a WorldPoint containing the passed local coordinates
*/
public static WorldPoint fromLocal(Client client, int x, int y, int plane)
{
return new WorldPoint(
(x >>> Perspective.LOCAL_COORD_BITS) + client.getBaseX(),
(y >>> Perspective.LOCAL_COORD_BITS) + client.getBaseY(),
plane
);
}
/**
* Find the distance from this point to another point. Returns Integer.MAX_VALUE if other is on
* a different plane.
*
* @param other
* @return
*/
public int distanceTo(WorldPoint other)
{
if (other.plane != plane)
{
return Integer.MAX_VALUE;
}
return (int) Math.hypot(getX() - other.getX(), getY() - other.getY());
}
/**
* Find the distance from this point to another point.
*
* @param other
* @return
*/
public int distanceTo2D(WorldPoint other)
{
return (int) Math.hypot(getX() - other.getX(), getY() - other.getY());
}
/**
* Returns a WorldPoint from the passed region coords
*/
public static WorldPoint fromRegion(Client client, int x, int y, int plane)
{
return new WorldPoint(
x + client.getBaseX(),
y + client.getBaseY(),
plane
);
}
@Deprecated
public Point toPoint()
{
return new Point(x, y);
}
}

View File

@@ -25,13 +25,13 @@
package net.runelite.api.events; package net.runelite.api.events;
import lombok.Data; import lombok.Data;
import net.runelite.api.Point;
import net.runelite.api.Projectile; import net.runelite.api.Projectile;
import net.runelite.api.coords.LocalPoint;
@Data @Data
public class ProjectileMoved public class ProjectileMoved
{ {
private Projectile projectile; private Projectile projectile;
private Point position; private LocalPoint position;
private int plane; private int z;
} }

View File

@@ -26,8 +26,8 @@ package net.runelite.api.queries;
import static java.lang.Math.abs; import static java.lang.Math.abs;
import net.runelite.api.Actor; import net.runelite.api.Actor;
import net.runelite.api.Point;
import net.runelite.api.Query; import net.runelite.api.Query;
import net.runelite.api.coords.LocalPoint;
public abstract class ActorQuery<EntityType extends Actor, QueryType> extends Query<EntityType, QueryType> public abstract class ActorQuery<EntityType extends Actor, QueryType> extends Query<EntityType, QueryType>
{ {
@@ -68,7 +68,7 @@ public abstract class ActorQuery<EntityType extends Actor, QueryType> extends Qu
} }
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
public QueryType atLocalLocation(Point location) public QueryType atLocalLocation(LocalPoint location)
{ {
predicate = and(actor -> actor.getLocalLocation().equals(location)); predicate = and(actor -> actor.getLocalLocation().equals(location));
return (QueryType) this; return (QueryType) this;
@@ -96,18 +96,18 @@ public abstract class ActorQuery<EntityType extends Actor, QueryType> extends Qu
} }
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
public QueryType isWithinDistance(Point to, int distance) public QueryType isWithinDistance(LocalPoint to, int distance)
{ {
predicate = and(a -> a.getLocalLocation().distanceTo(to) <= distance); predicate = and(a -> a.getLocalLocation().distanceTo(to) <= distance);
return (QueryType) this; return (QueryType) this;
} }
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
public QueryType isWithinArea(Point from, int area) public QueryType isWithinArea(LocalPoint from, int area)
{ {
predicate = and(a -> predicate = and(a ->
{ {
Point localLocation = a.getLocalLocation(); LocalPoint localLocation = a.getLocalLocation();
return abs(localLocation.getX() - from.getX()) < area return abs(localLocation.getX() - from.getX()) < area
&& abs(localLocation.getY() - from.getY()) < area; && abs(localLocation.getY() - from.getY()) < area;
}); });

View File

@@ -26,7 +26,6 @@ package net.runelite.api.queries;
import static java.lang.Math.abs; import static java.lang.Math.abs;
import net.runelite.api.Client; import net.runelite.api.Client;
import net.runelite.api.Point;
import net.runelite.api.Query; import net.runelite.api.Query;
import net.runelite.api.Region; import net.runelite.api.Region;
import net.runelite.api.Tile; import net.runelite.api.Tile;
@@ -34,6 +33,8 @@ import net.runelite.api.TileObject;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import net.runelite.api.coords.LocalPoint;
import net.runelite.api.coords.WorldPoint;
public abstract class TileObjectQuery<EntityType extends TileObject, QueryType> extends Query<EntityType, QueryType> public abstract class TileObjectQuery<EntityType extends TileObject, QueryType> extends Query<EntityType, QueryType>
{ {
@@ -78,32 +79,32 @@ public abstract class TileObjectQuery<EntityType extends TileObject, QueryType>
} }
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
public QueryType atWorldLocation(Point location) public QueryType atWorldLocation(WorldPoint location)
{ {
predicate = and(object -> object.getWorldLocation().equals(location)); predicate = and(object -> object.getWorldLocation().equals(location));
return (QueryType) this; return (QueryType) this;
} }
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
public QueryType atLocalLocation(Point location) public QueryType atLocalLocation(LocalPoint location)
{ {
predicate = and(object -> object.getLocalLocation().equals(location)); predicate = and(object -> object.getLocalLocation().equals(location));
return (QueryType) this; return (QueryType) this;
} }
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
public QueryType isWithinDistance(Point to, int distance) public QueryType isWithinDistance(LocalPoint to, int distance)
{ {
predicate = and(a -> a.getLocalLocation().distanceTo(to) <= distance); predicate = and(a -> a.getLocalLocation().distanceTo(to) <= distance);
return (QueryType) this; return (QueryType) this;
} }
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
public QueryType isWithinArea(Point from, int area) public QueryType isWithinArea(LocalPoint from, int area)
{ {
predicate = and(a -> predicate = and(a ->
{ {
Point localLocation = a.getLocalLocation(); LocalPoint localLocation = a.getLocalLocation();
return abs(localLocation.getX() - from.getX()) < area return abs(localLocation.getX() - from.getX()) < area
&& abs(localLocation.getY() - from.getY()) < area; && abs(localLocation.getY() - from.getY()) < area;
}); });

View File

@@ -40,12 +40,12 @@ import net.runelite.api.MainBufferProvider;
import net.runelite.api.MenuAction; import net.runelite.api.MenuAction;
import net.runelite.api.MessageNode; import net.runelite.api.MessageNode;
import net.runelite.api.PacketBuffer; import net.runelite.api.PacketBuffer;
import net.runelite.api.Point;
import net.runelite.api.Projectile; import net.runelite.api.Projectile;
import net.runelite.api.Region; import net.runelite.api.Region;
import net.runelite.api.RenderOverview; import net.runelite.api.RenderOverview;
import net.runelite.api.TextureProvider; import net.runelite.api.TextureProvider;
import net.runelite.api.WorldMapManager; import net.runelite.api.WorldMapManager;
import net.runelite.api.coords.LocalPoint;
import net.runelite.api.events.ChatMessage; import net.runelite.api.events.ChatMessage;
import net.runelite.api.events.GameTick; import net.runelite.api.events.GameTick;
import net.runelite.api.events.MenuEntryAdded; import net.runelite.api.events.MenuEntryAdded;
@@ -372,11 +372,11 @@ public class Hooks
*/ */
public static void projectileMoved(Projectile projectile, int targetX, int targetY, int targetZ, int cycle) public static void projectileMoved(Projectile projectile, int targetX, int targetY, int targetZ, int cycle)
{ {
Point position = new Point(targetX, targetY); LocalPoint position = new LocalPoint(targetX, targetY);
ProjectileMoved projectileMoved = new ProjectileMoved(); ProjectileMoved projectileMoved = new ProjectileMoved();
projectileMoved.setProjectile(projectile); projectileMoved.setProjectile(projectile);
projectileMoved.setPosition(position); projectileMoved.setPosition(position);
projectileMoved.setPlane(targetZ); projectileMoved.setZ(targetZ);
eventBus.post(projectileMoved); eventBus.post(projectileMoved);
} }

View File

@@ -32,6 +32,7 @@ import javax.inject.Inject;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import net.runelite.api.Client; import net.runelite.api.Client;
import net.runelite.api.Point; import net.runelite.api.Point;
import net.runelite.api.coords.LocalPoint;
import net.runelite.client.ui.overlay.Overlay; import net.runelite.client.ui.overlay.Overlay;
import net.runelite.client.ui.overlay.OverlayLayer; import net.runelite.client.ui.overlay.OverlayLayer;
import net.runelite.client.ui.overlay.OverlayPosition; import net.runelite.client.ui.overlay.OverlayPosition;
@@ -56,7 +57,7 @@ public class AgilityOverlay extends Overlay
@Override @Override
public Dimension render(Graphics2D graphics, java.awt.Point parent) public Dimension render(Graphics2D graphics, java.awt.Point parent)
{ {
Point playerLocation = client.getLocalPlayer().getLocalLocation(); LocalPoint playerLocation = client.getLocalPlayer().getLocalLocation();
Point mousePosition = client.getMouseCanvasPosition(); Point mousePosition = client.getMouseCanvasPosition();
plugin.getObstacles().forEach((object, tile) -> plugin.getObstacles().forEach((object, tile) ->
{ {

View File

@@ -25,25 +25,21 @@
package net.runelite.client.plugins.barrows; package net.runelite.client.plugins.barrows;
import lombok.Getter; import lombok.Getter;
import net.runelite.api.Point; import lombok.RequiredArgsConstructor;
import net.runelite.api.coords.WorldPoint;
@RequiredArgsConstructor
public enum BarrowsBrothers public enum BarrowsBrothers
{ {
VERAC("V", new Point(3557, 3298)), VERAC("V", new WorldPoint(3557, 3298, 0)),
DHAROK("D", new Point(3575, 3298)), DHAROK("D", new WorldPoint(3575, 3298, 0)),
AHRIM("A", new Point(3566, 3289)), AHRIM("A", new WorldPoint(3566, 3289, 0)),
TORAG("T", new Point(3553, 3283)), TORAG("T", new WorldPoint(3553, 3283, 0)),
KARIL("K", new Point(3566, 3275)), KARIL("K", new WorldPoint(3566, 3275, 0)),
GUTHAN("G", new Point(3577, 3283)); GUTHAN("G", new WorldPoint(3577, 3283, 0));
@Getter @Getter
private final String name; private final String name;
@Getter @Getter
private final Point location; private final WorldPoint location;
BarrowsBrothers(String name, net.runelite.api.Point location)
{
this.name = name;
this.location = location;
}
} }

View File

@@ -37,6 +37,7 @@ import net.runelite.api.ObjectComposition;
import net.runelite.api.Perspective; import net.runelite.api.Perspective;
import net.runelite.api.Player; import net.runelite.api.Player;
import net.runelite.api.WallObject; import net.runelite.api.WallObject;
import net.runelite.api.coords.LocalPoint;
import net.runelite.client.ui.overlay.Overlay; import net.runelite.client.ui.overlay.Overlay;
import net.runelite.client.ui.overlay.OverlayLayer; import net.runelite.client.ui.overlay.OverlayLayer;
import net.runelite.client.ui.overlay.OverlayPosition; import net.runelite.client.ui.overlay.OverlayPosition;
@@ -94,12 +95,12 @@ class BarrowsOverlay extends Overlay
return null; return null;
} }
private void renderObjects(Graphics2D graphics, Player local) private void renderObjects(Graphics2D graphics, Player localPlayer)
{ {
net.runelite.api.Point localLocation = local.getLocalLocation(); LocalPoint localLocation = localPlayer.getLocalLocation();
for (WallObject wall : plugin.getWalls()) for (WallObject wall : plugin.getWalls())
{ {
net.runelite.api.Point location = wall.getLocalLocation(); LocalPoint location = wall.getLocalLocation();
if (localLocation.distanceTo(location) <= MAX_DISTANCE) if (localLocation.distanceTo(location) <= MAX_DISTANCE)
{ {
renderWalls(graphics, wall); renderWalls(graphics, wall);
@@ -108,7 +109,7 @@ class BarrowsOverlay extends Overlay
for (GameObject ladder : plugin.getLadders()) for (GameObject ladder : plugin.getLadders())
{ {
net.runelite.api.Point location = ladder.getLocalLocation(); LocalPoint location = ladder.getLocalLocation();
if (localLocation.distanceTo(location) <= MAX_DISTANCE) if (localLocation.distanceTo(location) <= MAX_DISTANCE)
{ {
renderLadders(graphics, ladder); renderLadders(graphics, ladder);
@@ -162,15 +163,15 @@ class BarrowsOverlay extends Overlay
{ {
for (BarrowsBrothers brother : BarrowsBrothers.values()) for (BarrowsBrothers brother : BarrowsBrothers.values())
{ {
net.runelite.api.Point location = brother.getLocation(); LocalPoint localLocation = LocalPoint.fromWorld(client, brother.getLocation());
if (!Perspective.isWorldInScene(client, location)) if (localLocation == null)
{ {
continue; continue;
} }
net.runelite.api.Point minimapText = Perspective.getCanvasTextMiniMapLocation(client, graphics, net.runelite.api.Point minimapText = Perspective.getCanvasTextMiniMapLocation(client, graphics,
Perspective.worldToLocal(client, brother.getLocation()), brother.getName()); localLocation, brother.getName());
if (minimapText != null) if (minimapText != null)
{ {

View File

@@ -32,6 +32,7 @@ import javax.inject.Inject;
import net.runelite.api.Client; import net.runelite.api.Client;
import net.runelite.api.GameObject; import net.runelite.api.GameObject;
import net.runelite.api.Point; import net.runelite.api.Point;
import net.runelite.api.coords.LocalPoint;
import net.runelite.client.ui.overlay.Overlay; import net.runelite.client.ui.overlay.Overlay;
import net.runelite.client.ui.overlay.OverlayPosition; import net.runelite.client.ui.overlay.OverlayPosition;
@@ -60,12 +61,12 @@ class ConveyorBeltOverlay extends Overlay
return null; return null;
} }
Point localLocation = client.getLocalPlayer().getLocalLocation(); LocalPoint localLocation = client.getLocalPlayer().getLocalLocation();
Point mousePosition = client.getMouseCanvasPosition(); Point mousePosition = client.getMouseCanvasPosition();
GameObject object = plugin.getConveyorBelt(); GameObject object = plugin.getConveyorBelt();
Point location = object.getLocalLocation(); LocalPoint location = object.getLocalLocation();
if (localLocation.distanceTo(location) <= MAX_DISTANCE) if (localLocation.distanceTo(location) <= MAX_DISTANCE)
{ {
Area objectClickbox = object.getClickbox(); Area objectClickbox = object.getClickbox();

View File

@@ -33,6 +33,7 @@ import net.runelite.api.Client;
import net.runelite.api.Perspective; import net.runelite.api.Perspective;
import static net.runelite.api.Perspective.LOCAL_TILE_SIZE; import static net.runelite.api.Perspective.LOCAL_TILE_SIZE;
import net.runelite.api.Point; import net.runelite.api.Point;
import net.runelite.api.coords.LocalPoint;
import net.runelite.client.ui.overlay.Overlay; import net.runelite.client.ui.overlay.Overlay;
import net.runelite.client.ui.overlay.OverlayPosition; import net.runelite.client.ui.overlay.OverlayPosition;
import net.runelite.client.ui.overlay.OverlayPriority; import net.runelite.client.ui.overlay.OverlayPriority;
@@ -66,19 +67,14 @@ class CannonOverlay extends Overlay
return null; return null;
} }
if (!Perspective.isWorldInScene(client, plugin.getCannonPosition())) LocalPoint cannonPoint = LocalPoint.fromWorld(client, plugin.getCannonPosition());
{
return null;
}
Point cannonPoint = Perspective.worldToLocal(client, plugin.getCannonPosition());
if (cannonPoint == null) if (cannonPoint == null)
{ {
return null; return null;
} }
Point localLocation = client.getLocalPlayer().getLocalLocation(); LocalPoint localLocation = client.getLocalPlayer().getLocalLocation();
if (localLocation.distanceTo(cannonPoint) <= MAX_DISTANCE) if (localLocation.distanceTo(cannonPoint) <= MAX_DISTANCE)
{ {
@@ -110,7 +106,7 @@ class CannonOverlay extends Overlay
* Draw the double hit spots on a 6 by 6 grid around the cannon * Draw the double hit spots on a 6 by 6 grid around the cannon
* @param startTile The position of the cannon * @param startTile The position of the cannon
*/ */
private void drawDoubleHitSpots(Graphics2D graphics, net.runelite.api.Point startTile, Color color) private void drawDoubleHitSpots(Graphics2D graphics, LocalPoint startTile, Color color)
{ {
for (int x = -3; x <= 3; x++) for (int x = -3; x <= 3; x++)
{ {
@@ -130,7 +126,7 @@ class CannonOverlay extends Overlay
int xPos = startTile.getX() - (x * LOCAL_TILE_SIZE); int xPos = startTile.getX() - (x * LOCAL_TILE_SIZE);
int yPos = startTile.getY() - (y * LOCAL_TILE_SIZE); int yPos = startTile.getY() - (y * LOCAL_TILE_SIZE);
net.runelite.api.Point marker = new net.runelite.api.Point(xPos, yPos); LocalPoint marker = new LocalPoint(xPos, yPos);
Polygon poly = Perspective.getCanvasTilePoly(client, marker); Polygon poly = Perspective.getCanvasTilePoly(client, marker);
if (poly == null) if (poly == null)

View File

@@ -37,11 +37,11 @@ import net.runelite.api.Client;
import net.runelite.api.GameObject; import net.runelite.api.GameObject;
import net.runelite.api.ItemID; import net.runelite.api.ItemID;
import static net.runelite.api.ObjectID.CANNON_BASE; import static net.runelite.api.ObjectID.CANNON_BASE;
import net.runelite.api.Perspective;
import net.runelite.api.Player; import net.runelite.api.Player;
import net.runelite.api.Projectile; import net.runelite.api.Projectile;
import static net.runelite.api.ProjectileID.CANNONBALL; import static net.runelite.api.ProjectileID.CANNONBALL;
import static net.runelite.api.ProjectileID.GRANITE_CANNONBALL; import static net.runelite.api.ProjectileID.GRANITE_CANNONBALL;
import net.runelite.api.coords.WorldPoint;
import net.runelite.api.events.ChatMessage; import net.runelite.api.events.ChatMessage;
import net.runelite.api.events.ConfigChanged; import net.runelite.api.events.ConfigChanged;
import net.runelite.api.events.GameObjectSpawned; import net.runelite.api.events.GameObjectSpawned;
@@ -71,7 +71,7 @@ public class CannonPlugin extends Plugin
private boolean cannonPlaced; private boolean cannonPlaced;
@Getter @Getter
private net.runelite.api.Point cannonPosition; private WorldPoint cannonPosition;
@Getter @Getter
private GameObject cannon; private GameObject cannon;
@@ -159,7 +159,7 @@ public class CannonPlugin extends Plugin
if ((projectile.getId() == CANNONBALL || projectile.getId() == GRANITE_CANNONBALL) && cannonPosition != null) if ((projectile.getId() == CANNONBALL || projectile.getId() == GRANITE_CANNONBALL) && cannonPosition != null)
{ {
net.runelite.api.Point projectileLoc = Perspective.localToWorld(client, new net.runelite.api.Point(projectile.getX1(), projectile.getY1())); WorldPoint projectileLoc = WorldPoint.fromLocal(client, projectile.getX1(), projectile.getY1(), client.getPlane());
//Check to see if projectile x,y is 0 else it will continuously decrease while ball is flying. //Check to see if projectile x,y is 0 else it will continuously decrease while ball is flying.
if (projectileLoc.equals(cannonPosition) && projectile.getX() == 0 && projectile.getY() == 0) if (projectileLoc.equals(cannonPosition) && projectile.getX() == 0 && projectile.getY() == 0)

View File

@@ -25,7 +25,6 @@
*/ */
package net.runelite.client.plugins.devtools; package net.runelite.client.plugins.devtools;
import java.awt.BasicStroke;
import java.awt.Color; import java.awt.Color;
import java.awt.Dimension; import java.awt.Dimension;
import java.awt.Font; import java.awt.Font;
@@ -52,6 +51,7 @@ import net.runelite.api.Projectile;
import net.runelite.api.Region; import net.runelite.api.Region;
import net.runelite.api.Tile; import net.runelite.api.Tile;
import net.runelite.api.WallObject; import net.runelite.api.WallObject;
import net.runelite.api.coords.LocalPoint;
import net.runelite.api.widgets.Widget; import net.runelite.api.widgets.Widget;
import net.runelite.api.widgets.WidgetInfo; import net.runelite.api.widgets.WidgetInfo;
import net.runelite.api.widgets.WidgetItem; import net.runelite.api.widgets.WidgetItem;
@@ -341,7 +341,7 @@ public class DevToolsOverlay extends Overlay
int originX = projectile.getX1(); int originX = projectile.getX1();
int originY = projectile.getY1(); int originY = projectile.getY1();
net.runelite.api.Point tilePoint = new net.runelite.api.Point(originX, originY); LocalPoint tilePoint = new LocalPoint(originX, originY);
Polygon poly = Perspective.getCanvasTilePoly(client, tilePoint); Polygon poly = Perspective.getCanvasTilePoly(client, tilePoint);
if (poly != null) if (poly != null)
@@ -372,17 +372,6 @@ public class DevToolsOverlay extends Overlay
} }
} }
public void renderProjectileOrigin(Graphics2D graphics, Projectile projectile, int floor, net.runelite.api.Point origin)
{
Polygon poly = Perspective.getCanvasTilePoly(client, origin);
graphics.setColor(Color.RED);
graphics.setStroke(new BasicStroke(2));
graphics.drawPolygon(poly);
graphics.setColor(Color.RED);
graphics.fillPolygon(poly);
}
public void renderWidgets(Graphics2D graphics) public void renderWidgets(Graphics2D graphics)
{ {
Widget widget = plugin.currentWidget; Widget widget = plugin.currentWidget;

View File

@@ -28,7 +28,7 @@ import java.awt.Dimension;
import java.awt.Graphics2D; import java.awt.Graphics2D;
import javax.inject.Inject; import javax.inject.Inject;
import net.runelite.api.Client; import net.runelite.api.Client;
import net.runelite.api.Point; import net.runelite.api.coords.WorldPoint;
import net.runelite.client.ui.overlay.Overlay; import net.runelite.client.ui.overlay.Overlay;
import net.runelite.client.ui.overlay.OverlayPosition; import net.runelite.client.ui.overlay.OverlayPosition;
import net.runelite.client.ui.overlay.components.PanelComponent; import net.runelite.client.ui.overlay.components.PanelComponent;
@@ -58,7 +58,7 @@ public class LocationOverlay extends Overlay
panelComponent = new PanelComponent(); panelComponent = new PanelComponent();
Point localWorld = client.getLocalPlayer().getWorldLocation(); WorldPoint localWorld = client.getLocalPlayer().getWorldLocation();
panelComponent.getLines().add(new PanelComponent.Line( panelComponent.getLines().add(new PanelComponent.Line(
"Tile", "Tile",

View File

@@ -47,6 +47,7 @@ import net.runelite.api.Player;
import net.runelite.api.Point; import net.runelite.api.Point;
import net.runelite.api.Region; import net.runelite.api.Region;
import net.runelite.api.Tile; import net.runelite.api.Tile;
import net.runelite.api.coords.LocalPoint;
import net.runelite.client.game.ItemManager; import net.runelite.client.game.ItemManager;
import net.runelite.client.ui.FontManager; import net.runelite.client.ui.FontManager;
import net.runelite.client.ui.overlay.Overlay; import net.runelite.client.ui.overlay.Overlay;
@@ -122,13 +123,13 @@ public class GroundItemsOverlay extends Overlay
graphics.setFont(FontManager.getRunescapeSmallFont()); graphics.setFont(FontManager.getRunescapeSmallFont());
int z = client.getPlane(); int z = client.getPlane();
Point from = player.getRegionLocation(); LocalPoint from = player.getLocalLocation();
int lowerX = max(0, from.getX() - MAX_RANGE); int lowerX = max(0, from.getRegionX() - MAX_RANGE);
int lowerY = max(0, from.getY() - MAX_RANGE); int lowerY = max(0, from.getRegionY() - MAX_RANGE);
int upperX = min(from.getX() + MAX_RANGE, REGION_SIZE - 1); int upperX = min(from.getRegionX() + MAX_RANGE, REGION_SIZE - 1);
int upperY = min(from.getY() + MAX_RANGE, REGION_SIZE - 1); int upperY = min(from.getRegionY() + MAX_RANGE, REGION_SIZE - 1);
for (int x = lowerX; x <= upperX; ++x) for (int x = lowerX; x <= upperX; ++x)
{ {

View File

@@ -39,7 +39,7 @@ import net.runelite.api.Client;
import net.runelite.api.GameObject; import net.runelite.api.GameObject;
import net.runelite.api.ObjectID; import net.runelite.api.ObjectID;
import net.runelite.api.Player; import net.runelite.api.Player;
import net.runelite.api.Point; import net.runelite.api.coords.WorldPoint;
import net.runelite.api.events.ConfigChanged; import net.runelite.api.events.ConfigChanged;
import net.runelite.api.events.GameObjectSpawned; import net.runelite.api.events.GameObjectSpawned;
import net.runelite.api.events.GameTick; import net.runelite.api.events.GameTick;
@@ -321,7 +321,7 @@ public class HunterPlugin extends Plugin
*/ */
private HunterTrap getTrapFromCollection(GameObject gameObject) private HunterTrap getTrapFromCollection(GameObject gameObject)
{ {
final Point gameObjectLocation = gameObject.getWorldLocation(); final WorldPoint gameObjectLocation = gameObject.getWorldLocation();
for (HunterTrap trap : traps) for (HunterTrap trap : traps)
{ {

View File

@@ -32,6 +32,7 @@ import java.awt.Point;
import java.awt.geom.Arc2D; import java.awt.geom.Arc2D;
import javax.inject.Inject; import javax.inject.Inject;
import net.runelite.api.Client; import net.runelite.api.Client;
import net.runelite.api.coords.LocalPoint;
import net.runelite.client.ui.overlay.Overlay; import net.runelite.client.ui.overlay.Overlay;
import net.runelite.client.ui.overlay.OverlayLayer; import net.runelite.client.ui.overlay.OverlayLayer;
import net.runelite.client.ui.overlay.OverlayPosition; import net.runelite.client.ui.overlay.OverlayPosition;
@@ -108,10 +109,10 @@ public class TrapOverlay extends Overlay
*/ */
private void drawTraps(Graphics2D graphics) private void drawTraps(Graphics2D graphics)
{ {
net.runelite.api.Point localLocation = client.getLocalPlayer().getLocalLocation(); LocalPoint localLocation = client.getLocalPlayer().getLocalLocation();
for (HunterTrap trap : plugin.getTraps()) for (HunterTrap trap : plugin.getTraps())
{ {
net.runelite.api.Point trapLocation = trap.getGameObject().getLocalLocation(); LocalPoint trapLocation = trap.getGameObject().getLocalLocation();
if (trapLocation != null && localLocation.distanceTo(trapLocation) <= MAX_DISTANCE) if (trapLocation != null && localLocation.distanceTo(trapLocation) <= MAX_DISTANCE)
{ {
switch (trap.getState()) switch (trap.getState())

View File

@@ -42,6 +42,7 @@ import net.runelite.api.SceneTilePaint;
import net.runelite.api.SpritePixels; import net.runelite.api.SpritePixels;
import net.runelite.api.Tile; import net.runelite.api.Tile;
import net.runelite.api.WallObject; import net.runelite.api.WallObject;
import net.runelite.api.coords.LocalPoint;
import net.runelite.api.events.GameStateChanged; import net.runelite.api.events.GameStateChanged;
import net.runelite.api.events.MapRegionChanged; import net.runelite.api.events.MapRegionChanged;
import static net.runelite.client.plugins.instancemap.PixelMaps.ALL; import static net.runelite.client.plugins.instancemap.PixelMaps.ALL;
@@ -220,13 +221,14 @@ class InstanceMapOverlay extends Overlay
*/ */
private void drawPlayerDot(Graphics2D graphics, Player player, Color dotColor, Color outlineColor) private void drawPlayerDot(Graphics2D graphics, Player player, Color dotColor, Color outlineColor)
{ {
Point playerLocation = player.getRegionLocation(); LocalPoint playerLoc = player.getLocalLocation();
Tile[][] tiles = getTiles(); Tile[][] tiles = getTiles();
Point localPlayerPoint = new Point(playerLocation.getX(), (tiles[0].length - 1) - playerLocation.getY()); // flip the y value int tileX = playerLoc.getRegionX();
int tileY = (tiles[0].length - 1) - playerLoc.getRegionY(); // flip the y value
int x = OVERLAY_POSITION.getX() + (int) (localPlayerPoint.getX() * TILE_SIZE * MAP_SCALING); int x = OVERLAY_POSITION.getX() + (int) (tileX * TILE_SIZE * MAP_SCALING);
int y = OVERLAY_POSITION.getY() + (int) (localPlayerPoint.getY() * TILE_SIZE * MAP_SCALING); int y = OVERLAY_POSITION.getY() + (int) (tileY * TILE_SIZE * MAP_SCALING);
graphics.setColor(dotColor); graphics.setColor(dotColor);
graphics.fillRect(x, y, PLAYER_MARKER_SIZE, PLAYER_MARKER_SIZE);//draw the players point on the map graphics.fillRect(x, y, PLAYER_MARKER_SIZE, PLAYER_MARKER_SIZE);//draw the players point on the map
graphics.setColor(outlineColor); graphics.setColor(outlineColor);

View File

@@ -30,18 +30,18 @@ import java.util.List;
import java.util.Set; import java.util.Set;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import lombok.Getter; import lombok.Getter;
import net.runelite.api.Point3D; import net.runelite.api.coords.WorldPoint;
class Bookcase class Bookcase
{ {
public Bookcase(Point3D location) public Bookcase(WorldPoint location)
{ {
this.location = location; this.location = location;
this.index = new ArrayList<>(); this.index = new ArrayList<>();
} }
@Getter @Getter
private final Point3D location; private final WorldPoint location;
@Getter @Getter
private final List<Integer> index; private final List<Integer> index;
@@ -99,7 +99,7 @@ class Bookcase
b.append(" "); b.append(" ");
switch (location.getZ()) switch (location.getPlane())
{ {
case 0: case 0:
b.append("ground floor"); b.append("ground floor");

View File

@@ -40,7 +40,8 @@ import net.runelite.api.Client;
import net.runelite.api.Perspective; import net.runelite.api.Perspective;
import net.runelite.api.Player; import net.runelite.api.Player;
import net.runelite.api.Point; import net.runelite.api.Point;
import net.runelite.api.Point3D; import net.runelite.api.coords.LocalPoint;
import net.runelite.api.coords.WorldPoint;
import net.runelite.client.ui.overlay.Overlay; import net.runelite.client.ui.overlay.Overlay;
import net.runelite.client.ui.overlay.OverlayLayer; import net.runelite.client.ui.overlay.OverlayLayer;
import net.runelite.client.ui.overlay.OverlayPosition; import net.runelite.client.ui.overlay.OverlayPosition;
@@ -50,7 +51,7 @@ import static net.runelite.api.Perspective.getCanvasTilePoly;
public class KourendLibraryOverlay extends Overlay public class KourendLibraryOverlay extends Overlay
{ {
private final static Point LIBRARY_CENTER = new Point(1632, 3807); private final static WorldPoint LIBRARY_CENTER = new WorldPoint(1632, 3807, 1);
private final static int MAXIMUM_DISTANCE = 24; private final static int MAXIMUM_DISTANCE = 24;
private final static int ROUGH_ENABLE_DISTANCE = 45; private final static int ROUGH_ENABLE_DISTANCE = 45;
@@ -76,9 +77,9 @@ public class KourendLibraryOverlay extends Overlay
return null; return null;
} }
Point playerLoc = player.getWorldLocation(); WorldPoint playerLoc = player.getWorldLocation();
if (playerLoc.distanceTo(LIBRARY_CENTER) > ROUGH_ENABLE_DISTANCE) if (playerLoc.distanceTo2D(LIBRARY_CENTER) > ROUGH_ENABLE_DISTANCE)
{ {
return null; return null;
} }
@@ -93,15 +94,15 @@ public class KourendLibraryOverlay extends Overlay
for (Bookcase bookcase : allBookcases) for (Bookcase bookcase : allBookcases)
{ {
// AABB // AABB
Point3D caseLoc = bookcase.getLocation(); WorldPoint caseLoc = bookcase.getLocation();
if (Math.abs(playerLoc.getX() - caseLoc.getX()) > MAXIMUM_DISTANCE if (Math.abs(playerLoc.getX() - caseLoc.getX()) > MAXIMUM_DISTANCE
|| Math.abs(playerLoc.getY() - caseLoc.getY()) > MAXIMUM_DISTANCE) || Math.abs(playerLoc.getY() - caseLoc.getY()) > MAXIMUM_DISTANCE)
{ {
continue; continue;
} }
Point localBookcase = Perspective.worldToLocal(client, caseLoc.toPoint()); LocalPoint localBookcase = LocalPoint.fromWorld(client, caseLoc);
Point screenBookcase = Perspective.worldToCanvas(client, localBookcase.getX(), localBookcase.getY(), caseLoc.getZ(), 25); Point screenBookcase = Perspective.worldToCanvas(client, localBookcase.getX(), localBookcase.getY(), caseLoc.getPlane(), 25);
if (screenBookcase != null) if (screenBookcase != null)
{ {
@@ -211,7 +212,7 @@ public class KourendLibraryOverlay extends Overlay
.forEach(n -> .forEach(n ->
{ {
Book b = library.getCustomerBook(); Book b = library.getCustomerBook();
Point local = n.getLocalLocation(); LocalPoint local = n.getLocalLocation();
Polygon poly = getCanvasTilePoly(client, local); Polygon poly = getCanvasTilePoly(client, local);
OverlayUtil.renderPolygon(g, poly, Color.WHITE); OverlayUtil.renderPolygon(g, poly, Color.WHITE);
Point screen = Perspective.worldToCanvas(client, local.getX(), local.getY(), client.getPlane(), n.getLogicalHeight()); Point screen = Perspective.worldToCanvas(client, local.getX(), local.getY(), client.getPlane(), n.getLogicalHeight());

View File

@@ -35,9 +35,7 @@ import net.runelite.api.AnimationID;
import net.runelite.api.ChatMessageType; import net.runelite.api.ChatMessageType;
import net.runelite.api.Client; import net.runelite.api.Client;
import net.runelite.api.MenuAction; import net.runelite.api.MenuAction;
import net.runelite.api.Perspective; import net.runelite.api.coords.WorldPoint;
import net.runelite.api.Point;
import net.runelite.api.Point3D;
import net.runelite.api.events.AnimationChanged; import net.runelite.api.events.AnimationChanged;
import net.runelite.api.events.ChatMessage; import net.runelite.api.events.ChatMessage;
import net.runelite.api.events.GameTick; import net.runelite.api.events.GameTick;
@@ -73,8 +71,8 @@ public class KourendLibraryPlugin extends Plugin
private KourendLibraryPanel panel; private KourendLibraryPanel panel;
private NavigationButton navButton; private NavigationButton navButton;
private Point3D lastBookcaseClick = null; private WorldPoint lastBookcaseClick = null;
private Point3D lastBookcaseAnimatedOn = null; private WorldPoint lastBookcaseAnimatedOn = null;
@Override @Override
protected void startUp() throws Exception protected void startUp() throws Exception
@@ -114,8 +112,7 @@ public class KourendLibraryPlugin extends Plugin
{ {
if (MenuAction.GAME_OBJECT_FIRST_OPTION == menuOpt.getMenuAction() && menuOpt.getMenuTarget().contains("Bookshelf")) if (MenuAction.GAME_OBJECT_FIRST_OPTION == menuOpt.getMenuAction() && menuOpt.getMenuTarget().contains("Bookshelf"))
{ {
Point worldPoint = Perspective.regionToWorld(client, new Point(menuOpt.getId() & 127, menuOpt.getId() >> 7 & 127)); lastBookcaseClick = WorldPoint.fromLocal(client, menuOpt.getId() & 127, menuOpt.getId() >> 7 & 127, client.getPlane());
lastBookcaseClick = new Point3D(worldPoint.getX(), worldPoint.getY(), client.getPlane());
} }
} }

View File

@@ -35,7 +35,7 @@ import java.util.stream.IntStream;
import javax.inject.Singleton; import javax.inject.Singleton;
import lombok.Getter; import lombok.Getter;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import net.runelite.api.Point3D; import net.runelite.api.coords.WorldPoint;
import static net.runelite.client.plugins.kourendlibrary.Book.*; import static net.runelite.client.plugins.kourendlibrary.Book.*;
@@ -59,7 +59,7 @@ import static net.runelite.client.plugins.kourendlibrary.Book.*;
@Slf4j @Slf4j
public class Library public class Library
{ {
private final Map<Point3D, Bookcase> byPoint = new HashMap<>(); private final Map<WorldPoint, Bookcase> byPoint = new HashMap<>();
private final Map<Integer, ArrayList<Bookcase>> byLevel = new HashMap<>(); private final Map<Integer, ArrayList<Bookcase>> byLevel = new HashMap<>();
private final List<Bookcase> byIndex = new ArrayList<>(); private final List<Bookcase> byIndex = new ArrayList<>();
@@ -110,7 +110,7 @@ public class Library
log.info("Library is now reset"); log.info("Library is now reset");
} }
public synchronized void mark(Point3D loc, Book book) public synchronized void mark(WorldPoint loc, Book book)
{ {
Bookcase bookcase = byPoint.get(loc); Bookcase bookcase = byPoint.get(loc);
if (bookcase == null) if (bookcase == null)
@@ -428,7 +428,7 @@ public class Library
private void add(int x, int y, int z, int i) private void add(int x, int y, int z, int i)
{ {
// 'i' is added as a parameter for readability // 'i' is added as a parameter for readability
Point3D p = new Point3D(x, y, z); WorldPoint p = new WorldPoint(x, y, z);
Bookcase b = byPoint.get(p); Bookcase b = byPoint.get(p);
if (b == null) if (b == null)
{ {

View File

@@ -38,6 +38,7 @@ import net.runelite.api.Player;
import net.runelite.api.Point; import net.runelite.api.Point;
import net.runelite.api.Skill; import net.runelite.api.Skill;
import net.runelite.api.WallObject; import net.runelite.api.WallObject;
import net.runelite.api.coords.LocalPoint;
import net.runelite.client.game.SkillIconManager; import net.runelite.client.game.SkillIconManager;
import net.runelite.client.ui.overlay.Overlay; import net.runelite.client.ui.overlay.Overlay;
import net.runelite.client.ui.overlay.OverlayLayer; import net.runelite.client.ui.overlay.OverlayLayer;
@@ -83,10 +84,10 @@ class MotherlodeRocksOverlay extends Overlay
private void renderTiles(Graphics2D graphics, Player local) private void renderTiles(Graphics2D graphics, Player local)
{ {
Point localLocation = local.getLocalLocation(); LocalPoint localLocation = local.getLocalLocation();
for (WallObject vein : plugin.getVeins()) for (WallObject vein : plugin.getVeins())
{ {
Point location = vein.getLocalLocation(); LocalPoint location = vein.getLocalLocation();
if (localLocation.distanceTo(location) <= MAX_DISTANCE) if (localLocation.distanceTo(location) <= MAX_DISTANCE)
{ {
renderVein(graphics, vein); renderVein(graphics, vein);
@@ -95,7 +96,7 @@ class MotherlodeRocksOverlay extends Overlay
for (GameObject rock : plugin.getRocks()) for (GameObject rock : plugin.getRocks())
{ {
Point location = rock.getLocalLocation(); LocalPoint location = rock.getLocalLocation();
if (localLocation.distanceTo(location) <= MAX_DISTANCE) if (localLocation.distanceTo(location) <= MAX_DISTANCE)
{ {
renderRock(graphics, rock); renderRock(graphics, rock);

View File

@@ -33,7 +33,7 @@ import javax.inject.Inject;
import lombok.Getter; import lombok.Getter;
import net.runelite.api.Client; import net.runelite.api.Client;
import net.runelite.api.Perspective; import net.runelite.api.Perspective;
import net.runelite.api.Point; import net.runelite.api.coords.LocalPoint;
import net.runelite.client.ui.overlay.Overlay; import net.runelite.client.ui.overlay.Overlay;
import net.runelite.client.ui.overlay.OverlayLayer; import net.runelite.client.ui.overlay.OverlayLayer;
import net.runelite.client.ui.overlay.OverlayPosition; import net.runelite.client.ui.overlay.OverlayPosition;
@@ -69,10 +69,10 @@ public class PohOverlay extends Overlay
@Override @Override
public Dimension render(Graphics2D graphics, java.awt.Point parent) public Dimension render(Graphics2D graphics, java.awt.Point parent)
{ {
Point localLocation = client.getLocalPlayer().getLocalLocation(); LocalPoint localLocation = client.getLocalPlayer().getLocalLocation();
plugin.getPohObjects().forEach((object, tile) -> plugin.getPohObjects().forEach((object, tile) ->
{ {
Point location = object.getLocalLocation(); LocalPoint location = object.getLocalLocation();
if (tile.getPlane() == client.getPlane() && localLocation.distanceTo(location) <= MAX_DISTANCE) if (tile.getPlane() == client.getPlane() && localLocation.distanceTo(location) <= MAX_DISTANCE)
{ {
PohIcons icon = PohIcons.getIcon(object.getId()); PohIcons icon = PohIcons.getIcon(object.getId());

View File

@@ -31,7 +31,7 @@ import java.awt.Polygon;
import javax.inject.Inject; import javax.inject.Inject;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import net.runelite.api.Client; import net.runelite.api.Client;
import net.runelite.api.Point; import net.runelite.api.coords.LocalPoint;
import net.runelite.client.ui.overlay.Overlay; import net.runelite.client.ui.overlay.Overlay;
import net.runelite.client.ui.overlay.OverlayLayer; import net.runelite.client.ui.overlay.OverlayLayer;
import net.runelite.client.ui.overlay.OverlayPosition; import net.runelite.client.ui.overlay.OverlayPosition;
@@ -61,7 +61,7 @@ public class RoguesDenOverlay extends Overlay
return null; return null;
} }
Point playerLocation = client.getLocalPlayer().getLocalLocation(); LocalPoint playerLocation = client.getLocalPlayer().getLocalLocation();
plugin.getObstaclesHull().forEach((obstacle, tile) -> plugin.getObstaclesHull().forEach((obstacle, tile) ->
{ {

View File

@@ -51,6 +51,7 @@ import net.runelite.api.Client;
import net.runelite.api.DecorativeObject; import net.runelite.api.DecorativeObject;
import net.runelite.api.Perspective; import net.runelite.api.Perspective;
import net.runelite.api.Point; import net.runelite.api.Point;
import net.runelite.api.coords.LocalPoint;
import net.runelite.client.game.ItemManager; import net.runelite.client.game.ItemManager;
import net.runelite.client.ui.overlay.Overlay; import net.runelite.client.ui.overlay.Overlay;
import net.runelite.client.ui.overlay.OverlayLayer; import net.runelite.client.ui.overlay.OverlayLayer;
@@ -89,10 +90,10 @@ class AbyssOverlay extends Overlay
return null; return null;
} }
Point localLocation = client.getLocalPlayer().getLocalLocation(); LocalPoint localLocation = client.getLocalPlayer().getLocalLocation();
for (DecorativeObject object : plugin.getAbyssObjects()) for (DecorativeObject object : plugin.getAbyssObjects())
{ {
Point location = object.getLocalLocation(); LocalPoint location = object.getLocalLocation();
if (localLocation.distanceTo(location) <= MAX_DISTANCE) if (localLocation.distanceTo(location) <= MAX_DISTANCE)
{ {
renderRifts(graphics, object); renderRifts(graphics, object);

View File

@@ -24,13 +24,12 @@
*/ */
package net.runelite.client.plugins.tileindicators; package net.runelite.client.plugins.tileindicators;
import java.awt.Color;
import java.awt.Dimension; import java.awt.Dimension;
import java.awt.Graphics2D; import java.awt.Graphics2D;
import java.awt.Polygon; import java.awt.Polygon;
import net.runelite.api.Client; import net.runelite.api.Client;
import net.runelite.api.Perspective; import net.runelite.api.Perspective;
import net.runelite.api.Point; import net.runelite.api.coords.LocalPoint;
import net.runelite.client.ui.overlay.Overlay; import net.runelite.client.ui.overlay.Overlay;
import net.runelite.client.ui.overlay.OverlayLayer; import net.runelite.client.ui.overlay.OverlayLayer;
import net.runelite.client.ui.overlay.OverlayPosition; import net.runelite.client.ui.overlay.OverlayPosition;
@@ -54,24 +53,20 @@ public class TileIndicatorsOverlay extends Overlay
@Override @Override
public Dimension render(Graphics2D graphics, java.awt.Point parent) public Dimension render(Graphics2D graphics, java.awt.Point parent)
{ {
if (client.getSceneDestinationLocation().getX() > 0 LocalPoint dest = client.getLocalDestinationLocation();
&& client.getSceneDestinationLocation().getY() > 0) if (dest == null)
{ {
drawRegionTile(graphics, client.getSceneDestinationLocation(), config.highlightDestinationColor()); return null;
} }
Polygon poly = Perspective.getCanvasTilePoly(client, dest);
if (poly == null)
{
return null;
}
OverlayUtil.renderPolygon(graphics, poly, config.highlightDestinationColor());
return null; return null;
} }
private void drawRegionTile(Graphics2D graphics, Point tile, Color color)
{
Point localTile = Perspective.regionToLocal(client, tile);
localTile = new Point(localTile.getX() + Perspective.LOCAL_TILE_SIZE / 2, localTile.getY() + Perspective.LOCAL_TILE_SIZE / 2);
Polygon poly = Perspective.getCanvasTilePoly(client, localTile);
if (poly != null)
{
OverlayUtil.renderPolygon(graphics, poly, color);
}
}
} }

View File

@@ -30,10 +30,11 @@ import java.awt.image.BufferedImage;
import net.runelite.api.Actor; import net.runelite.api.Actor;
import net.runelite.api.NPC; import net.runelite.api.NPC;
import net.runelite.api.Perspective; import net.runelite.api.Perspective;
import static net.runelite.api.Perspective.LOCAL_COORD_BITS;
import net.runelite.api.Player; import net.runelite.api.Player;
import net.runelite.api.Point; import net.runelite.api.Point;
import net.runelite.api.SpritePixels; import net.runelite.api.SpritePixels;
import net.runelite.api.coords.LocalPoint;
import net.runelite.api.coords.WorldPoint;
import net.runelite.api.events.GraphicChanged; import net.runelite.api.events.GraphicChanged;
import net.runelite.api.mixins.FieldHook; import net.runelite.api.mixins.FieldHook;
import net.runelite.api.mixins.Inject; import net.runelite.api.mixins.Inject;
@@ -123,24 +124,16 @@ public abstract class RSActorMixin implements RSActor
@Override @Override
@Inject @Inject
public Point getWorldLocation() public WorldPoint getWorldLocation()
{ {
Point localLocation = getLocalLocation(); return WorldPoint.fromLocal(client, getX(), getY(), client.getPlane());
return Perspective.localToWorld(client, localLocation);
} }
@Inject @Inject
@Override @Override
public Point getRegionLocation() public LocalPoint getLocalLocation()
{ {
return new Point(getX() >>> LOCAL_COORD_BITS, getY() >>> LOCAL_COORD_BITS);// divided by 128 return new LocalPoint(getX(), getY());
}
@Inject
@Override
public Point getLocalLocation()
{
return new Point(getX(), getY());
} }
@Inject @Inject

View File

@@ -26,6 +26,7 @@ package net.runelite.mixins;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import javax.annotation.Nullable;
import net.runelite.api.ChatMessageType; import net.runelite.api.ChatMessageType;
import net.runelite.api.ClanMember; import net.runelite.api.ClanMember;
import net.runelite.api.GameState; import net.runelite.api.GameState;
@@ -43,6 +44,7 @@ import net.runelite.api.Projectile;
import net.runelite.api.Setting; import net.runelite.api.Setting;
import net.runelite.api.Skill; import net.runelite.api.Skill;
import net.runelite.api.Varbits; import net.runelite.api.Varbits;
import net.runelite.api.coords.LocalPoint;
import net.runelite.api.events.ExperienceChanged; import net.runelite.api.events.ExperienceChanged;
import net.runelite.api.events.GameStateChanged; import net.runelite.api.events.GameStateChanged;
import net.runelite.api.events.GrandExchangeOfferChanged; import net.runelite.api.events.GrandExchangeOfferChanged;
@@ -366,9 +368,16 @@ public abstract class RSClientMixin implements RSClient
@Inject @Inject
@Override @Override
public Point getSceneDestinationLocation() @Nullable
public LocalPoint getLocalDestinationLocation()
{ {
return new Point(getDestinationX(), getDestinationY()); int regionX = getDestinationX();
int regionY = getDestinationY();
if (regionX != 0 && regionY != 0)
{
return LocalPoint.fromRegion(regionX, regionY);
}
return null;
} }
@Inject @Inject

View File

@@ -41,6 +41,23 @@ public abstract class RSDecorativeObjectMixin implements RSDecorativeObject
@Shadow("clientInstance") @Shadow("clientInstance")
private static RSClient client; private static RSClient client;
@Inject
private int decorativeObjectPlane;
@Inject
@Override
public int getPlane()
{
return decorativeObjectPlane;
}
@Inject
@Override
public void setPlane(int plane)
{
this.decorativeObjectPlane = plane;
}
@Inject @Inject
private Model getModel() private Model getModel()
{ {

View File

@@ -40,6 +40,23 @@ public abstract class RSGroundObjectMixin implements RSGroundObject
@Shadow("clientInstance") @Shadow("clientInstance")
private static RSClient client; private static RSClient client;
@Inject
private int groundObjectPlane;
@Inject
@Override
public int getPlane()
{
return groundObjectPlane;
}
@Inject
@Override
public void setPlane(int plane)
{
this.groundObjectPlane = plane;
}
@Inject @Inject
private Model getModel() private Model getModel()
{ {

View File

@@ -32,11 +32,27 @@ import net.runelite.rs.api.RSItemLayer;
@Mixin(RSItemLayer.class) @Mixin(RSItemLayer.class)
public abstract class RSItemLayerMixin implements RSItemLayer public abstract class RSItemLayerMixin implements RSItemLayer
{ {
@Inject
private int itemLayerPlane;
@Inject
@Override
public int getPlane()
{
return itemLayerPlane;
}
@Inject
@Override
public void setPlane(int plane)
{
this.itemLayerPlane = plane;
}
@Inject @Inject
@Override @Override
public Area getClickbox() public Area getClickbox()
{ {
throw new UnsupportedOperationException(); throw new UnsupportedOperationException();
} }
} }

View File

@@ -24,11 +24,16 @@
*/ */
package net.runelite.mixins; package net.runelite.mixins;
import net.runelite.api.Renderable;
import net.runelite.api.mixins.Copy; import net.runelite.api.mixins.Copy;
import net.runelite.api.mixins.Inject; import net.runelite.api.mixins.Inject;
import net.runelite.api.mixins.Mixin; import net.runelite.api.mixins.Mixin;
import net.runelite.api.mixins.Replace; import net.runelite.api.mixins.Replace;
import net.runelite.rs.api.RSDecorativeObject;
import net.runelite.rs.api.RSGroundObject;
import net.runelite.rs.api.RSItemLayer;
import net.runelite.rs.api.RSRegion; import net.runelite.rs.api.RSRegion;
import net.runelite.rs.api.RSWallObject;
@Mixin(RSRegion.class) @Mixin(RSRegion.class)
public abstract class RSRegionMixin implements RSRegion public abstract class RSRegionMixin implements RSRegion
@@ -52,4 +57,44 @@ public abstract class RSRegionMixin implements RSRegion
isDrawingRegion = false; isDrawingRegion = false;
} }
} }
@Copy("addBoundaryDecoration")
abstract public void rs$addBoundaryDecoration(int plane, int x, int y, int hash, Renderable var5, Renderable var6, int var7, int var8, int var9, int var10, int var11, int var12);
@Replace("addBoundaryDecoration")
public void rl$addBoundaryDecoration(int plane, int x, int y, int hash, Renderable var5, Renderable var6, int var7, int var8, int var9, int var10, int var11, int var12)
{
rs$addBoundaryDecoration(plane, x, y, hash, var5, var6, var7, var8, var9, var10, var11, var12);
((RSDecorativeObject) getTiles()[plane][x][y].getDecorativeObject()).setPlane(plane);
}
@Copy("addItemPile")
abstract public void rs$addItemPile(int plane, int x, int y, int hash, Renderable var5, int var6, Renderable var7, Renderable var8);
@Replace("addItemPile")
public void rl$addItemPile(int plane, int x, int y, int hash, Renderable var5, int var6, Renderable var7, Renderable var8)
{
rs$addItemPile(plane, x, y, hash, var5, var6, var7, var8);
((RSItemLayer) getTiles()[plane][x][y].getItemLayer()).setPlane(plane);
}
@Copy("groundObjectSpawned")
abstract public void rs$groundObjectSpawned(int plane, int x, int y, int hash, Renderable var5, int var6, int var7);
@Replace("groundObjectSpawned")
public void rl$groundObjectSpawned(int plane, int x, int y, int hash, Renderable var5, int var6, int var7)
{
rs$groundObjectSpawned(plane, x, y, hash, var5, var6, var7);
((RSGroundObject) getTiles()[plane][x][y].getGroundObject()).setPlane(plane);
}
@Copy("addBoundary")
abstract public void rs$addBoundary(int plane, int x, int y, int hash, Renderable var5, Renderable var6, int var7, int var8, int var9, int var10);
@Replace("addBoundary")
public void rl$addBoundary(int plane, int x, int y, int hash, Renderable var5, Renderable var6, int var7, int var8, int var9, int var10)
{
rs$addBoundary(plane, x, y, hash, var5, var6, var7, var8, var9, var10);
((RSWallObject) getTiles()[plane][x][y].getWallObject()).setPlane(plane);
}
} }

View File

@@ -28,9 +28,10 @@ import net.runelite.api.Actor;
import net.runelite.api.DecorativeObject; import net.runelite.api.DecorativeObject;
import net.runelite.api.GameObject; import net.runelite.api.GameObject;
import net.runelite.api.GroundObject; import net.runelite.api.GroundObject;
import net.runelite.api.Perspective;
import net.runelite.api.Point; import net.runelite.api.Point;
import net.runelite.api.WallObject; import net.runelite.api.WallObject;
import net.runelite.api.coords.LocalPoint;
import net.runelite.api.coords.WorldPoint;
import net.runelite.api.events.DecorativeObjectChanged; import net.runelite.api.events.DecorativeObjectChanged;
import net.runelite.api.events.DecorativeObjectDespawned; import net.runelite.api.events.DecorativeObjectDespawned;
import net.runelite.api.events.DecorativeObjectSpawned; import net.runelite.api.events.DecorativeObjectSpawned;
@@ -75,10 +76,9 @@ public abstract class RSTileMixin implements RSTile
@Inject @Inject
@Override @Override
public Point getWorldLocation() public WorldPoint getWorldLocation()
{ {
Point regionLocation = getRegionLocation(); return WorldPoint.fromRegion(client, getX(), getY(), getPlane());
return Perspective.regionToWorld(client, regionLocation);
} }
@Inject @Inject
@@ -90,10 +90,9 @@ public abstract class RSTileMixin implements RSTile
@Inject @Inject
@Override @Override
public Point getLocalLocation() public LocalPoint getLocalLocation()
{ {
Point regionLocation = getRegionLocation(); return LocalPoint.fromRegion(getX(), getY());
return Perspective.regionToLocal(client, regionLocation);
} }
@FieldHook("wallObject") @FieldHook("wallObject")

View File

@@ -40,6 +40,23 @@ public abstract class RSWallObjectMixin implements RSWallObject
@Shadow("clientInstance") @Shadow("clientInstance")
private static RSClient client; private static RSClient client;
@Inject
private int wallPlane;
@Inject
@Override
public int getPlane()
{
return wallPlane;
}
@Inject
@Override
public void setPlane(int plane)
{
this.wallPlane = plane;
}
@Inject @Inject
private Model getModelA() private Model getModelA()
{ {

View File

@@ -30,9 +30,10 @@ import java.util.ArrayList;
import java.util.List; import java.util.List;
import net.runelite.api.Model; import net.runelite.api.Model;
import net.runelite.api.Perspective; import net.runelite.api.Perspective;
import static net.runelite.api.Perspective.LOCAL_COORD_BITS;
import net.runelite.api.Point; import net.runelite.api.Point;
import net.runelite.api.TileObject; import net.runelite.api.TileObject;
import net.runelite.api.coords.LocalPoint;
import net.runelite.api.coords.WorldPoint;
import net.runelite.api.mixins.Inject; import net.runelite.api.mixins.Inject;
import net.runelite.api.mixins.Mixin; import net.runelite.api.mixins.Mixin;
import net.runelite.api.mixins.Mixins; import net.runelite.api.mixins.Mixins;
@@ -68,25 +69,16 @@ public abstract class TileObjectMixin implements TileObject
@Override @Override
@Inject @Inject
public Point getWorldLocation() public WorldPoint getWorldLocation()
{ {
Point localLocation = getLocalLocation(); return WorldPoint.fromLocal(client, getX(), getY(), getPlane());
return Perspective.localToWorld(client, localLocation);
} }
@Override @Override
@Inject @Inject
public Point getLocalLocation() public LocalPoint getLocalLocation()
{ {
return new Point(getX(), getY()); return new LocalPoint(getX(), getY());
}
@Override
@Inject
public Point getRegionLocation()
{
Point localLocation = getLocalLocation();
return new Point(localLocation.getX() >>> LOCAL_COORD_BITS, localLocation.getY() >>> LOCAL_COORD_BITS);
} }
@Override @Override
@@ -100,8 +92,7 @@ public abstract class TileObjectMixin implements TileObject
@Inject @Inject
public Point getCanvasLocation(int zOffset) public Point getCanvasLocation(int zOffset)
{ {
Point localLocation = getLocalLocation(); return Perspective.worldToCanvas(client, getX(), getY(), 0, zOffset);
return Perspective.worldToCanvas(client, localLocation.getX(), localLocation.getY(), 0, zOffset);
} }
@Override @Override

View File

@@ -45,4 +45,6 @@ public interface RSDecorativeObject extends DecorativeObject
@Import("renderable1") @Import("renderable1")
Renderable getRenderable(); Renderable getRenderable();
void setPlane(int plane);
} }

View File

@@ -42,4 +42,6 @@ public interface RSGroundObject extends GroundObject
@Import("renderable") @Import("renderable")
Renderable getRenderable(); Renderable getRenderable();
void setPlane(int plane);
} }

View File

@@ -56,4 +56,6 @@ public interface RSItemLayer extends ItemLayer
@Import("top") @Import("top")
@Override @Override
RSRenderable getTop(); RSRenderable getTop();
void setPlane(int plane);
} }

View File

@@ -59,4 +59,6 @@ public interface RSWallObject extends WallObject
@Import("config") @Import("config")
@Override @Override
int getConfig(); int getConfig();
void setPlane(int plane);
} }