diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/agilityplugin/AgilityConfig.java b/runelite-client/src/main/java/net/runelite/client/plugins/agilityplugin/AgilityConfig.java index 20b87d2c07..df9b4d4380 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/agilityplugin/AgilityConfig.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/agilityplugin/AgilityConfig.java @@ -68,4 +68,27 @@ public interface AgilityConfig extends Config { return Color.GREEN; } + + @ConfigItem( + keyName = "highlightMarks", + name = "Highlight Marks of Grace", + description = "Enable/disable the highlighting of retrievable Marks of Grace", + position = 4 + ) + default boolean highlightMarks() + { + return true; + } + + @ConfigItem( + keyName = "markHighlight", + name = "Mark highlight Color", + description = "Color of highlighted Marks of Grace", + position = 5 + ) + default Color getMarkColor() + { + return Color.ORANGE; + } + } diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/agilityplugin/AgilityOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/agilityplugin/AgilityOverlay.java index 039aa4df8f..74db01a123 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/agilityplugin/AgilityOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/agilityplugin/AgilityOverlay.java @@ -26,6 +26,7 @@ package net.runelite.client.plugins.agilityplugin; import java.awt.Color; +import static java.awt.Color.RED; import java.awt.Dimension; import java.awt.Graphics2D; import java.awt.geom.Area; @@ -33,10 +34,12 @@ import javax.inject.Inject; import lombok.extern.slf4j.Slf4j; import net.runelite.api.Client; import net.runelite.api.Point; +import net.runelite.api.Tile; import net.runelite.api.coords.LocalPoint; 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.OverlayUtil; @Slf4j public class AgilityOverlay extends Overlay @@ -62,6 +65,7 @@ public class AgilityOverlay extends Overlay { LocalPoint playerLocation = client.getLocalPlayer().getLocalLocation(); Point mousePosition = client.getMouseCanvasPosition(); + final Tile markOfGrace = plugin.getMarkOfGrace(); plugin.getObstacles().forEach((object, tile) -> { if (tile.getPlane() == client.getPlane() @@ -70,7 +74,7 @@ public class AgilityOverlay extends Overlay Area objectClickbox = object.getClickbox(); if (objectClickbox != null) { - Color configColor = config.getOverlayColor(); + Color configColor = markOfGrace != null ? RED : config.getOverlayColor(); if (objectClickbox.contains(mousePosition.getX(), mousePosition.getY())) { graphics.setColor(configColor.darker()); @@ -87,6 +91,15 @@ public class AgilityOverlay extends Overlay }); + if (markOfGrace != null && config.highlightMarks()) + { + if (markOfGrace.getPlane() == client.getPlane() && markOfGrace.getItemLayer() != null + && markOfGrace.getLocalLocation().distanceTo(playerLocation) < MAX_DISTANCE) + { + OverlayUtil.renderTileOverlay(graphics, markOfGrace.getItemLayer(), "Mark of Grace", config.getMarkColor()); + } + } + return null; } } diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/agilityplugin/AgilityPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/agilityplugin/AgilityPlugin.java index b5289a92d6..64c4dd69af 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/agilityplugin/AgilityPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/agilityplugin/AgilityPlugin.java @@ -35,6 +35,10 @@ import javax.inject.Inject; import lombok.Getter; import lombok.extern.slf4j.Slf4j; import net.runelite.api.Client; +import net.runelite.api.Item; +import net.runelite.api.ItemID; +import net.runelite.api.ItemLayer; +import net.runelite.api.Node; import static net.runelite.api.Skill.AGILITY; import net.runelite.api.Tile; import net.runelite.api.TileObject; @@ -49,6 +53,7 @@ import net.runelite.api.events.GameStateChanged; import net.runelite.api.events.GroundObjectChanged; import net.runelite.api.events.GroundObjectDespawned; import net.runelite.api.events.GroundObjectSpawned; +import net.runelite.api.events.ItemLayerChanged; import net.runelite.api.events.WallObjectChanged; import net.runelite.api.events.WallObjectDespawned; import net.runelite.api.events.WallObjectSpawned; @@ -66,6 +71,9 @@ public class AgilityPlugin extends Plugin @Getter private final Map obstacles = new HashMap<>(); + @Getter + private Tile markOfGrace; + @Inject @Getter private AgilityOverlay overlay; @@ -99,6 +107,7 @@ public class AgilityPlugin extends Plugin @Override protected void shutDown() throws Exception { + markOfGrace = null; obstacles.clear(); session = null; } @@ -113,6 +122,7 @@ public class AgilityPlugin extends Plugin session = null; break; case LOADING: + markOfGrace = null; obstacles.clear(); break; } @@ -151,6 +161,48 @@ public class AgilityPlugin extends Plugin } } + @Subscribe + public void onItemLayerChanged(ItemLayerChanged event) + { + if (obstacles.isEmpty()) + return; + + Tile tile = event.getTile(); + ItemLayer itemLayer = tile.getItemLayer(); + boolean hasMark = tileHasMark(itemLayer); + + if (markOfGrace != null && tile.getWorldLocation().equals(markOfGrace.getWorldLocation()) && !hasMark) + { + markOfGrace = null; + } + else if (hasMark) + { + markOfGrace = tile; + } + } + + private boolean tileHasMark(ItemLayer itemLayer) + { + if (itemLayer != null) + { + Node currentItem = itemLayer.getBottom(); + + while (currentItem instanceof Item) + { + final Item item = (Item) currentItem; + + currentItem = currentItem.getNext(); + + if (item.getId() == ItemID.MARK_OF_GRACE) + { + return true; + } + } + } + + return false; + } + // This code, brought to you, in part, by the letters C and V // ... and the words "search" and "replace" @Subscribe