diff --git a/runelite-api/src/main/java/net/runelite/api/ObjectComposition.java b/runelite-api/src/main/java/net/runelite/api/ObjectComposition.java index 605679244f..3b90539c19 100644 --- a/runelite-api/src/main/java/net/runelite/api/ObjectComposition.java +++ b/runelite-api/src/main/java/net/runelite/api/ObjectComposition.java @@ -29,6 +29,13 @@ package net.runelite.api; */ public interface ObjectComposition { + /** + * Gets ID for the object. + * + * @return the object ID + */ + int getId(); + /** * Gets the name of the object. * diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/ClueScrollPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/ClueScrollPlugin.java index 89ed66c7d9..6f7e1b74c1 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/ClueScrollPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/ClueScrollPlugin.java @@ -48,8 +48,10 @@ import net.runelite.api.Item; import net.runelite.api.ItemComposition; import net.runelite.api.ItemID; import net.runelite.api.NPC; +import net.runelite.api.ObjectComposition; import net.runelite.api.Scene; import net.runelite.api.Tile; +import net.runelite.api.TileObject; import net.runelite.api.coords.LocalPoint; import net.runelite.api.coords.WorldPoint; import net.runelite.api.events.ChatMessage; @@ -85,7 +87,6 @@ import net.runelite.client.ui.overlay.OverlayManager; import net.runelite.client.ui.overlay.worldmap.WorldMapPointManager; import net.runelite.client.util.ImageUtil; import net.runelite.client.util.Text; -import org.apache.commons.lang3.ArrayUtils; @PluginDescriptor( name = "Clue Scroll", @@ -104,7 +105,7 @@ public class ClueScrollPlugin extends Plugin private final List npcsToMark = new ArrayList<>(); @Getter - private GameObject[] objectsToMark; + private final List objectsToMark = new ArrayList<>(); @Getter private Item[] equippedItems; @@ -307,7 +308,7 @@ public class ClueScrollPlugin extends Plugin @Subscribe public void onGameTick(final GameTick event) { - objectsToMark = null; + objectsToMark.clear(); if (clue instanceof LocationsClueScroll) { @@ -588,10 +589,33 @@ public class ClueScrollPlugin extends Plugin final Scene scene = client.getScene(); final Tile[][][] tiles = scene.getTiles(); final Tile tile = tiles[client.getPlane()][localLocation.getSceneX()][localLocation.getSceneY()]; + objectsToMark.clear(); - objectsToMark = Arrays.stream(tile.getGameObjects()) - .filter(object -> object != null && ArrayUtils.contains(objectIds, object.getId())) - .toArray(GameObject[]::new); + for (GameObject object : tile.getGameObjects()) + { + if (object == null) + { + continue; + } + + for (int id : objectIds) + { + if (object.getId() == id) + { + objectsToMark.add(object); + continue; + } + + // Check impostors + final ObjectComposition comp = client.getObjectDefinition(object.getId()); + final ObjectComposition impostor = comp.getImpostor(); + + if (impostor != null && impostor.getId() == id) + { + objectsToMark.add(object); + } + } + } } private void checkClueNPCs(ClueScroll clue, final NPC... npcs) diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/clues/AnagramClue.java b/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/clues/AnagramClue.java index 93237584ff..4c4d0adcd2 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/clues/AnagramClue.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/clues/AnagramClue.java @@ -30,17 +30,22 @@ import java.awt.Graphics2D; import java.util.Set; import lombok.Getter; import net.runelite.api.NPC; +import net.runelite.api.ObjectID; +import net.runelite.api.TileObject; import net.runelite.api.coords.WorldPoint; import static net.runelite.client.plugins.cluescrolls.ClueScrollOverlay.TITLED_CONTENT_COLOR; -import net.runelite.client.plugins.cluescrolls.ClueScrollPlugin; +import static net.runelite.client.plugins.cluescrolls.ClueScrollWorldOverlay.CLICKBOX_BORDER_COLOR; +import static net.runelite.client.plugins.cluescrolls.ClueScrollWorldOverlay.CLICKBOX_FILL_COLOR; +import static net.runelite.client.plugins.cluescrolls.ClueScrollWorldOverlay.CLICKBOX_HOVER_BORDER_COLOR; import static net.runelite.client.plugins.cluescrolls.ClueScrollWorldOverlay.IMAGE_Z_OFFSET; +import net.runelite.client.plugins.cluescrolls.ClueScrollPlugin; import net.runelite.client.ui.overlay.OverlayUtil; import net.runelite.client.ui.overlay.components.LineComponent; import net.runelite.client.ui.overlay.components.PanelComponent; import net.runelite.client.ui.overlay.components.TitleComponent; @Getter -public class AnagramClue extends ClueScroll implements TextClueScroll, NpcClueScroll, LocationClueScroll +public class AnagramClue extends ClueScroll implements TextClueScroll, NpcClueScroll, ObjectClueScroll { private static final Set CLUES = ImmutableSet.of( new AnagramClue("A BAKER", "Baraek", new WorldPoint(3217, 3434, 0), "Varrock square", "5"), @@ -139,7 +144,7 @@ public class AnagramClue extends ClueScroll implements TextClueScroll, NpcClueSc new AnagramClue("UNLEASH NIGHT MIST", "Sigli the Huntsman", new WorldPoint(2660, 3654, 0), "Rellekka", "302"), new AnagramClue("VESTE", "Steve", new WorldPoint(2432, 3423, 0), "Upstairs Wyvern Area or Stronghold Slayer Cave", "2"), new AnagramClue("VEIL VEDA", "Evil Dave", new WorldPoint(3079, 9892, 0), "Doris' basement, Edgeville", "666"), - new AnagramClue("WOO AN EGG KIWI", "Awowogei", new WorldPoint(2802, 2764, 0), "Ape Atoll", "24"), + new AnagramClue("WOO AN EGG KIWI", "Awowogei", ObjectID.AWOWOGEI, new WorldPoint(2802, 2765, 0), "Ape Atoll", "24"), new AnagramClue("YAWNS GY", "Ysgawyn", new WorldPoint(2340, 3167, 0), "Lletya"), new AnagramClue("MAJORS LAVA BADS AIR", "Ambassador Alvijar", new WorldPoint(2736, 5351, 1), "Dorgesh-Kaan, NE Middle Level", "2505") ); @@ -149,6 +154,7 @@ public class AnagramClue extends ClueScroll implements TextClueScroll, NpcClueSc private WorldPoint location; private String area; private String answer; + private int objectId; private AnagramClue(String text, String npc, WorldPoint location, String area) { @@ -162,6 +168,13 @@ public class AnagramClue extends ClueScroll implements TextClueScroll, NpcClueSc this.location = location; this.area = area; this.answer = answer; + this.objectId = -1; + } + + private AnagramClue(String text, String npc, int objectId, WorldPoint location, String area, String answer) + { + this(text, npc, location, area, answer); + this.objectId = objectId; } @Override @@ -198,13 +211,28 @@ public class AnagramClue extends ClueScroll implements TextClueScroll, NpcClueSc return; } - if (plugin.getNpcsToMark() != null) + // Mark NPC + if (objectId == -1 && plugin.getNpcsToMark() != null) { for (NPC npc : plugin.getNpcsToMark()) { OverlayUtil.renderActorOverlayImage(graphics, npc, plugin.getClueScrollImage(), Color.ORANGE, IMAGE_Z_OFFSET); } } + + // Mark game object + if (objectId != -1) + { + net.runelite.api.Point mousePosition = plugin.getClient().getMouseCanvasPosition(); + + for (TileObject gameObject : plugin.getObjectsToMark()) + { + OverlayUtil.renderHoverableArea(graphics, gameObject.getClickbox(), mousePosition, + CLICKBOX_FILL_COLOR, CLICKBOX_BORDER_COLOR, CLICKBOX_HOVER_BORDER_COLOR); + + OverlayUtil.renderImageLocation(plugin.getClient(), graphics, gameObject.getLocalLocation(), plugin.getClueScrollImage(), IMAGE_Z_OFFSET); + } + } } public static AnagramClue forText(String text) @@ -224,4 +252,9 @@ public class AnagramClue extends ClueScroll implements TextClueScroll, NpcClueSc { return new String[] {npc}; } -} + + public int[] getObjectIds() + { + return new int[] {objectId}; + } +} \ No newline at end of file diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/clues/CrypticClue.java b/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/clues/CrypticClue.java index e89c72650b..facb723008 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/clues/CrypticClue.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/clues/CrypticClue.java @@ -29,11 +29,11 @@ import java.awt.Color; import java.awt.Graphics2D; import java.util.Set; import lombok.Getter; -import net.runelite.api.GameObject; import net.runelite.api.NPC; +import static net.runelite.api.NullObjectID.NULL_1293; import net.runelite.api.ObjectComposition; import static net.runelite.api.ObjectID.*; -import static net.runelite.api.NullObjectID.*; +import net.runelite.api.TileObject; import net.runelite.api.coords.LocalPoint; import net.runelite.api.coords.WorldPoint; import static net.runelite.client.plugins.cluescrolls.ClueScrollOverlay.TITLED_CONTENT_COLOR; @@ -409,7 +409,7 @@ public class CrypticClue extends ClueScroll implements TextClueScroll, NpcClueSc if (plugin.getObjectsToMark() != null) { - for (GameObject gameObject : plugin.getObjectsToMark()) + for (TileObject gameObject : plugin.getObjectsToMark()) { OverlayUtil.renderHoverableArea(graphics, gameObject.getClickbox(), mousePosition, CLICKBOX_FILL_COLOR, CLICKBOX_BORDER_COLOR, CLICKBOX_HOVER_BORDER_COLOR); diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/clues/MapClue.java b/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/clues/MapClue.java index 50ff46159f..414c49806d 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/clues/MapClue.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/clues/MapClue.java @@ -29,7 +29,6 @@ import java.awt.Color; import java.awt.Graphics2D; import java.util.Set; import lombok.Getter; -import net.runelite.api.GameObject; import static net.runelite.api.ItemID.*; import net.runelite.api.ObjectComposition; import static net.runelite.api.ObjectID.CRATE_18506; @@ -37,6 +36,7 @@ import static net.runelite.api.ObjectID.CRATE_2620; import static net.runelite.api.ObjectID.CRATE_354; import static net.runelite.api.ObjectID.CRATE_357; import static net.runelite.api.ObjectID.CRATE_6616; +import net.runelite.api.TileObject; import net.runelite.api.coords.LocalPoint; import net.runelite.api.coords.WorldPoint; import net.runelite.client.plugins.cluescrolls.ClueScrollPlugin; @@ -185,7 +185,7 @@ public class MapClue extends ClueScroll implements ObjectClueScroll if (plugin.getObjectsToMark() != null) { - for (GameObject gameObject : plugin.getObjectsToMark()) + for (TileObject gameObject : plugin.getObjectsToMark()) { OverlayUtil.renderHoverableArea(graphics, gameObject.getClickbox(), mousePosition, CLICKBOX_FILL_COLOR, CLICKBOX_BORDER_COLOR, CLICKBOX_HOVER_BORDER_COLOR); diff --git a/runescape-api/src/main/java/net/runelite/rs/api/RSObjectComposition.java b/runescape-api/src/main/java/net/runelite/rs/api/RSObjectComposition.java index 8bc8a77547..3df00175f5 100644 --- a/runescape-api/src/main/java/net/runelite/rs/api/RSObjectComposition.java +++ b/runescape-api/src/main/java/net/runelite/rs/api/RSObjectComposition.java @@ -29,6 +29,10 @@ import net.runelite.mapping.Import; public interface RSObjectComposition extends ObjectComposition { + @Import("id") + @Override + int getId(); + @Import("name") @Override String getName();