From 33c98d1e2e286da45576fed533d60e936583c0c0 Mon Sep 17 00:00:00 2001 From: melkypie <5113962+melkypie@users.noreply.github.com> Date: Sun, 3 May 2020 00:47:06 +0300 Subject: [PATCH 01/36] client: move FishingSpot to net.runelite.client.game --- .../client/{plugins/fishing => game}/FishingSpot.java | 6 +++--- .../net/runelite/client/plugins/fishing/FishingPlugin.java | 1 + .../client/plugins/fishing/FishingSpotMinimapOverlay.java | 1 + .../runelite/client/plugins/fishing/FishingSpotOverlay.java | 1 + 4 files changed, 6 insertions(+), 3 deletions(-) rename runelite-client/src/main/java/net/runelite/client/{plugins/fishing => game}/FishingSpot.java (98%) diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/fishing/FishingSpot.java b/runelite-client/src/main/java/net/runelite/client/game/FishingSpot.java similarity index 98% rename from runelite-client/src/main/java/net/runelite/client/plugins/fishing/FishingSpot.java rename to runelite-client/src/main/java/net/runelite/client/game/FishingSpot.java index ed91ff29a2..b116d71495 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/fishing/FishingSpot.java +++ b/runelite-client/src/main/java/net/runelite/client/game/FishingSpot.java @@ -22,7 +22,7 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -package net.runelite.client.plugins.fishing; +package net.runelite.client.game; import com.google.common.collect.ImmutableMap; import java.util.Map; @@ -105,7 +105,7 @@ import static net.runelite.api.NpcID.FISHING_SPOT_4928; import static net.runelite.api.NpcID.FISHING_SPOT_6784; @Getter -enum FishingSpot +public enum FishingSpot { SHRIMP("Shrimp, Anchovies", ItemID.RAW_SHRIMPS, FISHING_SPOT_1514, FISHING_SPOT_1518, FISHING_SPOT_1521, @@ -202,7 +202,7 @@ enum FishingSpot this.ids = ids; } - static FishingSpot findSpot(int id) + public static FishingSpot findSpot(int id) { return SPOTS.get(id); } diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/fishing/FishingPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/fishing/FishingPlugin.java index 27a7bd3f32..8c424f4618 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/fishing/FishingPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/fishing/FishingPlugin.java @@ -66,6 +66,7 @@ import net.runelite.client.Notifier; import net.runelite.client.config.ConfigManager; import net.runelite.client.eventbus.Subscribe; import net.runelite.client.events.OverlayMenuClicked; +import net.runelite.client.game.FishingSpot; import net.runelite.client.plugins.Plugin; import net.runelite.client.plugins.PluginDependency; import net.runelite.client.plugins.PluginDescriptor; diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/fishing/FishingSpotMinimapOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/fishing/FishingSpotMinimapOverlay.java index aa9e72cdf6..7b995a9945 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/fishing/FishingSpotMinimapOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/fishing/FishingSpotMinimapOverlay.java @@ -32,6 +32,7 @@ import lombok.AccessLevel; import lombok.Setter; import net.runelite.api.GraphicID; import net.runelite.api.NPC; +import net.runelite.client.game.FishingSpot; import net.runelite.client.ui.overlay.Overlay; import net.runelite.client.ui.overlay.OverlayLayer; import net.runelite.client.ui.overlay.OverlayPosition; diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/fishing/FishingSpotOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/fishing/FishingSpotOverlay.java index c7200b9201..82c710a214 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/fishing/FishingSpotOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/fishing/FishingSpotOverlay.java @@ -41,6 +41,7 @@ import net.runelite.api.Perspective; import net.runelite.api.Point; import net.runelite.api.coords.LocalPoint; import net.runelite.api.coords.WorldPoint; +import net.runelite.client.game.FishingSpot; import net.runelite.client.game.ItemManager; import net.runelite.client.ui.overlay.Overlay; import net.runelite.client.ui.overlay.OverlayLayer; From d9cd3dfd45dc21a692ef521aa9abd8571875b760 Mon Sep 17 00:00:00 2001 From: melkypie <5113962+melkypie@users.noreply.github.com> Date: Sun, 3 May 2020 00:55:23 +0300 Subject: [PATCH 02/36] fishing: add unmapped fishing spots --- .../net/runelite/client/game/FishingSpot.java | 48 ++++++++++++------- 1 file changed, 31 insertions(+), 17 deletions(-) diff --git a/runelite-client/src/main/java/net/runelite/client/game/FishingSpot.java b/runelite-client/src/main/java/net/runelite/client/game/FishingSpot.java index b116d71495..0000624d2d 100644 --- a/runelite-client/src/main/java/net/runelite/client/game/FishingSpot.java +++ b/runelite-client/src/main/java/net/runelite/client/game/FishingSpot.java @@ -30,9 +30,11 @@ import lombok.Getter; import net.runelite.api.ItemID; import static net.runelite.api.NpcID.FISHING_SPOT_1497; import static net.runelite.api.NpcID.FISHING_SPOT_1498; +import static net.runelite.api.NpcID.FISHING_SPOT_1499; import static net.runelite.api.NpcID.FISHING_SPOT_1510; import static net.runelite.api.NpcID.FISHING_SPOT_1511; import static net.runelite.api.NpcID.FISHING_SPOT_1514; +import static net.runelite.api.NpcID.FISHING_SPOT_1517; import static net.runelite.api.NpcID.FISHING_SPOT_1518; import static net.runelite.api.NpcID.FISHING_SPOT_1519; import static net.runelite.api.NpcID.FISHING_SPOT_1520; @@ -43,12 +45,15 @@ import static net.runelite.api.NpcID.FISHING_SPOT_1524; import static net.runelite.api.NpcID.FISHING_SPOT_1525; import static net.runelite.api.NpcID.FISHING_SPOT_1528; import static net.runelite.api.NpcID.FISHING_SPOT_1530; +import static net.runelite.api.NpcID.FISHING_SPOT_1535; import static net.runelite.api.NpcID.FISHING_SPOT_1536; import static net.runelite.api.NpcID.FISHING_SPOT_1542; import static net.runelite.api.NpcID.FISHING_SPOT_1544; import static net.runelite.api.NpcID.FISHING_SPOT_2653; import static net.runelite.api.NpcID.FISHING_SPOT_2654; import static net.runelite.api.NpcID.FISHING_SPOT_2655; +import static net.runelite.api.NpcID.FISHING_SPOT_3317; +import static net.runelite.api.NpcID.FISHING_SPOT_3419; import static net.runelite.api.NpcID.FISHING_SPOT_3913; import static net.runelite.api.NpcID.FISHING_SPOT_3914; import static net.runelite.api.NpcID.FISHING_SPOT_3915; @@ -86,8 +91,13 @@ import static net.runelite.api.NpcID.FISHING_SPOT_8523; import static net.runelite.api.NpcID.FISHING_SPOT_8525; import static net.runelite.api.NpcID.FISHING_SPOT_8526; import static net.runelite.api.NpcID.FISHING_SPOT_8527; +import static net.runelite.api.NpcID.FISHING_SPOT_9171; +import static net.runelite.api.NpcID.FISHING_SPOT_9172; +import static net.runelite.api.NpcID.FISHING_SPOT_9173; +import static net.runelite.api.NpcID.FISHING_SPOT_9174; import static net.runelite.api.NpcID.ROD_FISHING_SPOT; import static net.runelite.api.NpcID.ROD_FISHING_SPOT_1506; +import static net.runelite.api.NpcID.ROD_FISHING_SPOT_1507; import static net.runelite.api.NpcID.ROD_FISHING_SPOT_1508; import static net.runelite.api.NpcID.ROD_FISHING_SPOT_1509; import static net.runelite.api.NpcID.ROD_FISHING_SPOT_1513; @@ -95,6 +105,8 @@ import static net.runelite.api.NpcID.ROD_FISHING_SPOT_1515; import static net.runelite.api.NpcID.ROD_FISHING_SPOT_1516; import static net.runelite.api.NpcID.ROD_FISHING_SPOT_1526; import static net.runelite.api.NpcID.ROD_FISHING_SPOT_1527; +import static net.runelite.api.NpcID.ROD_FISHING_SPOT_3417; +import static net.runelite.api.NpcID.ROD_FISHING_SPOT_3418; import static net.runelite.api.NpcID.ROD_FISHING_SPOT_6825; import static net.runelite.api.NpcID.ROD_FISHING_SPOT_7463; import static net.runelite.api.NpcID.ROD_FISHING_SPOT_7464; @@ -108,33 +120,35 @@ import static net.runelite.api.NpcID.FISHING_SPOT_6784; public enum FishingSpot { SHRIMP("Shrimp, Anchovies", ItemID.RAW_SHRIMPS, - FISHING_SPOT_1514, FISHING_SPOT_1518, FISHING_SPOT_1521, - FISHING_SPOT_1523, FISHING_SPOT_1524, FISHING_SPOT_1525, - FISHING_SPOT_1528, FISHING_SPOT_1530, FISHING_SPOT_1544, - FISHING_SPOT_3913, FISHING_SPOT_7155, FISHING_SPOT_7459, - FISHING_SPOT_7462, FISHING_SPOT_7467, FISHING_SPOT_7469, - FISHING_SPOT_7947 + FISHING_SPOT_1514, FISHING_SPOT_1517, FISHING_SPOT_1518, + FISHING_SPOT_1521, FISHING_SPOT_1523, FISHING_SPOT_1524, + FISHING_SPOT_1525, FISHING_SPOT_1528, FISHING_SPOT_1530, + FISHING_SPOT_1544, FISHING_SPOT_3913, FISHING_SPOT_7155, + FISHING_SPOT_7459, FISHING_SPOT_7462, FISHING_SPOT_7467, + FISHING_SPOT_7469, FISHING_SPOT_7947 ), LOBSTER("Lobster, Swordfish, Tuna", ItemID.RAW_LOBSTER, FISHING_SPOT_1510, FISHING_SPOT_1519, FISHING_SPOT_1522, FISHING_SPOT_3914, FISHING_SPOT_5820, FISHING_SPOT_7199, FISHING_SPOT_7460, FISHING_SPOT_7465, FISHING_SPOT_7470, - FISHING_SPOT_7946 + FISHING_SPOT_7946, FISHING_SPOT_9173, FISHING_SPOT_9174 ), SHARK("Shark, Bass", ItemID.RAW_SHARK, - FISHING_SPOT_1511, FISHING_SPOT_1520, FISHING_SPOT_3915, - FISHING_SPOT_4476, FISHING_SPOT_4477, FISHING_SPOT_5233, - FISHING_SPOT_5234, FISHING_SPOT_5821, FISHING_SPOT_7200, - FISHING_SPOT_7461, FISHING_SPOT_7466, FISHING_SPOT_8525, - FISHING_SPOT_8526, FISHING_SPOT_8527 + FISHING_SPOT_1511, FISHING_SPOT_1520, FISHING_SPOT_3419, + FISHING_SPOT_3915, FISHING_SPOT_4476, FISHING_SPOT_4477, + FISHING_SPOT_5233, FISHING_SPOT_5234, FISHING_SPOT_5821, + FISHING_SPOT_7200, FISHING_SPOT_7461, FISHING_SPOT_7466, + FISHING_SPOT_8525, FISHING_SPOT_8526, FISHING_SPOT_8527, + FISHING_SPOT_9171, FISHING_SPOT_9172 ), MONKFISH("Monkfish", ItemID.RAW_MONKFISH, FISHING_SPOT_4316 ), SALMON("Salmon, Trout", ItemID.RAW_SALMON, - ROD_FISHING_SPOT, ROD_FISHING_SPOT_1506, ROD_FISHING_SPOT_1508, - ROD_FISHING_SPOT_1509, ROD_FISHING_SPOT_1513, ROD_FISHING_SPOT_1515, - ROD_FISHING_SPOT_1516, ROD_FISHING_SPOT_1526, ROD_FISHING_SPOT_1527, + ROD_FISHING_SPOT, ROD_FISHING_SPOT_1506, ROD_FISHING_SPOT_1507, + ROD_FISHING_SPOT_1508, ROD_FISHING_SPOT_1509, ROD_FISHING_SPOT_1513, + ROD_FISHING_SPOT_1515, ROD_FISHING_SPOT_1516, ROD_FISHING_SPOT_1526, + ROD_FISHING_SPOT_1527, ROD_FISHING_SPOT_3417, ROD_FISHING_SPOT_3418, ROD_FISHING_SPOT_7463, ROD_FISHING_SPOT_7464, ROD_FISHING_SPOT_7468, ROD_FISHING_SPOT_8524 ), @@ -163,13 +177,13 @@ public enum FishingSpot FISHING_SPOT_6488 ), CAVE_EEL("Cave eel", ItemID.RAW_CAVE_EEL, - FISHING_SPOT_1497, FISHING_SPOT_1498 + FISHING_SPOT_1497, FISHING_SPOT_1498, FISHING_SPOT_1499 ), SLIMY_EEL("Slimy eel", ItemID.RAW_SLIMY_EEL, FISHING_SPOT_2653, FISHING_SPOT_2654, FISHING_SPOT_2655 ), DARK_CRAB("Dark Crab", ItemID.RAW_DARK_CRAB, - FISHING_SPOT_1536 + FISHING_SPOT_1535, FISHING_SPOT_1536 ), COMMON_TENCH("Common tench, Bluegill, Greater siren, Mottled eel", ItemID.COMMON_TENCH, FISHING_SPOT_8523); From 12994e63c2a7126cb43689a10fb19a3af0e62349 Mon Sep 17 00:00:00 2001 From: melkypie <5113962+melkypie@users.noreply.github.com> Date: Sun, 3 May 2020 01:00:52 +0300 Subject: [PATCH 03/36] worldmap: add fishing spot tooltips --- .../net/runelite/client/game/FishingSpot.java | 47 ++++- .../plugins/worldmap/FishingSpotLocation.java | 189 ++++++++++++++++++ .../plugins/worldmap/FishingSpotPoint.java | 39 ++++ .../plugins/worldmap/WorldMapConfig.java | 11 + .../plugins/worldmap/WorldMapPlugin.java | 12 ++ 5 files changed, 290 insertions(+), 8 deletions(-) create mode 100644 runelite-client/src/main/java/net/runelite/client/plugins/worldmap/FishingSpotLocation.java create mode 100644 runelite-client/src/main/java/net/runelite/client/plugins/worldmap/FishingSpotPoint.java diff --git a/runelite-client/src/main/java/net/runelite/client/game/FishingSpot.java b/runelite-client/src/main/java/net/runelite/client/game/FishingSpot.java index 0000624d2d..0a6437efb9 100644 --- a/runelite-client/src/main/java/net/runelite/client/game/FishingSpot.java +++ b/runelite-client/src/main/java/net/runelite/client/game/FishingSpot.java @@ -28,6 +28,7 @@ import com.google.common.collect.ImmutableMap; import java.util.Map; import lombok.Getter; import net.runelite.api.ItemID; +import static net.runelite.api.NpcID.FISHING_SPOT; import static net.runelite.api.NpcID.FISHING_SPOT_1497; import static net.runelite.api.NpcID.FISHING_SPOT_1498; import static net.runelite.api.NpcID.FISHING_SPOT_1499; @@ -54,15 +55,21 @@ import static net.runelite.api.NpcID.FISHING_SPOT_2654; import static net.runelite.api.NpcID.FISHING_SPOT_2655; import static net.runelite.api.NpcID.FISHING_SPOT_3317; import static net.runelite.api.NpcID.FISHING_SPOT_3419; +import static net.runelite.api.NpcID.FISHING_SPOT_3657; import static net.runelite.api.NpcID.FISHING_SPOT_3913; import static net.runelite.api.NpcID.FISHING_SPOT_3914; import static net.runelite.api.NpcID.FISHING_SPOT_3915; +import static net.runelite.api.NpcID.FISHING_SPOT_4079; +import static net.runelite.api.NpcID.FISHING_SPOT_4080; +import static net.runelite.api.NpcID.FISHING_SPOT_4081; +import static net.runelite.api.NpcID.FISHING_SPOT_4082; import static net.runelite.api.NpcID.FISHING_SPOT_4316; import static net.runelite.api.NpcID.FISHING_SPOT_4476; import static net.runelite.api.NpcID.FISHING_SPOT_4477; import static net.runelite.api.NpcID.FISHING_SPOT_4710; import static net.runelite.api.NpcID.FISHING_SPOT_4712; import static net.runelite.api.NpcID.FISHING_SPOT_4713; +import static net.runelite.api.NpcID.FISHING_SPOT_4714; import static net.runelite.api.NpcID.FISHING_SPOT_5233; import static net.runelite.api.NpcID.FISHING_SPOT_5234; import static net.runelite.api.NpcID.FISHING_SPOT_5820; @@ -119,7 +126,7 @@ import static net.runelite.api.NpcID.FISHING_SPOT_6784; @Getter public enum FishingSpot { - SHRIMP("Shrimp, Anchovies", ItemID.RAW_SHRIMPS, + SHRIMP("Shrimp, Anchovies", "Anchovies", ItemID.RAW_SHRIMPS, FISHING_SPOT_1514, FISHING_SPOT_1517, FISHING_SPOT_1518, FISHING_SPOT_1521, FISHING_SPOT_1523, FISHING_SPOT_1524, FISHING_SPOT_1525, FISHING_SPOT_1528, FISHING_SPOT_1530, @@ -127,13 +134,13 @@ public enum FishingSpot FISHING_SPOT_7459, FISHING_SPOT_7462, FISHING_SPOT_7467, FISHING_SPOT_7469, FISHING_SPOT_7947 ), - LOBSTER("Lobster, Swordfish, Tuna", ItemID.RAW_LOBSTER, + LOBSTER("Lobster, Swordfish, Tuna", "Lobster", ItemID.RAW_LOBSTER, FISHING_SPOT_1510, FISHING_SPOT_1519, FISHING_SPOT_1522, FISHING_SPOT_3914, FISHING_SPOT_5820, FISHING_SPOT_7199, FISHING_SPOT_7460, FISHING_SPOT_7465, FISHING_SPOT_7470, FISHING_SPOT_7946, FISHING_SPOT_9173, FISHING_SPOT_9174 ), - SHARK("Shark, Bass", ItemID.RAW_SHARK, + SHARK("Shark, Bass", "Shark", ItemID.RAW_SHARK, FISHING_SPOT_1511, FISHING_SPOT_1520, FISHING_SPOT_3419, FISHING_SPOT_3915, FISHING_SPOT_4476, FISHING_SPOT_4477, FISHING_SPOT_5233, FISHING_SPOT_5234, FISHING_SPOT_5821, @@ -144,7 +151,7 @@ public enum FishingSpot MONKFISH("Monkfish", ItemID.RAW_MONKFISH, FISHING_SPOT_4316 ), - SALMON("Salmon, Trout", ItemID.RAW_SALMON, + SALMON("Salmon, Trout", "Salmon", ItemID.RAW_SALMON, ROD_FISHING_SPOT, ROD_FISHING_SPOT_1506, ROD_FISHING_SPOT_1507, ROD_FISHING_SPOT_1508, ROD_FISHING_SPOT_1509, ROD_FISHING_SPOT_1513, ROD_FISHING_SPOT_1515, ROD_FISHING_SPOT_1516, ROD_FISHING_SPOT_1526, @@ -164,10 +171,10 @@ public enum FishingSpot MINNOW("Minnow", ItemID.MINNOW, FISHING_SPOT_7730, FISHING_SPOT_7731, FISHING_SPOT_7732, FISHING_SPOT_7733 ), - INFERNAL_EEL("Infernal Eel", ItemID.INFERNAL_EEL, + INFERNAL_EEL("Infernal Eel", "Leaping sturgeon", ItemID.INFERNAL_EEL, ROD_FISHING_SPOT_7676 ), - KARAMBWAN("Karambwan", ItemID.RAW_KARAMBWAN, + KARAMBWAN("Karambwan", "Karambwanji", ItemID.RAW_KARAMBWAN, FISHING_SPOT_4712, FISHING_SPOT_4713 ), KARAMBWANJI("Karambwanji, Shrimp", ItemID.KARAMBWANJI, @@ -185,12 +192,30 @@ public enum FishingSpot DARK_CRAB("Dark Crab", ItemID.RAW_DARK_CRAB, FISHING_SPOT_1535, FISHING_SPOT_1536 ), - COMMON_TENCH("Common tench, Bluegill, Greater siren, Mottled eel", ItemID.COMMON_TENCH, - FISHING_SPOT_8523); + COMMON_TENCH("Common tench, Bluegill, Greater siren, Mottled eel", "Greater siren", ItemID.COMMON_TENCH, + FISHING_SPOT_8523 + ), + TUTORIAL_SHRIMP("Shrimp", ItemID.RAW_SHRIMPS, + FISHING_SPOT_3317 + ), + ETCETERIA_LOBSTER("Lobster", "Lobster (Approval only)", ItemID.RAW_LOBSTER, + FISHING_SPOT_3657 + ), + QUEST_RUM_DEAL("Sluglings", "Rum deal (Quest)", ItemID.SLUGLINGS, + FISHING_SPOT + ), + QUEST_TAI_BWO_WANNAI_TRIO("Karambwan", "Tai Bwo Wannai Trio (Quest)", ItemID.RAW_KARAMBWAN, + FISHING_SPOT_4714 + ), + QUEST_FISHING_CONTEST("Giant carp", "Fishing Contest (Quest)", ItemID.GIANT_CARP, + FISHING_SPOT_4079, FISHING_SPOT_4080, FISHING_SPOT_4081, FISHING_SPOT_4082 + ), + ; private static final Map SPOTS; private final String name; + private final String worldMapTooltip; private final int fishSpriteId; private final int[] ids; @@ -210,8 +235,14 @@ public enum FishingSpot } FishingSpot(String spot, int fishSpriteId, int... ids) + { + this(spot, spot, fishSpriteId, ids); + } + + FishingSpot(String spot, String worldMapTooltip, int fishSpriteId, int... ids) { this.name = spot; + this.worldMapTooltip = worldMapTooltip; this.fishSpriteId = fishSpriteId; this.ids = ids; } diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/worldmap/FishingSpotLocation.java b/runelite-client/src/main/java/net/runelite/client/plugins/worldmap/FishingSpotLocation.java new file mode 100644 index 0000000000..f789d7e7c3 --- /dev/null +++ b/runelite-client/src/main/java/net/runelite/client/plugins/worldmap/FishingSpotLocation.java @@ -0,0 +1,189 @@ +/* + * Copyright (c) 2020, melky + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.client.plugins.worldmap; + +import java.util.Arrays; +import java.util.stream.Collectors; +import lombok.Getter; +import net.runelite.api.coords.WorldPoint; +import net.runelite.client.game.FishingSpot; + +@Getter +enum FishingSpotLocation +{ + AL_KHARID(FishingSpot.SHRIMP, + new WorldPoint(3274, 3140, 0), new WorldPoint(3266, 3148, 0)), + APE_ATOLL_SOUTH_WEST(FishingSpot.SHARK, new WorldPoint(2698, 2703, 0)), + BARBARIAN_OUTPOST(FishingSpot.SHRIMP, + new WorldPoint(2497, 3548, 0), new WorldPoint(2509, 3562, 0), + new WorldPoint(2514, 3575, 0)), + BARBARIAN_VILLAGE(FishingSpot.SALMON, + new WorldPoint(3103, 3424, 0), new WorldPoint(3109, 3433, 0)), + BRAINDEATH_ISLAND(FishingSpot.QUEST_RUM_DEAL, + new WorldPoint(2112, 5074, 0), new WorldPoint(2161, 5061, 0), + new WorldPoint(2172, 5074, 0)), + BRIMHAVEN_QUEST(FishingSpot.QUEST_TAI_BWO_WANNAI_TRIO, new WorldPoint(2767, 3165, 0)), + BURGH_DE_ROTT_SOUTH(FishingSpot.SHARK, + new WorldPoint(3472, 3192, 0), new WorldPoint(3486, 3182, 0), + new WorldPoint(3497, 3174, 0), new WorldPoint(3513, 3177, 0), + new WorldPoint(3528, 3164, 0), new WorldPoint(3537, 3177, 0), + new WorldPoint(3545, 3179, 0), new WorldPoint(3553, 3177, 0), + new WorldPoint(3559, 3173, 0), new WorldPoint(3564, 3174, 0)), + CATHERBY(new FishingSpot[]{FishingSpot.SHARK, FishingSpot.LOBSTER, FishingSpot.SHRIMP}, + new WorldPoint(2836, 3431, 0), new WorldPoint(2844, 3429, 0), + new WorldPoint(2853, 3423, 0), new WorldPoint(2859, 3426, 0)), + DRAYNOR_VILLAGE(FishingSpot.SHRIMP, new WorldPoint(3084, 3228, 0)), + ENTRANA_CENTER(FishingSpot.SALMON, + new WorldPoint(2841, 3356, 0), new WorldPoint(2842, 3359, 0), + new WorldPoint(2847, 3361, 0)), + ENTRANA_DOCK(FishingSpot.SHRIMP, + new WorldPoint(2875, 3331, 0), new WorldPoint(2878, 3334, 0), + new WorldPoint(2878, 3339, 0), new WorldPoint(2875, 3342, 0)), + ETCETERIA_DOCK(FishingSpot.ETCETERIA_LOBSTER, new WorldPoint(2577, 3854, 0)), + FAIRY_RING_CKR(FishingSpot.KARAMBWANJI, new WorldPoint(2806, 3014, 0)), + FAIRY_RING_DKP(FishingSpot.KARAMBWAN, + new WorldPoint(2898, 3119, 0), new WorldPoint(2911, 3119, 0)), + FARMING_GUILD_SOUTH_EAST(FishingSpot.SALMON, new WorldPoint(1269, 3707, 0)), + FARMING_GUILD_SOUTH_WEST1(FishingSpot.SHARK, new WorldPoint(1209, 3687, 0)), + FARMING_GUILD_SOUTH_WEST2(FishingSpot.SHARK, new WorldPoint(1221, 3714, 0)), + FARMING_GUILD_WEST(FishingSpot.SHARK, + new WorldPoint(1199, 3736, 0), new WorldPoint(1208, 3749, 0)), + FELDIP_HILLS_SOUTH(FishingSpot.SHRIMP, new WorldPoint(2511, 2838, 0)), + FISHING_CONTEST(FishingSpot.QUEST_FISHING_CONTEST, + new WorldPoint(2626, 3415, 0), new WorldPoint(2631, 3425, 0), + new WorldPoint(2629, 3435, 0), new WorldPoint(2636, 3444, 0)), + FISHING_GUILD(new FishingSpot[]{FishingSpot.SHARK, FishingSpot.LOBSTER}, + new WorldPoint(2604, 3423, 0), new WorldPoint(2605, 3417, 0), + new WorldPoint(2611, 3413, 0)), + FISHING_GUILD_PLATFORM(FishingSpot.MINNOW, + new WorldPoint(2609, 3444, 0), new WorldPoint(2617, 3444, 0)), + FISHING_PLATFORM(FishingSpot.SHRIMP, + new WorldPoint(2788, 3273, 0), new WorldPoint(2794, 3279, 0), + new WorldPoint(2793, 3283, 0)), + HOSIDIUS_CENTER(FishingSpot.SALMON, new WorldPoint(1715, 3612, 0)), + HOSIDIUS_EAST(new FishingSpot[]{FishingSpot.SHARK, FishingSpot.LOBSTER, FishingSpot.SHRIMP}, + new WorldPoint(1817, 3603, 0), new WorldPoint(1827, 3605, 0), + new WorldPoint(1828, 3614, 0), new WorldPoint(1840, 3619, 0), + new WorldPoint(1838, 3595, 0)), + INFIRMARY_SOUTH(FishingSpot.SALMON, new WorldPoint(1584, 3566, 0)), + IORWERTH_CAMP_INSIDE(FishingSpot.SALMON, new WorldPoint(3239, 5997, 0)), + IORWERTH_CAMP_NORTH_INSIDE(FishingSpot.SHARK, new WorldPoint(3185, 6027, 0)), + IORWERTH_CAMP_NORTH_OUTSIDE(FishingSpot.SHARK, new WorldPoint(2161, 3275, 0)), + IORWERTH_CAMP_OUTSIDE(FishingSpot.SALMON, new WorldPoint(2215, 3245, 0)), + ISAFDAR_NORTH_EAST_INSIDE(FishingSpot.SALMON, new WorldPoint(3293, 6005, 0)), + ISAFDAR_NORTH_EAST_OUTSIDE(FishingSpot.SALMON, new WorldPoint(2269, 3253, 0)), + JATISZO(new FishingSpot[]{FishingSpot.SHARK, FishingSpot.LOBSTER}, + new WorldPoint(2400, 3780, 0), new WorldPoint(2412, 3780, 0), + new WorldPoint(2419, 3789, 0)), + KINGSTOWN_EAST(FishingSpot.SALMON, new WorldPoint(1723, 3685, 0)), + LANDS_END_EAST(FishingSpot.SHRIMP, new WorldPoint(1534, 3414, 0)), + LANDS_END_WEST(new FishingSpot[]{FishingSpot.SHARK, FishingSpot.LOBSTER, FishingSpot.SHRIMP}, + new WorldPoint(1484, 3432, 0)), + LUMBRIDGE_RIVER(FishingSpot.SALMON, + new WorldPoint(3238, 3241, 0), new WorldPoint(3237, 3253, 0)), + LUMBRIDGE_SWAMP_CAVE_EAST(FishingSpot.CAVE_EEL, new WorldPoint(3244, 9570, 0)), + LUMBRIDGE_SWAMP_CAVE_WEST(FishingSpot.CAVE_EEL, new WorldPoint(3153, 9544, 0)), + LUMBRIDGE_SWAMP_SOUTH_EAST(FishingSpot.SHRIMP, new WorldPoint(3244, 3153, 0)), + MARIM(FishingSpot.SHARK, new WorldPoint(2774, 2740, 0)), + MOLCH_ISLAND(FishingSpot.COMMON_TENCH, new WorldPoint(1370, 3632, 0)), + MORTTON(FishingSpot.SLIMY_EEL, new WorldPoint(3439, 3273, 0)), + MORT_MYRE_SWAMP_NORTH(FishingSpot.SLIMY_EEL, + new WorldPoint(3480, 3433, 0), new WorldPoint(3485, 3448, 0)), + MORT_MYRE_SWAMP_WEST(FishingSpot.SLIMY_EEL, + new WorldPoint(3425, 3409, 0), new WorldPoint(3432, 3415, 0)), + MOR_UI_REK(FishingSpot.INFERNAL_EEL, + new WorldPoint(2443, 5104, 0), new WorldPoint(2476, 5077, 0), + new WorldPoint(2537, 5086, 0)), + MOUNT_QUIDAMORTEM(FishingSpot.BARB_FISH, + new WorldPoint(1271, 3546, 0), new WorldPoint(1265, 3541, 0), + new WorldPoint(1253, 3542, 0)), + MUDSKIPPER_POINT(FishingSpot.SHRIMP, + new WorldPoint(2995, 3158, 0), new WorldPoint(2985, 3176, 0)), + MUSA_POINT(new FishingSpot[]{FishingSpot.LOBSTER, FishingSpot.SHRIMP}, new WorldPoint(2925, 3179, 0)), + MYTHS_GUILD_NORTH(FishingSpot.LOBSTER, new WorldPoint(2456, 2893, 0)), + OBSERVATORY_EAST(FishingSpot.SALMON, new WorldPoint(2466, 3151, 0)), + OTTOS_GROTTO(FishingSpot.BARB_FISH, + new WorldPoint(2500, 3509, 0), new WorldPoint(2504, 3495, 0), + new WorldPoint(2505, 3515, 0), new WorldPoint(2520, 3518, 0)), + PISCATORIS(FishingSpot.MONKFISH, new WorldPoint(2308, 3700, 0)), + PORT_PISCARILIUS_EAST(FishingSpot.ANGLERFISH, new WorldPoint(1831, 3773, 0)), + PORT_PISCARILIUS_WEST(new FishingSpot[]{FishingSpot.LOBSTER, FishingSpot.SHRIMP}, + new WorldPoint(1762, 3796, 0), new WorldPoint(1745, 3802, 0)), + PRIFFDINAS_INSIDE_EAST(new FishingSpot[]{FishingSpot.SHARK, FishingSpot.LOBSTER}, + new WorldPoint(3186, 6102, 0), new WorldPoint(3187, 6123, 0)), + PRIFFDINAS_INSIDE_NORTH(new FishingSpot[]{FishingSpot.SHARK, FishingSpot.LOBSTER}, + new WorldPoint(3250, 6182, 0), new WorldPoint(3258, 6180, 0), + new WorldPoint(3258, 6197, 0)), + PRIFFDINAS_OUTSIDE_EAST(new FishingSpot[]{FishingSpot.SHARK, FishingSpot.LOBSTER}, + new WorldPoint(2162, 3350, 0), new WorldPoint(2163, 3371, 0)), + PRIFFDINAS_OUTSIDE_NORTH(new FishingSpot[]{FishingSpot.SHARK, FishingSpot.LOBSTER}, + new WorldPoint(2226, 3430, 0), new WorldPoint(2234, 3428, 0), + new WorldPoint(2234, 3445, 0)), + RELLEKKA_CENTER(FishingSpot.LOBSTER, new WorldPoint(2641, 3696, 0)), + RELLEKKA_NORTH_EAST(FishingSpot.SHARK, new WorldPoint(2649, 3708, 0)), + RELLEKKA_WEST(FishingSpot.SHRIMP, new WorldPoint(2632, 3694, 0)), + RIVER_ARDOUGNE(FishingSpot.SALMON, + new WorldPoint(2560, 3374, 0), new WorldPoint(2565, 3370, 0), + new WorldPoint(2526, 3412, 0), new WorldPoint(2536, 3405, 0), + new WorldPoint(2507, 3420, 0)), + SAND_CRAB_PENINSULA_NORTH(FishingSpot.SHARK, new WorldPoint(1675, 3490, 0)), + SAND_CRAB_PENINSULA_SOUTH(FishingSpot.SHRIMP, new WorldPoint(1676, 3469, 0)), + SAND_CRAB_PENINSULA_WEST(FishingSpot.LOBSTER, new WorldPoint(1668, 3479, 0)), + SEERS_VILLAGE(FishingSpot.SALMON, + new WorldPoint(2725, 3524, 0), new WorldPoint(2714, 3531, 0)), + SHILO_VILLAGE(FishingSpot.SALMON, + new WorldPoint(2854, 2977, 0), new WorldPoint(2858, 2973, 0)), + TAVERLEY_DUNGEON(FishingSpot.LAVA_EEL, + new WorldPoint(2893, 9764, 0), new WorldPoint(2889, 9766, 0), + new WorldPoint(2883, 9765, 0)), + TREE_GNOME_STRONGHOLD(FishingSpot.SALMON, + new WorldPoint(2389, 3422, 0), new WorldPoint(2382, 3415, 0)), + TUTORIAL_ISLAND(FishingSpot.TUTORIAL_SHRIMP, new WorldPoint(3100, 3091, 0)), + WATSON_HOUSE_SOUTH(FishingSpot.SALMON, new WorldPoint(1646, 3558, 0)), + WILDERNESS_BANDIT_CAMP(FishingSpot.SHRIMP, new WorldPoint(3049, 3704, 0)), + WILDERNESS_DARK_CRABS(FishingSpot.DARK_CRAB, + new WorldPoint(3362, 3802, 0), new WorldPoint(3347, 3813, 0)), + WILDERNESS_LAVA_MAZE(FishingSpot.LAVA_EEL, new WorldPoint(3071, 3840, 0)), + WILDERNESS_RESOURCE_AREA(FishingSpot.DARK_CRAB, new WorldPoint(3186, 3925, 0)), + ZUL_ANDRA(FishingSpot.SACRED_EEL, + new WorldPoint(2183, 3068, 0), new WorldPoint(2195, 3067, 0)), + ; + + private final WorldPoint[] locations; + private final String tooltip; + + FishingSpotLocation(FishingSpot fishingSpot, WorldPoint... locations) + { + this.tooltip = fishingSpot.getWorldMapTooltip(); + this.locations = locations; + } + + FishingSpotLocation(FishingSpot[] fishingSpot, WorldPoint... locations) + { + this.tooltip = Arrays.stream(fishingSpot).map(FishingSpot::getWorldMapTooltip).collect(Collectors.joining(" / ")); + this.locations = locations; + } +} diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/worldmap/FishingSpotPoint.java b/runelite-client/src/main/java/net/runelite/client/plugins/worldmap/FishingSpotPoint.java new file mode 100644 index 0000000000..fa32c86ffe --- /dev/null +++ b/runelite-client/src/main/java/net/runelite/client/plugins/worldmap/FishingSpotPoint.java @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2020, melky + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.client.plugins.worldmap; + +import java.awt.image.BufferedImage; +import net.runelite.api.coords.WorldPoint; +import net.runelite.client.ui.overlay.worldmap.WorldMapPoint; + +class FishingSpotPoint extends WorldMapPoint +{ + FishingSpotPoint(WorldPoint point, String tooltip, BufferedImage icon) + { + super(point, icon); + setTooltip(tooltip); + } +} diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/worldmap/WorldMapConfig.java b/runelite-client/src/main/java/net/runelite/client/plugins/worldmap/WorldMapConfig.java index 25a1065b56..704a451415 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/worldmap/WorldMapConfig.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/worldmap/WorldMapConfig.java @@ -262,4 +262,15 @@ public interface WorldMapConfig extends Config { return true; } + + @ConfigItem( + keyName = WorldMapPlugin.CONFIG_KEY_FISHING_SPOT_TOOLTIPS, + name = "Show fishing spot tooltips", + description = "Indicates the type of fish fishable at the fishing spot", + position = 22 + ) + default boolean fishingSpotTooltips() + { + return true; + } } diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/worldmap/WorldMapPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/worldmap/WorldMapPlugin.java index 1eaaf89619..25c7a09ff7 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/worldmap/WorldMapPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/worldmap/WorldMapPlugin.java @@ -84,6 +84,7 @@ public class WorldMapPlugin extends Plugin static final String CONFIG_KEY_MINING_SITE_TOOLTIPS = "miningSiteTooltips"; static final String CONFIG_KEY_DUNGEON_TOOLTIPS = "dungeonTooltips"; static final String CONFIG_KEY_HUNTER_AREA_TOOLTIPS = "hunterAreaTooltips"; + static final String CONFIG_KEY_FISHING_SPOT_TOOLTIPS = "fishingSpotTooltips"; static { @@ -162,6 +163,7 @@ public class WorldMapPlugin extends Plugin worldMapPointManager.removeIf(RareTreePoint.class::isInstance); worldMapPointManager.removeIf(RunecraftingAltarPoint.class::isInstance); worldMapPointManager.removeIf(DungeonPoint.class::isInstance); + worldMapPointManager.removeIf(FishingSpotPoint.class::isInstance); agilityLevel = 0; woodcuttingLevel = 0; } @@ -347,6 +349,16 @@ public class WorldMapPlugin extends Plugin .map(value -> new HunterAreaPoint(value, BLANK_ICON)) .forEach(worldMapPointManager::add); } + + worldMapPointManager.removeIf(FishingSpotPoint.class::isInstance); + if (config.fishingSpotTooltips()) + { + Arrays.stream(FishingSpotLocation.values()).forEach(location -> + Arrays.stream(location.getLocations()) + .map(point -> new FishingSpotPoint(point, location.getTooltip(), BLANK_ICON)) + .forEach(worldMapPointManager::add) + ); + } } private void updateQuestStartPointIcons() From fefcec39e88cc05a2fd7857bc4c21be811013eeb Mon Sep 17 00:00:00 2001 From: BKOSRS <54762282+BKOSRS@users.noreply.github.com> Date: Tue, 5 May 2020 20:03:19 -0400 Subject: [PATCH 04/36] skill calc: add barbarian fishing to agility skill calculator --- .../plugins/skillcalculator/skill_agility.json | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/runelite-client/src/main/resources/net/runelite/client/plugins/skillcalculator/skill_agility.json b/runelite-client/src/main/resources/net/runelite/client/plugins/skillcalculator/skill_agility.json index cc490c113f..197fefeba1 100644 --- a/runelite-client/src/main/resources/net/runelite/client/plugins/skillcalculator/skill_agility.json +++ b/runelite-client/src/main/resources/net/runelite/client/plugins/skillcalculator/skill_agility.json @@ -12,6 +12,12 @@ "name": "Draynor Village Rooftop", "xp": 120 }, + { + "level":15, + "icon": 11328, + "name": "Leaping trout", + "xp": 5 + }, { "level": 20, "icon": 11849, @@ -30,6 +36,12 @@ "name": "Penguin Agility Course", "xp": 540 }, + { + "level":30, + "icon": 11330, + "name": "Leaping salmon", + "xp": 6 + }, { "level": 35, "icon": 1365, @@ -42,6 +54,12 @@ "name": "Canifis Rooftop", "xp": 240 }, + { + "level":45, + "icon": 11332, + "name": "Leaping sturgeon", + "xp": 7 + }, { "level": 48, "icon": 4026, From 96b1130d2e1603046f27be493fe25900109e7716 Mon Sep 17 00:00:00 2001 From: gfidder <50161749+gfidder@users.noreply.github.com> Date: Tue, 5 May 2020 22:40:51 -0500 Subject: [PATCH 05/36] worldmap: Fix Hosidius farming patch location --- .../runelite/client/plugins/worldmap/FarmingPatchLocation.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/worldmap/FarmingPatchLocation.java b/runelite-client/src/main/java/net/runelite/client/plugins/worldmap/FarmingPatchLocation.java index eaadd3a5be..cc3546e706 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/worldmap/FarmingPatchLocation.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/worldmap/FarmingPatchLocation.java @@ -37,7 +37,7 @@ enum FarmingPatchLocation ), ALLOTMENT_FLOWER("Allotment/Flower", new WorldPoint(3289, 6100, 0)), ALLOTMENT_HERB_FLOWER("Allotment/Herb/Flower", - new WorldPoint(1809, 3490, 0), + new WorldPoint(1729, 3558, 0), new WorldPoint(3598, 3524, 0), new WorldPoint(3052, 3309, 0), new WorldPoint(2810, 3462, 0), From a0fa178783dae0cf6895d1e149e4fc7c41096b3d Mon Sep 17 00:00:00 2001 From: BKOSRS <54762282+BKOSRS@users.noreply.github.com> Date: Wed, 6 May 2020 00:46:04 -0400 Subject: [PATCH 06/36] agility: highlight ending door of penguin agility course (#11478) --- .../java/net/runelite/client/plugins/agility/Obstacles.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/agility/Obstacles.java b/runelite-client/src/main/java/net/runelite/client/plugins/agility/Obstacles.java index edd06acee7..71617848bc 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/agility/Obstacles.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/agility/Obstacles.java @@ -56,7 +56,7 @@ class Obstacles // Penguin STEPPING_STONE_21120, STEPPING_STONE_21126, STEPPING_STONE_21128, STEPPING_STONE_21129, STEPPING_STONE_21130, STEPPING_STONE_21131, STEPPING_STONE_21132, STEPPING_STONE_21133, - ICICLES, ICE, ICE_21149, ICE_21150, ICE_21151, ICE_21152, ICE_21153, ICE_21154, ICE_21155, ICE_21156, + ICICLES, ICE, ICE_21149, ICE_21150, ICE_21151, ICE_21152, ICE_21153, ICE_21154, ICE_21155, ICE_21156, GATE_21172, // Barbarian ROPESWING_23131, LOG_BALANCE_23144, OBSTACLE_NET_20211, BALANCING_LEDGE_23547, LADDER_16682, CRUMBLING_WALL_1948, // Canifis From fa615a07f2170093e95a162fa2197491caebc5d7 Mon Sep 17 00:00:00 2001 From: melkypie <5113962+melkypie@users.noreply.github.com> Date: Sat, 2 May 2020 15:27:26 +0300 Subject: [PATCH 07/36] worldmap: add tooltips to agility courses --- .../worldmap/AgilityCourseLocation.java | 61 +++++++++++++++++++ .../plugins/worldmap/AgilityCoursePoint.java | 42 +++++++++++++ .../plugins/worldmap/WorldMapConfig.java | 47 ++++++++------ .../plugins/worldmap/WorldMapPlugin.java | 18 ++++++ 4 files changed, 150 insertions(+), 18 deletions(-) create mode 100644 runelite-client/src/main/java/net/runelite/client/plugins/worldmap/AgilityCourseLocation.java create mode 100644 runelite-client/src/main/java/net/runelite/client/plugins/worldmap/AgilityCoursePoint.java diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/worldmap/AgilityCourseLocation.java b/runelite-client/src/main/java/net/runelite/client/plugins/worldmap/AgilityCourseLocation.java new file mode 100644 index 0000000000..003916372e --- /dev/null +++ b/runelite-client/src/main/java/net/runelite/client/plugins/worldmap/AgilityCourseLocation.java @@ -0,0 +1,61 @@ +/* + * Copyright (c) 2020, melky + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.client.plugins.worldmap; + +import lombok.Getter; +import net.runelite.api.coords.WorldPoint; + +@Getter +enum AgilityCourseLocation +{ + AGILITY_PYRAMID("Agility Pyramid", new WorldPoint(3347, 2827, 0)), + AL_KHARID_ROOFTOP_COURSE("Al Kharid Rooftop Course", new WorldPoint(3272, 3195, 0)), + APE_ATOLL_AGILITY_COURSE("Ape Atoll Agility Course", new WorldPoint(2752, 2742, 0)), + ARDOUGNE_ROOFTOP_COURSE("Ardougne Rooftop Course", new WorldPoint(2673, 3298, 0)), + BARBARIAN_OUTPOST_AGILITY_COURSE("Barbarian Outpost Agility Course", new WorldPoint(2544, 3569, 0)), + BRIMHAVEN_AGILITY_ARENA("Brimhaven Agility Arena", new WorldPoint(2806, 3193, 0)), + CANIFIS_ROOFTOP_COURSE("Canifis Rooftop Course", new WorldPoint(3506, 3490, 0)), + DRAYNOR_VILLAGE_ROOFTOP_COURSE("Draynor Village Rooftop Course", new WorldPoint(3103, 3279, 0)), + FALADOR_ROOFTOP_COURSE("Falador Rooftop Course", new WorldPoint(3035, 3342, 0)), + GNOME_STRONGHOLD_AGILITY_COURSE("Gnome Stronghold Agility Course", new WorldPoint(2474, 3436, 0)), + PENGUIN_AGILITY_COURSE("Penguin Agility Course", new WorldPoint(2638, 4041, 0)), + POLLNIVNEACH_ROOFTOP_COURSE("Pollnivneach Rooftop Course", new WorldPoint(3350, 2963, 0)), + PRIFDDINAS_AGILITY_COURSE("Prifddinas Agility Course", new WorldPoint(3253, 6109, 0)), + RELLEKKA_ROOFTOP_COURSE("Rellekka Rooftop Course", new WorldPoint(2624, 3677, 0)), + SEERS_VILLAGE_ROOFTOP_COURSE("Seers' Village Rooftop Course", new WorldPoint(2728, 3488, 0)), + VARROCK_ROOFTOP_COURSE("Varrock Rooftop Course", new WorldPoint(3219, 3414, 0)), + WEREWOLF_AGILITY_COURSE("Werewolf Agility Course", new WorldPoint(3542, 3463, 0)), + WILDERNESS_AGILITY_COURSE("Wilderness Agility Course", new WorldPoint(2997, 3916, 0)); + + private final String tooltip; + private final WorldPoint location; + + AgilityCourseLocation(String tooltip, WorldPoint location) + { + this.tooltip = tooltip; + this.location = location; + } +} diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/worldmap/AgilityCoursePoint.java b/runelite-client/src/main/java/net/runelite/client/plugins/worldmap/AgilityCoursePoint.java new file mode 100644 index 0000000000..982f8db975 --- /dev/null +++ b/runelite-client/src/main/java/net/runelite/client/plugins/worldmap/AgilityCoursePoint.java @@ -0,0 +1,42 @@ +/* + * Copyright (c) 2020, melky + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.client.plugins.worldmap; + +import java.awt.image.BufferedImage; +import net.runelite.client.ui.overlay.worldmap.WorldMapPoint; + +class AgilityCoursePoint extends WorldMapPoint +{ + AgilityCoursePoint(AgilityCourseLocation data, BufferedImage icon, boolean showTooltip) + { + super(data.getLocation(), icon); + + if (showTooltip) + { + setTooltip(data.getTooltip()); + } + } +} diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/worldmap/WorldMapConfig.java b/runelite-client/src/main/java/net/runelite/client/plugins/worldmap/WorldMapConfig.java index 704a451415..d401f36a4b 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/worldmap/WorldMapConfig.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/worldmap/WorldMapConfig.java @@ -76,11 +76,22 @@ public interface WorldMapConfig extends Config return true; } + @ConfigItem( + keyName = WorldMapPlugin.CONFIG_KEY_AGILITY_COURSE_TOOLTIPS, + name = "Show agility course in tooltip", + description = "Displays the name of the agility course in the tooltip", + position = 5 + ) + default boolean agilityCourseTooltip() + { + return true; + } + @ConfigItem( keyName = WorldMapPlugin.CONFIG_KEY_NORMAL_TELEPORT_ICON, name = "Show Standard Spellbook destinations", description = "Show icons at the destinations for teleports in the Standard Spellbook", - position = 5 + position = 6 ) default boolean normalTeleportIcon() { @@ -91,7 +102,7 @@ public interface WorldMapConfig extends Config keyName = WorldMapPlugin.CONFIG_KEY_MINIGAME_TOOLTIP, name = "Show minigame name in tooltip", description = "Display the name of the minigame in the icon tooltip", - position = 6 + position = 7 ) default boolean minigameTooltip() { @@ -102,7 +113,7 @@ public interface WorldMapConfig extends Config keyName = WorldMapPlugin.CONFIG_KEY_ANCIENT_TELEPORT_ICON, name = "Show Ancient Magicks destinations", description = "Show icons at the destinations for teleports in the Ancient Spellbook", - position = 7 + position = 8 ) default boolean ancientTeleportIcon() { @@ -113,7 +124,7 @@ public interface WorldMapConfig extends Config keyName = WorldMapPlugin.CONFIG_KEY_LUNAR_TELEPORT_ICON, name = "Show Lunar Spellbook destinations", description = "Show icons at the destinations for teleports in the Lunar Spellbook", - position = 8 + position = 9 ) default boolean lunarTeleportIcon() { @@ -124,7 +135,7 @@ public interface WorldMapConfig extends Config keyName = WorldMapPlugin.CONFIG_KEY_ARCEUUS_TELEPORT_ICON, name = "Show Arceuus Spellbook destinations", description = "Show icons at the destinations for teleports in the Arceuus Spellbook", - position = 9 + position = 10 ) default boolean arceuusTeleportIcon() { @@ -135,7 +146,7 @@ public interface WorldMapConfig extends Config keyName = WorldMapPlugin.CONFIG_KEY_JEWELLERY_TELEPORT_ICON, name = "Show jewellery teleport locations", description = "Show icons at the destinations for teleports from jewellery", - position = 10 + position = 11 ) default boolean jewelleryTeleportIcon() { @@ -146,7 +157,7 @@ public interface WorldMapConfig extends Config keyName = WorldMapPlugin.CONFIG_KEY_SCROLL_TELEPORT_ICON, name = "Show teleport scroll locations", description = "Show icons at the destinations for teleports from scrolls", - position = 11 + position = 12 ) default boolean scrollTeleportIcon() { @@ -157,7 +168,7 @@ public interface WorldMapConfig extends Config keyName = WorldMapPlugin.CONFIG_KEY_MISC_TELEPORT_ICON, name = "Show misc teleport locations", description = "Show icons at the destinations for miscellaneous teleport items", - position = 12 + position = 13 ) default boolean miscellaneousTeleportIcon() { @@ -168,7 +179,7 @@ public interface WorldMapConfig extends Config keyName = WorldMapPlugin.CONFIG_KEY_QUEST_START_TOOLTIPS, name = "Show quest names and status", description = "Indicates the names of quests and shows completion status", - position = 13 + position = 14 ) default boolean questStartTooltips() { @@ -179,7 +190,7 @@ public interface WorldMapConfig extends Config keyName = WorldMapPlugin.CONFIG_KEY_FARMING_PATCH_TOOLTIPS, name = "Show farming patch type", description = "Display the type of farming patches in the icon tooltip", - position = 14 + position = 15 ) default boolean farmingPatchTooltips() { @@ -190,7 +201,7 @@ public interface WorldMapConfig extends Config keyName = WorldMapPlugin.CONFIG_KEY_RARE_TREE_TOOLTIPS, name = "Show rare tree type", description = "Display the type of rare tree in the icon tooltip", - position = 15 + position = 16 ) default boolean rareTreeTooltips() { @@ -201,7 +212,7 @@ public interface WorldMapConfig extends Config keyName = WorldMapPlugin.CONFIG_KEY_RARE_TREE_LEVEL_ICON, name = "Indicate unavailable trees", description = "Indicate rare trees you do not have the level to cut on the icon", - position = 16 + position = 17 ) default boolean rareTreeLevelIcon() { @@ -212,7 +223,7 @@ public interface WorldMapConfig extends Config keyName = WorldMapPlugin.CONFIG_KEY_TRANSPORATION_TELEPORT_TOOLTIPS, name = "Show transporation tooltips", description = "Indicates types and destinations of Transporation", - position = 17 + position = 18 ) default boolean transportationTeleportTooltips() { @@ -223,7 +234,7 @@ public interface WorldMapConfig extends Config keyName = WorldMapPlugin.CONFIG_KEY_RUNECRAFTING_ALTAR_ICON, name = "Show runecrafting altar locations", description = "Show the icons of runecrafting altars", - position = 18 + position = 19 ) default boolean runecraftingAltarIcon() { @@ -234,7 +245,7 @@ public interface WorldMapConfig extends Config keyName = WorldMapPlugin.CONFIG_KEY_MINING_SITE_TOOLTIPS, name = "Show mining site tooltips", description = "Indicates the ore available at mining sites", - position = 19 + position = 20 ) default boolean miningSiteTooltips() { @@ -245,7 +256,7 @@ public interface WorldMapConfig extends Config keyName = WorldMapPlugin.CONFIG_KEY_DUNGEON_TOOLTIPS, name = "Show dungeon tooltips", description = "Indicates the names of dungeons", - position = 20 + position = 21 ) default boolean dungeonTooltips() { @@ -256,7 +267,7 @@ public interface WorldMapConfig extends Config keyName = WorldMapPlugin.CONFIG_KEY_HUNTER_AREA_TOOLTIPS, name = "Show hunter area tooltips", description = "Indicates the creatures inside a hunting area", - position = 21 + position = 22 ) default boolean hunterAreaTooltips() { @@ -267,7 +278,7 @@ public interface WorldMapConfig extends Config keyName = WorldMapPlugin.CONFIG_KEY_FISHING_SPOT_TOOLTIPS, name = "Show fishing spot tooltips", description = "Indicates the type of fish fishable at the fishing spot", - position = 22 + position = 23 ) default boolean fishingSpotTooltips() { diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/worldmap/WorldMapPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/worldmap/WorldMapPlugin.java index 25c7a09ff7..f53c36baaf 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/worldmap/WorldMapPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/worldmap/WorldMapPlugin.java @@ -67,6 +67,7 @@ public class WorldMapPlugin extends Plugin static final String CONFIG_KEY_FAIRY_RING_ICON = "fairyRingIcon"; static final String CONFIG_KEY_AGILITY_SHORTCUT_TOOLTIPS = "agilityShortcutTooltips"; static final String CONFIG_KEY_AGILITY_SHORTCUT_LEVEL_ICON = "agilityShortcutIcon"; + static final String CONFIG_KEY_AGILITY_COURSE_TOOLTIPS = "agilityCourseTooltips"; static final String CONFIG_KEY_NORMAL_TELEPORT_ICON = "standardSpellbookIcon"; static final String CONFIG_KEY_ANCIENT_TELEPORT_ICON = "ancientSpellbookIcon"; static final String CONFIG_KEY_LUNAR_TELEPORT_ICON = "lunarSpellbookIcon"; @@ -164,6 +165,7 @@ public class WorldMapPlugin extends Plugin worldMapPointManager.removeIf(RunecraftingAltarPoint.class::isInstance); worldMapPointManager.removeIf(DungeonPoint.class::isInstance); worldMapPointManager.removeIf(FishingSpotPoint.class::isInstance); + worldMapPointManager.removeIf(AgilityCoursePoint.class::isInstance); agilityLevel = 0; woodcuttingLevel = 0; } @@ -233,6 +235,21 @@ public class WorldMapPlugin extends Plugin } } + private void updateAgilityCourseIcons() + { + worldMapPointManager.removeIf(AgilityCoursePoint.class::isInstance); + + if (config.agilityCourseTooltip()) + { + Arrays.stream(AgilityCourseLocation.values()) + .filter(value -> value.getLocation() != null) + .map(value -> new AgilityCoursePoint(value, + BLANK_ICON, + config.agilityCourseTooltip())) + .forEach(worldMapPointManager::add); + } + } + private void updateRareTreeIcons() { worldMapPointManager.removeIf(RareTreePoint.class::isInstance); @@ -253,6 +270,7 @@ public class WorldMapPlugin extends Plugin private void updateShownIcons() { updateAgilityIcons(); + updateAgilityCourseIcons(); updateRareTreeIcons(); updateQuestStartPointIcons(); From 0e5829c97be901587564b8feb3df6437171f8a8e Mon Sep 17 00:00:00 2001 From: melkypie <5113962+melkypie@users.noreply.github.com> Date: Sat, 2 May 2020 15:33:17 +0300 Subject: [PATCH 08/36] worldmap: add the ability to indicate rooftop courses --- .../worldmap/AgilityCourseLocation.java | 2 + .../plugins/worldmap/WorldMapConfig.java | 47 +++++++++++------- .../plugins/worldmap/WorldMapPlugin.java | 10 +++- .../plugins/worldmap/rooftop_course_icon.png | Bin 0 -> 287 bytes 4 files changed, 39 insertions(+), 20 deletions(-) create mode 100644 runelite-client/src/main/resources/net/runelite/client/plugins/worldmap/rooftop_course_icon.png diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/worldmap/AgilityCourseLocation.java b/runelite-client/src/main/java/net/runelite/client/plugins/worldmap/AgilityCourseLocation.java index 003916372e..ee0c61db88 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/worldmap/AgilityCourseLocation.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/worldmap/AgilityCourseLocation.java @@ -52,10 +52,12 @@ enum AgilityCourseLocation private final String tooltip; private final WorldPoint location; + private final boolean rooftopCourse; AgilityCourseLocation(String tooltip, WorldPoint location) { this.tooltip = tooltip; this.location = location; + this.rooftopCourse = this.name().contains("ROOFTOP_COURSE"); } } diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/worldmap/WorldMapConfig.java b/runelite-client/src/main/java/net/runelite/client/plugins/worldmap/WorldMapConfig.java index d401f36a4b..e3e11dccd9 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/worldmap/WorldMapConfig.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/worldmap/WorldMapConfig.java @@ -87,11 +87,22 @@ public interface WorldMapConfig extends Config return true; } + @ConfigItem( + keyName = WorldMapPlugin.CONFIG_KEY_AGILITY_COURSE_ROOFTOP_ICON, + name = "Indicate rooftop courses", + description = "Replace the agility icon with a mark of grace for rooftop courses", + position = 6 + ) + default boolean agilityCourseRooftop() + { + return true; + } + @ConfigItem( keyName = WorldMapPlugin.CONFIG_KEY_NORMAL_TELEPORT_ICON, name = "Show Standard Spellbook destinations", description = "Show icons at the destinations for teleports in the Standard Spellbook", - position = 6 + position = 7 ) default boolean normalTeleportIcon() { @@ -102,7 +113,7 @@ public interface WorldMapConfig extends Config keyName = WorldMapPlugin.CONFIG_KEY_MINIGAME_TOOLTIP, name = "Show minigame name in tooltip", description = "Display the name of the minigame in the icon tooltip", - position = 7 + position = 8 ) default boolean minigameTooltip() { @@ -113,7 +124,7 @@ public interface WorldMapConfig extends Config keyName = WorldMapPlugin.CONFIG_KEY_ANCIENT_TELEPORT_ICON, name = "Show Ancient Magicks destinations", description = "Show icons at the destinations for teleports in the Ancient Spellbook", - position = 8 + position = 9 ) default boolean ancientTeleportIcon() { @@ -124,7 +135,7 @@ public interface WorldMapConfig extends Config keyName = WorldMapPlugin.CONFIG_KEY_LUNAR_TELEPORT_ICON, name = "Show Lunar Spellbook destinations", description = "Show icons at the destinations for teleports in the Lunar Spellbook", - position = 9 + position = 10 ) default boolean lunarTeleportIcon() { @@ -135,7 +146,7 @@ public interface WorldMapConfig extends Config keyName = WorldMapPlugin.CONFIG_KEY_ARCEUUS_TELEPORT_ICON, name = "Show Arceuus Spellbook destinations", description = "Show icons at the destinations for teleports in the Arceuus Spellbook", - position = 10 + position = 11 ) default boolean arceuusTeleportIcon() { @@ -146,7 +157,7 @@ public interface WorldMapConfig extends Config keyName = WorldMapPlugin.CONFIG_KEY_JEWELLERY_TELEPORT_ICON, name = "Show jewellery teleport locations", description = "Show icons at the destinations for teleports from jewellery", - position = 11 + position = 12 ) default boolean jewelleryTeleportIcon() { @@ -157,7 +168,7 @@ public interface WorldMapConfig extends Config keyName = WorldMapPlugin.CONFIG_KEY_SCROLL_TELEPORT_ICON, name = "Show teleport scroll locations", description = "Show icons at the destinations for teleports from scrolls", - position = 12 + position = 13 ) default boolean scrollTeleportIcon() { @@ -168,7 +179,7 @@ public interface WorldMapConfig extends Config keyName = WorldMapPlugin.CONFIG_KEY_MISC_TELEPORT_ICON, name = "Show misc teleport locations", description = "Show icons at the destinations for miscellaneous teleport items", - position = 13 + position = 14 ) default boolean miscellaneousTeleportIcon() { @@ -179,7 +190,7 @@ public interface WorldMapConfig extends Config keyName = WorldMapPlugin.CONFIG_KEY_QUEST_START_TOOLTIPS, name = "Show quest names and status", description = "Indicates the names of quests and shows completion status", - position = 14 + position = 15 ) default boolean questStartTooltips() { @@ -190,7 +201,7 @@ public interface WorldMapConfig extends Config keyName = WorldMapPlugin.CONFIG_KEY_FARMING_PATCH_TOOLTIPS, name = "Show farming patch type", description = "Display the type of farming patches in the icon tooltip", - position = 15 + position = 16 ) default boolean farmingPatchTooltips() { @@ -201,7 +212,7 @@ public interface WorldMapConfig extends Config keyName = WorldMapPlugin.CONFIG_KEY_RARE_TREE_TOOLTIPS, name = "Show rare tree type", description = "Display the type of rare tree in the icon tooltip", - position = 16 + position = 17 ) default boolean rareTreeTooltips() { @@ -212,7 +223,7 @@ public interface WorldMapConfig extends Config keyName = WorldMapPlugin.CONFIG_KEY_RARE_TREE_LEVEL_ICON, name = "Indicate unavailable trees", description = "Indicate rare trees you do not have the level to cut on the icon", - position = 17 + position = 18 ) default boolean rareTreeLevelIcon() { @@ -223,7 +234,7 @@ public interface WorldMapConfig extends Config keyName = WorldMapPlugin.CONFIG_KEY_TRANSPORATION_TELEPORT_TOOLTIPS, name = "Show transporation tooltips", description = "Indicates types and destinations of Transporation", - position = 18 + position = 19 ) default boolean transportationTeleportTooltips() { @@ -234,7 +245,7 @@ public interface WorldMapConfig extends Config keyName = WorldMapPlugin.CONFIG_KEY_RUNECRAFTING_ALTAR_ICON, name = "Show runecrafting altar locations", description = "Show the icons of runecrafting altars", - position = 19 + position = 20 ) default boolean runecraftingAltarIcon() { @@ -245,7 +256,7 @@ public interface WorldMapConfig extends Config keyName = WorldMapPlugin.CONFIG_KEY_MINING_SITE_TOOLTIPS, name = "Show mining site tooltips", description = "Indicates the ore available at mining sites", - position = 20 + position = 21 ) default boolean miningSiteTooltips() { @@ -256,7 +267,7 @@ public interface WorldMapConfig extends Config keyName = WorldMapPlugin.CONFIG_KEY_DUNGEON_TOOLTIPS, name = "Show dungeon tooltips", description = "Indicates the names of dungeons", - position = 21 + position = 22 ) default boolean dungeonTooltips() { @@ -267,7 +278,7 @@ public interface WorldMapConfig extends Config keyName = WorldMapPlugin.CONFIG_KEY_HUNTER_AREA_TOOLTIPS, name = "Show hunter area tooltips", description = "Indicates the creatures inside a hunting area", - position = 22 + position = 23 ) default boolean hunterAreaTooltips() { @@ -278,7 +289,7 @@ public interface WorldMapConfig extends Config keyName = WorldMapPlugin.CONFIG_KEY_FISHING_SPOT_TOOLTIPS, name = "Show fishing spot tooltips", description = "Indicates the type of fish fishable at the fishing spot", - position = 23 + position = 24 ) default boolean fishingSpotTooltips() { diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/worldmap/WorldMapPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/worldmap/WorldMapPlugin.java index f53c36baaf..74741357e0 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/worldmap/WorldMapPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/worldmap/WorldMapPlugin.java @@ -61,6 +61,7 @@ public class WorldMapPlugin extends Plugin private static final BufferedImage STARTED_ICON; private static final BufferedImage FINISHED_ICON; private static final BufferedImage MINING_SITE_ICON; + private static final BufferedImage ROOFTOP_COURSE_ICON; static final String CONFIG_KEY = "worldmap"; static final String CONFIG_KEY_FAIRY_RING_TOOLTIPS = "fairyRingTooltips"; @@ -68,6 +69,7 @@ public class WorldMapPlugin extends Plugin static final String CONFIG_KEY_AGILITY_SHORTCUT_TOOLTIPS = "agilityShortcutTooltips"; static final String CONFIG_KEY_AGILITY_SHORTCUT_LEVEL_ICON = "agilityShortcutIcon"; static final String CONFIG_KEY_AGILITY_COURSE_TOOLTIPS = "agilityCourseTooltips"; + static final String CONFIG_KEY_AGILITY_COURSE_ROOFTOP_ICON = "agilityCourseRooftopIcon"; static final String CONFIG_KEY_NORMAL_TELEPORT_ICON = "standardSpellbookIcon"; static final String CONFIG_KEY_ANCIENT_TELEPORT_ICON = "ancientSpellbookIcon"; static final String CONFIG_KEY_LUNAR_TELEPORT_ICON = "lunarSpellbookIcon"; @@ -120,6 +122,10 @@ public class WorldMapPlugin extends Plugin MINING_SITE_ICON = new BufferedImage(iconBufferSize, iconBufferSize, BufferedImage.TYPE_INT_ARGB); final BufferedImage miningSiteIcon = ImageUtil.getResourceStreamFromClass(WorldMapPlugin.class, "mining_site_icon.png"); MINING_SITE_ICON.getGraphics().drawImage(miningSiteIcon, 1, 1, null); + + ROOFTOP_COURSE_ICON = new BufferedImage(iconBufferSize, iconBufferSize, BufferedImage.TYPE_INT_ARGB); + final BufferedImage rooftopCourseIcon = ImageUtil.getResourceStreamFromClass(WorldMapPlugin.class, "rooftop_course_icon.png"); + ROOFTOP_COURSE_ICON.getGraphics().drawImage(rooftopCourseIcon, 1, 1, null); } @Inject @@ -239,12 +245,12 @@ public class WorldMapPlugin extends Plugin { worldMapPointManager.removeIf(AgilityCoursePoint.class::isInstance); - if (config.agilityCourseTooltip()) + if (config.agilityCourseTooltip() || config.agilityCourseRooftop()) { Arrays.stream(AgilityCourseLocation.values()) .filter(value -> value.getLocation() != null) .map(value -> new AgilityCoursePoint(value, - BLANK_ICON, + config.agilityCourseRooftop() && value.isRooftopCourse() ? ROOFTOP_COURSE_ICON : BLANK_ICON, config.agilityCourseTooltip())) .forEach(worldMapPointManager::add); } diff --git a/runelite-client/src/main/resources/net/runelite/client/plugins/worldmap/rooftop_course_icon.png b/runelite-client/src/main/resources/net/runelite/client/plugins/worldmap/rooftop_course_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..27b548ad6ffa22710316d58de74a4012ef4b1dd2 GIT binary patch literal 287 zcmeAS@N?(olHy`uVBq!ia0vp^{2?NMQuIx`(nRvMLcuuc)2NYW4>Ealoaei&^M!{wSo+&kPhgrJ~ z+`YsKpSlL6_31b*G~J=x`dMA_wBntI$2|UB|NJbmNc??m{&T*k6Ys5`XKlYj`p~ot z&rMfsZTBjcI(+CTbIp9+wK`v-FCj8yYDdP|sN4UhuUTa=r;F)B&t{EP_cRXQpB2se zWx3OqrEWLb|6S%!cX)ks72nBgzb|eUp7e3)LHk#_FSnOXtrukfcqPLvP{FC`mfD+j dIr0Bj+eJACpUqh6>kf1`gQu&X%Q~loCIAH@ae@E< literal 0 HcmV?d00001 From 24c7855172a77d35a7ced3f820d95aad238c5b86 Mon Sep 17 00:00:00 2001 From: Omar Khan Date: Wed, 6 May 2020 15:56:28 -0400 Subject: [PATCH 09/36] grandexchange: Improve geSearchMode description (#11474) --- .../client/plugins/grandexchange/GrandExchangeConfig.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/grandexchange/GrandExchangeConfig.java b/runelite-client/src/main/java/net/runelite/client/plugins/grandexchange/GrandExchangeConfig.java index 272c1a7254..3268aa6716 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/grandexchange/GrandExchangeConfig.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/grandexchange/GrandExchangeConfig.java @@ -112,7 +112,10 @@ public interface GrandExchangeConfig extends Config position = 8, keyName = "geSearchMode", name = "Search Mode", - description = "The search mode to use for the GE" + description = "The search mode to use for the GE
" + + "Default - Matches exact text only
" + + "Fuzzy Only - Matches inexact text such as 'sara sword'
" + + "Fuzzy Fallback - Uses default search, falling back to fuzzy search if no results were found" ) default GrandExchangeSearchMode geSearchMode() { From ec69939020e3fc24348204f120ef75e55ea07a48 Mon Sep 17 00:00:00 2001 From: Nicholas Kimball <31974139+NKimball1@users.noreply.github.com> Date: Thu, 7 May 2020 15:55:40 -0500 Subject: [PATCH 10/36] coordinateclue: Add information to hardwood grove clue (#11489) This commit adds a note to the clue's description indicating the trading stick cost to enter the hardwood grove. --- .../client/plugins/cluescrolls/clues/CoordinateClue.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/clues/CoordinateClue.java b/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/clues/CoordinateClue.java index 88cf082d13..e3d9848732 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/clues/CoordinateClue.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/clues/CoordinateClue.java @@ -164,7 +164,7 @@ public class CoordinateClue extends ClueScroll implements TextClueScroll, Locati // Elite .put(new WorldPoint(2357, 3151, 0), new CoordinateClueInfo("Lletya.")) .put(new WorldPoint(3587, 3180, 0), new CoordinateClueInfo("Meiyerditch.")) - .put(new WorldPoint(2820, 3078, 0), new CoordinateClueInfo("Tai Bwo Wannai. Hardwood Grove.")) + .put(new WorldPoint(2820, 3078, 0), new CoordinateClueInfo("Tai Bwo Wannai. Hardwood Grove. 100 Trading sticks or elite Karamja diary completion is needed to enter.")) .put(new WorldPoint(3811, 3060, 0), new CoordinateClueInfo("Small island north-east of Mos Le'Harmless.", true, Varbits.FIRE_PIT_MOS_LE_HARMLESS)) .put(new WorldPoint(2180, 3282, 0), new CoordinateClueInfo("North of Iorwerth Camp.")) .put(new WorldPoint(2870, 2997, 0), new CoordinateClueInfo("North-east corner in Shilo Village.")) From 9c77948f80d28256ddf788c9680f03678fc8bac0 Mon Sep 17 00:00:00 2001 From: Jordan Atwood Date: Thu, 19 Mar 2020 17:38:21 -0700 Subject: [PATCH 11/36] loottracker: Show chat message after NPC and PVP kills This commit adds configs to display chat messages with the name and value of NPC and/or PVP kills. --- .../loottracker/LootTrackerConfig.java | 20 ++++++++ .../loottracker/LootTrackerPlugin.java | 48 +++++++++++++++++++ .../loottracker/LootTrackerPluginTest.java | 5 ++ 3 files changed, 73 insertions(+) diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/loottracker/LootTrackerConfig.java b/runelite-client/src/main/java/net/runelite/client/plugins/loottracker/LootTrackerConfig.java index a8917ebfe2..00a04f7756 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/loottracker/LootTrackerConfig.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/loottracker/LootTrackerConfig.java @@ -107,4 +107,24 @@ public interface LootTrackerConfig extends Config description = "" ) void setIgnoredEvents(String key); + + @ConfigItem( + keyName = "npcKillChatMessage", + name = "Show chat message for NPC kills", + description = "Adds a chat message with monster name and kill value when receiving loot from an NPC kill." + ) + default boolean npcKillChatMessage() + { + return false; + } + + @ConfigItem( + keyName = "pvpKillChatMessage", + name = "Show chat message for PVP kills", + description = "Adds a chat message with player name and kill value when receiving loot from a player kill." + ) + default boolean pvpKillChatMessage() + { + return false; + } } \ No newline at end of file diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/loottracker/LootTrackerPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/loottracker/LootTrackerPlugin.java index 27a9f82029..4ad04d2cd4 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/loottracker/LootTrackerPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/loottracker/LootTrackerPlugin.java @@ -80,6 +80,10 @@ import net.runelite.api.widgets.WidgetID; import net.runelite.client.account.AccountSession; import net.runelite.client.account.SessionManager; import net.runelite.client.callback.ClientThread; +import net.runelite.client.chat.ChatColorType; +import net.runelite.client.chat.ChatMessageBuilder; +import net.runelite.client.chat.ChatMessageManager; +import net.runelite.client.chat.QueuedMessage; import net.runelite.client.config.ConfigManager; import net.runelite.client.eventbus.EventBus; import net.runelite.client.eventbus.Subscribe; @@ -98,6 +102,7 @@ import net.runelite.client.task.Schedule; import net.runelite.client.ui.ClientToolbar; import net.runelite.client.ui.NavigationButton; import net.runelite.client.util.ImageUtil; +import net.runelite.client.util.QuantityFormatter; import net.runelite.client.util.Text; import net.runelite.http.api.loottracker.GameItem; import net.runelite.http.api.loottracker.LootAggregate; @@ -189,6 +194,9 @@ public class LootTrackerPlugin extends Plugin @Inject private EventBus eventBus; + @Inject + private ChatMessageManager chatMessageManager; + private LootTrackerPanel panel; private NavigationButton navButton; @VisibleForTesting @@ -394,6 +402,11 @@ public class LootTrackerPlugin extends Plugin final int combat = npc.getCombatLevel(); addLoot(name, combat, LootRecordType.NPC, items); + + if (config.npcKillChatMessage()) + { + lootReceivedChatMessage(items, "a " + name); + } } @Subscribe @@ -411,6 +424,11 @@ public class LootTrackerPlugin extends Plugin final int combat = player.getCombatLevel(); addLoot(name, combat, LootRecordType.PLAYER, items); + + if (config.pvpKillChatMessage()) + { + lootReceivedChatMessage(items, name); + } } @Subscribe @@ -840,4 +858,34 @@ public class LootTrackerPlugin extends Plugin return false; } + + private long getTotalPrice(Collection items) + { + long totalPrice = 0; + + for (final ItemStack itemStack : items) + { + totalPrice += (long) itemManager.getItemPrice(itemStack.getId()) * itemStack.getQuantity(); + } + + return totalPrice; + } + + private void lootReceivedChatMessage(final Collection items, final String name) + { + final String message = new ChatMessageBuilder() + .append(ChatColorType.HIGHLIGHT) + .append("You've killed ") + .append(name) + .append(" for ") + .append(QuantityFormatter.quantityToStackSize(getTotalPrice(items))) + .append(" loot.") + .build(); + + chatMessageManager.queue( + QueuedMessage.builder() + .type(ChatMessageType.CONSOLE) + .runeLiteFormattedMessage(message) + .build()); + } } diff --git a/runelite-client/src/test/java/net/runelite/client/plugins/loottracker/LootTrackerPluginTest.java b/runelite-client/src/test/java/net/runelite/client/plugins/loottracker/LootTrackerPluginTest.java index dc05bbabf2..456c7950f3 100644 --- a/runelite-client/src/test/java/net/runelite/client/plugins/loottracker/LootTrackerPluginTest.java +++ b/runelite-client/src/test/java/net/runelite/client/plugins/loottracker/LootTrackerPluginTest.java @@ -45,6 +45,7 @@ import net.runelite.api.Player; import net.runelite.api.coords.WorldPoint; import net.runelite.api.events.ChatMessage; import net.runelite.client.account.SessionManager; +import net.runelite.client.chat.ChatMessageManager; import net.runelite.client.game.ItemManager; import net.runelite.client.game.ItemStack; import net.runelite.client.game.SpriteManager; @@ -116,6 +117,10 @@ public class LootTrackerPluginTest @Bind private ItemManager itemManager; + @Mock + @Bind + private ChatMessageManager chatMessageManager; + @Before public void setUp() { From b29e4ea5540c71e66dc8f83f8bc05c191cd53b64 Mon Sep 17 00:00:00 2001 From: Trevor Date: Sun, 2 Feb 2020 13:17:32 -0500 Subject: [PATCH 12/36] raids plugin: make scouter scout unknown rooms on new area loaded --- .../main/java/net/runelite/api/Varbits.java | 3 + .../runelite/client/plugins/raids/Raid.java | 15 + .../client/plugins/raids/RaidsOverlay.java | 46 +- .../client/plugins/raids/RaidsPlugin.java | 412 +++++++++++++----- 4 files changed, 357 insertions(+), 119 deletions(-) diff --git a/runelite-api/src/main/java/net/runelite/api/Varbits.java b/runelite-api/src/main/java/net/runelite/api/Varbits.java index 9caeeb0840..77fd2e191e 100644 --- a/runelite-api/src/main/java/net/runelite/api/Varbits.java +++ b/runelite-api/src/main/java/net/runelite/api/Varbits.java @@ -304,6 +304,9 @@ public enum Varbits PERSONAL_POINTS(5422), RAID_PARTY_SIZE(5424), + // 0 = raid not started, >0 = raid started + RAID_STATE(5425), + /** * Making Friends with My Arm fire pits * diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/raids/Raid.java b/runelite-client/src/main/java/net/runelite/client/plugins/raids/Raid.java index 66f303a8ed..d881351cbd 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/raids/Raid.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/raids/Raid.java @@ -27,6 +27,7 @@ package net.runelite.client.plugins.raids; import java.util.ArrayList; import java.util.List; import lombok.Getter; +import net.runelite.api.coords.WorldPoint; import net.runelite.client.plugins.raids.solver.Layout; import net.runelite.client.plugins.raids.solver.Room; @@ -38,6 +39,20 @@ class Raid @Getter private Layout layout; + // The south west tile of the lobby room + @Getter + private WorldPoint gridBase; + + // The index of the lobby room in the rooms array + @Getter + private int lobbyIndex; + + public Raid(WorldPoint gridBase, int lobbyIndex) + { + this.gridBase = gridBase; + this.lobbyIndex = lobbyIndex; + } + void updateLayout(Layout layout) { if (layout == null) diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/raids/RaidsOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/raids/RaidsOverlay.java index 4616b1682b..9a7b0f9d69 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/raids/RaidsOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/raids/RaidsOverlay.java @@ -30,11 +30,11 @@ import java.awt.FontMetrics; import java.awt.Graphics2D; import javax.inject.Inject; import lombok.Getter; -import lombok.Setter; import net.runelite.api.ClanMemberManager; import net.runelite.api.Client; import static net.runelite.api.MenuAction.RUNELITE_OVERLAY; import static net.runelite.api.MenuAction.RUNELITE_OVERLAY_CONFIG; +import net.runelite.api.Varbits; import net.runelite.client.game.WorldService; import net.runelite.client.plugins.raids.solver.Room; import static net.runelite.client.ui.overlay.OverlayManager.OPTION_CONFIGURE; @@ -60,7 +60,6 @@ public class RaidsOverlay extends OverlayPanel private RaidsConfig config; @Getter - @Setter private boolean scoutOverlayShown = false; @Inject @@ -83,21 +82,12 @@ public class RaidsOverlay extends OverlayPanel @Override public Dimension render(Graphics2D graphics) { - if (!config.scoutOverlay() || !scoutOverlayShown || plugin.isInRaidChambers() && client.getPlane() == OLM_PLANE) + scoutOverlayShown = shouldShowOverlay(); + if (!scoutOverlayShown) { return null; } - if (plugin.getRaid() == null || plugin.getRaid().getLayout() == null) - { - panelComponent.getChildren().add(TitleComponent.builder() - .text("Unable to scout this raid!") - .color(Color.RED) - .build()); - - return super.render(graphics); - } - Color color = Color.WHITE; String layout = plugin.getRaid().getLayout().toCodeString(); @@ -204,4 +194,34 @@ public class RaidsOverlay extends OverlayPanel return super.render(graphics); } + + private boolean shouldShowOverlay() + { + if (plugin.getRaid() == null + || plugin.getRaid().getLayout() == null + || !config.scoutOverlay()) + { + return false; + } + + if (plugin.isInRaidChambers()) + { + // If the raid has started + if (client.getVar(Varbits.RAID_STATE) > 0) + { + if (client.getPlane() == OLM_PLANE) + { + return false; + } + + return config.scoutOverlayInRaid(); + } + else + { + return true; + } + } + + return plugin.isInRaidParty() && config.scoutOverlayAtBank(); + } } diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/raids/RaidsPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/raids/RaidsPlugin.java index 6ca27d0980..3fa404ca88 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/raids/RaidsPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/raids/RaidsPlugin.java @@ -62,7 +62,10 @@ import static net.runelite.api.SpriteID.TAB_QUESTS_BROWN_RAIDING_PARTY; import net.runelite.api.Tile; import net.runelite.api.VarPlayer; import net.runelite.api.Varbits; +import net.runelite.api.coords.WorldPoint; import net.runelite.api.events.ChatMessage; +import net.runelite.api.events.GameStateChanged; +import net.runelite.api.events.GameTick; import net.runelite.api.events.VarbitChanged; import net.runelite.api.events.WidgetLoaded; import net.runelite.api.widgets.WidgetID; @@ -108,6 +111,9 @@ import net.runelite.http.api.ws.messages.party.PartyChatMessage; public class RaidsPlugin extends Plugin { private static final int LOBBY_PLANE = 3; + private static final int SECOND_FLOOR_PLANE = 2; + private static final int ROOMS_PER_PLANE = 8; + private static final int AMOUNT_OF_ROOMS_PER_X_AXIS_PER_PLANE = 4; private static final String RAID_START_MESSAGE = "The raid has begun!"; private static final String LEVEL_COMPLETE_MESSAGE = "level complete!"; private static final String RAID_COMPLETE_MESSAGE = "Congratulations - your raid is complete!"; @@ -115,6 +121,9 @@ public class RaidsPlugin extends Plugin private static final DecimalFormat POINTS_FORMAT = new DecimalFormat("#,###"); private static final String LAYOUT_COMMAND = "!layout"; private static final int MAX_LAYOUT_LEN = 300; + // (x=3360, y=5152, plane=2) is the temp location the game puts the player on login into while it decides whether + // to put the player into a raid or not. + private static final WorldPoint TEMP_LOCATION = new WorldPoint(3360, 5152, 2); @Inject private RuneLiteConfig runeLiteConfig; @@ -186,12 +195,20 @@ public class RaidsPlugin extends Plugin @Getter private Raid raid; + // if the player is inside of a raid or not @Getter private boolean inRaidChambers; - private boolean chestOpened; + // if the player is in a raid party or not + // This will be set when someone in the clan chat clicks the "make party button on the raids widget + // It will be reset when the raid ends but not if they leave the raid while it has not started yet + @Getter + private boolean inRaidParty; + private boolean chestOpened; private RaidsTimer timer; + boolean checkInRaid; + private boolean loggedIn; @Provides RaidsConfig provideConfig(ConfigManager configManager) @@ -210,7 +227,7 @@ public class RaidsPlugin extends Plugin { overlayManager.add(overlay); updateLists(); - clientThread.invokeLater(() -> checkRaidPresence(true)); + clientThread.invokeLater(() -> checkRaidPresence()); chatCommandManager.registerCommandAsync(LAYOUT_COMMAND, this::lookupRaid, this::submitRaid); keyManager.registerKeyListener(screenshotHotkeyListener); } @@ -222,9 +239,7 @@ public class RaidsPlugin extends Plugin overlayManager.remove(overlay); infoBoxManager.removeInfoBox(timer); inRaidChambers = false; - raid = null; - timer = null; - chestOpened = false; + reset(); keyManager.unregisterKeyListener(screenshotHotkeyListener); } @@ -243,7 +258,6 @@ public class RaidsPlugin extends Plugin } updateLists(); - clientThread.invokeLater(() -> checkRaidPresence(true)); } @Subscribe @@ -287,7 +301,34 @@ public class RaidsPlugin extends Plugin @Subscribe public void onVarbitChanged(VarbitChanged event) { - checkRaidPresence(false); + boolean tempInParty = client.getVar(VarPlayer.IN_RAID_PARTY) != -1; + boolean tempInRaid = client.getVar(Varbits.IN_RAID) == 1; + + // if the player's party state has changed + if (tempInParty != inRaidParty) + { + // if the player is no longer in a party then reset + if (!tempInParty + && loggedIn + && !tempInRaid) + { + reset(); + } + + inRaidParty = tempInParty; + } + + // if the player's raid state has changed + if (tempInRaid != inRaidChambers) + { + // if the player is inside of a raid then check the raid + if (tempInRaid && loggedIn) + { + checkRaidPresence(); + } + + inRaidChambers = tempInRaid; + } } @Subscribe @@ -369,60 +410,99 @@ public class RaidsPlugin extends Plugin } } - private void checkRaidPresence(boolean force) + @Subscribe + public void onGameStateChanged(GameStateChanged event) + { + if (client.getGameState() == GameState.LOGGED_IN) + { + // skip event while the game decides if the player belongs in a raid or not + if (client.getLocalPlayer() == null + || client.getLocalPlayer().getWorldLocation().equals(TEMP_LOCATION)) + { + return; + } + + checkInRaid = true; + } + else if (client.getGameState() == GameState.LOGIN_SCREEN + || client.getGameState() == GameState.CONNECTION_LOST) + { + loggedIn = false; + } + else if (client.getGameState() == GameState.HOPPING) + { + reset(); + } + } + + @Subscribe + public void onGameTick(GameTick event) + { + if (checkInRaid) + { + loggedIn = true; + checkInRaid = false; + + if (inRaidChambers) + { + checkRaidPresence(); + } + else + { + if (!inRaidParty) + { + reset(); + } + } + } + } + + private void checkRaidPresence() { if (client.getGameState() != GameState.LOGGED_IN) { return; } - boolean setting = client.getVar(Varbits.IN_RAID) == 1; + inRaidChambers = client.getVar(Varbits.IN_RAID) == 1; - if (force || inRaidChambers != setting) + if (!inRaidChambers) { - inRaidChambers = setting; - updateInfoBoxState(); - - if (inRaidChambers) - { - raid = buildRaid(); - chestOpened = false; - - if (raid == null) - { - log.debug("Failed to build raid"); - return; - } - - Layout layout = layoutSolver.findLayout(raid.toCode()); - - if (layout == null) - { - log.debug("Could not find layout match"); - return; - } - - raid.updateLayout(layout); - RaidRoom[] rooms = raid.getCombatRooms(); - RotationSolver.solve(rooms); - raid.setCombatRooms(rooms); - overlay.setScoutOverlayShown(true); - - if (config.layoutMessage()) - { - sendRaidLayoutMessage(); - } - } - else if (!config.scoutOverlayAtBank()) - { - overlay.setScoutOverlayShown(false); - } + return; } - // If we left party raid was started or we left raid - if (client.getVar(VarPlayer.IN_RAID_PARTY) == -1 && (!inRaidChambers || !config.scoutOverlayInRaid())) + updateInfoBoxState(); + boolean firstSolve = (raid == null); + raid = buildRaid(raid); + chestOpened = false; + + if (raid == null) { - overlay.setScoutOverlayShown(false); + log.debug("Failed to build raid"); + return; + } + + if (raid.getLayout() == null) + { + Layout layout = layoutSolver.findLayout(raid.toCode()); + + if (layout == null) + { + log.debug("Could not find layout match"); + raid = null; + return; + } + + raid.updateLayout(layout); + } + + RaidRoom[] rooms = raid.getCombatRooms(); + RotationSolver.solve(rooms); + raid.setCombatRooms(rooms); + + if (config.layoutMessage() && firstSolve) + { + sendRaidLayoutMessage(); } } @@ -547,77 +627,131 @@ public class RaidsPlugin extends Plugin return null; } - private Raid buildRaid() + private Raid buildRaid(Raid from) { - Point gridBase = findLobbyBase(); + Raid raid = from; - if (gridBase == null) + if (raid == null) { - return null; + // The south-west tile of the lobby room in the scene + Point gridBase = findLobbyBase(); + + if (gridBase == null) + { + return null; + } + + raid = new Raid( + new WorldPoint(client.getBaseX() + gridBase.getX(), client.getBaseY() + gridBase.getY(), LOBBY_PLANE), + findLobbyIndex(gridBase) + ); } - Raid raid = new Raid(); - Tile[][] tiles; - int position, x, y, offsetX; - int startX = -2; + /* + * The x position of the starting room relative to other rooms + * The west most room will have a value of 0 and the east most will have a value of 3 + * The rooms have the following x values + * 0 1 2 3 + * 0 1 2 3 + */ + int baseX = raid.getLobbyIndex() % AMOUNT_OF_ROOMS_PER_X_AXIS_PER_PLANE; - for (int plane = 3; plane > 1; plane--) + /* + * The y position of the starting room relative to other rooms + * The north rooms will have a y value of 0 and the south will have a value of 1 + * The rooms have the following y values + * 0 0 0 0 + * 1 1 1 1 + */ + int baseY = raid.getLobbyIndex() % ROOMS_PER_PLANE > (AMOUNT_OF_ROOMS_PER_X_AXIS_PER_PLANE - 1) ? 1 : 0; + + /* + * i is the position of the room in the raid room array, the raid rooms are in order of north to south, + * west to east, and plane 3 to plane 2. For example the 0th room is the north-west room on plane 3 and + * the 15th room is the south-east room of plane 2 + * + * The indexes of the rooms of plane 3 (the first/lobby floor) will look like + * 0 1 2 3 + * 4 5 6 7 + * + * The indexes of the rooms of plane 2 (the second floor) will look like + * 8 9 10 11 + * 12 13 14 15 + */ + for (int i = 0; i < raid.getRooms().length; i++) { - tiles = client.getScene().getTiles()[plane]; + /* + * The x position of the current room relative to other rooms + * The west most room will have a value of 0 and the east most will have a value of 3 + * The rooms have the following x values + * 0 1 2 3 + * 0 1 2 3 + */ + int x = i % AMOUNT_OF_ROOMS_PER_X_AXIS_PER_PLANE; - if (tiles[gridBase.getX() + RaidRoom.ROOM_MAX_SIZE][gridBase.getY()] == null) + /* + * The y position of the current room relative to other rooms + * The north rooms will have a y value of 0 and the south will have a value of 1 + * The rooms have the following y values + * 0 0 0 0 + * 1 1 1 1 + */ + int y = i % ROOMS_PER_PLANE > (AMOUNT_OF_ROOMS_PER_X_AXIS_PER_PLANE - 1) ? 1 : 0; + + /* + * The plane of the current room + * The rooms on the lobby/first floor will have a plane of 3 + * The rooms on the second floor will have a plane of 2 + */ + int plane = i > (ROOMS_PER_PLANE - 1) ? SECOND_FLOOR_PLANE : LOBBY_PLANE; + + // The x position of the current room relative to starting room + x = x - baseX; + + // The y position of the current room relative to starting room + y = y - baseY; + + // The x coord (world point) of the south west tile of the current room + x = raid.getGridBase().getX() + x * RaidRoom.ROOM_MAX_SIZE; + + // The y coord (world point) of the south west tile of the current room + y = raid.getGridBase().getY() - y * RaidRoom.ROOM_MAX_SIZE; + + // The x coord (scene) of the south west tile of the current room + x = x - client.getBaseX(); + + // The y coord (scene) of the south west tile of the current room + y = y - client.getBaseY(); + + // If the west tile of the current room is not in the scene but the room itself has tiles in the scene + // then make x a tile of the room that is actually in the scene + if (x < (1 - RaidRoom.ROOM_MAX_SIZE) || x >= SCENE_SIZE) { - position = 1; + continue; } - else + else if (x < 1) { - position = 0; + x = 1; } - for (int i = 1; i > -2; i--) + // If the south tile of the current room is not in the scene + // then make y a tile of the room that is actually in the scene + if (y < 1) { - y = gridBase.getY() + (i * RaidRoom.ROOM_MAX_SIZE); - - for (int j = startX; j < 4; j++) - { - x = gridBase.getX() + (j * RaidRoom.ROOM_MAX_SIZE); - offsetX = 0; - - if (x > SCENE_SIZE && position > 1 && position < 4) - { - position++; - } - - if (x < 0) - { - offsetX = Math.abs(x) + 1; //add 1 because the tile at x=0 will always be null - } - - if (x < SCENE_SIZE && y >= 0 && y < SCENE_SIZE) - { - if (tiles[x + offsetX][y] == null) - { - if (position == 4) - { - position++; - break; - } - - continue; - } - - if (position == 0 && startX != j) - { - startX = j; - } - - Tile base = tiles[offsetX > 0 ? 1 : x][y]; - RaidRoom room = determineRoom(base); - raid.setRoom(room, position + Math.abs((plane - 3) * 8)); - position++; - } - } + y = 1; } + + // The scene tile of the current room to check for + Tile tile = client.getScene().getTiles()[plane][x][y]; + + if (tile == null) + { + continue; + } + + // scout the room + RaidRoom room = determineRoom(tile); + raid.setRoom(room, i); } return raid; @@ -807,4 +941,70 @@ public class RaidsPlugin extends Plugin imageCapture.takeScreenshot(overlayImage, "CoX_scout-", false, config.uploadScreenshot()); graphic.dispose(); } + + /** + * Finds the lobby room index in the room array + * There are 8 rooms per floor in a 4 wide (x) and 2 high (y) rectangle + * The rooms on plane 3 (the lobby plane) have the following indexes + * 0 1 2 3 + * 4 5 6 7 + */ + private int findLobbyIndex(Point gridBase) + { + int x; + int y; + + // the lobby will always be on the top/first floor (plane 3) + Tile[][] tiles = client.getScene().getTiles()[LOBBY_PLANE]; + + /* + * if there is no room north the lobby then it is the north most room + * The north rooms will have a y value of 0 and the south will have a value of 1 + * The rooms have the following y values + * 0 0 0 0 + * 1 1 1 1 + */ + if (tiles[gridBase.getX()][gridBase.getY() + RaidRoom.ROOM_MAX_SIZE] == null) + { + y = 0; + } + else + { + y = 1; + } + + /* + * if there is no room east of the lobby then it is the east most room + * The west most room will have a value of 0 and the east most will have a value of 3 + * The rooms have the following x values + * 0 1 2 3 + * 0 1 2 3 + */ + if (tiles[gridBase.getX() + RaidRoom.ROOM_MAX_SIZE][gridBase.getY()] == null) + { + x = 3; + } + else + { + // determine x based on how many rooms are to the west of it. + for (x = 0; x < 3; x++) + { + int sceneX = gridBase.getX() - 1 - RaidRoom.ROOM_MAX_SIZE * x; + if (sceneX < 0 || tiles[sceneX][gridBase.getY()] == null) + { + break; + } + } + } + + // the room index based on its x and y values + return x + y * AMOUNT_OF_ROOMS_PER_X_AXIS_PER_PLANE; + } + + private void reset() + { + raid = null; + chestOpened = false; + updateInfoBoxState(); + } } From 593c8102f66cffcb8b55678aa59f2a36dfcf64ff Mon Sep 17 00:00:00 2001 From: ben Date: Fri, 8 May 2020 16:53:05 -0500 Subject: [PATCH 13/36] coordinateclue: Add missing Lithkren clue step (#11490) --- .../client/plugins/cluescrolls/clues/CoordinateClue.java | 1 + 1 file changed, 1 insertion(+) diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/clues/CoordinateClue.java b/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/clues/CoordinateClue.java index e3d9848732..576f52be42 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/clues/CoordinateClue.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/clues/CoordinateClue.java @@ -195,6 +195,7 @@ public class CoordinateClue extends ClueScroll implements TextClueScroll, Locati .put(new WorldPoint(2872, 3937, 0), new CoordinateClueInfo("Weiss.")) .put(new WorldPoint(2484, 4016, 0), new CoordinateClueInfo("Northeast corner of the Island of Stone.")) .put(new WorldPoint(2222, 3331, 0), new CoordinateClueInfo("Prifddinas, west of the Tower of Voices")) + .put(new WorldPoint(3560, 3987, 0), new CoordinateClueInfo("Lithkren. Digsite pendant teleport if unlocked, otherwise take rowboat from west of Mushroom Meadow Mushtree.")) // Master .put(new WorldPoint(2178, 3209, 0), new CoordinateClueInfo("South of Iorwerth Camp.")) .put(new WorldPoint(2155, 3100, 0), new CoordinateClueInfo("South of Port Tyras (BJS).")) From d2a9d43a804d7c2db82ad821f365874c78999968 Mon Sep 17 00:00:00 2001 From: Max Weber Date: Sun, 15 Mar 2020 15:30:31 -0600 Subject: [PATCH 14/36] runelite-client: Make RuneScape Bold actually Bold This changes the font name and family for runescape.ttf to just `RuneScape`, and the family of runescape_bold.ttf to `RuneScape`, with the name `RuneScape Bold`. It also sets OS/2 weight and style to Bold. This allows swing's HTML viewer to switch between these fonts naturally with just a font-weight style, or a element --- .../net/runelite/client/ui/FontManager.java | 4 ++-- .../net/runelite/client/ui/runescape.ttf | Bin 22608 -> 22500 bytes .../net/runelite/client/ui/runescape_bold.ttf | Bin 22476 -> 22436 bytes 3 files changed, 2 insertions(+), 2 deletions(-) diff --git a/runelite-client/src/main/java/net/runelite/client/ui/FontManager.java b/runelite-client/src/main/java/net/runelite/client/ui/FontManager.java index b6fdac5172..564ebcba62 100644 --- a/runelite-client/src/main/java/net/runelite/client/ui/FontManager.java +++ b/runelite-client/src/main/java/net/runelite/client/ui/FontManager.java @@ -62,11 +62,11 @@ public class FontManager Font boldFont = Font.createFont(Font.TRUETYPE_FONT, FontManager.class.getResourceAsStream("runescape_bold.ttf")) - .deriveFont(Font.PLAIN, 16); + .deriveFont(Font.BOLD, 16); ge.registerFont(boldFont); runescapeBoldFont = StyleContext.getDefaultStyleContext() - .getFont(boldFont.getName(), Font.PLAIN, 16); + .getFont(boldFont.getName(), Font.BOLD, 16); ge.registerFont(runescapeBoldFont); } catch (FontFormatException ex) diff --git a/runelite-client/src/main/resources/net/runelite/client/ui/runescape.ttf b/runelite-client/src/main/resources/net/runelite/client/ui/runescape.ttf index 9d15fc64ff5128318064f97971fefba12b0468ce..87e93164df3cd3393c0524410fe16bcc41492ec6 100644 GIT binary patch delta 624 zcmYk(-%FEG7zgn0Ip^K`?tS0QU^)vKu^Ur^*?wTfS|H?>%pV(D=2f^CoePvX$U#A1 zM1MeIT@1bP4-k~?Mi30TF+w85M6EkRBMKt$Lb~xxpTRB;=W`yO=Q)S-d|6{ZR#`U~ z04H8SAQ_828hKp~>;vN;Wz_R$@nsk`_3ctu9-x!D)fGkf>%Nk)JNg{N6- z%Ge(KRGJ^|S3WFH0YfW*{-!YZZ2s0nURIC!0iL_KN#0i6*s)DqiJZbzWIN#Vwe?^1 z{qWt;QI&1Q7j*XXB3BkcCAFeQ`z^nUDLTMz%gjqNxY#b4qlNt=3&goWR^Z|< z$u_j}MY1a6n`8~o`Pg?l*l|;o$vWD_SF*vT#TnT|uj(c{kWrtIoye3;BZnpqyO_MdXo18k4Y4 akZS6qB=0u0ty#%$THC>~&!~^Id9>&H(Pgp# delta 716 zcmaLV-%FEG7zgn0Ip^K`!*_4O=1jukg*Mdco!f93x*(~RRBPfC76|&{HU;Bt=z{b{ zqrX6Q<3$&OU33vt?ndaYn-P?B(GS5}A+Vcnys?Wq(`OJ8-8|=W4$qIn;q1L)pI)+X-ME=X7kwn+G6m<4shosVEimUT&VO;da`=_8Ng?bCdp|V^`6{hYw7@IqaCo_v9;e= zzZq{!o2-6&IlvB&a%B-TewHi{_dsPOEPkUY2+9Bc?SAEc9z1C@F{@Jujb%DF(nU%gkdlgxO~@$0=@+1txfetRT!c z$v(96A7m9_(Ms0vSd0(TM#ly5n{1$686vl^l2Rm_h^kM>eoU$F$re0qf*i!CuGG$C zzO#sp94c_(p&;YDj2M076?4;WxoGDqu2*p93sp0Fuj^!z z&QP<^9Af|SNHrkR#>_XIP(o_sdj1f{4 zQ?Lucg@h3mL8PJ-1qmgHRJw4f(!Gy`?!A^ae!};!G&Yj0yZHZ?s5rY7r zV-8M?TUPeOjb`)-aQZfl_8vbrY+)ZZsDGaNd&egF&FKqkznZZt-tvy}5`y0sq1RRy_rnK>k(wI2sPp(0e zs2uP7%;zurqz-k5VzgRoVRaX41&vm!2x_CxVzsNsyv5Y}33FRI!)TgSNfIopRby20*2Mt_ANlu^Mfs9OdTJw^M z%(YT};^I^#Z`Vh62Q6AvrTIJzm9Jb~<_qP|)b+-7?N)4pC8-D^me{PRup}XFAU&mi z9D1{5MM@7UQczH-5>OPRUIdYXAW8}%ig>7J(Sry&TgT#|@9~)5%wy*N_PyEp1+las zQV;+%Ou~y{!x+ihFCveC6Avi5eem#rf!+8>{xtcqWBI-N&7L1yXHvU%Oi{pJvL?=2 z=Cy-_HjsWkZWfAS@o9U;&K&)A;YbHCkOCrKs+IHht=m_A0>`%ip6aS73BOqxy)zm~ ze@957a=^>ZC$C)F4m{fc{GRmE1e~DAdBn7HTJ(xTty%H7zZsS8uGXMp@JX+ky@<&j z%o4WA7PE|ye3My0RDR3sLs~h*>_<%bz#M?$3o-}ATyT&%gw5(Emz#7(6}{?p-q4WH zx|qZ0)*doPu_v6On-x+3WN7?lfw**u*@LjO$m~U0YBNjdk^kk&=#-~8t{^Tq@3G@U zLtbI_)7RW!4nS3YF$cXV-$v#TxC_jGA>Kb{cMz8I9D&5`LROP)cYz{Q8y}O+c`P3(`jVF&efqQG6eLJ>) Date: Sun, 15 Mar 2020 16:53:49 -0600 Subject: [PATCH 15/36] runelite-client: support warning field on external plugins --- .../ExternalPluginManifest.java | 2 ++ .../client/plugins/config/PluginHubPanel.java | 19 ++++++++++++++++++- 2 files changed, 20 insertions(+), 1 deletion(-) diff --git a/runelite-client/src/main/java/net/runelite/client/externalplugins/ExternalPluginManifest.java b/runelite-client/src/main/java/net/runelite/client/externalplugins/ExternalPluginManifest.java index 0678bf768c..31ec502ed2 100644 --- a/runelite-client/src/main/java/net/runelite/client/externalplugins/ExternalPluginManifest.java +++ b/runelite-client/src/main/java/net/runelite/client/externalplugins/ExternalPluginManifest.java @@ -49,6 +49,8 @@ public class ExternalPluginManifest @Nullable private String description; @Nullable + private String warning; + @Nullable private String[] tags; @EqualsAndHashCode.Exclude private URL support; diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/config/PluginHubPanel.java b/runelite-client/src/main/java/net/runelite/client/plugins/config/PluginHubPanel.java index 934288342a..e17482f4ce 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/config/PluginHubPanel.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/config/PluginHubPanel.java @@ -58,6 +58,7 @@ import javax.swing.GroupLayout; import javax.swing.ImageIcon; import javax.swing.JButton; import javax.swing.JLabel; +import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.KeyStroke; @@ -263,7 +264,23 @@ class PluginHubPanel extends PluginPanel { addrm.setText("Install"); addrm.setBackground(new Color(0x28BE28)); - addrm.addActionListener(l -> externalPluginManager.install(manifest.getInternalName())); + addrm.addActionListener(l -> + { + if (manifest.getWarning() != null) + { + int result = JOptionPane.showConfirmDialog( + this, + "

" + manifest.getWarning() + "

Are you sure you want to install this plugin?", + "Installing " + manifest.getDisplayName(), + JOptionPane.YES_NO_OPTION, + JOptionPane.WARNING_MESSAGE); + if (result != JOptionPane.OK_OPTION) + { + return; + } + } + externalPluginManager.install(manifest.getInternalName()); + }); } else if (remove) { From 628857b2745fb53a1e99f7742052a185615e4a0f Mon Sep 17 00:00:00 2001 From: dekvall Date: Thu, 7 May 2020 20:26:33 +0200 Subject: [PATCH 16/36] emojis: add acorn emoji The emoji uses the trigger is ` 323 bytes 2 files changed, 1 insertion(+) create mode 100644 runelite-client/src/main/resources/net/runelite/client/plugins/emojis/acorn.png diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/emojis/Emoji.java b/runelite-client/src/main/java/net/runelite/client/plugins/emojis/Emoji.java index fde8c4bb84..5f05110bd5 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/emojis/Emoji.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/emojis/Emoji.java @@ -87,6 +87,7 @@ enum Emoji HEART_EYES("(*.*)"), FACEPALM("M-)"), PENSIVE("V_V"), + ACORN("D~") // emojiMap; diff --git a/runelite-client/src/main/resources/net/runelite/client/plugins/emojis/acorn.png b/runelite-client/src/main/resources/net/runelite/client/plugins/emojis/acorn.png new file mode 100644 index 0000000000000000000000000000000000000000..461d9ac97255e394177373dfffba7cdf18f4fece GIT binary patch literal 323 zcmeAS@N?(olHy`uVBq!ia0vp@Ak4uGBwbBK{D4$ZfKP}kklvT>b11{_V5WbXqVW0% zt5v}!o1$!2hnQ`Mv<3=pk9Xb@~|%*AIR|AndrJB!DU;# z)816C^%2&4)4VrE+N=#T-woNF7gd738!!;>XN*H1IOezshL-*eO3rJP*+4XwxIm(9{|z7eu_F335a Lu6{1-oD!M<% Date: Sat, 9 May 2020 16:15:23 +0000 Subject: [PATCH 17/36] Release 1.6.14 --- cache-client/pom.xml | 2 +- cache-updater/pom.xml | 2 +- cache/pom.xml | 2 +- http-api/pom.xml | 2 +- http-service/pom.xml | 2 +- pom.xml | 4 ++-- runelite-api/pom.xml | 2 +- runelite-client/pom.xml | 2 +- runelite-script-assembler-plugin/pom.xml | 2 +- 9 files changed, 10 insertions(+), 10 deletions(-) diff --git a/cache-client/pom.xml b/cache-client/pom.xml index 5c3dcc7ab6..39f485a989 100644 --- a/cache-client/pom.xml +++ b/cache-client/pom.xml @@ -29,7 +29,7 @@ net.runelite runelite-parent - 1.6.14-SNAPSHOT + 1.6.14 cache-client diff --git a/cache-updater/pom.xml b/cache-updater/pom.xml index 4ac49b7b23..3765a730d1 100644 --- a/cache-updater/pom.xml +++ b/cache-updater/pom.xml @@ -28,7 +28,7 @@ net.runelite runelite-parent - 1.6.14-SNAPSHOT + 1.6.14 Cache Updater diff --git a/cache/pom.xml b/cache/pom.xml index 9879ebaf2c..793cc4ff2e 100644 --- a/cache/pom.xml +++ b/cache/pom.xml @@ -29,7 +29,7 @@ net.runelite runelite-parent - 1.6.14-SNAPSHOT + 1.6.14 cache diff --git a/http-api/pom.xml b/http-api/pom.xml index 7cd118d3c1..18544dfdf1 100644 --- a/http-api/pom.xml +++ b/http-api/pom.xml @@ -28,7 +28,7 @@ net.runelite runelite-parent - 1.6.14-SNAPSHOT + 1.6.14 Web API diff --git a/http-service/pom.xml b/http-service/pom.xml index 8c5d8431ad..2623657c0a 100644 --- a/http-service/pom.xml +++ b/http-service/pom.xml @@ -28,7 +28,7 @@ net.runelite runelite-parent - 1.6.14-SNAPSHOT + 1.6.14 Web Service diff --git a/pom.xml b/pom.xml index c9a8c5a3e1..3aca360504 100644 --- a/pom.xml +++ b/pom.xml @@ -28,7 +28,7 @@ net.runelite runelite-parent - 1.6.14-SNAPSHOT + 1.6.14 pom RuneLite @@ -60,7 +60,7 @@ https://github.com/runelite/runelite scm:git:git://github.com/runelite/runelite scm:git:git@github.com:runelite/runelite - HEAD + runelite-parent-1.6.14 diff --git a/runelite-api/pom.xml b/runelite-api/pom.xml index c6bd9f05c0..c27297065b 100644 --- a/runelite-api/pom.xml +++ b/runelite-api/pom.xml @@ -29,7 +29,7 @@ net.runelite runelite-parent - 1.6.14-SNAPSHOT + 1.6.14 runelite-api diff --git a/runelite-client/pom.xml b/runelite-client/pom.xml index 527914a8b1..a3ca46f878 100644 --- a/runelite-client/pom.xml +++ b/runelite-client/pom.xml @@ -29,7 +29,7 @@ net.runelite runelite-parent - 1.6.14-SNAPSHOT + 1.6.14 client diff --git a/runelite-script-assembler-plugin/pom.xml b/runelite-script-assembler-plugin/pom.xml index 568fe9491e..decb09fa25 100644 --- a/runelite-script-assembler-plugin/pom.xml +++ b/runelite-script-assembler-plugin/pom.xml @@ -29,7 +29,7 @@ net.runelite runelite-parent - 1.6.14-SNAPSHOT + 1.6.14 script-assembler-plugin From b35ab9aecddfc3efc6caf5014457de10cf517dea Mon Sep 17 00:00:00 2001 From: Runelite auto updater Date: Sat, 9 May 2020 16:15:32 +0000 Subject: [PATCH 18/36] Bump for 1.6.15-SNAPSHOT --- cache-client/pom.xml | 2 +- cache-updater/pom.xml | 2 +- cache/pom.xml | 2 +- http-api/pom.xml | 2 +- http-service/pom.xml | 2 +- pom.xml | 4 ++-- runelite-api/pom.xml | 2 +- runelite-client/pom.xml | 2 +- runelite-script-assembler-plugin/pom.xml | 2 +- 9 files changed, 10 insertions(+), 10 deletions(-) diff --git a/cache-client/pom.xml b/cache-client/pom.xml index 39f485a989..f18e1e211f 100644 --- a/cache-client/pom.xml +++ b/cache-client/pom.xml @@ -29,7 +29,7 @@ net.runelite runelite-parent - 1.6.14 + 1.6.15-SNAPSHOT cache-client diff --git a/cache-updater/pom.xml b/cache-updater/pom.xml index 3765a730d1..518c8312d4 100644 --- a/cache-updater/pom.xml +++ b/cache-updater/pom.xml @@ -28,7 +28,7 @@ net.runelite runelite-parent - 1.6.14 + 1.6.15-SNAPSHOT Cache Updater diff --git a/cache/pom.xml b/cache/pom.xml index 793cc4ff2e..e92cbb2f84 100644 --- a/cache/pom.xml +++ b/cache/pom.xml @@ -29,7 +29,7 @@ net.runelite runelite-parent - 1.6.14 + 1.6.15-SNAPSHOT cache diff --git a/http-api/pom.xml b/http-api/pom.xml index 18544dfdf1..dfe983db42 100644 --- a/http-api/pom.xml +++ b/http-api/pom.xml @@ -28,7 +28,7 @@ net.runelite runelite-parent - 1.6.14 + 1.6.15-SNAPSHOT Web API diff --git a/http-service/pom.xml b/http-service/pom.xml index 2623657c0a..d5db0a96d2 100644 --- a/http-service/pom.xml +++ b/http-service/pom.xml @@ -28,7 +28,7 @@ net.runelite runelite-parent - 1.6.14 + 1.6.15-SNAPSHOT Web Service diff --git a/pom.xml b/pom.xml index 3aca360504..0cf7c28b4e 100644 --- a/pom.xml +++ b/pom.xml @@ -28,7 +28,7 @@ net.runelite runelite-parent - 1.6.14 + 1.6.15-SNAPSHOT pom RuneLite @@ -60,7 +60,7 @@ https://github.com/runelite/runelite scm:git:git://github.com/runelite/runelite scm:git:git@github.com:runelite/runelite - runelite-parent-1.6.14 + HEAD diff --git a/runelite-api/pom.xml b/runelite-api/pom.xml index c27297065b..205087ade4 100644 --- a/runelite-api/pom.xml +++ b/runelite-api/pom.xml @@ -29,7 +29,7 @@ net.runelite runelite-parent - 1.6.14 + 1.6.15-SNAPSHOT runelite-api diff --git a/runelite-client/pom.xml b/runelite-client/pom.xml index a3ca46f878..99a78db5a2 100644 --- a/runelite-client/pom.xml +++ b/runelite-client/pom.xml @@ -29,7 +29,7 @@ net.runelite runelite-parent - 1.6.14 + 1.6.15-SNAPSHOT client diff --git a/runelite-script-assembler-plugin/pom.xml b/runelite-script-assembler-plugin/pom.xml index decb09fa25..e3cdc249ed 100644 --- a/runelite-script-assembler-plugin/pom.xml +++ b/runelite-script-assembler-plugin/pom.xml @@ -29,7 +29,7 @@ net.runelite runelite-parent - 1.6.14 + 1.6.15-SNAPSHOT script-assembler-plugin From 9a22a375dfaf9893f780b4db3503ba8661234470 Mon Sep 17 00:00:00 2001 From: ThePharros <18340303+ThePharros@users.noreply.github.com> Date: Sun, 10 May 2020 00:09:56 -0400 Subject: [PATCH 19/36] item stats: Add Dragonfruit Pie --- .../net/runelite/client/plugins/itemstats/ItemStatChanges.java | 1 + 1 file changed, 1 insertion(+) diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/itemstats/ItemStatChanges.java b/runelite-client/src/main/java/net/runelite/client/plugins/itemstats/ItemStatChanges.java index 1f8a2557dc..94a9987be7 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/itemstats/ItemStatChanges.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/itemstats/ItemStatChanges.java @@ -200,6 +200,7 @@ public class ItemStatChanges add(combo(2, heal(HITPOINTS, 8), boost(FISHING, 5)), ADMIRAL_PIE, HALF_AN_ADMIRAL_PIE); add(combo(2, heal(HITPOINTS, 11), boost(SLAYER, 5), boost(RANGED, 4)), WILD_PIE, HALF_A_WILD_PIE); add(combo(2, heal(HITPOINTS, 11), boost(AGILITY, 5), heal(RUN_ENERGY, 10)), SUMMER_PIE, HALF_A_SUMMER_PIE); + add(combo(2, heal(HITPOINTS, 10), boost(FLETCHING, 4)), DRAGONFRUIT_PIE, HALF_A_DRAGONFRUIT_PIE); // Other add(combo(range(food(1), food(3)), heal(RUN_ENERGY, 10)), PURPLE_SWEETS_10476); From d021ed35e569fe6911885358cdc051b98925eabc Mon Sep 17 00:00:00 2001 From: MarbleTurtle <60723971+MarbleTurtle@users.noreply.github.com> Date: Sun, 10 May 2020 05:18:43 -0700 Subject: [PATCH 20/36] chathistory: Fix copy to clipboard not appearing on friend messages (#11527) --- .../runelite/client/plugins/chathistory/ChatHistoryPlugin.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/chathistory/ChatHistoryPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/chathistory/ChatHistoryPlugin.java index bd0a95747d..7f4db12375 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/chathistory/ChatHistoryPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/chathistory/ChatHistoryPlugin.java @@ -193,7 +193,7 @@ public class ChatHistoryPlugin extends Plugin implements KeyListener // Use second entry as first one can be walk here with transparent chatbox final MenuEntry entry = event.getMenuEntries()[event.getMenuEntries().length - 2]; - if (entry.getType() != MenuAction.CC_OP_LOW_PRIORITY.getId()) + if (entry.getType() != MenuAction.CC_OP_LOW_PRIORITY.getId() && entry.getType() != MenuAction.RUNELITE.getId()) { return; } From e1309636c035d2242a6a5b0a0a52835651cd0fe6 Mon Sep 17 00:00:00 2001 From: jesse1412 Date: Sun, 10 Feb 2019 18:26:56 +0000 Subject: [PATCH 21/36] tileindicators: Add server side current tile indicator --- .../tileindicators/TileIndicatorsConfig.java | 21 +++++++++++++++++++ .../tileindicators/TileIndicatorsOverlay.java | 18 ++++++++++++++++ 2 files changed, 39 insertions(+) diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/tileindicators/TileIndicatorsConfig.java b/runelite-client/src/main/java/net/runelite/client/plugins/tileindicators/TileIndicatorsConfig.java index 9a5e0bad33..a03f07e5f7 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/tileindicators/TileIndicatorsConfig.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/tileindicators/TileIndicatorsConfig.java @@ -74,4 +74,25 @@ public interface TileIndicatorsConfig extends Config { return false; } + + @Alpha + @ConfigItem( + keyName = "highlightCurrentColor", + name = "Color of current true tile highlighting", + description = "Configures the highlight color of current true tile" + ) + default Color highlightCurrentColor() + { + return Color.CYAN; + } + + @ConfigItem( + keyName = "highlightCurrentTile", + name = "Highlight current true tile", + description = "Highlights true tile player is on as seen by server" + ) + default boolean highlightCurrentTile() + { + return false; + } } diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/tileindicators/TileIndicatorsOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/tileindicators/TileIndicatorsOverlay.java index 00e89241c3..b592684849 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/tileindicators/TileIndicatorsOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/tileindicators/TileIndicatorsOverlay.java @@ -32,6 +32,7 @@ import javax.inject.Inject; import net.runelite.api.Client; import net.runelite.api.Perspective; import net.runelite.api.coords.LocalPoint; +import net.runelite.api.coords.WorldPoint; import net.runelite.client.ui.overlay.Overlay; import net.runelite.client.ui.overlay.OverlayLayer; import net.runelite.client.ui.overlay.OverlayPosition; @@ -70,6 +71,23 @@ public class TileIndicatorsOverlay extends Overlay renderTile(graphics, client.getLocalDestinationLocation(), config.highlightDestinationColor()); } + if (config.highlightCurrentTile()) + { + final WorldPoint playerPos = client.getLocalPlayer().getWorldLocation(); + if (playerPos == null) + { + return null; + } + + final LocalPoint playerPosLocal = LocalPoint.fromWorld(client, playerPos); + if (playerPosLocal == null) + { + return null; + } + + renderTile(graphics, playerPosLocal, config.highlightCurrentColor()); + } + return null; } From 3a8c9bafb0d0c9698ca80ed1c52187b0cb13b9e0 Mon Sep 17 00:00:00 2001 From: Benjamin Stepp Date: Sun, 10 May 2020 12:01:09 -0500 Subject: [PATCH 22/36] itemmappings: adds nightmare staves --- .../src/main/java/net/runelite/client/game/ItemMapping.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/runelite-client/src/main/java/net/runelite/client/game/ItemMapping.java b/runelite-client/src/main/java/net/runelite/client/game/ItemMapping.java index 2613326a5a..de133ed12b 100644 --- a/runelite-client/src/main/java/net/runelite/client/game/ItemMapping.java +++ b/runelite-client/src/main/java/net/runelite/client/game/ItemMapping.java @@ -233,6 +233,10 @@ public enum ItemMapping ITEM_BASILISK_JAW(BASILISK_JAW, NEITIZNOT_FACEGUARD), ITEM_HELM_OF_NEITIZNOT(HELM_OF_NEITIZNOT, NEITIZNOT_FACEGUARD), ITEM_TWISTED_HORNS(TWISTED_HORNS, TWISTED_SLAYER_HELMET, TWISTED_SLAYER_HELMET_I), + ITEM_ELDRITCH_ORB(ELDRITCH_ORB, ELDRITCH_NIGHTMARE_STAFF), + ITEM_HARMONISED_ORB(HARMONISED_ORB, HARMONISED_NIGHTMARE_STAFF), + ITEM_VOLATILE_ORB(VOLATILE_ORB, VOLATILE_NIGHTMARE_STAFF), + ITEM_NIGHTMARE_STAFF(NIGHTMARE_STAFF, ELDRITCH_NIGHTMARE_STAFF, HARMONISED_NIGHTMARE_STAFF, VOLATILE_NIGHTMARE_STAFF), // Crystal items ITEM_CRYSTAL_TOOL_SEED(CRYSTAL_TOOL_SEED, CRYSTAL_AXE, CRYSTAL_AXE_INACTIVE, CRYSTAL_HARPOON, CRYSTAL_HARPOON_INACTIVE, CRYSTAL_PICKAXE, CRYSTAL_PICKAXE_INACTIVE), From ff0e2a52457006492216881cd2e0a10ef8ede1c8 Mon Sep 17 00:00:00 2001 From: TheStonedTurtle Date: Mon, 11 May 2020 02:03:35 -0700 Subject: [PATCH 23/36] loot tracker: Fix "Show each kill separately" view --- .../plugins/loottracker/LootTrackerPanel.java | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/loottracker/LootTrackerPanel.java b/runelite-client/src/main/java/net/runelite/client/plugins/loottracker/LootTrackerPanel.java index 9550230422..015749793e 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/loottracker/LootTrackerPanel.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/loottracker/LootTrackerPanel.java @@ -26,6 +26,7 @@ package net.runelite.client.plugins.loottracker; import static com.google.common.collect.Iterables.concat; +import com.google.common.collect.Lists; import java.awt.BorderLayout; import java.awt.Color; import java.awt.Dimension; @@ -33,11 +34,12 @@ import java.awt.GridLayout; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.awt.image.BufferedImage; +import java.util.ArrayDeque; import java.util.ArrayList; import java.util.Collection; -import java.util.Collections; import java.util.List; import java.util.function.Predicate; +import java.util.stream.Collectors; import javax.swing.BorderFactory; import javax.swing.BoxLayout; import javax.swing.ButtonGroup; @@ -456,12 +458,16 @@ class LootTrackerPanel extends PluginPanel } else { - sessionRecords.stream() - .sorted(Collections.reverseOrder()) + // Loop in reverse insertion order so limiting includes most recent data + Lists.reverse(sessionRecords).stream() // filter records prior to limiting so that it is limited to the correct amount .filter(r -> !hideIgnoredItems || !plugin.isEventIgnored(r.getTitle())) .limit(MAX_LOOT_BOXES) - .forEach(this::buildBox); + // The box that is built last is first inside the UI. + // since we are looping in reverse order we need to use a data type that support reverse iterating + .collect(Collectors.toCollection(ArrayDeque::new)) + .descendingIterator() + .forEachRemaining(this::buildBox); } boxes.forEach(LootTrackerBox::rebuild); From 0309ba41fde431b9ceb99eecc4d29b0b7aa7c5d5 Mon Sep 17 00:00:00 2001 From: Adam Date: Sun, 10 May 2020 23:35:22 -0400 Subject: [PATCH 24/36] loottracker: stack clue scrolls in the ui instead of at loot receive time --- .../plugins/loottracker/LootTrackerBox.java | 8 ++- .../plugins/loottracker/LootTrackerItem.java | 2 + .../loottracker/LootTrackerMapping.java | 25 +------ .../loottracker/LootTrackerPlugin.java | 6 +- .../loottracker/LootTrackerBoxTest.java | 71 +++++++++++++++++++ .../loottracker/LootTrackerPluginTest.java | 19 ----- 6 files changed, 83 insertions(+), 48 deletions(-) create mode 100644 runelite-client/src/test/java/net/runelite/client/plugins/loottracker/LootTrackerBoxTest.java diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/loottracker/LootTrackerBox.java b/runelite-client/src/main/java/net/runelite/client/plugins/loottracker/LootTrackerBox.java index 015bd8ef83..2d1398b486 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/loottracker/LootTrackerBox.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/loottracker/LootTrackerBox.java @@ -201,18 +201,22 @@ class LootTrackerBox extends JPanel outer: for (LootTrackerItem item : record.getItems()) { + final int mappedItemId = LootTrackerMapping.map(item.getId(), item.getName()); // Combine it into an existing item if one already exists for (int idx = 0; idx < items.size(); ++idx) { LootTrackerItem i = items.get(idx); - if (item.getId() == i.getId()) + if (mappedItemId == i.getId()) { items.set(idx, new LootTrackerItem(i.getId(), i.getName(), i.getQuantity() + item.getQuantity(), i.getGePrice(), i.getHaPrice(), i.isIgnored())); continue outer; } } - items.add(item); + final LootTrackerItem mappedItem = mappedItemId == item.getId() + ? item // reuse existing item + : new LootTrackerItem(mappedItemId, item.getName(), item.getQuantity(), item.getGePrice(), item.getHaPrice(), item.isIgnored()); + items.add(mappedItem); } } diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/loottracker/LootTrackerItem.java b/runelite-client/src/main/java/net/runelite/client/plugins/loottracker/LootTrackerItem.java index eb969bbac9..691100e3ff 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/loottracker/LootTrackerItem.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/loottracker/LootTrackerItem.java @@ -25,11 +25,13 @@ package net.runelite.client.plugins.loottracker; import lombok.AllArgsConstructor; +import lombok.EqualsAndHashCode; import lombok.Getter; import lombok.Setter; @AllArgsConstructor @Getter +@EqualsAndHashCode class LootTrackerItem { private final int id; diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/loottracker/LootTrackerMapping.java b/runelite-client/src/main/java/net/runelite/client/plugins/loottracker/LootTrackerMapping.java index 3c948aa24a..42744dd121 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/loottracker/LootTrackerMapping.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/loottracker/LootTrackerMapping.java @@ -24,13 +24,9 @@ */ package net.runelite.client.plugins.loottracker; -import com.google.common.base.Strings; import com.google.common.collect.ImmutableMap; import lombok.AllArgsConstructor; -import net.runelite.api.ItemComposition; import net.runelite.api.ItemID; -import net.runelite.client.game.ItemManager; -import net.runelite.client.game.ItemStack; @AllArgsConstructor enum LootTrackerMapping @@ -57,25 +53,8 @@ enum LootTrackerMapping MAPPINGS = map.build(); } - private static int map(int itemId, ItemManager itemManager) + static int map(int itemId, String name) { - ItemComposition itemComp = itemManager.getItemComposition(itemId); - if (Strings.isNullOrEmpty(itemComp.getName())) - { - return itemId; - } - - return MAPPINGS.getOrDefault(itemComp.getName(), itemId); - } - - static ItemStack map(ItemStack item, ItemManager itemManager) - { - int baseId = map(item.getId(), itemManager); - if (baseId == item.getId()) - { - return item; - } - - return new ItemStack(baseId, item.getQuantity(), item.getLocation()); + return MAPPINGS.getOrDefault(name, itemId); } } diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/loottracker/LootTrackerPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/loottracker/LootTrackerPlugin.java index 4ad04d2cd4..94fb5fd1a4 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/loottracker/LootTrackerPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/loottracker/LootTrackerPlugin.java @@ -215,14 +215,12 @@ public class LootTrackerPlugin extends Plugin private LootTrackerClient lootTrackerClient; private final List queuedLoots = new ArrayList<>(); - @VisibleForTesting - Collection stack(Collection items) + private static Collection stack(Collection items) { final List list = new ArrayList<>(); - for (ItemStack item : items) + for (final ItemStack item : items) { - item = LootTrackerMapping.map(item, itemManager); int quantity = 0; for (final ItemStack i : list) { diff --git a/runelite-client/src/test/java/net/runelite/client/plugins/loottracker/LootTrackerBoxTest.java b/runelite-client/src/test/java/net/runelite/client/plugins/loottracker/LootTrackerBoxTest.java new file mode 100644 index 0000000000..ccdc795656 --- /dev/null +++ b/runelite-client/src/test/java/net/runelite/client/plugins/loottracker/LootTrackerBoxTest.java @@ -0,0 +1,71 @@ +/* + * Copyright (c) 2020, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.client.plugins.loottracker; + +import java.util.Arrays; +import net.runelite.api.ItemID; +import net.runelite.client.game.ItemManager; +import net.runelite.http.api.loottracker.LootRecordType; +import static org.junit.Assert.assertEquals; +import org.junit.Test; +import static org.mockito.Mockito.mock; + +public class LootTrackerBoxTest +{ + @Test + public void testAddKill() + { + LootTrackerBox lootTrackerBox = new LootTrackerBox( + mock(ItemManager.class), + "Theatre of Blood", + LootRecordType.EVENT, + null, + false, + LootTrackerPriceType.GRAND_EXCHANGE, + false, + null, null, + false); + + LootTrackerItem[] items = new LootTrackerItem[]{ + new LootTrackerItem(ItemID.CLUE_SCROLL_MEDIUM, "Clue scroll (medium)", 1, 0, 0, false), + new LootTrackerItem(ItemID.CLUE_SCROLL_MEDIUM_3602, "Clue scroll (medium)", 1, 0, 0, false), + new LootTrackerItem(ItemID.GRACEFUL_HOOD_13579, "Graceful hood", 1, 0, 0, false), + }; + LootTrackerRecord lootTrackerRecord = new LootTrackerRecord( + "Theatre of Blood", + null, + LootRecordType.EVENT, + items, + 42 + ); + + lootTrackerBox.addKill(lootTrackerRecord); + + assertEquals(Arrays.asList( + new LootTrackerItem(ItemID.CLUE_SCROLL_MEDIUM, "Clue scroll (medium)", 2, 0, 0, false), + new LootTrackerItem(ItemID.GRACEFUL_HOOD_13579, "Graceful hood", 1, 0, 0, false) + ), lootTrackerBox.getItems()); + } +} \ No newline at end of file diff --git a/runelite-client/src/test/java/net/runelite/client/plugins/loottracker/LootTrackerPluginTest.java b/runelite-client/src/test/java/net/runelite/client/plugins/loottracker/LootTrackerPluginTest.java index 456c7950f3..c6f54cb2b6 100644 --- a/runelite-client/src/test/java/net/runelite/client/plugins/loottracker/LootTrackerPluginTest.java +++ b/runelite-client/src/test/java/net/runelite/client/plugins/loottracker/LootTrackerPluginTest.java @@ -158,25 +158,6 @@ public class LootTrackerPluginTest return itemComposition; } - @Test - public void testClueStacks() - { - when(itemManager.getItemComposition(ItemID.CLUE_SCROLL_MEDIUM)).thenAnswer(invocation -> mockItem("Clue scroll (medium)")); - when(itemManager.getItemComposition(ItemID.CLUE_SCROLL_MEDIUM_3602)).thenAnswer(invocation -> mockItem("Clue scroll (medium)")); - when(itemManager.getItemComposition(ItemID.GRACEFUL_HOOD_13579)).thenAnswer(invocation -> mockItem("Graceful hood")); - Collection stack = lootTrackerPlugin.stack( - Arrays.asList( - new ItemStack(ItemID.CLUE_SCROLL_MEDIUM, 1, null), - new ItemStack(ItemID.CLUE_SCROLL_MEDIUM_3602, 1, null), - new ItemStack(ItemID.GRACEFUL_HOOD_13579, 1, null) - ) - ); - assertEquals(Arrays.asList( - new ItemStack(ItemID.CLUE_SCROLL_MEDIUM, 2, null), - new ItemStack(ItemID.GRACEFUL_HOOD_13579, 1, null) - ), stack); - } - @Test public void testHerbiboarHerbSack() { From 67813eb8fbcc8318bff9dbdd7ea231811f52a7db Mon Sep 17 00:00:00 2001 From: Trevor martz Date: Mon, 11 May 2020 12:05:24 -0600 Subject: [PATCH 25/36] clue plugin: add enemy info to overlay --- .../cluescrolls/ClueScrollOverlay.java | 9 + .../plugins/cluescrolls/clues/ClueScroll.java | 4 + .../cluescrolls/clues/CoordinateClue.java | 234 +++++++-------- .../plugins/cluescrolls/clues/EmoteClue.java | 87 +++--- .../plugins/cluescrolls/clues/Enemy.java | 54 ++++ .../cluescrolls/clues/HotColdClue.java | 8 + .../clues/hotcold/HotColdLocation.java | 271 +++++++++--------- 7 files changed, 384 insertions(+), 283 deletions(-) create mode 100644 runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/clues/Enemy.java diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/ClueScrollOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/ClueScrollOverlay.java index 1853c64b3f..3f860946b1 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/ClueScrollOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/ClueScrollOverlay.java @@ -123,6 +123,15 @@ public class ClueScrollOverlay extends OverlayPanel panelComponent.getChildren().add(LineComponent.builder().left("Requires Light Source!").leftColor(Color.RED).build()); } + if (clue.getEnemy() != null) + { + panelComponent.getChildren().add(LineComponent.builder().left("").build()); + panelComponent.getChildren().add(LineComponent.builder() + .left(clue.getEnemy().getText()) + .leftColor(Color.YELLOW) + .build()); + } + return super.render(graphics); } } diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/clues/ClueScroll.java b/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/clues/ClueScroll.java index ea3631f14c..2f3cdd79e5 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/clues/ClueScroll.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/clues/ClueScroll.java @@ -46,6 +46,10 @@ public abstract class ClueScroll @Getter(AccessLevel.PUBLIC) private Varbits hasFirePit; + @Setter(AccessLevel.PROTECTED) + @Getter(AccessLevel.PUBLIC) + private Enemy enemy; + public abstract void makeOverlayHint(PanelComponent panelComponent, ClueScrollPlugin plugin); public abstract void makeWorldOverlayHint(Graphics2D graphics, ClueScrollPlugin plugin); diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/clues/CoordinateClue.java b/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/clues/CoordinateClue.java index 576f52be42..16d524b91c 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/clues/CoordinateClue.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/clues/CoordinateClue.java @@ -39,6 +39,7 @@ 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; +import static net.runelite.client.plugins.cluescrolls.clues.Enemy.*; @Getter public class CoordinateClue extends ClueScroll implements TextClueScroll, LocationClueScroll @@ -49,17 +50,25 @@ public class CoordinateClue extends ClueScroll implements TextClueScroll, Locati private final String directions; private final boolean lightRequired; private final Varbits lightSource; + private final Enemy enemy; private CoordinateClueInfo(@NonNull String directions) + { + this(directions, null); + } + + private CoordinateClueInfo(@NonNull String directions, Enemy enemy) { this.directions = directions; + this.enemy = enemy; this.lightRequired = false; this.lightSource = null; } - private CoordinateClueInfo(@Nonnull String directions, boolean lightRequired, Varbits lightSource) + private CoordinateClueInfo(@Nonnull String directions, Enemy enemy, boolean lightRequired, Varbits lightSource) { this.directions = directions; + this.enemy = enemy; this.lightRequired = lightRequired; this.lightSource = lightSource; } @@ -110,119 +119,119 @@ public class CoordinateClue extends ClueScroll implements TextClueScroll, Locati .put(new WorldPoint(1247, 3726, 0), new CoordinateClueInfo("Just inside the Farming Guild")) .put(new WorldPoint(3770, 3898, 0), new CoordinateClueInfo("On the small island north-east of Fossil Island's mushroom forest.")) // Hard - .put(new WorldPoint(2209, 3161, 0), new CoordinateClueInfo("North-east of Tyras Camp (BJS).")) - .put(new WorldPoint(2181, 3206, 0), new CoordinateClueInfo("South of Iorwerth Camp.")) - .put(new WorldPoint(3081, 3209, 0), new CoordinateClueInfo("Small Island (CLP).")) - .put(new WorldPoint(3399, 3246, 0), new CoordinateClueInfo("Behind the Duel Arena.")) - .put(new WorldPoint(2699, 3251, 0), new CoordinateClueInfo("Little island (AIR).")) - .put(new WorldPoint(3546, 3251, 0), new CoordinateClueInfo("North-east of Burgh de Rott.")) - .put(new WorldPoint(3544, 3256, 0), new CoordinateClueInfo("North-east of Burgh de Rott.")) - .put(new WorldPoint(2841, 3267, 0), new CoordinateClueInfo("Crandor island.")) - .put(new WorldPoint(3168, 3041, 0), new CoordinateClueInfo("Bedabin Camp.")) - .put(new WorldPoint(2542, 3031, 0), new CoordinateClueInfo("Gu'Tanoth, may require 20gp.")) - .put(new WorldPoint(2581, 3030, 0), new CoordinateClueInfo("Gu'Tanoth island, enter cave north-west of Feldip Hills (AKS).")) - .put(new WorldPoint(2961, 3024, 0), new CoordinateClueInfo("Ship yard (DKP).")) - .put(new WorldPoint(2339, 3311, 0), new CoordinateClueInfo("East of Prifddinas on Arandar mountain pass.")) - .put(new WorldPoint(3440, 3341, 0), new CoordinateClueInfo("Nature Spirit's grotto (BIP).")) - .put(new WorldPoint(2763, 2974, 0), new CoordinateClueInfo("Cairn Isle, west of Shilo Village (CKR).")) - .put(new WorldPoint(3138, 2969, 0), new CoordinateClueInfo("West of Bandit Camp in Kharidian Desert.")) - .put(new WorldPoint(2924, 2963, 0), new CoordinateClueInfo("On the southern part of eastern Karamja.")) - .put(new WorldPoint(2838, 2914, 0), new CoordinateClueInfo("Kharazi Jungle, near water pool (CKR).")) - .put(new WorldPoint(3441, 3419, 0), new CoordinateClueInfo("Mort Myre Swamp (BKR).")) - .put(new WorldPoint(2950, 2902, 0), new CoordinateClueInfo("South-east of Kharazi Jungle.")) - .put(new WorldPoint(2775, 2891, 0), new CoordinateClueInfo("South-west of Kharazi Jungle.")) - .put(new WorldPoint(3113, 3602, 0), new CoordinateClueInfo("Wilderness. North of Edgeville (level 11).")) - .put(new WorldPoint(2892, 3675, 0), new CoordinateClueInfo("On the summit of Trollheim.")) - .put(new WorldPoint(3168, 3677, 0), new CoordinateClueInfo("Wilderness. Graveyard of Shadows.")) - .put(new WorldPoint(2853, 3690, 0), new CoordinateClueInfo("Entrance to the troll Stronghold.")) - .put(new WorldPoint(3305, 3692, 0), new CoordinateClueInfo("Wilderness. West of eastern green dragon.")) - .put(new WorldPoint(3055, 3696, 0), new CoordinateClueInfo("Wilderness. Bandit Camp.")) - .put(new WorldPoint(3302, 3696, 0), new CoordinateClueInfo("Wilderness. West of eastern green dragon.")) - .put(new WorldPoint(1479, 3696, 0), new CoordinateClueInfo("Lizardman Canyon (DJR).")) - .put(new WorldPoint(2712, 3732, 0), new CoordinateClueInfo("North-east of Rellekka (DKS).")) - .put(new WorldPoint(2970, 3749, 0), new CoordinateClueInfo("Wilderness. Forgotten Cemetery.")) - .put(new WorldPoint(3094, 3764, 0), new CoordinateClueInfo("Wilderness. Mining site north of Bandit Camp.")) - .put(new WorldPoint(3311, 3769, 0), new CoordinateClueInfo("Wilderness. North of Venenatis.")) - .put(new WorldPoint(1460, 3782, 0), new CoordinateClueInfo("Lovakengj, near burning man.")) - .put(new WorldPoint(3244, 3792, 0), new CoordinateClueInfo("Wilderness. South-east of Lava Dragon Isle by some Chaos Dwarves.")) - .put(new WorldPoint(3140, 3804, 0), new CoordinateClueInfo("Wilderness. North of Ruins.")) - .put(new WorldPoint(2946, 3819, 0), new CoordinateClueInfo("Wilderness. Chaos Temple (level 38).")) - .put(new WorldPoint(3771, 3825, 0), new CoordinateClueInfo("Fossil Island. East of Museum Camp.")) - .put(new WorldPoint(3013, 3846, 0), new CoordinateClueInfo("Wilderness. West of Lava Maze, before KBD's lair.")) - .put(new WorldPoint(3058, 3884, 0), new CoordinateClueInfo("Wilderness. Near runite ore north of Lava Maze.")) - .put(new WorldPoint(3290, 3889, 0), new CoordinateClueInfo("Wilderness. Demonic Ruins.")) - .put(new WorldPoint(3770, 3897, 0), new CoordinateClueInfo("Small Island north of Fossil Island.")) - .put(new WorldPoint(2505, 3899, 0), new CoordinateClueInfo("Small Island north-west of Miscellania (AJS).")) - .put(new WorldPoint(3285, 3942, 0), new CoordinateClueInfo("Wilderness. Rogues' Castle.")) - .put(new WorldPoint(3159, 3959, 0), new CoordinateClueInfo("Wilderness. North of Deserted Keep, west of Resource Area.")) - .put(new WorldPoint(3039, 3960, 0), new CoordinateClueInfo("Wilderness. Pirates' Hideout.")) - .put(new WorldPoint(2987, 3963, 0), new CoordinateClueInfo("Wilderness. West of Wilderness Agility Course.")) - .put(new WorldPoint(3189, 3963, 0), new CoordinateClueInfo("Wilderness. North of Resource Area, near magic axe hut.")) - .put(new WorldPoint(2341, 3697, 0), new CoordinateClueInfo("North-east of the Piscatoris Fishing Colony bank.")) - .put(new WorldPoint(3143, 3774, 0), new CoordinateClueInfo("In level 32 Wilderness, by the black chinchompa hunting area.")) - .put(new WorldPoint(2992, 3941, 0), new CoordinateClueInfo("Wilderness Agility Course, past the log balance.")) + .put(new WorldPoint(2209, 3161, 0), new CoordinateClueInfo("North-east of Tyras Camp (BJS).", SARADOMIN_WIZARD)) + .put(new WorldPoint(2181, 3206, 0), new CoordinateClueInfo("South of Iorwerth Camp.", SARADOMIN_WIZARD)) + .put(new WorldPoint(3081, 3209, 0), new CoordinateClueInfo("Small Island (CLP).", SARADOMIN_WIZARD)) + .put(new WorldPoint(3399, 3246, 0), new CoordinateClueInfo("Behind the Duel Arena.", SARADOMIN_WIZARD)) + .put(new WorldPoint(2699, 3251, 0), new CoordinateClueInfo("Little island (AIR).", SARADOMIN_WIZARD)) + .put(new WorldPoint(3546, 3251, 0), new CoordinateClueInfo("North-east of Burgh de Rott.", SARADOMIN_WIZARD)) + .put(new WorldPoint(3544, 3256, 0), new CoordinateClueInfo("North-east of Burgh de Rott.", SARADOMIN_WIZARD)) + .put(new WorldPoint(2841, 3267, 0), new CoordinateClueInfo("Crandor island.", SARADOMIN_WIZARD)) + .put(new WorldPoint(3168, 3041, 0), new CoordinateClueInfo("Bedabin Camp.", SARADOMIN_WIZARD)) + .put(new WorldPoint(2542, 3031, 0), new CoordinateClueInfo("Gu'Tanoth, may require 20gp.", SARADOMIN_WIZARD)) + .put(new WorldPoint(2581, 3030, 0), new CoordinateClueInfo("Gu'Tanoth island, enter cave north-west of Feldip Hills (AKS).", SARADOMIN_WIZARD)) + .put(new WorldPoint(2961, 3024, 0), new CoordinateClueInfo("Ship yard (DKP).", SARADOMIN_WIZARD)) + .put(new WorldPoint(2339, 3311, 0), new CoordinateClueInfo("East of Prifddinas on Arandar mountain pass.", SARADOMIN_WIZARD)) + .put(new WorldPoint(3440, 3341, 0), new CoordinateClueInfo("Nature Spirit's grotto (BIP).", SARADOMIN_WIZARD)) + .put(new WorldPoint(2763, 2974, 0), new CoordinateClueInfo("Cairn Isle, west of Shilo Village (CKR).", SARADOMIN_WIZARD)) + .put(new WorldPoint(3138, 2969, 0), new CoordinateClueInfo("West of Bandit Camp in Kharidian Desert.", SARADOMIN_WIZARD)) + .put(new WorldPoint(2924, 2963, 0), new CoordinateClueInfo("On the southern part of eastern Karamja.", SARADOMIN_WIZARD)) + .put(new WorldPoint(2838, 2914, 0), new CoordinateClueInfo("Kharazi Jungle, near water pool (CKR).", SARADOMIN_WIZARD)) + .put(new WorldPoint(3441, 3419, 0), new CoordinateClueInfo("Mort Myre Swamp (BKR).", SARADOMIN_WIZARD)) + .put(new WorldPoint(2950, 2902, 0), new CoordinateClueInfo("South-east of Kharazi Jungle.", SARADOMIN_WIZARD)) + .put(new WorldPoint(2775, 2891, 0), new CoordinateClueInfo("South-west of Kharazi Jungle.", SARADOMIN_WIZARD)) + .put(new WorldPoint(3113, 3602, 0), new CoordinateClueInfo("Wilderness. North of Edgeville (level 11).", ZAMORAK_WIZARD)) + .put(new WorldPoint(2892, 3675, 0), new CoordinateClueInfo("On the summit of Trollheim.", SARADOMIN_WIZARD)) + .put(new WorldPoint(3168, 3677, 0), new CoordinateClueInfo("Wilderness. Graveyard of Shadows.", ZAMORAK_WIZARD)) + .put(new WorldPoint(2853, 3690, 0), new CoordinateClueInfo("Entrance to the troll Stronghold.", SARADOMIN_WIZARD)) + .put(new WorldPoint(3305, 3692, 0), new CoordinateClueInfo("Wilderness. West of eastern green dragon.", ZAMORAK_WIZARD)) + .put(new WorldPoint(3055, 3696, 0), new CoordinateClueInfo("Wilderness. Bandit Camp.", ZAMORAK_WIZARD)) + .put(new WorldPoint(3302, 3696, 0), new CoordinateClueInfo("Wilderness. West of eastern green dragon.", ZAMORAK_WIZARD)) + .put(new WorldPoint(1479, 3696, 0), new CoordinateClueInfo("Lizardman Canyon (DJR).", SARADOMIN_WIZARD)) + .put(new WorldPoint(2712, 3732, 0), new CoordinateClueInfo("North-east of Rellekka (DKS).", SARADOMIN_WIZARD)) + .put(new WorldPoint(2970, 3749, 0), new CoordinateClueInfo("Wilderness. Forgotten Cemetery.", ZAMORAK_WIZARD)) + .put(new WorldPoint(3094, 3764, 0), new CoordinateClueInfo("Wilderness. Mining site north of Bandit Camp.", ZAMORAK_WIZARD)) + .put(new WorldPoint(3311, 3769, 0), new CoordinateClueInfo("Wilderness. North of Venenatis.", ZAMORAK_WIZARD)) + .put(new WorldPoint(1460, 3782, 0), new CoordinateClueInfo("Lovakengj, near burning man.", SARADOMIN_WIZARD)) + .put(new WorldPoint(3244, 3792, 0), new CoordinateClueInfo("Wilderness. South-east of Lava Dragon Isle by some Chaos Dwarves.", ZAMORAK_WIZARD)) + .put(new WorldPoint(3140, 3804, 0), new CoordinateClueInfo("Wilderness. North of Ruins.", ZAMORAK_WIZARD)) + .put(new WorldPoint(2946, 3819, 0), new CoordinateClueInfo("Wilderness. Chaos Temple (level 38).", ZAMORAK_WIZARD)) + .put(new WorldPoint(3771, 3825, 0), new CoordinateClueInfo("Fossil Island. East of Museum Camp.", SARADOMIN_WIZARD)) + .put(new WorldPoint(3013, 3846, 0), new CoordinateClueInfo("Wilderness. West of Lava Maze, before KBD's lair.", ZAMORAK_WIZARD)) + .put(new WorldPoint(3058, 3884, 0), new CoordinateClueInfo("Wilderness. Near runite ore north of Lava Maze.", ZAMORAK_WIZARD)) + .put(new WorldPoint(3290, 3889, 0), new CoordinateClueInfo("Wilderness. Demonic Ruins.", ZAMORAK_WIZARD)) + .put(new WorldPoint(3770, 3897, 0), new CoordinateClueInfo("Small Island north of Fossil Island.", SARADOMIN_WIZARD)) + .put(new WorldPoint(2505, 3899, 0), new CoordinateClueInfo("Small Island north-west of Miscellania (AJS).", SARADOMIN_WIZARD)) + .put(new WorldPoint(3285, 3942, 0), new CoordinateClueInfo("Wilderness. Rogues' Castle.", ZAMORAK_WIZARD)) + .put(new WorldPoint(3159, 3959, 0), new CoordinateClueInfo("Wilderness. North of Deserted Keep, west of Resource Area.", ZAMORAK_WIZARD)) + .put(new WorldPoint(3039, 3960, 0), new CoordinateClueInfo("Wilderness. Pirates' Hideout.", ZAMORAK_WIZARD)) + .put(new WorldPoint(2987, 3963, 0), new CoordinateClueInfo("Wilderness. West of Wilderness Agility Course.", ZAMORAK_WIZARD)) + .put(new WorldPoint(3189, 3963, 0), new CoordinateClueInfo("Wilderness. North of Resource Area, near magic axe hut.", ZAMORAK_WIZARD)) + .put(new WorldPoint(2341, 3697, 0), new CoordinateClueInfo("North-east of the Piscatoris Fishing Colony bank.", SARADOMIN_WIZARD)) + .put(new WorldPoint(3143, 3774, 0), new CoordinateClueInfo("In level 32 Wilderness, by the black chinchompa hunting area.", ZAMORAK_WIZARD)) + .put(new WorldPoint(2992, 3941, 0), new CoordinateClueInfo("Wilderness Agility Course, past the log balance.", ZAMORAK_WIZARD)) // Elite - .put(new WorldPoint(2357, 3151, 0), new CoordinateClueInfo("Lletya.")) - .put(new WorldPoint(3587, 3180, 0), new CoordinateClueInfo("Meiyerditch.")) - .put(new WorldPoint(2820, 3078, 0), new CoordinateClueInfo("Tai Bwo Wannai. Hardwood Grove. 100 Trading sticks or elite Karamja diary completion is needed to enter.")) - .put(new WorldPoint(3811, 3060, 0), new CoordinateClueInfo("Small island north-east of Mos Le'Harmless.", true, Varbits.FIRE_PIT_MOS_LE_HARMLESS)) - .put(new WorldPoint(2180, 3282, 0), new CoordinateClueInfo("North of Iorwerth Camp.")) - .put(new WorldPoint(2870, 2997, 0), new CoordinateClueInfo("North-east corner in Shilo Village.")) - .put(new WorldPoint(3302, 2988, 0), new CoordinateClueInfo("On top of a cliff to the west of Pollnivneach.")) - .put(new WorldPoint(2511, 2980, 0), new CoordinateClueInfo("Just south of Gu'Tanoth, west of gnome glider.")) - .put(new WorldPoint(2732, 3372, 0), new CoordinateClueInfo("Legends' Guild.")) - .put(new WorldPoint(3573, 3425, 0), new CoordinateClueInfo("North of Dessous's tomb from Desert Treasure.")) - .put(new WorldPoint(3828, 2848, 0), new CoordinateClueInfo("East of Harmony Island.")) - .put(new WorldPoint(3225, 2838, 0), new CoordinateClueInfo("South of Desert Treasure pyramid.")) - .put(new WorldPoint(1773, 3510, 0), new CoordinateClueInfo("Ruins north of the Hosidius mine.")) - .put(new WorldPoint(3822, 3562, 0), new CoordinateClueInfo("North-east of Dragontooth Island.")) - .put(new WorldPoint(3603, 3564, 0), new CoordinateClueInfo("North of the wrecked ship, outside of Port Phasmatys.")) - .put(new WorldPoint(2936, 2721, 0), new CoordinateClueInfo("Eastern shore of Crash Island.")) - .put(new WorldPoint(2697, 2705, 0), new CoordinateClueInfo("South-west of Ape Atoll.")) - .put(new WorldPoint(2778, 3678, 0), new CoordinateClueInfo("Mountain Camp.")) - .put(new WorldPoint(2827, 3740, 0), new CoordinateClueInfo("West of the entrance to the Ice Path, where the Troll child resides.")) - .put(new WorldPoint(2359, 3799, 0), new CoordinateClueInfo("Neitiznot.")) - .put(new WorldPoint(2194, 3807, 0), new CoordinateClueInfo("Pirates' Cove.")) - .put(new WorldPoint(2700, 3808, 0), new CoordinateClueInfo("Northwestern part of the Trollweiss and Rellekka Hunter area (DKS).")) - .put(new WorldPoint(3215, 3835, 0), new CoordinateClueInfo("Wilderness. Lava Dragon Isle.")) - .put(new WorldPoint(3369, 3894, 0), new CoordinateClueInfo("Wilderness. Fountain of Rune.")) - .put(new WorldPoint(2065, 3923, 0), new CoordinateClueInfo("Outside the western wall on Lunar Isle.")) - .put(new WorldPoint(3188, 3933, 0), new CoordinateClueInfo("Wilderness. Resource Area.")) - .put(new WorldPoint(2997, 3953, 0), new CoordinateClueInfo("Wilderness. Inside Agility Training Area.")) - .put(new WorldPoint(3380, 3963, 0), new CoordinateClueInfo("Wilderness. North of Volcano.")) - .put(new WorldPoint(3051, 3736, 0), new CoordinateClueInfo("East of the Wilderness Obelisk in 28 Wilderness.")) - .put(new WorldPoint(2316, 3814, 0), new CoordinateClueInfo("West of Neitiznot, near the bridge.")) - .put(new WorldPoint(2872, 3937, 0), new CoordinateClueInfo("Weiss.")) - .put(new WorldPoint(2484, 4016, 0), new CoordinateClueInfo("Northeast corner of the Island of Stone.")) - .put(new WorldPoint(2222, 3331, 0), new CoordinateClueInfo("Prifddinas, west of the Tower of Voices")) - .put(new WorldPoint(3560, 3987, 0), new CoordinateClueInfo("Lithkren. Digsite pendant teleport if unlocked, otherwise take rowboat from west of Mushroom Meadow Mushtree.")) + .put(new WorldPoint(2357, 3151, 0), new CoordinateClueInfo("Lletya.", ARMADYLIAN_OR_BANDOSIAN_GUARD)) + .put(new WorldPoint(3587, 3180, 0), new CoordinateClueInfo("Meiyerditch.", ARMADYLIAN_OR_BANDOSIAN_GUARD)) + .put(new WorldPoint(2820, 3078, 0), new CoordinateClueInfo("Tai Bwo Wannai. Hardwood Grove. 100 Trading sticks or elite Karamja diary completion is needed to enter.", ARMADYLIAN_OR_BANDOSIAN_GUARD)) + .put(new WorldPoint(3811, 3060, 0), new CoordinateClueInfo("Small island north-east of Mos Le'Harmless.", ARMADYLIAN_OR_BANDOSIAN_GUARD, true, Varbits.FIRE_PIT_MOS_LE_HARMLESS)) + .put(new WorldPoint(2180, 3282, 0), new CoordinateClueInfo("North of Iorwerth Camp.", ARMADYLIAN_OR_BANDOSIAN_GUARD)) + .put(new WorldPoint(2870, 2997, 0), new CoordinateClueInfo("North-east corner in Shilo Village.", ARMADYLIAN_OR_BANDOSIAN_GUARD)) + .put(new WorldPoint(3302, 2988, 0), new CoordinateClueInfo("On top of a cliff to the west of Pollnivneach.", ARMADYLIAN_OR_BANDOSIAN_GUARD)) + .put(new WorldPoint(2511, 2980, 0), new CoordinateClueInfo("Just south of Gu'Tanoth, west of gnome glider.", ARMADYLIAN_OR_BANDOSIAN_GUARD)) + .put(new WorldPoint(2732, 3372, 0), new CoordinateClueInfo("Legends' Guild.", ARMADYLIAN_OR_BANDOSIAN_GUARD)) + .put(new WorldPoint(3573, 3425, 0), new CoordinateClueInfo("North of Dessous's tomb from Desert Treasure.", ARMADYLIAN_OR_BANDOSIAN_GUARD)) + .put(new WorldPoint(3828, 2848, 0), new CoordinateClueInfo("East of Harmony Island.", ARMADYLIAN_OR_BANDOSIAN_GUARD)) + .put(new WorldPoint(3225, 2838, 0), new CoordinateClueInfo("South of Desert Treasure pyramid.", ARMADYLIAN_OR_BANDOSIAN_GUARD)) + .put(new WorldPoint(1773, 3510, 0), new CoordinateClueInfo("Ruins north of the Hosidius mine.", ARMADYLIAN_OR_BANDOSIAN_GUARD)) + .put(new WorldPoint(3822, 3562, 0), new CoordinateClueInfo("North-east of Dragontooth Island.", ARMADYLIAN_OR_BANDOSIAN_GUARD)) + .put(new WorldPoint(3603, 3564, 0), new CoordinateClueInfo("North of the wrecked ship, outside of Port Phasmatys.", ARMADYLIAN_OR_BANDOSIAN_GUARD)) + .put(new WorldPoint(2936, 2721, 0), new CoordinateClueInfo("Eastern shore of Crash Island.", ARMADYLIAN_OR_BANDOSIAN_GUARD)) + .put(new WorldPoint(2697, 2705, 0), new CoordinateClueInfo("South-west of Ape Atoll.", ARMADYLIAN_OR_BANDOSIAN_GUARD)) + .put(new WorldPoint(2778, 3678, 0), new CoordinateClueInfo("Mountain Camp.", ARMADYLIAN_OR_BANDOSIAN_GUARD)) + .put(new WorldPoint(2827, 3740, 0), new CoordinateClueInfo("West of the entrance to the Ice Path, where the Troll child resides.", ARMADYLIAN_OR_BANDOSIAN_GUARD)) + .put(new WorldPoint(2359, 3799, 0), new CoordinateClueInfo("Neitiznot.", ARMADYLIAN_OR_BANDOSIAN_GUARD)) + .put(new WorldPoint(2194, 3807, 0), new CoordinateClueInfo("Pirates' Cove.", ARMADYLIAN_OR_BANDOSIAN_GUARD)) + .put(new WorldPoint(2700, 3808, 0), new CoordinateClueInfo("Northwestern part of the Trollweiss and Rellekka Hunter area (DKS).", ARMADYLIAN_OR_BANDOSIAN_GUARD)) + .put(new WorldPoint(3215, 3835, 0), new CoordinateClueInfo("Wilderness. Lava Dragon Isle.", ARMADYLIAN_OR_BANDOSIAN_GUARD)) + .put(new WorldPoint(3369, 3894, 0), new CoordinateClueInfo("Wilderness. Fountain of Rune.", ARMADYLIAN_OR_BANDOSIAN_GUARD)) + .put(new WorldPoint(2065, 3923, 0), new CoordinateClueInfo("Outside the western wall on Lunar Isle.", ARMADYLIAN_OR_BANDOSIAN_GUARD)) + .put(new WorldPoint(3188, 3933, 0), new CoordinateClueInfo("Wilderness. Resource Area.", ARMADYLIAN_OR_BANDOSIAN_GUARD)) + .put(new WorldPoint(2997, 3953, 0), new CoordinateClueInfo("Wilderness. Inside Agility Training Area.", ARMADYLIAN_OR_BANDOSIAN_GUARD)) + .put(new WorldPoint(3380, 3963, 0), new CoordinateClueInfo("Wilderness. North of Volcano.", ARMADYLIAN_OR_BANDOSIAN_GUARD)) + .put(new WorldPoint(3051, 3736, 0), new CoordinateClueInfo("East of the Wilderness Obelisk in 28 Wilderness.", ARMADYLIAN_OR_BANDOSIAN_GUARD)) + .put(new WorldPoint(2316, 3814, 0), new CoordinateClueInfo("West of Neitiznot, near the bridge.", ARMADYLIAN_OR_BANDOSIAN_GUARD)) + .put(new WorldPoint(2872, 3937, 0), new CoordinateClueInfo("Weiss.", ARMADYLIAN_OR_BANDOSIAN_GUARD)) + .put(new WorldPoint(2484, 4016, 0), new CoordinateClueInfo("Northeast corner of the Island of Stone.", ARMADYLIAN_OR_BANDOSIAN_GUARD)) + .put(new WorldPoint(2222, 3331, 0), new CoordinateClueInfo("Prifddinas, west of the Tower of Voices", ARMADYLIAN_OR_BANDOSIAN_GUARD)) + .put(new WorldPoint(3560, 3987, 0), new CoordinateClueInfo("Lithkren. Digsite pendant teleport if unlocked, otherwise take rowboat from west of Mushroom Meadow Mushtree.", ARMADYLIAN_OR_BANDOSIAN_GUARD)) // Master - .put(new WorldPoint(2178, 3209, 0), new CoordinateClueInfo("South of Iorwerth Camp.")) - .put(new WorldPoint(2155, 3100, 0), new CoordinateClueInfo("South of Port Tyras (BJS).")) - .put(new WorldPoint(2217, 3092, 0), new CoordinateClueInfo("Poison Waste island (DLR).")) - .put(new WorldPoint(3830, 3060, 0), new CoordinateClueInfo("Small island located north-east of Mos Le'Harmless.", true, Varbits.FIRE_PIT_MOS_LE_HARMLESS)) - .put(new WorldPoint(2834, 3271, 0), new CoordinateClueInfo("Crandor island.")) - .put(new WorldPoint(2732, 3284, 0), new CoordinateClueInfo("Witchaven.")) - .put(new WorldPoint(3622, 3320, 0), new CoordinateClueInfo("Meiyerditch. Outside mine.")) - .put(new WorldPoint(2303, 3328, 0), new CoordinateClueInfo("East of Prifddinas.")) - .put(new WorldPoint(3570, 3405, 0), new CoordinateClueInfo("North of Dessous's tomb from Desert Treasure.")) - .put(new WorldPoint(2840, 3423, 0), new CoordinateClueInfo("Water Obelisk Island.")) - .put(new WorldPoint(3604, 3564, 0), new CoordinateClueInfo("North of the wrecked ship, outside of Port Phasmatys (ALQ).")) - .put(new WorldPoint(3085, 3569, 0), new CoordinateClueInfo("Wilderness. Obelisk of Air.")) - .put(new WorldPoint(2934, 2727, 0), new CoordinateClueInfo("Eastern shore of Crash Island.")) - .put(new WorldPoint(1451, 3695, 0), new CoordinateClueInfo("West side of Lizardman Canyon with Lizardman shaman.")) - .put(new WorldPoint(2538, 3739, 0), new CoordinateClueInfo("Waterbirth Island. Bring a pet rock and rune thrownaxe.")) - .put(new WorldPoint(1698, 3792, 0), new CoordinateClueInfo("Arceuus church.")) - .put(new WorldPoint(2951, 3820, 0), new CoordinateClueInfo("Wilderness. Chaos Temple (level 38).")) - .put(new WorldPoint(2202, 3825, 0), new CoordinateClueInfo("Pirates' Cove, between Lunar Isle and Rellekka.")) - .put(new WorldPoint(1761, 3853, 0), new CoordinateClueInfo("Arceuus essence mine (CIS).")) - .put(new WorldPoint(2090, 3863, 0), new CoordinateClueInfo("South of Lunar Isle, west of Astral altar.")) - .put(new WorldPoint(1442, 3878, 0), new CoordinateClueInfo("Sulphur Mine.")) - .put(new WorldPoint(3380, 3929, 0), new CoordinateClueInfo("Wilderness. Near Volcano.")) - .put(new WorldPoint(3188, 3939, 0), new CoordinateClueInfo("Wilderness. Resource Area.")) - .put(new WorldPoint(3304, 3941, 0), new CoordinateClueInfo("Wilderness. East of Rogues' Castle.")) - .put(new WorldPoint(2994, 3961, 0), new CoordinateClueInfo("Wilderness. Inside Agility Training Area.")) - .put(new WorldPoint(1248, 3751, 0), new CoordinateClueInfo("In the north wing of the Farming Guild.")) + .put(new WorldPoint(2178, 3209, 0), new CoordinateClueInfo("South of Iorwerth Camp.", BRASSICAN_MAGE)) + .put(new WorldPoint(2155, 3100, 0), new CoordinateClueInfo("South of Port Tyras (BJS).", BRASSICAN_MAGE)) + .put(new WorldPoint(2217, 3092, 0), new CoordinateClueInfo("Poison Waste island (DLR).", BRASSICAN_MAGE)) + .put(new WorldPoint(3830, 3060, 0), new CoordinateClueInfo("Small island located north-east of Mos Le'Harmless.", BRASSICAN_MAGE, true, Varbits.FIRE_PIT_MOS_LE_HARMLESS)) + .put(new WorldPoint(2834, 3271, 0), new CoordinateClueInfo("Crandor island.", BRASSICAN_MAGE)) + .put(new WorldPoint(2732, 3284, 0), new CoordinateClueInfo("Witchaven.", BRASSICAN_MAGE)) + .put(new WorldPoint(3622, 3320, 0), new CoordinateClueInfo("Meiyerditch. Outside mine.", BRASSICAN_MAGE)) + .put(new WorldPoint(2303, 3328, 0), new CoordinateClueInfo("East of Prifddinas.", BRASSICAN_MAGE)) + .put(new WorldPoint(3570, 3405, 0), new CoordinateClueInfo("North of Dessous's tomb from Desert Treasure.", BRASSICAN_MAGE)) + .put(new WorldPoint(2840, 3423, 0), new CoordinateClueInfo("Water Obelisk Island.", BRASSICAN_MAGE)) + .put(new WorldPoint(3604, 3564, 0), new CoordinateClueInfo("North of the wrecked ship, outside of Port Phasmatys (ALQ).", BRASSICAN_MAGE)) + .put(new WorldPoint(3085, 3569, 0), new CoordinateClueInfo("Wilderness. Obelisk of Air.", BRASSICAN_MAGE)) + .put(new WorldPoint(2934, 2727, 0), new CoordinateClueInfo("Eastern shore of Crash Island.", BRASSICAN_MAGE)) + .put(new WorldPoint(1451, 3695, 0), new CoordinateClueInfo("West side of Lizardman Canyon with Lizardman shaman.", ANCIENT_WIZARDS)) + .put(new WorldPoint(2538, 3739, 0), new CoordinateClueInfo("Waterbirth Island. Bring a pet rock and rune thrownaxe.", BRASSICAN_MAGE)) + .put(new WorldPoint(1248, 3751, 0), new CoordinateClueInfo("In the north wing of the Farming Guild.", BRASSICAN_MAGE)) + .put(new WorldPoint(1698, 3792, 0), new CoordinateClueInfo("Arceuus church.", ANCIENT_WIZARDS)) + .put(new WorldPoint(2951, 3820, 0), new CoordinateClueInfo("Wilderness. Chaos Temple (level 38).", ANCIENT_WIZARDS)) + .put(new WorldPoint(2202, 3825, 0), new CoordinateClueInfo("Pirates' Cove, between Lunar Isle and Rellekka.", ANCIENT_WIZARDS)) + .put(new WorldPoint(1761, 3853, 0), new CoordinateClueInfo("Arceuus essence mine (CIS).", BRASSICAN_MAGE)) + .put(new WorldPoint(2090, 3863, 0), new CoordinateClueInfo("South of Lunar Isle, west of Astral altar.", ANCIENT_WIZARDS)) + .put(new WorldPoint(1442, 3878, 0), new CoordinateClueInfo("Sulphur Mine.", BRASSICAN_MAGE)) + .put(new WorldPoint(3380, 3929, 0), new CoordinateClueInfo("Wilderness. Near Volcano.", ANCIENT_WIZARDS)) + .put(new WorldPoint(3188, 3939, 0), new CoordinateClueInfo("Wilderness. Resource Area.", BRASSICAN_MAGE)) + .put(new WorldPoint(3304, 3941, 0), new CoordinateClueInfo("Wilderness. East of Rogues' Castle.", ANCIENT_WIZARDS)) + .put(new WorldPoint(2994, 3961, 0), new CoordinateClueInfo("Wilderness. Inside Agility Training Area.", BRASSICAN_MAGE)) .build(); private final String text; @@ -244,6 +253,7 @@ public class CoordinateClue extends ClueScroll implements TextClueScroll, Locati { setHasFirePit(clueInfo.getLightSource()); setRequiresLight(clueInfo.lightRequired); + setEnemy(clueInfo.getEnemy()); } setRequiresSpade(true); } diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/clues/EmoteClue.java b/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/clues/EmoteClue.java index 36c6d814b0..d0d58ff2e1 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/clues/EmoteClue.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/clues/EmoteClue.java @@ -53,6 +53,7 @@ import static net.runelite.client.plugins.cluescrolls.clues.emote.STASHUnit.*; import static net.runelite.client.plugins.cluescrolls.clues.emote.STASHUnit.SHANTAY_PASS; import net.runelite.client.plugins.cluescrolls.clues.item.ItemRequirement; import static net.runelite.client.plugins.cluescrolls.clues.item.ItemRequirements.*; +import static net.runelite.client.plugins.cluescrolls.clues.Enemy.*; import net.runelite.client.ui.overlay.OverlayUtil; import net.runelite.client.ui.overlay.components.LineComponent; import net.runelite.client.ui.overlay.components.PanelComponent; @@ -62,62 +63,62 @@ import net.runelite.client.ui.overlay.components.TitleComponent; public class EmoteClue extends ClueScroll implements TextClueScroll, LocationClueScroll { private static final Set CLUES = ImmutableSet.of( - new EmoteClue("Beckon on the east coast of the Kharazi Jungle. Beware of double agents! Equip any vestment stole and a heraldic rune shield.", "Kharazi Jungle", NORTHEAST_CORNER_OF_THE_KHARAZI_JUNGLE, new WorldPoint(2954, 2933, 0), BECKON, any("Any stole", item(GUTHIX_STOLE), item(SARADOMIN_STOLE), item(ZAMORAK_STOLE), item(ARMADYL_STOLE), item(BANDOS_STOLE), item(ANCIENT_STOLE)), any("Any heraldic rune shield", item(RUNE_SHIELD_H1), item(RUNE_SHIELD_H2), item(RUNE_SHIELD_H3), item(RUNE_SHIELD_H4), item(RUNE_SHIELD_H5))), + new EmoteClue("Beckon on the east coast of the Kharazi Jungle. Beware of double agents! Equip any vestment stole and a heraldic rune shield.", "Kharazi Jungle", NORTHEAST_CORNER_OF_THE_KHARAZI_JUNGLE, new WorldPoint(2954, 2933, 0), DOUBLE_AGENT_108, BECKON, any("Any stole", item(GUTHIX_STOLE), item(SARADOMIN_STOLE), item(ZAMORAK_STOLE), item(ARMADYL_STOLE), item(BANDOS_STOLE), item(ANCIENT_STOLE)), any("Any heraldic rune shield", item(RUNE_SHIELD_H1), item(RUNE_SHIELD_H2), item(RUNE_SHIELD_H3), item(RUNE_SHIELD_H4), item(RUNE_SHIELD_H5))), new EmoteClue("Cheer in the Barbarian Agility Arena. Headbang before you talk to me. Equip a steel platebody, maple shortbow and a Wilderness cape.", "Barbarian Outpost", BARBARIAN_OUTPOST_OBSTACLE_COURSE, new WorldPoint(2552, 3556, 0), CHEER, HEADBANG, item(STEEL_PLATEBODY), item(MAPLE_SHORTBOW), range("Any team cape", TEAM1_CAPE, TEAM50_CAPE)), new EmoteClue("Bow upstairs in the Edgeville Monastery. Equip a completed prayer book.", "Edgeville Monastery", SOUTHEAST_CORNER_OF_THE_MONASTERY, new WorldPoint(3056, 3484, 1), BOW, any("Any god book", item(HOLY_BOOK), item(BOOK_OF_BALANCE), item(UNHOLY_BOOK), item(BOOK_OF_LAW), item(BOOK_OF_WAR), item(BOOK_OF_DARKNESS))), new EmoteClue("Cheer in the Shadow dungeon. Equip a rune crossbow, climbing boots and any mitre.", "Shadow dungeon", ENTRANCE_OF_THE_CAVE_OF_DAMIS, new WorldPoint(2629, 5071, 0), CHEER, any("Any mitre", item(GUTHIX_MITRE), item(SARADOMIN_MITRE), item(ZAMORAK_MITRE), item(ANCIENT_MITRE), item(BANDOS_MITRE), item(ARMADYL_MITRE)), item(RUNE_CROSSBOW), item(CLIMBING_BOOTS), item(RING_OF_VISIBILITY)), - new EmoteClue("Cheer at the top of the agility pyramid. Beware of double agents! Equip a blue mystic robe top, and any rune heraldic shield.", "Agility Pyramid", AGILITY_PYRAMID, new WorldPoint(3043, 4697, 3), CHEER, item(MYSTIC_ROBE_TOP), any("Any rune heraldic shield", item(RUNE_SHIELD_H1), item(RUNE_SHIELD_H2), item(RUNE_SHIELD_H3), item(RUNE_SHIELD_H4), item(RUNE_SHIELD_H5))), - new EmoteClue("Dance in Iban's temple. Beware of double agents! Equip Iban's staff, a black mystic top and a black mystic bottom.", "Iban's temple", WELL_OF_VOYAGE, new WorldPoint(2011, 4712, 0), DANCE, any("Any iban's staff", item(IBANS_STAFF), item(IBANS_STAFF_U)), item(MYSTIC_ROBE_TOP_DARK), item(MYSTIC_ROBE_BOTTOM_DARK)), + new EmoteClue("Cheer at the top of the agility pyramid. Beware of double agents! Equip a blue mystic robe top, and any rune heraldic shield.", "Agility Pyramid", AGILITY_PYRAMID, new WorldPoint(3043, 4697, 3), DOUBLE_AGENT_108, CHEER, item(MYSTIC_ROBE_TOP), any("Any rune heraldic shield", item(RUNE_SHIELD_H1), item(RUNE_SHIELD_H2), item(RUNE_SHIELD_H3), item(RUNE_SHIELD_H4), item(RUNE_SHIELD_H5))), + new EmoteClue("Dance in Iban's temple. Beware of double agents! Equip Iban's staff, a black mystic top and a black mystic bottom.", "Iban's temple", WELL_OF_VOYAGE, new WorldPoint(2011, 4712, 0), DOUBLE_AGENT_141, DANCE, any("Any iban's staff", item(IBANS_STAFF), item(IBANS_STAFF_U)), item(MYSTIC_ROBE_TOP_DARK), item(MYSTIC_ROBE_BOTTOM_DARK)), new EmoteClue("Dance on the Fishing Platform. Equip barrows gloves, an amulet of glory and a dragon med helm.", "Fishing Platform", SOUTHEAST_CORNER_OF_THE_FISHING_PLATFORM, new WorldPoint(2782, 3273, 0), DANCE, any("Any amulet of glory", item(AMULET_OF_GLORY), item(AMULET_OF_GLORY1), item(AMULET_OF_GLORY2), item(AMULET_OF_GLORY3), item(AMULET_OF_GLORY4), item(AMULET_OF_GLORY5), item(AMULET_OF_GLORY6)), item(BARROWS_GLOVES), item(DRAGON_MED_HELM)), - new EmoteClue("Flap at the death altar. Beware of double agents! Equip a death tiara, a legend's cape and any ring of wealth.", "Death altar", DEATH_ALTAR, new WorldPoint(2205, 4838, 0), FLAP, any("Any ring of wealth", item(RING_OF_WEALTH), item(RING_OF_WEALTH_1), item(RING_OF_WEALTH_2), item(RING_OF_WEALTH_3), item(RING_OF_WEALTH_4), item(RING_OF_WEALTH_5), item(RING_OF_WEALTH_I), item(RING_OF_WEALTH_I1), item(RING_OF_WEALTH_I2), item(RING_OF_WEALTH_I3), item(RING_OF_WEALTH_I4), item(RING_OF_WEALTH_I5)), item(DEATH_TIARA), item(CAPE_OF_LEGENDS)), + new EmoteClue("Flap at the death altar. Beware of double agents! Equip a death tiara, a legend's cape and any ring of wealth.", "Death altar", DEATH_ALTAR, new WorldPoint(2205, 4838, 0), DOUBLE_AGENT_141, FLAP, any("Any ring of wealth", item(RING_OF_WEALTH), item(RING_OF_WEALTH_1), item(RING_OF_WEALTH_2), item(RING_OF_WEALTH_3), item(RING_OF_WEALTH_4), item(RING_OF_WEALTH_5), item(RING_OF_WEALTH_I), item(RING_OF_WEALTH_I1), item(RING_OF_WEALTH_I2), item(RING_OF_WEALTH_I3), item(RING_OF_WEALTH_I4), item(RING_OF_WEALTH_I5)), item(DEATH_TIARA), item(CAPE_OF_LEGENDS)), new EmoteClue("Headbang in the Fight Arena pub. Equip a pirate bandana, a dragonstone necklace and and a magic longbow.", "Fight Arena pub", OUTSIDE_THE_BAR_BY_THE_FIGHT_ARENA, new WorldPoint(2568, 3149, 0), HEADBANG, any("Any pirate bandana", item(PIRATE_BANDANA), item(PIRATE_BANDANA_7124), item(PIRATE_BANDANA_7130), item(PIRATE_BANDANA_7136)), item(DRAGON_NECKLACE), item(MAGIC_LONGBOW)), - new EmoteClue("Do a jig at the barrows chest. Beware of double agents! Equip any full barrows set.", "Barrows chest", BARROWS_CHEST, new WorldPoint(3551, 9694, 0), JIG, any("Any full barrows set", all(range(AHRIMS_HOOD_100, AHRIMS_HOOD_0), range(AHRIMS_STAFF_100, AHRIMS_STAFF_0), range(AHRIMS_ROBETOP_100, AHRIMS_ROBETOP_0), range(AHRIMS_ROBESKIRT_100, AHRIMS_ROBESKIRT_0)), all(range(DHAROKS_HELM_100, DHAROKS_HELM_0), range(DHAROKS_GREATAXE_100, DHAROKS_GREATAXE_0), range(DHAROKS_PLATEBODY_100, DHAROKS_PLATEBODY_0), range(DHAROKS_PLATELEGS_100, DHAROKS_PLATELEGS_0)), all(range(GUTHANS_HELM_100, GUTHANS_HELM_0), range(GUTHANS_WARSPEAR_100, GUTHANS_WARSPEAR_0), range(GUTHANS_PLATEBODY_100, GUTHANS_PLATEBODY_0), range(GUTHANS_CHAINSKIRT_100, GUTHANS_CHAINSKIRT_0)), all(range(KARILS_COIF_100, KARILS_COIF_0), range(KARILS_CROSSBOW_100, KARILS_CROSSBOW_0), range(KARILS_LEATHERTOP_100, KARILS_LEATHERTOP_0), range(KARILS_LEATHERSKIRT_100, KARILS_LEATHERSKIRT_0)), all(range(TORAGS_HELM_100, TORAGS_HELM_0), range(TORAGS_HAMMERS_100, TORAGS_HAMMERS_0), range(TORAGS_PLATEBODY_100, TORAGS_PLATEBODY_0), range(TORAGS_PLATELEGS_100, TORAGS_PLATELEGS_0)), all(range(VERACS_HELM_100, VERACS_HELM_0), range(VERACS_FLAIL_100, VERACS_FLAIL_0), range(VERACS_BRASSARD_100, VERACS_BRASSARD_0), range(VERACS_PLATESKIRT_100, VERACS_PLATESKIRT_0)))), - new EmoteClue("Jig at Jiggig. Beware of double agents! Equip a Rune spear, rune platelegs and any rune heraldic helm.", "Jiggig", IN_THE_MIDDLE_OF_JIGGIG, new WorldPoint(2477, 3047, 0), JIG, range("Any rune heraldic helm", RUNE_HELM_H1, RUNE_HELM_H5), item(RUNE_SPEAR), item(RUNE_PLATELEGS)), + new EmoteClue("Do a jig at the barrows chest. Beware of double agents! Equip any full barrows set.", "Barrows chest", BARROWS_CHEST, new WorldPoint(3551, 9694, 0), DOUBLE_AGENT_141, JIG, any("Any full barrows set", all(range(AHRIMS_HOOD_100, AHRIMS_HOOD_0), range(AHRIMS_STAFF_100, AHRIMS_STAFF_0), range(AHRIMS_ROBETOP_100, AHRIMS_ROBETOP_0), range(AHRIMS_ROBESKIRT_100, AHRIMS_ROBESKIRT_0)), all(range(DHAROKS_HELM_100, DHAROKS_HELM_0), range(DHAROKS_GREATAXE_100, DHAROKS_GREATAXE_0), range(DHAROKS_PLATEBODY_100, DHAROKS_PLATEBODY_0), range(DHAROKS_PLATELEGS_100, DHAROKS_PLATELEGS_0)), all(range(GUTHANS_HELM_100, GUTHANS_HELM_0), range(GUTHANS_WARSPEAR_100, GUTHANS_WARSPEAR_0), range(GUTHANS_PLATEBODY_100, GUTHANS_PLATEBODY_0), range(GUTHANS_CHAINSKIRT_100, GUTHANS_CHAINSKIRT_0)), all(range(KARILS_COIF_100, KARILS_COIF_0), range(KARILS_CROSSBOW_100, KARILS_CROSSBOW_0), range(KARILS_LEATHERTOP_100, KARILS_LEATHERTOP_0), range(KARILS_LEATHERSKIRT_100, KARILS_LEATHERSKIRT_0)), all(range(TORAGS_HELM_100, TORAGS_HELM_0), range(TORAGS_HAMMERS_100, TORAGS_HAMMERS_0), range(TORAGS_PLATEBODY_100, TORAGS_PLATEBODY_0), range(TORAGS_PLATELEGS_100, TORAGS_PLATELEGS_0)), all(range(VERACS_HELM_100, VERACS_HELM_0), range(VERACS_FLAIL_100, VERACS_FLAIL_0), range(VERACS_BRASSARD_100, VERACS_BRASSARD_0), range(VERACS_PLATESKIRT_100, VERACS_PLATESKIRT_0)))), + new EmoteClue("Jig at Jiggig. Beware of double agents! Equip a Rune spear, rune platelegs and any rune heraldic helm.", "Jiggig", IN_THE_MIDDLE_OF_JIGGIG, new WorldPoint(2477, 3047, 0), DOUBLE_AGENT_108, JIG, range("Any rune heraldic helm", RUNE_HELM_H1, RUNE_HELM_H5), item(RUNE_SPEAR), item(RUNE_PLATELEGS)), new EmoteClue("Cheer at the games room. Have nothing equipped at all when you do.", "Games room", null, new WorldPoint(2207, 4952, 0), CHEER, emptySlot("Nothing at all", HEAD, CAPE, AMULET, WEAPON, BODY, SHIELD, LEGS, GLOVES, BOOTS, RING, AMMO)), new EmoteClue("Panic on the pier where you catch the Fishing trawler. Have nothing equipped at all when you do.", "Fishing trawler", null, new WorldPoint(2676, 3169, 0), PANIC, emptySlot("Nothing at all", HEAD, CAPE, AMULET, WEAPON, BODY, SHIELD, LEGS, GLOVES, BOOTS, RING, AMMO)), - new EmoteClue("Panic in the heart of the Haunted Woods. Beware of double agents! Have no items equipped when you do.", "Haunted Woods", null, new WorldPoint(3611, 3492, 0), PANIC, emptySlot("Nothing at all", HEAD, CAPE, AMULET, WEAPON, BODY, SHIELD, LEGS, GLOVES, BOOTS, RING, AMMO)), - new EmoteClue("Show your anger towards the Statue of Saradomin in Ellamaria's garden. Beware of double agents! Equip a zamorak godsword.", "Varrock Castle", BY_THE_BEAR_CAGE_IN_VARROCK_PALACE_GARDENS, new WorldPoint(3230, 3478, 0), ANGRY, any("Zamorak godsword", item(ZAMORAK_GODSWORD), item(ZAMORAK_GODSWORD_OR))), - new EmoteClue("Show your anger at the Wise old man. Beware of double agents! Equip an abyssal whip, a legend's cape and some spined chaps.", "Draynor Village", BEHIND_MISS_SCHISM_IN_DRAYNOR_VILLAGE, new WorldPoint(3088, 3254, 0), ANGRY, any("Abyssal whip", item(ABYSSAL_WHIP), item(VOLCANIC_ABYSSAL_WHIP), item(FROZEN_ABYSSAL_WHIP)), item(CAPE_OF_LEGENDS), item(SPINED_CHAPS)), - new EmoteClue("Beckon by a collection of crystalline maple trees. Beware of double agents! Equip Bryophyta's staff and a nature tiara.", "North of Prifddinas", CRYSTALLINE_MAPLE_TREES, new WorldPoint(2211, 3427, 0), BECKON, range("Bryophyta's staff", BRYOPHYTAS_STAFF_UNCHARGED, BRYOPHYTAS_STAFF), item(NATURE_TIARA)), + new EmoteClue("Panic in the heart of the Haunted Woods. Beware of double agents! Have no items equipped when you do.", "Haunted Woods", null, new WorldPoint(3611, 3492, 0), DOUBLE_AGENT_108, PANIC, emptySlot("Nothing at all", HEAD, CAPE, AMULET, WEAPON, BODY, SHIELD, LEGS, GLOVES, BOOTS, RING, AMMO)), + new EmoteClue("Show your anger towards the Statue of Saradomin in Ellamaria's garden. Beware of double agents! Equip a zamorak godsword.", "Varrock Castle", BY_THE_BEAR_CAGE_IN_VARROCK_PALACE_GARDENS, new WorldPoint(3230, 3478, 0), DOUBLE_AGENT_141, ANGRY, any("Zamorak godsword", item(ZAMORAK_GODSWORD), item(ZAMORAK_GODSWORD_OR))), + new EmoteClue("Show your anger at the Wise old man. Beware of double agents! Equip an abyssal whip, a legend's cape and some spined chaps.", "Draynor Village", BEHIND_MISS_SCHISM_IN_DRAYNOR_VILLAGE, new WorldPoint(3088, 3254, 0), DOUBLE_AGENT_141, ANGRY, any("Abyssal whip", item(ABYSSAL_WHIP), item(VOLCANIC_ABYSSAL_WHIP), item(FROZEN_ABYSSAL_WHIP)), item(CAPE_OF_LEGENDS), item(SPINED_CHAPS)), + new EmoteClue("Beckon by a collection of crystalline maple trees. Beware of double agents! Equip Bryophyta's staff and a nature tiara.", "North of Prifddinas", CRYSTALLINE_MAPLE_TREES, new WorldPoint(2211, 3427, 0), DOUBLE_AGENT_141, BECKON, range("Bryophyta's staff", BRYOPHYTAS_STAFF_UNCHARGED, BRYOPHYTAS_STAFF), item(NATURE_TIARA)), new EmoteClue("Beckon in the Digsite, near the eastern winch. Bow before you talk to me. Equip a green gnome hat, snakeskin boots and an iron pickaxe.", "Digsite", DIGSITE, new WorldPoint(3370, 3425, 0), BECKON, BOW, item(GREEN_HAT), item(SNAKESKIN_BOOTS), item(IRON_PICKAXE)), new EmoteClue("Beckon in Tai Bwo Wannai. Clap before you talk to me. Equip green dragonhide chaps, a ring of dueling and a mithril medium helmet.", "Tai Bwo Wannai", SOUTH_OF_THE_SHRINE_IN_TAI_BWO_WANNAI_VILLAGE, new WorldPoint(2803, 3073, 0), BECKON, CLAP, item(GREEN_DHIDE_CHAPS), any("Ring of dueling", item(RING_OF_DUELING1), item(RING_OF_DUELING2), item(RING_OF_DUELING3), item(RING_OF_DUELING4), item(RING_OF_DUELING5), item(RING_OF_DUELING6), item(RING_OF_DUELING7), item(RING_OF_DUELING8)), item(MITHRIL_MED_HELM)), new EmoteClue("Beckon in the combat ring of Shayzien. Show your anger before you talk to me. Equip an adamant platebody, adamant full helm and adamant platelegs.", "Shayzien combat ring", WEST_OF_THE_SHAYZIEN_COMBAT_RING, new WorldPoint(1545, 3594, 0), BECKON, ANGRY, item(ADAMANT_PLATELEGS), item(ADAMANT_PLATEBODY), item(ADAMANT_FULL_HELM)), - new EmoteClue("Bow near Lord Iorwerth. Beware of double agents! Equip a charged crystal bow.", "Lord Iorwerth's camp", TENT_IN_LORD_IORWERTHS_ENCAMPMENT, new WorldPoint(2205, 3252, 0), BOW, any("Crystal Bow", item(CRYSTAL_BOW), item(CRYSTAL_BOW_24123))), - new EmoteClue("Bow in the Iorwerth Camp. Beware of double agents! Equip a charged crystal bow.", "Lord Iorwerth's camp", TENT_IN_LORD_IORWERTHS_ENCAMPMENT, new WorldPoint(2205, 3252, 0), BOW, any("Crystal Bow", item(CRYSTAL_BOW), item(CRYSTAL_BOW_24123))), + new EmoteClue("Bow near Lord Iorwerth. Beware of double agents! Equip a charged crystal bow.", "Lord Iorwerth's camp", TENT_IN_LORD_IORWERTHS_ENCAMPMENT, new WorldPoint(2205, 3252, 0), DOUBLE_AGENT_141, BOW, any("Crystal Bow", item(CRYSTAL_BOW), item(CRYSTAL_BOW_24123))), + new EmoteClue("Bow in the Iorwerth Camp. Beware of double agents! Equip a charged crystal bow.", "Lord Iorwerth's camp", TENT_IN_LORD_IORWERTHS_ENCAMPMENT, new WorldPoint(2205, 3252, 0), DOUBLE_AGENT_141, BOW, any("Crystal Bow", item(CRYSTAL_BOW), item(CRYSTAL_BOW_24123))), new EmoteClue("Bow outside the entrance to the Legends' Guild. Equip iron platelegs, an emerald amulet and an oak longbow.", "Legend's Guild", OUTSIDE_THE_LEGENDS_GUILD_GATES, new WorldPoint(2729, 3349, 0), BOW, item(IRON_PLATELEGS), item(OAK_LONGBOW), item(EMERALD_AMULET)), new EmoteClue("Bow on the ground floor of the Legend's guild. Equip Legend's cape, a dragon battleaxe and an amulet of glory.", "Legend's Guild", OUTSIDE_THE_LEGENDS_GUILD_DOOR, new WorldPoint(2728, 3377, 0), BOW, item(CAPE_OF_LEGENDS), item(DRAGON_BATTLEAXE), any("Any amulet of glory", item(AMULET_OF_GLORY), item(AMULET_OF_GLORY1), item(AMULET_OF_GLORY2), item(AMULET_OF_GLORY3), item(AMULET_OF_GLORY4), item(AMULET_OF_GLORY5), item(AMULET_OF_GLORY6))), new EmoteClue("Bow in the ticket office of the Duel Arena. Equip an iron chain body, leather chaps and coif.", "Duel Arena", MUBARIZS_ROOM_AT_THE_DUEL_ARENA, new WorldPoint(3314, 3241, 0), BOW, item(IRON_CHAINBODY), item(LEATHER_CHAPS), item(COIF)), - new EmoteClue("Bow at the top of the lighthouse. Beware of double agents! Equip a blue dragonhide body, blue dragonhide vambraces and no jewelry.", "Lighthouse", TOP_FLOOR_OF_THE_LIGHTHOUSE, new WorldPoint(2511, 3641, 2), BOW, item(BLUE_DHIDE_BODY), item(BLUE_DHIDE_VAMBRACES), emptySlot("No jewelry", AMULET, RING)), - new EmoteClue("Blow a kiss between the tables in Shilo Village bank. Beware of double agents! Equip a blue mystic hat, bone spear and rune platebody.", "Shilo Village", SHILO_VILLAGE_BANK, new WorldPoint(2851, 2954, 0), BLOW_KISS, item(MYSTIC_HAT), item(BONE_SPEAR), item(RUNE_PLATEBODY)), + new EmoteClue("Bow at the top of the lighthouse. Beware of double agents! Equip a blue dragonhide body, blue dragonhide vambraces and no jewelry.", "Lighthouse", TOP_FLOOR_OF_THE_LIGHTHOUSE, new WorldPoint(2511, 3641, 2), DOUBLE_AGENT_108, BOW, item(BLUE_DHIDE_BODY), item(BLUE_DHIDE_VAMBRACES), emptySlot("No jewelry", AMULET, RING)), + new EmoteClue("Blow a kiss between the tables in Shilo Village bank. Beware of double agents! Equip a blue mystic hat, bone spear and rune platebody.", "Shilo Village", SHILO_VILLAGE_BANK, new WorldPoint(2851, 2954, 0), DOUBLE_AGENT_108, BLOW_KISS, item(MYSTIC_HAT), item(BONE_SPEAR), item(RUNE_PLATEBODY)), new EmoteClue("Blow a kiss in the heart of the lava maze. Equip black dragonhide chaps, a spotted cape and a rolling pin.", "Lava maze", NEAR_A_LADDER_IN_THE_WILDERNESS_LAVA_MAZE, new WorldPoint(3069, 3861, 0), BLOW_KISS, item(BLACK_DHIDE_CHAPS), any("Spotted cape", item(SPOTTED_CAPE), item(SPOTTED_CAPE_10073)), item(ROLLING_PIN)), - new EmoteClue("Blow a kiss outside K'ril Tsutsaroth's chamber. Beware of double agents! Equip a zamorak full helm and the shadow sword.", "K'ril's chamber", OUTSIDE_KRIL_TSUTSAROTHS_ROOM, new WorldPoint(2925, 5333, 0), BLOW_KISS, item(ZAMORAK_FULL_HELM), item(SHADOW_SWORD)), + new EmoteClue("Blow a kiss outside K'ril Tsutsaroth's chamber. Beware of double agents! Equip a zamorak full helm and the shadow sword.", "K'ril's chamber", OUTSIDE_KRIL_TSUTSAROTHS_ROOM, new WorldPoint(2925, 5333, 0), DOUBLE_AGENT_141, BLOW_KISS, item(ZAMORAK_FULL_HELM), item(SHADOW_SWORD)), new EmoteClue("Cheer at the Druids' Circle. Equip a blue wizard hat, a bronze two-handed sword and HAM boots.", "Taverley stone circle", TAVERLEY_STONE_CIRCLE, new WorldPoint(2924, 3478, 0), CHEER, item(BLUE_WIZARD_HAT), item(BRONZE_2H_SWORD), item(HAM_BOOTS)), new EmoteClue("Cheer in the Edgeville general store. Dance before you talk to me. Equip a brown apron, leather boots and leather gloves.", "Edgeville", NORTH_OF_EVIL_DAVES_HOUSE_IN_EDGEVILLE, new WorldPoint(3080, 3509, 0), CHEER, DANCE, item(BROWN_APRON), item(LEATHER_BOOTS), item(LEATHER_GLOVES)), new EmoteClue("Cheer in the Ogre Pen in the Training Camp. Show you are angry before you talk to me. Equip a green dragonhide body and chaps and a steel square shield.", "King Lathas' camp", OGRE_CAGE_IN_KING_LATHAS_TRAINING_CAMP, new WorldPoint(2527, 3375, 0), CHEER, ANGRY, item(GREEN_DHIDE_BODY), item(GREEN_DHIDE_CHAPS), item(STEEL_SQ_SHIELD)), - new EmoteClue("Cheer in the Entrana church. Beware of double agents! Equip a full set of black dragonhide armour.", "Entrana church", ENTRANA_CHAPEL, new WorldPoint(2852, 3349, 0), CHEER, item(BLACK_DHIDE_VAMBRACES), item(BLACK_DHIDE_CHAPS), item(BLACK_DHIDE_BODY)), + new EmoteClue("Cheer in the Entrana church. Beware of double agents! Equip a full set of black dragonhide armour.", "Entrana church", ENTRANA_CHAPEL, new WorldPoint(2852, 3349, 0), DOUBLE_AGENT_141, CHEER, item(BLACK_DHIDE_VAMBRACES), item(BLACK_DHIDE_CHAPS), item(BLACK_DHIDE_BODY)), new EmoteClue("Cheer for the monks at Port Sarim. Equip a coif, steel plateskirt and a sapphire necklace.", "Port Sarim", NEAR_THE_ENTRANA_FERRY_IN_PORT_SARIM, new WorldPoint(3047, 3237, 0), CHEER, item(COIF), item(STEEL_PLATESKIRT), item(SAPPHIRE_NECKLACE)), new EmoteClue("Clap in the main exam room in the Exam Centre. Equip a white apron, green gnome boots and leather gloves.", "Digsite", OUTSIDE_THE_DIGSITE_EXAM_CENTRE, new WorldPoint(3361, 3339, 0), CLAP, item(WHITE_APRON), item(GREEN_BOOTS), item(LEATHER_GLOVES)), new EmoteClue("Clap on the causeway to the Wizards' Tower. Equip an iron medium helmet, emerald ring and a white apron.", "Wizards' Tower", ON_THE_BRIDGE_TO_THE_MISTHALIN_WIZARDS_TOWER, new WorldPoint(3113, 3196, 0), CLAP, item(IRON_MED_HELM), item(EMERALD_RING), item(WHITE_APRON)), new EmoteClue("Clap on the top level of the mill, north of East Ardougne. Equip a blue gnome robe top, HAM robe bottom and an unenchanted tiara.", "East Ardougne", UPSTAIRS_IN_THE_ARDOUGNE_WINDMILL, new WorldPoint(2635, 3385, 3), CLAP, item(BLUE_ROBE_TOP), item(HAM_ROBE), item(TIARA)), new EmoteClue("Clap in Seers court house. Spin before you talk to me. Equip an adamant halberd, blue mystic robe bottom and a diamond ring.", "Seers Village", OUTSIDE_THE_SEERS_VILLAGE_COURTHOUSE, new WorldPoint(2735, 3469, 0), CLAP, SPIN, item(ADAMANT_HALBERD), item(MYSTIC_ROBE_BOTTOM), item(DIAMOND_RING)), - new EmoteClue("Clap in the magic axe hut. Beware of double agents! Equip only some flared trousers.", "Magic axe hut", OUTSIDE_THE_WILDERNESS_AXE_HUT, new WorldPoint(3191, 3960, 0), CLAP, item(FLARED_TROUSERS), item(LOCKPICK), emptySlot("Nothing else", HEAD, CAPE, AMULET, WEAPON, BODY, SHIELD, GLOVES, BOOTS, RING, AMMO)), + new EmoteClue("Clap in the magic axe hut. Beware of double agents! Equip only some flared trousers.", "Magic axe hut", OUTSIDE_THE_WILDERNESS_AXE_HUT, new WorldPoint(3191, 3960, 0), DOUBLE_AGENT_141, CLAP, item(FLARED_TROUSERS), item(LOCKPICK), emptySlot("Nothing else", HEAD, CAPE, AMULET, WEAPON, BODY, SHIELD, GLOVES, BOOTS, RING, AMMO)), new EmoteClue("Clap your hands north of Mount Karuulm Spin before you talk to me. Equip an adamant warhammer, a ring of life and a pair of mithril boots.", "Mount Karuulm", NORTH_OF_MOUNT_KARUULM, new WorldPoint(1306, 3839, 0), CLAP, SPIN, item(ADAMANT_WARHAMMER), item(RING_OF_LIFE), item(MITHRIL_BOOTS)), new EmoteClue("Cry in the Catherby Ranging shop. Bow before you talk to me. Equip blue gnome boots, a hard leather body and an unblessed silver sickle.", "Catherby", HICKTONS_ARCHERY_EMPORIUM, new WorldPoint(2823, 3443, 0), CRY, BOW, item(BLUE_BOOTS), item(HARDLEATHER_BODY), item(SILVER_SICKLE)), new EmoteClue("Cry on the shore of Catherby beach. Laugh before you talk to me, equip an adamant sq shield, a bone dagger and mithril platebody.", "Catherby", OUTSIDE_HARRYS_FISHING_SHOP_IN_CATHERBY, new WorldPoint(2852, 3429, 0), CRY, LAUGH, item(ADAMANT_SQ_SHIELD), item(BONE_DAGGER), item(MITHRIL_PLATEBODY)), new EmoteClue("Cry on top of the western tree in the Gnome Agility Arena. Indicate 'no' before you talk to me. Equip a steel kiteshield, ring of forging and green dragonhide chaps.", "Gnome Stronghold", GNOME_STRONGHOLD_BALANCING_ROPE, new WorldPoint(2473, 3420, 2), CRY, NO, item(STEEL_KITESHIELD), item(RING_OF_FORGING), item(GREEN_DHIDE_CHAPS)), - new EmoteClue("Cry in the TzHaar gem store. Beware of double agents! Equip a fire cape and TokTz-Xil-Ul.", "Tzhaar gem store", TZHAAR_GEM_STORE, new WorldPoint(2463, 5149, 0), CRY, any("Fire cape", item(FIRE_CAPE), item(FIRE_MAX_CAPE), item(INFERNAL_CAPE), item(INFERNAL_MAX_CAPE)), item(TOKTZXILUL)), + new EmoteClue("Cry in the TzHaar gem store. Beware of double agents! Equip a fire cape and TokTz-Xil-Ul.", "Tzhaar gem store", TZHAAR_GEM_STORE, new WorldPoint(2463, 5149, 0), DOUBLE_AGENT_141, CRY, any("Fire cape", item(FIRE_CAPE), item(FIRE_MAX_CAPE), item(INFERNAL_CAPE), item(INFERNAL_MAX_CAPE)), item(TOKTZXILUL)), new EmoteClue("Cry in the Draynor Village jail. Jump for joy before you talk to me. Equip an adamant sword, a sapphire amulet and an adamant plateskirt.", "Draynor Village jail", OUTSIDE_DRAYNOR_VILLAGE_JAIL, new WorldPoint(3128, 3245, 0), CRY, JUMP_FOR_JOY, item(ADAMANT_SWORD), item(SAPPHIRE_AMULET), item(ADAMANT_PLATESKIRT)), new EmoteClue("Dance at the crossroads north of Draynor. Equip an iron chain body, a sapphire ring and a longbow.", "Draynor Village", CROSSROADS_NORTH_OF_DRAYNOR_VILLAGE, new WorldPoint(3109, 3294, 0), DANCE, item(IRON_CHAINBODY), item(SAPPHIRE_RING), item(LONGBOW)), new EmoteClue("Dance in the Party Room. Equip a steel full helmet, steel platebody and an iron plateskirt.", "Falador Party Room", OUTSIDE_THE_FALADOR_PARTY_ROOM, new WorldPoint(3045, 3376, 0), DANCE, item(STEEL_FULL_HELM), item(STEEL_PLATEBODY), item(IRON_PLATESKIRT)), new EmoteClue("Dance in the shack in Lumbridge Swamp. Equip a bronze dagger, iron full helmet and a gold ring.", "Lumbridge swamp", NEAR_A_SHED_IN_LUMBRIDGE_SWAMP, new WorldPoint(3203, 3169, 0), DANCE, item(BRONZE_DAGGER), item(IRON_FULL_HELM), item(GOLD_RING)), new EmoteClue("Dance in the dark caves beneath Lumbridge Swamp. Blow a kiss before you talk to me. Equip an air staff, Bronze full helm and an amulet of power.", "Lumbridge swamp caves", LUMBRIDGE_SWAMP_CAVES, new WorldPoint(3168, 9571, 0), DANCE, BLOW_KISS, Varbits.FIRE_PIT_LUMBRIDGE_SWAMP, item(STAFF_OF_AIR), item(BRONZE_FULL_HELM), item(AMULET_OF_POWER)), - new EmoteClue("Dance at the cat-doored pyramid in Sophanem. Beware of double agents! Equip a ring of life, an uncharged amulet of glory and an adamant two-handed sword.", "Pyramid Of Sophanem", OUTSIDE_THE_GREAT_PYRAMID_OF_SOPHANEM, new WorldPoint(3294, 2781, 0), DANCE, item(RING_OF_LIFE), item(AMULET_OF_GLORY), item(ADAMANT_2H_SWORD)), + new EmoteClue("Dance at the cat-doored pyramid in Sophanem. Beware of double agents! Equip a ring of life, an uncharged amulet of glory and an adamant two-handed sword.", "Pyramid Of Sophanem", OUTSIDE_THE_GREAT_PYRAMID_OF_SOPHANEM, new WorldPoint(3294, 2781, 0), DOUBLE_AGENT_108, DANCE, item(RING_OF_LIFE), item(AMULET_OF_GLORY), item(ADAMANT_2H_SWORD)), new EmoteClue("Dance in the centre of Canifis. Bow before you talk to me. Equip a green gnome robe top, mithril plate legs and an iron two-handed sword.", "Canifis", CENTRE_OF_CANIFIS, new WorldPoint(3492, 3488, 0), DANCE, BOW, item(GREEN_ROBE_TOP), item(MITHRIL_PLATELEGS), item(IRON_2H_SWORD)), - new EmoteClue("Dance in the King Black Dragon's lair. Beware of double agents! Equip a black dragonhide body, black dragonhide vambraces and a black dragon mask.", "King black dragon's lair", KING_BLACK_DRAGONS_LAIR, new WorldPoint(2271, 4680, 0), DANCE, item(BLACK_DHIDE_BODY), item(BLACK_DHIDE_VAMBRACES), item(BLACK_DRAGON_MASK)), + new EmoteClue("Dance in the King Black Dragon's lair. Beware of double agents! Equip a black dragonhide body, black dragonhide vambraces and a black dragon mask.", "King black dragon's lair", KING_BLACK_DRAGONS_LAIR, new WorldPoint(2271, 4680, 0), DOUBLE_AGENT_141, DANCE, item(BLACK_DHIDE_BODY), item(BLACK_DHIDE_VAMBRACES), item(BLACK_DRAGON_MASK)), new EmoteClue("Dance at the entrance to the Grand Exchange. Equip a pink skirt, pink robe top and a body tiara.", "Grand Exchange", SOUTH_OF_THE_GRAND_EXCHANGE, new WorldPoint(3165, 3467, 0), DANCE, item(PINK_SKIRT), item(PINK_ROBE_TOP), item(BODY_TIARA)), - new EmoteClue("Goblin Salute in the Goblin Village. Beware of double agents! Equip a bandos godsword, a bandos cloak and a bandos platebody.", "Goblin Village", OUTSIDE_MUDKNUCKLES_HUT, new WorldPoint(2956, 3505, 0), GOBLIN_SALUTE, item(BANDOS_PLATEBODY), item(BANDOS_CLOAK), any("Bandos godsword", item(BANDOS_GODSWORD), item(BANDOS_GODSWORD_OR))), + new EmoteClue("Goblin Salute in the Goblin Village. Beware of double agents! Equip a bandos godsword, a bandos cloak and a bandos platebody.", "Goblin Village", OUTSIDE_MUDKNUCKLES_HUT, new WorldPoint(2956, 3505, 0), DOUBLE_AGENT_141, GOBLIN_SALUTE, item(BANDOS_PLATEBODY), item(BANDOS_CLOAK), any("Bandos godsword", item(BANDOS_GODSWORD), item(BANDOS_GODSWORD_OR))), new EmoteClue("Headbang in the mine north of Al Kharid. Equip a desert shirt, leather gloves and leather boots.", "Al Kharid mine", AL_KHARID_SCORPION_MINE, new WorldPoint(3299, 3289, 0), HEADBANG, item(DESERT_SHIRT), item(LEATHER_GLOVES), item(LEATHER_BOOTS)), - new EmoteClue("Headbang at the exam center. Beware of double agents! Equip a mystic fire staff, a diamond bracelet and rune boots.", "Digsite", INSIDE_THE_DIGSITE_EXAM_CENTRE, new WorldPoint(3362, 3340, 0), HEADBANG, item(MYSTIC_FIRE_STAFF), item(DIAMOND_BRACELET), item(RUNE_BOOTS)), + new EmoteClue("Headbang at the exam center. Beware of double agents! Equip a mystic fire staff, a diamond bracelet and rune boots.", "Digsite", INSIDE_THE_DIGSITE_EXAM_CENTRE, new WorldPoint(3362, 3340, 0), DOUBLE_AGENT_108, HEADBANG, item(MYSTIC_FIRE_STAFF), item(DIAMOND_BRACELET), item(RUNE_BOOTS)), new EmoteClue("Headbang at the top of Slayer Tower. Equip a seercull, a combat bracelet and helm of Neitiznot.", "Slayer Tower", OUTSIDE_THE_SLAYER_TOWER_GARGOYLE_ROOM, new WorldPoint(3421, 3537, 2), HEADBANG, item(SEERCULL), range("Combat bracelet", COMBAT_BRACELET4, COMBAT_BRACELET), item(HELM_OF_NEITIZNOT)), new EmoteClue("Dance a jig by the entrance to the Fishing Guild. Equip an emerald ring, a sapphire amulet, and a bronze chain body.", "Fishing Guild", OUTSIDE_THE_FISHING_GUILD, new WorldPoint(2610, 3391, 0), JIG, item(EMERALD_RING), item(SAPPHIRE_AMULET), item(BRONZE_CHAINBODY)), new EmoteClue("Dance a jig under Shantay's Awning. Bow before you talk to me. Equip a pointed blue snail helmet, an air staff and a bronze square shield.", "Shantay Pass", SHANTAY_PASS, new WorldPoint(3304, 3124, 0), JIG, BOW, any("Bruise blue snelm (pointed)", item(BRUISE_BLUE_SNELM_3343)), item(STAFF_OF_AIR), item(BRONZE_SQ_SHIELD)), @@ -127,51 +128,51 @@ public class EmoteClue extends ClueScroll implements TextClueScroll, LocationClu new EmoteClue("Jump for joy in the TzHaar sword shop. Shrug before you talk to me. Equip a Steel longsword, Blue D'hide body and blue mystic gloves.", "Tzhaar weapon store", TZHAAR_WEAPONS_STORE, new WorldPoint(2477, 5146, 0), JUMP_FOR_JOY, SHRUG, item(STEEL_LONGSWORD), item(BLUE_DHIDE_BODY), item(MYSTIC_GLOVES)), new EmoteClue("Jump for joy in the Ancient Cavern. Equip a granite shield, splitbark body and any rune heraldic helm.", "Ancient cavern", ENTRANCE_OF_THE_CAVERN_UNDER_THE_WHIRLPOOL, new WorldPoint(1768, 5366, 1), JUMP_FOR_JOY, item(GRANITE_SHIELD), item(SPLITBARK_BODY), range("Any rune heraldic helm", RUNE_HELM_H1, RUNE_HELM_H5)), new EmoteClue("Jump for joy at the Neitiznot rune rock. Equip Rune boots, a proselyte hauberk and a dragonstone ring.", "Fremennik Isles", NEAR_A_RUNITE_ROCK_IN_THE_FREMENNIK_ISLES, new WorldPoint(2375, 3850, 0), JUMP_FOR_JOY, item(RUNE_BOOTS), item(PROSELYTE_HAUBERK), item(DRAGONSTONE_RING)), - new EmoteClue("Jump for joy in the centre of Zul-Andra. Beware of double agents! Equip a dragon 2h sword, bandos boots and an obsidian cape.", "Zul-Andra", NEAR_THE_PIER_IN_ZULANDRA, new WorldPoint(2199, 3056, 0), JUMP_FOR_JOY, item(DRAGON_2H_SWORD), item(BANDOS_BOOTS), item(OBSIDIAN_CAPE)), + new EmoteClue("Jump for joy in the centre of Zul-Andra. Beware of double agents! Equip a dragon 2h sword, bandos boots and an obsidian cape.", "Zul-Andra", NEAR_THE_PIER_IN_ZULANDRA, new WorldPoint(2199, 3056, 0), DOUBLE_AGENT_141, JUMP_FOR_JOY, item(DRAGON_2H_SWORD), item(BANDOS_BOOTS), item(OBSIDIAN_CAPE)), new EmoteClue("Laugh by the fountain of heroes. Equip splitbark legs, dragon boots and a Rune longsword.", "Fountain of heroes", FOUNTAIN_OF_HEROES, new WorldPoint(2920, 9893, 0), LAUGH, item(SPLITBARK_LEGS), any("Dragon boots", item(DRAGON_BOOTS), item(DRAGON_BOOTS_G)), item(RUNE_LONGSWORD)), - new EmoteClue("Laugh in Jokul's tent in the Mountain Camp. Beware of double agents! Equip a rune full helmet, blue dragonhide chaps and a fire battlestaff.", "Mountain Camp", MOUNTAIN_CAMP_GOAT_ENCLOSURE, new WorldPoint(2812, 3681, 0), LAUGH, item(RUNE_FULL_HELM), item(BLUE_DHIDE_CHAPS), item(FIRE_BATTLESTAFF)), + new EmoteClue("Laugh in Jokul's tent in the Mountain Camp. Beware of double agents! Equip a rune full helmet, blue dragonhide chaps and a fire battlestaff.", "Mountain Camp", MOUNTAIN_CAMP_GOAT_ENCLOSURE, new WorldPoint(2812, 3681, 0), DOUBLE_AGENT_108, LAUGH, item(RUNE_FULL_HELM), item(BLUE_DHIDE_CHAPS), item(FIRE_BATTLESTAFF)), new EmoteClue("Laugh at the crossroads south of the Sinclair Mansion. Equip a cowl, a blue wizard robe top and an iron scimitar.", "Sinclair Mansion", ROAD_JUNCTION_SOUTH_OF_SINCLAIR_MANSION, new WorldPoint(2741, 3536, 0), LAUGH, item(LEATHER_COWL), item(BLUE_WIZARD_ROBE), item(IRON_SCIMITAR)), new EmoteClue("Laugh in front of the gem store in Ardougne market. Equip a Castlewars bracelet, a dragonstone amulet and a ring of forging.", "Ardougne", NEAR_THE_GEM_STALL_IN_ARDOUGNE_MARKET, new WorldPoint(2666, 3304, 0), LAUGH, any("Castle wars bracelet", range(CASTLE_WARS_BRACELET3, CASTLE_WARS_BRACELET1)), item(DRAGONSTONE_AMULET), item(RING_OF_FORGING)), new EmoteClue("Panic in the Limestone Mine. Equip bronze platelegs, a steel pickaxe and a steel medium helmet.", "Limestone Mine", LIMESTONE_MINE, new WorldPoint(3372, 3498, 0), PANIC, item(BRONZE_PLATELEGS), item(STEEL_PICKAXE), item(STEEL_MED_HELM)), new EmoteClue("Panic by the mausoleum in Morytania. Wave before you speak to me. Equip a mithril plate skirt, a maple longbow and no boots.", "Morytania mausoleum, access via the experiments cave", MAUSOLEUM_OFF_THE_MORYTANIA_COAST, new WorldPoint(3504, 3576, 0), PANIC, WAVE, item(MITHRIL_PLATESKIRT), item(MAPLE_LONGBOW), emptySlot("No boots", BOOTS)), - new EmoteClue("Panic on the Wilderness volcano bridge. Beware of double agents! Equip any headband and crozier.", "Wilderness volcano", VOLCANO_IN_THE_NORTHEASTERN_WILDERNESS, new WorldPoint(3368, 3935, 0), PANIC, any("Any headband", range(RED_HEADBAND, BROWN_HEADBAND), range(WHITE_HEADBAND, GREEN_HEADBAND)), any("Any crozier", item(ANCIENT_CROZIER), item(ARMADYL_CROZIER), item(BANDOS_CROZIER), range(SARADOMIN_CROZIER, ZAMORAK_CROZIER))), - new EmoteClue("Panic by the pilot on White Wolf Mountain. Beware of double agents! Equip mithril platelegs, a ring of life and a rune axe.", "White Wolf Mountain", GNOME_GLIDER_ON_WHITE_WOLF_MOUNTAIN, new WorldPoint(2847, 3499, 0), PANIC, item(MITHRIL_PLATELEGS), item(RING_OF_LIFE), item(RUNE_AXE)), - new EmoteClue("Panic by the big egg where no one dare goes and the ground is burnt. Beware of double agents! Equip a dragon med helm, a TokTz-Ket-Xil, a brine sabre, rune platebody and an uncharged amulet of glory.", "Lava dragon isle", SOUTHEAST_CORNER_OF_LAVA_DRAGON_ISLE, new WorldPoint(3227, 3831, 0), PANIC, item(DRAGON_MED_HELM), item(TOKTZKETXIL), item(BRINE_SABRE), item(RUNE_PLATEBODY), item(AMULET_OF_GLORY)), + new EmoteClue("Panic on the Wilderness volcano bridge. Beware of double agents! Equip any headband and crozier.", "Wilderness volcano", VOLCANO_IN_THE_NORTHEASTERN_WILDERNESS, new WorldPoint(3368, 3935, 0), DOUBLE_AGENT_65, PANIC, any("Any headband", range(RED_HEADBAND, BROWN_HEADBAND), range(WHITE_HEADBAND, GREEN_HEADBAND)), any("Any crozier", item(ANCIENT_CROZIER), item(ARMADYL_CROZIER), item(BANDOS_CROZIER), range(SARADOMIN_CROZIER, ZAMORAK_CROZIER))), + new EmoteClue("Panic by the pilot on White Wolf Mountain. Beware of double agents! Equip mithril platelegs, a ring of life and a rune axe.", "White Wolf Mountain", GNOME_GLIDER_ON_WHITE_WOLF_MOUNTAIN, new WorldPoint(2847, 3499, 0), DOUBLE_AGENT_108, PANIC, item(MITHRIL_PLATELEGS), item(RING_OF_LIFE), item(RUNE_AXE)), + new EmoteClue("Panic by the big egg where no one dare goes and the ground is burnt. Beware of double agents! Equip a dragon med helm, a TokTz-Ket-Xil, a brine sabre, rune platebody and an uncharged amulet of glory.", "Lava dragon isle", SOUTHEAST_CORNER_OF_LAVA_DRAGON_ISLE, new WorldPoint(3227, 3831, 0), DOUBLE_AGENT_141, PANIC, item(DRAGON_MED_HELM), item(TOKTZKETXIL), item(BRINE_SABRE), item(RUNE_PLATEBODY), item(AMULET_OF_GLORY)), new EmoteClue("Panic at the area flowers meet snow. Equip Blue D'hide vambraces, a dragon spear and a rune plateskirt.", "Trollweiss mountain", HALFWAY_DOWN_TROLLWEISS_MOUNTAIN, new WorldPoint(2776, 3781, 0), PANIC, item(BLUE_DHIDE_VAMBRACES), item(DRAGON_SPEAR), item(RUNE_PLATESKIRT), item(SLED_4084)), - new EmoteClue("Do a push up at the bank of the Warrior's guild. Beware of double agents! Equip a dragon battleaxe, a dragon defender and a slayer helm of any kind.", "Warriors' guild", WARRIORS_GUILD_BANK_29047, new WorldPoint(2843, 3543, 0), PUSH_UP, item(DRAGON_BATTLEAXE), any("Dragon defender", item(DRAGON_DEFENDER), item(DRAGON_DEFENDER_T)), any("Any slayer helmet", item(SLAYER_HELMET), item(BLACK_SLAYER_HELMET), item(GREEN_SLAYER_HELMET), item(PURPLE_SLAYER_HELMET), item(RED_SLAYER_HELMET), item(TURQUOISE_SLAYER_HELMET), item(SLAYER_HELMET_I), item(BLACK_SLAYER_HELMET_I), item(GREEN_SLAYER_HELMET_I), item(PURPLE_SLAYER_HELMET_I), item(RED_SLAYER_HELMET_I), item(TURQUOISE_SLAYER_HELMET_I), item(HYDRA_SLAYER_HELMET), item(HYDRA_SLAYER_HELMET_I), item(TWISTED_SLAYER_HELMET), item(TWISTED_SLAYER_HELMET_I))), - new EmoteClue("Blow a raspberry in the bank of the Warriors' Guild. Beware of double agents! Equip a dragon battleaxe, a slayer helm of any kind and a dragon defender or avernic defender.", "Warriors' guild", WARRIORS_GUILD_BANK_29047, new WorldPoint(2843, 3543, 0), RASPBERRY, item(DRAGON_BATTLEAXE), any("Dragon defender or Avernic defender", item(DRAGON_DEFENDER), item(DRAGON_DEFENDER_T), item(AVERNIC_DEFENDER)), any("Any slayer helmet", item(SLAYER_HELMET), item(BLACK_SLAYER_HELMET), item(GREEN_SLAYER_HELMET), item(PURPLE_SLAYER_HELMET), item(RED_SLAYER_HELMET), item(TURQUOISE_SLAYER_HELMET), item(SLAYER_HELMET_I), item(BLACK_SLAYER_HELMET_I), item(GREEN_SLAYER_HELMET_I), item(PURPLE_SLAYER_HELMET_I), item(RED_SLAYER_HELMET_I), item(TURQUOISE_SLAYER_HELMET_I), item(HYDRA_SLAYER_HELMET), item(HYDRA_SLAYER_HELMET_I), item(TWISTED_SLAYER_HELMET), item(TWISTED_SLAYER_HELMET_I))), + new EmoteClue("Do a push up at the bank of the Warrior's guild. Beware of double agents! Equip a dragon battleaxe, a dragon defender and a slayer helm of any kind.", "Warriors' guild", WARRIORS_GUILD_BANK_29047, new WorldPoint(2843, 3543, 0), DOUBLE_AGENT_141, PUSH_UP, item(DRAGON_BATTLEAXE), any("Dragon defender", item(DRAGON_DEFENDER), item(DRAGON_DEFENDER_T)), any("Any slayer helmet", item(SLAYER_HELMET), item(BLACK_SLAYER_HELMET), item(GREEN_SLAYER_HELMET), item(PURPLE_SLAYER_HELMET), item(RED_SLAYER_HELMET), item(TURQUOISE_SLAYER_HELMET), item(SLAYER_HELMET_I), item(BLACK_SLAYER_HELMET_I), item(GREEN_SLAYER_HELMET_I), item(PURPLE_SLAYER_HELMET_I), item(RED_SLAYER_HELMET_I), item(TURQUOISE_SLAYER_HELMET_I), item(HYDRA_SLAYER_HELMET), item(HYDRA_SLAYER_HELMET_I), item(TWISTED_SLAYER_HELMET), item(TWISTED_SLAYER_HELMET_I))), + new EmoteClue("Blow a raspberry in the bank of the Warriors' Guild. Beware of double agents! Equip a dragon battleaxe, a slayer helm of any kind and a dragon defender or avernic defender.", "Warriors' guild", WARRIORS_GUILD_BANK_29047, new WorldPoint(2843, 3543, 0), DOUBLE_AGENT_141, RASPBERRY, item(DRAGON_BATTLEAXE), any("Dragon defender or Avernic defender", item(DRAGON_DEFENDER), item(DRAGON_DEFENDER_T), item(AVERNIC_DEFENDER)), any("Any slayer helmet", item(SLAYER_HELMET), item(BLACK_SLAYER_HELMET), item(GREEN_SLAYER_HELMET), item(PURPLE_SLAYER_HELMET), item(RED_SLAYER_HELMET), item(TURQUOISE_SLAYER_HELMET), item(SLAYER_HELMET_I), item(BLACK_SLAYER_HELMET_I), item(GREEN_SLAYER_HELMET_I), item(PURPLE_SLAYER_HELMET_I), item(RED_SLAYER_HELMET_I), item(TURQUOISE_SLAYER_HELMET_I), item(HYDRA_SLAYER_HELMET), item(HYDRA_SLAYER_HELMET_I), item(TWISTED_SLAYER_HELMET), item(TWISTED_SLAYER_HELMET_I))), new EmoteClue("Blow a raspberry at the monkey cage in Ardougne Zoo. Equip a studded leather body, bronze platelegs and a normal staff with no orb.", "Ardougne Zoo", NEAR_THE_PARROTS_IN_ARDOUGNE_ZOO, new WorldPoint(2607, 3282, 0), RASPBERRY, item(STUDDED_BODY), item(BRONZE_PLATELEGS), item(STAFF)), new EmoteClue("Blow raspberries outside the entrance to Keep Le Faye. Equip a coif, an iron platebody and leather gloves.", "Keep Le Faye", OUTSIDE_KEEP_LE_FAYE, new WorldPoint(2757, 3401, 0), RASPBERRY, item(COIF), item(IRON_PLATEBODY), item(LEATHER_GLOVES)), - new EmoteClue("Blow a raspberry in the Fishing Guild bank. Beware of double agents! Equip an elemental shield, blue dragonhide chaps and a rune warhammer.", "Fishing Guild", FISHING_GUILD_BANK, new WorldPoint(2588, 3419, 0), RASPBERRY, item(ELEMENTAL_SHIELD), item(BLUE_DHIDE_CHAPS), item(RUNE_WARHAMMER)), - new EmoteClue("Salute in the banana plantation. Beware of double agents! Equip a diamond ring, amulet of power, and nothing on your chest and legs.", "Karamja", WEST_SIDE_OF_THE_KARAMJA_BANANA_PLANTATION, new WorldPoint(2914, 3168, 0), SALUTE, item(DIAMOND_RING), item(AMULET_OF_POWER), emptySlot("Nothing on chest & legs", BODY, LEGS)), + new EmoteClue("Blow a raspberry in the Fishing Guild bank. Beware of double agents! Equip an elemental shield, blue dragonhide chaps and a rune warhammer.", "Fishing Guild", FISHING_GUILD_BANK, new WorldPoint(2588, 3419, 0), DOUBLE_AGENT_108, RASPBERRY, item(ELEMENTAL_SHIELD), item(BLUE_DHIDE_CHAPS), item(RUNE_WARHAMMER)), + new EmoteClue("Salute in the banana plantation. Beware of double agents! Equip a diamond ring, amulet of power, and nothing on your chest and legs.", "Karamja", WEST_SIDE_OF_THE_KARAMJA_BANANA_PLANTATION, new WorldPoint(2914, 3168, 0), DOUBLE_AGENT_108, SALUTE, item(DIAMOND_RING), item(AMULET_OF_POWER), emptySlot("Nothing on chest & legs", BODY, LEGS)), new EmoteClue("Salute in the Warriors' guild bank. Equip only a black salamander.", "Warriors' guild", WARRIORS_GUILD_BANK, new WorldPoint(2844, 3542, 0), SALUTE, item(BLACK_SALAMANDER), emptySlot("Nothing else", HEAD, CAPE, AMULET, BODY, SHIELD, LEGS, GLOVES, BOOTS, RING, AMMO)), - new EmoteClue("Salute in the centre of the mess hall. Beware of double agents! Equip a rune halberd rune platebody, and an amulet of strength.", "Hosidius mess hall", HOSIDIUS_MESS, new WorldPoint(1646, 3631, 0), SALUTE, item(RUNE_HALBERD), item(RUNE_PLATEBODY), item(AMULET_OF_STRENGTH)), + new EmoteClue("Salute in the centre of the mess hall. Beware of double agents! Equip a rune halberd rune platebody, and an amulet of strength.", "Hosidius mess hall", HOSIDIUS_MESS, new WorldPoint(1646, 3631, 0), DOUBLE_AGENT_108, SALUTE, item(RUNE_HALBERD), item(RUNE_PLATEBODY), item(AMULET_OF_STRENGTH)), new EmoteClue("Shrug in the mine near Rimmington. Equip a gold necklace, a gold ring and a bronze spear.", "Rimmington mine", RIMMINGTON_MINE, new WorldPoint(2976, 3238, 0), SHRUG, item(GOLD_NECKLACE), item(GOLD_RING), item(BRONZE_SPEAR)), new EmoteClue("Shrug in Catherby bank. Yawn before you talk to me. Equip a maple longbow, green d'hide chaps and an iron med helm.", "Catherby", OUTSIDE_CATHERBY_BANK, new WorldPoint(2808, 3440, 0), SHRUG, YAWN, item(MAPLE_LONGBOW), item(GREEN_DHIDE_CHAPS), item(IRON_MED_HELM)), - new EmoteClue("Shrug in the Zamorak temple found in the Eastern Wilderness. Beware of double agents! Equip rune platelegs, an iron platebody and blue dragonhide vambraces.", "Chaos temple", CHAOS_TEMPLE_IN_THE_SOUTHEASTERN_WILDERNESS, new WorldPoint(3239, 3611, 0), SHRUG, item(RUNE_PLATELEGS), item(IRON_PLATEBODY), item(BLUE_DHIDE_VAMBRACES)), + new EmoteClue("Shrug in the Zamorak temple found in the Eastern Wilderness. Beware of double agents! Equip rune platelegs, an iron platebody and blue dragonhide vambraces.", "Chaos temple", CHAOS_TEMPLE_IN_THE_SOUTHEASTERN_WILDERNESS, new WorldPoint(3239, 3611, 0), DOUBLE_AGENT_65, SHRUG, item(RUNE_PLATELEGS), item(IRON_PLATEBODY), item(BLUE_DHIDE_VAMBRACES)), new EmoteClue("Shrug in the Shayzien command tent. Equip a blue mystic robe bottom, a rune kiteshield and any bob shirt.", "Shayzien command tent", SHAYZIEN_WAR_TENT, new WorldPoint(1555, 3537, 0), SHRUG, item(MYSTIC_ROBE_BOTTOM), item(RUNE_KITESHIELD), range("Any bob shirt", BOBS_RED_SHIRT, BOBS_PURPLE_SHIRT)), - new EmoteClue("Slap your head in the centre of the Kourend catacombs. Beware of double agents! Equip the arclight and the amulet of the damned.", "Kourend catacombs", CENTRE_OF_THE_CATACOMBS_OF_KOUREND, new WorldPoint(1663, 10045, 0), SLAP_HEAD, item(ARCLIGHT), any("Amulet of the damned", item(AMULET_OF_THE_DAMNED), item(AMULET_OF_THE_DAMNED_FULL))), + new EmoteClue("Slap your head in the centre of the Kourend catacombs. Beware of double agents! Equip the arclight and the amulet of the damned.", "Kourend catacombs", CENTRE_OF_THE_CATACOMBS_OF_KOUREND, new WorldPoint(1663, 10045, 0), DOUBLE_AGENT_141, SLAP_HEAD, item(ARCLIGHT), any("Amulet of the damned", item(AMULET_OF_THE_DAMNED), item(AMULET_OF_THE_DAMNED_FULL))), new EmoteClue("Spin at the crossroads north of Rimmington. Equip a green gnome hat, cream gnome top and leather chaps.", "Rimmington", ROAD_JUNCTION_NORTH_OF_RIMMINGTON, new WorldPoint(2981, 3276, 0), SPIN, item(GREEN_HAT), item(CREAM_ROBE_TOP), item(LEATHER_CHAPS)), new EmoteClue("Spin in Draynor Manor by the fountain. Equip an iron platebody, studded leather chaps and a bronze full helmet.", "Draynor Manor", DRAYNOR_MANOR_BY_THE_FOUNTAIN, new WorldPoint(3088, 3336, 0), SPIN, item(IRON_PLATEBODY), item(STUDDED_CHAPS), item(BRONZE_FULL_HELM)), - new EmoteClue("Spin in front of the Soul altar. Beware of double agents! Equip a dragon pickaxe, helm of neitiznot and a pair of rune boots.", "Soul altar", SOUL_ALTAR, new WorldPoint(1815, 3856, 0), SPIN, any("Dragon or Crystal pickaxe", item(DRAGON_PICKAXE), item(DRAGON_PICKAXE_12797), item(INFERNAL_PICKAXE), item(INFERNAL_PICKAXE_UNCHARGED), item(DRAGON_PICKAXEOR), item(CRYSTAL_PICKAXE), item(CRYSTAL_PICKAXE_INACTIVE)), item(HELM_OF_NEITIZNOT), item(RUNE_BOOTS)), + new EmoteClue("Spin in front of the Soul altar. Beware of double agents! Equip a dragon pickaxe, helm of neitiznot and a pair of rune boots.", "Soul altar", SOUL_ALTAR, new WorldPoint(1815, 3856, 0), DOUBLE_AGENT_141, SPIN, any("Dragon or Crystal pickaxe", item(DRAGON_PICKAXE), item(DRAGON_PICKAXE_12797), item(INFERNAL_PICKAXE), item(INFERNAL_PICKAXE_UNCHARGED), item(DRAGON_PICKAXEOR), item(CRYSTAL_PICKAXE), item(CRYSTAL_PICKAXE_INACTIVE)), item(HELM_OF_NEITIZNOT), item(RUNE_BOOTS)), new EmoteClue("Spin in the Varrock Castle courtyard. Equip a black axe, a coif and a ruby ring.", "Varrock Castle", OUTSIDE_VARROCK_PALACE_COURTYARD, new WorldPoint(3213, 3463, 0), SPIN, item(BLACK_AXE), item(COIF), item(RUBY_RING)), new EmoteClue("Spin in West Ardougne Church. Equip a dragon spear and red dragonhide chaps.", "West Ardougne Church", CHAPEL_IN_WEST_ARDOUGNE, new WorldPoint(2530, 3290, 0), SPIN, item(DRAGON_SPEAR), item(RED_DHIDE_CHAPS)), new EmoteClue("Spin on the bridge by the Barbarian Village. Salute before you talk to me. Equip purple gloves, a steel kiteshield and a mithril full helmet.", "Barbarian Village", EAST_OF_THE_BARBARIAN_VILLAGE_BRIDGE, new WorldPoint(3105, 3420, 0), SPIN, SALUTE, item(PURPLE_GLOVES), item(STEEL_KITESHIELD), item(MITHRIL_FULL_HELM)), - new EmoteClue("Stamp in the Enchanted valley west of the waterfall. Beware of double agents! Equip a dragon axe.", "Enchanted Valley", NORTHWESTERN_CORNER_OF_THE_ENCHANTED_VALLEY, new WorldPoint(3030, 4522, 0), STAMP, item(DRAGON_AXE)), + new EmoteClue("Stamp in the Enchanted valley west of the waterfall. Beware of double agents! Equip a dragon axe.", "Enchanted Valley", NORTHWESTERN_CORNER_OF_THE_ENCHANTED_VALLEY, new WorldPoint(3030, 4522, 0), DOUBLE_AGENT_141, STAMP, item(DRAGON_AXE)), new EmoteClue("Think in middle of the wheat field by the Lumbridge mill. Equip a blue gnome robetop, a turquoise gnome robe bottom and an oak shortbow.", "Lumbridge mill", WHEAT_FIELD_NEAR_THE_LUMBRIDGE_WINDMILL, new WorldPoint(3159, 3298, 0), THINK, item(BLUE_ROBE_TOP), item(TURQUOISE_ROBE_BOTTOMS), item(OAK_SHORTBOW)), new EmoteClue("Think in the centre of the Observatory. Spin before you talk to me. Equip a mithril chain body, green dragonhide chaps and a ruby amulet.", "Observatory", OBSERVATORY, new WorldPoint(2439, 3161, 0), THINK, SPIN, item(MITHRIL_CHAINBODY), item(GREEN_DHIDE_CHAPS), item(RUBY_AMULET)), new EmoteClue("Wave along the south fence of the Lumber Yard. Equip a hard leather body, leather chaps and a bronze axe.", "Lumber Yard", NEAR_THE_SAWMILL_OPERATORS_BOOTH, new WorldPoint(3307, 3491, 0), WAVE, item(HARDLEATHER_BODY), item(LEATHER_CHAPS), item(BRONZE_AXE)), new EmoteClue("Wave in the Falador gem store. Equip a Mithril pickaxe, Black platebody and an Iron Kiteshield.", "Falador", NEAR_HERQUINS_SHOP_IN_FALADOR, new WorldPoint(2945, 3335, 0), WAVE, item(MITHRIL_PICKAXE), item(BLACK_PLATEBODY), item(IRON_KITESHIELD)), new EmoteClue("Wave on Mudskipper Point. Equip a black cape, leather chaps and a steel mace.", "Mudskipper Point", MUDSKIPPER_POINT, new WorldPoint(2989, 3110, 0), WAVE, item(BLACK_CAPE), item(LEATHER_CHAPS), item(STEEL_MACE)), - new EmoteClue("Wave on the northern wall of Castle Drakan. Beware of double agents! Wear a dragon sq shield, splitbark body and any boater.", "Castle Drakan", NORTHERN_WALL_OF_CASTLE_DRAKAN, new WorldPoint(3560, 3385, 0), WAVE, any("Dragon sq shield", item(DRAGON_SQ_SHIELD), item(DRAGON_SQ_SHIELD_G)), item(SPLITBARK_BODY), any("Any boater", item(RED_BOATER), item(ORANGE_BOATER), item(GREEN_BOATER), item(BLUE_BOATER), item(BLACK_BOATER), item(PINK_BOATER), item(PURPLE_BOATER), item(WHITE_BOATER))), - new EmoteClue("Yawn in the 7th room of Pyramid Plunder. Beware of double agents! Equip a pharaoh sceptre and a full set of menaphite robes.", "Pyramid Plunder", _7TH_CHAMBER_OF_JALSAVRAH, new WorldPoint(1944, 4427, 0), YAWN, any("Pharaoh's sceptre", item(PHARAOHS_SCEPTRE), item(PHARAOHS_SCEPTRE_1), item(PHARAOHS_SCEPTRE_2), item(PHARAOHS_SCEPTRE_3), item(PHARAOHS_SCEPTRE_4), item(PHARAOHS_SCEPTRE_5), item(PHARAOHS_SCEPTRE_6), item(PHARAOHS_SCEPTRE_7), item(PHARAOHS_SCEPTRE_8)), any("Full set of menaphite robes", all(item(MENAPHITE_PURPLE_HAT), item(MENAPHITE_PURPLE_TOP), range(MENAPHITE_PURPLE_ROBE, MENAPHITE_PURPLE_KILT)), all(item(MENAPHITE_RED_HAT), item(MENAPHITE_RED_TOP), range(MENAPHITE_RED_ROBE, MENAPHITE_RED_KILT)))), + new EmoteClue("Wave on the northern wall of Castle Drakan. Beware of double agents! Wear a dragon sq shield, splitbark body and any boater.", "Castle Drakan", NORTHERN_WALL_OF_CASTLE_DRAKAN, new WorldPoint(3560, 3385, 0), DOUBLE_AGENT_141, WAVE, any("Dragon sq shield", item(DRAGON_SQ_SHIELD), item(DRAGON_SQ_SHIELD_G)), item(SPLITBARK_BODY), any("Any boater", item(RED_BOATER), item(ORANGE_BOATER), item(GREEN_BOATER), item(BLUE_BOATER), item(BLACK_BOATER), item(PINK_BOATER), item(PURPLE_BOATER), item(WHITE_BOATER))), + new EmoteClue("Yawn in the 7th room of Pyramid Plunder. Beware of double agents! Equip a pharaoh sceptre and a full set of menaphite robes.", "Pyramid Plunder", _7TH_CHAMBER_OF_JALSAVRAH, new WorldPoint(1944, 4427, 0), DOUBLE_AGENT_141, YAWN, any("Pharaoh's sceptre", item(PHARAOHS_SCEPTRE), item(PHARAOHS_SCEPTRE_1), item(PHARAOHS_SCEPTRE_2), item(PHARAOHS_SCEPTRE_3), item(PHARAOHS_SCEPTRE_4), item(PHARAOHS_SCEPTRE_5), item(PHARAOHS_SCEPTRE_6), item(PHARAOHS_SCEPTRE_7), item(PHARAOHS_SCEPTRE_8)), any("Full set of menaphite robes", all(item(MENAPHITE_PURPLE_HAT), item(MENAPHITE_PURPLE_TOP), range(MENAPHITE_PURPLE_ROBE, MENAPHITE_PURPLE_KILT)), all(item(MENAPHITE_RED_HAT), item(MENAPHITE_RED_TOP), range(MENAPHITE_RED_ROBE, MENAPHITE_RED_KILT)))), new EmoteClue("Yawn in the Varrock library. Equip a green gnome robe top, HAM robe bottom and an iron warhammer.", "Varrock Castle", VARROCK_PALACE_LIBRARY, new WorldPoint(3209, 3492, 0), YAWN, item(GREEN_ROBE_TOP), item(HAM_ROBE), item(IRON_WARHAMMER)), new EmoteClue("Yawn in Draynor Marketplace. Equip studded leather chaps, an iron kiteshield and a steel longsword.", "Draynor", DRAYNOR_VILLAGE_MARKET, new WorldPoint(3083, 3253, 0), YAWN, item(STUDDED_CHAPS), item(IRON_KITESHIELD), item(STEEL_LONGSWORD)), new EmoteClue("Yawn in the Castle Wars lobby. Shrug before you talk to me. Equip a ruby amulet, a mithril scimitar and a Wilderness cape.", "Castle Wars", CASTLE_WARS_BANK, new WorldPoint(2440, 3092, 0), YAWN, SHRUG, item(RUBY_AMULET), item(MITHRIL_SCIMITAR), range("Any team cape", TEAM1_CAPE, TEAM50_CAPE)), - new EmoteClue("Yawn in the rogues' general store. Beware of double agents! Equip an adamant square shield, blue dragon vambraces and a rune pickaxe.", "Rogues general store", NOTERAZZOS_SHOP_IN_THE_WILDERNESS, new WorldPoint(3026, 3701, 0), YAWN, item(ADAMANT_SQ_SHIELD), item(BLUE_DHIDE_VAMBRACES), item(RUNE_PICKAXE)), + new EmoteClue("Yawn in the rogues' general store. Beware of double agents! Equip an adamant square shield, blue dragon vambraces and a rune pickaxe.", "Rogues general store", NOTERAZZOS_SHOP_IN_THE_WILDERNESS, new WorldPoint(3026, 3701, 0), DOUBLE_AGENT_65, YAWN, item(ADAMANT_SQ_SHIELD), item(BLUE_DHIDE_VAMBRACES), item(RUNE_PICKAXE)), new EmoteClue("Yawn at the top of Trollheim. Equip a lava battlestaff, black dragonhide vambraces and a mind shield.", "Trollheim Mountain", ON_TOP_OF_TROLLHEIM_MOUNTAIN, new WorldPoint(2887, 3676, 0), YAWN, any("Lava battlestaff", item(LAVA_BATTLESTAFF), item(LAVA_BATTLESTAFF_21198)), item(BLACK_DHIDE_VAMBRACES), item(MIND_SHIELD)), new EmoteClue("Yawn in the centre of Arceuus library. Nod your head before you talk to me. Equip blue dragonhide vambraces, adamant boots and an adamant dagger.", "Arceuus library", ENTRANCE_OF_THE_ARCEUUS_LIBRARY, new WorldPoint(1632, 3807, 0), YAWN, YES, item(BLUE_DHIDE_VAMBRACES), item(ADAMANT_BOOTS), item(ADAMANT_DAGGER)), - new EmoteClue("Swing a bullroarer at the top of the watchtower. Beware of double agents! Equip a dragon plateskirt, climbing boots and a dragon chainbody.", "Yanille watchtower", TOP_FLOOR_OF_THE_YANILLE_WATCHTOWER, new WorldPoint(2932, 4712, 0), BULL_ROARER, any("Dragon plateskirt", item(DRAGON_PLATESKIRT), item(DRAGON_PLATESKIRT_G)), item(CLIMBING_BOOTS), any("Dragon chainbody", item(DRAGON_CHAINBODY_3140), item(DRAGON_CHAINBODY_G)), item(ItemID.BULL_ROARER)), + new EmoteClue("Swing a bullroarer at the top of the watchtower. Beware of double agents! Equip a dragon plateskirt, climbing boots and a dragon chainbody.", "Yanille watchtower", TOP_FLOOR_OF_THE_YANILLE_WATCHTOWER, new WorldPoint(2932, 4712, 0), DOUBLE_AGENT_141, BULL_ROARER, any("Dragon plateskirt", item(DRAGON_PLATESKIRT), item(DRAGON_PLATESKIRT_G)), item(CLIMBING_BOOTS), any("Dragon chainbody", item(DRAGON_CHAINBODY_3140), item(DRAGON_CHAINBODY_G)), item(ItemID.BULL_ROARER)), new EmoteClue("Blow a raspberry at Gypsy Aris in her tent. Equip a gold ring and a gold necklace.", "Varrock", GYPSY_TENT_ENTRANCE, new WorldPoint(3203, 3424, 0), RASPBERRY, item(GOLD_RING), item(GOLD_NECKLACE)), new EmoteClue("Bow to Brugsen Bursen at the Grand Exchange.", "Grand Exchange", null, new WorldPoint(3164, 3477, 0), BOW), new EmoteClue("Cheer at Iffie Nitter. Equip a chef hat and a red cape.", "Varrock", FINE_CLOTHES_ENTRANCE, new WorldPoint(3205, 3416, 0), CHEER, item(CHEFS_HAT), item(RED_CAPE)), @@ -196,6 +197,12 @@ public class EmoteClue extends ClueScroll implements TextClueScroll, LocationClu this(text, locationName, stashUnit, location, firstEmote, null, itemRequirements); } + private EmoteClue(String text, String locationName, STASHUnit stashUnit, WorldPoint location, Enemy enemy, Emote firstEmote, @Nonnull ItemRequirement... itemRequirements) + { + this(text, locationName, stashUnit, location, firstEmote, null, itemRequirements); + setEnemy(enemy); + } + private EmoteClue(String text, String locationName, STASHUnit stashUnit, WorldPoint location, Emote firstEmote, Emote secondEmote, @Nonnull ItemRequirement... itemRequirements) { this.text = text; diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/clues/Enemy.java b/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/clues/Enemy.java new file mode 100644 index 0000000000..6590079639 --- /dev/null +++ b/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/clues/Enemy.java @@ -0,0 +1,54 @@ +/* + * Copyright (c) 2020, Trevor + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.client.plugins.cluescrolls.clues; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +@AllArgsConstructor +@Getter +public enum Enemy +{ + //appears in hard clue emote steps in the wilderness + DOUBLE_AGENT_65("Double Agent level 65"), + //appears in hard clue emote steps not in the wilderness + DOUBLE_AGENT_108("Double Agent level 108"), + //appears for master clue emote steps all areas + DOUBLE_AGENT_141("Double Agent level 141"), + //appears for hard clue coordinate steps in the wilderness + ZAMORAK_WIZARD("Zamorak Wizard"), + //appears for hard clue coordinate steps not in the wilderness + SARADOMIN_WIZARD("Saradomin Wizard"), + //appears for elite clue coordinate steps all areas + ARMADYLIAN_OR_BANDOSIAN_GUARD("Armadylian OR Bandosian Guard"), + //appears for master clue coordinate and hot cold clues when single-way combat + BRASSICAN_MAGE("Brassican Mage"), + //appears for master clue coordinate and hot cold clues when multi-way combat + ANCIENT_WIZARDS("Ancient Wizard Trio"), + //There is a master hot cold step that overlaps the border of multi and single according to the wiki. + BRASSICAN_OR_WIZARDS("Brassican Mage OR Ancient Wizards"); + + private final String text; +} diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/clues/HotColdClue.java b/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/clues/HotColdClue.java index 60e529e54d..dfcd13828d 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/clues/HotColdClue.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/clues/HotColdClue.java @@ -212,6 +212,14 @@ public class HotColdClue extends ClueScroll implements LocationClueScroll, Locat .left("- " + hotColdLocation.getArea()) .leftColor(Color.LIGHT_GRAY) .build()); + + if (digLocations.size() <= 5 && hotColdLocation.getEnemy() != null) + { + panelComponent.getChildren().add(LineComponent.builder() + .left(hotColdLocation.getEnemy().getText()) + .leftColor(Color.YELLOW) + .build()); + } } } } diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/clues/hotcold/HotColdLocation.java b/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/clues/hotcold/HotColdLocation.java index 503bffd69a..6ef9854d19 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/clues/hotcold/HotColdLocation.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/clues/hotcold/HotColdLocation.java @@ -30,6 +30,8 @@ import java.awt.Rectangle; import lombok.AllArgsConstructor; import lombok.Getter; import net.runelite.api.coords.WorldPoint; +import net.runelite.client.plugins.cluescrolls.clues.Enemy; +import static net.runelite.client.plugins.cluescrolls.clues.Enemy.*; import static net.runelite.client.plugins.cluescrolls.clues.hotcold.HotColdArea.ASGARNIA; import static net.runelite.client.plugins.cluescrolls.clues.hotcold.HotColdArea.DESERT; import static net.runelite.client.plugins.cluescrolls.clues.hotcold.HotColdArea.FELDIP_HILLS; @@ -51,145 +53,152 @@ import static net.runelite.client.plugins.cluescrolls.clues.hotcold.HotColdArea. @Getter public enum HotColdLocation { - ASGARNIA_WARRIORS(new WorldPoint(2860, 3562, 0), ASGARNIA, "North of the Warriors' Guild in Burthorpe."), - ASGARNIA_JATIX(new WorldPoint(2915, 3425, 0), ASGARNIA, "East of Jatix's Herblore Shop in Taverley."), - ASGARNIA_BARB(new WorldPoint(3033, 3438, 0), ASGARNIA, "West of Barbarian Village."), - ASGARNIA_MIAZRQA(new WorldPoint(2972, 3486, 0), ASGARNIA, "North of Miazrqa's tower, outside Goblin Village."), - ASGARNIA_COW(new WorldPoint(3031, 3304, 0), ASGARNIA, "In the cow pen north of Sarah's Farming Shop."), - ASGARNIA_PARTY_ROOM(new WorldPoint(3030, 3364, 0), ASGARNIA, "Outside the Falador Party Room."), - ASGARNIA_CRAFT_GUILD(new WorldPoint(2917, 3295, 0), ASGARNIA, "Outside the Crafting Guild cow pen."), - ASGARNIA_RIMMINGTON(new WorldPoint(2976, 3239, 0), ASGARNIA, "In the centre of the Rimmington mine."), - ASGARNIA_MUDSKIPPER(new WorldPoint(2987, 3110, 0), ASGARNIA, "Mudskipper Point, near the starfish in the south-west corner."), - ASGARNIA_TROLL(new WorldPoint(2910, 3616, 0), ASGARNIA, "The Troll arena, where the player fights Dad during the Troll Stronghold quest. Bring climbing boots if travelling from Burthorpe."), - DESERT_GENIE(new WorldPoint(3359, 2912, 0), DESERT, "West of Nardah genie cave."), - DESERT_ALKHARID_MINE(new WorldPoint(3282, 3270, 0), DESERT, "West of Al Kharid mine."), - DESERT_MENAPHOS_GATE(new WorldPoint(3223, 2820, 0), DESERT, "North of Menaphos gate."), - DESERT_BEDABIN_CAMP(new WorldPoint(3164, 3050, 0), DESERT, "Bedabin Camp, dig around the north tent."), - DESERT_UZER(new WorldPoint(3431, 3106, 0), DESERT, "West of Uzer."), - DESERT_POLLNIVNEACH(new WorldPoint(3287, 2975, 0), DESERT, "West of Pollnivneach."), - DESERT_MTA(new WorldPoint(3347, 3295, 0), DESERT, "Next to Mage Training Arena."), - DESERT_SHANTY(new WorldPoint(3292, 3107, 0), DESERT, "South-west of Shantay Pass."), - DRAYNOR_MANOR_MUSHROOMS(true, new WorldPoint(3096, 3379, 0), MISTHALIN, "Patch of mushrooms just northwest of Draynor Manor"), - DRAYNOR_WHEAT_FIELD(true, new WorldPoint(3120, 3282, 0), MISTHALIN, "Inside the wheat field next to Draynor Village"), - FELDIP_HILLS_JIGGIG(new WorldPoint(2409, 3053, 0), FELDIP_HILLS, "West of Jiggig, east of the fairy ring bkp."), - FELDIP_HILLS_SW(new WorldPoint(2586, 2897, 0), FELDIP_HILLS, "West of the southeasternmost lake in Feldip Hills."), - FELDIP_HILLS_GNOME_GLITER(new WorldPoint(2555, 2972, 0), FELDIP_HILLS, "East of the gnome glider (Lemantolly Undri)."), - FELDIP_HILLS_RANTZ(new WorldPoint(2611, 2950, 0), FELDIP_HILLS, "South of Rantz, west of the empty glass bottles."), - FELDIP_HILLS_SOUTH(new WorldPoint(2486, 3007, 0), FELDIP_HILLS, "South of Jiggig."), - FELDIP_HILLS_RED_CHIN(new WorldPoint(2530, 2901, 0), FELDIP_HILLS, "Outside the red chinchompa hunting ground entrance, south of the Hunting expert's hut."), - FELDIP_HILLS_SE(new WorldPoint(2569, 2918, 0), FELDIP_HILLS, "South-east of the ∩-shaped lake, near the icon."), - FELDIP_HILLS_CW_BALLOON(new WorldPoint(2452, 3108, 0), FELDIP_HILLS, "Directly west of the Castle Wars balloon."), - FREMENNIK_PROVINCE_MTN_CAMP(new WorldPoint(2800, 3669, 0), FREMENNIK_PROVINCE, "At the Mountain Camp."), - FREMENNIK_PROVINCE_RELLEKKA_HUNTER(new WorldPoint(2720, 3784, 0), FREMENNIK_PROVINCE, "At the Rellekka Hunter area, near the icon."), - FREMENNIK_PROVINCE_KELGADRIM_ENTRANCE(new WorldPoint(2715, 3689, 0), FREMENNIK_PROVINCE, "West of the Keldagrim entrance mine."), - FREMENNIK_PROVINCE_SW(new WorldPoint(2605, 3648, 0), FREMENNIK_PROVINCE, "Outside the fence in the south-western corner of Rellekka."), - FREMENNIK_PROVINCE_LIGHTHOUSE(new WorldPoint(2585, 3601, 0), FREMENNIK_PROVINCE, "South-east of the Lighthouse."), - FREMENNIK_PROVINCE_ETCETERIA_CASTLE(new WorldPoint(2617, 3862, 0), FREMENNIK_PROVINCE, "South-east of Etceteria's castle."), - FREMENNIK_PROVINCE_MISC_COURTYARD(new WorldPoint(2527, 3868, 0), FREMENNIK_PROVINCE, "Outside Miscellania's courtyard."), - FREMENNIK_PROVINCE_FREMMY_ISLES_MINE(new WorldPoint(2374, 3850, 0), FREMENNIK_PROVINCE, "Central Fremennik Isles mine."), - FREMENNIK_PROVINCE_WEST_ISLES_MINE(new WorldPoint(2313, 3850, 0), FREMENNIK_PROVINCE, "West Fremennik Isles mine."), - FREMENNIK_PROVINCE_WEST_JATIZSO_ENTRANCE(new WorldPoint(2393, 3812, 0), FREMENNIK_PROVINCE, "West of the Jatizso mine entrance."), - FREMENNIK_PROVINCE_PIRATES_COVE(new WorldPoint(2210, 3814, 0), FREMENNIK_PROVINCE, "Pirates' Cove"), - FREMENNIK_PROVINCE_ASTRAL_ALTER(new WorldPoint(2149, 3865, 0), FREMENNIK_PROVINCE, "Astral altar"), - FREMENNIK_PROVINCE_LUNAR_VILLAGE(new WorldPoint(2084, 3916, 0), FREMENNIK_PROVINCE, "Lunar Isle, inside the village."), - FREMENNIK_PROVINCE_LUNAR_NORTH(new WorldPoint(2106, 3949, 0), FREMENNIK_PROVINCE, "Lunar Isle, north of the village."), - ICE_MOUNTAIN(true, new WorldPoint(3007, 3475, 0), MISTHALIN, "Atop Ice Mountain"), - KANDARIN_SINCLAR_MANSION(new WorldPoint(2730, 3588, 0), KANDARIN, "North-west of the Sinclair Mansion, near the log balance shortcut."), - KANDARIN_CATHERBY(new WorldPoint(2774, 3436, 0), KANDARIN, "Catherby, between the bank and the beehives, near small rock formation."), - KANDARIN_GRAND_TREE(new WorldPoint(2448, 3503, 0), KANDARIN, "Grand Tree, just east of the terrorchick gnome enclosure."), - KANDARIN_SEERS(new WorldPoint(2735, 3486, 0), KANDARIN, "Between the Seers' Village bank and Camelot."), - KANDARIN_MCGRUBORS_WOOD(new WorldPoint(2653, 3485, 0), KANDARIN, "McGrubor's Wood"), - KANDARIN_FISHING_BUILD(new WorldPoint(2590, 3369, 0), KANDARIN, "South of Fishing Guild"), - KANDARIN_WITCHHAVEN(new WorldPoint(2707, 3306, 0), KANDARIN, "Outside Witchaven, west of Jeb, Holgart, and Caroline."), - KANDARIN_NECRO_TOWER(new WorldPoint(2667, 3241, 0), KANDARIN, "Ground floor inside the Necromancer Tower. Easily accessed by using fairy ring code djp."), - KANDARIN_FIGHT_ARENA(new WorldPoint(2587, 3135, 0), KANDARIN, "South of the Fight Arena, north-west of the Nightmare Zone."), - KANDARIN_TREE_GNOME_VILLAGE(new WorldPoint(2530, 3164, 0), KANDARIN, "Tree Gnome Village, near the general store icon."), - KANDARIN_GRAVE_OF_SCORPIUS(new WorldPoint(2467, 3227, 0), KANDARIN, "Grave of Scorpius"), - KANDARIN_KHAZARD_BATTLEFIELD(new WorldPoint(2522, 3252, 0), KANDARIN, "Khazard Battlefield, south of Tracker gnome 2."), - KANDARIN_WEST_ARDY(new WorldPoint(2535, 3322, 0), KANDARIN, "West Ardougne, near the staircase outside the Civic Office."), - KANDARIN_SW_TREE_GNOME_STRONGHOLD(new WorldPoint(2411, 3429, 0), KANDARIN, "South-west Tree Gnome Stronghold"), - KANDARIN_OUTPOST(new WorldPoint(2457, 3362, 0), KANDARIN, "South of the Tree Gnome Stronghold, north-east of the Outpost."), - KANDARIN_BAXTORIAN_FALLS(new WorldPoint(2534, 3479, 0), KANDARIN, "South-east of Almera's house on Baxtorian Falls."), - KANDARIN_BA_AGILITY_COURSE(new WorldPoint(2540, 3548, 0), KANDARIN, "Inside the Barbarian Agility Course. Completion of Alfred Grimhand's Barcrawl is required."), - KARAMJA_MUSA_POINT(new WorldPoint(2913, 3169, 0), KARAMJA, "Musa Point, banana plantation."), - KARAMJA_BRIMHAVEN_FRUIT_TREE(new WorldPoint(2782, 3215, 0), KARAMJA, "Brimhaven, east of the fruit tree patch."), - KARAMJA_WEST_BRIMHAVEN(new WorldPoint(2721, 3169, 0), KARAMJA, "West of Brimhaven."), - KARAMJA_GLIDER(new WorldPoint(2966, 2975, 0), KARAMJA, "West of the gnome glider."), - KARAMJA_KHARAZI_NE(new WorldPoint(2904, 2925, 0), KARAMJA, "North-eastern part of Kharazi Jungle."), - KARAMJA_KHARAZI_SW(new WorldPoint(2783, 2898, 0), KARAMJA, "South-western part of Kharazi Jungle."), - KARAMJA_CRASH_ISLAND(new WorldPoint(2909, 2737, 0), KARAMJA, "Northern part of Crash Island."), - LUMBRIDGE_COW_FIELD(true, new WorldPoint(3174, 3336, 0), MISTHALIN, "Cow field north of Lumbridge"), - MISTHALIN_VARROCK_STONE_CIRCLE(new WorldPoint(3225, 3356, 0), MISTHALIN, "South of the stone circle near Varrock's entrance."), - MISTHALIN_LUMBRIDGE(new WorldPoint(3234, 3169, 0), MISTHALIN, "Just north-west of the Lumbridge Fishing tutor."), - MISTHALIN_LUMBRIDGE_2(new WorldPoint(3169, 3279, 0), MISTHALIN, "North of the pond between Lumbridge and Draynor Village."), - MISTHALIN_GERTUDES(new WorldPoint(3154, 3421, 0), MISTHALIN, "North-east of Gertrude's house west of Varrock."), - MISTHALIN_DRAYNOR_BANK(new WorldPoint(3098, 3234, 0), MISTHALIN, "South of Draynor Village bank."), - MISTHALIN_LUMBER_YARD(new WorldPoint(3303, 3483, 0), MISTHALIN, "South of Lumber Yard, east of Assistant Serf."), - MORYTANIA_BURGH_DE_ROTT(new WorldPoint(3545, 3253, 0), MORYTANIA, "In the north-east area of Burgh de Rott, by the reverse-L-shaped ruins."), - MORYTANIA_PORT_PHASMATYS(new WorldPoint(3611, 3485, 0), MORYTANIA, "West of Port Phasmatys, south-east of fairy ring."), - MORYTANIA_HOLLOWS(new WorldPoint(3499, 3421, 0), MORYTANIA, "Inside The Hollows, south of the bridge which was repaired in a quest."), - MORYTANIA_SWAMP(new WorldPoint(3418, 3372, 0), MORYTANIA, "Inside the Mort Myre Swamp, north-west of the Nature Grotto."), - MORYTANIA_HAUNTED_MINE(new WorldPoint(3444, 3255, 0), MORYTANIA, "At Haunted Mine quest start."), - MORYTANIA_MAUSOLEUM(new WorldPoint(3499, 3539, 0), MORYTANIA, "South of the Mausoleum."), - MORYTANIA_MOS_LES_HARMLESS(new WorldPoint(3740, 3041, 0), MORYTANIA, "Northern area of Mos Le'Harmless, between the lakes."), - MORYTANIA_MOS_LES_HARMLESS_BAR(new WorldPoint(3670, 2974, 0), MORYTANIA, "Near Mos Le'Harmless southern bar."), - MORYTANIA_DRAGONTOOTH_NORTH(new WorldPoint(3811, 3569, 0), MORYTANIA, "Northern part of Dragontooth Island."), - MORYTANIA_DRAGONTOOTH_SOUTH(new WorldPoint(3803, 3532, 0), MORYTANIA, "Southern part of Dragontooth Island."), - MORYTANIA_SLEPE_TENTS(new WorldPoint(3769, 3383, 0), MORYTANIA, "North-east of Slepe, near the tents."), - NORTHEAST_OF_AL_KHARID_MINE(true, new WorldPoint(3332, 3313, 0), MISTHALIN, "Northeast of Al Kharid Mine"), - WESTERN_PROVINCE_EAGLES_PEAK(new WorldPoint(2297, 3529, 0), WESTERN_PROVINCE, "North-west of Eagles' Peak."), - WESTERN_PROVINCE_PISCATORIS(new WorldPoint(2334, 3685, 0), WESTERN_PROVINCE, "Piscatoris Fishing Colony"), - WESTERN_PROVINCE_PISCATORIS_HUNTER_AREA(new WorldPoint(2359, 3564, 0), WESTERN_PROVINCE, "Eastern part of Piscatoris Hunter area, south-west of the Falconry."), - WESTERN_PROVINCE_ARANDAR(new WorldPoint(2370, 3319, 0), WESTERN_PROVINCE, "South-west of the crystal gate to Arandar."), - WESTERN_PROVINCE_ELF_CAMP_EAST(new WorldPoint(2268, 3242, 0), WESTERN_PROVINCE, "East of Iorwerth Camp."), - WESTERN_PROVINCE_ELF_CAMP_NW(new WorldPoint(2174, 3280, 0), WESTERN_PROVINCE, "North-west of Iorwerth Camp."), - WESTERN_PROVINCE_LLETYA(new WorldPoint(2337, 3166, 0), WESTERN_PROVINCE, "In Lletya."), - WESTERN_PROVINCE_TYRAS(new WorldPoint(2206, 3158, 0), WESTERN_PROVINCE, "Near Tyras Camp."), - WESTERN_PROVINCE_ZULANDRA(new WorldPoint(2196, 3057, 0), WESTERN_PROVINCE, "The northern house at Zul-Andra."), - WILDERNESS_5(new WorldPoint(3173, 3556, 0), WILDERNESS, "North of the Grand Exchange, level 5 Wilderness."), - WILDERNESS_12(new WorldPoint(3036, 3612, 0), WILDERNESS, "South-east of the Dark Warriors' Fortress, level 12 Wilderness."), - WILDERNESS_20(new WorldPoint(3222, 3679, 0), WILDERNESS, "East of the Corporeal Beast's lair, level 20 Wilderness."), - WILDERNESS_27(new WorldPoint(3174, 3736, 0), WILDERNESS, "Inside the Ruins north of the Graveyard of Shadows, level 27 Wilderness."), - WILDERNESS_28(new WorldPoint(3377, 3737, 0), WILDERNESS, "East of Venenatis' nest, level 28 Wilderness."), - WILDERNESS_32(new WorldPoint(3311, 3773, 0), WILDERNESS, "North of Venenatis' nest, level 32 Wilderness."), - WILDERNESS_35(new WorldPoint(3153, 3795, 0), WILDERNESS, "East of the Wilderness canoe exit, level 35 Wilderness."), - WILDERNESS_37(new WorldPoint(2974, 3814, 0), WILDERNESS, "South-east of the Chaos Temple, level 37 Wilderness."), - WILDERNESS_38(new WorldPoint(3293, 3813, 0), WILDERNESS, "South of Callisto, level 38 Wilderness."), - WILDERNESS_49(new WorldPoint(3140, 3910, 0), WILDERNESS, "South-west of the Deserted Keep, level 49 Wilderness."), - WILDERNESS_54(new WorldPoint(2981, 3944, 0), WILDERNESS, "West of the Wilderness Agility Course, level 54 Wilderness."), - ZEAH_BLASTMINE_BANK(new WorldPoint(1507, 3856, 0), ZEAH, "Next to the bank in the Lovakengj blast mine."), - ZEAH_BLASTMINE_NORTH(new WorldPoint(1488, 3881, 0), ZEAH, "Northern part of the Lovakengj blast mine."), - ZEAH_LOVAKITE_FURNACE(new WorldPoint(1507, 3819, 0), ZEAH, "Next to the lovakite furnace in Lovakengj."), - ZEAH_LOVAKENGJ_MINE(new WorldPoint(1477, 3778, 0), ZEAH, "Next to mithril rock in the Lovakengj mine."), - ZEAH_SULPHR_MINE(new WorldPoint(1428, 3869, 0), ZEAH, "Western entrance in the Lovakengj sulphur mine."), - ZEAH_SHAYZIEN_BANK(new WorldPoint(1517, 3603, 0), ZEAH, "South-east of the bank in Shayzien."), - ZEAH_OVERPASS(new WorldPoint(1467, 3714, 0), ZEAH, "Overpass between Lovakengj and Shayzien."), - ZEAH_LIZARDMAN(new WorldPoint(1490, 3698, 0), ZEAH, "Within Lizardman Canyon, east of the ladder. Requires 5% favour with Shayzien."), - ZEAH_COMBAT_RING(new WorldPoint(1559, 3582, 0), ZEAH, "Shayzien, south-east of the Combat Ring."), - ZEAH_SHAYZIEN_BANK_2(new WorldPoint(1494, 3622, 0), ZEAH, "North-west of the bank in Shayzien."), - ZEAH_LIBRARY(new WorldPoint(1603, 3843, 0), ZEAH, "North-west of the Arceuus Library."), - ZEAH_HOUSECHURCH(new WorldPoint(1682, 3792, 0), ZEAH, "By the entrance to the Arceuus church."), - ZEAH_DARK_ALTAR(new WorldPoint(1699, 3879, 0), ZEAH, "West of the Dark Altar."), - ZEAH_ARCEUUS_HOUSE(new WorldPoint(1710, 3700, 0), ZEAH, "By the southern entrance to Arceuus."), - ZEAH_ESSENCE_MINE(new WorldPoint(1762, 3852, 0), ZEAH, "By the Arceuus essence mine."), - ZEAH_ESSENCE_MINE_NE(new WorldPoint(1773, 3867, 0), ZEAH, "North-east of the Arceuus essence mine."), - ZEAH_PISCARILUS_MINE(new WorldPoint(1768, 3705, 0), ZEAH, "South of the Piscarilius mine."), - ZEAH_GOLDEN_FIELD_TAVERN(new WorldPoint(1718, 3647, 0), ZEAH, "South of The Golden Field tavern in the northern area of Hosidius."), - ZEAH_MESS_HALL(new WorldPoint(1656, 3621, 0), ZEAH, "East of the Mess hall."), - ZEAH_WATSONS_HOUSE(new WorldPoint(1653, 3573, 0), ZEAH, "East of Watson's house."), - ZEAH_VANNAHS_FARM_STORE(new WorldPoint(1806, 3521, 0), ZEAH, "North of Vannah's Farm Store, between the chicken coop and willow trees."), - ZEAH_FARMING_GUILD_W(new WorldPoint(1208, 3736, 0), ZEAH, "West of the Farming Guild."), - ZEAH_DAIRY_COW(new WorldPoint(1324, 3722, 0), ZEAH, "North-east of the Kebos Lowlands, east of the dairy cow."), - ZEAH_CRIMSON_SWIFTS(new WorldPoint(1187, 3580, 0), ZEAH, "South-west of the Kebos Swamp, below the crimson swifts."); + ASGARNIA_WARRIORS(new WorldPoint(2860, 3562, 0), ASGARNIA, "North of the Warriors' Guild in Burthorpe.", BRASSICAN_MAGE), + ASGARNIA_JATIX(new WorldPoint(2915, 3425, 0), ASGARNIA, "East of Jatix's Herblore Shop in Taverley.", BRASSICAN_MAGE), + ASGARNIA_BARB(new WorldPoint(3033, 3438, 0), ASGARNIA, "West of Barbarian Village.", BRASSICAN_MAGE), + ASGARNIA_MIAZRQA(new WorldPoint(2972, 3486, 0), ASGARNIA, "North of Miazrqa's tower, outside Goblin Village.", BRASSICAN_MAGE), + ASGARNIA_COW(new WorldPoint(3031, 3304, 0), ASGARNIA, "In the cow pen north of Sarah's Farming Shop.", ANCIENT_WIZARDS), + ASGARNIA_PARTY_ROOM(new WorldPoint(3030, 3364, 0), ASGARNIA, "Outside the Falador Party Room.", BRASSICAN_MAGE), + ASGARNIA_CRAFT_GUILD(new WorldPoint(2917, 3295, 0), ASGARNIA, "Outside the Crafting Guild cow pen.", BRASSICAN_MAGE), + ASGARNIA_RIMMINGTON(new WorldPoint(2976, 3239, 0), ASGARNIA, "In the centre of the Rimmington mine.", BRASSICAN_MAGE), + ASGARNIA_MUDSKIPPER(new WorldPoint(2987, 3110, 0), ASGARNIA, "Mudskipper Point, near the starfish in the south-west corner.", BRASSICAN_MAGE), + ASGARNIA_TROLL(new WorldPoint(2910, 3616, 0), ASGARNIA, "The Troll arena, where the player fights Dad during the Troll Stronghold quest. Bring climbing boots if travelling from Burthorpe.", BRASSICAN_MAGE), + DESERT_GENIE(new WorldPoint(3359, 2912, 0), DESERT, "West of Nardah genie cave.", BRASSICAN_MAGE), + DESERT_ALKHARID_MINE(new WorldPoint(3282, 3270, 0), DESERT, "West of Al Kharid mine.", BRASSICAN_MAGE), + DESERT_MENAPHOS_GATE(new WorldPoint(3223, 2820, 0), DESERT, "North of Menaphos gate.", BRASSICAN_MAGE), + DESERT_BEDABIN_CAMP(new WorldPoint(3164, 3050, 0), DESERT, "Bedabin Camp, dig around the north tent.", BRASSICAN_MAGE), + DESERT_UZER(new WorldPoint(3431, 3106, 0), DESERT, "West of Uzer.", BRASSICAN_MAGE), + DESERT_POLLNIVNEACH(new WorldPoint(3287, 2975, 0), DESERT, "West of Pollnivneach.", BRASSICAN_MAGE), + DESERT_MTA(new WorldPoint(3347, 3295, 0), DESERT, "Next to Mage Training Arena.", BRASSICAN_MAGE), + DESERT_SHANTY(new WorldPoint(3292, 3107, 0), DESERT, "South-west of Shantay Pass.", BRASSICAN_MAGE), + DRAYNOR_MANOR_MUSHROOMS(new WorldPoint(3096, 3379, 0), MISTHALIN, "Patch of mushrooms just northwest of Draynor Manor"), + DRAYNOR_WHEAT_FIELD(new WorldPoint(3120, 3282, 0), MISTHALIN, "Inside the wheat field next to Draynor Village"), + FELDIP_HILLS_JIGGIG(new WorldPoint(2409, 3053, 0), FELDIP_HILLS, "West of Jiggig, east of the fairy ring bkp.", BRASSICAN_MAGE), + FELDIP_HILLS_SW(new WorldPoint(2586, 2897, 0), FELDIP_HILLS, "West of the southeasternmost lake in Feldip Hills.", BRASSICAN_MAGE), + FELDIP_HILLS_GNOME_GLITER(new WorldPoint(2555, 2972, 0), FELDIP_HILLS, "East of the gnome glider (Lemantolly Undri).", BRASSICAN_MAGE), + FELDIP_HILLS_RANTZ(new WorldPoint(2611, 2950, 0), FELDIP_HILLS, "South of Rantz, west of the empty glass bottles.", BRASSICAN_MAGE), + FELDIP_HILLS_SOUTH(new WorldPoint(2486, 3007, 0), FELDIP_HILLS, "South of Jiggig.", BRASSICAN_MAGE), + FELDIP_HILLS_RED_CHIN(new WorldPoint(2530, 2901, 0), FELDIP_HILLS, "Outside the red chinchompa hunting ground entrance, south of the Hunting expert's hut.", BRASSICAN_MAGE), + FELDIP_HILLS_SE(new WorldPoint(2569, 2918, 0), FELDIP_HILLS, "South-east of the ∩-shaped lake, near the Hunter icon.", BRASSICAN_MAGE), + FELDIP_HILLS_CW_BALLOON(new WorldPoint(2452, 3108, 0), FELDIP_HILLS, "Directly west of the Castle Wars balloon.", BRASSICAN_MAGE), + FREMENNIK_PROVINCE_MTN_CAMP(new WorldPoint(2800, 3669, 0), FREMENNIK_PROVINCE, "At the Mountain Camp.", BRASSICAN_MAGE), + FREMENNIK_PROVINCE_RELLEKKA_HUNTER(new WorldPoint(2720, 3784, 0), FREMENNIK_PROVINCE, "At the Rellekka Hunter area, near the Hunter icon.", BRASSICAN_MAGE), + FREMENNIK_PROVINCE_KELGADRIM_ENTRANCE(new WorldPoint(2715, 3689, 0), FREMENNIK_PROVINCE, "West of the Keldagrim entrance mine.", BRASSICAN_MAGE), + FREMENNIK_PROVINCE_SW(new WorldPoint(2605, 3648, 0), FREMENNIK_PROVINCE, "Outside the fence in the south-western corner of Rellekka.", BRASSICAN_MAGE), + FREMENNIK_PROVINCE_LIGHTHOUSE(new WorldPoint(2585, 3601, 0), FREMENNIK_PROVINCE, "South-east of the Lighthouse.", BRASSICAN_MAGE), + FREMENNIK_PROVINCE_ETCETERIA_CASTLE(new WorldPoint(2617, 3862, 0), FREMENNIK_PROVINCE, "South-east of Etceteria's castle.", BRASSICAN_MAGE), + FREMENNIK_PROVINCE_MISC_COURTYARD(new WorldPoint(2527, 3868, 0), FREMENNIK_PROVINCE, "Outside Miscellania's courtyard.", BRASSICAN_MAGE), + FREMENNIK_PROVINCE_FREMMY_ISLES_MINE(new WorldPoint(2374, 3850, 0), FREMENNIK_PROVINCE, "Central Fremennik Isles mine.", ANCIENT_WIZARDS), + FREMENNIK_PROVINCE_WEST_ISLES_MINE(new WorldPoint(2313, 3850, 0), FREMENNIK_PROVINCE, "West Fremennik Isles mine.", ANCIENT_WIZARDS), + FREMENNIK_PROVINCE_WEST_JATIZSO_ENTRANCE(new WorldPoint(2393, 3812, 0), FREMENNIK_PROVINCE, "West of the Jatizso mine entrance.", BRASSICAN_MAGE), + FREMENNIK_PROVINCE_PIRATES_COVE(new WorldPoint(2210, 3814, 0), FREMENNIK_PROVINCE, "Pirates' Cove", ANCIENT_WIZARDS), + FREMENNIK_PROVINCE_ASTRAL_ALTER(new WorldPoint(2149, 3865, 0), FREMENNIK_PROVINCE, "Astral altar", ANCIENT_WIZARDS), + FREMENNIK_PROVINCE_LUNAR_VILLAGE(new WorldPoint(2084, 3916, 0), FREMENNIK_PROVINCE, "Lunar Isle, inside the village.", ANCIENT_WIZARDS), + FREMENNIK_PROVINCE_LUNAR_NORTH(new WorldPoint(2106, 3949, 0), FREMENNIK_PROVINCE, "Lunar Isle, north of the village.", ANCIENT_WIZARDS), + ICE_MOUNTAIN(new WorldPoint(3007, 3475, 0), MISTHALIN, "Atop Ice Mountain"), + KANDARIN_SINCLAR_MANSION(new WorldPoint(2730, 3588, 0), KANDARIN, "North-west of the Sinclair Mansion, near the log balance shortcut.", BRASSICAN_MAGE), + KANDARIN_CATHERBY(new WorldPoint(2774, 3436, 0), KANDARIN, "Catherby, between the bank and the beehives, near small rock formation.", BRASSICAN_MAGE), + KANDARIN_GRAND_TREE(new WorldPoint(2448, 3503, 0), KANDARIN, "Grand Tree, just east of the terrorchick gnome enclosure.", BRASSICAN_MAGE), + KANDARIN_SEERS(new WorldPoint(2735, 3486, 0), KANDARIN, "Between the Seers' Village bank and Camelot.", BRASSICAN_MAGE), + KANDARIN_MCGRUBORS_WOOD(new WorldPoint(2653, 3485, 0), KANDARIN, "McGrubor's Wood", BRASSICAN_MAGE), + KANDARIN_FISHING_BUILD(new WorldPoint(2590, 3369, 0), KANDARIN, "South of Fishing Guild", BRASSICAN_MAGE), + KANDARIN_WITCHHAVEN(new WorldPoint(2707, 3306, 0), KANDARIN, "Outside Witchaven, west of Jeb, Holgart, and Caroline.", BRASSICAN_MAGE), + KANDARIN_NECRO_TOWER(new WorldPoint(2667, 3241, 0), KANDARIN, "Ground floor inside the Necromancer Tower. Easily accessed by using fairy ring code djp.", ANCIENT_WIZARDS), + KANDARIN_FIGHT_ARENA(new WorldPoint(2587, 3135, 0), KANDARIN, "South of the Fight Arena, north-west of the Nightmare Zone.", BRASSICAN_MAGE), + KANDARIN_TREE_GNOME_VILLAGE(new WorldPoint(2530, 3164, 0), KANDARIN, "Tree Gnome Village, near the general store icon.", BRASSICAN_MAGE), + KANDARIN_GRAVE_OF_SCORPIUS(new WorldPoint(2467, 3227, 0), KANDARIN, "Grave of Scorpius", BRASSICAN_MAGE), + KANDARIN_KHAZARD_BATTLEFIELD(new WorldPoint(2522, 3252, 0), KANDARIN, "Khazard Battlefield, south of Tracker gnome 2.", BRASSICAN_MAGE), + KANDARIN_WEST_ARDY(new WorldPoint(2535, 3322, 0), KANDARIN, "West Ardougne, near the staircase outside the Civic Office.", BRASSICAN_MAGE), + KANDARIN_SW_TREE_GNOME_STRONGHOLD(new WorldPoint(2411, 3429, 0), KANDARIN, "South-west Tree Gnome Stronghold", BRASSICAN_MAGE), + KANDARIN_OUTPOST(new WorldPoint(2457, 3362, 0), KANDARIN, "South of the Tree Gnome Stronghold, north-east of the Outpost.", BRASSICAN_MAGE), + KANDARIN_BAXTORIAN_FALLS(new WorldPoint(2534, 3479, 0), KANDARIN, "South-east of Almera's house on Baxtorian Falls.", BRASSICAN_MAGE), + KANDARIN_BA_AGILITY_COURSE(new WorldPoint(2540, 3548, 0), KANDARIN, "Inside the Barbarian Agility Course. Completion of Alfred Grimhand's Barcrawl is required.", BRASSICAN_MAGE), + KARAMJA_MUSA_POINT(new WorldPoint(2913, 3169, 0), KARAMJA, "Musa Point, banana plantation.", BRASSICAN_MAGE), + KARAMJA_BRIMHAVEN_FRUIT_TREE(new WorldPoint(2782, 3215, 0), KARAMJA, "Brimhaven, east of the fruit tree patch.", BRASSICAN_MAGE), + KARAMJA_WEST_BRIMHAVEN(new WorldPoint(2721, 3169, 0), KARAMJA, "West of Brimhaven.", BRASSICAN_MAGE), + KARAMJA_GLIDER(new WorldPoint(2966, 2975, 0), KARAMJA, "West of the gnome glider.", BRASSICAN_MAGE), + KARAMJA_KHARAZI_NE(new WorldPoint(2904, 2925, 0), KARAMJA, "North-eastern part of Kharazi Jungle.", BRASSICAN_MAGE), + KARAMJA_KHARAZI_SW(new WorldPoint(2783, 2898, 0), KARAMJA, "South-western part of Kharazi Jungle.", BRASSICAN_MAGE), + KARAMJA_CRASH_ISLAND(new WorldPoint(2909, 2737, 0), KARAMJA, "Northern part of Crash Island.", BRASSICAN_MAGE), + LUMBRIDGE_COW_FIELD( new WorldPoint(3174, 3336, 0), MISTHALIN, "Cow field north of Lumbridge"), + MISTHALIN_VARROCK_STONE_CIRCLE(new WorldPoint(3225, 3356, 0), MISTHALIN, "South of the stone circle near Varrock's entrance.", BRASSICAN_MAGE), + MISTHALIN_LUMBRIDGE(new WorldPoint(3234, 3169, 0), MISTHALIN, "Just north-west of the Lumbridge Fishing tutor.", BRASSICAN_MAGE), + MISTHALIN_LUMBRIDGE_2(new WorldPoint(3169, 3279, 0), MISTHALIN, "North of the pond between Lumbridge and Draynor Village.", BRASSICAN_MAGE), + MISTHALIN_GERTUDES(new WorldPoint(3154, 3421, 0), MISTHALIN, "North-east of Gertrude's house west of Varrock.", BRASSICAN_MAGE), + MISTHALIN_DRAYNOR_BANK(new WorldPoint(3098, 3234, 0), MISTHALIN, "South of Draynor Village bank.", BRASSICAN_MAGE), + MISTHALIN_LUMBER_YARD(new WorldPoint(3303, 3483, 0), MISTHALIN, "South of Lumber Yard, east of Assistant Serf.", BRASSICAN_MAGE), + MORYTANIA_BURGH_DE_ROTT(new WorldPoint(3545, 3253, 0), MORYTANIA, "In the north-east area of Burgh de Rott, by the reverse-L-shaped ruins.", BRASSICAN_MAGE), + MORYTANIA_PORT_PHASMATYS(new WorldPoint(3611, 3485, 0), MORYTANIA, "West of Port Phasmatys, south-east of fairy ring.", BRASSICAN_MAGE), + MORYTANIA_HOLLOWS(new WorldPoint(3499, 3421, 0), MORYTANIA, "Inside The Hollows, south of the bridge which was repaired in a quest.", BRASSICAN_MAGE), + MORYTANIA_SWAMP(new WorldPoint(3418, 3372, 0), MORYTANIA, "Inside the Mort Myre Swamp, north-west of the Nature Grotto.", BRASSICAN_MAGE), + MORYTANIA_HAUNTED_MINE(new WorldPoint(3444, 3255, 0), MORYTANIA, "At Haunted Mine quest start.", BRASSICAN_MAGE), + MORYTANIA_MAUSOLEUM(new WorldPoint(3499, 3539, 0), MORYTANIA, "South of the Mausoleum.", BRASSICAN_MAGE), + MORYTANIA_MOS_LES_HARMLESS(new WorldPoint(3740, 3041, 0), MORYTANIA, "Northern area of Mos Le'Harmless, between the lakes.", BRASSICAN_MAGE), + MORYTANIA_MOS_LES_HARMLESS_BAR(new WorldPoint(3670, 2974, 0), MORYTANIA, "Near Mos Le'Harmless southern bar.", BRASSICAN_MAGE), + MORYTANIA_DRAGONTOOTH_NORTH(new WorldPoint(3811, 3569, 0), MORYTANIA, "Northern part of Dragontooth Island.", BRASSICAN_MAGE), + MORYTANIA_DRAGONTOOTH_SOUTH(new WorldPoint(3803, 3532, 0), MORYTANIA, "Southern part of Dragontooth Island.", BRASSICAN_MAGE), + MORYTANIA_SLEPE_TENTS(new WorldPoint(3769, 3383, 0), MORYTANIA, "North-east of Slepe, near the tents.", BRASSICAN_MAGE), + NORTHEAST_OF_AL_KHARID_MINE(new WorldPoint(3332, 3313, 0), MISTHALIN, "Northeast of Al Kharid Mine"), + WESTERN_PROVINCE_EAGLES_PEAK(new WorldPoint(2297, 3529, 0), WESTERN_PROVINCE, "North-west of Eagles' Peak.", BRASSICAN_MAGE), + WESTERN_PROVINCE_PISCATORIS(new WorldPoint(2334, 3685, 0), WESTERN_PROVINCE, "Piscatoris Fishing Colony", ANCIENT_WIZARDS), + WESTERN_PROVINCE_PISCATORIS_HUNTER_AREA(new WorldPoint(2359, 3564, 0), WESTERN_PROVINCE, "Eastern part of Piscatoris Hunter area, south-west of the Falconry.", BRASSICAN_MAGE), + WESTERN_PROVINCE_ARANDAR(new WorldPoint(2370, 3319, 0), WESTERN_PROVINCE, "South-west of the crystal gate to Arandar.", ANCIENT_WIZARDS), + WESTERN_PROVINCE_ELF_CAMP_EAST(new WorldPoint(2268, 3242, 0), WESTERN_PROVINCE, "East of Iorwerth Camp.", BRASSICAN_MAGE), + WESTERN_PROVINCE_ELF_CAMP_NW(new WorldPoint(2174, 3280, 0), WESTERN_PROVINCE, "North-west of Iorwerth Camp.", BRASSICAN_MAGE), + WESTERN_PROVINCE_LLETYA(new WorldPoint(2337, 3166, 0), WESTERN_PROVINCE, "In Lletya.", BRASSICAN_MAGE), + WESTERN_PROVINCE_TYRAS(new WorldPoint(2206, 3158, 0), WESTERN_PROVINCE, "Near Tyras Camp.", BRASSICAN_MAGE), + WESTERN_PROVINCE_ZULANDRA(new WorldPoint(2196, 3057, 0), WESTERN_PROVINCE, "The northern house at Zul-Andra.", BRASSICAN_MAGE), + WILDERNESS_5(new WorldPoint(3173, 3556, 0), WILDERNESS, "North of the Grand Exchange, level 5 Wilderness.", ANCIENT_WIZARDS), + WILDERNESS_12(new WorldPoint(3036, 3612, 0), WILDERNESS, "South-east of the Dark Warriors' Fortress, level 12 Wilderness.", ANCIENT_WIZARDS), + WILDERNESS_20(new WorldPoint(3222, 3679, 0), WILDERNESS, "East of the Corporeal Beast's lair, level 20 Wilderness.", ANCIENT_WIZARDS), + WILDERNESS_27(new WorldPoint(3174, 3736, 0), WILDERNESS, "Inside the Ruins north of the Graveyard of Shadows, level 27 Wilderness.", BRASSICAN_MAGE), + WILDERNESS_28(new WorldPoint(3377, 3737, 0), WILDERNESS, "East of Venenatis' nest, level 28 Wilderness.", BRASSICAN_MAGE), + WILDERNESS_32(new WorldPoint(3311, 3773, 0), WILDERNESS, "North of Venenatis' nest, level 32 Wilderness.", ANCIENT_WIZARDS), + WILDERNESS_35(new WorldPoint(3153, 3795, 0), WILDERNESS, "East of the Wilderness canoe exit, level 35 Wilderness.", BRASSICAN_OR_WIZARDS), + WILDERNESS_37(new WorldPoint(2974, 3814, 0), WILDERNESS, "South-east of the Chaos Temple, level 37 Wilderness.", BRASSICAN_MAGE), + WILDERNESS_38(new WorldPoint(3293, 3813, 0), WILDERNESS, "South of Callisto, level 38 Wilderness.", ANCIENT_WIZARDS), + WILDERNESS_49(new WorldPoint(3140, 3910, 0), WILDERNESS, "South-west of the Deserted Keep, level 49 Wilderness.", BRASSICAN_MAGE), + WILDERNESS_54(new WorldPoint(2981, 3944, 0), WILDERNESS, "West of the Wilderness Agility Course, level 54 Wilderness.", BRASSICAN_MAGE), + ZEAH_BLASTMINE_BANK(new WorldPoint(1507, 3856, 0), ZEAH, "Next to the bank in the Lovakengj blast mine.", BRASSICAN_MAGE), + ZEAH_BLASTMINE_NORTH(new WorldPoint(1488, 3881, 0), ZEAH, "Northern part of the Lovakengj blast mine.", BRASSICAN_MAGE), + ZEAH_LOVAKITE_FURNACE(new WorldPoint(1507, 3819, 0), ZEAH, "Next to the lovakite furnace in Lovakengj.", ANCIENT_WIZARDS), + ZEAH_LOVAKENGJ_MINE(new WorldPoint(1477, 3778, 0), ZEAH, "Next to mithril rock in the Lovakengj mine.", ANCIENT_WIZARDS), + ZEAH_SULPHR_MINE(new WorldPoint(1428, 3869, 0), ZEAH, "Western entrance in the Lovakengj sulphur mine.", BRASSICAN_MAGE), + ZEAH_SHAYZIEN_BANK(new WorldPoint(1517, 3603, 0), ZEAH, "South-east of the bank in Shayzien.", ANCIENT_WIZARDS), + ZEAH_OVERPASS(new WorldPoint(1467, 3714, 0), ZEAH, "Overpass between Lovakengj and Shayzien.", BRASSICAN_MAGE), + ZEAH_LIZARDMAN(new WorldPoint(1490, 3698, 0), ZEAH, "Within Lizardman Canyon, east of the ladder. Requires 5% favour with Shayzien.", ANCIENT_WIZARDS), + ZEAH_COMBAT_RING(new WorldPoint(1559, 3582, 0), ZEAH, "Shayzien, south-east of the Combat Ring.", BRASSICAN_MAGE), + ZEAH_SHAYZIEN_BANK_2(new WorldPoint(1494, 3622, 0), ZEAH, "North-west of the bank in Shayzien.", ANCIENT_WIZARDS), + ZEAH_LIBRARY(new WorldPoint(1603, 3843, 0), ZEAH, "North-west of the Arceuus Library.", BRASSICAN_MAGE), + ZEAH_HOUSECHURCH(new WorldPoint(1682, 3792, 0), ZEAH, "By the entrance to the Arceuus church.", ANCIENT_WIZARDS), + ZEAH_DARK_ALTAR(new WorldPoint(1699, 3879, 0), ZEAH, "West of the Dark Altar.", BRASSICAN_MAGE), + ZEAH_ARCEUUS_HOUSE(new WorldPoint(1710, 3700, 0), ZEAH, "By the southern entrance to Arceuus.", ANCIENT_WIZARDS), + ZEAH_ESSENCE_MINE(new WorldPoint(1762, 3852, 0), ZEAH, "By the Arceuus essence mine.", BRASSICAN_MAGE), + ZEAH_ESSENCE_MINE_NE(new WorldPoint(1773, 3867, 0), ZEAH, "North-east of the Arceuus essence mine.", BRASSICAN_MAGE), + ZEAH_PISCARILUS_MINE(new WorldPoint(1768, 3705, 0), ZEAH, "South of the Piscarilius mine.", ANCIENT_WIZARDS), + ZEAH_GOLDEN_FIELD_TAVERN(new WorldPoint(1718, 3647, 0), ZEAH, "South of The Golden Field tavern in the northern area of Hosidius.", BRASSICAN_MAGE), + ZEAH_MESS_HALL(new WorldPoint(1656, 3621, 0), ZEAH, "East of the Mess hall.", ANCIENT_WIZARDS), + ZEAH_WATSONS_HOUSE(new WorldPoint(1653, 3573, 0), ZEAH, "East of Watson's house.", ANCIENT_WIZARDS), + ZEAH_VANNAHS_FARM_STORE(new WorldPoint(1806, 3521, 0), ZEAH, "North of Vannah's Farm Store, between the chicken coop and willow trees.", BRASSICAN_MAGE), + ZEAH_FARMING_GUILD_W(new WorldPoint(1208, 3736, 0), ZEAH, "West of the Farming Guild.", BRASSICAN_MAGE), + ZEAH_DAIRY_COW(new WorldPoint(1324, 3722, 0), ZEAH, "North-east of the Kebos Lowlands, east of the dairy cow.", BRASSICAN_MAGE), + ZEAH_CRIMSON_SWIFTS(new WorldPoint(1187, 3580, 0), ZEAH, "South-west of the Kebos Swamp, below the crimson swifts.", BRASSICAN_MAGE); private final boolean beginnerClue; private final WorldPoint worldPoint; private final HotColdArea hotColdArea; private final String area; + private final Enemy enemy; + + HotColdLocation(WorldPoint worldPoint, HotColdArea hotColdArea, String areaDescription, Enemy enemy) + { + this(false, worldPoint, hotColdArea, areaDescription, enemy); + } HotColdLocation(WorldPoint worldPoint, HotColdArea hotColdArea, String areaDescription) { - this(false, worldPoint, hotColdArea, areaDescription); + //only master clues have enemies, so if no enemy it is a beginner clue + this(true, worldPoint, hotColdArea, areaDescription, null); } public Rectangle getRect() From e852ba819434cb1075226854473cc14d37d65b53 Mon Sep 17 00:00:00 2001 From: Alexsuperfly Date: Mon, 11 May 2020 14:14:14 -0400 Subject: [PATCH 26/36] loot tracker: use chest events for gauntlet loot --- .../loottracker/LootTrackerPlugin.java | 29 +++++-------------- 1 file changed, 8 insertions(+), 21 deletions(-) diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/loottracker/LootTrackerPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/loottracker/LootTrackerPlugin.java index 94fb5fd1a4..20adc7858d 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/loottracker/LootTrackerPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/loottracker/LootTrackerPlugin.java @@ -136,21 +136,17 @@ public class LootTrackerPlugin extends Plugin private static final String HESPORI_EVENT = "Hespori"; private static final int HESPORI_REGION = 5021; - // Gauntlet loot handling - private static final String GAUNTLET_LOOTED_MESSAGE = "You open the chest."; - private static final String GAUNTLET_EVENT = "The Gauntlet"; - private static final int GAUNTLET_LOBBY_REGION = 12127; - // Chest loot handling private static final String CHEST_LOOTED_MESSAGE = "You find some treasure in the chest!"; private static final Pattern LARRAN_LOOTED_PATTERN = Pattern.compile("You have opened Larran's (big|small) chest .*"); - private static final Map CHEST_EVENT_TYPES = ImmutableMap.of( - 5179, "Brimstone Chest", - 11573, "Crystal Chest", - 12093, "Larran's big chest", - 13113, "Larran's small chest", - 13151, "Elven Crystal Chest" - ); + private static final Map CHEST_EVENT_TYPES = new ImmutableMap.Builder(). + put(5179, "Brimstone Chest"). + put(11573, "Crystal Chest"). + put(12093, "Larran's big chest"). + put(12127, "The Gauntlet"). + put(13113, "Larran's small chest"). + put(13151, "Elven Crystal Chest"). + build(); // Last man standing map regions private static final Set LAST_MAN_STANDING_REGIONS = ImmutableSet.of(13658, 13659, 13914, 13915, 13916); @@ -558,14 +554,6 @@ public class LootTrackerPlugin extends Plugin return; } - if (GAUNTLET_LOBBY_REGION == regionID && message.equals(GAUNTLET_LOOTED_MESSAGE)) - { - eventType = GAUNTLET_EVENT; - lootRecordType = LootRecordType.EVENT; - takeInventorySnapshot(); - return; - } - final Matcher pickpocketMatcher = PICKPOCKET_REGEX.matcher(message); if (pickpocketMatcher.matches()) { @@ -634,7 +622,6 @@ public class LootTrackerPlugin extends Plugin if (CHEST_EVENT_TYPES.containsValue(eventType) || HERBIBOAR_EVENT.equals(eventType) || HESPORI_EVENT.equals(eventType) - || GAUNTLET_EVENT.equals(eventType) || lootRecordType == LootRecordType.PICKPOCKET) { processInventoryLoot(eventType, lootRecordType, event.getItemContainer()); From 1444ddcb677baf74839bea0752896309391ffee3 Mon Sep 17 00:00:00 2001 From: Alexsuperfly Date: Mon, 11 May 2020 14:16:02 -0400 Subject: [PATCH 27/36] screenshot plugin: add gauntlet loot screenshots Co-authored-by: Adam --- .../plugins/screenshot/ScreenshotPlugin.java | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/screenshot/ScreenshotPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/screenshot/ScreenshotPlugin.java index b508bbac3f..04db5a4e22 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/screenshot/ScreenshotPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/screenshot/ScreenshotPlugin.java @@ -33,6 +33,7 @@ import java.awt.Image; import java.awt.image.BufferedImage; import java.lang.reflect.InvocationTargetException; import java.time.LocalDate; +import java.util.Map; import java.util.concurrent.ScheduledExecutorService; import java.util.function.Consumer; import java.util.regex.Matcher; @@ -79,8 +80,8 @@ import net.runelite.client.ui.overlay.OverlayManager; import net.runelite.client.util.HotkeyListener; import net.runelite.client.util.ImageCapture; import net.runelite.client.util.ImageUtil; -import net.runelite.client.util.Text; import net.runelite.client.util.LinkBrowser; +import net.runelite.client.util.Text; @PluginDescriptor( name = "Screenshot", @@ -90,6 +91,8 @@ import net.runelite.client.util.LinkBrowser; @Slf4j public class ScreenshotPlugin extends Plugin { + private static final String CHEST_LOOTED_MESSAGE = "You find some treasure in the chest!"; + private static final Map CHEST_LOOT_EVENTS = ImmutableMap.of(12127, "The Gauntlet"); private static final Pattern NUMBER_PATTERN = Pattern.compile("([0-9]+)"); private static final Pattern LEVEL_UP_PATTERN = Pattern.compile(".*Your ([a-zA-Z]+) (?:level is|are)? now (\\d+)\\."); private static final Pattern BOSSKILL_MESSAGE_PATTERN = Pattern.compile("Your (.+) kill count is: (\\d+)."); @@ -346,6 +349,16 @@ public class ScreenshotPlugin extends Plugin } } + if (chatMessage.equals(CHEST_LOOTED_MESSAGE) && config.screenshotRewards()) + { + final int regionID = client.getLocalPlayer().getWorldLocation().getRegionID(); + String eventName = CHEST_LOOT_EVENTS.get(regionID); + if (eventName != null) + { + takeScreenshot(eventName, "Chest Loot"); + } + } + if (config.screenshotValuableDrop()) { Matcher m = VALUABLE_DROP_PATTERN.matcher(chatMessage); From 40a0525095cdee54d4f3ee96068b2bc052610f3e Mon Sep 17 00:00:00 2001 From: Mitchell Kovacs <33374903+Mitchell-Kovacs@users.noreply.github.com> Date: Mon, 11 May 2020 15:12:28 -0400 Subject: [PATCH 28/36] menu swapper: add enter-corrupted gauntlet swap --- .../menuentryswapper/MenuEntrySwapperConfig.java | 10 ++++++++++ .../menuentryswapper/MenuEntrySwapperPlugin.java | 4 ++++ 2 files changed, 14 insertions(+) diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/menuentryswapper/MenuEntrySwapperConfig.java b/runelite-client/src/main/java/net/runelite/client/plugins/menuentryswapper/MenuEntrySwapperConfig.java index dd775dfc70..f54b99fd6b 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/menuentryswapper/MenuEntrySwapperConfig.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/menuentryswapper/MenuEntrySwapperConfig.java @@ -431,4 +431,14 @@ public interface MenuEntrySwapperConfig extends Config { return true; } + + @ConfigItem( + keyName = "swapGauntlet", + name = "Corrupted Gauntlet", + description = "Swap Enter with Enter-corrupted when entering The Gauntlet" + ) + default boolean swapGauntlet() + { + return false; + } } diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/menuentryswapper/MenuEntrySwapperPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/menuentryswapper/MenuEntrySwapperPlugin.java index a0a4fd1fb3..2b1b6b4289 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/menuentryswapper/MenuEntrySwapperPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/menuentryswapper/MenuEntrySwapperPlugin.java @@ -636,6 +636,10 @@ public class MenuEntrySwapperPlugin extends Plugin { swap("empty", option, target, index); } + else if (config.swapGauntlet() && option.equals("enter") && target.equals("the gauntlet")) + { + swap("enter-corrupted", option, target, index); + } else if (config.swapQuick() && option.equals("enter")) { swap("quick-enter", option, target, index); From 8a4ae01d5c734e52ff854eddc02194588da52935 Mon Sep 17 00:00:00 2001 From: Jesse Serrao Date: Tue, 12 May 2020 18:14:09 +0100 Subject: [PATCH 29/36] itemstats: Add bounty hunter blighted food/pots (#11550) --- .../client/plugins/itemstats/ItemStatChanges.java | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/itemstats/ItemStatChanges.java b/runelite-client/src/main/java/net/runelite/client/plugins/itemstats/ItemStatChanges.java index 94a9987be7..682e2b08cb 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/itemstats/ItemStatChanges.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/itemstats/ItemStatChanges.java @@ -55,8 +55,8 @@ public class ItemStatChanges add(food(-5), POISON_KARAMBWAN); add(food(1), POTATO, ONION, CABBAGE, POT_OF_CREAM, CHOPPED_ONION, ANCHOVIES); add(food(2), TOMATO, CHOPPED_TOMATO, BANANA, SLICED_BANANA, ORANGE, ORANGE_SLICES, ORANGE_CHUNKS, - PINEAPPLE_RING, PINEAPPLE_CHUNKS, SPICY_SAUCE, CHEESE, SPINACH_ROLL, LEMON, LEMON_CHUNKS, LEMON_SLICES, - LIME, LIME_CHUNKS, LIME_SLICES, DWELLBERRIES); + PINEAPPLE_RING, PINEAPPLE_CHUNKS, SPICY_SAUCE, CHEESE, SPINACH_ROLL, LEMON, LEMON_CHUNKS, LEMON_SLICES, + LIME, LIME_CHUNKS, LIME_SLICES, DWELLBERRIES); add(food(3), SHRIMPS, COOKED_MEAT, COOKED_CHICKEN, ROE, CHOCOLATE_BAR); add(food(4), SARDINE, CAKE, _23_CAKE, SLICE_OF_CAKE, CHOCOLATEY_MILK, BAKED_POTATO, EDIBLE_SEAWEED, MOONLIGHT_MEAD); add(food(5), BREAD, HERRING, CHOCOLATE_CAKE, _23_CHOCOLATE_CAKE, CHOCOLATE_SLICE, COOKED_RABBIT, CHILLI_CON_CARNE, @@ -79,13 +79,13 @@ public class ItemStatChanges add(food(15), PREMADE_TTL, TANGLED_TOADS_LEGS, PREMADE_CHOC_BOMB, CHOCOLATE_BOMB, COOKED_JUBBLY); add(food(16), MONKFISH, POTATO_WITH_CHEESE, EGG_POTATO); add(food(17), MYCIL_FISH_4, KRYKET_BAT_4); - add(food(18), COOKED_KARAMBWAN); + add(food(18), COOKED_KARAMBWAN, BLIGHTED_KARAMBWAN); add(food(19), CURRY, UGTHANKI_KEBAB, UGTHANKI_KEBAB_1885); add(food(20), MUSHROOM_POTATO, SHARK, ROQED_FISH_5, MURNG_BAT_5, STUFFED_SNAKE); add(food(21), SEA_TURTLE); - add(food(22), MANTA_RAY, DARK_CRAB, TUNA_POTATO); + add(food(22), MANTA_RAY, BLIGHTED_MANTA_RAY, DARK_CRAB, TUNA_POTATO); add(food(23), KYREN_FISH_6, PSYKK_BAT_6); - add(new Anglerfish(), ANGLERFISH); + add(new Anglerfish(), ANGLERFISH, BLIGHTED_ANGLERFISH); add(food(maxHP -> (int) Math.ceil(maxHP * .06)), STRAWBERRY); add(food(maxHP -> (int) Math.ceil(maxHP * .05)), WATERMELON_SLICE); add(food(perc(.1, 1)), COOKED_SWEETCORN, SWEETCORN_7088 /* Bowl of cooked sweetcorn */); @@ -97,7 +97,7 @@ public class ItemStatChanges // Dorgeshuun Cuisine add(food(2), BAT_SHISH, COATED_FROGS_LEGS, FILLETS, FINGERS, FROGBURGER, FROGSPAWN_GUMBO, GREEN_GLOOP_SOUP, - GRUBS__LA_MODE, MUSHROOMS, ROAST_FROG); + GRUBS__LA_MODE, MUSHROOMS, ROAST_FROG); add(food(3), LOACH); add(range(food(3), food(6)), FROG_SPAWN); add(range(food(6), food(10)), COOKED_SLIMY_EEL); @@ -156,7 +156,8 @@ public class ItemStatChanges add(heal(RUN_ENERGY, 10), ENERGY_POTION1, ENERGY_POTION2, ENERGY_POTION3, ENERGY_POTION4); add(new PrayerPotion(7), PRAYER_POTION1, PRAYER_POTION2, PRAYER_POTION3, PRAYER_POTION4); add(heal(RUN_ENERGY, 20), SUPER_ENERGY1, SUPER_ENERGY2, SUPER_ENERGY3, SUPER_ENERGY4); - add(new SuperRestore(.25, 8), SUPER_RESTORE1, SUPER_RESTORE2, SUPER_RESTORE3, SUPER_RESTORE4); + add(new SuperRestore(.25, 8), SUPER_RESTORE1, SUPER_RESTORE2, SUPER_RESTORE3, SUPER_RESTORE4, + BLIGHTED_SUPER_RESTORE1, BLIGHTED_SUPER_RESTORE2, BLIGHTED_SUPER_RESTORE3, BLIGHTED_SUPER_RESTORE4); add(new SuperRestore(.25, 9), SANFEW_SERUM1, SANFEW_SERUM2, SANFEW_SERUM3, SANFEW_SERUM4); add(heal(RUN_ENERGY, 20), STAMINA_POTION1, STAMINA_POTION2, STAMINA_POTION3, STAMINA_POTION4); From 34158ebc995a3f9629cf58608e26413a5bfde93a Mon Sep 17 00:00:00 2001 From: Kyle Shepherd Date: Tue, 12 May 2020 20:08:13 +0100 Subject: [PATCH 30/36] worldhopper: Change `showSidebar` option name to 'Show world switcher sidebar' (#11537) --- .../runelite/client/plugins/worldhopper/WorldHopperConfig.java | 2 +- .../runelite/client/plugins/worldhopper/WorldHopperPlugin.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/worldhopper/WorldHopperConfig.java b/runelite-client/src/main/java/net/runelite/client/plugins/worldhopper/WorldHopperConfig.java index 7d6bb4c268..a02253a411 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/worldhopper/WorldHopperConfig.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/worldhopper/WorldHopperConfig.java @@ -83,7 +83,7 @@ public interface WorldHopperConfig extends Config @ConfigItem( keyName = "showSidebar", - name = "Show world hopper sidebar", + name = "Show world switcher sidebar", description = "Show sidebar containing all worlds that mimics in-game interface", position = 4 ) diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/worldhopper/WorldHopperPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/worldhopper/WorldHopperPlugin.java index 67d84d227d..905ad32601 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/worldhopper/WorldHopperPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/worldhopper/WorldHopperPlugin.java @@ -94,7 +94,7 @@ import org.apache.commons.lang3.ArrayUtils; @PluginDescriptor( name = "World Hopper", description = "Allows you to quickly hop worlds", - tags = {"ping"} + tags = {"ping", "switcher"} ) @Slf4j public class WorldHopperPlugin extends Plugin From 4243dce1b1b795af0bb697dc8c7da0b2f87f7066 Mon Sep 17 00:00:00 2001 From: Rangvaldr <47463740+rangvaldr@users.noreply.github.com> Date: Tue, 12 May 2020 15:11:03 -0400 Subject: [PATCH 31/36] discord: Update activity message while playing PVP or DMM (#11522) --- .../plugins/discord/DiscordGameEventType.java | 2 ++ .../client/plugins/discord/DiscordPlugin.java | 21 ++++++++++++------- 2 files changed, 15 insertions(+), 8 deletions(-) diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/discord/DiscordGameEventType.java b/runelite-client/src/main/java/net/runelite/client/plugins/discord/DiscordGameEventType.java index 55d19919b7..26401c2bf5 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/discord/DiscordGameEventType.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/discord/DiscordGameEventType.java @@ -43,6 +43,8 @@ enum DiscordGameEventType IN_GAME("In Game", -3), IN_MENU("In Menu", -3), + PLAYING_DEADMAN("Playing Deadman Mode", -3), + PLAYING_PVP("Playing in a PVP world", -3), TRAINING_ATTACK(Skill.ATTACK), TRAINING_DEFENCE(Skill.DEFENCE), TRAINING_STRENGTH(Skill.STRENGTH), diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/discord/DiscordPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/discord/DiscordPlugin.java index 0c17f75a26..017f229dae 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/discord/DiscordPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/discord/DiscordPlugin.java @@ -381,6 +381,19 @@ public class DiscordPlugin extends Plugin return; } + final EnumSet worldType = client.getWorldType(); + + if (worldType.contains(WorldType.DEADMAN)) + { + discordState.triggerEvent(DiscordGameEventType.PLAYING_DEADMAN); + return; + } + else if (WorldType.isPvpWorld(worldType)) + { + discordState.triggerEvent(DiscordGameEventType.PLAYING_PVP); + return; + } + DiscordGameEventType discordGameEventType = DiscordGameEventType.fromRegion(playerRegionID); // NMZ uses the same region ID as KBD. KBD is always on plane 0 and NMZ is always above plane 0 @@ -413,14 +426,6 @@ public class DiscordPlugin extends Plugin return false; } - final EnumSet worldType = client.getWorldType(); - - // Do not show location in PVP activities - if (WorldType.isPvpWorld(worldType)) - { - return false; - } - switch (event.getDiscordAreaType()) { case BOSSES: return config.showBossActivity(); From 01f134795d2b1834d4eb4d720a83ef5be6c75ed6 Mon Sep 17 00:00:00 2001 From: Adam Date: Tue, 12 May 2020 11:45:38 -0400 Subject: [PATCH 32/36] npc indicators: verify compoistion id of tagged npcs This fixes npc tags for dynamic npcs sometimes erronously tagging the wrong npc if the npc index gets reused. This happens regularly when tagging bloat manually a few times, since the Verzik webs are all npcs and there are many of them, thus a high chance of index collision. --- .../npchighlight/NpcIndicatorsPlugin.java | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/npchighlight/NpcIndicatorsPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/npchighlight/NpcIndicatorsPlugin.java index 489f06f458..4f91e2400c 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/npchighlight/NpcIndicatorsPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/npchighlight/NpcIndicatorsPlugin.java @@ -145,9 +145,9 @@ public class NpcIndicatorsPlugin extends Plugin private List highlights = new ArrayList<>(); /** - * NPC ids marked with the Tag option + * NPC ids marked with the Tag option, index -> composition id */ - private final Set npcTags = new HashSet<>(); + private final Map npcTags = new HashMap<>(); /** * Tagged NPCs that spawned this tick, which need to be verified that @@ -294,7 +294,7 @@ public class NpcIndicatorsPlugin extends Plugin } final int id = click.getId(); - final boolean removed = npcTags.remove(id); + final Integer removedId = npcTags.remove(id); final NPC[] cachedNPCs = client.getCachedNPCs(); final NPC npc = cachedNPCs[id]; @@ -303,7 +303,7 @@ public class NpcIndicatorsPlugin extends Plugin return; } - if (removed) + if (removedId != null) { highlightedNpcs.remove(npc); memorizedNpcs.remove(npc.getIndex()); @@ -311,7 +311,7 @@ public class NpcIndicatorsPlugin extends Plugin else { memorizeNpc(npc); - npcTags.add(id); + npcTags.put(id, npc.getId()); highlightedNpcs.add(npc); } @@ -329,7 +329,8 @@ public class NpcIndicatorsPlugin extends Plugin return; } - if (npcTags.contains(npc.getIndex())) + Integer taggedId = npcTags.get(npc.getIndex()); + if (taggedId != null && taggedId == npc.getId()) { memorizeNpc(npc); highlightedNpcs.add(npc); @@ -475,7 +476,8 @@ public class NpcIndicatorsPlugin extends Plugin continue; } - if (npcTags.contains(npc.getIndex())) + Integer taggedId = npcTags.get(npc.getIndex()); + if (taggedId != null && taggedId == npc.getId()) { highlightedNpcs.add(npc); continue; From af93dd242fa59c6bc4ac0bef05681ac18db9de3b Mon Sep 17 00:00:00 2001 From: cscullen Date: Tue, 12 May 2020 19:24:29 -0700 Subject: [PATCH 33/36] loottracker: Add seed pack loot tracking --- .../plugins/loottracker/LootTrackerPlugin.java | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/loottracker/LootTrackerPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/loottracker/LootTrackerPlugin.java index 20adc7858d..b5b8070b0c 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/loottracker/LootTrackerPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/loottracker/LootTrackerPlugin.java @@ -66,6 +66,7 @@ import net.runelite.api.GameState; import net.runelite.api.InventoryID; import net.runelite.api.ItemComposition; import net.runelite.api.ItemContainer; +import net.runelite.api.ItemID; import net.runelite.api.MessageNode; import net.runelite.api.NPC; import net.runelite.api.Player; @@ -131,6 +132,9 @@ public class LootTrackerPlugin extends Plugin private static final String HERBIBOAR_EVENT = "Herbiboar"; private static final Pattern HERBIBOAR_HERB_SACK_PATTERN = Pattern.compile(".+(Grimy .+?) herb.+"); + // Seed Pack loot handling + private static final String SEEDPACK_EVENT = "Seed pack"; + // Hespori loot handling private static final String HESPORI_LOOTED_MESSAGE = "You have successfully cleared this patch for new crops."; private static final String HESPORI_EVENT = "Hespori"; @@ -622,6 +626,7 @@ public class LootTrackerPlugin extends Plugin if (CHEST_EVENT_TYPES.containsValue(eventType) || HERBIBOAR_EVENT.equals(eventType) || HESPORI_EVENT.equals(eventType) + || SEEDPACK_EVENT.equals(eventType) || lootRecordType == LootRecordType.PICKPOCKET) { processInventoryLoot(eventType, lootRecordType, event.getItemContainer()); @@ -639,6 +644,13 @@ public class LootTrackerPlugin extends Plugin { lastPickpocketTarget = Text.removeTags(event.getMenuTarget()); } + + if (event.getMenuOption().equals("Take") && event.getId() == ItemID.SEED_PACK) + { + eventType = SEEDPACK_EVENT; + lootRecordType = LootRecordType.EVENT; + takeInventorySnapshot(); + } } @Schedule( From 3f48614ddc47886b2b596cec19459c40ec20f754 Mon Sep 17 00:00:00 2001 From: Rachel M Date: Tue, 12 May 2020 19:14:36 -0700 Subject: [PATCH 34/36] screenshot: Add option to take screenshot on clan chat kick --- .../plugins/screenshot/ScreenshotConfig.java | 13 +++++++- .../plugins/screenshot/ScreenshotPlugin.java | 33 ++++++++++++++++++- 2 files changed, 44 insertions(+), 2 deletions(-) diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/screenshot/ScreenshotConfig.java b/runelite-client/src/main/java/net/runelite/client/plugins/screenshot/ScreenshotConfig.java index 314af4ab07..e0a32b2e0a 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/screenshot/ScreenshotConfig.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/screenshot/ScreenshotConfig.java @@ -198,11 +198,22 @@ public interface ScreenshotConfig extends Config return false; } + @ConfigItem( + keyName = "ccKick", + name = "Screenshot Kicks from CC", + description = "Take a screenshot when you kick a user from a clan chat.", + position = 15 + ) + default boolean screenshotCcKick() + { + return false; + } + @ConfigItem( keyName = "hotkey", name = "Screenshot hotkey", description = "When you press this key a screenshot will be taken", - position = 15 + position = 16 ) default Keybind hotkey() { diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/screenshot/ScreenshotPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/screenshot/ScreenshotPlugin.java index 04db5a4e22..7d402bcafc 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/screenshot/ScreenshotPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/screenshot/ScreenshotPlugin.java @@ -63,6 +63,7 @@ import static net.runelite.api.widgets.WidgetID.LEVEL_UP_GROUP_ID; import static net.runelite.api.widgets.WidgetID.QUEST_COMPLETED_GROUP_ID; import static net.runelite.api.widgets.WidgetID.THEATRE_OF_BLOOD_REWARD_GROUP_ID; import net.runelite.api.widgets.WidgetInfo; +import net.runelite.api.events.ScriptCallbackEvent; import net.runelite.client.Notifier; import static net.runelite.client.RuneLite.SCREENSHOT_DIR; import net.runelite.client.config.ConfigManager; @@ -157,6 +158,8 @@ public class ScreenshotPlugin extends Plugin private NavigationButton titleBarButton; + private String kickPlayerName; + private final HotkeyListener hotkeyListener = new HotkeyListener(() -> config.hotkey()) { @Override @@ -206,6 +209,7 @@ public class ScreenshotPlugin extends Plugin overlayManager.remove(screenshotOverlay); clientToolbar.removeNavigation(titleBarButton); keyManager.unregisterKeyListener(hotkeyListener); + kickPlayerName = null; } @Subscribe @@ -270,10 +274,26 @@ public class ScreenshotPlugin extends Plugin } } + @Subscribe + public void onScriptCallbackEvent(ScriptCallbackEvent e) + { + if (!"confirmClanKick".equals(e.getEventName())) + { + return; + } + + final String[] stringStack = client.getStringStack(); + final int stringSize = client.getStringStackSize(); + kickPlayerName = stringStack[stringSize - 1]; + } + @Subscribe public void onChatMessage(ChatMessage event) { - if (event.getType() != ChatMessageType.GAMEMESSAGE && event.getType() != ChatMessageType.SPAM && event.getType() != ChatMessageType.TRADE) + if (event.getType() != ChatMessageType.GAMEMESSAGE + && event.getType() != ChatMessageType.SPAM + && event.getType() != ChatMessageType.TRADE + && event.getType() != ChatMessageType.FRIENDSCHATNOTIFICATION) { return; } @@ -331,6 +351,17 @@ public class ScreenshotPlugin extends Plugin } } + if (config.screenshotCcKick() && chatMessage.equals("Your request to kick/ban this user was successful.")) + { + if (kickPlayerName == null) + { + return; + } + + takeScreenshot("Kick " + kickPlayerName, "Clan Chat Kicks"); + kickPlayerName = null; + } + if (config.screenshotPet() && PET_MESSAGES.stream().anyMatch(chatMessage::contains)) { String fileName = "Pet"; From 7784395255a41c350a3088796b996ecf4d56a89a Mon Sep 17 00:00:00 2001 From: loldudester Date: Sun, 26 Jan 2020 22:13:31 +0000 Subject: [PATCH 35/36] client: Make toggle sidebar hotkey configurable --- .../net/runelite/client/config/RuneLiteConfig.java | 13 +++++++++++++ .../main/java/net/runelite/client/ui/ClientUI.java | 6 +----- 2 files changed, 14 insertions(+), 5 deletions(-) diff --git a/runelite-client/src/main/java/net/runelite/client/config/RuneLiteConfig.java b/runelite-client/src/main/java/net/runelite/client/config/RuneLiteConfig.java index 11a8b3deb7..f90ecf43b1 100644 --- a/runelite-client/src/main/java/net/runelite/client/config/RuneLiteConfig.java +++ b/runelite-client/src/main/java/net/runelite/client/config/RuneLiteConfig.java @@ -25,6 +25,8 @@ package net.runelite.client.config; import java.awt.Dimension; +import java.awt.event.InputEvent; +import java.awt.event.KeyEvent; import net.runelite.api.Constants; import net.runelite.client.Notifier; import net.runelite.client.ui.ContainableFrame; @@ -299,4 +301,15 @@ public interface RuneLiteConfig extends Config { return true; } + + @ConfigItem( + keyName = "sidebarToggleKey", + name = "Sidebar Toggle Key", + description = "The key that will toggle the sidebar (accepts modifiers)", + position = 44 + ) + default Keybind sidebarToggleKey() + { + return new Keybind(KeyEvent.VK_F11, InputEvent.CTRL_DOWN_MASK); + } } \ No newline at end of file diff --git a/runelite-client/src/main/java/net/runelite/client/ui/ClientUI.java b/runelite-client/src/main/java/net/runelite/client/ui/ClientUI.java index 2ae6cc56c2..c47c0f892b 100644 --- a/runelite-client/src/main/java/net/runelite/client/ui/ClientUI.java +++ b/runelite-client/src/main/java/net/runelite/client/ui/ClientUI.java @@ -39,8 +39,6 @@ import java.awt.LayoutManager; import java.awt.Rectangle; import java.awt.Toolkit; import java.awt.TrayIcon; -import java.awt.event.InputEvent; -import java.awt.event.KeyEvent; import java.awt.event.MouseEvent; import java.awt.image.BufferedImage; import javax.annotation.Nullable; @@ -73,7 +71,6 @@ import net.runelite.client.RuneLiteProperties; import net.runelite.client.callback.ClientThread; import net.runelite.client.config.ConfigManager; import net.runelite.client.config.ExpandResizeType; -import net.runelite.client.config.Keybind; import net.runelite.client.config.RuneLiteConfig; import net.runelite.client.config.WarningOnExit; import net.runelite.client.eventbus.Subscribe; @@ -345,8 +342,7 @@ public class ClientUI frame.add(container); // Add key listener - final HotkeyListener sidebarListener = new HotkeyListener(() -> - new Keybind(KeyEvent.VK_F11, InputEvent.CTRL_DOWN_MASK)) + final HotkeyListener sidebarListener = new HotkeyListener(config::sidebarToggleKey) { @Override public void hotkeyPressed() From 15e0f1e5f22a1543b08253edaf15779128cb688d Mon Sep 17 00:00:00 2001 From: loldudester Date: Sun, 26 Jan 2020 22:15:25 +0000 Subject: [PATCH 36/36] client: Add configurable hotkey to toggle plugin panel --- .../client/config/RuneLiteConfig.java | 11 +++++++ .../java/net/runelite/client/ui/ClientUI.java | 31 +++++++++++++++++++ 2 files changed, 42 insertions(+) diff --git a/runelite-client/src/main/java/net/runelite/client/config/RuneLiteConfig.java b/runelite-client/src/main/java/net/runelite/client/config/RuneLiteConfig.java index f90ecf43b1..81ccc10c7c 100644 --- a/runelite-client/src/main/java/net/runelite/client/config/RuneLiteConfig.java +++ b/runelite-client/src/main/java/net/runelite/client/config/RuneLiteConfig.java @@ -312,4 +312,15 @@ public interface RuneLiteConfig extends Config { return new Keybind(KeyEvent.VK_F11, InputEvent.CTRL_DOWN_MASK); } + + @ConfigItem( + keyName = "panelToggleKey", + name = "Plugin Panel Toggle Key", + description = "The key that will toggle the current or last opened plugin panel (accepts modifiers)", + position = 45 + ) + default Keybind panelToggleKey() + { + return new Keybind(KeyEvent.VK_F12, InputEvent.CTRL_DOWN_MASK); + } } \ No newline at end of file diff --git a/runelite-client/src/main/java/net/runelite/client/ui/ClientUI.java b/runelite-client/src/main/java/net/runelite/client/ui/ClientUI.java index c47c0f892b..55fc4940b8 100644 --- a/runelite-client/src/main/java/net/runelite/client/ui/ClientUI.java +++ b/runelite-client/src/main/java/net/runelite/client/ui/ClientUI.java @@ -353,6 +353,17 @@ public class ClientUI keyManager.registerKeyListener(sidebarListener); + final HotkeyListener pluginPanelListener = new HotkeyListener(config::panelToggleKey) + { + @Override + public void hotkeyPressed() + { + togglePluginPanel(); + } + }; + + keyManager.registerKeyListener(pluginPanelListener); + // Add mouse listener final MouseListener mouseListener = new MouseAdapter() { @@ -738,6 +749,26 @@ public class ClientUI } } + private void togglePluginPanel() + { + // Toggle plugin panel open + final boolean pluginPanelOpen = pluginPanel != null; + + if (currentButton != null) + { + currentButton.setSelected(!pluginPanelOpen); + } + + if (pluginPanelOpen) + { + contract(); + } + else + { + expand(currentNavButton); + } + } + private void expand(@Nullable NavigationButton button) { if (button == null)