From 0b2fa4aba1d919357c4cdc349f8ed1fdb288641b Mon Sep 17 00:00:00 2001 From: Lotto Date: Mon, 26 Mar 2018 17:11:11 +0200 Subject: [PATCH 01/10] runelite-api: make InventoryItemQuery take in InventoryID --- .../java/net/runelite/api/queries/InventoryItemQuery.java | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/runelite-api/src/main/java/net/runelite/api/queries/InventoryItemQuery.java b/runelite-api/src/main/java/net/runelite/api/queries/InventoryItemQuery.java index 4571d4694b..b22c2a910a 100644 --- a/runelite-api/src/main/java/net/runelite/api/queries/InventoryItemQuery.java +++ b/runelite-api/src/main/java/net/runelite/api/queries/InventoryItemQuery.java @@ -24,18 +24,22 @@ */ package net.runelite.api.queries; +import lombok.RequiredArgsConstructor; import net.runelite.api.Client; import net.runelite.api.InventoryID; import net.runelite.api.Item; import net.runelite.api.ItemContainer; import net.runelite.api.Query; +@RequiredArgsConstructor public class InventoryItemQuery extends Query { + private final InventoryID inventory; + @Override public Item[] result(Client client) { - ItemContainer container = client.getItemContainer(InventoryID.INVENTORY); + ItemContainer container = client.getItemContainer(inventory); if (container == null) { return null; From 35d8f2ef71931fff72581535f89a46bb9e49fc39 Mon Sep 17 00:00:00 2001 From: Lotto Date: Mon, 26 Mar 2018 17:11:36 +0200 Subject: [PATCH 02/10] runelite-api: add emote window widget info --- .../src/main/java/net/runelite/api/widgets/WidgetID.java | 7 +++++++ .../src/main/java/net/runelite/api/widgets/WidgetInfo.java | 3 +++ 2 files changed, 10 insertions(+) diff --git a/runelite-api/src/main/java/net/runelite/api/widgets/WidgetID.java b/runelite-api/src/main/java/net/runelite/api/widgets/WidgetID.java index 395d37d1ba..f46a3607bf 100644 --- a/runelite-api/src/main/java/net/runelite/api/widgets/WidgetID.java +++ b/runelite-api/src/main/java/net/runelite/api/widgets/WidgetID.java @@ -34,6 +34,7 @@ public class WidgetID public static final int INVENTORY_GROUP_ID = 149; public static final int EQUIPMENT_GROUP_ID = 387; public static final int EQUIPMENT_INVENTORY_GROUP_ID = 85; + public static final int EMOTES_GROUP_ID = 216; public static final int RUNE_POUCH_GROUP_ID = 190; public static final int DIARY_GROUP_ID = 259; public static final int PESTRCONTROL_GROUP_ID = 408; @@ -175,6 +176,12 @@ public class WidgetID static final int INVENTORY_ITEM_CONTAINER = 0; } + static class Emotes + { + static final int EMOTE_WINDOW = 0; + static final int EMOTE_CONTAINER = 1; + } + static class Cluescroll { static final int CLUE_TEXT = 2; diff --git a/runelite-api/src/main/java/net/runelite/api/widgets/WidgetInfo.java b/runelite-api/src/main/java/net/runelite/api/widgets/WidgetInfo.java index c641d9bb91..112b63ebc5 100644 --- a/runelite-api/src/main/java/net/runelite/api/widgets/WidgetInfo.java +++ b/runelite-api/src/main/java/net/runelite/api/widgets/WidgetInfo.java @@ -51,6 +51,9 @@ public enum WidgetInfo EQUIPMENT_RING(WidgetID.EQUIPMENT_GROUP_ID, WidgetID.Equipment.RING), EQUIPMENT_AMMO(WidgetID.EQUIPMENT_GROUP_ID, WidgetID.Equipment.AMMO), + EMOTE_WINDOW(WidgetID.EMOTES_GROUP_ID, WidgetID.Emotes.EMOTE_WINDOW), + EMOTE_CONTAINER(WidgetID.EMOTES_GROUP_ID, WidgetID.Emotes.EMOTE_CONTAINER), + DIARY_LIST(WidgetID.DIARY_GROUP_ID, 4), PESTCONTROL_PURPLE_SHIELD(WidgetID.PESTRCONTROL_GROUP_ID, WidgetID.PestControl.PURPLE_SHIELD), From 04abc1fb125d2220ff7060de58b8b6eb6591f49b Mon Sep 17 00:00:00 2001 From: Lotto Date: Mon, 26 Mar 2018 17:12:16 +0200 Subject: [PATCH 03/10] runelite-client: pass in z offset into renderActorOverlayImage --- .../runelite/client/plugins/fishing/FishingSpotOverlay.java | 2 +- .../main/java/net/runelite/client/ui/overlay/OverlayUtil.java | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) 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 aea35805fa..27cb707e6c 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 @@ -78,7 +78,7 @@ class FishingSpotOverlay extends Overlay BufferedImage fishImage = getFishImage(spot); if (fishImage != null) { - OverlayUtil.renderActorOverlayImage(graphics, npc, fishImage, color.darker()); + OverlayUtil.renderActorOverlayImage(graphics, npc, fishImage, color.darker(), npc.getLogicalHeight()); } } else diff --git a/runelite-client/src/main/java/net/runelite/client/ui/overlay/OverlayUtil.java b/runelite-client/src/main/java/net/runelite/client/ui/overlay/OverlayUtil.java index 356a6aeed6..6c75de2f69 100644 --- a/runelite-client/src/main/java/net/runelite/client/ui/overlay/OverlayUtil.java +++ b/runelite-client/src/main/java/net/runelite/client/ui/overlay/OverlayUtil.java @@ -95,7 +95,7 @@ public class OverlayUtil } } - public static void renderActorOverlayImage(Graphics2D graphics, Actor actor, BufferedImage image, Color color) + public static void renderActorOverlayImage(Graphics2D graphics, Actor actor, BufferedImage image, Color color, int zOffset) { Polygon poly = actor.getCanvasTilePoly(); if (poly != null) @@ -103,7 +103,7 @@ public class OverlayUtil renderPolygon(graphics, poly, color); } - Point imageLocation = actor.getCanvasImageLocation(graphics, image, actor.getLogicalHeight()); + Point imageLocation = actor.getCanvasImageLocation(graphics, image, zOffset); if (imageLocation != null) { renderImageLocation(graphics, imageLocation, image); From 0aae96f0ce74401fec121ac5a81b0d8791bc9d24 Mon Sep 17 00:00:00 2001 From: Lotto Date: Mon, 26 Mar 2018 17:22:42 +0200 Subject: [PATCH 04/10] runelite-client: extend overlay util to render Areas and LocalPoint --- .../client/ui/overlay/OverlayUtil.java | 43 +++++++++++++++++++ 1 file changed, 43 insertions(+) diff --git a/runelite-client/src/main/java/net/runelite/client/ui/overlay/OverlayUtil.java b/runelite-client/src/main/java/net/runelite/client/ui/overlay/OverlayUtil.java index 6c75de2f69..77b1e9b3ef 100644 --- a/runelite-client/src/main/java/net/runelite/client/ui/overlay/OverlayUtil.java +++ b/runelite-client/src/main/java/net/runelite/client/ui/overlay/OverlayUtil.java @@ -30,10 +30,14 @@ import java.awt.Dimension; import java.awt.Graphics2D; import java.awt.Polygon; import java.awt.RenderingHints; +import java.awt.geom.Area; import java.awt.image.BufferedImage; import net.runelite.api.Actor; +import net.runelite.api.Client; +import net.runelite.api.Perspective; import net.runelite.api.Point; import net.runelite.api.TileObject; +import net.runelite.api.coords.LocalPoint; import net.runelite.client.ui.FontManager; @@ -72,6 +76,15 @@ public class OverlayUtil graphics.drawString(text, x, y); } + public static void renderImageLocation(Client client, Graphics2D graphics, LocalPoint localPoint, BufferedImage image, int zOffset) + { + net.runelite.api.Point imageLocation = Perspective.getCanvasImageLocation(client, graphics, localPoint, image, zOffset); + if (imageLocation != null) + { + renderImageLocation(graphics, imageLocation, image); + } + } + public static void renderImageLocation(Graphics2D graphics, Point imgLoc, BufferedImage image) { int x = imgLoc.getX(); @@ -131,6 +144,36 @@ public class OverlayUtil } } + public static void renderTileOverlay(Client client, Graphics2D graphics, LocalPoint localLocation, BufferedImage image, Color color) + { + Polygon poly = Perspective.getCanvasTilePoly(client, localLocation); + if (poly != null) + { + renderPolygon(graphics, poly, color); + } + + renderImageLocation(client, graphics, localLocation, image, 0); + } + + public static void renderHoverableArea(Graphics2D graphics, Area area, net.runelite.api.Point mousePosition, Color fillColor, Color borderColor, Color borderHoverColor) + { + if (area != null) + { + if (area.contains(mousePosition.getX(), mousePosition.getY())) + { + graphics.setColor(borderHoverColor); + } + else + { + graphics.setColor(borderColor); + } + + graphics.draw(area); + graphics.setColor(fillColor); + graphics.fill(area); + } + } + public static void setGraphicProperties(Graphics2D graphics) { graphics.setFont(FontManager.getRunescapeFont()); From 7f4e36cf5fa06404e7454ea4bb402596df034fa4 Mon Sep 17 00:00:00 2001 From: Lotto Date: Mon, 26 Mar 2018 17:23:24 +0200 Subject: [PATCH 05/10] runelite-client: add line wrapping to PanelComponent lines --- .../ui/overlay/components/PanelComponent.java | 131 +++++++++++++++++- 1 file changed, 125 insertions(+), 6 deletions(-) diff --git a/runelite-client/src/main/java/net/runelite/client/ui/overlay/components/PanelComponent.java b/runelite-client/src/main/java/net/runelite/client/ui/overlay/components/PanelComponent.java index 1936734869..600c01287d 100644 --- a/runelite-client/src/main/java/net/runelite/client/ui/overlay/components/PanelComponent.java +++ b/runelite-client/src/main/java/net/runelite/client/ui/overlay/components/PanelComponent.java @@ -33,11 +33,11 @@ import java.awt.Point; import java.awt.Rectangle; import java.util.ArrayList; import java.util.List; +import java.util.ListIterator; import java.util.Objects; import lombok.AllArgsConstructor; import lombok.Data; import lombok.Getter; -import lombok.RequiredArgsConstructor; import lombok.Setter; import net.runelite.client.ui.overlay.RenderableEntity; @@ -51,13 +51,58 @@ public class PanelComponent implements RenderableEntity @Data @AllArgsConstructor - @RequiredArgsConstructor public static class Line { - private final String left; + private boolean wrapWords; + private String left; private Color leftColor = Color.WHITE; - private final String right; + private String right = ""; private Color rightColor = Color.WHITE; + + public Line(String left) + { + this.left = left; + } + + public Line(boolean wrapWords, String left) + { + this.wrapWords = wrapWords; + this.left = left; + } + + public Line(String left, Color leftColor) + { + this.left = left; + this.leftColor = leftColor; + } + + public Line(boolean wrapWords, String left, Color leftColor) + { + this.wrapWords = wrapWords; + this.left = left; + this.leftColor = leftColor; + } + + public Line(String left, String right) + { + this.left = left; + this.right = right; + } + + public Line(boolean wrapWords, String left, String right) + { + this.wrapWords = wrapWords; + this.left = left; + this.right = right; + } + + public Line(String left, Color leftColor, String right, Color rightColor) + { + this.left = left; + this.leftColor = leftColor; + this.right = right; + this.rightColor = rightColor; + } } @Setter @@ -84,6 +129,50 @@ public class PanelComponent implements RenderableEntity @Override public Dimension render(Graphics2D graphics) { + final FontMetrics metrics = graphics.getFontMetrics(); + + // Do word wrapping + ListIterator iterator = lines.listIterator(); + while (iterator.hasNext()) + { + Line line = iterator.next(); + + if (line.wrapWords) + { + iterator.remove(); + + int maxWidth = width; + if (line.right.length() > 0) + { + maxWidth /= 2; + } + maxWidth -= LEFT_BORDER + RIGHT_BORDER; + + List leftSplitLines = lineBreakText(line.getLeft(), maxWidth, metrics); + List rightSplitLines = lineBreakText(line.getRight(), maxWidth, metrics); + + int lineCount = Math.max(leftSplitLines.size(), rightSplitLines.size()); + + for (int i = 0; i < lineCount; i++) + { + String left = ""; + String right = ""; + + if (i < leftSplitLines.size()) + { + left = leftSplitLines.get(i); + } + + if (i < rightSplitLines.size()) + { + right = rightSplitLines.get(i); + } + + iterator.add(new Line(false, left, line.getLeftColor(), right, line.getRightColor())); + } + } + } + final Dimension dimension = new Dimension(); final int elementNumber = (Strings.isNullOrEmpty(title) ? 0 : 1) + lines.size() + (Objects.isNull(progressBar) ? 0 : 1); int height = elementNumber == 0 ? 0 : @@ -97,8 +186,6 @@ public class PanelComponent implements RenderableEntity return null; } - final FontMetrics metrics = graphics.getFontMetrics(); - // Calculate panel dimensions int y = position.y + TOP_BORDER + metrics.getHeight(); @@ -146,4 +233,36 @@ public class PanelComponent implements RenderableEntity return dimension; } + + private List lineBreakText(String text, int maxWidth, FontMetrics metrics) + { + List lines = new ArrayList<>(); + + int pos = 0; + String[] words = text.split(" "); + String line = ""; + + while (pos < words.length) + { + String newLine = pos > 0 && !line.isEmpty() + ? line + " " + words[pos] + : words[pos]; + int width = metrics.stringWidth(newLine); + + if (width >= maxWidth) + { + lines.add(line); + line = ""; + } + else + { + line = newLine; + pos++; + } + } + + lines.add(line); + + return lines; + } } From 00d230efcf01911cb33b4e635d7a2b1dac2bfb49 Mon Sep 17 00:00:00 2001 From: Lotto Date: Mon, 26 Mar 2018 17:24:20 +0200 Subject: [PATCH 06/10] runelite-api: add sprite ids class --- .../main/java/net/runelite/api/SpriteID.java | 58 +++++++++++++++++++ 1 file changed, 58 insertions(+) create mode 100644 runelite-api/src/main/java/net/runelite/api/SpriteID.java diff --git a/runelite-api/src/main/java/net/runelite/api/SpriteID.java b/runelite-api/src/main/java/net/runelite/api/SpriteID.java new file mode 100644 index 0000000000..60976309f2 --- /dev/null +++ b/runelite-api/src/main/java/net/runelite/api/SpriteID.java @@ -0,0 +1,58 @@ +/* + * Copyright (c) 2018, Lotto + * 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.api; + +// Note: This class is not complete: these sprites were manually gathered +// through the cache and widget inspector. Please add sprites as you happen to use them. +public final class SpriteID +{ + public static final int EMOTE_YES = 700; + public static final int EMOTE_NO = 701; + public static final int EMOTE_THINK = 702; + public static final int EMOTE_BOW = 703; + public static final int EMOTE_ANGRY = 704; + public static final int EMOTE_CRY = 705; + public static final int EMOTE_LAUGH = 706; + public static final int EMOTE_CHEER = 707; + public static final int EMOTE_WAVE = 708; + public static final int EMOTE_BECKON = 709; + public static final int EMOTE_DANCE = 710; + public static final int EMOTE_CLAP = 711; + public static final int EMOTE_PANIC = 712; + public static final int EMOTE_JIG = 713; + public static final int EMOTE_SPIN = 714; + public static final int EMOTE_HEADBANG = 715; + public static final int EMOTE_JUMP_FOR_JOY = 716; + public static final int EMOTE_RASPBERRY = 717; + public static final int EMOTE_YAWN = 718; + public static final int EMOTE_SALUTE = 719; + public static final int EMOTE_SHRUG = 720; + public static final int EMOTE_BLOW_KISS = 721; + public static final int EMOTE_GOBLIN_SALUTE = 727; + public static final int EMOTE_SLAP_HEAD = 729; + public static final int EMOTE_STOMP = 730; + public static final int EMOTE_FLAP = 731; + public static final int EMOTE_PUSH_UP = 1204; +} From 59f62584467c5cc39c8380725ed97a3d7fe10451 Mon Sep 17 00:00:00 2001 From: Lotto Date: Mon, 26 Mar 2018 17:25:40 +0200 Subject: [PATCH 07/10] runelite-client: add resource images to clue scroll plugin --- .../client/plugins/cluescrolls/clue_scroll.png | Bin 0 -> 15191 bytes .../client/plugins/cluescrolls/emote.png | Bin 0 -> 650 bytes .../client/plugins/cluescrolls/spade.png | Bin 0 -> 15302 bytes 3 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 runelite-client/src/main/resources/net/runelite/client/plugins/cluescrolls/clue_scroll.png create mode 100644 runelite-client/src/main/resources/net/runelite/client/plugins/cluescrolls/emote.png create mode 100644 runelite-client/src/main/resources/net/runelite/client/plugins/cluescrolls/spade.png diff --git a/runelite-client/src/main/resources/net/runelite/client/plugins/cluescrolls/clue_scroll.png b/runelite-client/src/main/resources/net/runelite/client/plugins/cluescrolls/clue_scroll.png new file mode 100644 index 0000000000000000000000000000000000000000..c4f28ce63b1136ba1cc36c24b93b69bcb5c4aae6 GIT binary patch literal 15191 zcmeI3eN%vAiOugfl#pRnOtrza7&UKk{c4J z^Ek0u+|F9H-4H$XIG3?nU$;|jOMN*`oZDG9l᳎Tet3{6@4tuQbxk*SKLhxyK z`sd9#x%u%t-|z4D+|TpE{pWU9RTL*lQY9FMC6$(#s===meA5!=fGc+Dm<(L!I!ji$ zG3=3K;Twnb?o7e3+$UK}JzsBrnxr|qg0garjKXJk3MNdy(&wb;R)&{0GR>^RAiL3j zLMCOc23eiftTa0dm=?CA)5X+uR#@oHR$6D3tu#vXJ`yCbGdv~r*=-It=`+Xzc}Wlp z&A3b&knpVrS)Nc(T5qnB7H}>`s#RpmX+oVV&Cw|ctu9xkSs_&^iELb{!wHRCNsvk% zsU)PKkIX0mk=|u(BCAbBp>p6agRF(;og|KXy9eEIHA+&aHR@YspLQ*cXv2= z$|rZYGlEGb^OzVn?P8rg%Q>V%UaFDv@CKPoC=~vL?#u2B7jn2m>;OgFM>%mqp~PdE ztaRAp^tfz+p;>91u`zbW!MlNvi0N~-a6IR3;btfq?w+wQm=m)(Ts!7??e>_Z-F#s? zKoCM2)9JQ!I2pW}adRFQ%@nqSTgixZ_dMGanVcz^gq|74&iL3FY(h`a7FY_w8PbD$ zB@0{(#d9tT$Jva*RaP~LP+CwRtg0O8Q+2Gv%6Z+(^mw!-GT)JGjEUkIBXH)*m1;Sm zv#6A$N<*qtS;E3pLP>(ks2pa_$~JYx%AqB-N;n6kjLre}kCo!7uapJWLV2t-*~Gc* z6mMkhR5OD+9nE??(g-QTtBNe(Y@7=Wi!rM8c&ui~6Y8cMFVHY(+6m8MBfH8HeYt5q?ys)2-fft^cIv~ZdkX<&JS*O~f)9Z2J^tZ87CnDH7b$%vS?DYB63x^sB)&dw86_^7; zk56lhR1WIvg*ml(0{R@45`1t%xQ487ceHiY!>w?4v^CTViWpV7uo3DA8G};={W}lL zWUv)HEP&?}Jp7hSP~fU>e9+#Dzoz3q)Kn4P-3hLL!0%A}*K) zG8S-~7I7gF!2%H%OamE5>ED&+QG?1}~3yBC8h`3-H$XLXM zL<9>&Trdq}EaE~Uf(0TjmM zP)e6nn=!026T{YZVc6XV;P*2O^C&UwY6FImJs7r#+q!z72*cv{mzwe{zTwk9TirTb zm2&2ToSPZ9*B58<*{p{xCONacPmy@Z_FB|$3 zM|!s1A9~xG@J9cJk^jCw^8O9oyBE%vpUmHm$8Fh@uBpAf-}Rw1zUT)FX7#T>d(L@n zA#rDO&tpVZVq8I8@yE;Qf7cRs8rMBvaq?N?D{rq^y#2M6F3p8kQ-5xpHI~xQP^aWQ z_dd7L`6fO|_uRVUwP%vvyjaI2B+FziS&74C3pWwjOWq@|-y_#1NPcyE!=R;&y|KG_ z^cT&e#<;Dvk6x$fv9srtxAsoB-)#JF*>3Ljw*Rd81iRjKy4O>d@?zn=Lpg(5>k&`Z zEKu{xBGtYkFzSo_{STfp{bhK-e{9pLz72C9ZyUA!M*hgKWaEM3-#&e6&8Js;R-f(p zV*dIgr~b4J8@cjmf-+qOia&Ss(~kacl4M35LPKoB#61wOq?g8Y@6Dzy9>B|FdmZ?*HMA!9O%~ zY@T`i-NW*R6SwAM9Q>muT{a68Eg#)w>q;4av2(?j^Sv9_;Ws|MbnW-vL#eZ${$cm_ z{#`lev{r?dxH{2pxqLf*Z1(AY_9ZPnxJ>1*si`^YSNqF%rTs1I!lIjVGv(biq)uyS zeId8?g@aqx9=`O--L~F}$`2~%9d&lTGv4sUq7w@y+Pm|%`uniI|9L4uviq&yzVTqw z`Ge1VSJI%ByyN+C+DUcIbx+>Dq91j~PZaxYi=ZbGLf)_rEvy z6YaphxW+_@bIqaqE3t{bx}wVQk!QVk$GzB>kL~TaSp4dk@ak)6VTI{He#83z0S7AW A!vFvP literal 0 HcmV?d00001 diff --git a/runelite-client/src/main/resources/net/runelite/client/plugins/cluescrolls/emote.png b/runelite-client/src/main/resources/net/runelite/client/plugins/cluescrolls/emote.png new file mode 100644 index 0000000000000000000000000000000000000000..f3ba43846af41fba378bf49230d3fe721c0952b0 GIT binary patch literal 650 zcmeAS@N?(olHy`uVBq!ia0vp^5+KaM3?#3wJbMaAv7|ftIx;Y9?C1WI$O_~uBzpw; zGB8xBF)%c=FfjZA3N^f7U???UV0e|lz+g3lfkC`r&aOZkphRYXPlzj!W?*FL=$SQh z?wTD(E-WMflD&xi4?7{r@KY>W-H4J15v$={eYFKP^>d z0ohd&&pIsiC2_e>y9pqC{S9^)5S4F<9zSL zz~W{FftKR(rfJNoET%I|+W!5Qzsa0qJ=bQ-?*l!*3-6q(vij?P;ma$fpyeg}_x)@G zv|X!S+&jbA5UKawkFJ<(?AjN~TQ+uMFKsZ5`{qA^5o?e?ER?p{p` z89g>hGI<*&u<&|q59wU*KQrp+`GARyIttD8Z{{4*l6^ksb-&g=hVtn`!H<6ZRW#Us zt#!)1+5f$B|6CQHRR8S%74@X;0&>Ae?nVH^OSQx`q9i4;B-JXpC>2OC7#SFv=^7a6 z8XAWf8Cn^bTbUSX8vq#w%jKDXX#hz>ZhlH;S|x4`*PM2R05vdpy85}Sb4q9e0HhrH AFaQ7m literal 0 HcmV?d00001 diff --git a/runelite-client/src/main/resources/net/runelite/client/plugins/cluescrolls/spade.png b/runelite-client/src/main/resources/net/runelite/client/plugins/cluescrolls/spade.png new file mode 100644 index 0000000000000000000000000000000000000000..092326b31f299f50017c148a94a233c98094ca54 GIT binary patch literal 15302 zcmeI3eQXnD9LH}s9ZV-g1tu@crLZ`|+Pmv}&#o}m;RbZ_GGq%ucD+8`F0{SUyU}h) zco{EZz!8iC5lkSy5F<(q0TBXXGBF`yAebl^68OUa8A4>n8Sv$~wrg+Cx+haH{_`|x z?|#qk`F@|f&-47A-aofxUfuIWg%b)XiYltD@h*VJN$@*y-;%PoX=(LxV6-1v(K9MHD_!VMzM&@LX$V z40N)Ky1c?rsSQXs_~y}7atzQmlietC7ANg+nK+xvX||TrW|p%vtc&5SMwa7Q7teBZ z`eX1E!ZUX)5abtlXQhXOQH7yJRiiw^#N%;O++vbr%?#&qxfs^Wn9WAm!>F`HR3TxE zC{t1<{XSlxh%qUuN^*qOd$(%??sz5<-;WOe~X26c96- zXlpE#ytIJGfDj0Sh^jyxms1yQkyTk~k%t&ElOA$lI43?|X6&5T8xH3jT2ZT4LIi1~ zIh9I%TNE%0fFifXL{PmF-pZ6*cdtsp?Bon^(lSF{J4i@F$h1sKmRt&{8FIsW<*Q;q zP~}*?EQdU)RW`35Azf9atttmywpfY;Xt|wlGUw5Y6<;NXAZojrN7M=e1l-Jk z*6d|vlxdkXcmjt`ZIWL{4F&PUz4J zb&0evHC4I?v1ARVTH#|Je8OZhkC=nXGqa05$dl|HJxEu?iwuGQ!G{DFo)3~GxDX)t zkl@1eL9zrF0t6otTzEc6mf%8w;6s87&j-m8TnG?+NO0l#AX$P70fG++E<7J3OK>4T z@FBs4=YwPkE(8cZB)IT=kSxK40Kta@7oHE2CAbhE_>kbj^Fgu%7Xkzy5?pvbNS5G2 zfZ#)d3(p715?lxnd`NKN`5;+>3ju-;2`)SzBuj81K=2{Kh3A802`&T(J|wvCe2^@` zg#f{a1Q(tUk|nqhAo!5r!t+701Q!AX9}--6K1i0}LV(~yEUv=rOPe49-_(r5S2Fun z`McrkoU~Z8z(-N-r4+TcgQ9->6CQ6+R4YqSH=8Jm-$ha5pSX15 z+sZj3=8q}3^Lu_tiF?eru61>jH~eylp1p&fR-WIP-?)9_)~VY=-#7R>%Gk;cpUf$n zpD1I_?>l+*R7dE|+TvS19mmdfI^^Kn@0GrMvvkXh8!fKJ!yhz$3Px?adtm*HGv|dT zP9L0|7`x>~+u6;0S6}{I!vSO7(em>v)RK$mzFAj&c-Ps_kK~W&Uc1{HEzest=Fr^{ zmybR6>RV4I#*TWutc^7-J8qXJd~CSdReH&`DgNQksh>T^@87g;T4&RRUz<*!TiQ|3 zP_l8xYN1CNUp9HC@7kG3bLbyz7rL+g*wo!~V#Y<5{qAzj=!ri)^Gfx;&a&P$Q}1>@ zzG98zi?8z@I-cj+gY_VNd!BmMnT{Tu<*iXFL9Q zcuxM(qkHCG7wvnS?0fHz?peC$;I`7AZ|(B-6>XE>xL&wqqiJUOJ#*dtUT1J~*OV`< duk{sE?+5q4`_z@MV%nRwwbgark7hQl{|hxezZ(Dm literal 0 HcmV?d00001 From 14aa57e126393bdd6a38ce3c7cbe2a15bb9b8f0c Mon Sep 17 00:00:00 2001 From: Lotto Date: Mon, 26 Mar 2018 17:25:58 +0200 Subject: [PATCH 08/10] runelite-client: revamp clue scroll plugin --- .../cluescrolls/ClueScrollEmoteOverlay.java | 144 ++++++ .../cluescrolls/ClueScrollOverlay.java | 48 +- .../plugins/cluescrolls/ClueScrollPlugin.java | 279 ++++++++++-- .../cluescrolls/ClueScrollWorldOverlay.java | 88 ++++ .../cluescrolls/clues/AnagramClue.java | 214 +++++++++ .../plugins/cluescrolls/clues/CipherClue.java | 123 +++++ .../plugins/cluescrolls/clues/ClueScroll.java | 36 ++ .../cluescrolls/clues/CoordinateClue.java | 69 +++ .../cluescrolls/clues/CrypticClue.java | 419 ++++++++++++++++++ .../plugins/cluescrolls/clues/Emote.java | 75 ++++ .../plugins/cluescrolls/clues/EmoteClue.java | 241 ++++++++++ .../cluescrolls/clues/FairyRingClue.java | 103 +++++ .../plugins/cluescrolls/clues/MapClue.java | 174 ++++++++ .../cluescrolls/clues/NpcClueScroll.java | 30 ++ .../cluescrolls/clues/ObjectClueScroll.java | 30 ++ .../cluescrolls/clues/TextClueScroll.java | 30 ++ 16 files changed, 2032 insertions(+), 71 deletions(-) create mode 100644 runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/ClueScrollEmoteOverlay.java create mode 100644 runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/ClueScrollWorldOverlay.java create mode 100644 runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/clues/AnagramClue.java create mode 100644 runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/clues/CipherClue.java create mode 100644 runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/clues/ClueScroll.java create mode 100644 runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/clues/CoordinateClue.java create mode 100644 runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/clues/CrypticClue.java create mode 100644 runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/clues/Emote.java create mode 100644 runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/clues/EmoteClue.java create mode 100644 runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/clues/FairyRingClue.java create mode 100644 runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/clues/MapClue.java create mode 100644 runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/clues/NpcClueScroll.java create mode 100644 runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/clues/ObjectClueScroll.java create mode 100644 runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/clues/TextClueScroll.java diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/ClueScrollEmoteOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/ClueScrollEmoteOverlay.java new file mode 100644 index 0000000000..b7ffe30fc6 --- /dev/null +++ b/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/ClueScrollEmoteOverlay.java @@ -0,0 +1,144 @@ +/* + * Copyright (c) 2018, Lotto + * 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; + +import java.awt.Color; +import java.awt.Dimension; +import java.awt.FontMetrics; +import java.awt.Graphics2D; +import java.awt.Point; +import java.awt.Rectangle; +import java.awt.geom.Area; +import javax.inject.Inject; +import net.runelite.api.Client; +import net.runelite.api.widgets.Widget; +import net.runelite.api.widgets.WidgetInfo; +import net.runelite.client.plugins.cluescrolls.clues.ClueScroll; +import net.runelite.client.plugins.cluescrolls.clues.EmoteClue; +import net.runelite.client.ui.overlay.Overlay; +import net.runelite.client.ui.overlay.OverlayLayer; +import net.runelite.client.ui.overlay.OverlayPosition; +import net.runelite.client.ui.overlay.OverlayUtil; +import net.runelite.client.ui.overlay.components.TextComponent; + +public class ClueScrollEmoteOverlay extends Overlay +{ + private static final Color HIGHLIGHT_BORDER_COLOR = Color.ORANGE; + private static final Color HIGHLIGHT_HOVER_BORDER_COLOR = HIGHLIGHT_BORDER_COLOR.darker(); + private static final Color HIGHLIGHT_FILL_COLOR = new Color(0, 255, 0, 20); + + private final ClueScrollPlugin plugin; + private final Client client; + private final TextComponent textComponent = new TextComponent(); + + @Inject + public ClueScrollEmoteOverlay(ClueScrollPlugin plugin, Client client) + { + setPosition(OverlayPosition.DYNAMIC); + setLayer(OverlayLayer.ABOVE_WIDGETS); + this.plugin = plugin; + this.client = client; + } + + @Override + public Dimension render(Graphics2D graphics) + { + ClueScroll clue = plugin.getClue(); + + if (clue == null || !(clue instanceof EmoteClue)) + { + return null; + } + + EmoteClue emoteClue = (EmoteClue) clue; + + if (!emoteClue.getFirstEmote().hasSprite()) + { + return null; + } + + Widget emoteContainer = client.getWidget(WidgetInfo.EMOTE_CONTAINER); + + if (emoteContainer == null || emoteContainer.isHidden()) + { + return null; + } + + Widget emoteWindow = client.getWidget(WidgetInfo.EMOTE_WINDOW); + + if (emoteWindow == null) + { + return null; + } + + for (Widget emoteWidget : emoteContainer.getDynamicChildren()) + { + if (emoteWidget.getSpriteId() == emoteClue.getFirstEmote().getSpriteId()) + { + highlightWidget(graphics, emoteWindow, emoteWidget, + emoteClue.getSecondEmote() != null ? "1st" : ""); + } + else if (emoteClue.getSecondEmote() != null + && emoteWidget.getSpriteId() == emoteClue.getSecondEmote().getSpriteId()) + { + highlightWidget(graphics, emoteWindow, emoteWidget, "2nd"); + } + } + + return null; + } + + private void highlightWidget(Graphics2D graphics, Widget window, Widget widget, String text) + { + net.runelite.api.Point canvasLocation = widget.getCanvasLocation(); + + if (canvasLocation == null) + { + return; + } + + // Don't draw outside the emotes window + net.runelite.api.Point windowLocation = window.getCanvasLocation(); + + if (windowLocation.getY() > canvasLocation.getY() + || windowLocation.getY() + window.getHeight() < canvasLocation.getY() + widget.getHeight()) + { + return; + } + + Area widgetArea = new Area(new Rectangle(canvasLocation.getX(), canvasLocation.getY(), widget.getWidth(), widget.getHeight())); + + OverlayUtil.renderHoverableArea(graphics, widgetArea, client.getMouseCanvasPosition(), + HIGHLIGHT_FILL_COLOR, HIGHLIGHT_BORDER_COLOR, HIGHLIGHT_HOVER_BORDER_COLOR); + + FontMetrics fontMetrics = graphics.getFontMetrics(); + + textComponent.setPosition(new Point( + canvasLocation.getX() + widget.getWidth() / 2 - fontMetrics.stringWidth(text) / 2, + canvasLocation.getY() + fontMetrics.getHeight())); + textComponent.setText(text); + textComponent.render(graphics); + } +} 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 76ff14f312..6b27a90a0c 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 @@ -1,5 +1,6 @@ /* * Copyright (c) 2016-2017, Seth + * Copyright (c) 2018, Lotto * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -22,72 +23,43 @@ * 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; +import java.awt.Color; import java.awt.Dimension; import java.awt.Graphics2D; -import java.time.Duration; -import java.time.Instant; import javax.inject.Inject; -import net.runelite.api.Client; -import net.runelite.api.ItemComposition; +import net.runelite.client.plugins.cluescrolls.clues.ClueScroll; import net.runelite.client.ui.overlay.Overlay; -import net.runelite.client.ui.overlay.OverlayPosition; import net.runelite.client.ui.overlay.components.PanelComponent; public class ClueScrollOverlay extends Overlay { - private static final Duration WAIT_DURATION = Duration.ofMinutes(4); + public static final Color TITLED_CONTENT_COLOR = new Color(190, 190, 190); - private final Client client; + private final ClueScrollPlugin plugin; private final PanelComponent panelComponent = new PanelComponent(); - ClueScroll clue; - Instant clueTimeout; - @Inject - public ClueScrollOverlay(Client client) + public ClueScrollOverlay(ClueScrollPlugin plugin) { - setPosition(OverlayPosition.TOP_LEFT); - this.client = client; + this.plugin = plugin; } @Override public Dimension render(Graphics2D graphics) { + ClueScroll clue = plugin.getClue(); + if (clue == null) { return null; } - if (clueTimeout == null || Instant.now().compareTo(clueTimeout.plus(WAIT_DURATION)) >= 0) - { - return null; - } - panelComponent.getLines().clear(); - panelComponent.setTitle("Required items"); - if (clue.getIds().length == 0) - { - panelComponent.getLines().add(new PanelComponent.Line("None", "")); - } - else - { - for (int id : clue.getIds()) - { - ItemComposition clueItem = client.getItemDefinition(id); - - if (clueItem == null) - { - continue; - } - - panelComponent.getLines().add(new PanelComponent.Line(clueItem.getName(), "")); - } - } + clue.makeOverlayHint(panelComponent, plugin); return panelComponent.render(graphics); } diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/ClueScrollPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/ClueScrollPlugin.java index 5663b232c9..9b3a00e76d 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/ClueScrollPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/ClueScrollPlugin.java @@ -1,5 +1,6 @@ /* * Copyright (c) 2016-2017, Seth + * Copyright (c) 2018, Lotto * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -22,36 +23,111 @@ * 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; +import com.google.common.eventbus.Subscribe; +import java.time.Duration; import java.time.Instant; import java.time.temporal.ChronoUnit; +import java.util.Arrays; +import java.util.Collection; +import java.util.HashSet; +import java.util.Set; import javax.inject.Inject; +import lombok.Getter; +import lombok.extern.slf4j.Slf4j; +import net.runelite.api.ChatMessageType; import net.runelite.api.Client; +import net.runelite.api.GameObject; import net.runelite.api.GameState; +import net.runelite.api.InventoryID; +import net.runelite.api.Item; +import net.runelite.api.NPC; +import net.runelite.api.Query; +import net.runelite.api.coords.WorldPoint; +import net.runelite.api.events.ChatMessage; +import net.runelite.api.queries.GameObjectQuery; +import net.runelite.api.queries.InventoryItemQuery; +import net.runelite.api.queries.NPCQuery; import net.runelite.api.widgets.Widget; import net.runelite.api.widgets.WidgetInfo; import net.runelite.client.plugins.Plugin; import net.runelite.client.plugins.PluginDescriptor; +import net.runelite.client.plugins.cluescrolls.clues.AnagramClue; +import net.runelite.client.plugins.cluescrolls.clues.CipherClue; +import net.runelite.client.plugins.cluescrolls.clues.ClueScroll; +import net.runelite.client.plugins.cluescrolls.clues.CoordinateClue; +import net.runelite.client.plugins.cluescrolls.clues.CrypticClue; +import net.runelite.client.plugins.cluescrolls.clues.EmoteClue; +import net.runelite.client.plugins.cluescrolls.clues.FairyRingClue; +import net.runelite.client.plugins.cluescrolls.clues.MapClue; +import net.runelite.client.plugins.cluescrolls.clues.NpcClueScroll; +import net.runelite.client.plugins.cluescrolls.clues.ObjectClueScroll; +import net.runelite.client.plugins.cluescrolls.clues.TextClueScroll; import net.runelite.client.task.Schedule; +import net.runelite.client.ui.overlay.Overlay; +import net.runelite.client.util.QueryRunner; @PluginDescriptor( name = "Clue Scroll" ) +@Slf4j public class ClueScrollPlugin extends Plugin { + private static final Duration WAIT_DURATION = Duration.ofMinutes(4); + + @Getter + private ClueScroll clue; + + @Getter + private NPC[] npcsToMark; + + @Getter + private GameObject[] objectsToMark; + + @Getter + private Set equippedItems; + + @Getter + private Instant clueTimeout; + @Inject + @Getter private Client client; + @Inject + private QueryRunner queryRunner; + @Inject private ClueScrollOverlay clueScrollOverlay; + @Inject + private ClueScrollEmoteOverlay clueScrollEmoteOverlay; + + @Inject + private ClueScrollWorldOverlay clueScrollWorldOverlay; + @Override - public ClueScrollOverlay getOverlay() + public Collection getOverlays() { - return clueScrollOverlay; + return Arrays.asList(clueScrollOverlay, clueScrollEmoteOverlay, clueScrollWorldOverlay); + } + + @Subscribe + public void onChatMessage(ChatMessage event) + { + if (event.getType() != ChatMessageType.SERVER) + { + return; + } + + if (!event.getMessage().equals("Well done, you've completed the Treasure Trail!")) + { + return; + } + + clue = null; } @Schedule( @@ -60,64 +136,201 @@ public class ClueScrollPlugin extends Plugin ) public void checkForClues() { - if (client.getGameState() != GameState.LOGGED_IN) + if (client.getGameState() == GameState.LOGIN_SCREEN) { + clue = null; return; } - Widget clueScroll = client.getWidget(WidgetInfo.CLUE_SCROLL_TEXT); + npcsToMark = null; + objectsToMark = null; + equippedItems = null; - if (clueScroll == null) + if (clue instanceof NpcClueScroll) { - return; + String npc = ((NpcClueScroll) clue).getNpc(); + + if (npc != null) + { + Query query = new NPCQuery().nameContains(npc); + npcsToMark = queryRunner.runQuery(query); + } } - //remove line breaks and also the rare occasion where there are double line breaks - ClueScroll clue = ClueScroll.forText(clueScroll.getText().replaceAll("
", " ").replaceAll(" ", " ").toLowerCase()); - - if (clue == null) + if (clue instanceof ObjectClueScroll) { - clueScrollOverlay.clue = null; - return; + int objectId = ((ObjectClueScroll) clue).getObjectId(); + + if (objectId != -1) + { + GameObjectQuery query = new GameObjectQuery().idEquals(); + objectsToMark = queryRunner.runQuery(query); + } } - if (clue.getType() == ClueScrollType.EMOTE) + if (clue instanceof EmoteClue) { - clueScrollOverlay.clue = clue; + equippedItems = new HashSet<>(); - clueScrollOverlay.clueTimeout = Instant.now(); - return; + Item[] result = queryRunner.runQuery(new InventoryItemQuery(InventoryID.EQUIPMENT)); + + if (result != null) + { + for (Item item : result) + { + equippedItems.add(item.getId()); + } + } } - clueScrollOverlay.clue = null; + ClueScroll clue = findClueScroll(); - //check for which tells us if the string has already been built - if (clueScroll.getText().contains("")) + if (clue == null && this.clue != null) { - return; + // If clue window isn't open, and we don't have a map clue in inventory, + // but we have recorded the player having a clue, + // wait for WAIT_DURATION before discarding the knowledge of the player having a clue. + if (Instant.now().compareTo(clueTimeout.plus(WAIT_DURATION)) < 0) + { + return; + } } - //Build widget text - StringBuilder clueText = new StringBuilder(); - - clueText.append(clueScroll.getText()).append("

"); - - if (clue.getNpc() != null) + // If we have a clue, save that knowledge + // so the clue window doesn't have to be open. + if (clue != null) { - clueText.append("Talk to: ").append(clue.getNpc()).append("
"); + this.clue = clue; + this.clueTimeout = Instant.now(); + } + } + + private ClueScroll findClueScroll() + { + Widget clueScrollText = client.getWidget(WidgetInfo.CLUE_SCROLL_TEXT); + + if (clueScrollText != null) + { + // Remove line breaks and also the rare occasion where there are double line breaks + String text = clueScrollText.getText() + .replaceAll("-
", "-") + .replaceAll("
", " ") + .replaceAll("[ ]+", " ") + .toLowerCase(); + + if (clue != null && clue instanceof TextClueScroll) + { + if (((TextClueScroll) clue).getText().equalsIgnoreCase(text)) + { + return clue; + } + } + + if (text.startsWith("this anagram reveals who to speak to next:")) + { + return AnagramClue.forText(text); + } + else if (text.startsWith("the cipher reveals who to speak to next:")) + { + return CipherClue.forText(text); + } + else if (text.contains("degrees") && text.contains("minutes")) + { + return coordinatesToWorldPoint(text); + } + else + { + CrypticClue crypticClue = CrypticClue.forText(text); + + if (crypticClue != null) + { + return crypticClue; + } + + EmoteClue emoteClue = EmoteClue.forText(text); + + if (emoteClue != null) + { + return emoteClue; + } + + return FairyRingClue.forText(text); + } } - if (clue.getLocation() != null) + Item[] result = queryRunner.runQuery(new InventoryItemQuery(InventoryID.INVENTORY)); + + if (result == null) { - clueText.append("Location: ").append(clue.getLocation()).append("
"); + return null; } - if (clue.getAnswer() != null) + for (Item item : result) { - clueText.append("Answer: ").append(clue.getAnswer()); + MapClue clue = MapClue.forItemId(item.getId()); + + if (clue != null) + { + return clue; + } } - clueScroll.setText(clueText.toString()); + return null; + } + /** + * Example input: "00 degrees 00 minutes north 07 degrees 13 minutes west" + */ + private CoordinateClue coordinatesToWorldPoint(String text) + { + String[] splitText = text.split(" "); + + if (splitText.length != 10) + { + log.warn("Splitting \"" + text + "\" did not result in an array of 10 cells"); + return null; + } + + if (!splitText[1].equals("degrees") || !splitText[3].equals("minutes")) + { + log.warn("\"" + text + "\" is not a well formed coordinate string"); + return null; + } + + int degY = Integer.parseInt(splitText[0]); + int minY = Integer.parseInt(splitText[2]); + + if (splitText[4].equals("south")) + { + degY *= -1; + minY *= -1; + } + + int degX = Integer.parseInt(splitText[5]); + int minX = Integer.parseInt(splitText[7]); + + if (splitText[9].equals("west")) + { + degX *= -1; + minX *= -1; + } + + return new CoordinateClue(text, coordinatesToWorldPoint(degX, minX, degY, minY)); + } + + /** + * This conversion is explained on + * http://oldschoolrunescape.wikia.com/wiki/Treasure_Trails/Guide/Coordinates + */ + private WorldPoint coordinatesToWorldPoint(int degX, int minX, int degY, int minY) + { + // Center of the Observatory + int x2 = 2440; + int y2 = 3161; + + x2 += degX * 32 + Math.round(minX / 1.875); + y2 += degY * 32 + Math.round(minY / 1.875); + + return new WorldPoint(x2, y2, 0); } } diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/ClueScrollWorldOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/ClueScrollWorldOverlay.java new file mode 100644 index 0000000000..1fb438963c --- /dev/null +++ b/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/ClueScrollWorldOverlay.java @@ -0,0 +1,88 @@ +/* + * Copyright (c) 2018, Lotto + * 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; + +import java.awt.Color; +import java.awt.Dimension; +import java.awt.Graphics2D; +import java.awt.image.BufferedImage; +import java.io.IOException; +import javax.imageio.ImageIO; +import javax.inject.Inject; +import net.runelite.client.plugins.cluescrolls.clues.ClueScroll; +import net.runelite.client.ui.overlay.Overlay; +import net.runelite.client.ui.overlay.OverlayPosition; + +public class ClueScrollWorldOverlay extends Overlay +{ + public static final int IMAGE_Z_OFFSET = 30; + + public static final BufferedImage EMOTE_IMAGE; + public static final BufferedImage CLUE_SCROLL_IMAGE; + public static final BufferedImage SPADE_IMAGE; + + public static final Color CLICKBOX_BORDER_COLOR = Color.ORANGE; + public static final Color CLICKBOX_HOVER_BORDER_COLOR = CLICKBOX_BORDER_COLOR.darker(); + public static final Color CLICKBOX_FILL_COLOR = new Color(0, 255, 0, 20); + + private final ClueScrollPlugin plugin; + + static + { + try + { + synchronized (ImageIO.class) + { + EMOTE_IMAGE = ImageIO.read(ClueScrollPlugin.class.getResourceAsStream("emote.png")); + CLUE_SCROLL_IMAGE = ImageIO.read(ClueScrollPlugin.class.getResourceAsStream("clue_scroll.png")); + SPADE_IMAGE = ImageIO.read(ClueScrollPlugin.class.getResourceAsStream("spade.png")); + } + } + catch (IOException e) + { + throw new RuntimeException(e); + } + } + + @Inject + public ClueScrollWorldOverlay(ClueScrollPlugin plugin) + { + setPosition(OverlayPosition.DYNAMIC); + this.plugin = plugin; + } + + @Override + public Dimension render(Graphics2D graphics) + { + ClueScroll clue = plugin.getClue(); + + if (clue != null) + { + clue.makeWorldOverlayHint(graphics, plugin); + } + + return null; + } +} diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/clues/AnagramClue.java b/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/clues/AnagramClue.java new file mode 100644 index 0000000000..44ccec7114 --- /dev/null +++ b/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/clues/AnagramClue.java @@ -0,0 +1,214 @@ +/* + * Copyright (c) 2018, Lotto + * 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 com.google.common.collect.ImmutableSet; +import java.awt.Color; +import java.awt.Graphics2D; +import java.util.Set; +import lombok.Getter; +import net.runelite.api.NPC; +import net.runelite.api.coords.WorldPoint; +import net.runelite.client.plugins.cluescrolls.ClueScrollPlugin; +import net.runelite.client.ui.overlay.OverlayUtil; +import net.runelite.client.ui.overlay.components.PanelComponent; +import static net.runelite.client.plugins.cluescrolls.ClueScrollOverlay.TITLED_CONTENT_COLOR; +import static net.runelite.client.plugins.cluescrolls.ClueScrollWorldOverlay.CLUE_SCROLL_IMAGE; +import static net.runelite.client.plugins.cluescrolls.ClueScrollWorldOverlay.IMAGE_Z_OFFSET; + +@Getter +public class AnagramClue extends ClueScroll implements TextClueScroll, NpcClueScroll +{ + private static final Set CLUES = ImmutableSet.of( + new AnagramClue("This anagram reveals who to speak to next: A BAKER", "Baraek", new WorldPoint(3217, 3434, 0), "Varrock square", "5"), + new AnagramClue("This anagram reveals who to speak to next: A BASIC ANTI POT", "Captain Tobias", new WorldPoint(3026, 3216, 0), "Port Sarim", "7"), + new AnagramClue("This anagram reveals who to speak to next: A HEART", "Aretha", new WorldPoint(1814, 3851, 0), "Soul altar", "2"), + new AnagramClue("This anagram reveals who to speak to next: A ZEN SHE", "Zenesha", new WorldPoint(2652, 3295, 0), "Platebody Southern Ardougne centre square"), + new AnagramClue("This anagram reveals who to speak to next: ACE MATCH ELM", "Cam The Camel", new WorldPoint(3300, 3231, 0), "North of the glider in Al Kharid"), + new AnagramClue("This anagram reveals who to speak to next: AHA JAR", "Jaraah", new WorldPoint(3359, 3276, 0), "Duel Arena hosptial"), + new AnagramClue("This anagram reveals who to speak to next: AN PAINT TONIC", "Captain Ninto", new WorldPoint(2865, 9877, 0), "Bar under White Wolf Mountain"), + new AnagramClue("This anagram reveals who to speak to next: ARC O LINE", "Caroline", new WorldPoint(2715, 3302, 0), "North Witchaven next to the row boat", "11"), + new AnagramClue("This anagram reveals who to speak to next: ARE COL", "Oracle", new WorldPoint(3013, 3501, 0), "Ice Mountain West of Edgeville", "48"), + new AnagramClue("This anagram reveals who to speak to next: ARMCHAIR THE PELT", "Charlie the Tramp", new WorldPoint(3209, 3392, 0), "South entrance of Varrock", "0"), + new AnagramClue("This anagram reveals who to speak to next: ARR! SO I AM A CRUST, AND?", "Ramara du Croissant", new WorldPoint(2339, 3677, 0), "Piscatoris Fishing Colony"), + new AnagramClue("This anagram reveals who to speak to next: AT HERG", "Regath", new WorldPoint(1719, 3723, 0), "General Store, Arceuus, Zeah", "25"), + new AnagramClue("This anagram reveals who to speak to next: A BAS", "Saba", new WorldPoint(2858, 3577, 0), "Death Plateau"), + new AnagramClue("This anagram reveals who to speak to next: AREA CHEF TREK", "Father Aereck", new WorldPoint(3243, 3208, 0), "Lumbridge Church", "19 or 20"), + new AnagramClue("This anagram reveals who to speak to next: BAIL TRIMS", "Brimstail", new WorldPoint(2402, 3419, 0), "West of Stronghold Slayer Cave"), + new AnagramClue("This anagram reveals who to speak to next: BAKER CLIMB", "Brambickle", new WorldPoint(2783, 3861, 0), "Trollweiss mountain"), + new AnagramClue("This anagram reveals who to speak to next: BY LOOK", "Bolkoy", new WorldPoint(2529, 3162, 0), "Tree Gnome Village general store", "13"), + new AnagramClue("This anagram reveals who to speak to next: MOTHERBOARD", "Lumbridge Guide", new WorldPoint(3232, 3232, 0), "Monastery south of Ardougne", "129"), + new AnagramClue("This anagram reveals who to speak to next: CAR IF ICES", "Sacrifice", new WorldPoint(2209, 3056, 0), "Zul-Andra"), + new AnagramClue("This anagram reveals who to speak to next: CAREER IN MOON", "Oneiromancer", new WorldPoint(2150, 3866, 0), "Astral altar", "25"), + new AnagramClue("This anagram reveals who to speak to next: C ON GAME HOC", "Gnome Coach", new WorldPoint(2395, 3486, 0), "Gnome Ball course", "6"), + new AnagramClue("This anagram reveals who to speak to next: COOL NERD", "Old Crone", new WorldPoint(3462, 3557, 0), "East of the Slayer Tower", "619"), + new AnagramClue("This anagram reveals who to speak to next: COPPER ORE CRYPTS", "Prospector Percy", new WorldPoint(3061, 3377, 0), "Motherlode Mine", "12"), + new AnagramClue("This anagram reveals who to speak to next: DED WAR", "Edward", new WorldPoint(3284, 3943, 0), "Inside Rogue's Castle"), + new AnagramClue("This anagram reveals who to speak to next: DEKAGRAM", "Dark Mage", new WorldPoint(3039, 4835, 0), "Centre of the Abyss", "13"), + new AnagramClue("This anagram reveals who to speak to next: DO SAY MORE", "Doomsayer", new WorldPoint(3230, 3230, 0), "East of Lumbridge Castle", "95"), + new AnagramClue("This anagram reveals who to speak to next: DIM THARN", "Mandrith", new WorldPoint(3182, 3946, 0), "Wilderness Resource Area", "28 or Puzzle box"), + new AnagramClue("This anagram reveals who to speak to next: DR HITMAN", "Mandrith", new WorldPoint(3182, 3946, 0), "Wilderness Resource Area", "28, Light box or Puzzle box"), + new AnagramClue("This anagram reveals who to speak to next: DR WARDEN FUNK", "Drunken Dwarf", new WorldPoint(2913, 10221, 0), "East Side of Keldagrim"), + new AnagramClue("This anagram reveals who to speak to next: DRAGONS LAMENT", "Strange old Man", new WorldPoint(3564, 3288, 0), "Barrows", "40"), + new AnagramClue("This anagram reveals who to speak to next: DT RUN B", "Brundt the Chieftain", new WorldPoint(2658, 3670, 0), "Rellekka, main hall", "4"), + new AnagramClue("This anagram reveals who to speak to next: DUO PLUG", "Dugopul", new WorldPoint(2803, 2744, 0), "Graveyard on Ape Atoll"), + new AnagramClue("This anagram reveals who to speak to next: EEK ZERO OP", "Zookeeper", new WorldPoint(2613, 3269, 0), "Ardougne Zoo", "40"), + new AnagramClue("This anagram reveals who to speak to next: EL OW", "Lowe", new WorldPoint(3233, 3423, 0), "Varrock archery store"), + new AnagramClue("This anagram reveals who to speak to next: ERR CURE IT", "Recruiter", new WorldPoint(2541, 3305, 0), "West Ardougne centre square", "20"), + new AnagramClue("This anagram reveals who to speak to next: FORLUN", "Runolf", new WorldPoint(2512, 10256, 0), "Miscellania & Etceteria Dungeon"), + new AnagramClue("This anagram reveals who to speak to next: GOBLIN KERN", "King Bolren", new WorldPoint(2541, 3170, 0), "Tree Gnome Village"), + new AnagramClue("This anagram reveals who to speak to next: GOT A BOY", "Gabooty", new WorldPoint(2790, 3066, 0), "Centre of Tai Bwo Wannai", "11"), + new AnagramClue("This anagram reveals who to speak to next: GULAG RUN", "Uglug Nar", new WorldPoint(2442, 3051, 0), "West of Jiggig"), + new AnagramClue("This anagram reveals who to speak to next: GOBLETS ODD TOES", "Otto Godblessed", new WorldPoint(2501, 3487, 0), "Otto's Grotto", "2"), + new AnagramClue("This anagram reveals who to speak to next: HALT US", "Luthas", new WorldPoint(2938, 3152, 0), "Banana plantation, Karamja", "33 or 0"), + new AnagramClue("This anagram reveals who to speak to next: HE DO POSE. IT IS CULTRRL, MK?", "Riki the sculptor's model", new WorldPoint(2904, 10206, 0), "East Keldagrim, south of kebab seller."), + new AnagramClue("This anagram reveals who to speak to next: HEORIC", "Eohric", new WorldPoint(2900, 3565, 0), "Burthorpe Castle, top floor", "36"), + new AnagramClue("This anagram reveals who to speak to next: HIS PHOR", "Horphis", new WorldPoint(1639, 3812, 0), "Arceuus Library, Zeah", "1"), + new AnagramClue("This anagram reveals who to speak to next: I AM SIR", "Marisi", new WorldPoint(1813, 3488, 0), "Allotment patch, South coast Zeah", "5"), + new AnagramClue("This anagram reveals who to speak to next: ICY FE", "Fycie", new WorldPoint(2630, 2997, 0), "East Feldip Hills"), + new AnagramClue("This anagram reveals who to speak to next: I DOOM ICON INN", "Dominic Onion", new WorldPoint(2609, 3116, 0), "Nightmare Zone", "9,500"), + new AnagramClue("This anagram reveals who to speak to next: I EAT ITS CHART HINTS DO U", "Shiratti the Custodian", new WorldPoint(3427, 2927, 0), "North of fountain, Nardah"), + new AnagramClue("This anagram reveals who to speak to next: I EVEN", "Nieve", new WorldPoint(2432, 3422, 0), "The slayer master in Gnome Stronghold", "2"), + new AnagramClue("This anagram reveals who to speak to next: I FAFFY RUN", "Fairy Nuff", new WorldPoint(3201, 3169, 0), "North of the bank in Zanaris"), + new AnagramClue("This anagram reveals who to speak to next: IM N ZEZIM", "Immenizz", new WorldPoint(2592, 4324, 0), "The Imp inside Puro-Puro"), + new AnagramClue("This anagram reveals who to speak to next: KAY SIR", "Sir Kay", new WorldPoint(2760, 3496, 0), "The courtyard in Camelot Castle", "6"), + new AnagramClue("This anagram reveals who to speak to next: LEAKEY", "Kaylee", new WorldPoint(2957, 3370, 0), "Rising Sun Inn in Falador", "18"), + new AnagramClue("This anagram reveals who to speak to next: LAND DOOMD", "Odd Old Man", new WorldPoint(3359, 3506, 0), "Limestone mine northeast of Varrock"), + new AnagramClue("This anagram reveals who to speak to next: LARK IN DOG", "King Roald", new WorldPoint(3220, 3476, 0), "Ground floor of Varrock castle", "24"), + new AnagramClue("This anagram reveals who to speak to next: LOW LAG", "Gallow", new WorldPoint(1805, 3566, 0), "Vinery in the Great Kourend", "12"), + new AnagramClue("This anagram reveals who to speak to next: LADDER MEMO GUV", "Guard Vemmeldo", new WorldPoint(2447, 3418, 0), "Gnome Stronghold Bank", "3"), + new AnagramClue("This anagram reveals who to speak to next: I AM SIR", "Ambassador Alvijar", new WorldPoint(2721, 5358, 0), "Allotment patch, South coast Zeah", "5"), + new AnagramClue("This anagram reveals who to speak to next: MAL IN TAU", "Luminata", new WorldPoint(3508, 3237, 0), "Near Burgh de Rott entrance"), + new AnagramClue("This anagram reveals who to speak to next: ME AM THE CALC", "Cam the Camel", new WorldPoint(3300, 3231, 0), "Outside Duel Arena"), + new AnagramClue("This anagram reveals who to speak to next: MACHETE CLAM", "Cam the Camel", new WorldPoint(3300, 3231, 0), "Outside Duel Arena", "6"), + new AnagramClue("This anagram reveals who to speak to next: ME IF", "Femi", new WorldPoint(2461, 3382, 0), "Gates of Tree Gnome Stronghold"), + new AnagramClue("This anagram reveals who to speak to next: MOLD LA RAN", "Old Man Ral", new WorldPoint(3602, 3209, 0), "Meiyerditch"), + new AnagramClue("This anagram reveals who to speak to next: MOTHERBOARD", "Brother Omad", new WorldPoint(2606, 3211, 0), "Monastery south of Ardougne", "129"), + new AnagramClue("This anagram reveals who to speak to next: MUS KIL READER", "Radimus Erkle", new WorldPoint(2726, 3368, 0), "Legends' Guild"), + new AnagramClue("This anagram reveals who to speak to next: MY MANGLE LAL", "Lammy Langle", new WorldPoint(1688, 3540, 0), "Hosidius House spirit tree patch"), + new AnagramClue("This anagram reveals who to speak to next: NO OWNER", "Oronwen", new WorldPoint(1162, 3178, 0), "Lletya Seamstress shop in Lletya", "20"), + new AnagramClue("This anagram reveals who to speak to next: NOD MED", "Edmond", new WorldPoint(2566, 3332, 0), "Behind the most NW house in East Ardougne", "3"), + new AnagramClue("This anagram reveals who to speak to next: O BIRDZ A ZANY EN PC", "Cap'n Izzy no Beard", new WorldPoint(2807, 3191, 0), "Brimhaven Agility Arena", "33"), + new AnagramClue("This anagram reveals who to speak to next: OK CO", "Cook", new WorldPoint(3207, 3214, 0), "Ground floor of Lumbridge Castle", "9"), + new AnagramClue("This anagram reveals who to speak to next: OR ZINC FUMES WARD", "Wizard Frumscone", new WorldPoint(2594, 3086, 0), "Downstairs in the Wizards' Guild"), + new AnagramClue("This anagram reveals who to speak to next: OUR OWN NEEDS", "Nurse Wooned", new WorldPoint(1578, 3533, 0), "Shayzien House Infirmary", "52"), + new AnagramClue("This anagram reveals who to speak to next: PACINNG A TAIE", "Captain Ginea", new WorldPoint(1561, 3602, 0), "Building east of Shayzien combat ring", "113"), + new AnagramClue("This anagram reveals who to speak to next: PEAK REFLEX", "Flax keeper", new WorldPoint(2744, 3444, 0), "Flax field south of Seers Village", "676"), + new AnagramClue("This anagram reveals who to speak to next: PEATY PERT", "Party Pete", new WorldPoint(3047, 3376, 0), "Falador Party Room"), + new AnagramClue("This anagram reveals who to speak to next: PROFS LOSE WRONG PIE", "Professor Onglewip", new WorldPoint(3113, 3162, 0), "Ground floor Wizards Tower"), + new AnagramClue("This anagram reveals who to speak to next: QUIT HORRIBLE TYRANT", "Brother Tranquility", new WorldPoint(3681, 2963, 0), "Mos Le'Harmless or Harmony Island", "7"), + new AnagramClue("This anagram reveals who to speak to next: QUE SIR", "Squire", new WorldPoint(2975, 3343, 0), "Falador Castle Courtyard", "654"), + new AnagramClue("This anagram reveals who to speak to next: R AK MI", "Karim", new WorldPoint(3273, 3181, 0), "Al Kharid Kebab shop", "5"), + new AnagramClue("This anagram reveals who to speak to next: RAT MAT WITHIN", "Martin Thwait", new WorldPoint(2906, 3537, 0), "Rogues' Den", "2"), + new AnagramClue("This anagram reveals who to speak to next: RED ART TANS", "Trader Stan", new WorldPoint(3041, 3193, 0), "Port Sarim Charter ship"), + new AnagramClue("This anagram reveals who to speak to next: RATAI", "Taria", new WorldPoint(2940, 3223, 0), "Rimmington bush patch", "7"), + new AnagramClue("This anagram reveals who to speak to next: R SLICER", "Clerris", new WorldPoint(1761, 3850, 0), "Arceuus mine, Zeah", "738"), + new AnagramClue("This anagram reveals who to speak to next: SAND NUT", "Dunstan", new WorldPoint(2919, 3574, 0), "Anvil in north east Burthorpe", "8"), + new AnagramClue("This anagram reveals who to speak to next: SEQUIN DIRGE", "Queen Sigrid", new WorldPoint(2612, 3867, 0), "Throne room of Etceteria Castle."), + new AnagramClue("This anagram reveals who to speak to next: SLAM DUSTER GRAIL", "Guildmaster Lars", new WorldPoint(1649, 3498, 0), "Woodcutting guild, Zeah"), + new AnagramClue("This anagram reveals who to speak to next: SLIDE WOMAN", "Wise Old Man", new WorldPoint(3088, 3253, 0), "Draynor Village", "28"), + new AnagramClue("This anagram reveals who to speak to next: SNAH", "Hans", new WorldPoint(3218, 3219, 0), "Lumbridge Castle courtyard"), + new AnagramClue("This anagram reveals who to speak to next: SNAKES SO I SAIL", "Lisse Isaakson", new WorldPoint(2351, 3801, 0), "Neitiznot", "2"), + new AnagramClue("This anagram reveals who to speak to next: TAMED ROCKS", "Dockmaster", new WorldPoint(1822, 3739, 0), "Piscarilius House, NE of General store", "5"), + new AnagramClue("This anagram reveals who to speak to next: TEN WIGS ON", "Wingstone", new WorldPoint(3389, 2877, 0), "Between Nardah & Agility Pyramid"), + new AnagramClue("This anagram reveals who to speak to next: THEM CAL CAME", "Cam the Camel", new WorldPoint(3300, 3231, 0), "Just outside of the Duel Arena"), + new AnagramClue("This anagram reveals who to speak to next: THICKNO", "Hickton", new WorldPoint(2822, 3442, 0), "Catherby fletching shop", "2"), + new AnagramClue("This anagram reveals who to speak to next: TWENTY CURE IRON", "New recruit Tony", new WorldPoint(1498, 3544, 0), "Shayzien House's Graveyard"), + new AnagramClue("This anagram reveals who to speak to next: UNLEASH NIGHT MIST", "Sigli the Huntsman", new WorldPoint(2660, 3654, 0), "Rellekka", "302"), + new AnagramClue("This anagram reveals who to speak to next: VESTE", "Steve", new WorldPoint(2432, 3423, 0), "Upstairs Wyvern Area or Stronghold Slayer Cave", "2"), + new AnagramClue("This anagram reveals who to speak to next: VEIL VEDA", "Evil Dave", new WorldPoint(3079, 9892, 0), "Doris' basement, Edgeville", "666"), + new AnagramClue("This anagram reveals who to speak to next: WOO AN EGG KIWI", "Awowogei", new WorldPoint(2802, 2764, 0), "Ape Atoll", "24"), + new AnagramClue("This anagram reveals who to speak to next: YAWNS GY", "Ysgawyn", new WorldPoint(2340, 3167, 0), "Lletya") + ); + + private String text; + private String npc; + private WorldPoint location; + private String area; + private String answer; + + private AnagramClue(String text, String npc, WorldPoint location, String area) + { + this(text, npc, location, area, null); + } + + private AnagramClue(String text, String npc, WorldPoint location, String area, String answer) + { + this.text = text; + this.npc = npc; + this.location = location; + this.area = area; + this.answer = answer; + } + + @Override + public void makeOverlayHint(PanelComponent panelComponent, ClueScrollPlugin plugin) + { + panelComponent.setTitle("Anagram Clue"); + panelComponent.setWidth(150); + + panelComponent.getLines().add(new PanelComponent.Line("NPC:")); + panelComponent.getLines().add(new PanelComponent.Line(getNpc(), TITLED_CONTENT_COLOR)); + + panelComponent.getLines().add(new PanelComponent.Line("Area:")); + panelComponent.getLines().add(new PanelComponent.Line(true, getArea(), TITLED_CONTENT_COLOR)); + + if (getAnswer() != null) + { + panelComponent.getLines().add(new PanelComponent.Line("Answer:")); + panelComponent.getLines().add(new PanelComponent.Line(true, getAnswer(), TITLED_CONTENT_COLOR)); + } + } + + @Override + public void makeWorldOverlayHint(Graphics2D graphics, ClueScrollPlugin plugin) + { + if (!getLocation().isInScene(plugin.getClient())) + { + return; + } + + if (plugin.getNpcsToMark() != null) + { + for (NPC npc : plugin.getNpcsToMark()) + { + OverlayUtil.renderActorOverlayImage(graphics, npc, CLUE_SCROLL_IMAGE, Color.ORANGE, IMAGE_Z_OFFSET); + } + } + } + + public static AnagramClue forText(String text) + { + for (AnagramClue clue : CLUES) + { + if (clue.text.equalsIgnoreCase(text)) + { + return clue; + } + } + + return null; + } +} diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/clues/CipherClue.java b/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/clues/CipherClue.java new file mode 100644 index 0000000000..ea5d8ca393 --- /dev/null +++ b/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/clues/CipherClue.java @@ -0,0 +1,123 @@ +/* + * Copyright (c) 2018, Lotto + * 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 com.google.common.collect.ImmutableSet; +import java.awt.Color; +import java.awt.Graphics2D; +import java.util.Set; +import lombok.Getter; +import net.runelite.api.NPC; +import net.runelite.api.coords.WorldPoint; +import net.runelite.client.plugins.cluescrolls.ClueScrollPlugin; +import net.runelite.client.ui.overlay.OverlayUtil; +import net.runelite.client.ui.overlay.components.PanelComponent; +import static net.runelite.client.plugins.cluescrolls.ClueScrollOverlay.TITLED_CONTENT_COLOR; +import static net.runelite.client.plugins.cluescrolls.ClueScrollWorldOverlay.CLUE_SCROLL_IMAGE; +import static net.runelite.client.plugins.cluescrolls.ClueScrollWorldOverlay.IMAGE_Z_OFFSET; + +@Getter +public class CipherClue extends ClueScroll implements TextClueScroll, NpcClueScroll +{ + private static final Set CLUES = ImmutableSet.of( + new CipherClue("The cipher reveals who to speak to next: BMJ UIF LFCBC TFMMFS", "Ali the Kebab seller", new WorldPoint(3354, 2974, 0), "Pollnivneach", "399"), + new CipherClue("The cipher reveals who to speak to next: GUHCHO", "Drezel", new WorldPoint(3440, 9895, 0), "Paterdomus", "7"), + new CipherClue("The cipher reveals who to speak to next: ZCZL", "Adam", new WorldPoint(3227, 3227, 0), "Outside Lumbridge castle", "666"), + new CipherClue("The cipher reveals who to speak to next: ZHLUG ROG PDQ", "Weird Old Man", new WorldPoint(3224, 3112, 0), "Kalphite Lair entrance", "150"), + new CipherClue("The cipher reveals who to speak to next: ECRVCKP MJCNGF", "Captain Khaled", new WorldPoint(1845, 3754, 0), "Large eastern building in Piscarilius House", "5"), + new CipherClue("The cipher reveals who to speak to next: OVEXON", "Eluned", new WorldPoint(2289, 3144, 0), "Outside Lletya", "53,000"), + new CipherClue("The cipher reveals who to speak to next: VTYR APCNTGLW", "King Percival", new WorldPoint(2638, 4686, 0), "Fisher Realm", "5"), + new CipherClue("The cipher reveals who to speak to next: UZZU MUJHRKYYKJ", "Otto Godblessed", new WorldPoint(2501, 3487, 0), "Otto's Grotto", "3"), + new CipherClue("The cipher reveals who to speak to next: USBJCPSO", "Traiborn", new WorldPoint(3112, 3162, 0), "Wizard's Tower, 2nd floor", "3150"), + new CipherClue("The cipher reveals who to speak to next: HCKTA IQFHCVJGT", "Fairy Godfather", new WorldPoint(2446, 4428, 0), "Zanaris throne room", "64"), + new CipherClue("The cipher reveals who to speak to next: ZSBKDO ZODO", "Pirate Pete", new WorldPoint(3680, 3537, 0), "Dock northeast of the Ectofunctus", "Puzzle"), + new CipherClue("The cipher reveals who to speak to next: GBJSZ RVFFO", "Fairy Queen", new WorldPoint(2347, 4435, 0), "Fairy Resistance Hideout", "Puzzle"), + new CipherClue("The cipher reveals who to speak to next: QSPGFTTPS HSBDLMFCPOF", "Professor Gracklebone", new WorldPoint(1625, 3802, 0), "Arceuus House Library, ground floor", "9") + ); + + private String text; + private String npc; + private WorldPoint location; + private String area; + private String answer; + + private CipherClue(String text, String npc, WorldPoint location, String area, String answer) + { + this.text = text; + this.npc = npc; + this.location = location; + this.area = area; + this.answer = answer; + } + + @Override + public void makeOverlayHint(PanelComponent panelComponent, ClueScrollPlugin plugin) + { + panelComponent.setTitle("Cipher Clue"); + panelComponent.setWidth(150); + + panelComponent.getLines().add(new PanelComponent.Line("NPC:")); + panelComponent.getLines().add(new PanelComponent.Line(getNpc(), TITLED_CONTENT_COLOR)); + + panelComponent.getLines().add(new PanelComponent.Line("Area:")); + panelComponent.getLines().add(new PanelComponent.Line(true, getArea(), TITLED_CONTENT_COLOR)); + + if (getAnswer() != null) + { + panelComponent.getLines().add(new PanelComponent.Line("Answer:")); + panelComponent.getLines().add(new PanelComponent.Line(true, getAnswer(), TITLED_CONTENT_COLOR)); + } + } + + @Override + public void makeWorldOverlayHint(Graphics2D graphics, ClueScrollPlugin plugin) + { + if (!getLocation().isInScene(plugin.getClient())) + { + return; + } + + if (plugin.getNpcsToMark() != null) + { + for (NPC npc : plugin.getNpcsToMark()) + { + OverlayUtil.renderActorOverlayImage(graphics, npc, CLUE_SCROLL_IMAGE, Color.ORANGE, IMAGE_Z_OFFSET); + } + } + } + + public static CipherClue forText(String text) + { + for (CipherClue clue : CLUES) + { + if (clue.text.equalsIgnoreCase(text)) + { + return clue; + } + } + + return null; + } +} 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 new file mode 100644 index 0000000000..95a3ecded8 --- /dev/null +++ b/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/clues/ClueScroll.java @@ -0,0 +1,36 @@ +/* + * Copyright (c) 2018, Lotto + * 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 java.awt.Graphics2D; +import net.runelite.client.plugins.cluescrolls.ClueScrollPlugin; +import net.runelite.client.ui.overlay.components.PanelComponent; + +public abstract class ClueScroll +{ + 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 new file mode 100644 index 0000000000..82d49f2721 --- /dev/null +++ b/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/clues/CoordinateClue.java @@ -0,0 +1,69 @@ +/* + * Copyright (c) 2018, Lotto + * 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 java.awt.Color; +import java.awt.Graphics2D; +import lombok.AllArgsConstructor; +import lombok.Getter; +import net.runelite.api.coords.LocalPoint; +import net.runelite.api.coords.WorldPoint; +import net.runelite.client.plugins.cluescrolls.ClueScrollPlugin; +import net.runelite.client.ui.overlay.OverlayUtil; +import net.runelite.client.ui.overlay.components.PanelComponent; +import static net.runelite.client.plugins.cluescrolls.ClueScrollWorldOverlay.SPADE_IMAGE; + +@Getter +@AllArgsConstructor +public class CoordinateClue extends ClueScroll implements TextClueScroll +{ + private String text; + private WorldPoint location; + + @Override + public void makeOverlayHint(PanelComponent panelComponent, ClueScrollPlugin plugin) + { + panelComponent.setTitle("Coordinate Clue"); + panelComponent.setWidth(135); + + panelComponent.getLines().add(new PanelComponent.Line("Travel to the marked")); + panelComponent.getLines().add(new PanelComponent.Line("out destination to see")); + panelComponent.getLines().add(new PanelComponent.Line("a marker for where")); + panelComponent.getLines().add(new PanelComponent.Line("you should dig.")); + } + + @Override + public void makeWorldOverlayHint(Graphics2D graphics, ClueScrollPlugin plugin) + { + LocalPoint localLocation = LocalPoint.fromWorld(plugin.getClient(), getLocation()); + + if (localLocation == null) + { + return; + } + + OverlayUtil.renderTileOverlay(plugin.getClient(), graphics, localLocation, SPADE_IMAGE, Color.ORANGE); + } +} diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/clues/CrypticClue.java b/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/clues/CrypticClue.java new file mode 100644 index 0000000000..bd9aebdce7 --- /dev/null +++ b/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/clues/CrypticClue.java @@ -0,0 +1,419 @@ +/* + * Copyright (c) 2018, Lotto + * 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 com.google.common.collect.ImmutableSet; +import java.awt.Color; +import java.awt.Graphics2D; +import java.util.Set; +import lombok.Getter; +import net.runelite.api.GameObject; +import net.runelite.api.NPC; +import net.runelite.api.ObjectComposition; +import net.runelite.api.coords.LocalPoint; +import net.runelite.api.coords.WorldPoint; +import net.runelite.client.plugins.cluescrolls.ClueScrollPlugin; +import net.runelite.client.ui.overlay.OverlayUtil; +import net.runelite.client.ui.overlay.components.PanelComponent; +import static net.runelite.api.ObjectID.*; +import static net.runelite.client.plugins.cluescrolls.ClueScrollOverlay.TITLED_CONTENT_COLOR; +import static net.runelite.client.plugins.cluescrolls.ClueScrollWorldOverlay.CLICKBOX_BORDER_COLOR; +import static net.runelite.client.plugins.cluescrolls.ClueScrollWorldOverlay.CLICKBOX_FILL_COLOR; +import static net.runelite.client.plugins.cluescrolls.ClueScrollWorldOverlay.CLICKBOX_HOVER_BORDER_COLOR; +import static net.runelite.client.plugins.cluescrolls.ClueScrollWorldOverlay.CLUE_SCROLL_IMAGE; +import static net.runelite.client.plugins.cluescrolls.ClueScrollWorldOverlay.IMAGE_Z_OFFSET; +import static net.runelite.client.plugins.cluescrolls.ClueScrollWorldOverlay.SPADE_IMAGE; + +@Getter +public class CrypticClue extends ClueScroll implements TextClueScroll, NpcClueScroll, ObjectClueScroll +{ + private static final Set CLUES = ImmutableSet.of( + new CrypticClue("Show this to Sherlock.", "Sherlock", new WorldPoint(2733, 3415, 0), "Sherlock is located to the east of the Sorcerer's tower in Seers' Village."), + new CrypticClue("Talk to the bartender of the Rusty Anchor in Port Sarim.", "Bartender", new WorldPoint(3045, 3256, 0), "The Rusty Anchor is located in the north of Port Sarim."), + new CrypticClue("The keeper of Melzars... Spare? Skeleton? Anar?", "Oziach", new WorldPoint(3068, 3516, 0), "Speak to Oziach in Edgeville"), + new CrypticClue("Speak to Ulizius.", "Ulizius", new WorldPoint(3444, 3461, 0), "Ulizius is the monk who guards the gate into Mort Myre Swamp."), + new CrypticClue("Search for a crate in a building in Hemenster.", CRATE_356, new WorldPoint(2636, 3454, 0), "House north of the Fishing Contest quest area. West of Grandpa Jack."), + new CrypticClue("A reck you say Let's pray there aren't any ghosts.", "Father Aereck", new WorldPoint(3242, 3207, 0), "Speak to Father Aereck in Lumbridge."), + new CrypticClue("Search the bucket in the Port Sarim jail.", NULL_337, new WorldPoint(3012, 3179, 0), "Talk to Shantay & identify yourself as an outlaw, refuse to pay the 5gp fine twice and you will be sent to the Port Sarim jail."), + new CrypticClue("Search the crates in a bank in Varrock.", NULL_336, new WorldPoint(3187, 9824, 0), "Search in the basement of the West Varrock bank."), + new CrypticClue("Falo the bard wants to see you.", "Falo the Bard", new WorldPoint(2689, 3550, 0), "Speak to Falo the Bard"), + new CrypticClue("Search a bookcase in the Wizards tower.", BOOKCASE_12539, new WorldPoint(3113, 3159, 0), "The bookcase located on the ground floor."), + new CrypticClue("Come have a cip with this great soot covered denizen.", "Miner Magnus", new WorldPoint(2527, 3891, 0), "Talk to Miner Magnus east of the fairy ring CIP. Answer: 8"), + new CrypticClue("Citric cellar.", "Heckel Funch", new WorldPoint(2490, 3488, 0), "Speak to Heckel Funch on the first floor in the Grand Tree."), + new CrypticClue("I burn between heroes and legends.", "Candle maker", new WorldPoint(2799, 3438, 0), "Speak to the Candle maker in Catherby."), + new CrypticClue("Speak to Sarah at Falador farm.", "Sarah", new WorldPoint(3038, 3292, 0), "Talk to Sarah at Falador farm, north of Port Sarim."), + new CrypticClue("Search for a crate on the ground floor of a house in Seers' Village.", NULL_25890, new WorldPoint(2699, 3469, 0), "Search inside Phantuwti Fanstuwi Farsight's house, located south of the pub in Seers' Village."), + new CrypticClue("Snah? I feel all confused, like one of those cakes...", "Hans", new WorldPoint(3211, 3219, 0), "Talk to Hans roaming around Lumbridge Castle."), + new CrypticClue("Speak to Sir Kay in Camelot Castle.", "Sir Kay", new WorldPoint(2759, 3497, 0), "Sir Kay can be found in the courtyard at Camelot castle."), + new CrypticClue("Gold I see, yet gold I require. Give me 875 if death you desire.", "Saniboch", new WorldPoint(2745, 3151, 0), "Speak to Saniboch at the Brimhaven Dungeon entrance."), + new CrypticClue("Find a crate close to the monks that like to paaarty!", CRATE_354, new WorldPoint(2614, 3204, 0), "The crate is in the east side of the Kandarin monastery, near Brother Omad"), + new CrypticClue("Identify the back of this over-acting brother. (He's a long way from home.)", "Hamid", new WorldPoint(3376, 3284, 0), "Talk to Hamid, the monk at the altar in the Duel Arena"), + new CrypticClue("In a town where thieves steal from stalls, search for some drawers in the upstairs of a house near the bank.", new WorldPoint(2611, 3324, 0), "Kill any Guard located around East Ardougne for a medium key. Then search the drawers in the upstairs hallway of Jerico's house, which is the house with pigeon cages located south of the northern East Ardougne bank."), + new CrypticClue("His bark is worse than his bite.", "Barker", new WorldPoint(3499, 3503, 0), "Speak to the Barker at Canifis's Barkers' Haberdashery."), + new CrypticClue("The beasts to my east snap claws and tails, The rest to my west can slide and eat fish. The force to my north will jump and they'll wail, Come dig by my fire and make a wish.", new WorldPoint(2598, 3267, 0), "Dig by the torch in the Ardougne Zoo, between the penguins and the scorpions."), + new CrypticClue("A town with a different sort of night-life is your destination. Search for some crates in one of the houses.", CRATE_24344, new WorldPoint(3499, 3507, 1), "Search the crate inside of the clothes shop in Canifis."), + new CrypticClue("Stop crying! Talk to the head.", "Head mourner", new WorldPoint(2042, 4630, 0), "Talk to the Head mourner in the mourner headquarters in West Ardougne"), + new CrypticClue("Search the crate near a cart in Port Khazard.", CRATE_366, new WorldPoint(2660, 3149, 0), "Search by the southern Khazard General Store in Port Khazard."), + new CrypticClue("Speak to the bartender of the Blue Moon Inn in Varrock.", "Blue Moon Inn", new WorldPoint(3226, 3399, 0), "Talk to the bartender in Blue Moon Inn in Varrock."), + new CrypticClue("This aviator is at the peak of his profession.", "Captain Bleemadge", new WorldPoint(2846, 1749, 0), "Captain Bleemadge, the gnome glider pilot, is found at the top of White Wolf Mountain."), + new CrypticClue("Search the crates in the shed just north of East Ardougne.", NULL_1247, new WorldPoint(2618, 3346, 0), "The crates in the shed north of the northern Ardougne bank."), + new CrypticClue("I wouldn't wear this jean on my legs.", "Father Jean", new WorldPoint(1697, 3574, 0), "Talk to father Jean in the Hosidius church"), + new CrypticClue("Search the crate in the Toad and Chicken pub.", NULL_1827, new WorldPoint(2912, 3536, 0), "The Toad and Chicken pub is located in Burthorpe."), + new CrypticClue("Search chests found in the upstairs of shops in Port Sarim.", BOOKCASE_380, new WorldPoint(3016, 3204, 1), "Search the chest in the upstairs of Wydin's Food Store, on the east wall."), + new CrypticClue("Right on the blessed border, cursed by the evil ones. On the spot inaccessible by both; I will be waiting. The bugs imminent possession holds the answer.", new WorldPoint(3410, 3324, 0), "B I P. Dig right under the fairy ring."), + new CrypticClue("The dead, red dragon watches over this chest. He must really dig the view.", "Barbarian", 375, new WorldPoint(3353, 3332, 0), "Search the chest underneath the Red Dragon's head in the Exam Centre. Kill a MALE Barbarian in Barbarian Village or Barbarian Outpost to receive the key."), + new CrypticClue("My home is grey, and made of stone; A castle with a search for a meal. Hidden in some drawers I am, across from a wooden wheel.", DRAWERS_5618, new WorldPoint(3213, 3216, 1), "Open the drawers inside the room with the spinning wheel on the first floor of Lumbridge Castle."), + new CrypticClue("Come to the evil ledge, Yew know yew want to. Try not to get stung.", new WorldPoint(3089, 3468, 0), "Dig in Edgeville, just east of the Southern Yew tree."), + new CrypticClue("Look in the ground floor crates of houses in Falador.", NULL_5536, new WorldPoint(3027, 3356, 0), "The house east of the east bank."), + new CrypticClue("You were 3 and I was the 6th. Come speak to me.", "Vannaka", new WorldPoint(3146, 9913, 0), "Speak to Vannaka in Edgeville Dungeon."), + new CrypticClue("Search the crates in Draynor Manor.", CRATES_11486, new WorldPoint(3105, 3369, 2), "Top floor of the manor"), + new CrypticClue("Search the crates near a cart in Varrock.", MILL_2571, new WorldPoint(3226, 3452, 0), "South east of Varrock Palace, south of the tree farming patch."), + new CrypticClue("A Guthixian ring lies between two peaks. Search the stones and you'll find what you seek.", STONES_26633, new WorldPoint(2922, 3484, 0), "Search the stones several steps west of the Guthixian stone circle in Taverley"), + new CrypticClue("Search the boxes in the house near the south entrance to Varrock.", TABLE_2496, new WorldPoint(3204, 3384, 0), "The first house on the left when entering the city from the southern entrance."), + new CrypticClue("His head might be hollow, but the crates nearby are filled with surprises.", CRATE_354, new WorldPoint(3478, 3091, 0), "Search the crates near the Clay golem in the ruins of Uzer."), + new CrypticClue("One of the sailors in Port Sarim is your next destination.", "Captain Tobias", new WorldPoint(3026, 3216, 0), "Speak to Captain Tobias on the docks of Port Sarim."), + new CrypticClue("THEY'RE EVERYWHERE!!!! But they were here first. Dig for treasure where the ground is rich with ore.", new WorldPoint(3081, 3421, 0), "Dig at Barbarian Village, next to the Stronghold of Security."), + new CrypticClue("Talk to the mother of a basement dwelling son.", "Doris", new WorldPoint(3079, 3493, 0), "Evil Dave's mother, Doris is located in the house west of Edgeville bank."), + new CrypticClue("Speak to Ned in Draynor Village.", "Ned", new WorldPoint(3098, 3258, 0), "Ned is found north or the Draynor bank."), + new CrypticClue("Speak to Hans to solve the clue.", "Hans", new WorldPoint(3211, 3219, 0), "Hans can be found at Lumbridge Castle."), + new CrypticClue("Search the crates in Canifis.", CRATE_24344, new WorldPoint(3509, 3497, 1), "Search inside the shop, Rufus' Meat Emporium."), + new CrypticClue("Search the crates in the Dwarven mine.", CRATE_356, new WorldPoint(3034, 9849, 0), "Search the east of the Ice Mountain ladder entrance in the Drogo's Mining Emporium."), + new CrypticClue("A crate found in the tower of a church is your next location.", NULL_10627, new WorldPoint(2612, 3304, 1), "Climb the ladder and search the crates on the 1st floor in the Church in Ardougne"), + new CrypticClue("Covered in shadows, the centre of the circle is where you will find the answer.", new WorldPoint(3488, 3289, 0), "Dig in the centre of Mort'ton, where the roads intersect"), + new CrypticClue("I lie lonely and forgotten in mid wilderness, where the dead rise from their beds. Feel free to quarrel and wind me up and dig while you shoot their heads.", new WorldPoint(3174, 3663, 0), "Directly under the crossbow respawn in the Graveyard of Shadows in level 18 Wilderness."), + new CrypticClue("In the city where merchants are said to have lived, talk to a man with a splendid cape, but a hat dropped by goblins.", "Head chef", new WorldPoint(3143, 3445, 0), "Talk to the Head chef in Cooks' Guild west of Varrock."), + new CrypticClue("The mother of the reptilian sacrifice.", "Zul-Cheray", new WorldPoint(2204, 3050, 0), "Talk to Zul-Cheray in a house near the sacrificial boat at Zul-Andra."), + new CrypticClue("I watch the sea. I watch you fish. I watch your tree.", "Ellena", new WorldPoint(2860, 3431, 0), "Speak to Ellena at Catherby fruit tree patch."), + new CrypticClue("Dig between some ominous stones in Falador.", new WorldPoint(3040, 3399, 0), "Three standing stones inside a walled area. East of the northern Falador gate."), + new CrypticClue("Speak to Rusty north of Falador.", "Rusty", new WorldPoint(2979, 3435, 0), "Rusty can be found northeast of Falador on the way to the Mind altar."), + new CrypticClue("Search a wardrobe in Draynor.", NULL_5620, new WorldPoint(3088, 3259, 0), "Go to Aggie's house and search the wardrobe in northern wall."), + new CrypticClue("Show this to Sherlock", "Sherlock", new WorldPoint(2733, 3415, 0), "Sherlock can be found south of Seer's Village."), + new CrypticClue("I have many arms but legs, I have just one, I have little family but my seed, You can grow on, I am not dead, yet I am but a spirit, and my power on your quests, you will earn the right to free it.", NULL_1293, new WorldPoint(2542, 3170, 0), "Spirit Tree in Tree Gnome Village"), + new CrypticClue("I am the one who watches the giants. The giants in turn watch me. I watch with two while they watch with one. Come seek where I may be.", "Kamfreena", new WorldPoint(2845, 3539, 0), "Speak to Kamfreena on the top floor of the Warriors' Guild."), + new CrypticClue("In a town where wizards are known to gather, search upstairs in a large house to the north.", new WorldPoint(2595, 3105, 0), "Search the chest, upstairs, in the house north of Yanille Wizards' Guild. Open the chest to receive the message: The chest is locked! An inscription on the chest reads: Stand by your man. Head downstairs to kill a Man."), + new CrypticClue("Probably filled with wizards socks.", "Wizard", new WorldPoint(3109, 9959, 0), "Search the drawers in the basement of the Wizard's Tower south of Draynor Village. Kill one of the Wizards for the key."), + new CrypticClue("Even the seers say this clue goes right over their heads.", CRATE_26635, new WorldPoint(2707, 3488, 2), "Search the crate on the Seers Agility Course in Seers Village"), + new CrypticClue("Speak to a Wyse man.", "Wyson the gardener", new WorldPoint(3026, 3378, 0), "Talk to Wyson the gardener at Falador Park."), + new CrypticClue("You'll need to look for a town with a central fountain. Look for a locked chest in the town's chapel.", CLOSED_CHEST_5108, new WorldPoint(3256, 3487, 0), "Search the chest by the stairs in the Varrock church. Kill a Monk in Ardougne Monastery to obtain the key."), + new CrypticClue("Talk to Ambassador Spanfipple in the White Knights Castle.", "Ambassador Spanfipple", new WorldPoint(2979, 3340, 0), "Ambassador Spanfipple can be found roaming on the 2nd floor of the White Knights Castle."), + new CrypticClue("Mine was the strangest birth under the sun. I left the crimson sack, yet life had not begun. Entered the world, and yet was seen by none.", new WorldPoint(2832, 9586, 0), "Inside Karamja Volcano, dig directly underneath the Red spiders' eggs respawn."), + new CrypticClue("Search for a crate in Varrock Castle.", CRATE_5110, new WorldPoint(3223, 3492, 0), "Search the crate in the corner of the kitchen in Varrock Castle."), + new CrypticClue("And so on, and so on, and so on. Walking from the land of many unimportant things leads to a choice of paths.", new WorldPoint(2591, 3879, 0), "Dig on Etceteria next to the Evergreen tree in front of the castle walls."), + new CrypticClue("Speak to Donovan, the Family Handyman.", "Donovan the Family Handyman", new WorldPoint(2743, 3578, 0), "Donovan the Family Handyman is found on the 2nd floor of Sinclair Mansion."), + new CrypticClue("Search the crates in the Barbarian Village helmet shop.", NULL_10627, new WorldPoint(3073, 3430, 0), "Peska's Helmet Shop in Barbarian Village."), + new CrypticClue("Search the boxes of Falador's general store.", CRATES_24088, new WorldPoint(2955, 3390, 0), "Falador general store."), + new CrypticClue("In a village made of bamboo, look for some crates under one of the houses.", CRATE_356, new WorldPoint(2799, 3074, 0), "Search the crate by the house at the northern point of the broken jungle fence in Tai Bwo Wannai."), + new CrypticClue("Buried beneath the ground, who knows where it's found. Lucky for you, A man called Jorral may have a clue.", "Jorral", new WorldPoint(2437, 3347, 0), "Speak to Jorral to receive a strange device."), + new CrypticClue("This crate is mine, all mine, even if it is in the middle of the desert.", new WorldPoint(3290, 3022, 0), "Center of desert Mining Camp. Search the crates. Requires the metal key from Tourist Trap to enter."), + new CrypticClue("Dig where 4 siblings and I all live with our evil overlord.", new WorldPoint(3195, 3357, 0), "Dig in the chicken pen inside the Champion's Guild"), + new CrypticClue("In a town where the guards are armed with maces, search the upstairs rooms of the Public House.", "Guard Dog", 348, new WorldPoint(2574, 3326, 1), "Search the drawers in the pub north of Ardougne Castle. Kill a Guard dog at Handelmort Mansion to obtain the key."), + new CrypticClue("Four blades I have, yet draw no blood; Still I turn my prey to powder. If you are brave, come search my roof; It is there my blades are louder.", NULL_1784, new WorldPoint(3167, 3307, 2), "Lumbridge windmill, search the crates on the top floor."), + new CrypticClue("Search through some drawers in the upstairs of a house in Rimmington.", NULL_10627, new WorldPoint(2970, 3214, 1), "On the first floor of the house north of Hetty the Witch's house in Rimmington."), + new CrypticClue("Probably filled with books on magic.", BOOKCASE_380, new WorldPoint(3096, 9572, 0), "Search the bookcase in the basement of Wizard's Tower."), + new CrypticClue("If you look closely enough, it seems that the archers have lost more than their needles.", HAYSTACK, new WorldPoint(2672, 3416, 0), "Search the haystack by the south corner of the Rangers' Guild"), + new CrypticClue("Search the crate in the left-hand tower of Lumbridge Castle.", CRATE_357, new WorldPoint(3228, 3212, 1), "Located on the first floor of the southern tower at the Lumbridge Castle entrance."), + new CrypticClue("'Small shoe.' Often found with rod on mushroom.", "Gnome trainer", new WorldPoint(2476, 3428, 0), "Talk to any Gnome trainer in the agility area of the Tree Gnome Stronghold."), + new CrypticClue("I live in a deserted crack collecting soles.", "Genie", new WorldPoint(3371, 9320, 0), "Enter the crack west of Nardah Rug merchant, and talk to the Genie."), + new CrypticClue("46 is my number. My body is the colour of burnt orange and crawls among those with eight. Three mouths I have, yet I cannot eat. My blinking blue eye hides my grave.", new WorldPoint(3170, 3885, 0), "Sapphire respawn in the Spider's Nest, lvl 46 Wilderness. Dig under the sapphire spawn."), + new CrypticClue("Green is the colour of my death as the winter-guise, I swoop towards the ground.", new WorldPoint(2780, 3783, 0), "Players need to slide down to where Trollweiss grows on Trollweiss Mountain."), + new CrypticClue("Talk to a party-goer in Falador.", "Lucy", new WorldPoint(3046, 3382, 0), "Lucy is the bartender on the 1st2nd floor[U.K. floor] of the party room."), + new CrypticClue("He knows just how easy it is to lose track of time.", "Brother Kojo", new WorldPoint(2570, 3250, 0), "Speak to brother Kojo in the Clock Tower."), + new CrypticClue("A great view - watch the rapidly drying hides get splashed. Check the box you are sitting on.", NULL_1838, new WorldPoint(2523, 3493, 1), "Almera's House north of Baxtorian Falls, search boxes on the 2nd floor."), + new CrypticClue("Search the Coffin in Edgeville.", COFFIN, new WorldPoint(3091, 3477, 0), "Search the coffin located by the Wilderness teleport lever."), + new CrypticClue("When no weapons are at hand, now it is time to reflect, in Saradomin's name! Redemption draws closer...", DRAWERS_350, new WorldPoint(2818, 3351, 0), "On Entrana, search the southern drawer in the house with the cooking range."), + new CrypticClue("Search the crates in a house in Yanille that has a piano.", NULL_17088, new WorldPoint(2598, 3105, 0), "The house is located northwest of the bank."), + new CrypticClue("Speak to the staff of Sinclair mansion.", "Louisa", new WorldPoint(2736, 3578, 0), "Speak to Louisa, on the ground floor, found at the Sinclair Mansion."), + new CrypticClue("I am a token of the greatest love. I have no beginning or end. My eye is red, I can fit like a glove. Go to the place where it's money they lend, And dig by the gate to be my friend.", new WorldPoint(3191, 9825, 0), "Dig by the gate in the basement of the West Varrock bank."), + new CrypticClue("Speak to Kangai Mau.", "Kangai Mau", new WorldPoint(2791, 3183, 0), "Kangai Mau is found in the Shrimp and Parrot in Brimhaven."), + new CrypticClue("Speak to Hajedy.", "Hajedy", new WorldPoint(2779, 3211, 0), "Hajedy is found by the cart, located just south of the Brimhaven docks."), + new CrypticClue("Must be full of railings.", BOXES_6176, new WorldPoint(2576, 3464, 0), "Search the boxes around the hut where the broken Dwarf Cannon is, close to the start of the Dwarf Cannon quest."), + new CrypticClue("I wonder how many bronze swords he has handed out.", "Vannaka", new WorldPoint(3164, 9913, 0), "Talk to Vannaka. He can be found in Edgeville Dungeon."), + new CrypticClue("Read 'How to breed scorpions.' By O.W.Thathurt.", BOOKCASE_380, new WorldPoint(2703, 3409, 1), "Search the northern bookcase on the 1st2nd floor[U.K. floor] of the Sorcerer's Tower."), + new CrypticClue("Search the crates in the Port Sarim Fishing shop.", NULL_918, new WorldPoint(3013, 3222, 0), "Search the crates, by the door, in Gerrant's Fishy Business in Port Sarim."), + new CrypticClue("Speak to the Lady of the Lake.", "Lady of the Lake", new WorldPoint(2924, 3405, 0), "Talk to the Lady of the Lake in Taverley."), + new CrypticClue("Rotting next to a ditch. Dig next to the fish", new WorldPoint(3547, 3183, 0), "Dig next to a fishing spot on the south-east side of Burgh de Rott."), + new CrypticClue("The King's magic won't be wasted by me.", "Guardian Mummy", new WorldPoint(1934, 4427, 0), "Talk to the Guardian mummy inside the Pyramid Plunder minigame in Sophanem"), + new CrypticClue("Dig where the forces of Zamorak and Saradomin collide.", new WorldPoint(3049, 4839, 0), "Dig next to the law rift in the Abyss"), + new CrypticClue("Search the boxes in the goblin house near Lumbridge.", NULL_10627, new WorldPoint(3245, 3245, 0), "Goblin house on the eastern side of the river."), + new CrypticClue("W marks the spot.", new WorldPoint(2867, 3546, 0), "Dig in the middle of the Warriors' Guild entrance hall"), + new CrypticClue("There is no 'worthier' lord.", "Lord Iorwerth", new WorldPoint(2205, 3252, 0), "Speak to Lord Iorwerth in the elven camp near Prifddinas"), + new CrypticClue("Surviving.", "Sir Vyvin", new WorldPoint(2983, 3338, 0), "Talk to Sir Vyvin on the 3rd floor of Falador castle."), + new CrypticClue("My name is like a tree, yet it is spelt with a 'g'. Come see the fur which is right near me.", "Wilough", new WorldPoint(3221, 3435, 0), "Speak to Wilough, next to the Fur Merchant in Varrock Square."), + new CrypticClue("Speak to Jatix in Taverley.", "Jatix", new WorldPoint(2898, 3428, 0), "Jatix is found in the middle of Taverley."), + new CrypticClue("Speak to Gaius in Taverley.", "Gaius", new WorldPoint(2884, 3450, 0), "Gaius is found at the northwest corner in Taverley."), + new CrypticClue("If a man carried my burden, he would break his back. I am not rich, but leave silver in my track. Speak to the keeper of my trail.", "Gerrant", new WorldPoint(3013, 3224, 0), "Speak to Gerrant in the fish shop in Port Sarim."), + new CrypticClue("Search the drawers in Falador's chain mail shop.", DRAWERS, new WorldPoint(2972, 3312, 0), "Wayne's Chains - Chainmail Specialist store at the southern Falador walls."), + new CrypticClue("Talk to the barber in the Falador barber shop.", "Hairdresser", new WorldPoint(2945, 3379, 0), "The Hairdresser can be found in the barber shop, north of the west Falador bank."), + new CrypticClue("Often sought out by scholars of histories past, find me where words of wisdom speak volumes.", "Examiner", new WorldPoint(3362, 3341, 0), "Speak to an examiner at the Exam Centre."), + new CrypticClue("Generally speaking, his nose was very bent.", "General Bentnoze", new WorldPoint(2957, 3511, 0), "Talk to General Bentnoze"), + new CrypticClue("Search the bush at the digsite centre.", BUSH_2357, new WorldPoint(3345, 3378, 0), "The bush is on the east side of the first pathway towards the digsite from the Exam Centre."), + new CrypticClue("Someone watching the fights in the Duel Arena is your next destination.", "Jeed", new WorldPoint(3360, 3242, 0), "Talk to Jeed, found on the upper floors, at the Duel Arena."), + new CrypticClue("It seems to have reached the end of the line, and it's still empty.", NULL_638, new WorldPoint(3041, 9821, 0), "Search the carts in the northern part of the Dwarven Mine."), + new CrypticClue("You'll have to plug your nose if you use this source of herbs.", new WorldPoint(3426, 3550, 1), "Kill an Aberrant spectre and pick up the casket"), + new CrypticClue("When you get tired of fighting, go deep, deep down until you need an antidote.", CRATE_357, new WorldPoint(2576, 9583, 0), "Go to Yanille Agility dungeon and fall into the place with the poison spiders. Search the crate by the stairs leading up."), + new CrypticClue("Search the bookcase in the monastery.", BOOKCASE_380, new WorldPoint(3054, 3484, 0), "Search the southeastern bookcase at Edgeville Monastery."), + new CrypticClue("Surprising? I bet he is...", "Sir Prysin", new WorldPoint(3205, 3474, 0), "Talk to Sir Prysin in Varrock Palace."), + new CrypticClue("Search upstairs in the houses of Seers' Village for some drawers.", NULL_925, new WorldPoint(2714, 3471, 1), "Located in the house with the spinning wheel. South of the Seers' Village bank."), + new CrypticClue("Leader of the Yak City.", "Mawnis Burowgar", new WorldPoint(2336, 3799, 0), "Talk to Mawnis Burowgar in Neitiznot."), + new CrypticClue("Speak to Arhein in Catherby.", "Arhein", new WorldPoint(2803, 3430, 0), "Arhein is just south of the Catherby bank."), + new CrypticClue("Speak to Doric, who lives north of Falador.", "Doric", new WorldPoint(2951, 3451, 0), "Doric is found north of Falador and east of the Taverley gate."), + new CrypticClue("Between where the best are commemorated for a year, and a celebratory cup, not just for beer.", new WorldPoint(3388, 3152, 0), "Dig at the Clan Cup Trophy at Clan Wars."), + new CrypticClue("'See you in your dreams' said the vegetable man.", "Dominic Onion", new WorldPoint(2608, 3116, 0), "Speak to Dominic Onion at the Nightmare Zone teleport spot."), + new CrypticClue("Try not to step on any aquatic nasties while searching this crate.", CRATE_18204, new WorldPoint(2764, 3273, 0), "Search the crate in Bailey's house on the Fishing Platform."), + new CrypticClue("The cheapest water for miles around, but they react badly to religious icons.", CRATE_354, new WorldPoint(3178, 2987, 0), "Search the crates in the General Store tent in the Bandit Camp"), + new CrypticClue("This village has a problem with cartloads of the undead. Try checking the bookcase to find an answer.", BOOKCASE_394, new WorldPoint(2833, 2992, 0), "Search the bookcase by the doorway of the building just south east of the Shilo Village Gem Mine."), + new CrypticClue("Dobson is my last name, and with gardening I seek fame.", "Horacio", new WorldPoint(2635, 3310, 0), "Horacio, located in the garden of the Handelmort Mansion in East Ardougne."), + new CrypticClue("The magic of 4 colours, an early experience you could learn. The large beast caged up top, rages, as his demised kin's loot now returns.", "Wizard Mizgog", new WorldPoint(3103, 3163, 2), "Speak to Wizard Mizgog at the top of the Wizard's Tower south of Draynor."), + new CrypticClue("Aggie I see, Lonely and southern I feel I am neither inside nor outside the house yet no house would be complete without me. Your treasure lies beneath me.", new WorldPoint(3085, 3255, 0), "Dig outside the window of Aggies house in Draynor Village."), + new CrypticClue("Search the chest in Barbarian Village.", null, "The chest located in the house with a spinning wheel."), + new CrypticClue("Search the crates in the outhouse of the long building in Taverley.", null, "Located in the small building attached by a fence to the main building. Climb over the stile."), + new CrypticClue("Talk to Ermin.", null, "Ermin can be found on the 1st floor of the tree house south-east of the Gnome Agility Course."), + new CrypticClue("Ghostly bones.", null, "Kill an Ankou"), + new CrypticClue("Search through chests found in the upstairs of houses in eastern Falador.", null, "The house is located southwest of the Falador Party Room. There are two chests in the room, search the northern chest."), + new CrypticClue("Let's hope you don't meet a watery death when you encounter this fiend.", null, "Kill a waterfiend."), + new CrypticClue("Reflection is the weakness for these eyes of evil.", "Falo the Bard", null, "Kill a basilisk"), + new CrypticClue("Search a bookcase in Lumbridge swamp.", null, "Located in Father Urhney's house."), + new CrypticClue("Surround my bones in fire, ontop the wooden pyre. Finally lay me to rest, before my one last test.", null, "Kill a confused/lost barbarian to receive mangled bones. Construct and burn a pyre ship. Kill the ferocious barbarian spirit that spawns to receive a clue casket."), + new CrypticClue("Fiendish cooks probably won’t dig the dirty dishes.", null, "Dig by the fire in the Rogues' Den."), + new CrypticClue("My life was spared but these voices remain, now guarding these iron gates is my bane.", null, "Speak to the Key Master in Cerberus' Lair."), + new CrypticClue("Search the boxes in one of the tents in Al Kharid.", null, "Search the crates in the tent east of the Silk trader."), + new CrypticClue("One of several rhyming brothers, in business attire with an obsession for paper work.", null, "Speak to Piles in the Resource Area."), + new CrypticClue("Search the drawers on the first floor of a building overlooking Ardougne's Market.", null, "Climb the ladder in the house north of the market."), + new CrypticClue("'A bag belt only?', he asked his balding brothers.", null, "Talk to Abbot Langley in the monastery"), + new CrypticClue("Search the drawers upstairs in Falador's shield shop.", null, "Cassie's Shield Shop at the northern Falador entrance."), + new CrypticClue("Go to this building to be illuminated, and check the drawers while you are there.", "Market Guard", null, "The 2nd of the Lighthouse, Kill a Rellekka marketplace guard to obtain the key."), + new CrypticClue("Dig near some giant mushrooms behind the Grand Tree.", null, "Dig near the red mushrooms northwest of the Grand Tree."), + new CrypticClue("Pentagrams and demons, burnt bones and remains, I wonder what the blood contains.", null, "Dig under the blood rune spawn next the the Demonic Ruins."), + new CrypticClue("Search the drawers above Varrock's shops.", null, "Located upstairs in Thessalia's Fine Clothes shop in Varrock."), + new CrypticClue("Search the drawers in one of Gertrude's bedrooms.", null, "Kanel's bedroom (southeastern room), outside of west Varrock."), + new CrypticClue("Under a giant robotic bird that cannot fly.", null, "Dig next to the terrorbird display in the south exhibit of Varrock Museum's basement."), + new CrypticClue("Great demons, dragons, and spiders protect this blue rock, beneath which, you may find what you seek.", null, "Dig by the runite rock in the Lava Maze Dungeon"), + new CrypticClue("My giant guardians below the market streets would be fans of rock and roll, if only they could grab hold of it. Dig near my green bubbles!", null, "Dig near the cauldron by Moss Giants under Varrock Sewers"), + new CrypticClue("Varrock is where I reside not the land of the dead, but I am so old, I should be there instead. Let's hope your reward is as good as it says, just 1 gold one and you can have it read.", null, "Talk to Gypsy Aris, West of varrock main square."), + new CrypticClue("Speak to a referee.", null, "Talk to a Gnome ball referee found on the Gnome ball field in the Gnome Stronghold."), + new CrypticClue("This crate holds a better reward than a broken arrow.", null, "Inside the Ranging Guild. Search the crate behind the northern most building."), + new CrypticClue("Search the drawers in the house next to the Port Sarim mage shop.", null, "House east of Betty's. Contains a cooking sink."), + new CrypticClue("With a name like that, you'd expect a little more than just a few scimitars.", null, "Speak to Daga on Ape Atoll."), + new CrypticClue("Strength potions with red spiders' eggs? He is quite a herbalist.", null, "Talk to Apothecary in the South-western Varrock. (the) apothecary is just north-west of the Varrock Swordshop."), + new CrypticClue("Robin wishes to see your finest range equipment.", null, "Robin at the inn in Port Phasmatys. Speak to him with +182 in ranged attack bonus."), + new CrypticClue("You will need to under-cook to solve this one.", null, "Search the crate in the Lumbridge basement."), + new CrypticClue("Search through some drawers found in Taverley's houses.", null, "The south-eastern most house, south of Jatix's Herblore Shop."), + new CrypticClue("Anger Abbot Langley.", null, "Speak to Abbot Langley while you have a negative prayer bonus"), + new CrypticClue("Dig where only the skilled, the wealthy, or the brave can choose not to visit again.", null, "Dig at Lumbridge spawn"), + new CrypticClue("Scattered coins and gems fill the floor. The chest you seek is in the north east.", null, "Kill the King Black Dragon for a key (elite), and then open the closed chest in the NE corner of the lair."), + new CrypticClue("A ring of water surrounds 4 powerful rings. Dig by the ladder that is located there.", null, "Dig by the ladder leading to the Dagannoth Kings room in the Waterbirth Island Dungeon."), + new CrypticClue("This place sure is a mess.", null, "Ewesey is located in the Hosidius House mess hall in Great Kourend."), + new CrypticClue("Here, there are tears, but nobody is crying. Speak to the guardian and show off your alignment to balance.", null, "Talk to Juna while wearing three Guthix related items."), + new CrypticClue("You might have to turn over a few stones to progress.", null, "Kill a rock crab and pick up the casket (elite) that it drops."), + new CrypticClue("Dig under Razorlor's toad batta.", null, "Dig on the toad batta spawn in Tarn's Lair."), + new CrypticClue("Talk to Cassie in Falador.", null, "Cassie is found just south-east of the northern Falador gate."), + new CrypticClue("Faint sounds of 'Arr', fire giants found deep, the eastern tip of a lake, are the rewards you could reap.", null, "Dig south of the pillar at the end of the Deep Wilderness Dungeon."), + new CrypticClue("If you're feeling brave, dig beneath the dragon's eye.", null, "Dig below the mossy rock under the Viyeldi caves."), + new CrypticClue("Search the tents in the Imperial Guard camp in Burthorpe for some boxes.", null, "Search in the tents in northwest corner of the camp."), + new CrypticClue("A dwarf, approaching death, but very much in the light.", null, "Thorgel at the entrance to the Death altar"), + new CrypticClue("You must be 100 to play with me.", null, "Speak to the Veteran boat squire at Pest Control"), + new CrypticClue("Three rule below and three sit at top. Come dig at my entrance.", null, "Dig in front of the entrance to the Waterbirth Island Dungeon."), + new CrypticClue("Search the drawers in the ground floor of a shop in Yanille.", null, "Search the drawers in Yanille's hunting shop."), + new CrypticClue("Search the drawers of houses in Burthorpe.", null, "Inside Hild's house in the northeast corner of Burthorpe."), + new CrypticClue("Where safe to speak, the man who offers the pouch of smallest size wishes to see your alignment.", null, "Speak to the Mage of Zamorak south of the Rune Shop in Varrock while wearing three zamorakian items"), + new CrypticClue("Search the crates in the guard house of the northern gate of East Ardougne.", null, "The guard house is northeast of the Handelmort Mansion."), + new CrypticClue("Go to the village being attacked by trolls, search the drawers in one of the houses.", null, "Go to Dunstan's house in the northeast corner of Burthorpe. Kill Penda in the Toad and Chicken to obtain the key."), + new CrypticClue("You'll get licked.", null, "Kill a Bloodveld."), + new CrypticClue("She's small but can build both literally and figuratively, as long as you have their favour", null, "Speak to Lovada south of the Lovakengj House blast mine"), + new CrypticClue("Dig in front of the icy arena where 1 of 4 was fought.", null, "Where you fought Kamil from Desert Treasure."), + new CrypticClue("Speak to Roavar.", null, "Talk to Roavar in the Canifis tavern."), + new CrypticClue("Search the drawers upstairs of houses in the eastern part of Falador.", null, "House is located east of the eastern Falador bank and south of the fountain. The house is indicated by the icon on the minimap."), + new CrypticClue("Search the drawers found upstairs in East Ardougne's houses.", null, "Upstairs of the pub north of the Ardougne Castle."), + new CrypticClue("The far north eastern corner where 1 of 4 was defeated, the shadows still linger.", null, "Dig on the northeastern-most corner of the Shadow Dungeon. Bring a ring of visibility."), + new CrypticClue("Search the drawers in a house in Draynor Village.", null, "The drawer is located in the northernmost house in Draynor Village."), + new CrypticClue("Search the boxes in a shop in Taverley.", null, "The box inside Gaius' Two Handed Shop."), + new CrypticClue("I lie beneath the first descent to the holy encampment.", null, "Dig immediately after climbing down the first set of rocks towards Saradomin's encampment within the God Wars Dungeon."), + new CrypticClue("Search the upstairs drawers of a house in a village where pirates are known to have a good time.", null, "The house in the southeast corner of Brimhaven, northeast of Davon's Amulet Store. Kill any Pirate located around Brimhaven to obtain the key."), + new CrypticClue("Search the chest in the Duke of Lumbridge's bedroom.", null, "The Duke's room is on the 2nd floor in Lumbridge Castle."), + new CrypticClue("Talk to the Doomsayer.", null, "Doomsayer can be found just north of Lumbridge Castle entrance."), + new CrypticClue("Search the chests upstairs in Al Kharid Palace.", null, "The chest is located, in the northeast corner, on the first floor of the Al Kharid Palace"), + new CrypticClue("Search the boxes just outside the Armour shop in East Ardounge.", null, "Outside Zenesha's Plate Mail Body Shop"), + new CrypticClue("Surrounded by white walls and gems.", null, "Talk to Herquin, the gem store owner in Falador."), + new CrypticClue("Monk's residence in the far west. See robe storage device.", null, "Search the drawers upstairs in the chapel found on the southern coast of Great Kourend's Hosidius House. Directly south of the player-owned house portal."), + new CrypticClue("Search the drawers in Catherby's Archery shop.", null, "Hickton's Archery Emporium in Catherby."), + new CrypticClue("The hand ain't listening!", null, "Talk to The Face located by the manhole just north of the Port Sarim fishing shop."), + new CrypticClue("Search the chest in the left-hand tower of Camelot Castle.", null, "Located on the 2nd floor of the western tower of Camelot."), + new CrypticClue("Kill the spiritual, magic and godly whilst representing their own god", null, "Kill a spiritual mage in the God Wars Dungeon"), + new CrypticClue("Anger those who adhere to Saradomin's edicts to prevent travel.", null, "Port Sarim Docks, try to charter a ship to Entrana with armour or weapons equipped."), + new CrypticClue("South of a river in a town surrounded by the undead, what lies beneath the furnace?", null, "Dig in front of the Shilo Village furnace."), + new CrypticClue("Talk to the Squire in the White Knights' castle in Falador.", null, "The squire is located in the courtyard of the White Knights' Castle."), + new CrypticClue("Thanks Grandma!", null, "Tynan can be found in the north-east corner of Piscarilius House in Great Kourend."), + new CrypticClue("In a town where everyone has perfect vision, seek some locked drawers in a house that sits opposite a workshop.", null, "The drawers is in Seers' Village in the house south of the Elemental Workshop entrance. Kill any Chicken to obtain a key."), + new CrypticClue("The treasure is buried in a small building full of bones. Here is a hint: it's not near a graveyard.", null, "In the western building near the Limestone quarry east of Varrock. Dig south of the box of bones in the smaller building."), + new CrypticClue("Search the crates in East Ardougne's general store.", null, "Located south of the Ardounge church."), + new CrypticClue("Come brave adventurer, your sense is on fire. If you talk to me, it's an old god you desire.", null, "Speak to Viggora"), + new CrypticClue("2 musical birds. Dig in front of the spinning light.", null, "Dig in front of the spinning light in Ping and Pong's room inside the Iceberg"), + new CrypticClue("Search the wheelbarrow in Rimmington mine.", null, "The Rimmington mining site is located north of Rimmington."), + new CrypticClue("Belladonna, my dear. If only I had gloves, then I could hold you at last.", null, "Talk to Tool Leprechaun at Draynor Manor"), + new CrypticClue("Impossible to make angry", null, "Speak to Abbot Langley"), + new CrypticClue("Search the crates in Horvik's armoury.", null, "Horvik's in Varrock"), + new CrypticClue("Ghommal wishes to be impressed by how strong your equipment is.", null, "Talk to Ghommal at the Warrior's Guild while wearing sufficiently strong equipment"), + new CrypticClue("Shhhh!", null, "Speak to Logosia in the Arceuus House Library's ground floor."), + new CrypticClue("Salty Peter", null, "Talk to Konoo who is digging saltpeter in the Hosidius district in Zeah."), + new CrypticClue("Talk to Zeke in Al Kharid.", null, "Zeke is the owner of the scimitar shop in Al Kharid."), + new CrypticClue("Guthix left his mark in a fiery lake, dig at the tip of it.", null, "Dig at the tip of the lava lake that is shaped like a Guthixian symbol, west of the Mage Arena."), + new CrypticClue("Search the drawers in the upstairs of a house in Catherby.", null, "Perdu's house in Catherby."), + new CrypticClue("Search a crate in the Haymaker's arms.", null, "Search the crate in the north-east corner of The Haymaker's Arms tavern east of the Woodcutting Guild."), + new CrypticClue("Desert insects is what I see, Taking care of them was my responsibility. Your solution is found by digging near me.", null, "Dig next to the Entomologist, Kalphite area, Stronghold Slayer Cave."), + new CrypticClue("Search the crates in most north-western house in Al Kharid.", null, "Search the crates in the house, marked with a icon, southeast of the gem stall."), + new CrypticClue("You will have to fly high where a sword cannot help you.", null, "Kill an Aviansie."), + new CrypticClue("A massive battle rages beneath so be careful when you dig by the large broken crossbow.", null, "NE of the God Wars Dungeon entrance, climb the rocky handholds & dig by large crossbow."), + new CrypticClue("Mix yellow with blue and add heat, make sure you bring protection.", null, "Kill a green dragon."), + new CrypticClue("Speak to Ellis in Al Kharid.", null, "Ellis is tanner just north of Al Kharid bank."), + new CrypticClue("Search the chests in the Dwarven Mine.", null, "The chest is on the western wall, where Hura's Crossbow Shop is, in the Dwarven Mine."), + new CrypticClue("In a while...", null, "Kill a crocodile."), + new CrypticClue("A chisel and hammer reside in his home, strange for one of magic. Impress him with your magical equipment.", null, "Wizard Cromperty NE, East Ardougne. +100 magic attack bonus needed"), + new CrypticClue("You have all of the elements available to solve this clue. Fortunately you do not have to go as far as to stand in a draft.", null, "Search the crate, west of the Air Elementals, inside the Elemental Workshop."), + new CrypticClue("A demon's best friend holds the next step of this clue.", null, "Kill a hellhound"), + new CrypticClue("Dig in the centre of a great city of 5 districts.", null, "Dig in front of the large statue in the centre of Great Kourend."), + new CrypticClue("Hopefully this set of armor will help you to keep surviving.", null, "Speak to Sir Vyvin while wearing a white full helm, platebody, and platelegs."), + new CrypticClue("North of the best monkey restaurant on Karamja, look for the centre of the triangle of boats and search there", null, "The crate on the dock to the west of the fishing site on the Northern shore of Karamja."), + new CrypticClue("The beasts retreat, for their Queen is gone; the song of this town still plays on. Dig near the birthplace of a blade, be careful not to melt your spade.", null, "Dig in front of the small furnace in the Piscatoris Fishing Colony."), + new CrypticClue("Darkness wanders around me, but fills my mind with knowledge.", null, "Speak to Biblia on the Arceuus House Library's top floor."), + new CrypticClue("I would make a chemistry joke, but I'm afraid I wouldn't get a reaction.", null, "Talk to the Chemist in Rimmington"), + new CrypticClue("Show this to Hazelmere.", null, "Hazelmere is found upstairs on the island located just east of Yanille."), + new CrypticClue("Does one really need a fire to stay warm here?", null, "Dig next to the fire near the Volcanic Mine entrance."), + new CrypticClue("Search the open crate found in a small farmhouse in Hosidius. Cabbages grow outside.", null, "The house is east of the Mess in Great Kourend.") + ); + + private String text; + private String npc; + private int objectId; + private WorldPoint location; + private String solution; + + private CrypticClue(String text, WorldPoint location, String solution) + { + this(text, null, -1, location, solution); + } + + private CrypticClue(String text, int objectId, WorldPoint location, String solution) + { + this(text, null, objectId, location, solution); + } + + private CrypticClue(String text, String npc, WorldPoint location, String solution) + { + this(text, npc, -1, location, solution); + } + + private CrypticClue(String text, String npc, int objectId, WorldPoint location, String solution) + { + this.text = text; + this.npc = npc; + this.objectId = objectId; + this.location = location; + this.solution = solution; + } + + @Override + public void makeOverlayHint(PanelComponent panelComponent, ClueScrollPlugin plugin) + { + panelComponent.setTitle("Cryptic Clue"); + panelComponent.setWidth(150); + + panelComponent.getLines().add(new PanelComponent.Line("Clue:")); + panelComponent.getLines().add(new PanelComponent.Line(true, getText(), TITLED_CONTENT_COLOR)); + + if (getNpc() != null) + { + panelComponent.getLines().add(new PanelComponent.Line("NPC:")); + panelComponent.getLines().add(new PanelComponent.Line(getNpc(), TITLED_CONTENT_COLOR)); + } + + if (objectId != -1) + { + ObjectComposition object = plugin.getClient().getObjectDefinition(getObjectId()); + + if (object != null) + { + panelComponent.getLines().add(new PanelComponent.Line("Object:")); + panelComponent.getLines().add(new PanelComponent.Line(object.getName(), TITLED_CONTENT_COLOR)); + } + } + + panelComponent.getLines().add(new PanelComponent.Line("Solution:")); + panelComponent.getLines().add(new PanelComponent.Line(true, getSolution(), TITLED_CONTENT_COLOR)); + } + + @Override + public void makeWorldOverlayHint(Graphics2D graphics, ClueScrollPlugin plugin) + { + // Mark dig location + if (getLocation() != null && getNpc() == null && objectId == -1) + { + LocalPoint localLocation = LocalPoint.fromWorld(plugin.getClient(), getLocation()); + + if (localLocation != null) + { + OverlayUtil.renderTileOverlay(plugin.getClient(), graphics, localLocation, SPADE_IMAGE, Color.ORANGE); + } + } + + // Mark NPC + if (plugin.getNpcsToMark() != null) + { + for (NPC npc : plugin.getNpcsToMark()) + { + OverlayUtil.renderActorOverlayImage(graphics, npc, CLUE_SCROLL_IMAGE, Color.ORANGE, IMAGE_Z_OFFSET); + } + } + + // Mark game object + if (objectId != -1) + { + net.runelite.api.Point mousePosition = plugin.getClient().getMouseCanvasPosition(); + + if (plugin.getObjectsToMark() != null) + { + for (GameObject gameObject : plugin.getObjectsToMark()) + { + OverlayUtil.renderHoverableArea(graphics, gameObject.getClickbox(), mousePosition, + CLICKBOX_FILL_COLOR, CLICKBOX_BORDER_COLOR, CLICKBOX_HOVER_BORDER_COLOR); + + OverlayUtil.renderImageLocation(plugin.getClient(), graphics, gameObject.getLocalLocation(), CLUE_SCROLL_IMAGE, IMAGE_Z_OFFSET); + } + } + } + } + + public static CrypticClue forText(String text) + { + for (CrypticClue clue : CLUES) + { + if (clue.text.equalsIgnoreCase(text)) + { + return clue; + } + } + + return null; + } +} diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/clues/Emote.java b/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/clues/Emote.java new file mode 100644 index 0000000000..d98d60e2d8 --- /dev/null +++ b/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/clues/Emote.java @@ -0,0 +1,75 @@ +/* + * Copyright (c) 2018, Lotto + * 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.Getter; +import static net.runelite.api.SpriteID.*; + +@Getter +public enum Emote +{ + BULL_ROARER("Bull Roarer", -1), + YES("Yes", EMOTE_YES), + NO("No", EMOTE_NO), + THINK("Think", EMOTE_THINK), + BOW("Bow", EMOTE_BOW), + ANGRY("Angry", EMOTE_ANGRY), + CRY("Cry", EMOTE_CRY), + LAUGH("Laugh", EMOTE_LAUGH), + CHEER("Cheer", EMOTE_CHEER), + WAVE("Wave", EMOTE_WAVE), + BECKON("Beckon", EMOTE_BECKON), + DANCE("Dance", EMOTE_DANCE), + CLAP("Clap", EMOTE_CLAP), + PANIC("Panic", EMOTE_PANIC), + JIG("Jig", EMOTE_JIG), + SPIN("Spin", EMOTE_SPIN), + HEADBANG("Headbang", EMOTE_HEADBANG), + JUMP_FOR_JOY("Jump for Joy", EMOTE_JUMP_FOR_JOY), + RASPBERRY("Raspberry", EMOTE_RASPBERRY), + YAWN("Yawn", EMOTE_YAWN), + SALUTE("Salute", EMOTE_SALUTE), + SHRUG("Shrug", EMOTE_SHRUG), + BLOW_KISS("Blow Kiss", EMOTE_BLOW_KISS), + GOBLIN_SALUTE("Goblin Salute", EMOTE_GOBLIN_SALUTE), + SLAP_HEAD("Slap Head", EMOTE_SLAP_HEAD), + STOMP("Stomp", EMOTE_STOMP), + FLAP("Flap", EMOTE_FLAP), + PUSH_UP("Push up", EMOTE_PUSH_UP); + + private String name; + private int spriteId; + + Emote(String name, int spriteId) + { + this.name = name; + this.spriteId = spriteId; + } + + public boolean hasSprite() + { + return spriteId != -1; + } +} 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 new file mode 100644 index 0000000000..b9d5311395 --- /dev/null +++ b/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/clues/EmoteClue.java @@ -0,0 +1,241 @@ +/* + * Copyright (c) 2018, Lotto + * 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 com.google.common.collect.ImmutableSet; +import java.awt.Color; +import java.awt.Graphics2D; +import java.util.Set; +import lombok.Getter; +import net.runelite.api.ItemComposition; +import net.runelite.api.coords.LocalPoint; +import net.runelite.api.coords.WorldPoint; +import net.runelite.client.plugins.cluescrolls.ClueScrollPlugin; +import net.runelite.client.ui.overlay.OverlayUtil; +import net.runelite.client.ui.overlay.components.PanelComponent; +import static net.runelite.api.ItemID.*; +import static net.runelite.client.plugins.cluescrolls.ClueScrollOverlay.TITLED_CONTENT_COLOR; +import static net.runelite.client.plugins.cluescrolls.ClueScrollWorldOverlay.EMOTE_IMAGE; +import static net.runelite.client.plugins.cluescrolls.clues.Emote.*; +import static net.runelite.client.plugins.cluescrolls.clues.Emote.BULL_ROARER; + +@Getter +public class EmoteClue extends ClueScroll implements TextClueScroll +{ + private static final Set CLUES = ImmutableSet.of( + new EmoteClue("Show your anger towards the Statue of Saradomin in Ellamaria's garden. Beware of double agents! Equip a Zamorak godsword.", new WorldPoint(3230, 3478, 0), ANGRY, ZAMORAK_GODSWORD), + 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.", new WorldPoint(3088, 3254, 0), ANGRY, ABYSSAL_WHIP, CAPE_OF_LEGENDS, SPINED_CHAPS), + 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.", new WorldPoint(2971, 3331, 0), BECKON, BOW, GREEN_HAT, SNAKESKIN_BOOTS, 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.", new WorldPoint(2784, 3065, 0), BECKON, CLAP, GREEN_DHIDE_CHAPS, RING_OF_DUELING8, MITHRIL_MED_HELM), + new EmoteClue("Beckon on the east coast of the Kharazi Jungle. Beware of double agents! Equip any vestment stole and a heraldic rune shield.", new WorldPoint(2954, 2933, 0), BECKON, SARADOMIN_STOLE, RUNE_SHIELD_H1_10667), + 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.", new WorldPoint(1545, 3594, 0), BECKON, ANGRY, ADAMANT_PLATELEGS, ADAMANT_PLATEBODY, ADAMANT_FULL_HELM), + new EmoteClue("Bow near Lord Iorwerth. Beware of double agents! Equip a new imbued crystal bow.", new WorldPoint(2205, 3252, 0), BOW, NEW_CRYSTAL_BOW_I), + new EmoteClue("Bow outside the entrance to the Legends' Guild. Equip iron platelegs, an emerald amulet and an oak longbow.", new WorldPoint(2709, 4113, 0), BOW, IRON_PLATELEGS, OAK_LONGBOW, 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.", new WorldPoint(2728, 3377, 0), BOW, CAPE_OF_LEGENDS, DRAGON_BATTLEAXE, AMULET_OF_GLORY), + new EmoteClue("Bow in the ticket office of the Duel Arena. Equip an iron chain body, leather chaps and coif.", new WorldPoint(3314, 3241, 0), BOW, IRON_CHAINBODY, LEATHER_CHAPS, COIF), + new EmoteClue("Bow at the top of the lighthouse. Beware of double agents! Equip a blue dragonhide body, blue dragonhide vambraces and no jewellery.", new WorldPoint(2511, 3641, 2), BOW, BLUE_DHIDE_BODY, BLUE_DHIDE_VAMB), + new EmoteClue("Bow upstairs in the Monastery. Equip a completed prayer book.", new WorldPoint(3136, 3513, 0), BOW, HOLY_BOOK, UNHOLY_BOOK, BOOK_OF_BALANCE), + 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 plate body.", new WorldPoint(2851, 2954, 0), BLOW_KISS, MYSTIC_HAT, BONE_SPEAR, 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.", new WorldPoint(2417, 4454, 0), BLOW_KISS, BLACK_DHIDE_CHAPS, SPOTTED_CAPE, 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.", new WorldPoint(2925, 5333, 0), BLOW_KISS, ZAMORAK_FULL_HELM, SHADOW_SWORD), + new EmoteClue("Cheer at the Druids' Circle. Equip a blue wizard hat, a bronze two-handed sword and HAM boots.", new WorldPoint(2925, 3484, 0), CHEER, BLUE_WIZARD_HAT, BRONZE_2H_SWORD, HAM_BOOTS), + new EmoteClue("Cheer at the games room. Have nothing equipped at all when you do.", new WorldPoint(2207, 4952, 0), CHEER), + new EmoteClue("Cheer in the Barbarian Agility Arena. Headbang before you talk to me. Equip a steel platebody, maple shortbow and a Wilderness cape.", new WorldPoint(2552, 3557, 0), CHEER, HEADBANG, STEEL_PLATEBODY, MAPLE_SHORTBOW, TEAM1_CAPE), + new EmoteClue("Cheer in the Edgeville general store. Dance before you talk to me. Equip a brown apron, leather boots and leather gloves.", new WorldPoint(3080, 3509, 0), CHEER, DANCE, BROWN_APRON, LEATHER_BOOTS, 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.", new WorldPoint(2527, 3375, 0), CHEER, ANGRY, GREEN_DHIDE_BODY, GREEN_DHIDE_CHAPS, STEEL_SQ_SHIELD), + new EmoteClue("Cheer in the Shadow dungeon. Equip a rune crossbow, climbing boots and any mitre.", new WorldPoint(2774, 6785, 0), CHEER, RUNE_CROSSBOW, CLIMBING_BOOTS, SARADOMIN_MITRE), + new EmoteClue("Cheer in the Entrana church. Beware of double agents! Equip a set of full black dragonhide armour.", new WorldPoint(2852, 3349, 0), CHEER, BLACK_DHIDE_VAMB, BLACK_DHIDE_CHAPS, BLACK_DHIDE_BODY), + new EmoteClue("Cheer for the monks at Port Sarim. Equip a coif, steel plate skirt and a sapphire necklace.", new WorldPoint(2959, 3362, 0), CHEER, COIF, STEEL_PLATESKIRT, SAPPHIRE_NECKLACE), + 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.", new WorldPoint(3043, 4697, 3), CHEER, MYSTIC_ROBE_TOP, RUNE_SHIELD_H1_10667), + new EmoteClue("Clap in the main exam room in the Exam Centre. Equip a white apron, green gnome boots and leather gloves.", new WorldPoint(3361, 3339, 0), CLAP, WHITE_APRON, GREEN_BOOTS, LEATHER_GLOVES), + new EmoteClue("Clap on the causeway to the Wizards' Tower. Equip an iron med helm, emerald ring and a white apron.", new WorldPoint(3098, 3212, 0), CLAP, IRON_MED_HELM, EMERALD_RING, 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.", new WorldPoint(2653, 3279, 0), CLAP, BLUE_ROBE_TOP, HAM_ROBE, 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.", new WorldPoint(2735, 3469, 0), CLAP, SPIN, ADAMANT_HALBERD, MYSTIC_ROBE_BOTTOM, DIAMOND_RING), + new EmoteClue("Clap in the magic axe hut. Beware of double agents. Equip only flared trousers.", new WorldPoint(3191, 3960, 0), CLAP, FLARED_TROUSERS), + 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.", new WorldPoint(2823, 3443, 0), CRY, BOW, BLUE_BOOTS, HARDLEATHER_BODY, 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.", new WorldPoint(3079, 6330, 0), CRY, LAUGH, ADAMANT_SQ_SHIELD, BONE_DAGGER, MITHRIL_PLATELEGS), + 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.", new WorldPoint(2473, 3420, 0), CRY, NO, STEEL_KITESHIELD, RING_OF_FORGING, GREEN_DHIDE_CHAPS), + new EmoteClue("Cry in the Tzhaar gem shop. Beware of the double agents! Equip a fire cape and a Toktz-xil-ul.", new WorldPoint(2463, 5149, 0), CRY, FIRE_CAPE, 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 plate skirt.", new WorldPoint(3128, 3245, 0), CRY, JUMP_FOR_JOY, ADAMANT_SWORD, SAPPHIRE_AMULET, ADAMANT_PLATESKIRT), + new EmoteClue("Dance at the crossroads north of Draynor. Equip an iron chain body, a sapphire ring and a longbow.", new WorldPoint(3018, 3357, 0), DANCE, IRON_CHAINBODY, SAPPHIRE_RING, LONGBOW), + new EmoteClue("Dance in the Party Room. Equip a steel full helmet, steel platebody and an iron plate skirt.", new WorldPoint(2863, 3272, 0), DANCE, STEEL_FULL_HELM, STEEL_PLATEBODY, IRON_PLATESKIRT), + new EmoteClue("Dance in the shack in Lumbridge Swamp. Equip a bronze dagger, iron full helmet and a gold ring.", new WorldPoint(3096, 3202, 0), DANCE, BRONZE_DAGGER, IRON_FULL_HELM, 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.", new WorldPoint(3223, 9597, 0), DANCE, BLOW_KISS, STAFF_OF_AIR, BRONZE_FULL_HELM, 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.", new WorldPoint(3294, 2781, 0), DANCE, RING_OF_LIFE, AMULET_OF_GLORY, ADAMANT_2H_SWORD), + new EmoteClue("Dance in the centre of Canifis. Bow before you talk to me. Equip a green gnome robe top, mithril platelegs and an iron two-handed sword.", new WorldPoint(3492, 3488, 0), DANCE, BOW, ADAMANT_2H_SWORD, MITHRIL_PLATELEGS, IRON_2H_SWORD), + new EmoteClue("Dance in the King Black Dragon's lair. Beware of double agents! Equip a black dragonhide body, black dragonhide vambs and a black dragon mask.", new WorldPoint(2271, 4680, 0), DANCE, BLACK_DHIDE_BODY, BLACK_DHIDE_VAMB, BLACK_DRAGON_MASK), + new EmoteClue("Dance in Iban's temple. Beware of double agents! Equip Iban's staff, a black mystic top, and a black mystic bottom.", new WorldPoint(2011, 4712, 0), DANCE, IBANS_STAFF, MYSTIC_ROBE_TOP_DARK, MYSTIC_ROBE_BOTTOM_DARK), + new EmoteClue("Dance on the Fishing Platform. Equip barrows gloves, an amulet of glory and a dragon med helm.", new WorldPoint(2782, 3273, 0), DANCE, BARROWS_GLOVES, AMULET_OF_GLORY, DRAGON_MED_HELM), + new EmoteClue("Dance at the entrance to the Grand Exchange. Equip a pink skirt, pink robe top and a body tiara.", new WorldPoint(3165, 3467, 0), DANCE, PINK_SKIRT, PINK_ROBE_TOP, BODY_TIARA), + new EmoteClue("Flap at the death altar. Beware of double agents! Equip a death tiara, a legend's cape and any ring of wealth.", new WorldPoint(2205, 4838, 0), FLAP, DEATH_TIARA, CAPE_OF_LEGENDS, RING_OF_WEALTH), + new EmoteClue("Goblin Salute in the Goblin Village. Beware of double agents! Equip a Bandos platebody, Bandos cloak and Bandos godsword.", new WorldPoint(2956, 3505, 0), GOBLIN_SALUTE, BANDOS_PLATEBODY, BANDOS_CLOAK, BANDOS_GODSWORD), + new EmoteClue("Headbang in the mine north of Al Kharid. Equip a desert shirt, leather gloves and leather boots.", new WorldPoint(3124, 3304, 0), HEADBANG, DESERT_SHIRT, LEATHER_GLOVES, LEATHER_BOOTS), + new EmoteClue("Headbang at the exam center. Beware of double agents! Equip a mystic fire staff, a diamond bracelet and rune boots.", new WorldPoint(3362, 3340, 0), HEADBANG, MYSTIC_FIRE_STAFF, DIAMOND_BRACELET, RUNE_BOOTS), + new EmoteClue("Headbang at the top of Slayer Tower. Equip a seercull, a combat bracelet and helm of Neitiznot.", new WorldPoint(3115, 3420, 0), HEADBANG, SEERCULL, COMBAT_BRACELET, 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.", new WorldPoint(2610, 3391, 0), DANCE, EMERALD_RING, SAPPHIRE_AMULET, 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.", new WorldPoint(2983, 3305, 0), DANCE, BOW, BRUISE_BLUE_SNELM_3343, STAFF_OF_AIR, BRONZE_SQ_SHIELD), + new EmoteClue("Jig at Jiggig. Beware of double agents! Equip a Rune spear, rune platelegs and any rune heraldic helm.", new WorldPoint(2477, 3047, 0), JIG, RUNE_SPEAR, RUNE_PLATELEGS, RUNE_HELM_H1), + new EmoteClue("Do a jig in Varrock's rune store. Equip an air tiara and a staff of water.", new WorldPoint(3253, 3401, 0), JIG, AIR_TIARA, STAFF_OF_WATER), + new EmoteClue("Dance a jig by the Barrows reward chest. Beware of double agents! Equip any set of Barrows equipment.", new WorldPoint(3551, 9694, 0), DANCE), + new EmoteClue("Jump for joy at the beehives. Equip a desert shirt, green gnome robe bottoms and a steel axe.", new WorldPoint(2759, 3445, 0), JUMP_FOR_JOY, DESERT_SHIRT, GREEN_ROBE_BOTTOMS, STEEL_AXE), + new EmoteClue("Jump for joy in Yanille bank. Dance a jig before you talk to me. Equip a brown apron, adamant med helm and snakeskin chaps.", new WorldPoint(2760, 3299, 0), JUMP_FOR_JOY, JIG, BROWN_APRON, ADAMANT_MED_HELM, SNAKESKIN_CHAPS), + new EmoteClue("Jump for joy in the TzHaar sword shop. Shrug before you talk to me. Equip a steel longsword, blue dragonhide body and blue mystic gloves.", new WorldPoint(2477, 5146, 0), JUMP_FOR_JOY, SHRUG, STEEL_LONGSWORD, BLUE_DHIDE_BODY, MYSTIC_GLOVES), + new EmoteClue("Jump for joy in the Ancient Cavern. Equip a granite shield, splitbark body, and any rune heraldic helm.", new WorldPoint(2339, 6787, 0), JUMP_FOR_JOY, GRANITE_SHIELD, SPLITBARK_BODY, RUNE_HELM_H1), + new EmoteClue("Jump for joy at the Neitiznot rune rock. Equip rune boots, a proselyte hauberk and a dragonstone ring.", new WorldPoint(2375, 3850, 0), JUMP_FOR_JOY, RUNE_BOOTS, PROSELYTE_HAUBERK, 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.", new WorldPoint(2199, 3056, 0), JUMP_FOR_JOY, DRAGON_2H_SWORD, BANDOS_BOOTS, OBSIDIAN_CAPE), + new EmoteClue("Laugh by the fountain of heroes. Equip splitbark legs, dragon boots and a rune longsword.", new WorldPoint(2716, 6584, 0), LAUGH, SPLITBARK_LEGS, DRAGON_BOOTS, 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.", new WorldPoint(2812, 3681, 0), LAUGH, RUNE_FULL_HELM, BLUE_DHIDE_CHAPS, FIRE_BATTLESTAFF), + new EmoteClue("Laugh at the crossroads south of the Sinclair Mansion. Equip a cowl, blue wizard robe top and an iron scimitar.", new WorldPoint(2741, 3536, 0), LAUGH, LEATHER_COWL, EARTH_RUNE, IRON_SCIMITAR), + new EmoteClue("Panic in the Limestone Mine. Equip bronze platelegs, a steel pickaxe and a steel medium helmet.", new WorldPoint(3372, 3498, 0), PANIC, BRONZE_PLATELEGS, STEEL_PICKAXE, STEEL_MED_HELM), + new EmoteClue("Panic on the pier where you catch the Fishing trawler. Have nothing equipped at all when you do.", new WorldPoint(2676, 3169, 0), PANIC), + 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.", new WorldPoint(3438, 3501, 0), PANIC, MITHRIL_PLATESKIRT, MAPLE_LONGBOW), + new EmoteClue("Panic on the Wilderness volcano bridge. Beware of double agents! Equip any headband and crozier.", new WorldPoint(3368, 3935, 0), PANIC, RED_HEADBAND, SARADOMIN_CROZIER), + new EmoteClue("Panic in the heart of the Haunted Woods. Beware of double agents! Have no items equipped when you do.", new WorldPoint(3611, 3492, 0), PANIC), + 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.", new WorldPoint(2847, 3499, 0), PANIC, MITHRIL_PLATELEGS, RING_OF_LIFE, 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.", new WorldPoint(3227, 3831, 0), PANIC, DRAGON_MED_HELM, TOKTZKETXIL, BRINE_SABRE, RUNE_PLATEBODY, AMULET_OF_GLORY), + 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.", new WorldPoint(2843, 3543, 0), PUSH_UP, DRAGON_BATTLEAXE, DRAGON_DEFENDER, SLAYER_HELMET), + 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.", new WorldPoint(2853, 3329, 0), RASPBERRY, STUDDED_BODY, BRONZE_PLATELEGS, STAFF), + new EmoteClue("Blow raspberries outside the entrance to Keep Le Faye. Equip a coif, an iron platebody and leather gloves.", new WorldPoint(2705, 4057, 0), RASPBERRY, COIF, IRON_PLATEBODY, 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.", new WorldPoint(2588, 3419, 0), RASPBERRY, ELEMENTAL_SHIELD, BLUE_DHIDE_CHAPS, 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.", new WorldPoint(2918, 3168, 0), SALUTE, DIAMOND_RING, AMULET_OF_POWER), + new EmoteClue("Salute in the warriors' guild bank. Equip only a black salamander.", new WorldPoint(2844, 3542, 0), SALUTE, BLACK_SALAMANDER), + 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.", new WorldPoint(1646, 3632, 0), SALUTE, RUNE_HALBERD, RUNE_PLATEBODY, AMULET_OF_STRENGTH), + new EmoteClue("Shrug in the mine near Rimmington. Equip a gold necklace, a gold ring and a bronze spear.", new WorldPoint(2873, 3337, 0), SHRUG, GOLD_NECKLACE, GOLD_RING, BRONZE_SPEAR), + new EmoteClue("Shrug in Catherby bank. Yawn before you talk to me. Equip a maple longbow, green dragonhide chaps and an iron med helm.", new WorldPoint(2966, 3291, 0), SHRUG, YAWN, MAPLE_LONGBOW, GREEN_DHIDE_CHAPS, 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.", new WorldPoint(3239, 3611, 0), SHRUG, RUNE_PLATELEGS, IRON_PLATEBODY, BLUE_DHIDE_VAMB), + new EmoteClue("Slap your head in the centre of the Kourend catacombs. Beware of double agents! Equip the arclight and an amulet of the damned.", new WorldPoint(1666, 10050, 0), SLAP_HEAD, ARCLIGHT, AMULET_OF_THE_DAMNED), + new EmoteClue("Spin at the crossroads north of Rimmington. Equip a green gnome hat, cream gnome top and leather chaps.", new WorldPoint(2981, 3276, 0), SPIN, GREEN_HAT, CREAM_ROBE_TOP, LEATHER_CHAPS), + new EmoteClue("Spin in the Draynor Manor by the fountain. Equip an iron platebody, studded leather chaps and a bronze full helmet.", new WorldPoint(3088, 3336, 0), SPIN, IRON_PLATELEGS, STUDDED_CHAPS, 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.", new WorldPoint(1815, 3856, 0), SPIN, DRAGON_PICKAXE, HELM_OF_NEITIZNOT, RUNE_BOOTS), + new EmoteClue("Spin in the Varrock Castle courtyard. Equip a black axe, a coif and a ruby ring.", new WorldPoint(3023, 3309, 0), SPIN, BLACK_AXE, COIF, RUBY_RING), + new EmoteClue("Spin in West Ardougne Church. Equip a dragon spear and red dragonhide chaps.", new WorldPoint(2404, 4326, 0), SPIN, DRAGON_SPEAR, 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.", new WorldPoint(3058, 3334, 0), SPIN, SALUTE, PURPLE_GLOVES, STEEL_KITESHIELD, MITHRIL_FULL_HELM), + new EmoteClue("Stomp in the Enchanted valley west of the waterfall. Beware of double agents! Equip a dragon axe.", new WorldPoint(3034, 4518, 0), STOMP, 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.", new WorldPoint(3259, 3332, 0), THINK, BLUE_ROBE_TOP, TURQUOISE_ROBE_BOTTOMS, 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.", new WorldPoint(2439, 3161, 0), THINK, SPIN, MITHRIL_CHAINBODY, GREEN_DHIDE_CHAPS, RUBY_AMULET), + new EmoteClue("Wave along the south fence of the Lumber Yard. Equip a hard leather body, leather chaps and a bronze axe.", new WorldPoint(2971, 3438, 0), WAVE, HARDLEATHER_BODY, LEATHER_CHAPS, BRONZE_AXE), + new EmoteClue("Wave in the Falador gem store. Equip a Mithril pickaxe, Black platebody and an Iron Kiteshield.", new WorldPoint(2945, 3335, 0), WAVE, MITHRIL_PICKAXE, BLACK_PLATEBODY, IRON_KITESHIELD), + new EmoteClue("Wave on Mudskipper Point. Equip a black cape, leather chaps and a steel mace.", new WorldPoint(2995, 3119, 0), WAVE, BLACK_CAPE, LEATHER_CHAPS, STEEL_MACE), + new EmoteClue("Wave on the the nothern wall of the Castle Drakan. Beware of double agents! Wear a dragon sq shield, splitbark body and any boater.", new WorldPoint(3560, 3385, 0), WAVE, DRAGON_SQ_SHIELD, SPLITBARK_BODY, RED_BOATER), + new EmoteClue("Yawn in the 7th room of Pyramid Plunder. Beware of double agents! Equip a pharoah sceptre and a full set of menaphite robes.", new WorldPoint(1944, 4427, 0), YAWN, PHARAOHS_SCEPTRE_3, MENAPHITE_PURPLE_HAT, MENAPHITE_PURPLE_TOP, MENAPHITE_PURPLE_ROBE), + new EmoteClue("Yawn in the Varrock library. Equip a green gnome robe top, HAM robe bottom and an iron warhammer.", new WorldPoint(3209, 3492, 0), YAWN, GREEN_ROBE_TOP, HAM_ROBE, IRON_WARHAMMER), + new EmoteClue("Yawn in Draynor Marketplace. Equip studded leather chaps, an iron kiteshield and a steel longsword.", new WorldPoint(3076, 3310, 0), YAWN, STUDDED_CHAPS, IRON_KITESHIELD, 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.", new WorldPoint(2772, 3251, 0), YAWN, SHRUG, RUBY_AMULET, MITHRIL_SCIMITAR, TEAM1_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.", new WorldPoint(3026, 3701, 0), YAWN, ADAMANT_SQ_SHIELD, BLUE_DHIDE_VAMB, RUNE_PICKAXE), + new EmoteClue("Yawn at the top of Trollheim. Equip a lava battlestaff, black dragonhide vambraces and a mind shield.", new WorldPoint(2590, 4452, 0), YAWN, LAVA_BATTLESTAFF, BLACK_DHIDE_VAMB, 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.", new WorldPoint(1632, 3807, 0), YAWN, YES, BLUE_DHIDE_VAMB, ADAMANT_BOOTS, ADAMANT_DAGGER), + new EmoteClue("Swing a bullroarer at the top of the watchtower. Beware of double agents! Equip a dragon plate skirt, climbing boots and a dragon chainbody.", new WorldPoint(2932, 4712, 0), BULL_ROARER, DRAGON_PLATESKIRT, CLIMBING_BOOTS, DRAGON_CHAINBODY_3140) + ); + + private String text; + private WorldPoint location; + private Emote firstEmote; + private Emote secondEmote; + private int[] itemIds; + + private EmoteClue(String text, WorldPoint location, Emote emote, int... itemIds) + { + this(text, location, emote, null, itemIds); + } + + private EmoteClue(String text, WorldPoint location, Emote firstEmote, Emote secondEmote, int... itemIds) + { + this.text = text; + this.location = location; + this.firstEmote = firstEmote; + this.secondEmote = secondEmote; + this.itemIds = itemIds; + } + + @Override + public void makeOverlayHint(PanelComponent panelComponent, ClueScrollPlugin plugin) + { + panelComponent.setTitle("Emote Clue"); + + panelComponent.getLines().add(new PanelComponent.Line("Emotes:")); + panelComponent.getLines().add(new PanelComponent.Line(getFirstEmote().getName(), TITLED_CONTENT_COLOR)); + if (getSecondEmote() != null) + { + panelComponent.getLines().add(new PanelComponent.Line(getSecondEmote().getName(), TITLED_CONTENT_COLOR)); + } + + if (getItemIds().length != 0) + { + panelComponent.setWidth(160); + panelComponent.getLines().add(new PanelComponent.Line("Equip:")); + + if (plugin.getEquippedItems() != null) + { + for (int itemId : getItemIds()) + { + ItemComposition itemDefinition = plugin.getClient().getItemDefinition(itemId); + + if (itemDefinition != null) + { + if (plugin.getEquippedItems().contains(itemId)) + { + panelComponent.getLines().add(new PanelComponent.Line(itemDefinition.getName(), TITLED_CONTENT_COLOR, "X", Color.GREEN)); + } + else + { + panelComponent.getLines().add(new PanelComponent.Line(itemDefinition.getName(), TITLED_CONTENT_COLOR, "-", Color.RED)); + } + } + } + } + } + else + { + panelComponent.setWidth(130); + panelComponent.getLines().add(new PanelComponent.Line("Items:", "None")); + } + } + + @Override + public void makeWorldOverlayHint(Graphics2D graphics, ClueScrollPlugin plugin) + { + LocalPoint localLocation = LocalPoint.fromWorld(plugin.getClient(), getLocation()); + + if (localLocation == null) + { + return; + } + + OverlayUtil.renderTileOverlay(plugin.getClient(), graphics, localLocation, EMOTE_IMAGE, Color.ORANGE); + } + + public static EmoteClue forText(String text) + { + for (EmoteClue clue : CLUES) + { + if (clue.text.equalsIgnoreCase(text)) + { + return clue; + } + } + + return null; + } +} diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/clues/FairyRingClue.java b/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/clues/FairyRingClue.java new file mode 100644 index 0000000000..32b0531330 --- /dev/null +++ b/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/clues/FairyRingClue.java @@ -0,0 +1,103 @@ +/* + * Copyright (c) 2018, Lotto + * 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 com.google.common.collect.ImmutableSet; +import java.awt.Color; +import java.awt.Graphics2D; +import java.util.Set; +import lombok.Getter; +import net.runelite.api.coords.LocalPoint; +import net.runelite.api.coords.WorldPoint; +import net.runelite.client.plugins.cluescrolls.ClueScrollPlugin; +import net.runelite.client.ui.overlay.OverlayUtil; +import net.runelite.client.ui.overlay.components.PanelComponent; +import static net.runelite.client.plugins.cluescrolls.ClueScrollOverlay.TITLED_CONTENT_COLOR; +import static net.runelite.client.plugins.cluescrolls.ClueScrollWorldOverlay.SPADE_IMAGE; + +@Getter +public class FairyRingClue extends ClueScroll implements TextClueScroll +{ + private static final Set CLUES = ImmutableSet.of( + new FairyRingClue("A I R 2 3 3 1", new WorldPoint(2702, 3246, 0)), + new FairyRingClue("A I Q 0 4 4 0", new WorldPoint(3000, 3110, 0)), + new FairyRingClue("A L P 1 1 4 0", new WorldPoint(2504, 3633, 0)), + new FairyRingClue("B L P 6 2 0 0", new WorldPoint(2439, 5132, 0)), + new FairyRingClue("B J R 1 1 2 3", new WorldPoint(2648, 4729, 0)), + new FairyRingClue("B I P 7 0 1 3", new WorldPoint(3407, 3330, 0)), + new FairyRingClue("C I S 0 0 0 9", new WorldPoint(1630, 3868, 0)), + new FairyRingClue("C K P 0 2 2 4", new WorldPoint(2073, 4846, 0)), + new FairyRingClue("D I P 8 5 1 1", new WorldPoint(3041, 4770, 0)), + new FairyRingClue("D K S 2 3 1 0", new WorldPoint(2747, 3720, 0)) + ); + + private String text; + private WorldPoint location; + + private FairyRingClue(String text, WorldPoint location) + { + this.text = text; + this.location = location; + } + + @Override + public void makeOverlayHint(PanelComponent panelComponent, ClueScrollPlugin plugin) + { + panelComponent.setTitle("Fairy Ring Clue"); + panelComponent.setWidth(140); + + panelComponent.getLines().add(new PanelComponent.Line("Code:")); + panelComponent.getLines().add(new PanelComponent.Line(getText().substring(0, 5), TITLED_CONTENT_COLOR)); + + panelComponent.getLines().add(new PanelComponent.Line("Travel to the fairy ring")); + panelComponent.getLines().add(new PanelComponent.Line("to see where to dig.")); + } + + @Override + public void makeWorldOverlayHint(Graphics2D graphics, ClueScrollPlugin plugin) + { + LocalPoint localLocation = LocalPoint.fromWorld(plugin.getClient(), getLocation()); + + if (localLocation == null) + { + return; + } + + OverlayUtil.renderTileOverlay(plugin.getClient(), graphics, localLocation, SPADE_IMAGE, Color.ORANGE); + } + + public static FairyRingClue forText(String text) + { + for (FairyRingClue clue : CLUES) + { + if (clue.text.equalsIgnoreCase(text)) + { + return clue; + } + } + + return null; + } +} diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/clues/MapClue.java b/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/clues/MapClue.java new file mode 100644 index 0000000000..ea02ef9b7f --- /dev/null +++ b/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/clues/MapClue.java @@ -0,0 +1,174 @@ +/* + * Copyright (c) 2018, Lotto + * 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 com.google.common.collect.ImmutableSet; +import java.awt.Color; +import java.awt.Graphics2D; +import java.util.Set; +import lombok.Getter; +import net.runelite.api.GameObject; +import net.runelite.api.ObjectComposition; +import net.runelite.api.Region; +import net.runelite.api.Tile; +import net.runelite.api.coords.LocalPoint; +import net.runelite.api.coords.WorldPoint; +import net.runelite.client.plugins.cluescrolls.ClueScrollPlugin; +import net.runelite.client.ui.overlay.OverlayUtil; +import net.runelite.client.ui.overlay.components.PanelComponent; +import static net.runelite.api.ItemID.*; +import static net.runelite.api.ObjectID.*; +import static net.runelite.client.plugins.cluescrolls.ClueScrollWorldOverlay.CLICKBOX_BORDER_COLOR; +import static net.runelite.client.plugins.cluescrolls.ClueScrollWorldOverlay.CLICKBOX_FILL_COLOR; +import static net.runelite.client.plugins.cluescrolls.ClueScrollWorldOverlay.CLICKBOX_HOVER_BORDER_COLOR; +import static net.runelite.client.plugins.cluescrolls.ClueScrollWorldOverlay.CLUE_SCROLL_IMAGE; +import static net.runelite.client.plugins.cluescrolls.ClueScrollWorldOverlay.IMAGE_Z_OFFSET; +import static net.runelite.client.plugins.cluescrolls.ClueScrollWorldOverlay.SPADE_IMAGE; + +@Getter +public class MapClue extends ClueScroll implements ObjectClueScroll +{ + private static final Set CLUES = ImmutableSet.of( + new MapClue(CLUE_SCROLL_EASY_2713, new WorldPoint(2977, 3341, 0)), + new MapClue(CLUE_SCROLL_EASY_2716, new WorldPoint(3290, 3374, 0)), + new MapClue(CLUE_SCROLL_EASY_2719, new WorldPoint(3043, 3398, 0)), + new MapClue(CLUE_SCROLL_HARD, new WorldPoint(3309, 3502, 0), CRATE_2620), + new MapClue(CLUE_SCROLL_EASY_3516, new WorldPoint(2612, 3482, 0)), + new MapClue(CLUE_SCROLL_EASY_3518, new WorldPoint(3110, 3152, 0)), + new MapClue(CLUE_SCROLL_HARD_3520, new WorldPoint(2616, 3077, 0)), + new MapClue(CLUE_SCROLL_HARD_3522, new WorldPoint(2488, 3308, 0)), + new MapClue(CLUE_SCROLL_HARD_3524, new WorldPoint(3458, 3182, 0), CRATE_18506), + new MapClue(CLUE_SCROLL_HARD_3525, new WorldPoint(3026, 3629, 0), CRATE_354), + new MapClue(CLUE_SCROLL_MEDIUM_3596, new WorldPoint(2907, 3295, 0)), + new MapClue(CLUE_SCROLL_MEDIUM_3598, new WorldPoint(2659, 3488, 0), CRATE_357), + new MapClue(CLUE_SCROLL_MEDIUM_3599, new WorldPoint(2651, 3231, 0)), + new MapClue(CLUE_SCROLL_MEDIUM_3601, new WorldPoint(2564, 3249, 0), CRATE_354), + new MapClue(CLUE_SCROLL_MEDIUM_3602, new WorldPoint(2924, 3210, 0)), + new MapClue(CLUE_SCROLL_EASY_7236, new WorldPoint(2970, 3415, 0)), + new MapClue(CLUE_SCROLL_HARD_7241, new WorldPoint(2722, 3338, 0)), + new MapClue(CLUE_SCROLL_MEDIUM_7286, new WorldPoint(2536, 3865, 0)), + new MapClue(CLUE_SCROLL_MEDIUM_7288, new WorldPoint(3434, 3265, 0)), + new MapClue(CLUE_SCROLL_MEDIUM_7290, new WorldPoint(2454, 3230, 0)), + new MapClue(CLUE_SCROLL_MEDIUM_7292, new WorldPoint(2578, 3597, 0)), + new MapClue(CLUE_SCROLL_MEDIUM_7294, new WorldPoint(2666, 3562, 0)), + new MapClue(CLUE_SCROLL_ELITE_12130, new WorldPoint(2449, 3130, 0)), + new MapClue(CLUE_SCROLL_EASY_12179, new WorldPoint(3300, 3291, 0)) + ); + + private int itemId; + private WorldPoint location; + private int objectId; + + private MapClue(int itemId, WorldPoint location) + { + this(itemId, location, -1); + } + + private MapClue(int itemId, WorldPoint location, int objectId) + { + this.itemId = itemId; + this.location = location; + this.objectId = objectId; + } + + @Override + public void makeOverlayHint(PanelComponent panelComponent, ClueScrollPlugin plugin) + { + panelComponent.setTitle("Map Clue"); + + if (objectId != -1) + { + panelComponent.setWidth(150); + + ObjectComposition objectToClick = plugin.getClient().getObjectDefinition(getObjectId()); + + String objectName = "N/A"; + if (objectToClick != null) + { + objectName = objectToClick.getName(); + } + + panelComponent.getLines().add(new PanelComponent.Line("Travel to the destination")); + panelComponent.getLines().add(new PanelComponent.Line("and click the " + objectName + ".")); + } + else + { + panelComponent.setWidth(160); + + panelComponent.getLines().add(new PanelComponent.Line("Travel to the destination")); + panelComponent.getLines().add(new PanelComponent.Line("and dig on the marked tile.")); + } + } + + @Override + public void makeWorldOverlayHint(Graphics2D graphics, ClueScrollPlugin plugin) + { + LocalPoint localLocation = LocalPoint.fromWorld(plugin.getClient(), getLocation()); + + if (localLocation == null) + { + return; + } + + // Mark game object + if (objectId != -1) + { + Region region = plugin.getClient().getRegion(); + Tile[][][] tiles = region.getTiles(); + + Tile tile = tiles[plugin.getClient().getPlane()][localLocation.getRegionX()][localLocation.getRegionY()]; + + net.runelite.api.Point mousePosition = plugin.getClient().getMouseCanvasPosition(); + + for (GameObject gameObject : tile.getGameObjects()) + { + if (gameObject != null) + { + OverlayUtil.renderHoverableArea(graphics, gameObject.getClickbox(), mousePosition, + CLICKBOX_FILL_COLOR, CLICKBOX_BORDER_COLOR, CLICKBOX_HOVER_BORDER_COLOR); + + OverlayUtil.renderImageLocation(plugin.getClient(), graphics, localLocation, CLUE_SCROLL_IMAGE, IMAGE_Z_OFFSET); + } + } + } + else + { + OverlayUtil.renderTileOverlay(plugin.getClient(), graphics, localLocation, SPADE_IMAGE, Color.ORANGE); + } + } + + public static MapClue forItemId(int itemId) + { + for (MapClue clue : CLUES) + { + if (clue.itemId == itemId) + { + return clue; + } + } + + return null; + } +} diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/clues/NpcClueScroll.java b/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/clues/NpcClueScroll.java new file mode 100644 index 0000000000..df8d468817 --- /dev/null +++ b/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/clues/NpcClueScroll.java @@ -0,0 +1,30 @@ +/* + * Copyright (c) 2018, Lotto + * 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; + +public interface NpcClueScroll +{ + String getNpc(); +} diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/clues/ObjectClueScroll.java b/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/clues/ObjectClueScroll.java new file mode 100644 index 0000000000..87149e6a67 --- /dev/null +++ b/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/clues/ObjectClueScroll.java @@ -0,0 +1,30 @@ +/* + * Copyright (c) 2018, Lotto + * 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; + +public interface ObjectClueScroll +{ + int getObjectId(); +} diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/clues/TextClueScroll.java b/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/clues/TextClueScroll.java new file mode 100644 index 0000000000..d402606618 --- /dev/null +++ b/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/clues/TextClueScroll.java @@ -0,0 +1,30 @@ +/* + * Copyright (c) 2018, Lotto + * 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; + +public interface TextClueScroll +{ + String getText(); +} From 5eedb0d3c8f4a5b999fe5d39f978b86bdd749e2b Mon Sep 17 00:00:00 2001 From: Lotto Date: Mon, 26 Mar 2018 17:26:03 +0200 Subject: [PATCH 09/10] runelite-client: remove old clue scroll enums --- .../plugins/cluescrolls/ClueScroll.java | 661 ------------------ .../plugins/cluescrolls/ClueScrollType.java | 36 - 2 files changed, 697 deletions(-) delete mode 100644 runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/ClueScroll.java delete mode 100644 runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/ClueScrollType.java diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/ClueScroll.java b/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/ClueScroll.java deleted file mode 100644 index a1f626ec2b..0000000000 --- a/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/ClueScroll.java +++ /dev/null @@ -1,661 +0,0 @@ -/* - * Copyright (c) 2016-2017, Seth - * 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.cluescrolls; - -import java.util.HashMap; -import java.util.Map; -import static net.runelite.api.ItemID.*; -import static net.runelite.client.plugins.cluescrolls.ClueScrollType.ANAGRAM; -import static net.runelite.client.plugins.cluescrolls.ClueScrollType.CHALLENGE; -import static net.runelite.client.plugins.cluescrolls.ClueScrollType.CIPHER; -import static net.runelite.client.plugins.cluescrolls.ClueScrollType.CRYPTIC; -import static net.runelite.client.plugins.cluescrolls.ClueScrollType.EMOTE; - -public enum ClueScroll -{ - CLUE1(new int[] { BLACK_AXE, COIF, RUBY_RING }, "Spin in the Varrock Castle courtyard. Equip a black axe, a coif and a ruby ring.", EMOTE), - CLUE2(new int[] { STEEL_FULL_HELM, STEEL_PLATEBODY, IRON_PLATESKIRT }, "Dance in the Party Room. Equip a steel full helmet, steel platebody and an iron plateskirt.", EMOTE), - CLUE3(new int[] { DRAGON_SQ_SHIELD, SPLITBARK_BODY, ORANGE_BOATER }, "Wave on the the nothern wall of the Castle Drakan. Beware of double agents! Wear a dragon sq shield, splitbark body and any boater.", EMOTE), - CLUE4(new int[] { ADAMANT_SWORD, SAPPHIRE_AMULET, ADAMANT_PLATESKIRT }, "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.", EMOTE), - CLUE5(new int[] { }, "Cheer at the games room. Have nothing equipped at all when you do.", EMOTE), - CLUE6(new int[] { MYSTIC_FIRE_STAFF, DIAMOND_BRACELET, RUNE_BOOTS }, "Headbang at the exam center. Beware of double agents! Equip a mystic fire staff, a diamond bracelet and rune boots.", EMOTE), - CLUE7(new int[] { COIF, IRON_PLATEBODY, LEATHER_GLOVES }, "Blow raspberries outside the entrance to Keep Le Faye. Equip a coif, an iron platebody and leather gloves", EMOTE), - CLUE8(new int[] { BARROWS_GLOVES, AMULET_OF_GLORY, DRAGON_MED_HELM }, "Dance on the Fishing Platform. Equip barrows gloves, an amulet of glory and a dragon med helm.", EMOTE), - CLUE9(new int[] { RUNE_CROSSBOW, CLIMBING_BOOTS, ANCIENT_MITRE }, "Cheer in the Shadow dungeon. Equip a rune crossbow, climbing boots and any mitre.", EMOTE), - CLUE10(new int[] { MITHRIL_CHAINBODY, GREEN_DHIDE_CHAPS, RUBY_AMULET }, "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.", EMOTE), - CLUE11(new int[] { IRON_PLATELEGS, EMERALD_AMULET, OAK_LONGBOW }, "Bow outside the entrance to the Legends' Guild. Equip iron platelegs, an emerald amulet and an oak longbow.", EMOTE), - CLUE12(new int[] { GOLD_NECKLACE, GOLD_RING, BRONZE_SPEAR }, "Shrug in the mine near Rimmington. Equip a gold necklace, a gold ring and a bronze spear.", EMOTE), - CLUE13(new int[] { BRUISE_BLUE_SNELM, STAFF_OF_AIR, BRONZE_SQ_SHIELD }, "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.", EMOTE), - CLUE14(new int[] { }, "Dance a jig by the Barrow's reward chest. Beware of double agents! Equip any set of Barrows equipment.", EMOTE), - CLUE15(new int[] { ZAMORAK_FULL_HELM, SHADOW_SWORD }, "Blow a kiss outside K'ril Tsutsaroth's chamber. Beware of double agents! Equip a Zamorak full helm and the shadow sword.", EMOTE), - CLUE16(new int[] { COIF, STEEL_PLATESKIRT, SAPPHIRE_NECKLACE }, "Cheer for the monks at Port Sarim. Equip a coif, steel plateskirt and a sapphire necklace.", EMOTE), - CLUE17(new int[] { DRAGON_2H_SWORD, BANDOS_BOOTS, OBSIDIAN_CAPE }, "Jump for joy in the centre of Zul-Andra. Beware of double agents! Equip a dragon 2h sword, bandos boots and an obsidian cape.", EMOTE), - CLUE18(new int[] { IBANS_STAFF, MYSTIC_ROBE_TOP_DARK, MYSTIC_ROBE_BOTTOM_DARK }, "Dance in Iban's temple. Beware of double agents! Equip Iban's staff, a black mystic top, and a black mystic bottom.", EMOTE), - CLUE19(new int[] { GREEN_DHIDE_BODY, GREEN_DHIDE_CHAPS, STEEL_SQ_SHIELD }, "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.", EMOTE), - CLUE20(new int[] { CRYSTAL_BOW_FULL_I }, "Bow near Lord Iorwerth. Beware of double agents! Equip a new imbued crystal bow.", EMOTE), - CLUE21(new int[] { BROWN_APRON, LEATHER_BOOTS, LEATHER_GLOVES }, "Cheer in the Edgeville general store. Dance before you talk to me. Equip a brown apron, leather boots and leather gloves.", EMOTE), - CLUE22(new int[] { DRAGON_PLATESKIRT, CLIMBING_BOOTS, DRAGON_CHAINBODY }, "Swing a bullroarer at the top of the watchtower. Beware of double agents! Equip a dragon plateskirt, climbing boots and a dragon chainbody.", EMOTE), - CLUE23(new int[] { MAPLE_LONGBOW, GREEN_DHIDE_CHAPS, IRON_MED_HELM }, "Shrug in Catherby bank. Yawn before you talk to me. Equip a maple longbow, green dragonhide chaps and an iron med helm.", EMOTE), - CLUE24(new int[] { DESERT_SHIRT, GREEN_ROBE_BOTTOMS, STEEL_AXE }, "Jump for joy at the beehives. Equip a desert shirt, green gnome robe bottoms and a steel axe.", EMOTE), - CLUE25(new int[] { GRANITE_SHIELD, SPLITBARK_BODY, RUNE_HELM_H1 }, "Jump for joy in the Ancient Cavern. Equip a granite shield, splitbark body, and any rune heraldic helm.", EMOTE), - CLUE26(new int[] { BLACK_DHIDE_BODY, BLACK_DHIDE_VAMB, BLACK_DRAGON_MASK }, "Dance in the King Black Dragon's lair. Beware of double agents! Equip a black dragonhide body, black dragonhide vambs and a black dragon mask.", EMOTE), - CLUE27(new int[] { FIRE_CAPE, TOKTZXILUL }, "Cry in the Tzhaar gem shop. Beware of the double agents! Equip a fire cape and a Toktz-xil-ul.", EMOTE), - CLUE28(new int[] { BLUE_ROBE_TOP, TURQUOISE_ROBE_BOTTOMS, OAK_SHORTBOW }, "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.", EMOTE), - CLUE29(new int[] { STEEL_PLATEBODY, MAPLE_SHORTBOW, TEAM1_CAPE }, "Cheer in the Barbarian Agility Arena. Headbang before you talk to me. Equip a steel platebody, maple shortbow and a Wilderness cape.", EMOTE), - CLUE30(new int[] { ELEMENTAL_SHIELD, BLUE_DHIDE_CHAPS, RUNE_WARHAMMER }, "Blow a raspberry in the Fishing Guild bank. Beware of double agents! Equip an elemental shield, blue dragonhide chaps and a rune warhammer.", EMOTE), - CLUE31(new int[] { WIZARD_HAT, BRONZE_2H_SWORD, HAM_BOOTS }, "Cheer at the Druids' Circle. Equip a blue wizard hat, a bronze two-handed sword and HAM boots.", EMOTE), - CLUE32(new int[] { FLARED_TROUSERS }, "Clap in the magic axe hut. Beware of double agents. Equip only flared trousers", EMOTE), - CLUE33(new int[] { ABYSSAL_WHIP, CAPE_OF_LEGENDS, SPINED_CHAPS }, "Show your anger at the Wise old man. Beware of double agents! Equip an abyssal whip, a legend's cape and some spined chaps.", EMOTE), - CLUE34(new int[] { IRON_MED_HELM, EMERALD_RING, WHITE_APRON }, "Clap on the causeway to the Wizards' Tower. Equip an iron med helm, emerald ring and a white apron.", EMOTE), - CLUE35(new int[] { SPLITBARK_LEGS, DRAGON_BOOTS, RUNE_LONGSWORD }, "Laugh by the fountain of heroes. Equip splitbark legs, dragon boots and a Rune longsword.", EMOTE), - CLUE36(new int[] { RUBY_AMULET, MITHRIL_SCIMITAR, TEAM1_CAPE }, "Yawn in the Castle Wars lobby. Shrug before you talk to me. Equip a ruby amulet, a mithril scimitar and a Wilderness cape.", EMOTE), - CLUE37(new int[] { RUNE_FULL_HELM, BLUE_DHIDE_CHAPS, FIRE_BATTLESTAFF }, "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.", EMOTE), - CLUE38(new int[] { }, "Panic on the pier where you catch the Fishing trawler Have nothing equipped at all when you do.", EMOTE), - CLUE39(new int[] { PURPLE_GLOVES, STEEL_KITESHIELD, MITHRIL_FULL_HELM }, "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.", EMOTE), - CLUE40(new int[] { PHARAOHS_SCEPTRE, MENAPHITE_PURPLE_HAT, MENAPHITE_PURPLE_TOP, MENAPHITE_PURPLE_ROBE }, "Yawn in the 7th room of Pyramid Plunder. Beware of double agents! Equip a pharoah sceptre and a full set of menaphite robes.", EMOTE), - CLUE41(new int[] { ARCLIGHT, AMULET_OF_THE_DAMNED }, "Slap your head in the centre of the Kourend catacombs. Beware of double agents! Equip the arclight and an amulet of the damned.", EMOTE), - CLUE42(new int[] { SEERCULL, COMBAT_BRACELET, HELM_OF_NEITIZNOT }, "Headbang at the top of Slayer Tower. Equip a seercull, a combat bracelet and helm of Neitiznot.", EMOTE), - CLUE43(new int[] { }, "Panic in the heart of the Haunted Woods. Beware of double agents! Have no items equipped when you do.", EMOTE), - CLUE44(new int[] { MITHRIL_PLATELEGS, RING_OF_LIFE, RUNE_AXE }, "Panic by the pilot on White Wolf Mountain. Beware of double agents! Equip mithril platelegs, a ring of life, and a rune axe.", EMOTE), - CLUE45(new int[] { RUNE_PLATELEGS, IRON_PLATEBODY, BLUE_DHIDE_VAMB }, "Shrug in the Zamorak temple found in the Eastern Wilderness. Beware of double agents! Equip rune platelegs, an iron platebody and blue dragonhide vambraces.", EMOTE), - CLUE46(new int[] { BLUE_HAT, HAM_ROBE, TIARA }, "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.", EMOTE), - CLUE47(new int[] { ADAMANT_PLATEBODY, ADAMANT_FULL_HELM, ADAMANT_PLATELEGS }, "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.", EMOTE), - CLUE48(new int[] { HARDLEATHER_BODY, LEATHER_CHAPS, BRONZE_AXE }, "Wave along the south fence of the Lumber Yard. Equip a hard leather body, leather chaps and a bronze axe.", EMOTE), - CLUE49(new int[] { UNHOLY_BOOK, HOLY_BOOK, BOOK_OF_BALANCE }, "Bow upstairs in the Edgeville Monastery. Equip a completed prayer book.", EMOTE), - CLUE50(new int[] { STEEL_LONGSWORD, BLUE_DHIDE_BODY, MYSTIC_GLOVES }, "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.", EMOTE), - CLUE51(new int[] { BLUE_DHIDE_BODY, BLUE_DHIDE_VAMB }, "Bow at the top of the lighthouse. Beware of double agents! Equip a blue dragonhide body, blue dragonhide vambraces and no jewellery.", EMOTE), - CLUE52(new int[] { STEEL_KITESHIELD, RING_OF_FORGING, GREEN_DHIDE_CHAPS }, "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.", EMOTE), - CLUE53(new int[] { IRON_CHAINBODY, LEATHER_CHAPS, COIF }, "Bow in the ticket office of the Duel Arena. Equip an iron chain body, leather chaps and coif.", EMOTE), - CLUE54(new int[] { RUNE_SPEAR, RUNE_PLATELEGS, RUNE_HELM_H1 }, "Jig at Jiggig. Beware of double agents! Equip a Rune spear, rune platelegs and any rune heraldic helm.", EMOTE), - CLUE55(new int[] { DESERT_SHIRT, LEATHER_GLOVES, LEATHER_BOOTS }, "Headbang in the mine north of Al Kharid. Equip a desert shirt, leather gloves and leather boots.", EMOTE), - CLUE56(new int[] { BLACK_DHIDE_CHAPS, SPOTTED_CAPE, ROLLING_PIN }, "Blow a kiss in the heart of the lava maze. Equip black dragonhide chaps, a spotted cape and a rolling pin.", EMOTE), - CLUE57(new int[] { BLACK_DHIDE_BODY, BLACK_DHIDE_CHAPS, BLACK_DHIDE_VAMB }, "Cheer in the Entrana church. Beware of double agents! Equip a set of full black dragonhide armour.", EMOTE), - CLUE58(new int[] { BRONZE_DAGGER, IRON_FULL_HELM, GOLD_RING }, "Dance in the shack in Lumbridge Swamp. Equip a bronze dagger, iron full helmet and a gold ring.", EMOTE), - CLUE59(new int[] { BRONZE_PLATELEGS, STEEL_PICKAXE, STEEL_MED_HELM }, "Panic in the Limestone Mine. Equip bronze platelegs, a steel pickaxe and a steel medium helmet.", EMOTE), - CLUE60(new int[] { RUNE_HALBERD, RUNE_PLATEBODY, AMULET_OF_STRENGTH }, "Salute in the centre of the mess hall. Beware of double agents! Equip a rune halberd, rune platebody and an amulet of strength", EMOTE), - CLUE61(new int[] { BLACK_CAPE, LEATHER_CHAPS, STEEL_MACE }, "Wave on Mudskipper Point. Equip a black cape, leather chaps and a steel mace.", EMOTE), - CLUE62(new int[] { GREEN_ROBE_TOP, HAM_ROBE, IRON_WARHAMMER }, "Yawn in the Varrock library. Equip a green gnome robe top, HAM robe bottom and an iron warhammer.", EMOTE), - CLUE63(new int[] { MITHRIL_PICKAXE, BLACK_PLATEBODY, IRON_KITESHIELD }, "Wave in the Falador gem store. Equip a Mithril pickaxe, Black platebody and an Iron Kiteshield.", EMOTE), - CLUE64(new int[] { DRAGON_PICKAXE, HELM_OF_NEITIZNOT, RUNE_BOOTS }, "Spin in front of the Soul altar. Beware of double agents! Equip a dragon pickaxe, helm of neitiznot and a pair of rune boots.", EMOTE), - CLUE65(new int[] { DRAGON_MED_HELM, TOKTZKETXIL, BRINE_SABRE, RUNE_PLATEBODY, AMULET_OF_GLORY }, "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.", EMOTE), - CLUE66(new int[] { RUNE_BOOTS, PROSELYTE_HAUBERK, DRAGONSTONE_RING }, "Jump for joy at the Neitiznot rune rock. Equip rune boots, a proselyte hauberk and a dragonstone ring.", EMOTE), - CLUE67(new int[] { GREEN_ROBE_TOP, MITHRIL_PLATELEGS, IRON_2H_SWORD }, "Dance in the centre of Canifis. Bow before you talk to me. Equip a green gnome robe top, mithril platelegs and an iron two-handed sword.", EMOTE), - CLUE68(new int[] { LAVA_BATTLESTAFF, BLACK_DHIDE_VAMB, MIND_SHIELD }, "Yawn at the top of Trollheim. Equip a lava battlestaff, black dragonhide vambraces and a mind shield.", EMOTE), - CLUE69(new int[] { STAFF_OF_AIR, BRONZE_FULL_HELM, AMULET_OF_POWER }, "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.", EMOTE), - CLUE70(new int[] { IRON_CHAINBODY, SAPPHIRE_RING, LONGBOW }, "Dance at the crossroads north of Draynor. Equip an iron chain body, a sapphire ring and a longbow.", EMOTE), - CLUE71(new int[] { ADAMANT_SQ_SHIELD, BLUE_DHIDE_VAMB, RUNE_PICKAXE }, "Yawn in the rogues' general store. Beware of double agents! Equip an adamant square shield, blue dragon vambraces and a rune pickaxe.", EMOTE), - CLUE72(new int[] { BANDOS_PLATEBODY, BANDOS_CLOAK, BANDOS_GODSWORD }, "Goblin Salute at the Goblin Village. Beware of double agents! Equip a Bandos platebody, Bandos cloak and Bandos godsword.", EMOTE), - CLUE73(new int[] { DRAGON_AXE }, "Stamp in the Enchanted valley west of the waterfall. Beware of double agents! Equip a dragon axe.", EMOTE), - CLUE74(new int[] { BLUE_BOOTS, HARDLEATHER_BODY, SILVER_SICKLE }, "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.", EMOTE), - CLUE75(new int[] { GREEN_HAT, SNAKESKIN_BOOTS, IRON_PICKAXE }, "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.", EMOTE), - CLUE76(new int[] { MYSTIC_ROBE_TOP, RUNE_SHIELD_H1 }, "Cheer at the top of the agility pyramid. Beware of double agents! Equip a blue mystic robe top, and any rune heraldic shield.", EMOTE), - CLUE77(new int[] { STUDDED_BODY, BRONZE_PLATELEGS, STAFF }, "Blow a raspberry at the monkey cage in Ardougne Zoo. Equip a studded leather body, bronze platelegs and a normal staff with no orb.", EMOTE), - CLUE78(new int[] { DRAGON_BATTLEAXE, DRAGON_DEFENDER, SLAYER_HELMET }, "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.", EMOTE), - CLUE79(new int[] { ADAMANT_SQ_SHIELD, BONE_DAGGER, MITHRIL_PLATEBODY }, "Cry on the shore of Catherby beach. Laugh before you talk to me, Equip an adamant sq shield, a bone dagger and mithril platebody.", EMOTE), - CLUE80(new int[] { MITHRIL_PLATESKIRT, MAPLE_LONGBOW }, "Panic by the mausoleum in Morytania. Wave before you speak to me. Equip a mithril plate skirt, a maple longbow and no boots.", EMOTE), - CLUE81(new int[] { AIR_TIARA, STAFF_OF_WATER }, "Do a jig in Varrock's rune store. Equip an air tiara and a staff of water.", EMOTE), - CLUE82(new int[] { ZAMORAK_GODSWORD }, "Show your anger towards the Statue of Saradomin in Ellamaria's garden. Beware of double agents! Equip a Zamorak godsword.", EMOTE), - CLUE83(new int[] { IRON_PLATEBODY, STUDDED_CHAPS, BRONZE_FULL_HELM }, "Spin in Draynor Manor by the fountain. Equip an iron platebody, studded leather chaps and a bronze full helmet.", EMOTE), - CLUE84(new int[] { MYSTIC_HAT, BONE_SPEAR, RUNE_PLATEBODY }, "Blow a kiss between the tables in Shilo Village bank. Beware of double agents! Equip a blue mystic hat, bone spear and rune plate body.", EMOTE), - CLUE85(new int[] { EMERALD_RING, SAPPHIRE_AMULET, BRONZE_CHAINBODY }, "Dance a jig by the entrance to the Fishing Guild. Equip an emerald ring, a sapphire amulet, and a bronze chain body.", EMOTE), - CLUE86(new int[] { LEATHER_CHAPS, IRON_KITESHIELD, STEEL_LONGSWORD }, "Yawn in Draynor Marketplace. Equip studded leather chaps, an iron kiteshield and a steel longsword.", EMOTE), - CLUE87(new int[] { ADAMANT_HALBERD, MYSTIC_ROBE_BOTTOM, DIAMOND_RING }, "Clap in Seers court house. Spin before you talk to me. Equip an adamant halberd, blue mystic robe bottom and a diamond ring.", EMOTE), - CLUE88(new int[] { DRAGON_SPEAR, RED_DHIDE_CHAPS }, "Spin in West Ardougne Church. Equip a dragon spear and red dragonhide chaps.", EMOTE), - CLUE89(new int[] { BLUE_DHIDE_VAMB, ADAMANT_BOOTS, ADAMANT_DAGGER }, "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.", EMOTE), - CLUE90(new int[] { PINK_SKIRT, PINK_ROBE_TOP, BODY_TIARA }, "Dance at the entrance to the Grand Exchange. Equip a pink skirt, pink robe top and a body tiara.", EMOTE), - CLUE91(new int[] { LEATHER_COWL, BLUE_WIZARD_ROBE, IRON_SCIMITAR }, "Laugh at the crossroads south of the Sinclair Mansion. Equip a cowl, blue wizard robe top and an iron scimitar.", EMOTE), - CLUE92(new int[] { DIAMOND_RING, AMULET_OF_POWER }, "Salute in the banana plantation. Beware of double agents! Equip a diamond ring, amulet of power, and nothing on your chest and legs.", EMOTE), - CLUE93(new int[] { BROWN_APRON, ADAMANT_MED_HELM, SNAKESKIN_CHAPS }, "Jump for joy in Yanille bank.Dance a jig before you talk to me. Equip a brown apron, adamant med helm and snakeskin chaps.", EMOTE), - CLUE94(new int[] { GREEN_HEADBAND, ANCIENT_CROZIER }, "Panic on the Wilderness volcano bridge. Beware of double agents! Equip any headband and crozier.", EMOTE), - CLUE95(new int[] { GREEN_HAT, CREAM_ROBE_TOP, LEATHER_CHAPS }, "Spin at the crossroads north of Rimmington. Equip a green gnome hat, cream gnome top and leather chaps.", EMOTE), - CLUE96(new int[] { BLACK_SALAMANDER }, "Salute in the warriors' guild bank. Equip only a black salamander.", EMOTE), - CLUE97(new int[] { WHITE_APRON, GREEN_BOOTS, LEATHER_GLOVES }, "Clap in the main exam room in the Exam Centre. Equip a white apron, green gnome boots and leather gloves.", EMOTE), - CLUE98(new int[] { DEATH_TIARA, CAPE_OF_LEGENDS, RING_OF_WEALTH }, "Flap at the death altar. Beware of double agents! Equip a death tiara, a legend's cape and any ring of wealth.", EMOTE), - CLUE99(new int[] { GREEN_DHIDE_CHAPS, RING_OF_DUELING8, MITHRIL_MED_HELM }, "Beckon in Tai Bwo Wannai. Clap before you talk to me. Equip green dragonhide chaps, a ring of dueling and a mithril medium helmet.", EMOTE), - CLUE100(new int[] { RING_OF_LIFE, AMULET_OF_GLORY, ADAMANT_2H_SWORD }, "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.", EMOTE), - CLUE101(new int[] { ANCIENT_STOLE, RUNE_SHIELD_H1 }, "Beckon on the east coast of the Kharazi Jungle. Beware of double agents! Equip any vestment stole and a heraldic rune shield.", EMOTE), - CLUE102(new int[] { COIF, IRON_PLATEBODY, LEATHER_GLOVES}, "Blow raspberries outside the entrance to Keep Le Faye. Equip a coif, an iron platebody and leather gloves.", EMOTE), - CLUE103("This anagram reveals who to speak to next: VEIL VEDA", "Evil Dave", "Doris' basement, Edgeville", "666", ANAGRAM), - CLUE104("This anagram reveals who to speak to next: MUS KIL READER", "Radimus Erkle", "Legends' Guild", ANAGRAM), - CLUE105("This anagram reveals who to speak to next: HIS PHOR", "Horphis", "Arceuus Library, Zeah", "1", ANAGRAM), - CLUE106("This anagram reveals who to speak to next: QUIT HORRIBLE TYRANT", "Brother Tranquility", "Mos Le'Harmless or Harmony Island", "7", ANAGRAM), - CLUE107("This anagram reveals who to speak to next: GOBLIN KERN", "King Bolren", "Tree Gnome Village", ANAGRAM), - CLUE108("This anagram reveals who to speak to next: KAY SIR", "Sir Kay", "The courtyard in Camelot Castle", "6", ANAGRAM), - CLUE109("This anagram reveals who to speak to next: MOLD LA RAN", "Old Man Ral", "Meiyerditch", ANAGRAM), - CLUE110("This anagram reveals who to speak to next: DEKAGRAM", "Dark Mage", "Centre of the Abyss", "13", ANAGRAM), - CLUE111("This anagram reveals who to speak to next: LARK IN DOG", "King Roald", "Ground floor of Varrock castle", "24", ANAGRAM), - CLUE112("This anagram reveals who to speak to next: LOW LAG", "Gallow", "Vinery in the Great Kourend", "12", ANAGRAM), - CLUE113("This anagram reveals who to speak to next: VESTE", "Steve", "Upstairs Wyvern Area or Stronghold Slayer Cave", "2", ANAGRAM), - CLUE114("This anagram reveals who to speak to next: ERR CURE IT", "Recruiter", "West Ardougne centre square", "20", ANAGRAM), - CLUE115("This anagram reveals who to speak to next: AT HERG", "Regath", "General Store, Arceuus, Zeah", "25", ANAGRAM), - CLUE116("This anagram reveals who to speak to next: EL OW", "Lowe", "Varrock archery store", ANAGRAM), - CLUE117("This anagram reveals who to speak to next: A ZEN SHE", "Zenesha", "Platebody Southern Ardougne centre square", ANAGRAM), - CLUE118("This anagram reveals who to speak to next: ICY FE", "Fycie", "East Feldip Hills", ANAGRAM), - CLUE119("This anagram reveals who to speak to next: ACE MATCH ELM", "Cam the Camel", "North of the glider in Al Kharid", ANAGRAM), - CLUE120("This anagram reveals who to speak to next: IM N ZEZIM", "Immenizz", "The Imp inside Puro-Puro", ANAGRAM), - CLUE121("This anagram reveals who to speak to next: DRAGONS LAMENT", "Strange Old Man", "Barrows", "40", ANAGRAM), - CLUE122("This anagram reveals who to speak to next: A BAKER", "Baraek", "Varrock square", "5", ANAGRAM), - CLUE123("This anagram reveals who to speak to next: SNAH", "Hans", "Lumbridge Castle courtyard", "None", ANAGRAM), - CLUE124("This anagram reveals who to speak to next: ME IF", "Femi", "Gates of Tree Gnome Stronghold", "None", ANAGRAM), - CLUE125("This anagram reveals who to speak to next: I FAFFY RUN", "Fairy Nuff", "North of the bank in Zanaris", ANAGRAM), - CLUE126("This anagram reveals who to speak to next: GULAG RUN", "Uglug Nar", "West of Jiggig", ANAGRAM), - CLUE127("This anagram reveals who to speak to next: DR WARDEN FUNK", "Drunken Dwarf", "East Side of Keldagrim", ANAGRAM), - CLUE128("This anagram reveals who to speak to next: EEK ZERO OP", "Zookeeper", "Ardougne Zoo", "40", ANAGRAM), - CLUE129("This anagram reveals who to speak to next: DR HITMAN OR DIM THARN", "Mandrith", "Wilderness Resource Area", "28 or Light boxor Puzzle box", ANAGRAM), - CLUE130("This anagram reveals who to speak to next: I AM SIR", "Marisi", "Allotment patch, South coast Zeah", "5", ANAGRAM), - CLUE131("This anagram reveals who to speak to next: HALT US", "Luthas", "Banana plantation, Karamja", "33 or 0", ANAGRAM), - CLUE132("This anagram reveals who to speak to next: ARC O LINE", "Caroline", "North Witchaven next to the row boat", "11", ANAGRAM), - CLUE133("This anagram reveals who to speak to next: C ON GAME HOC", "Gnome Coach", "Gnome Ball course", "6", ANAGRAM), - CLUE134("This anagram reveals who to speak to next: PROFS LOSE WRONG PIE", "Professor Onglewip", "Ground floor Wizards Tower", ANAGRAM), - CLUE135("This anagram reveals who to speak to next: TWENTY CURE IRON", "New recruit Tony", "Shayzien House's Graveyard", ANAGRAM), - CLUE136("This anagram reveals who to speak to next: ARMCHAIR THE PELT", "Charlie the Tramp", "South entrance of Varrock", "0", ANAGRAM), - CLUE137("This anagram reveals who to speak to next: CAREER IN MOON", "Oneiromancer", "Astral altar", "25", ANAGRAM), - CLUE138("This anagram reveals who to speak to next: RAT MAT WITHIN", "Martin Thwait", "Rogues' Den", "2", ANAGRAM), - CLUE139("This anagram reveals who to speak to next: FORLUN", "Runolf", "Miscellania & Etceteria Dungeon", ANAGRAM), - CLUE140("This anagram reveals who to speak to next: MOTHERBOARD", "Brother Omad", "Monastery south of Ardougne", "129", ANAGRAM), - CLUE141("This anagram reveals who to speak to next: THICKNO", "Hickton", "Catherby fletching shop", "2", ANAGRAM), - CLUE142("This anagram reveals who to speak to next: SAND NUT", "Dunstan", "Anvil in north east Burthorpe", "8", ANAGRAM), - CLUE143("This anagram reveals who to speak to next: PACINNG A TAIE", "Captain Ginea", "Building east of Shayzien combat ring", "113", ANAGRAM), - CLUE144("This anagram reveals who to speak to next: DO SAY MORE", "Doomsayer", "East of Lumbridge Castle", "95", ANAGRAM), - CLUE145("This anagram reveals who to speak to next: THEM CAL CAME", "Cam the Camel", "Just outside of the Duel Arena", ANAGRAM), - CLUE146("This anagram reveals who to speak to next: I DOOM ICON INN", "Dominic Onion", "Nightmare Zone", "9,500", ANAGRAM), - CLUE147("This anagram reveals who to speak to next: MAJORS LAVA BADS AIR", "Ambassador Alvijar", "Northeast Dorgesh-Kaan, upper floor", "2,505", ANAGRAM), - CLUE148("This anagram reveals who to speak to next: SEQUIN DIRGE", "Queen Sigrid", "Throne room of Etceteria Castle.", ANAGRAM), - CLUE149("This anagram reveals who to speak to next: QUE SIR", "Squire", "Falador Castle Courtyard", "654", ANAGRAM), - CLUE150("This anagram reveals who to speak to next: HE DO POSE. IT IS CULTRRL, MK?", "Riki the sculptor's model", "East Keldagrim, south of kebab seller.", ANAGRAM), - CLUE151("This anagram reveals who to speak to next: A BAS", "Saba", "Death Plateau", ANAGRAM), - CLUE152("This anagram reveals who to speak to next: NOD MED", "Edmond", "Behind the most NW house in East Ardougne", "3", ANAGRAM), - CLUE153("This anagram reveals who to speak to next: COOL NERD", "Old Crone", "East of the Slayer Tower", "619", ANAGRAM), - CLUE154("This anagram reveals who to speak to next: AN PAINT TONIC", "Captain Ninto", "Bar under White Wolf Mountain", ANAGRAM), - CLUE155("This anagram reveals who to speak to next: COPPER ORE CRYPTS", "Prospector Percy", "Motherlode Mine", "12", ANAGRAM), - CLUE156("This anagram reveals who to speak to next: R AK MI", "Karim", "Al Kharid Kebab shop", "5", ANAGRAM), - CLUE157("This anagram reveals who to speak to next: NO OWNER", "Oronwen", "Lletya Seamstress shop in Lletya", "20", ANAGRAM), - CLUE158("This anagram reveals who to speak to next: OR ZINC FUMES WARD", "Wizard Frumscone", "Downstairs in the Wizards' Guild", ANAGRAM), - CLUE159("This anagram reveals who to speak to next: O BIRDZ A ZANY EN PC", "Cap'n Izzy no Beard", "Brimhaven Agility Arena", "33", ANAGRAM), - CLUE160("This anagram reveals who to speak to next: DT RUN B", "Brundt the Chieftain", "Rellekka, main hall", "4", ANAGRAM), - CLUE161("This anagram reveals who to speak to next: BY LOOK", "Bolkoy", "Tree Gnome Village general store", "13", ANAGRAM), - CLUE162("This anagram reveals who to speak to next: I EAT ITS CHART HINTS DO U", "Shiratti the Custodian", "North of fountain, Nardah", ANAGRAM), - CLUE163("This anagram reveals who to speak to next: YAWNS GY", "Ysgawyn", "Lletya", ANAGRAM), - CLUE164("This anagram reveals who to speak to next: OK CO", "Cook", "Ground floor of Lumbridge Castle", "9", ANAGRAM), - CLUE165("This anagram reveals who to speak to next: TAMED ROCKS", "Dockmaster", "Piscarilius House, NE of General store", "5", ANAGRAM), - CLUE166("This anagram reveals who to speak to next: BLUE BRIM GUIDED", "Lumbridge Guide", "Outside of Lumbridge Castle", ANAGRAM), - CLUE167("This anagram reveals who to speak to next: LADDER MEMO GUV", "Guard Vemmeldo", "Gnome Stronghold Bank", "3", ANAGRAM), - CLUE168("This anagram reveals who to speak to next: MAL IN TAU", "Luminata", "Near Burgh de Rott entrance", ANAGRAM), - CLUE169("This anagram reveals who to speak to next: HEORIC", "Eohric", "Burthorpe Castle, top floor", "36", ANAGRAM), - CLUE170("This anagram reveals who to speak to next: GOBLETS ODD TOES", "Otto Godblessed", "Otto's Grotto", "2", ANAGRAM), - CLUE171("This anagram reveals who to speak to next: LEAKEY", "Kaylee", "Rising Sun Inn in Falador", "18", ANAGRAM), - CLUE172("This anagram reveals who to speak to next: WOO AN EGG KIWI", "Awowogei", "Ape Atoll", "24", ANAGRAM), - CLUE173("This anagram reveals who to speak to next: ARE COL", "Oracle", "Ice Mountain West of Edgeville", "48", ANAGRAM), - CLUE174("This anagram reveals who to speak to next: AREA CHEF TREK", "Father Aereck", "Lumbridge Church", "19", ANAGRAM), - CLUE175("This anagram reveals who to speak to next: MACHETE CLAM", "Cam the Camel", "Outside Duel Arena", "6", ANAGRAM), - CLUE176("This anagram reveals who to speak to next: RED ART TANS", "Trader Stan", "Port Sarim Charter ship", ANAGRAM), - CLUE177("This anagram reveals who to speak to next: UNLEASH NIGHT MIST", "Sigli the Huntsman", "Rellekka", "302", ANAGRAM), - CLUE178("This anagram reveals who to speak to next: ARR! SO I AM A CRUST, AND?", "Ramara du Croissant", "Piscatoris Fishing Colony", ANAGRAM), - CLUE179("This anagram reveals who to speak to next: A HEART", "Aretha", "Soul altar", "2", ANAGRAM), - CLUE180("This anagram reveals who to speak to next: DED WAR", "Edward", "Inside Rogue's Castle", ANAGRAM), - CLUE181("This anagram reveals who to speak to next: PEAK REFLEX", "Flax keeper", "Flax field south of Seers Village", "676", ANAGRAM), - CLUE182("This anagram reveals who to speak to next: SLAM DUSTER GRAIL", "Guildmaster Lars", "Woodcutting guild, Zeah", ANAGRAM), - CLUE183("This anagram reveals who to speak to next: RATAI", "Taria", "Rimmington bush patch", "7", ANAGRAM), - CLUE184("This anagram reveals who to speak to next: SLIDE WOMAN", "Wise Old Man", "Draynor Village", "28", ANAGRAM), - CLUE185("This anagram reveals who to speak to next: BAIL TRIMS", "Brimstail", "West of Stronghold Slayer Cave", ANAGRAM), - CLUE186("This anagram reveals who to speak to next: A BASIC ANTI POT", "Captain Tobias", "Port Sarim", "6", ANAGRAM), - CLUE187("This anagram reveals who to speak to next: BAKER CLIMB", "Brambickle", "Trollweiss mountain", ANAGRAM), - CLUE188("This anagram reveals who to speak to next: GOT A BOY", "Gabooty", "Centre of Tai Bwo Wannai", "11", ANAGRAM), - CLUE189("This anagram reveals who to speak to next: AHA JAR", "Jaraah", "Duel Arena hosptial", ANAGRAM), - CLUE190("This anagram reveals who to speak to next: CAR IF ICES", "Sacrifice", "Zul-Andra", ANAGRAM), - CLUE191("This anagram reveals who to speak to next: OUR OWN NEEDS", "Nurse Wooned", "Shayzien House Infirmary", "52", ANAGRAM), - CLUE192("This anagram reveals who to speak to next: TEN WIGS ON", "Wingstone", "Between Nardah & Agility Pyramid", ANAGRAM), - CLUE193("This anagram reveals who to speak to next: I EVEN", "Nieve", "The slayer master in Gnome Stronghold", "2", ANAGRAM), - CLUE194("This anagram reveals who to speak to next: ME AM THE CALC", "Cam the Camel", "Outside Duel Arena", ANAGRAM), - CLUE195("This anagram reveals who to speak to next: SNAKES SO I SAIL", "Lisse Isaakson", "Neitiznot", "2", ANAGRAM), - CLUE196("This anagram reveals who to speak to next: LAND DOOMD", "Odd Old Man", "Limestone mine northeast of Varrock", ANAGRAM), - CLUE197("This anagram reveals who to speak to next: DUO PLUG", "Dugopul", "Graveyard on Ape Atoll", ANAGRAM), - CLUE198("This anagram reveals who to speak to next: R SLICER", "Clerris", "Arceuus mine, Zeah", "738", ANAGRAM), - CLUE199("This anagram reveals who to speak to next: MY MANGLE LAL", "Lammy Langle", "Hosidius House spirit tree patch", ANAGRAM), - CLUE200("This anagram reveals who to speak to next: PEATY PERT", "Party Pete", "Falador Party Room", "None", ANAGRAM), - CLUE201("Search the chest in Barbarian Village.", "The chest located in the house with a .", CRYPTIC), - CLUE202("Search the crates in the outhouse of the long building in Taverley.", "Located in the small building attached by a fence to the main building. Climb over the stile.", CRYPTIC), - CLUE203("Talk to Ermin.", "Ermin can be found on the 1st2nd floor[U.K. floor] of the tree house south-east of the Gnome Agility Course.", CRYPTIC), - CLUE204("Aggie I see, Lonely and southern I feel I am neither inside nor outside the house yet no house would be complete without me. Your treasure lies beneath me.", "Dig outside the window of Aggies house in Draynor Village.", CRYPTIC), - CLUE205("Ghostly bones.", "Kill an Ankou", CRYPTIC), - CLUE206("Search through chests found in the upstairs of houses in eastern Falador.", "The house is located southwest of the Falador Party Room. There are two chests in the room, search the northern chest.", CRYPTIC), - CLUE207("Let's hope you don't meet a watery death when you encounter this fiend.", "Kill a waterfiend.", CRYPTIC), - CLUE208("The magic of 4 colours, an early experience you could learn. The large beast caged up top, rages, as his demised kin's loot now returns.", "Speak to Wizard Mizgog at the top of the Wizard's Tower south of Draynor.", CRYPTIC), - CLUE209("Dobson is my last name, and with gardening I seek fame.", "Horacio, located in the garden of the Handelmort Mansion in East Ardougne.", CRYPTIC), - CLUE210("This village has a problem with cartloads of the undead. Try checking the bookcase to find an answer.", "Search the bookcase by the doorway of the building just south east of the Shilo Village Gem Mine.", CRYPTIC), - CLUE211("The cheapest water for miles around, but they react badly to religious icons.", "Search the crates in the General Store tent in the Bandit Camp", CRYPTIC), - CLUE212("Try not to step on any aquatic nasties while searching this crate.", "Search the crate in Bailey's house on the Fishing Platform.", CRYPTIC), - CLUE213("'See you in your dreams' said the vegetable man.", "Speak to Dominic Onion at the Nightmare Zone teleport spot.", CRYPTIC), - CLUE214("Reflection is the weakness for these eyes of evil.", "Kill a basilisk", CRYPTIC), - CLUE215("Search a bookcase in Lumbridge swamp.", "Located in Father Urhney's house.", CRYPTIC), - CLUE216("Surround my bones in fire, ontop the wooden pyre. Finally lay me to rest, before my one last test.", "Kill a confused/lost barbarian to receive mangled bones. Construct and burn a pyre ship. Kill the ferocious barbarian spirit that spawns to receive a clue casket.", CRYPTIC), - CLUE217("Between where the best are commemorated for a year, and a celebratory cup, not just for beer.", "Dig at the Clan Cup Trophy at Clan Wars.", CRYPTIC), - CLUE218("Speak to Doric, who lives north of Falador.", "Doric is found north of Falador and east of the Taverley gate.", CRYPTIC), - CLUE219("Speak to Arhein in Catherby.", "Arhein is just south of the Catherby bank.", CRYPTIC), - CLUE220("Leader of the Yak City.", "Talk to Mawnis Burowgar in Neitiznot.", CRYPTIC), - CLUE221("Search upstairs in the houses of Seers' Village for some drawers.", "Located in the house with the spinning wheel. South of the Seers' Village bank.", CRYPTIC), - CLUE222("Surprising? I bet he is...", "Talk to Sir Prysin in Varrock Palace.", CRYPTIC), - CLUE223("Fiendish cooks probably won’t dig the dirty dishes.", "Dig by the fire in the Rogues' Den.", CRYPTIC), - CLUE224("My life was spared but these voices remain, now guarding these iron gates is my bane.", "Speak to the Key Master in Cerberus' Lair.", CRYPTIC), - CLUE225("Search the boxes in one of the tents in Al Kharid.", "Search the crates in the tent east of the Silk trader.", CRYPTIC), - CLUE226("Search the bookcase in the monastery.", "Search the southeastern bookcase at Edgeville Monastery.", CRYPTIC), - CLUE227("One of several rhyming brothers, in business attire with an obsession for paper work.", "Speak to Piles in the Resource Area.", CRYPTIC), - CLUE228("When you get tired of fighting, go deep, deep down until you need an antidote.", "Go to Yanille Agility dungeon and fall into the place with the poison spiders. Search the crate by the stairs leading up.", CRYPTIC), - CLUE229("You'll have to plug your nose if you use this source of herbs.", "Kill an Aberrant spectre and pick up the casket", CRYPTIC), - CLUE230("It seems to have reached the end of the line, and it's still empty.", "Search the carts in the northern part of the Dwarven Mine.", CRYPTIC), - CLUE231("Someone watching the fights in the Duel Arena is your next destination.", "Talk to Jeed, found on the upper floors, at the Duel Arena.", CRYPTIC), - CLUE232("Search the drawers on the first floor of a building overlooking Ardougne's Market.", "Climb the ladder in the house north of the market.", CRYPTIC), - CLUE233("'A bag belt only?', he asked his balding brothers.", "Talk to Abbot Langley in the monastery", CRYPTIC), - CLUE234("Search the bush at the digsite centre.", "The bush is on the east side of the first pathway towards the digsite from the Exam Centre.", CRYPTIC), - CLUE235("Search the drawers upstairs in Falador's shield shop.", "Cassie's Shield Shop at the northern Falador entrance.", CRYPTIC), - CLUE236("Generally speaking, his nose was very bent.", "Talk to General Bentnoze", CRYPTIC), - CLUE237("Often sought out by scholars of histories past, find me where words of wisdom speak volumes.", "Speak to an examiner at the Exam Centre.", CRYPTIC), - CLUE238("Go to this building to be illuminated, and check the drawers while you are there.", "The 2nd of the Lighthouse, Kill a Rellekka marketplace guard to obtain the key.", CRYPTIC), - CLUE239("Talk to the barber in the Falador barber shop.", "The Hairdresser can be found in the barber shop, north of the west Falador bank.", CRYPTIC), - CLUE240("Search the drawers in Falador's chain mail shop.", "Wayne's Chains - Chainmail Specialist store at the southern Falador walls.", CRYPTIC), - CLUE241("Dig near some giant mushrooms behind the Grand Tree.", "Dig near the red mushrooms northwest of the Grand Tree.", CRYPTIC), - CLUE242("If a man carried my burden, he would break his back. I am not rich, but leave silver in my track. Speak to the keeper of my trail.", "Speak to Gerrant in the fish shop in Port Sarim.", CRYPTIC), - CLUE243("Speak to Gaius in Taverley.", "Gaius is found at the northwest corner in Taverley.", CRYPTIC), - CLUE244("Speak to Jatix in Taverley.", "Jatix is found in the middle of Taverley.", CRYPTIC), - CLUE245("My name is like a tree, yet it is spelt with a 'g'. Come see the fur which is right near me.", "Speak to Wilough, next to the Fur Merchant in Varrock Square.", CRYPTIC), - CLUE246("AIR 2331", "Dig 2 steps East and 1 step south of the center of the fairy ring.", CRYPTIC), - CLUE247("Pentagrams and demons, burnt bones and remains, I wonder what the blood contains.", "Dig under the blood rune spawn next the the Demonic Ruins.", CRYPTIC), - CLUE248("Search the drawers above Varrock's shops.", "Located upstairs in Thessalia's Fine Clothes shop in Varrock.", CRYPTIC), - CLUE249("Search the drawers in one of Gertrude's bedrooms.", "Kanel's bedroom (southeastern room), outside of west Varrock.", CRYPTIC), - CLUE250("Surviving.", "Talk to Sir Vyvin on the 3rd floor of Falador castle.", CRYPTIC), - CLUE251("There is no 'worthier' lord.", "Speak to Lord Iorwerth in the elven camp near Prifddinas", CRYPTIC), - CLUE252("W marks the spot.", "Dig in the middle of the Warriors' Guild entrance hall", CRYPTIC), - CLUE253("ALP 1140", "Dig 1 step east and 3 steps south of the center of the fairy ring.", CRYPTIC), - CLUE254("Search the boxes in the goblin house near Lumbridge.", "Goblin house on the eastern side of the river.", CRYPTIC), - CLUE255("Dig where the forces of Zamorak and Saradomin collide.", "Dig next to the law rift in the Abyss", CRYPTIC), - CLUE256("Under a giant robotic bird that cannot fly.", "Dig next to the terrorbird display in the south exhibit of Varrock Museum's basement.", CRYPTIC), - CLUE257("Great demons, dragons, and spiders protect this blue rock, beneath which, you may find what you seek.", "Dig by the runite rock in the Lava Maze Dungeon", CRYPTIC), - CLUE258("The King's magic won't be wasted by me.", "Talk to the Guardian mummy inside the Pyramid Plunder minigame in Sophanem", CRYPTIC), - CLUE259("Rotting next to a ditch. Dig next to the fish", "Dig next to a fishing spot on the south-east side of Burgh de Rott.", CRYPTIC), - CLUE260("Speak to the Lady of the Lake.", "Talk to the Lady of the Lake in Taverley.", CRYPTIC), - CLUE261("Search the crates in the Port Sarim Fishing shop.", "Search the crates, by the door, in Gerrant's Fishy Business in Port Sarim.", CRYPTIC), - CLUE262("Read 'How to breed scorpions.' By O.W.Thathurt.", "Search the northern bookcase on the 1st2nd floor[U.K. floor] of the Sorcerer's Tower.", CRYPTIC), - CLUE263("I wonder how many bronze swords he has handed out.", "Talk to Vannaka. He can be found in Edgeville Dungeon.", CRYPTIC), - CLUE264("Must be full of railings.", "Search the boxes around the hut where the broken Dwarf Cannon is, close to the start of the Dwarf Cannon quest.", CRYPTIC), - CLUE265("BLP 6200", "Dig 6 steps north and 2 steps east of the center of the fairy ring.", CRYPTIC), - CLUE266("My giant guardians below the market streets would be fans of rock and roll, if only they could grab hold of it. Dig near my green bubbles!", "Dig near the cauldron by Moss Giants under Varrock Sewers", CRYPTIC), - CLUE267("BJR 1123", "Dig 1 steps south and 2 steps west of the center of the fairy ring.", CRYPTIC), - CLUE268("Speak to Hajedy.", "Hajedy is found by the cart, located just south of the Brimhaven docks.", CRYPTIC), - CLUE269("Speak to Kangai Mau.", "Kangai Mau is found in the Shrimp and Parrot in Brimhaven.", CRYPTIC), - CLUE270("Varrock is where I reside not the land of the dead, but I am so old, I should be there instead. Let's hope your reward is as good as it says, just 1 gold one and you can have it read.", "Talk to Gypsy Aris, West of varrock main square.", CRYPTIC), - CLUE271("I am a token of the greatest love. I have no beginning or end. My eye is red, I can fit like a glove. Go to the place where it's money they lend, And dig by the gate to be my friend.", "Dig by the gate in the basement of the West Varrock bank.", CRYPTIC), - CLUE272("Speak to a referee.", "Talk to a Gnome ball referee found on the Gnome ball field in the Gnome Stronghold.", CRYPTIC), - CLUE273("This crate holds a better reward than a broken arrow.", "Inside the Ranging Guild. Search the crate behind the northern most building.", CRYPTIC), - CLUE274("Speak to the staff of Sinclair mansion.", "Speak to Louisa, on the ground floor, found at the Sinclair Mansion.", CRYPTIC), - CLUE275("Search the crates in a house in Yanille that has a piano.", "The house is located northwest of the bank.", CRYPTIC), - CLUE276("When no weapons are at hand, now it is time to reflect, in Saradomin's name! Redemption draws closer...", "On Entrana, search the southern drawer in the house with the cooking range.", CRYPTIC), - CLUE277("AIQ 0440", "Dig 4 steps east and 4 steps south of the center of the fairy ring.", CRYPTIC), - CLUE278("CKP 0224", "Dig 2 steps south and 2 steps west of the center of the fairy ring.", CRYPTIC), - CLUE279("Search the Coffin in Edgeville.", "Search the coffin located by the Wilderness teleport lever.", CRYPTIC), - CLUE280("Search the drawers in the house next to the Port Sarim mage shop.", "House east of Betty's. Contains a cooking sink.", CRYPTIC), - CLUE281("A great view - watch the rapidly drying hides get splashed. Check the box you are sitting on.", "Almera's House north of Baxtorian Falls, search boxes on the 2nd floor.", CRYPTIC), - CLUE282("He knows just how easy it is to lose track of time.", "Speak to brother Kojo in the Clock Tower.", CRYPTIC), - CLUE283("With a name like that, you'd expect a little more than just a few scimitars.", "Speak to Daga on Ape Atoll.", CRYPTIC), - CLUE284("Strength potions with red spiders' eggs? He is quite a herbalist.", "Talk to Apothecary in the South-western Varrock. (the) apothecary is just north-west of the Varrock Swordshop.", CRYPTIC), - CLUE285("Robin wishes to see your finest range equipment.", "Robin at the inn in Port Phasmatys. Speak to him with +182 in ranged attack bonus.", CRYPTIC), - CLUE286("You will need to under-cook to solve this one.", "Search the crate in the Lumbridge basement.", CRYPTIC), - CLUE287("Talk to a party-goer in Falador.", "Lucy is the bartender on the 1st2nd floor[U.K. floor] of the party room.", CRYPTIC), - CLUE288("Search through some drawers found in Taverley's houses.", "The south-eastern most house, south of Jatix's Herblore Shop.", CRYPTIC), - CLUE289("Green is the colour of my death as the winter-guise, I swoop towards the ground.", "Players need to slide down to where Trollweiss grows on Trollweiss Mountain.", CRYPTIC), - CLUE290("46 is my number. My body is the colour of burnt orange and crawls among those with eight. Three mouths I have, yet I cannot eat. My blinking blue eye hides my grave.", "Sapphire respawn in the Spider's Nest, lvl 46 Wilderness. Dig under the sapphire spawn.", CRYPTIC), - CLUE291("Anger Abbot Langley.", "Speak to Abbot Langley while you have a negative prayer bonus", CRYPTIC), - CLUE292("Dig where only the skilled, the wealthy, or the brave can choose not to visit again.", "Dig at Lumbridge spawn", CRYPTIC), - CLUE293("I live in a deserted crack collecting soles.", "Enter the crack west of Nardah Rug merchant, and talk to the Genie.", CRYPTIC), - CLUE294("'Small shoe.' Often found with rod on mushroom.", "Talk to any Gnome trainer in the agility area of the Tree Gnome Stronghold.", CRYPTIC), - CLUE295("Scattered coins and gems fill the floor. The chest you seek is in the north east.", "Kill the King Black Dragon for a key (elite), and then open the closed chest in the NE corner of the lair.", CRYPTIC), - CLUE296("Search the crate in the left-hand tower of Lumbridge Castle.", "Located on the first floor of the southern tower at the Lumbridge Castle entrance.", CRYPTIC), - CLUE297("A ring of water surrounds 4 powerful rings. Dig by the ladder that is located there.", "Dig by the ladder leading to the Dagannoth Kings room in the Waterbirth Island Dungeon.", CRYPTIC), - CLUE298("If you look closely enough, it seems that the archers have lost more than their needles.", "Search the haystack by the south corner of the Rangers' Guild", CRYPTIC), - CLUE299("This place sure is a mess.", "Ewesey is located in the Hosidius House mess hall in Great Kourend.", CRYPTIC), - CLUE300("Probably filled with books on magic.", "Search the bookcase in the basement of Wizard's Tower.", CRYPTIC), - CLUE301("Here, there are tears, but nobody is crying. Speak to the guardian and show off your alignment to balance.", "Talk to Juna while wearing three Guthix related items.", CRYPTIC), - CLUE302("You might have to turn over a few stones to progress.", "Kill a rock crab and pick up the casket (elite) that it drops.", CRYPTIC), - CLUE303("DKS 2310", "Dig 2 steps north, 3 steps east, and 1 step south of the center of the fairy ring.", CRYPTIC), - CLUE304("Dig under Razorlor's toad batta.", "Dig on the toad batta spawn in Tarn's Lair.", CRYPTIC), - CLUE305("Search through some drawers in the upstairs of a house in Rimmington.", "On the first floor of the house north of Hetty the Witch's house in Rimmington.", CRYPTIC), - CLUE306("Four blades I have, yet draw no blood; Still I turn my prey to powder. If you are brave, come search my roof; It is there my blades are louder.", "Lumbridge windmill, search the crates on the top floor.", CRYPTIC), - CLUE307("Talk to Cassie in Falador.", "Cassie is found just south-east of the northern Falador gate.", CRYPTIC), - CLUE308("Faint sounds of 'Arr', fire giants found deep, the eastern tip of a lake, are the rewards you could reap.", "Dig south of the pillar at the end of the Deep Wilderness Dungeon.", CRYPTIC), - CLUE309("If you're feeling brave, dig beneath the dragon's eye.", "Dig below the mossy rock under the Viyeldi caves.", CRYPTIC), - CLUE310("In a town where the guards are armed with maces, search the upstairs rooms of the Public House.", "Search the drawers in the pub north of Ardougne Castle. Kill a Guard dog at Handelmort Mansion to obtain the key.", CRYPTIC), - CLUE311("Search the tents in the Imperial Guard camp in Burthorpe for some boxes.", "Search in the tents in northwest corner of the camp.", CRYPTIC), - CLUE312("Dig where 4 siblings and I all live with our evil overlord.", "Dig in the chicken pen inside the Champion's Guild", CRYPTIC), - CLUE313("This crate is mine, all mine, even if it is in the middle of the desert.", "Center of desert Mining Camp. Search the crates. Requires the metal key from Tourist Trap to enter.", CRYPTIC), - CLUE314("Buried beneath the ground, who knows where it's found. Lucky for you, A man called Jorral may have a clue.", "Speak to Jorral to receive a strange device.", CRYPTIC), - CLUE315("A dwarf, approaching death, but very much in the light.", "Thorgel at the entrance to the Death altar", CRYPTIC), - CLUE316("In a village made of bamboo, look for some crates under one of the houses.", "Search the crate by the house at the northern point of the broken jungle fence in Tai Bwo Wannai.", CRYPTIC), - CLUE317("Search the boxes of Falador's general store.", "Falador general store.", CRYPTIC), - CLUE318("You must be 100 to play with me.", "Speak to the Veteran boat squire at Pest Control", CRYPTIC), - CLUE319("Three rule below and three sit at top. Come dig at my entrance.", "Dig in front of the entrance to the Waterbirth Island Dungeon.", CRYPTIC), - CLUE320("Search the crates in the Barbarian Village helmet shop.", "Peska's Helmet Shop in Barbarian Village.", CRYPTIC), - CLUE321("BIP 7013", "Dig 6 steps north and 3 steps west of the center of the fairy ring.", CRYPTIC), - CLUE322("Search the drawers in the ground floor of a shop in Yanille.", "Search the drawers in Yanille's hunting shop.", CRYPTIC), - CLUE323("Speak to Donovan, the Family Handyman.", "Donovan the Family Handyman is found on the 2nd floor of Sinclair Mansion.", CRYPTIC), - CLUE324("Search the drawers of houses in Burthorpe.", "Inside Hild's house in the northeast corner of Burthorpe.", CRYPTIC), - CLUE325("Where safe to speak, the man who offers the pouch of smallest size wishes to see your alignment.", "Speak to the Mage of Zamorak south of the Rune Shop in Varrock while wearing three zamorakian items", CRYPTIC), - CLUE326("And so on, and so on, and so on. Walking from the land of many unimportant things leads to a choice of paths.", "Dig on Etceteria next to the Evergreen tree in front of the castle walls.", CRYPTIC), - CLUE327("Search the crates in the guard house of the northern gate of East Ardougne.", "The guard house is northeast of the Handelmort Mansion.", CRYPTIC), - CLUE328("Go to the village being attacked by trolls, search the drawers in one of the houses.", "Go to Dunstan's house in the northeast corner of Burthorpe. Kill Penda in the Toad and Chicken to obtain the key.", CRYPTIC), - CLUE329("You'll get licked.", "Kill a Bloodveld.", CRYPTIC), - CLUE330("She's small but can build both literally and figuratively, as long as you have their favour", "Speak to Lovada south of the Lovakengj House blast mine", CRYPTIC), - CLUE331("Search for a crate in Varrock Castle.", "Search the crate in the corner of the kitchen in Varrock Castle.", CRYPTIC), - CLUE332("Dig in front of the icy arena where 1 of 4 was fought.", "Where you fought Kamil from Desert Treasure.", CRYPTIC), - CLUE333("Mine was the strangest birth under the sun. I left the crimson sack, yet life had not begun. Entered the world, and yet was seen by none.", "Inside Karamja Volcano, dig directly underneath the Red spiders' eggs respawn.", CRYPTIC), - CLUE334("Talk to Ambassador Spanfipple in the White Knights Castle.", "Ambassador Spanfipple can be found roaming on the 2nd floor of the White Knights Castle.", CRYPTIC), - CLUE335("You'll need to look for a town with a central fountain. Look for a locked chest in the town's chapel.", "Search the chest by the stairs in the Varrock church. Kill a Monk in Ardougne Monastery to obtain the key.", CRYPTIC), - CLUE336("Speak to a Wyse man.", "Talk to Wyson the gardener at Falador Park.", CRYPTIC), - CLUE337("Even the seers say this clue goes right over their heads.", "Search the crate on the Seers Agility Course in Seers Village", CRYPTIC), - CLUE338("Speak to Roavar.", "Talk to Roavar in the Canifis tavern.", CRYPTIC), - CLUE339("DIP 8511", "Dig 7 steps north and 4 steps east of the center of the fairy ring.", CRYPTIC), - CLUE340("Search the drawers upstairs of houses in eastern part of Falador.", "House is located east of the eastern Falador bank and south of the fountain. The house is indicated by the icon on the minimap.", CRYPTIC), - CLUE341("Search the drawers found upstairs in East Ardougne's houses.", "Upstairs of the pub north of the Ardougne Castle.", CRYPTIC), - CLUE342("Probably filled with wizards socks.", "Search the drawers in the basement of the Wizard's Tower south of Draynor Village. Kill one of the Wizards for the key.", CRYPTIC), - CLUE343("In a town where wizards are known to gather, search upstairs in a large house to the north.", "Search the chest, upstairs, in the house north of Yanille Wizards' Guild. Open the chest to receive the message: The chest is locked! An inscription on the chest reads: Stand by your man. Head downstairs to kill a Man.", CRYPTIC), - CLUE344("I am the one who watches the giants. The giants in turn watch me. I watch with two while they watch with one. Come seek where I may be.", "Speak to Kamfreena on the top floor of the Warriors' Guild.", CRYPTIC), - CLUE345("I have many arms but legs, I have just one, I have little family but my seed, You can grow on, I am not dead, yet I am but a spirit, and my power on your quests, you will earn the right to free it.", "Spirit Tree in Tree Gnome Village", CRYPTIC), - CLUE346("Show this to Sherlock", "Sherlock can be found south of Seer's Village.", CRYPTIC), - CLUE347("The far north eastern corner where 1 of 4 was defeated, the shadows still linger.", "Dig on the northeastern-most corner of the Shadow Dungeon. Bring a ring of visibility.", CRYPTIC), - CLUE348("Search a wardrobe in Draynor.", "Go to Aggie's house and search the wardrobe in northern wall.", CRYPTIC), - CLUE349("Speak to Rusty north of Falador", "Rusty can be found northeast of Falador on the way to the Mind altar.", CRYPTIC), - CLUE350("Search the drawers in a house in Draynor Village.", "The drawer is located in northern house in Draynor Village.", CRYPTIC), - CLUE351("Dig between some ominous stones in Falador.", "Three standing stones inside a walled area. East of the northern Falador gate.", CRYPTIC), - CLUE352("I watch the sea. I watch you fish. I watch your tree.", "Speak to Ellena at Catherby fruit tree patch.", CRYPTIC), - CLUE353("The mother of the reptilian sacrifice.", "Talk to Zul-Cheray in a house near the sacrificial boat at Zul-Andra.", CRYPTIC), - CLUE354("In the city where merchants are said to have lived, talk to a man with a splendid cape, but a hat dropped by goblins.", "Talk to the Head chef in Cooks' Guild west of Varrock.", CRYPTIC), - CLUE355("Search the boxes in a shop in Taverley.", "The box inside Gaius' Two Handed Shop.", CRYPTIC), - CLUE356("I lie beneath the first descent to the holy encampment.", "Dig immediately after climbing down the first set of rocks towards Saradomin's encampment within the God Wars Dungeon.", CRYPTIC), - CLUE357("I lie lonely and forgotten in mid wilderness, where the dead rise from their beds. Feel free to quarrel and wind me up and dig while you shoot their heads.", "Directly under the crossbow respawn in the Graveyard of Shadows in level 18 Wilderness.", CRYPTIC), - CLUE358("Search the upstairs drawers of a house in a village where pirates are known to have a good time.", "The house in the southeast corner of Brimhaven, northeast of Davon's Amulet Store. Kill any Pirate located around Brimhaven to obtain the key.", CRYPTIC), - CLUE359("Covered in shadows, the centre of the circle is where you will find the answer.", "Dig in the centre of Mort'ton, where the roads intersect", CRYPTIC), - CLUE360("A crate found in the tower of a church is your next location.", "Climb the ladder and search the crates on the 1st floor in the Church in Ardougne", CRYPTIC), - CLUE361("Search the crates in the Dwarven mine.", "Search the east of the Ice Mountain ladder entrance in the Drogo's Mining Emporium.", CRYPTIC), - CLUE362("Search the chest in the Duke of Lumbridge's bedroom.", "The Duke's room is on the 2nd floor in Lumbridge Castle.", CRYPTIC), - CLUE363("Talk to the Doomsayer.", "Doomsayer can be found just north of Lumbridge Castle entrance.", CRYPTIC), - CLUE364("Search the crates in Canifis.", "Search inside the shop, Rufus' Meat Emporium.", CRYPTIC), - CLUE365("Search the chests upstairs in Al Kharid Palace.", "The chest is located, in the northeast corner, on the first floor of the Al Kharid Palace", CRYPTIC), - CLUE366("Speak to Hans to solve the clue.", "Hans can be found at Lumbridge Castle.", CRYPTIC), - CLUE367("Speak to Ned in Draynor Village.", "Ned is found north or the Draynor bank.", CRYPTIC), - CLUE368("Search the boxes just outside the Armour shop in East Ardounge.", "Outside Zenesha's Plate Mail Body Shop", CRYPTIC), - CLUE369("Surrounded by white walls and gems.", "Talk to Herquin, the gem store owner in Falador.", CRYPTIC), - CLUE370("Talk to the mother of a basement dwelling son.", "Evil Dave's mother, Doris is located in the house west of Edgeville bank.", CRYPTIC), - CLUE371("THEY'RE EVERYWHERE!!!! But they were here first. Dig for treasure where the ground is rich with ore.", "Dig at Barbarian Village, next to the Stronghold of Security.", CRYPTIC), - CLUE372("One of the sailors in Port Sarim is your next destination.", "Speak to Captain Tobias on the docks of Port Sarim.", CRYPTIC), - CLUE373("His head might be hollow, but the crates nearby are filled with surprises.", "Search the crates near the Clay golem in the ruins of Uzer.", CRYPTIC), - CLUE374("Monk's residence in the far west. See robe storage device.", "Search the drawers upstairs in the chapel found on the southern coast of Great Kourend's Hosidius House. Directly south of the player-owned house portal.", CRYPTIC), - CLUE375("Search the drawers in Catherby's Archery shop.", "Hickton's Archery Emporium in Catherby.", CRYPTIC), - CLUE376("The hand ain't listening.", "Talk to The Face located by the manhole just north of the Port Sarim fishing shop.", CRYPTIC), - CLUE377("Search the chest in the left-hand tower of Camelot Castle.", "Located on the 2nd floor of the western tower of Camelot.", CRYPTIC), - CLUE378("Search the boxes in the house near the south entrance to Varrock.", "The first house on the left when entering the city from the southern entrance.", CRYPTIC), - CLUE379("A Guthixian ring lies between two peaks. Search the stones and you'll find what you seek.", "Search the stones several steps west of the Guthixian stone circle in Taverley", CRYPTIC), - CLUE380("Kill the spiritual, magic and godly whilst representing their own god", "Kill a spiritual mage in the God Wars Dungeon", CRYPTIC), - CLUE381("Search the crates near a cart in Varrock.", "South east of Varrock Palace, south of the tree farming patch.", CRYPTIC), - CLUE382("Search the crates in Draynor Manor.", "Top floor of the manor", CRYPTIC), - CLUE383("Anger those who adhere to Saradomin's edicts to prevent travel.", "Port Sarim Docks, try to charter a ship to Entrana with armour or weapons equipped.", CRYPTIC), - CLUE384("South of a river in a town surrounded by the undead, what lies beneath the furnace?", "Dig in front of the Shilo Village furnace.", CRYPTIC), - CLUE385("You were 3 and I was the 6th. Come speak to me.", "Speak to Vannaka in Edgeville Dungeon.", CRYPTIC), - CLUE386("Look in the ground floor crates of houses in Falador.", "The house east of the east bank.", CRYPTIC), - CLUE387("Come to the evil ledge, Yew know yew want to. Try not to get stung.", "Dig in Edgeville, just east of the Southern Yew tree.", CRYPTIC), - CLUE388("My home is grey, and made of stone; A castle with a search for a meal. Hidden in some drawers I am, across from a wooden wheel.", "Open the drawers inside the room with the spinning wheel on the first floor of Lumbridge Castle.", CRYPTIC), - CLUE389("The dead, red dragon watches over this chest. He must really dig the view.", "Search the chest underneath the Red Dragon's head in the Exam Centre. Kill a MALE Barbarian in Barbarian Village or Barbarian Outpost to receive the key.", CRYPTIC), - CLUE390("Right on the blessed border, cursed by the evil ones. On the spot inaccessible by both; I will be waiting. The bugs imminent possession holds the answer.", "B I P. Dig right under the fairy ring.", CRYPTIC), - CLUE391("Talk to the Squire in the White Knights' castle in Falador.", "The squire is located in the courtyard of the White Knights' Castle.", CRYPTIC), - CLUE392("Thanks Grandma!", "Tynan can be found in the north-east corner of Piscarilius House in Great Kourend.", CRYPTIC), - CLUE393("Search chests found in the upstairs of shops in Port Sarim.", "Search the chest in the upstairs of Wydin's Food Store, on the east wall.", CRYPTIC), - CLUE394("In a town where everyone has perfect vision, seek some locked drawers in a house that sits opposite a workshop.", "The drawers is in Seers' Village in the house south of the Elemental Workshop entrance. Kill any Chicken to obtain a key.", CRYPTIC), - CLUE395("Search the crate in the Toad and Chicken pub.", "The Toad and Chicken pub is located in Burthorpe.", CRYPTIC), - CLUE396("I wouldn't wear this jean on my legs.", "Talk to father Jean in the Hosidius church", CRYPTIC), - CLUE397("Search the crates in the shed just north of East Ardougne.", "The crates in the shed north of the northern Ardougne bank.", CRYPTIC), - CLUE398("This aviator is at the peak of his profession.", "Captain Bleemadge, the gnome glider pilot, is found at the top of White Wolf Mountain.", CRYPTIC), - CLUE399("The treasure is buried in a small building full of bones. Here is a hint: it's not near a graveyard.", "In the western building near the Limestone quarry east of Varrock. Dig south of the box of bones in the smaller building.", CRYPTIC), - CLUE400("Speak to the bartender of the Blue Moon Inn in Varrock.", "Talk to the bartender in Blue Moon Inn in Varrock.", CRYPTIC), - CLUE401("Search the crate near a cart in Port Khazard.", "Search by the southern Khazard General Store in Port Khazard.", CRYPTIC), - CLUE402("Search the crates in East Ardougne's general store.", "Located south of the Ardounge church.", CRYPTIC), - CLUE403("Come brave adventurer, your sense is on fire. If you talk to me, it's an old god you desire.", "Speak to Viggora", CRYPTIC), - CLUE404("Stop crying! Talk to the head.", "Talk to the Head mourner in the mourner headquarters in West Ardougne", CRYPTIC), - CLUE405("A town with a different sort of night-life is your destination. Search for some crates in one of the houses.", "Search the crate inside of the clothes shop in Canifis.", CRYPTIC), - CLUE406("The beasts to my east snap claws and tails, The rest to my west can slide and eat fish. The force to my north will jump and they'll wail, Come dig by my fire and make a wish.", "Dig by the torch in the Ardougne Zoo, between the penguins and the scorpions.", CRYPTIC), - CLUE407("2 musical birds. Dig in front of the spinning light.", "Dig in front of the spinning light in Ping and Pong's room inside the Iceberg", CRYPTIC), - CLUE408("His bark is worse than his bite.", "Speak to the Barker at Canifis's Barkers' Haberdashery.", CRYPTIC), - CLUE409("Search the wheelbarrow in Rimmington mine.", "The Rimmington mining site is located north of Rimmington.", CRYPTIC), - CLUE410("In a town where thieves steal from stalls, search for some drawers in the upstairs of a house near the bank.", "Kill any Guard located around East Ardougne for a medium key. Then search the drawers in the upstairs hallway of Jerico's house, which is the house with pigeon cages located south of the northern East Ardougne bank.", CRYPTIC), - CLUE411("Belladonna, my dear. If only I had gloves, then I could hold you at last.", "Talk to Tool Leprechaun at Draynor Manor", CRYPTIC), - CLUE412("Impossible to make angry", "Speak to Abbot Langley", CRYPTIC), - CLUE413("Identify the back of this over-acting brother. (He's a long way from home.)", "Talk to Hamid, the monk at the altar in the Duel Arena", CRYPTIC), - CLUE414("Search the crates in Horvik's armoury.", "Horvik's in Varrock", CRYPTIC), - CLUE415("Ghommal wishes to be impressed by how strong your equipment is.", "Talk to Ghommal at the Warrior's Guild while wearing sufficiently strong equipment", CRYPTIC), - CLUE416("Find a crate close to the monks that like to paaarty!", "The crate is in the east side of the Kandarin monastery, near Brother Omad", CRYPTIC), - CLUE417("Gold I see, yet gold I require. Give me 875 if death you desire.", "Speak to Saniboch at the Brimhaven Dungeon entrance.", CRYPTIC), - CLUE418("Shhhh!", "Speak to Logosia in the Arceuus House Library's ground floor.", CRYPTIC), - CLUE419("Speak to Sir Kay in Camelot Castle.", "Sir Kay can be found in the courtyard at Camelot castle.", CRYPTIC), - CLUE420("Snah? I feel all confused, like one of those cakes...", "Talk to Hans roaming around Lumbridge Castle.", CRYPTIC), - CLUE421("Search for a crate on the ground floor of a house in Seers' Village.", "Search inside Phantuwti Fanstuwi Farsight's house, located south of the pub in Seers' Village.", CRYPTIC), - CLUE422("Salty Peter", "Talk to Konoo who is digging saltpeter in the Hosidius district in Zeah.", CRYPTIC), - CLUE423("Talk to Zeke in Al Kharid.", "Zeke is the owner of the scimitar shop in Al Kharid.", CRYPTIC), - CLUE424("Guthix left his mark in a fiery lake, dig at the tip of it.", "Dig at the tip of the lava lake that is shaped like a Guthixian symbol, west of the Mage Arena.", CRYPTIC), - CLUE425("Search the drawers in the upstairs of a house in Catherby.", "Perdu's house in Catherby.", CRYPTIC), - CLUE426("Speak to Sarah at Falador farm.", "Talk to Sarah at Falador farm, north of Port Sarim.", CRYPTIC), - CLUE427("I burn between heroes and legends.", "Speak to the Candle maker in Catherby.", CRYPTIC), - CLUE428("Citric cellar.", "Speak to Heckel Funch on the first floor in the Grand Tree.", CRYPTIC), - CLUE429("Search a crate in the Haymaker's arms.", "Search the crate in the north-east corner of The Haymaker's Arms tavern east of the Woodcutting Guild.", CRYPTIC), - CLUE430("Come have a cip with this great soot covered denizen.", "Talk to Miner Magnus east of the fairy ring CIP. Answer: 8", CRYPTIC), - CLUE431("Desert insects is what I see, Taking care of them was my responsibility. Your solution is found by digging near me.", "Dig next to the Entomologist, Kalphite area, Stronghold Slayer Cave.", CRYPTIC), - CLUE432("Search the crates in most north-western house in Al Kharid.", "Search the crates in the house, marked with a icon, southeast of the gem stall.", CRYPTIC), - CLUE433("You will have to fly high where a sword cannot help you.", "Kill an Aviansie.", CRYPTIC), - CLUE434("A massive battle rages beneath so be careful when you dig by the large broken crossbow.", "NE of the God Wars Dungeon entrance, climb the rocky handholds & dig by large crossbow.", CRYPTIC), - CLUE435("Search a bookcase in the Wizards tower.", "The bookcase located on the ground floor.", CRYPTIC), - CLUE436("Mix yellow with blue and add heat, make sure you bring protection.", "Kill a green dragon.", CRYPTIC), - CLUE437("Speak to Ellis in Al Kharid.", "Ellis is tanner just north of Al Kharid bank.", CRYPTIC), - CLUE438("Search the chests in the Dwarven Mine.", "The chest is on the western wall, where Hura's Crossbow Shop is, in the Dwarven Mine.", CRYPTIC), - CLUE439("Falo the bard wants to see you.", "Speak to Falo the Bard", CRYPTIC), - CLUE440("Search the crates in a bank in Varrock.", "Search in the basement of the West Varrock bank.", CRYPTIC), - CLUE441("In a while...", "Kill a crocodile.", CRYPTIC), - CLUE442("A chisel and hammer reside in his home, strange for one of magic. Impress him with your magical equipment.", "Wizard Cromperty NE, East Ardougne. +100 magic attack bonus needed", CRYPTIC), - CLUE443("You have all of the elements available to solve this clue. Fortunately you do not have to go as far as to stand in a draft.", "Search the crate, west of the Air Elementals, inside the Elemental Workshop.", CRYPTIC), - CLUE444("Search the bucket in the Port Sarim jail.", "Talk to Shantay & identify yourself as an outlaw, refuse to pay the 5gp fine twice and you will be sent to the Port Sarim jail.", CRYPTIC), - CLUE445("A demon's best friend holds the next step of this clue.", "Kill a hellhound", CRYPTIC), - CLUE446("A reck you say; let's pray there aren't any ghosts.", "Speak to Father Aereck in Lumbridge.", CRYPTIC), - CLUE447("Search for a crate in a building in Hemenster.", "House north of the Fishing Contest quest area. West of Grandpa Jack.", CRYPTIC), - CLUE448("Speak to Ulizius.", "Ulizius is the monk who guards the gate into Mort Myre Swamp.", CRYPTIC), - CLUE449("Dig in the centre of a great city of 5 districts.", "Dig in front of the large statue in the centre of Great Kourend.", CRYPTIC), - CLUE450("Hopefully this set of armor will help you to keep surviving.", "Speak to Sir Vyvin while wearing a white full helm, platebody, and platelegs.", CRYPTIC), - CLUE451("North of the best monkey restaurant on Karamja, look for the centre of the triangle of boats and search there", "The crate on the dock to the west of the fishing site on the Northern shore of Karamja.", CRYPTIC), - CLUE452("The beasts retreat, for their Queen is gone; the song of this town still plays on. Dig near the birthplace of a blade, be careful not to melt your spade.", "Dig in front of the small furnace in the Piscatoris Fishing Colony.", CRYPTIC), - CLUE453("CIS 0009", "Dig 9 steps west of the center of the fairy ring.", CRYPTIC), - CLUE454("Darkness wanders around me, but fills my mind with knowledge.", "Speak to Biblia on the Arceuus House Library's top floor.", CRYPTIC), - CLUE455("The keeper of Melzars...Spare? Skeleton? Anar?", "Speak to Oziach in Edgeville", CRYPTIC), - CLUE456("I would make a chemistry joke, but I'm afraid I wouldn't get a reaction.", "Talk to Chemist in Rimmington", CRYPTIC), - CLUE457("Talk to the bartender of the Rusty Anchor in Port Sarim.", "The Rusty Anchor is located in the north of Port Sarim.", CRYPTIC), - CLUE458("How many Banana Trees are there in the plantation?", "33", CHALLENGE), - CLUE459("White knights are superior to black knights. 2 white knights can handle 3 black knights. How many knights do we need for an army of 981 black knights?", "654", CHALLENGE), - CLUE460("How many round tables can be found on this floor of the library?", "9", CHALLENGE), - CLUE461("If I have 1014 flax, and I spin a third of them into bowstring, how many flax do I have left?", "676", CHALLENGE), - CLUE462("How many arctic logs are required to make a large fremennik round shield?", "2", CHALLENGE), - CLUE463("What is the next number? 12, 13, 15, 17, 111, 113, 117, 119, 123....?", "129", CHALLENGE), - CLUE464("Please solve this for x: 7x - 28 = 21", "7", CHALLENGE), - CLUE465("SIX LEGS! All of them have six! There are 25 of them! How many legs?", "150", CHALLENGE), - CLUE466("If I have 303 bananas, and share them between 31 friends evenly, only handing out full bananas. How many will I have left over?", "24", CHALLENGE), - CLUE467("How many houses have a cross on the door?", "20", CHALLENGE), - CLUE468("How many ships are there docked at Port Sarim currently?", "6", CHALLENGE), - CLUE469("How many animals are in the Ardougne Zoo?", "40", CHALLENGE), - CLUE470("How many injured soldiers are in the tents?", "52", CHALLENGE), - CLUE471("How many flowers are in the clearing below this platform?", "13", CHALLENGE), - CLUE472("What is the next number in the sequence? 1, 11, 21, 1211, 111221, 312211", "13112221", CHALLENGE), - CLUE473("Double the miles before the initial Dorgeshuun veteran.", "2,505", CHALLENGE), - CLUE474("How many cannons are on this here castle?", "5", CHALLENGE), - CLUE475("How many rifts are found here in the abyss?", "13", CHALLENGE), - CLUE476("How many fishermen are there on the fishing platform?", "11", CHALLENGE), - CLUE477("What is 40 divided by 1/2 plus 15?", "95", CHALLENGE), - CLUE478("How many items can carry water in RuneScape?", "6", CHALLENGE), - CLUE479("How many reward points does a herb box cost?", "9,500", CHALLENGE), - CLUE480("How many Suqah inhabit Lunar isle?", "25", CHALLENGE), - CLUE481("How many snakeskins are needed in order to craft 44 boots, 29 vambraces and 34 bandanas?", "666", CHALLENGE), - CLUE482("How many gravestones are in the church graveyard?", "19", CHALLENGE), - CLUE483("How many natural fires burn in the Rogue's Den?", "2", CHALLENGE), - CLUE484("How many scorpions live under the pit?", "28", CHALLENGE), - CLUE485("How many coins would you need to purchase 133 kebabs from me?", "399", CHALLENGE), - CLUE486("How much smithing experience does one receive for smelting a blurite bar?", "8", CHALLENGE), - CLUE487("How many types of dragon are there beneath the whirlpool's cavern?", "2", CHALLENGE), - CLUE488("How many vine patches can you find in this vinery?", "12", CHALLENGE), - CLUE489("How many buildings in the village?", "11", CHALLENGE), - CLUE490("How many stalls are there in Varrock Square?", "5", CHALLENGE), - CLUE491("If I have 49 bottles of rum to share between 7 pirates, how many would each pirate get?", "7", CHALLENGE), - CLUE492("I have 16 kebabs, I eat one myself and share the rest equally between 3 friends. How many do they have each?", "5", CHALLENGE), - CLUE493("How many coins would I have if I had 0 coins and attempted to buy 3 loaves of bread?", "0", CHALLENGE), - CLUE494("King Arthur and Merlin sit down at the Round Table with 8 knights. How many degrees does each get?", "36", CHALLENGE), - CLUE495("How many bookcases are there in the Varrock palace library?", "24", CHALLENGE), - CLUE496("How many farming patches are there in Gnome stronghold?", "2", CHALLENGE), - CLUE497("What is 333 multiplied by 2?", "666", CHALLENGE), - CLUE498("How many ranges are there in the Catherby?", "2", CHALLENGE), - CLUE499("How many fountains are there within the grounds of Camelot castle.", "6", CHALLENGE), - CLUE500("How many coal rocks are around here?", "8", CHALLENGE), - CLUE501("How many bookcases are in the Wise Old Man's house?", "28", CHALLENGE), - CLUE502("What is the combined combat level of each species that live in Slayer tower?", "619", CHALLENGE), - CLUE503("If I have 1000 blood runes, and cast 131 ice barrage spells, how many blood runes do I have left?", "738", CHALLENGE), - CLUE504("What is the cube root of 125?", "5", CHALLENGE), - CLUE505("What is 57 x 89 + 23?", "5096", CHALLENGE), - CLUE506("How many pyre sites are found around this lake?", "3", CHALLENGE), - CLUE507("On a scale of 1-10, how helpful is Logosia?", "1", CHALLENGE), - CLUE508("How many air runes would I need to cast 630 wind waves?", "3,150", CHALLENGE), - CLUE509("How many people are waiting for the next bard to perform?", "4", CHALLENGE), - CLUE510("How many pigeon cages are there around the back of Jerico's house?", "3", CHALLENGE), - CLUE511("If x is 15 and y is 3, what is 3x + y?", "48", CHALLENGE), - CLUE512("One pipe fills a barrel in 1 hour while another pipe can fill the same barrel in 2 hours. How many minutes will it take to fill the take if both pipes are used?", "40", CHALLENGE), - CLUE513("On a clock, how many times a day does the minute hand and the hour hand overlap?", "22", CHALLENGE), - CLUE514("During a party, everyone shook hands with everyone else. There were 66 handshakes. How many people were at the party?", "12", CHALLENGE), - CLUE515("A question on elven crystal math. I have 5 and 3 crystals, large and small respectively. A large crystal is worth 10,000 coins and a small is worth but 1,000. How much are all my crystals worth?", "53,000", CHALLENGE), - CLUE516("32 - 5x = 22, what is x?", "2", CHALLENGE), - CLUE517("How many buildings are there in Rimmington?", "7", CHALLENGE), - CLUE518("How many gnomes on the Gnome ball field have red patches on their uniforms?", "6", CHALLENGE), - CLUE519("What is the minimum amount of quest points required to reach Lletya?", "20", CHALLENGE), - CLUE520("How many districts form the city of Great Kourend?", "5", CHALLENGE), - CLUE521("How many cannons does Lumbridge Castle have?", "9", CHALLENGE), - CLUE522("What is 19 to the power of 3?", "6859", CHALLENGE), - CLUE523("There are 3 inputs and 4 letters on each ring How many total individual fairy ring codes are possible?", "64", CHALLENGE), - CLUE524("How many fishing cranes can you find around here?", "5", CHALLENGE), - CLUE525("How many chairs are there in the Rising Sun?", "18", CHALLENGE), - CLUE526("What is the combined slayer requirement of every monster in the slayer cave?", "302", CHALLENGE), - CLUE527("The cipher reveals who to speak to next: BMJ UIF LFCBC TFMMFS", "Ali the Kebab seller", "Pollnivneach", "399", CIPHER), - CLUE528("The cipher reveals who to speak to next: GUHCHO", "Drezel", "Paterdomus", "7", CIPHER), - CLUE529("The cipher reveals who to speak to next: ZCZL", "Adam", "Outside Lumbridge castle", "666", CIPHER), - CLUE530("The cipher reveals who to speak to next: ZHLUG ROG PDQ", "Weird Old Man", "Kalphite Lair entrance", "150", CIPHER), - CLUE531("The cipher reveals who to speak to next: ECRVCKP MJCNGF", "Captain Khaled", "Large eastern building in Piscarilius House", "5", CIPHER), - CLUE532("The cipher reveals who to speak to next: OVEXON", "Eluned", "Outside Lletya", "53,000", CIPHER), - CLUE533("The cipher reveals who to speak to next: VTYR APCNTGLW", "King Percival", "Fisher Realm", "5", CIPHER), - CLUE534("The cipher reveals who to speak to next: UZZU MUJHRKYYKJ", "Otto Godblessed", "Otto's Grotto", "3", CIPHER), - CLUE535("The cipher reveals who to speak to next: USBJCPSO", "Traiborn", "Wizard's Tower, 2nd floor", "3150", CIPHER), - CLUE536("The cipher reveals who to speak to next: HCKTA IQFHCVJGT", "Fairy Godfather", "Zanaris throne room", "64", CIPHER), - CLUE537("The cipher reveals who to speak to next: ZSBKDO ZODO", "Pirate Pete", "Dock northeast of the Ectofunctus", CIPHER), - CLUE538("The cipher reveals who to speak to next: GBJSZ RVFFO", "Fairy Queen", "Fairy Resistance Hideout", CIPHER), - CLUE539("The cipher reveals who to speak to next: QSPGFTTPS HSBDLMFCPOF", "Professor Gracklebone", "Arceuus House Library, ground floor", "9", CIPHER); - - private static final Map clues = new HashMap<>(); - - private int[] ids; - private String text; - private String npc; - private String location; - private String answer; - private ClueScrollType type; - - static - { - for (ClueScroll s : values()) - { - clues.put(s.getText().toLowerCase(), s); - } - } - - ClueScroll(int[] ids, String text, String npc, String location, String answer, ClueScrollType type) - { - this.ids = ids; - this.text = text; - this.npc = npc; - this.location = location; - this.answer = answer; - this.type = type; - } - - ClueScroll(String text, String npc, String location, String answer, ClueScrollType type) - { - this(null, text, npc, location, answer, type); - } - - ClueScroll(String text, String npc, String location, ClueScrollType type) - { - this(null, text, npc, location, null, type); - } - - ClueScroll(String text, String answer, ClueScrollType type) - { - this(null, text, null, null, answer, type); - } - - ClueScroll(int[] ids, String text, ClueScrollType type) - { - this(ids, text, null, null, null, type); - } - - public int[] getIds() - { - return ids; - } - - public String getText() - { - return text; - } - - public String getNpc() - { - return npc; - } - - public String getLocation() - { - return location; - } - - public String getAnswer() - { - return answer; - } - - public ClueScrollType getType() - { - return type; - } - - public static ClueScroll forText(String text) - { - return clues.get(text); - } -} diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/ClueScrollType.java b/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/ClueScrollType.java deleted file mode 100644 index 926e6fccdf..0000000000 --- a/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/ClueScrollType.java +++ /dev/null @@ -1,36 +0,0 @@ -/* - * Copyright (c) 2016-2017, Seth - * 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.cluescrolls; - -public enum ClueScrollType -{ - CHALLENGE, - CIPHER, - ANAGRAM, - EMOTE, - CRYPTIC -} From ea93bc9a4ee36b7b7486c95728b2f3449d660e9e Mon Sep 17 00:00:00 2001 From: Adam Date: Mon, 26 Mar 2018 20:35:38 -0400 Subject: [PATCH 10/10] cluescroll overlay: set priority to low --- .../runelite/client/plugins/cluescrolls/ClueScrollOverlay.java | 2 ++ 1 file changed, 2 insertions(+) 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 6b27a90a0c..c3bcc2f1ba 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 @@ -32,6 +32,7 @@ import java.awt.Graphics2D; import javax.inject.Inject; import net.runelite.client.plugins.cluescrolls.clues.ClueScroll; import net.runelite.client.ui.overlay.Overlay; +import net.runelite.client.ui.overlay.OverlayPriority; import net.runelite.client.ui.overlay.components.PanelComponent; public class ClueScrollOverlay extends Overlay @@ -45,6 +46,7 @@ public class ClueScrollOverlay extends Overlay public ClueScrollOverlay(ClueScrollPlugin plugin) { this.plugin = plugin; + setPriority(OverlayPriority.LOW); } @Override