From 7a960cea928e26b1b412cd3c47c85fe057e4215b Mon Sep 17 00:00:00 2001 From: Alexsuperfly Date: Wed, 21 Aug 2019 08:43:09 -0400 Subject: [PATCH 01/10] slayer: correct Vampyre task spelling --- .../src/main/java/net/runelite/client/plugins/slayer/Task.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/slayer/Task.java b/runelite-client/src/main/java/net/runelite/client/plugins/slayer/Task.java index da5f237ab4..73fc775daf 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/slayer/Task.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/slayer/Task.java @@ -163,7 +163,7 @@ enum Task TROLLS("Trolls", ItemID.TROLL_GUARD), TUROTH("Turoth", ItemID.TUROTH), TZHAAR("Tzhaar", ItemID.ENSOULED_TZHAAR_HEAD), - VAMPIRES("Vampires", ItemID.STAKE), + VAMPYRES("Vampyres", ItemID.STAKE), VENENATIS("Venenatis", ItemID.VENENATIS_SPIDERLING), VETION("Vet'ion", ItemID.VETION_JR), VORKATH("Vorkath", ItemID.VORKI), From 7acbfe0fb929f60a5a2de796e4eeb099b5d27137 Mon Sep 17 00:00:00 2001 From: Alexsuperfly Date: Fri, 23 Aug 2019 17:32:09 -0400 Subject: [PATCH 02/10] slayer: add additional target names to Vampyre task --- .../src/main/java/net/runelite/client/plugins/slayer/Task.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/slayer/Task.java b/runelite-client/src/main/java/net/runelite/client/plugins/slayer/Task.java index 73fc775daf..161023b8fa 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/slayer/Task.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/slayer/Task.java @@ -163,7 +163,7 @@ enum Task TROLLS("Trolls", ItemID.TROLL_GUARD), TUROTH("Turoth", ItemID.TUROTH), TZHAAR("Tzhaar", ItemID.ENSOULED_TZHAAR_HEAD), - VAMPYRES("Vampyres", ItemID.STAKE), + VAMPYRES("Vampyres", ItemID.STAKE, "Vyrewatch", "Vampire"), VENENATIS("Venenatis", ItemID.VENENATIS_SPIDERLING), VETION("Vet'ion", ItemID.VETION_JR), VORKATH("Vorkath", ItemID.VORKI), From 92b2d29a41943b92206571cc9f6523526c655bd3 Mon Sep 17 00:00:00 2001 From: Hydrox6 Date: Sat, 24 Aug 2019 02:18:44 +0100 Subject: [PATCH 03/10] agility: fix objectid for Arandar lvl 85 obstacle --- .../main/java/net/runelite/client/game/AgilityShortcut.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/runelite-client/src/main/java/net/runelite/client/game/AgilityShortcut.java b/runelite-client/src/main/java/net/runelite/client/game/AgilityShortcut.java index 5e7ea1b1f5..474345fb53 100644 --- a/runelite-client/src/main/java/net/runelite/client/game/AgilityShortcut.java +++ b/runelite-client/src/main/java/net/runelite/client/game/AgilityShortcut.java @@ -199,8 +199,8 @@ public enum AgilityShortcut BRIMHAVEN_DUNGEON_EAST_STEPPING_STONES_SOUTH(83, "Stepping Stones", new WorldPoint(2693, 9529, 0), STEPPING_STONE_19040), IORWERTHS_DUNGEON_SOUTHERN_SHORTCUT_EAST(84, "Tight Gap", new WorldPoint(3241, 12420, 0), TIGHT_GAP_36694), IORWERTHS_DUNGEON_SOUTHERN_SHORTCUT_WEST(84, "Tight Gap", new WorldPoint(3231, 12420, 0), TIGHT_GAP_36695), - ELVEN_ADVANCED_CLIFF_SCRAMBLE(85, "Rocks", new WorldPoint(2337, 3253, 0), ROCKS_16514, ROCKS_16514), - ELVEN_ADVANCED_CLIFF_SCRAMBLE_PRIFDDINAS(85, "Rocks", new WorldPoint(3361, 6005, 0), ROCKS_16514, ROCKS_16514), + ELVEN_ADVANCED_CLIFF_SCRAMBLE(85, "Rocks", new WorldPoint(2337, 3253, 0), ROCKS_16514, ROCKS_16515), + ELVEN_ADVANCED_CLIFF_SCRAMBLE_PRIFDDINAS(85, "Rocks", new WorldPoint(3361, 6005, 0), ROCKS_16514, ROCKS_16515), KALPHITE_WALL(86, "Crevice", new WorldPoint(3214, 9508, 0), CREVICE_16465), BRIMHAVEN_DUNGEON_VINE_EAST(87, "Vine", new WorldPoint(2672, 9582, 0), VINE_26880, VINE_26882), BRIMHAVEN_DUNGEON_VINE_WEST(87, "Vine", new WorldPoint(2606, 9584, 0), VINE_26880, VINE_26882), From 5d0aa8287ed4c81dfa0d5b0e1206eea61112891e Mon Sep 17 00:00:00 2001 From: Alexsuperfly Date: Sun, 25 Aug 2019 19:19:05 -0400 Subject: [PATCH 04/10] clues: fix port sarim easy stash plane location --- .../client/plugins/cluescrolls/clues/emote/STASHUnit.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/clues/emote/STASHUnit.java b/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/clues/emote/STASHUnit.java index 1a4e5eb2b5..c2f74e93c9 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/clues/emote/STASHUnit.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/clues/emote/STASHUnit.java @@ -37,7 +37,7 @@ public enum STASHUnit LIMESTONE_MINE(NullObjectID.NULL_28961, new WorldPoint(3373, 3498, 0)), OUTSIDE_THE_LEGENDS_GUILD_GATES(NullObjectID.NULL_28962, new WorldPoint(2735, 3350, 0)), MUDSKIPPER_POINT(NullObjectID.NULL_28963, new WorldPoint(2988, 3111, 0)), - NEAR_THE_ENTRANA_FERRY_IN_PORT_SARIM(NullObjectID.NULL_28964, new WorldPoint(3050, 3237, 1)), + NEAR_THE_ENTRANA_FERRY_IN_PORT_SARIM(NullObjectID.NULL_28964, new WorldPoint(3050, 3237, 0)), AL_KHARID_SCORPION_MINE(NullObjectID.NULL_28965, new WorldPoint(3303, 3289, 0)), DRAYNOR_MANOR_BY_THE_FOUNTAIN(NullObjectID.NULL_28966, new WorldPoint(3089, 3331, 0)), WHEAT_FIELD_NEAR_THE_LUMBRIDGE_WINDMILL(NullObjectID.NULL_28967, new WorldPoint(3163, 3297, 0)), From cf8ff423136cf672da0de0975378f87ae905d71b Mon Sep 17 00:00:00 2001 From: Alexsuperfly Date: Sun, 25 Aug 2019 19:57:09 -0400 Subject: [PATCH 05/10] clues: fix wizards tower bridge plane location --- .../client/plugins/cluescrolls/clues/emote/STASHUnit.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/clues/emote/STASHUnit.java b/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/clues/emote/STASHUnit.java index c2f74e93c9..05874dd05b 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/clues/emote/STASHUnit.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/clues/emote/STASHUnit.java @@ -32,7 +32,7 @@ import net.runelite.api.coords.WorldPoint; public enum STASHUnit { NEAR_A_SHED_IN_LUMBRIDGE_SWAMP(NullObjectID.NULL_28958, new WorldPoint(3201, 3171, 0)), - ON_THE_BRIDGE_TO_THE_MISTHALIN_WIZARDS_TOWER(NullObjectID.NULL_28959, new WorldPoint(3115, 3194, 1)), + ON_THE_BRIDGE_TO_THE_MISTHALIN_WIZARDS_TOWER(NullObjectID.NULL_28959, new WorldPoint(3115, 3194, 0)), DRAYNOR_VILLAGE_MARKET(NullObjectID.NULL_28960, new WorldPoint(3083, 3254, 0)), LIMESTONE_MINE(NullObjectID.NULL_28961, new WorldPoint(3373, 3498, 0)), OUTSIDE_THE_LEGENDS_GUILD_GATES(NullObjectID.NULL_28962, new WorldPoint(2735, 3350, 0)), From 41f39098760d7b03048f4095d81866ecefb164ee Mon Sep 17 00:00:00 2001 From: Adam Date: Mon, 26 Aug 2019 10:32:58 -0400 Subject: [PATCH 06/10] config manager: overwrite defaults when unable to unmarshall values This allows config key types to change without errors by resetting the config with new default value --- .../main/java/net/runelite/client/config/ConfigManager.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/runelite-client/src/main/java/net/runelite/client/config/ConfigManager.java b/runelite-client/src/main/java/net/runelite/client/config/ConfigManager.java index 4e6c1e65ae..09e852515c 100644 --- a/runelite-client/src/main/java/net/runelite/client/config/ConfigManager.java +++ b/runelite-client/src/main/java/net/runelite/client/config/ConfigManager.java @@ -507,7 +507,9 @@ public class ConfigManager if (!override) { - String current = getConfiguration(group.value(), item.keyName()); + // This checks if it is set and is also unmarshallable to the correct type; so + // we will overwrite invalid config values with the default + Object current = getConfiguration(group.value(), item.keyName(), method.getReturnType()); if (current != null) { continue; // something else is already set From fd50192e041cba33546a1ee5452c9641102b21e4 Mon Sep 17 00:00:00 2001 From: Adam Date: Mon, 26 Aug 2019 10:38:21 -0400 Subject: [PATCH 07/10] screenshot plugin: add screenshot to clipboard Co-authored-by: Alexsuperfly --- .../plugins/screenshot/ScreenshotConfig.java | 9 ++- .../plugins/screenshot/ScreenshotPlugin.java | 14 +++- .../screenshot/TransferableBufferedImage.java | 66 +++++++++++++++++++ .../plugins/screenshot/UploadStyle.java | 33 ++++++++++ 4 files changed, 116 insertions(+), 6 deletions(-) create mode 100644 runelite-client/src/main/java/net/runelite/client/plugins/screenshot/TransferableBufferedImage.java create mode 100644 runelite-client/src/main/java/net/runelite/client/plugins/screenshot/UploadStyle.java 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 1a37938501..164fe7dbdd 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 @@ -111,16 +111,15 @@ public interface ScreenshotConfig extends Config @ConfigItem( keyName = "uploadScreenshot", - name = "Upload To Imgur", - description = "Configures whether or not screenshots are uploaded to Imgur and copied into your clipboard", + name = "Upload", + description = "Configures whether or not screenshots are uploaded to Imgur, or placed on your clipboard", position = 7 ) - default boolean uploadScreenshot() + default UploadStyle uploadScreenshot() { - return false; + return UploadStyle.NEITHER; } - @ConfigItem( keyName = "kills", name = "Screenshot PvP Kills", 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 9b19f8bf26..27a78a59d4 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 @@ -648,11 +648,23 @@ public class ScreenshotPlugin extends Plugin } ImageIO.write(screenshot, "PNG", screenshotFile); + UploadStyle uploadStyle = config.uploadScreenshot(); - if (config.uploadScreenshot()) + if (uploadStyle == UploadStyle.IMGUR) { uploadScreenshot(screenshotFile); } + else if (uploadStyle == UploadStyle.CLIPBOARD) + { + Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard(); + TransferableBufferedImage transferableBufferedImage = new TransferableBufferedImage(screenshot); + clipboard.setContents(transferableBufferedImage, null); + + if (config.notifyWhenTaken()) + { + notifier.notify("A screenshot was saved and inserted into your clipboard!", TrayIcon.MessageType.INFO); + } + } else if (config.notifyWhenTaken()) { notifier.notify("A screenshot was saved to " + screenshotFile, TrayIcon.MessageType.INFO); diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/screenshot/TransferableBufferedImage.java b/runelite-client/src/main/java/net/runelite/client/plugins/screenshot/TransferableBufferedImage.java new file mode 100644 index 0000000000..27b4ddd154 --- /dev/null +++ b/runelite-client/src/main/java/net/runelite/client/plugins/screenshot/TransferableBufferedImage.java @@ -0,0 +1,66 @@ +/* + * Copyright (c) 2019, Alexsuperfly + * Copyright (c) 2019, 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 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.screenshot; + +import java.awt.datatransfer.DataFlavor; +import java.awt.datatransfer.Transferable; +import java.awt.datatransfer.UnsupportedFlavorException; +import java.awt.image.BufferedImage; +import lombok.AllArgsConstructor; +import lombok.NonNull; + +@AllArgsConstructor +class TransferableBufferedImage implements Transferable +{ + @NonNull + private final BufferedImage image; + + @Override + public Object getTransferData(DataFlavor flavor) throws UnsupportedFlavorException + { + if (flavor.equals(DataFlavor.imageFlavor)) + { + return image; + } + else + { + throw new UnsupportedFlavorException(flavor); + } + } + + @Override + public DataFlavor[] getTransferDataFlavors() + { + return new DataFlavor[]{DataFlavor.imageFlavor}; + } + + @Override + public boolean isDataFlavorSupported(DataFlavor flavor) + { + return flavor.equals(DataFlavor.imageFlavor); + } +} \ No newline at end of file diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/screenshot/UploadStyle.java b/runelite-client/src/main/java/net/runelite/client/plugins/screenshot/UploadStyle.java new file mode 100644 index 0000000000..fd0594e7ba --- /dev/null +++ b/runelite-client/src/main/java/net/runelite/client/plugins/screenshot/UploadStyle.java @@ -0,0 +1,33 @@ +/* + * Copyright (c) 2019, Alexsuperfly + * 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.screenshot; + +public enum UploadStyle +{ + NEITHER, + IMGUR, + CLIPBOARD +} From 7197f0e2d855b46b0bd134b0dc8bfef82918ff91 Mon Sep 17 00:00:00 2001 From: Hydrox6 Date: Tue, 27 Aug 2019 02:25:33 +0100 Subject: [PATCH 08/10] runecraft: fix layer of AbyssOverlay This stops the rift highlights being drawn over the UI --- .../net/runelite/client/plugins/runecraft/AbyssOverlay.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/runecraft/AbyssOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/runecraft/AbyssOverlay.java index 23f8e390b8..89954b6468 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/runecraft/AbyssOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/runecraft/AbyssOverlay.java @@ -77,7 +77,7 @@ class AbyssOverlay extends Overlay AbyssOverlay(Client client, RunecraftPlugin plugin, RunecraftConfig config) { setPosition(OverlayPosition.DYNAMIC); - setLayer(OverlayLayer.ABOVE_WIDGETS); + setLayer(OverlayLayer.ABOVE_SCENE); this.client = client; this.plugin = plugin; this.config = config; From a88f8e6624eacf45dcfcdb3623394fcb5da12061 Mon Sep 17 00:00:00 2001 From: Adam Date: Mon, 26 Aug 2019 21:26:56 -0400 Subject: [PATCH 09/10] runecraft plugin: check config group before updating config --- .../runelite/client/plugins/runecraft/RunecraftPlugin.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/runecraft/RunecraftPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/runecraft/RunecraftPlugin.java index 1a30e18f76..ca71c687ef 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/runecraft/RunecraftPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/runecraft/RunecraftPlugin.java @@ -121,7 +121,10 @@ public class RunecraftPlugin extends Plugin @Subscribe public void onConfigChanged(ConfigChanged event) { - abyssOverlay.updateConfig(); + if (event.getGroup().equals("runecraft")) + { + abyssOverlay.updateConfig(); + } } @Subscribe From a94f5e47f94f1f8b975c96fd313b6f1d0f194eb1 Mon Sep 17 00:00:00 2001 From: Hydrox6 Date: Tue, 27 Aug 2019 07:49:12 +0100 Subject: [PATCH 10/10] clues: fix abyssal head recognition --- .../client/plugins/cluescrolls/clues/SkillChallengeClue.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/clues/SkillChallengeClue.java b/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/clues/SkillChallengeClue.java index ce7b5119e1..df10aa06cc 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/clues/SkillChallengeClue.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/clues/SkillChallengeClue.java @@ -176,7 +176,7 @@ public class SkillChallengeClue extends ClueScroll implements NpcClueScroll new SkillChallengeClue("Catch an Anglerfish.", "angle for an anglerfish in your finest fishing gear.", true, any("Fishing rod", item(ItemID.FISHING_ROD), item(ItemID.PEARL_FISHING_ROD)), item(ItemID.SANDWORMS), all("Angler's outfit", item(ItemID.ANGLER_HAT), item(ItemID.ANGLER_TOP), item(ItemID.ANGLER_WADERS), item(ItemID.ANGLER_BOOTS))), new SkillChallengeClue("Chop a redwood log.", "chop a redwood log whilst sporting the finest lumberjack gear.", true, ANY_AXE, all("Lumberjack outfit", item(ItemID.LUMBERJACK_HAT), item(ItemID.LUMBERJACK_TOP), item(ItemID.LUMBERJACK_LEGS), item(ItemID.LUMBERJACK_BOOTS))), new SkillChallengeClue("Craft a light orb in the Dorgesh-Kaan bank.", item(ItemID.CAVE_GOBLIN_WIRE), item(ItemID.EMPTY_LIGHT_ORB)), - new SkillChallengeClue("Kill a reanimated Abyssal Demon.", "kill a reanimated abyssal.", xOfItem(ItemID.SOUL_RUNE, 4), xOfItem(ItemID.BLOOD_RUNE, 1), any("Nature Rune x4", xOfItem(ItemID.NATURE_RUNE, 4), item(ItemID.BRYOPHYTAS_STAFF)), item(ItemID.ENSOULED_ABYSSAL_HEAD)), + new SkillChallengeClue("Kill a reanimated Abyssal Demon.", "kill a reanimated abyssal.", xOfItem(ItemID.SOUL_RUNE, 4), xOfItem(ItemID.BLOOD_RUNE, 1), any("Nature Rune x4", xOfItem(ItemID.NATURE_RUNE, 4), item(ItemID.BRYOPHYTAS_STAFF)), range("Ensouled abyssal head", ItemID.ENSOULED_ABYSSAL_HEAD, ItemID.ENSOULED_ABYSSAL_HEAD_13508)), new SkillChallengeClue("Kill a Fiyr shade inside Mort'tons shade catacombs.", any("Any Silver Shade Key", item(ItemID.SILVER_KEY_RED), item(ItemID.SILVER_KEY_BROWN), item(ItemID.SILVER_KEY_CRIMSON), item(ItemID.SILVER_KEY_BLACK), item(ItemID.SILVER_KEY_PURPLE))) );