diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/agility/AgilityConfig.java b/runelite-client/src/main/java/net/runelite/client/plugins/agility/AgilityConfig.java
index 1223764221..07f4cffea8 100644
--- a/runelite-client/src/main/java/net/runelite/client/plugins/agility/AgilityConfig.java
+++ b/runelite-client/src/main/java/net/runelite/client/plugins/agility/AgilityConfig.java
@@ -28,15 +28,42 @@ import java.awt.Color;
import net.runelite.client.config.Config;
import net.runelite.client.config.ConfigGroup;
import net.runelite.client.config.ConfigItem;
+import net.runelite.client.config.Stub;
@ConfigGroup("agility")
public interface AgilityConfig extends Config
{
+ @ConfigItem(
+ position = 0,
+ keyName = "mainConfig",
+ name = "Main Config",
+ description = ""
+ )
+ default Stub mainConfig()
+ {
+ return new Stub();
+ }
+
+ @ConfigItem(
+ keyName = "removeDistanceCap",
+ name = "Remove Distance Cap",
+ description = "This will remove the distance cap on rendering overlays for agility.",
+ warning = "
Enabling this setting on a low end machine may severely affect your fps." +
+ "
Click yes to enable this setting, knowing it might affect performance.",
+ position = 1,
+ parent = "mainConfig"
+ )
+ default boolean removeDistanceCap()
+ {
+ return false;
+ }
+
@ConfigItem(
keyName = "showLapCount",
name = "Show Lap Count",
description = "Enable/disable the lap counter",
- position = 1
+ position = 2,
+ parent = "mainConfig"
)
default boolean showLapCount()
{
@@ -45,9 +72,12 @@ public interface AgilityConfig extends Config
@ConfigItem(
keyName = "lapTimeout",
- name = "Hide Lap Count (minutes)",
- description = "Time until the lap counter hides/resets",
- position = 2
+ name = "Hide Lap Count",
+ description = "Time in minutes until the lap counter hides/resets",
+ position = 3,
+ parent = "mainConfig",
+ hidden = true,
+ unhide = "showLapCount"
)
default int lapTimeout()
{
@@ -58,106 +88,36 @@ public interface AgilityConfig extends Config
keyName = "lapsToLevel",
name = "Show Laps Until Level",
description = "Show number of laps remaining until next level is reached.",
- position = 3
+ position = 4,
+ parent = "mainConfig",
+ hidden = true,
+ unhide = "showLapCount"
)
default boolean lapsToLevel()
{
- return true;
+ return false;
}
@ConfigItem(
keyName = "lapsToGoal",
name = "Show Laps Until Goal",
description = "Show number of laps remaining until experience tracker goal is reached",
- position = 4
+ position = 5,
+ parent = "mainConfig",
+ hidden = true,
+ unhide = "showLapCount"
)
default boolean lapsToGoal()
{
return false;
}
- @ConfigItem(
- keyName = "overlayColor",
- name = "Overlay Color",
- description = "Color of Agility overlay",
- position = 5
- )
- default Color getOverlayColor()
- {
- return Color.GREEN;
- }
-
- @ConfigItem(
- keyName = "highlightMarks",
- name = "Highlight Marks of Grace",
- description = "Enable/disable the highlighting of retrievable Marks of Grace",
- position = 6
- )
- default boolean highlightMarks()
- {
- return true;
- }
-
- @ConfigItem(
- keyName = "markHighlight",
- name = "Mark Highlight Color",
- description = "Color of highlighted Marks of Grace",
- position = 7
- )
- default Color getMarkColor()
- {
- return Color.RED;
- }
-
- @ConfigItem(
- keyName = "highlightShortcuts",
- name = "Highlight Agility Shortcuts",
- description = "Enable/disable the highlighting of Agility shortcuts",
- position = 8
- )
- default boolean highlightShortcuts()
- {
- return true;
- }
-
- @ConfigItem(
- keyName = "trapOverlay",
- name = "Show Trap Overlay",
- description = "Enable/disable the highlighting of traps on Agility courses",
- position = 9
- )
- default boolean showTrapOverlay()
- {
- return true;
- }
-
- @ConfigItem(
- keyName = "trapHighlight",
- name = "Trap Overlay Color",
- description = "Color of Agility trap overlay",
- position = 10
- )
- default Color getTrapColor()
- {
- return Color.RED;
- }
-
- @ConfigItem(
- keyName = "agilityArenaNotifier",
- name = "Agility Arena notifier",
- description = "Notify on ticket location change in Agility Arena",
- position = 11
- )
- default boolean notifyAgilityArena()
- {
- return true;
- }
-
@ConfigItem(
keyName = "agilityArenaTimer",
name = "Agility Arena timer",
description = "Configures whether Agility Arena timer is displayed",
- position = 12
+ position = 6,
+ parent = "mainConfig"
)
default boolean showAgilityArenaTimer()
{
@@ -166,12 +126,112 @@ public interface AgilityConfig extends Config
@ConfigItem(
keyName = "addLevelsToShortcutOptions",
- name = "Show shortcut agility req. in options",
+ name = "Show Shortcut Agility Reqs",
description = "Enable/disable showing shortcut agility level requirements in right-click options",
- position = 13
+ position = 7,
+ parent = "mainConfig"
)
default boolean showShortcutLevel()
+ {
+ return false;
+ }
+
+ @ConfigItem(
+ position = 8,
+ keyName = "miscConfig",
+ name = "Misc Config",
+ description = ""
+ )
+ default Stub miscConfig()
+ {
+ return new Stub();
+ }
+
+ @ConfigItem(
+ keyName = "highlightMarks",
+ name = "Highlight Marks of Grace",
+ description = "Enable/disable the highlighting of retrievable Marks of Grace",
+ position = 9,
+ parent = "miscConfig"
+ )
+ default boolean highlightMarks()
{
return true;
}
+
+ @ConfigItem(
+ keyName = "highlightShortcuts",
+ name = "Highlight Agility Shortcuts",
+ description = "Enable/disable the highlighting of Agility shortcuts",
+ position = 10,
+ parent = "miscConfig"
+ )
+ default boolean highlightShortcuts()
+ {
+ return true;
+ }
+
+ @ConfigItem(
+ keyName = "showTrapOverlay",
+ name = "Highlight Traps",
+ description = "Enable/disable the highlighting of traps on Agility courses",
+ position = 11,
+ parent = "miscConfig"
+ )
+ default boolean showTrapOverlay()
+ {
+ return false;
+ }
+
+ @ConfigItem(
+ keyName = "agilityArenaNotifier",
+ name = "Agility Arena notifier",
+ description = "Notify on ticket location change in Agility Arena",
+ position = 12,
+ parent = "miscConfig"
+ )
+ default boolean notifyAgilityArena()
+ {
+ return false;
+ }
+
+ @ConfigItem(
+ keyName = "overlayColor",
+ name = "Global Overlay Color",
+ description = "Color of Agility overlay",
+ position = 13,
+ parent = "miscConfig"
+ )
+ default Color getOverlayColor()
+ {
+ return Color.GREEN;
+ }
+
+ @ConfigItem(
+ keyName = "trapHighlight",
+ name = "Trap Overlay Color",
+ description = "Color of Agility trap overlay",
+ position = 14,
+ parent = "miscConfig",
+ hidden = true,
+ unhide = "showTrapOverlay"
+ )
+ default Color getTrapColor()
+ {
+ return Color.RED;
+ }
+
+ @ConfigItem(
+ keyName = "markHighlight",
+ name = "Mark Highlight Color",
+ description = "Color of highlighted Marks of Grace",
+ position = 15,
+ parent = "miscConfig",
+ hidden = true,
+ unhide = "highlightMarks"
+ )
+ default Color getMarkColor()
+ {
+ return Color.RED;
+ }
}
diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/agility/AgilityOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/agility/AgilityOverlay.java
index 31a987bf14..7180914d79 100644
--- a/runelite-client/src/main/java/net/runelite/client/plugins/agility/AgilityOverlay.java
+++ b/runelite-client/src/main/java/net/runelite/client/plugins/agility/AgilityOverlay.java
@@ -77,8 +77,8 @@ class AgilityOverlay extends Overlay
}
Tile tile = obstacle.getTile();
- if (tile.getPlane() == client.getPlane()
- && object.getLocalLocation().distanceTo(playerLocation) < MAX_DISTANCE)
+
+ if (tile.getPlane() == client.getPlane() && checkDistance(object.getLocalLocation(), playerLocation))
{
// This assumes that the obstacle is not clickable.
if (Obstacles.TRAP_OBSTACLE_IDS.contains(object.getId()))
@@ -100,18 +100,7 @@ class AgilityOverlay extends Overlay
configColor = plugin.getMarkColor();
}
- if (objectClickbox.contains(mousePosition.getX(), mousePosition.getY()))
- {
- graphics.setColor(configColor.darker());
- }
- else
- {
- graphics.setColor(configColor);
- }
-
- graphics.draw(objectClickbox);
- graphics.setColor(new Color(configColor.getRed(), configColor.getGreen(), configColor.getBlue(), 50));
- graphics.fill(objectClickbox);
+ OverlayUtil.renderClickBox(graphics, mousePosition, objectClickbox, configColor);
}
}
@@ -122,7 +111,7 @@ class AgilityOverlay extends Overlay
for (Tile markOfGraceTile : marksOfGrace)
{
if (markOfGraceTile.getPlane() == client.getPlane() && markOfGraceTile.getItemLayer() != null
- && markOfGraceTile.getLocalLocation().distanceTo(playerLocation) < MAX_DISTANCE)
+ && checkDistance(markOfGraceTile.getLocalLocation(), playerLocation))
{
final Polygon poly = markOfGraceTile.getItemLayer().getCanvasTilePoly();
@@ -138,4 +127,13 @@ class AgilityOverlay extends Overlay
return null;
}
+
+ private boolean checkDistance(LocalPoint localPoint, LocalPoint playerPoint)
+ {
+ if (plugin.isRemoveDistanceCap())
+ {
+ return true;
+ }
+ return localPoint.distanceTo(playerPoint) < MAX_DISTANCE;
+ }
}
diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/agility/AgilityPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/agility/AgilityPlugin.java
index 043cc4e23a..3f7ac5b498 100644
--- a/runelite-client/src/main/java/net/runelite/client/plugins/agility/AgilityPlugin.java
+++ b/runelite-client/src/main/java/net/runelite/client/plugins/agility/AgilityPlugin.java
@@ -137,6 +137,8 @@ public class AgilityPlugin extends Plugin
// Config values
@Getter(AccessLevel.PACKAGE)
+ private boolean removeDistanceCap;
+ @Getter(AccessLevel.PACKAGE)
private boolean showLapCount;
@Getter(AccessLevel.PACKAGE)
private int lapTimeout;
@@ -224,6 +226,7 @@ public class AgilityPlugin extends Plugin
public void updateConfig()
{
+ this.removeDistanceCap = config.removeDistanceCap();
this.showLapCount = config.showLapCount();
this.lapTimeout = config.lapTimeout();
this.lapsToLevel = config.lapsToLevel();
diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/aoewarnings/AoeWarningOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/aoewarnings/AoeWarningOverlay.java
index 0b82eafdb4..1dfeb1c1a0 100644
--- a/runelite-client/src/main/java/net/runelite/client/plugins/aoewarnings/AoeWarningOverlay.java
+++ b/runelite-client/src/main/java/net/runelite/client/plugins/aoewarnings/AoeWarningOverlay.java
@@ -73,22 +73,22 @@ public class AoeWarningOverlay extends Overlay
WorldPoint lp = client.getLocalPlayer().getWorldLocation();
for (WorldPoint point : plugin.getLightningTrail())
{
- OverlayUtil.drawTile(graphics, client, point, lp, new Color(0, 150, 200), 2, 150, 50);
+ OverlayUtil.drawTiles(graphics, client, point, lp, new Color(0, 150, 200), 2, 150, 50);
}
for (WorldPoint point : plugin.getAcidTrail())
{
- OverlayUtil.drawTile(graphics, client, point, lp, new Color(69, 241, 44), 2, 150, 50);
+ OverlayUtil.drawTiles(graphics, client, point, lp, new Color(69, 241, 44), 2, 150, 50);
}
for (WorldPoint point : plugin.getCrystalSpike())
{
- OverlayUtil.drawTile(graphics, client, point, lp, new Color(255, 0, 84), 2, 150, 50);
+ OverlayUtil.drawTiles(graphics, client, point, lp, new Color(255, 0, 84), 2, 150, 50);
}
for (WorldPoint point : plugin.getWintertodtSnowFall())
{
- OverlayUtil.drawTile(graphics, client, point, lp, new Color(255, 0, 84), 2, 150, 50);
+ OverlayUtil.drawTiles(graphics, client, point, lp, new Color(255, 0, 84), 2, 150, 50);
}
Instant now = Instant.now();
diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/pyramidplunder/PyramidPlunderOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/pyramidplunder/PyramidPlunderOverlay.java
index 9032bcc500..99ea4f9fcb 100644
--- a/runelite-client/src/main/java/net/runelite/client/plugins/pyramidplunder/PyramidPlunderOverlay.java
+++ b/runelite-client/src/main/java/net/runelite/client/plugins/pyramidplunder/PyramidPlunderOverlay.java
@@ -33,7 +33,6 @@ import java.text.NumberFormat;
import java.util.Locale;
import java.util.Map;
import javax.inject.Inject;
-
import javax.inject.Singleton;
import net.runelite.api.Client;
import net.runelite.api.ObjectDefinition;
@@ -42,19 +41,19 @@ import net.runelite.api.Tile;
import net.runelite.api.TileObject;
import net.runelite.api.Varbits;
import net.runelite.api.coords.LocalPoint;
+import net.runelite.api.widgets.Widget;
+import net.runelite.api.widgets.WidgetInfo;
import static net.runelite.client.plugins.pyramidplunder.PyramidPlunderPlugin.CLOSED_DOOR;
import static net.runelite.client.plugins.pyramidplunder.PyramidPlunderPlugin.OPENED_DOOR;
import static net.runelite.client.plugins.pyramidplunder.PyramidPlunderPlugin.TRAP;
-
-import net.runelite.api.widgets.Widget;
-import net.runelite.api.widgets.WidgetInfo;
import net.runelite.client.ui.overlay.Overlay;
import net.runelite.client.ui.overlay.OverlayLayer;
import net.runelite.client.ui.overlay.OverlayPosition;
-import net.runelite.client.ui.overlay.components.table.TableAlignment;
-import net.runelite.client.ui.overlay.components.table.TableComponent;
+import net.runelite.client.ui.overlay.OverlayUtil;
import net.runelite.client.ui.overlay.components.PanelComponent;
import net.runelite.client.ui.overlay.components.TitleComponent;
+import net.runelite.client.ui.overlay.components.table.TableAlignment;
+import net.runelite.client.ui.overlay.components.table.TableComponent;
import net.runelite.client.util.ColorUtil;
@Singleton
@@ -135,18 +134,7 @@ public class PyramidPlunderOverlay extends Overlay
break;
}
- if (objectClickbox.contains(mousePosition.getX(), mousePosition.getY()))
- {
- graphics.setColor(configColor.darker());
- }
- else
- {
- graphics.setColor(configColor);
- }
-
- graphics.draw(objectClickbox);
- graphics.setColor(new Color(configColor.getRed(), configColor.getGreen(), configColor.getBlue(), 50));
- graphics.fill(objectClickbox);
+ OverlayUtil.renderClickBox(graphics, mousePosition, objectClickbox, configColor);
}
}
}
diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/theatre/RoomHandler.java b/runelite-client/src/main/java/net/runelite/client/plugins/theatre/RoomHandler.java
index 5d007a342c..bbe032ff58 100644
--- a/runelite-client/src/main/java/net/runelite/client/plugins/theatre/RoomHandler.java
+++ b/runelite-client/src/main/java/net/runelite/client/plugins/theatre/RoomHandler.java
@@ -1,6 +1,5 @@
package net.runelite.client.plugins.theatre;
-import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics2D;
@@ -8,7 +7,6 @@ import java.awt.Polygon;
import java.util.Map;
import net.runelite.api.Client;
import net.runelite.api.NPC;
-import net.runelite.api.NPCDefinition;
import net.runelite.api.Perspective;
import net.runelite.api.Point;
import net.runelite.api.Projectile;
@@ -51,11 +49,7 @@ public abstract class RoomHandler
return;
}
//OverlayUtil.renderPolygon(graphics, poly, color);
- 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);
+ OverlayUtil.drawStrokeAndFillPoly(graphics, color, strokeWidth, outlineAlpha, fillAlpha, poly);
}
@@ -91,51 +85,12 @@ public abstract class RoomHandler
{
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);
+ OverlayUtil.drawTiles(graphics, client, point, playerLocation, color, strokeWidth, outlineAlpha, fillAlpha);
}
protected void renderNpcOverlay(Graphics2D graphics, NPC actor, Color color, int outlineWidth, int outlineAlpha, int fillAlpha)
{
- int size = 1;
-
- NPCDefinition composition = actor.getTransformedDefinition();
- if (composition != null)
- {
- size = composition.getSize();
- }
-
- LocalPoint lp = actor.getLocalLocation();
- Polygon tilePoly = Perspective.getCanvasTileAreaPoly(client, lp, size);
-
- if (tilePoly != null)
- {
- graphics.setColor(new Color(color.getRed(), color.getGreen(), color.getBlue(), outlineAlpha));
- graphics.setStroke(new BasicStroke(outlineWidth));
- graphics.draw(tilePoly);
- graphics.setColor(new Color(color.getRed(), color.getGreen(), color.getBlue(), fillAlpha));
- graphics.fill(tilePoly);
- }
+ OverlayUtil.renderNpcOverlay(graphics, actor, color, outlineWidth, outlineAlpha, fillAlpha, client);
}
protected void renderTextLocation(Graphics2D graphics, String txtString, int fontSize, int fontStyle, Color fontColor, Point canvasPoint)
diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/ticktimers/TimersOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/ticktimers/TimersOverlay.java
index 2063625a2c..d00e4863ed 100644
--- a/runelite-client/src/main/java/net/runelite/client/plugins/ticktimers/TimersOverlay.java
+++ b/runelite-client/src/main/java/net/runelite/client/plugins/ticktimers/TimersOverlay.java
@@ -34,7 +34,6 @@ import javax.inject.Inject;
import javax.inject.Singleton;
import net.runelite.api.Client;
import net.runelite.api.Point;
-import net.runelite.api.coords.WorldArea;
import net.runelite.api.coords.WorldPoint;
import net.runelite.client.ui.overlay.Overlay;
import net.runelite.client.ui.overlay.OverlayLayer;
@@ -69,14 +68,14 @@ public class TimersOverlay extends Overlay
}
int ticksLeft = npc.getTicksUntilAttack();
- final List hitSquares = getHitSquares(npc.getNpc().getWorldLocation(), npc.getNpcSize(), 1, false);
+ final List hitSquares = OverlayUtil.getHitSquares(npc.getNpc().getWorldLocation(), npc.getNpcSize(), 1, false);
final NPCContainer.AttackStyle attackStyle = npc.getAttackStyle();
if (plugin.isShowHitSquares() && attackStyle.getName().equals("Melee"))
{
for (WorldPoint p : hitSquares)
{
- OverlayUtil.drawTile(graphics, client, p, client.getLocalPlayer().getWorldLocation(), attackStyle.getColor(), 0, 0, 50);
+ OverlayUtil.drawTiles(graphics, client, p, client.getLocalPlayer().getWorldLocation(), attackStyle.getColor(), 0, 0, 50);
}
}
@@ -131,17 +130,6 @@ public class TimersOverlay extends Overlay
}
}
- private List getHitSquares(WorldPoint npcLoc, int npcSize, int thickness, boolean includeUnder)
- {
- List little = new WorldArea(npcLoc, npcSize, npcSize).toWorldPointList();
- List big = new WorldArea(npcLoc.getX() - thickness, npcLoc.getY() - thickness, npcSize + (thickness * 2), npcSize + (thickness * 2), npcLoc.getPlane()).toWorldPointList();
- if (!includeUnder)
- {
- big.removeIf(little::contains);
- }
- return big;
- }
-
private Point centerPoint(Rectangle rect)
{
int x = (int) (rect.getX() + rect.getWidth() / 2);
diff --git a/runelite-client/src/main/java/net/runelite/client/ui/overlay/OverlayUtil.java b/runelite-client/src/main/java/net/runelite/client/ui/overlay/OverlayUtil.java
index 83df559115..541196d646 100644
--- a/runelite-client/src/main/java/net/runelite/client/ui/overlay/OverlayUtil.java
+++ b/runelite-client/src/main/java/net/runelite/client/ui/overlay/OverlayUtil.java
@@ -36,13 +36,17 @@ import java.awt.RenderingHints;
import java.awt.Stroke;
import java.awt.geom.Area;
import java.awt.image.BufferedImage;
+import java.util.List;
import net.runelite.api.Actor;
import net.runelite.api.Client;
+import net.runelite.api.NPC;
+import net.runelite.api.NPCDefinition;
import net.runelite.api.Perspective;
import net.runelite.api.Point;
import net.runelite.api.Prayer;
import net.runelite.api.TileObject;
import net.runelite.api.coords.LocalPoint;
+import net.runelite.api.coords.WorldArea;
import net.runelite.api.coords.WorldPoint;
import net.runelite.api.widgets.Widget;
@@ -295,7 +299,23 @@ public class OverlayUtil
}
}
- public static void drawTile(Graphics2D graphics, Client client, WorldPoint point, WorldPoint playerPoint, Color color, int strokeWidth, int outlineAlpha, int fillAlpha)
+ public static void renderClickBox(Graphics2D graphics, Point mousePosition, Area objectClickbox, Color configColor)
+ {
+ if (objectClickbox.contains(mousePosition.getX(), mousePosition.getY()))
+ {
+ graphics.setColor(configColor.darker());
+ }
+ else
+ {
+ graphics.setColor(configColor);
+ }
+
+ graphics.draw(objectClickbox);
+ graphics.setColor(new Color(configColor.getRed(), configColor.getGreen(), configColor.getBlue(), 50));
+ graphics.fill(objectClickbox);
+ }
+
+ public static void drawTiles(Graphics2D graphics, Client client, WorldPoint point, WorldPoint playerPoint, Color color, int strokeWidth, int outlineAlpha, int fillAlpha)
{
if (point.distanceTo(playerPoint) >= 32)
{
@@ -312,6 +332,11 @@ public class OverlayUtil
{
return;
}
+ drawStrokeAndFillPoly(graphics, color, strokeWidth, outlineAlpha, fillAlpha, poly);
+ }
+
+ public static void drawStrokeAndFillPoly(Graphics2D graphics, Color color, int strokeWidth, int outlineAlpha, int fillAlpha, Polygon poly)
+ {
graphics.setColor(new Color(color.getRed(), color.getGreen(), color.getBlue(), outlineAlpha));
graphics.setStroke(new BasicStroke(strokeWidth));
graphics.draw(poly);
@@ -340,4 +365,32 @@ public class OverlayUtil
return new Polygon(xpoints, ypoints, 4);
}
+
+ public static List getHitSquares(WorldPoint npcLoc, int npcSize, int thickness, boolean includeUnder)
+ {
+ List little = new WorldArea(npcLoc, npcSize, npcSize).toWorldPointList();
+ List big = new WorldArea(npcLoc.getX() - thickness, npcLoc.getY() - thickness, npcSize + (thickness * 2), npcSize + (thickness * 2), npcLoc.getPlane()).toWorldPointList();
+ if (!includeUnder)
+ {
+ big.removeIf(little::contains);
+ }
+ return big;
+ }
+
+ public static void renderNpcOverlay(Graphics2D graphics, NPC actor, Color color, int outlineWidth, int outlineAlpha, int fillAlpha, Client client)
+ {
+ int size = 1;
+ NPCDefinition composition = actor.getTransformedDefinition();
+ if (composition != null)
+ {
+ size = composition.getSize();
+ }
+ LocalPoint lp = actor.getLocalLocation();
+ Polygon tilePoly = Perspective.getCanvasTileAreaPoly(client, lp, size);
+
+ if (tilePoly != null)
+ {
+ OverlayUtil.drawStrokeAndFillPoly(graphics, color, outlineWidth, outlineAlpha, fillAlpha, tilePoly);
+ }
+ }
}