From 3050bd7ca92c02355d03bef1702d1578fa30b5a4 Mon Sep 17 00:00:00 2001 From: Adam Date: Wed, 10 Jun 2020 12:13:33 -0400 Subject: [PATCH] agility plugin: highlight Sepulchre arrows and swords --- .../client/plugins/agility/AgilityConfig.java | 22 ++++++++++++ .../plugins/agility/AgilityOverlay.java | 22 ++++++++++++ .../client/plugins/agility/AgilityPlugin.java | 36 ++++++++++++++++++- 3 files changed, 79 insertions(+), 1 deletion(-) 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 6e100b2bf9..b6eae25fe1 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 @@ -220,4 +220,26 @@ public interface AgilityConfig extends Config { return Color.RED; } + + @ConfigItem( + keyName = "highlightSepulchreNpcs", + name = "Highlight Sepulchre Projectiles", + description = "Highlights arrows and swords in the Sepulchre", + position = 15 + ) + default boolean highlightSepulchreNpcs() + { + return true; + } + + @ConfigItem( + keyName = "sepulchreHighlightColor", + name = "Sepulchre Highlight", + description = "Overlay color for arrows and swords", + position = 16 + ) + default Color sepulchreHighlightColor() + { + return Color.GREEN; + } } 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 6f3bb34a34..258f06e0da 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 @@ -31,8 +31,12 @@ import java.awt.Graphics2D; import java.awt.Polygon; import java.awt.Shape; import java.util.List; +import java.util.Set; import javax.inject.Inject; import net.runelite.api.Client; +import net.runelite.api.NPC; +import net.runelite.api.NPCComposition; +import net.runelite.api.Perspective; import net.runelite.api.Point; import net.runelite.api.Tile; import net.runelite.api.coords.LocalPoint; @@ -138,6 +142,24 @@ class AgilityOverlay extends Overlay highlightTile(graphics, playerLocation, stickTile, config.stickHighlightColor()); } + Set npcs = plugin.getNpcs(); + if (!npcs.isEmpty() && config.highlightSepulchreNpcs()) + { + Color color = config.getOverlayColor(); + for (NPC npc : npcs) + { + NPCComposition npcComposition = npc.getComposition(); + int size = npcComposition.getSize(); + LocalPoint lp = npc.getLocalLocation(); + + Polygon tilePoly = Perspective.getCanvasTileAreaPoly(client, lp, size); + if (tilePoly != null) + { + OverlayUtil.renderPolygon(graphics, tilePoly, color); + } + } + } + return null; } 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 b0aecc8234..a430c0e6d7 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 @@ -24,12 +24,15 @@ */ package net.runelite.client.plugins.agility; +import com.google.common.collect.ImmutableSet; import com.google.inject.Provides; import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; +import java.util.HashSet; import java.util.List; import java.util.Map; +import java.util.Set; import javax.inject.Inject; import lombok.AccessLevel; import lombok.Getter; @@ -38,6 +41,8 @@ import net.runelite.api.Client; import net.runelite.api.ItemID; import static net.runelite.api.ItemID.AGILITY_ARENA_TICKET; import net.runelite.api.MenuAction; +import net.runelite.api.NPC; +import net.runelite.api.NullNpcID; import net.runelite.api.Player; import net.runelite.api.Skill; import static net.runelite.api.Skill.AGILITY; @@ -58,6 +63,8 @@ import net.runelite.api.events.GroundObjectDespawned; import net.runelite.api.events.GroundObjectSpawned; import net.runelite.api.events.ItemDespawned; import net.runelite.api.events.ItemSpawned; +import net.runelite.api.events.NpcDespawned; +import net.runelite.api.events.NpcSpawned; import net.runelite.api.events.StatChanged; import net.runelite.api.events.WallObjectChanged; import net.runelite.api.events.WallObjectDespawned; @@ -81,13 +88,17 @@ import net.runelite.client.ui.overlay.infobox.InfoBoxManager; @PluginDescriptor( name = "Agility", description = "Show helpful information about agility courses and obstacles", - tags = {"grace", "marks", "overlay", "shortcuts", "skilling", "traps"} + tags = {"grace", "marks", "overlay", "shortcuts", "skilling", "traps", "sepulchre"} ) @PluginDependency(XpTrackerPlugin.class) @Slf4j public class AgilityPlugin extends Plugin { private static final int AGILITY_ARENA_REGION_ID = 11157; + private static final Set SEPULCHRE_NPCS = ImmutableSet.of( + NullNpcID.NULL_9672, NullNpcID.NULL_9673, NullNpcID.NULL_9674, // arrows + NullNpcID.NULL_9669, NullNpcID.NULL_9670, NullNpcID.NULL_9671 // swords + ); @Getter private final Map obstacles = new HashMap<>(); @@ -95,6 +106,9 @@ public class AgilityPlugin extends Plugin @Getter private final List marksOfGrace = new ArrayList<>(); + @Getter + private final Set npcs = new HashSet<>(); + @Inject private OverlayManager overlayManager; @@ -158,6 +172,7 @@ public class AgilityPlugin extends Plugin session = null; agilityLevel = 0; stickTile = null; + npcs.clear(); } @Subscribe @@ -182,6 +197,7 @@ public class AgilityPlugin extends Plugin session = null; lastArenaTicketPosition = null; removeAgilityArenaTimer(); + npcs.clear(); break; case LOADING: marksOfGrace.clear(); @@ -457,4 +473,22 @@ public class AgilityPlugin extends Plugin } } } + + @Subscribe + public void onNpcSpawned(NpcSpawned npcSpawned) + { + NPC npc = npcSpawned.getNpc(); + + if (SEPULCHRE_NPCS.contains(npc.getId())) + { + npcs.add(npc); + } + } + + @Subscribe + public void onNpcDespawned(NpcDespawned npcDespawned) + { + NPC npc = npcDespawned.getNpc(); + npcs.remove(npc); + } }