From ba6cb3352b804a22db8c846e3964f49265fb71b8 Mon Sep 17 00:00:00 2001 From: Adam Date: Thu, 5 Apr 2018 11:58:22 -0400 Subject: [PATCH 1/2] runelite-api: add idEquals to inventory item query --- .../api/queries/InventoryItemQuery.java | 23 ++++++++++++++++++- 1 file changed, 22 insertions(+), 1 deletion(-) diff --git a/runelite-api/src/main/java/net/runelite/api/queries/InventoryItemQuery.java b/runelite-api/src/main/java/net/runelite/api/queries/InventoryItemQuery.java index b22c2a910a..8d375be6fe 100644 --- a/runelite-api/src/main/java/net/runelite/api/queries/InventoryItemQuery.java +++ b/runelite-api/src/main/java/net/runelite/api/queries/InventoryItemQuery.java @@ -24,6 +24,8 @@ */ package net.runelite.api.queries; +import java.util.Arrays; +import java.util.Objects; import lombok.RequiredArgsConstructor; import net.runelite.api.Client; import net.runelite.api.InventoryID; @@ -44,7 +46,26 @@ public class InventoryItemQuery extends Query { return null; } - return container.getItems(); + return Arrays.stream(container.getItems()) + .filter(Objects::nonNull) + .filter(predicate) + .toArray(Item[]::new); + } + + public InventoryItemQuery idEquals(int... ids) + { + predicate = and(item -> + { + for (int id : ids) + { + if (item.getId() == id) + { + return true; + } + } + return false; + }); + return this; } } From 54fb4bf6763ebe9abc003231c72fd8880aab36b3 Mon Sep 17 00:00:00 2001 From: Matt Jaeger Date: Thu, 5 Apr 2018 12:03:18 -0400 Subject: [PATCH 2/2] Highlight dark mage NPC in the center of the abyss when inventory contains a degraded pouch --- .../plugins/runecraft/AbyssOverlay.java | 48 +++++++++++++---- .../plugins/runecraft/RunecraftConfig.java | 10 ++++ .../plugins/runecraft/RunecraftPlugin.java | 51 +++++++++++++++++-- 3 files changed, 95 insertions(+), 14 deletions(-) diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/runecraft/AbyssOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/runecraft/AbyssOverlay.java index 8a211ba7c2..dced79aa68 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/runecraft/AbyssOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/runecraft/AbyssOverlay.java @@ -25,6 +25,7 @@ package net.runelite.client.plugins.runecraft; import java.awt.Color; +import java.awt.Polygon; import java.awt.geom.Area; import static net.runelite.client.plugins.runecraft.AbyssRifts.AIR_RIFT; import static net.runelite.client.plugins.runecraft.AbyssRifts.BLOOD_RIFT; @@ -49,6 +50,7 @@ import java.util.Map; import java.util.Set; import net.runelite.api.Client; import net.runelite.api.DecorativeObject; +import net.runelite.api.NPC; import net.runelite.api.Perspective; import net.runelite.api.Point; import net.runelite.api.coords.LocalPoint; @@ -56,6 +58,7 @@ import net.runelite.client.game.ItemManager; 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; class AbyssOverlay extends Overlay { @@ -85,24 +88,49 @@ class AbyssOverlay extends Overlay @Override public Dimension render(Graphics2D graphics) { - if (!config.showRifts()) + if (config.showRifts()) { - return null; - } - - LocalPoint localLocation = client.getLocalPlayer().getLocalLocation(); - for (DecorativeObject object : plugin.getAbyssObjects()) - { - LocalPoint location = object.getLocalLocation(); - if (localLocation.distanceTo(location) <= MAX_DISTANCE) + LocalPoint localLocation = client.getLocalPlayer().getLocalLocation(); + for (DecorativeObject object : plugin.getAbyssObjects()) { - renderRifts(graphics, object); + LocalPoint location = object.getLocalLocation(); + if (localLocation.distanceTo(location) <= MAX_DISTANCE) + { + renderRifts(graphics, object); + } } } + if (config.hightlightDarkMage()) + { + highlightDarkMage(graphics); + } + return null; } + private void highlightDarkMage(Graphics2D graphics) + { + if (!plugin.isDegradedPouchInInventory()) + { + return; + } + + NPC darkMage = plugin.getDarkMage(); + if (darkMage == null) + { + return; + } + + Polygon tilePoly = darkMage.getCanvasTilePoly(); + if (tilePoly == null) + { + return; + } + + OverlayUtil.renderPolygon(graphics, tilePoly, Color.green); + } + private void renderRifts(Graphics2D graphics, DecorativeObject object) { AbyssRifts rift = AbyssRifts.getRift(object.getId()); diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/runecraft/RunecraftConfig.java b/runelite-client/src/main/java/net/runelite/client/plugins/runecraft/RunecraftConfig.java index bdb5fa7194..4838e30b63 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/runecraft/RunecraftConfig.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/runecraft/RunecraftConfig.java @@ -205,4 +205,14 @@ public interface RunecraftConfig extends Config { return true; } + + @ConfigItem( + keyName = "hightlightDarkMage", + name = "Highlight Dark Mage NPC", + description = "Configures whether to highlight the Dark Mage when pouches are degraded" + ) + default boolean hightlightDarkMage() + { + return true; + } } diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/runecraft/RunecraftPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/runecraft/RunecraftPlugin.java index f6eac096bd..68a8254b54 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/runecraft/RunecraftPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/runecraft/RunecraftPlugin.java @@ -35,18 +35,20 @@ import java.util.regex.Pattern; import javax.inject.Inject; import lombok.AccessLevel; import lombok.Getter; -import net.runelite.api.ChatMessageType; -import net.runelite.api.DecorativeObject; -import net.runelite.api.GameState; +import net.runelite.api.*; import net.runelite.api.events.ChatMessage; import net.runelite.api.events.ConfigChanged; import net.runelite.api.events.DecorativeObjectDespawned; import net.runelite.api.events.DecorativeObjectSpawned; import net.runelite.api.events.GameStateChanged; +import net.runelite.api.events.GameTick; +import net.runelite.api.queries.InventoryItemQuery; +import net.runelite.api.queries.NPCQuery; import net.runelite.client.config.ConfigManager; import net.runelite.client.plugins.Plugin; import net.runelite.client.plugins.PluginDescriptor; import net.runelite.client.ui.overlay.Overlay; +import net.runelite.client.util.QueryRunner; @PluginDescriptor( name = "Runecraft" @@ -58,6 +60,12 @@ public class RunecraftPlugin extends Plugin @Getter(AccessLevel.PACKAGE) private final Set abyssObjects = new HashSet<>(); + @Getter(AccessLevel.PACKAGE) + private boolean degradedPouchInInventory; + + @Getter(AccessLevel.PACKAGE) + private NPC darkMage; + @Inject private RunecraftOverlay overlay; @@ -67,6 +75,12 @@ public class RunecraftPlugin extends Plugin @Inject private AbyssOverlay abyssOverlay; + @Inject + private QueryRunner queryRunner; + + @Inject + private RunecraftConfig config; + @Provides RunecraftConfig getConfig(ConfigManager configManager) { @@ -89,6 +103,8 @@ public class RunecraftPlugin extends Plugin protected void shutDown() throws Exception { abyssObjects.clear(); + darkMage = null; + degradedPouchInInventory = false; } @Subscribe @@ -100,7 +116,7 @@ public class RunecraftPlugin extends Plugin @Subscribe public void onChatMessage(ChatMessage event) { - if (event.getType() != ChatMessageType.SERVER) + if (event.getType() != ChatMessageType.SERVER || !config.showBindNeck()) { return; } @@ -158,4 +174,31 @@ public class RunecraftPlugin extends Plugin abyssObjects.clear(); } } + + @Subscribe + public void onGameTick(GameTick event) + { + darkMage = null; + + if (!config.hightlightDarkMage()) + { + return; + } + + Query inventoryQuery = new InventoryItemQuery(InventoryID.INVENTORY).idEquals( + ItemID.MEDIUM_POUCH_5511, + ItemID.LARGE_POUCH_5513, + ItemID.GIANT_POUCH_5515 + ); + + Item[] items = queryRunner.runQuery(inventoryQuery); + degradedPouchInInventory = items.length > 0; + + if (degradedPouchInInventory) + { + Query darkMageQuery = new NPCQuery().idEquals(NpcID.DARK_MAGE); + NPC[] result = queryRunner.runQuery(darkMageQuery); + darkMage = result.length >= 1 ? result[0] : null; + } + } }