diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/npchighlight/NpcSceneOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/npchighlight/NpcSceneOverlay.java index 93aa72994e..e52f663718 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/npchighlight/NpcSceneOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/npchighlight/NpcSceneOverlay.java @@ -33,6 +33,7 @@ import java.awt.Polygon; import java.text.DecimalFormat; import java.text.NumberFormat; import java.time.Instant; +import java.util.List; import java.util.Locale; import javax.inject.Inject; import javax.inject.Singleton; @@ -43,6 +44,7 @@ import net.runelite.api.NPCDefinition; import net.runelite.api.Perspective; import net.runelite.api.Point; import net.runelite.api.coords.LocalPoint; +import net.runelite.api.coords.WorldArea; import net.runelite.api.coords.WorldPoint; import net.runelite.client.graphics.ModelOutlineRenderer; import net.runelite.client.ui.overlay.Overlay; @@ -169,7 +171,7 @@ public class NpcSceneOverlay extends Overlay break; case TILE: int size = 1; - final NPCDefinition composition = actor.getTransformedDefinition(); + NPCDefinition composition = actor.getTransformedDefinition(); if (composition != null) { size = composition.getSize(); @@ -194,6 +196,23 @@ public class NpcSceneOverlay extends Overlay case GLOW: modelOutliner.drawOutline(actor, 8, color, TRANSPARENT); break; + case TRUE_LOCATIONS: + size = 1; + composition = actor.getTransformedDefinition(); + + if (composition != null) + { + size = composition.getSize(); + } + + final WorldPoint wp = actor.getWorldLocation(); + final Color squareColor = color; + + getSquare(wp, size).forEach(square -> + { + drawTile(graphics, square, squareColor, 1, 255, 50); + }); + break; } if (plugin.isDrawNames() && actor.getName() != null) @@ -231,4 +250,39 @@ public class NpcSceneOverlay extends Overlay graphics.fill(polygon); } } + + private List getSquare(WorldPoint npcLoc, int npcSize) + { + return new WorldArea(npcLoc.getX(), npcLoc.getY(), npcSize, npcSize, npcLoc.getPlane()).toWorldPointList(); + } + + private void drawTile(Graphics2D graphics, WorldPoint point, Color color, int strokeWidth, int outlineAlpha, int fillAlpha) + { + WorldPoint playerLocation = client.getLocalPlayer().getWorldLocation(); + + if (point.distanceTo(playerLocation) >= 32) + { + return; + } + + LocalPoint lp = LocalPoint.fromWorld(client, point); + + if (lp == null) + { + return; + } + + Polygon poly = Perspective.getCanvasTilePoly(client, lp); + + if (poly == null) + { + return; + } + + graphics.setColor(new Color(color.getRed(), color.getGreen(), color.getBlue(), outlineAlpha)); + graphics.setStroke(new BasicStroke(strokeWidth)); + graphics.draw(poly); + graphics.setColor(new Color(color.getRed(), color.getGreen(), color.getBlue(), fillAlpha)); + graphics.fill(poly); + } } diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/npchighlight/RenderStyle.java b/runelite-client/src/main/java/net/runelite/client/plugins/npchighlight/RenderStyle.java index 5338e2d720..c4f870cd95 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/npchighlight/RenderStyle.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/npchighlight/RenderStyle.java @@ -33,5 +33,6 @@ public enum RenderStyle THIN_OUTLINE, OUTLINE, THIN_GLOW, - GLOW + GLOW, + TRUE_LOCATIONS } diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/slayer/TargetClickboxOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/slayer/TargetClickboxOverlay.java index b939fbdc2a..c48279437f 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/slayer/TargetClickboxOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/slayer/TargetClickboxOverlay.java @@ -26,10 +26,12 @@ */ package net.runelite.client.plugins.slayer; +import java.awt.BasicStroke; import java.awt.Color; import java.awt.Dimension; import java.awt.Graphics2D; import java.awt.Polygon; +import java.util.List; import java.util.Set; import javax.inject.Inject; import javax.inject.Singleton; @@ -39,6 +41,7 @@ import net.runelite.api.NPCDefinition; import net.runelite.api.Perspective; import net.runelite.api.Point; import net.runelite.api.coords.LocalPoint; +import net.runelite.api.coords.WorldArea; import net.runelite.api.coords.WorldPoint; import net.runelite.client.graphics.ModelOutlineRenderer; import net.runelite.client.ui.overlay.Overlay; @@ -155,16 +158,10 @@ public class TargetClickboxOverlay extends Overlay } WorldPoint wp = actor.getWorldLocation(); - lp = LocalPoint.fromWorld(client, wp); - - if (lp == null) + getSquare(wp, size).forEach(square -> { - return; - } - - tilePoly = Perspective.getCanvasTileAreaPoly(client, lp, size); - - OverlayUtil.renderPolygon(graphics, tilePoly, color); + drawTile(graphics, square, color, 1, 255, 50); + }); break; } @@ -179,4 +176,39 @@ public class TargetClickboxOverlay extends Overlay } } } + + private List getSquare(WorldPoint npcLoc, int npcSize) + { + return new WorldArea(npcLoc.getX(), npcLoc.getY(), npcSize, npcSize, npcLoc.getPlane()).toWorldPointList(); + } + + private void drawTile(Graphics2D graphics, WorldPoint point, Color color, int strokeWidth, int outlineAlpha, int fillAlpha) + { + WorldPoint playerLocation = client.getLocalPlayer().getWorldLocation(); + + if (point.distanceTo(playerLocation) >= 32) + { + return; + } + + LocalPoint lp = LocalPoint.fromWorld(client, point); + + if (lp == null) + { + return; + } + + Polygon poly = Perspective.getCanvasTilePoly(client, lp); + + if (poly == null) + { + return; + } + + graphics.setColor(new Color(color.getRed(), color.getGreen(), color.getBlue(), outlineAlpha)); + graphics.setStroke(new BasicStroke(strokeWidth)); + graphics.draw(poly); + graphics.setColor(new Color(color.getRed(), color.getGreen(), color.getBlue(), fillAlpha)); + graphics.fill(poly); + } }