From 5c920f941448a3e476f5bef2b07125231e86c82f Mon Sep 17 00:00:00 2001 From: Adam Date: Sun, 22 Jul 2018 16:17:49 -0400 Subject: [PATCH] Add achievement diary plugin This adds skill level requirements to the achievement diary log. --- .../net/runelite/api/widgets/WidgetID.java | 7 + .../net/runelite/api/widgets/WidgetInfo.java | 3 + .../achievementdiary/DiaryRequirement.java | 41 +++ .../DiaryRequirementsPlugin.java | 272 ++++++++++++++++++ .../GenericDiaryRequirement.java | 42 +++ .../plugins/achievementdiary/Requirement.java | 42 +++ .../RequirementStringBuilder.java | 92 ++++++ .../diaries/ArdougneDiaryRequirement.java | 102 +++++++ .../diaries/DesertDiaryRequirement.java | 94 ++++++ .../diaries/FaladorDiaryRequirement.java | 105 +++++++ .../diaries/FremennikDiaryRequirement.java | 96 +++++++ .../diaries/KandarinDiaryRequirement.java | 112 ++++++++ .../diaries/KaramjaDiaryRequirement.java | 104 +++++++ .../diaries/LumbridgeDiaryRequirement.java | 108 +++++++ .../diaries/MorytaniaDiaryRequirement.java | 107 +++++++ .../diaries/VarrockDiaryRequirement.java | 93 ++++++ .../diaries/WesternDiaryRequirement.java | 98 +++++++ .../diaries/WildernessDiaryRequirement.java | 98 +++++++ 18 files changed, 1616 insertions(+) create mode 100644 runelite-client/src/main/java/net/runelite/client/plugins/achievementdiary/DiaryRequirement.java create mode 100644 runelite-client/src/main/java/net/runelite/client/plugins/achievementdiary/DiaryRequirementsPlugin.java create mode 100644 runelite-client/src/main/java/net/runelite/client/plugins/achievementdiary/GenericDiaryRequirement.java create mode 100644 runelite-client/src/main/java/net/runelite/client/plugins/achievementdiary/Requirement.java create mode 100644 runelite-client/src/main/java/net/runelite/client/plugins/achievementdiary/RequirementStringBuilder.java create mode 100644 runelite-client/src/main/java/net/runelite/client/plugins/achievementdiary/diaries/ArdougneDiaryRequirement.java create mode 100644 runelite-client/src/main/java/net/runelite/client/plugins/achievementdiary/diaries/DesertDiaryRequirement.java create mode 100644 runelite-client/src/main/java/net/runelite/client/plugins/achievementdiary/diaries/FaladorDiaryRequirement.java create mode 100644 runelite-client/src/main/java/net/runelite/client/plugins/achievementdiary/diaries/FremennikDiaryRequirement.java create mode 100644 runelite-client/src/main/java/net/runelite/client/plugins/achievementdiary/diaries/KandarinDiaryRequirement.java create mode 100644 runelite-client/src/main/java/net/runelite/client/plugins/achievementdiary/diaries/KaramjaDiaryRequirement.java create mode 100644 runelite-client/src/main/java/net/runelite/client/plugins/achievementdiary/diaries/LumbridgeDiaryRequirement.java create mode 100644 runelite-client/src/main/java/net/runelite/client/plugins/achievementdiary/diaries/MorytaniaDiaryRequirement.java create mode 100644 runelite-client/src/main/java/net/runelite/client/plugins/achievementdiary/diaries/VarrockDiaryRequirement.java create mode 100644 runelite-client/src/main/java/net/runelite/client/plugins/achievementdiary/diaries/WesternDiaryRequirement.java create mode 100644 runelite-client/src/main/java/net/runelite/client/plugins/achievementdiary/diaries/WildernessDiaryRequirement.java 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 858564cbf9..a0e7b3dced 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 @@ -106,6 +106,7 @@ public class WidgetID public static final int DESTROY_ITEM_GROUP_ID = 584; public static final int VARROCK_MUSEUM_QUIZ_GROUP_ID = 533; public static final int KILL_LOGS_GROUP_ID = 549; + public static final int DIARY_QUEST_GROUP_ID = 275; static class WorldMap { @@ -549,6 +550,12 @@ public class WidgetID static final int BARROWS_REWARD_INVENTORY = 3; } + static class Diary + { + static final int DIARY_TITLE = 2; + static final int DIARY_TEXT = 1; + } + static class MTA { static final int BONUS_COMPONENT = 7; 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 c56a29ab62..df62929276 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 @@ -73,6 +73,9 @@ public enum WidgetInfo DIARY_LIST(WidgetID.DIARY_GROUP_ID, 4), + DIARY_QUEST_WIDGET_TITLE(WidgetID.DIARY_QUEST_GROUP_ID, WidgetID.Diary.DIARY_TITLE), + DIARY_QUEST_WIDGET_TEXT(WidgetID.DIARY_QUEST_GROUP_ID, WidgetID.Diary.DIARY_TEXT), + PEST_CONTROL_PURPLE_SHIELD(WidgetID.PEST_CONTROL_GROUP_ID, WidgetID.PestControl.PURPLE_SHIELD), PEST_CONTROL_BLUE_SHIELD(WidgetID.PEST_CONTROL_GROUP_ID, WidgetID.PestControl.BLUE_SHIELD), PEST_CONTROL_YELLOW_SHIELD(WidgetID.PEST_CONTROL_GROUP_ID, WidgetID.PestControl.YELLOW_SHIELD), diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/achievementdiary/DiaryRequirement.java b/runelite-client/src/main/java/net/runelite/client/plugins/achievementdiary/DiaryRequirement.java new file mode 100644 index 0000000000..46f075685c --- /dev/null +++ b/runelite-client/src/main/java/net/runelite/client/plugins/achievementdiary/DiaryRequirement.java @@ -0,0 +1,41 @@ +/* + * Copyright (c) 2018, Marshall + * Copyright (c) 2018, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.client.plugins.achievementdiary; + +import lombok.Getter; + +@Getter +class DiaryRequirement +{ + private final String task; + private final Requirement[] skillRequirements; + + DiaryRequirement(String task, Requirement[] skillRequirements) + { + this.task = task; + this.skillRequirements = skillRequirements; + } +} diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/achievementdiary/DiaryRequirementsPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/achievementdiary/DiaryRequirementsPlugin.java new file mode 100644 index 0000000000..7ba275e918 --- /dev/null +++ b/runelite-client/src/main/java/net/runelite/client/plugins/achievementdiary/DiaryRequirementsPlugin.java @@ -0,0 +1,272 @@ +/* + * Copyright (c) 2018, Marshall + * Copyright (c) 2018, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.client.plugins.achievementdiary; + +import com.google.common.eventbus.Subscribe; +import java.util.ArrayList; +import java.util.Collection; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import javax.inject.Inject; +import lombok.extern.slf4j.Slf4j; +import net.runelite.api.Client; +import net.runelite.api.events.WidgetLoaded; +import net.runelite.api.widgets.Widget; +import net.runelite.api.widgets.WidgetID; +import net.runelite.api.widgets.WidgetInfo; +import net.runelite.client.plugins.Plugin; +import net.runelite.client.plugins.PluginDescriptor; +import net.runelite.client.plugins.achievementdiary.diaries.ArdougneDiaryRequirement; +import net.runelite.client.plugins.achievementdiary.diaries.DesertDiaryRequirement; +import net.runelite.client.plugins.achievementdiary.diaries.FaladorDiaryRequirement; +import net.runelite.client.plugins.achievementdiary.diaries.FremennikDiaryRequirement; +import net.runelite.client.plugins.achievementdiary.diaries.KandarinDiaryRequirement; +import net.runelite.client.plugins.achievementdiary.diaries.KaramjaDiaryRequirement; +import net.runelite.client.plugins.achievementdiary.diaries.LumbridgeDiaryRequirement; +import net.runelite.client.plugins.achievementdiary.diaries.MorytaniaDiaryRequirement; +import net.runelite.client.plugins.achievementdiary.diaries.VarrockDiaryRequirement; +import net.runelite.client.plugins.achievementdiary.diaries.WesternDiaryRequirement; +import net.runelite.client.plugins.achievementdiary.diaries.WildernessDiaryRequirement; +import net.runelite.client.util.Text; + +@Slf4j +@PluginDescriptor( + name = "Diary Requirements", + description = "Display level requirements in Achievement Diary interface", + tags = {"achievements", "tasks"} +) +public class DiaryRequirementsPlugin extends Plugin +{ + @Inject + private Client client; + + @Subscribe + public void onWidgetLoaded(final WidgetLoaded event) + { + if (event.getGroupId() == WidgetID.DIARY_QUEST_GROUP_ID) + { + String widgetTitle = Text.removeTags( + client.getWidget( + WidgetInfo.DIARY_QUEST_WIDGET_TITLE) + .getText()) + .replace(' ', '_') + .toUpperCase(); + if (widgetTitle.startsWith("ACHIEVEMENT_DIARY")) + { + showDiaryRequirements(); + } + } + } + + private void showDiaryRequirements() + { + Widget widget = client.getWidget(WidgetInfo.DIARY_QUEST_WIDGET_TEXT); + Widget[] children = widget.getStaticChildren(); + + Widget titleWidget = children[0]; + if (titleWidget == null) + { + return; + } + + List originalAchievements = getOriginalAchievements(children); + + // new requirements starts out as a copy of the original + List newRequirements = new ArrayList<>(originalAchievements); + + GenericDiaryRequirement requirements = getRequirementsForTitle(titleWidget.getText()); + if (requirements == null) + { + log.debug("Unknown achievement diary {}", titleWidget.getText()); + return; + } + + Map skillRequirements = buildRequirements(requirements.getRequirements()); + if (skillRequirements == null) + { + return; + } + + int offset = 0; + String taskBuffer = ""; + for (int i = 0; i < originalAchievements.size(); i++) + { + String rowText = Text.removeTags(originalAchievements.get(i)); + if (skillRequirements.get(taskBuffer + " " + rowText) != null) + { + taskBuffer = taskBuffer + " " + rowText; + } + else + { + taskBuffer = rowText; + } + + if (skillRequirements.get(taskBuffer) != null) + { + String levelRequirement = skillRequirements.get(taskBuffer); + String task = originalAchievements.get(i); + if (Text.removeTags(task).length() + Text.removeTags(levelRequirement).length() <= 50) + { + newRequirements.set(i + offset, task + levelRequirement); + } + else + { + offset++; + if (task.startsWith("")) + { + newRequirements.add(i + offset, "" + levelRequirement); + } + else + { + newRequirements.add(i + offset, levelRequirement); + } + } + } + } + + for (int i = 0; i < newRequirements.size() && i < children.length; i++) + { + Widget achievementWidget = children[i]; + achievementWidget.setText(newRequirements.get(i)); + } + } + + private List getOriginalAchievements(Widget[] children) + { + List preloadedRequirements = new ArrayList<>(children.length); + for (Widget requirementWidget : children) + { + preloadedRequirements.add(requirementWidget.getText()); + } + return preloadedRequirements; + } + + private GenericDiaryRequirement getRequirementsForTitle(String title) + { + String diaryName = Text.removeTags(title + .replaceAll(" ", "_") + .toUpperCase()); + + GenericDiaryRequirement diaryRequirementContainer; + switch (diaryName) + { + case "ARDOUGNE_AREA_TASKS": + diaryRequirementContainer = new ArdougneDiaryRequirement(); + break; + case "DESERT_TASKS": + diaryRequirementContainer = new DesertDiaryRequirement(); + break; + case "FALADOR_AREA_TASKS": + diaryRequirementContainer = new FaladorDiaryRequirement(); + break; + case "FREMENNIK_TASKS": + diaryRequirementContainer = new FremennikDiaryRequirement(); + break; + case "KANDARIN_TASKS": + diaryRequirementContainer = new KandarinDiaryRequirement(); + break; + case "KARAMJA_AREA_TASKS": + diaryRequirementContainer = new KaramjaDiaryRequirement(); + break; + case "LUMBRIDGE_&_DRAYNOR_TASKS": + diaryRequirementContainer = new LumbridgeDiaryRequirement(); + break; + case "MORYTANIA_TASKS": + diaryRequirementContainer = new MorytaniaDiaryRequirement(); + break; + case "VARROCK_TASKS": + diaryRequirementContainer = new VarrockDiaryRequirement(); + break; + case "WESTERN_AREA_TASKS": + diaryRequirementContainer = new WesternDiaryRequirement(); + break; + case "WILDERNESS_AREA_TASKS": + diaryRequirementContainer = new WildernessDiaryRequirement(); + break; + default: + return null; + } + return diaryRequirementContainer; + } + + // returns a map of task -> level requirements + private Map buildRequirements(Collection requirements) + { + Map lineIndexRequirementMap = new HashMap<>(); + for (DiaryRequirement req : requirements) + { + String reqTask = req.getTask(); + List requirementBuilders = new ArrayList<>(); + + for (Requirement i : req.getSkillRequirements()) + { + RequirementStringBuilder requirementStringBuilder = new RequirementStringBuilder(i); + + int realSkillLevel = client.getRealSkillLevel(i.getSkill()); + List altRealSkillLevels = null; + if (i.getAltRequirements() != null) + { + altRealSkillLevels = new ArrayList<>(); + for (Requirement j : i.getAltRequirements()) + { + altRealSkillLevels.add(client.getRealSkillLevel(j.getSkill())); + } + } + + if (requirementStringBuilder.hasLevelRequirement(realSkillLevel, altRealSkillLevels)) + { + requirementStringBuilder.strikeThroughRequirement(); + } + else + { + requirementStringBuilder.colorRedRequirement(); + } + requirementBuilders .add(requirementStringBuilder); + } + + lineIndexRequirementMap.put(reqTask, combine(requirementBuilders )); + } + return lineIndexRequirementMap; + } + + private String combine(List list) + { + StringBuilder requirementsString = new StringBuilder(); + requirementsString.append(" ("); + for (RequirementStringBuilder req : list) + { + requirementsString.append("") + .append(req.getRequirementString()) + .append(", "); + } + requirementsString.deleteCharAt(requirementsString.length() - 1); + requirementsString.deleteCharAt(requirementsString.length() - 2); + requirementsString.append(")"); + + return requirementsString.toString(); + } +} diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/achievementdiary/GenericDiaryRequirement.java b/runelite-client/src/main/java/net/runelite/client/plugins/achievementdiary/GenericDiaryRequirement.java new file mode 100644 index 0000000000..ba7834b151 --- /dev/null +++ b/runelite-client/src/main/java/net/runelite/client/plugins/achievementdiary/GenericDiaryRequirement.java @@ -0,0 +1,42 @@ +/* + * Copyright (c) 2018, Marshall + * Copyright (c) 2018, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.client.plugins.achievementdiary; + +import java.util.HashSet; +import java.util.Set; +import lombok.Getter; + +public abstract class GenericDiaryRequirement +{ + @Getter + private Set requirements = new HashSet<>(); + + protected void add(String task, Requirement... requirements) + { + DiaryRequirement diaryRequirement = new DiaryRequirement(task, requirements); + this.requirements.add(diaryRequirement); + } +} diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/achievementdiary/Requirement.java b/runelite-client/src/main/java/net/runelite/client/plugins/achievementdiary/Requirement.java new file mode 100644 index 0000000000..eba42a5103 --- /dev/null +++ b/runelite-client/src/main/java/net/runelite/client/plugins/achievementdiary/Requirement.java @@ -0,0 +1,42 @@ +/* + * Copyright (c) 2018, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */package net.runelite.client.plugins.achievementdiary; + +import lombok.Getter; +import net.runelite.api.Skill; + +@Getter +public class Requirement +{ + private final Skill skill; + private final int levelRequirement; + private final Requirement[] altRequirements; + + public Requirement(Skill skill, int levelRequirement, Requirement... altRequirements) + { + this.skill = skill; + this.levelRequirement = levelRequirement; + this.altRequirements = altRequirements; + } +} diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/achievementdiary/RequirementStringBuilder.java b/runelite-client/src/main/java/net/runelite/client/plugins/achievementdiary/RequirementStringBuilder.java new file mode 100644 index 0000000000..dc403badeb --- /dev/null +++ b/runelite-client/src/main/java/net/runelite/client/plugins/achievementdiary/RequirementStringBuilder.java @@ -0,0 +1,92 @@ +/* + * Copyright (c) 2018, Marshall + * Copyright (c) 2018, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.client.plugins.achievementdiary; + +import java.util.List; +import lombok.Getter; +import net.runelite.api.Skill; + +class RequirementStringBuilder +{ + private final Requirement requirement; + @Getter + private String requirementString; + + RequirementStringBuilder(Requirement requirement) + { + this.requirement = requirement; + + int levelRequirement = requirement.getLevelRequirement(); + Skill skill = requirement.getSkill(); + Requirement[] altRequirements = requirement.getAltRequirements(); + + StringBuilder requirementStringBuilder = new StringBuilder() + .append(levelRequirement) + .append(" ") + .append(skill.getName()); + for (Requirement i : altRequirements) + { + requirementStringBuilder.append(" or ") + .append(i.getLevelRequirement()) + .append(" ") + .append(i.getSkill().getName()); + } + this.requirementString = requirementStringBuilder.toString(); + } + + void strikeThroughRequirement() + { + this.requirementString = "" + this.requirementString + ""; + } + + void colorRedRequirement() + { + this.requirementString = "" + this.requirementString + ""; + } + + boolean hasLevelRequirement(int realSkillLevel, List altRealSkillLevels) + { + return hasLevelRequirement(requirement, realSkillLevel, altRealSkillLevels); + } + + private static boolean hasLevelRequirement(Requirement requirement, int realSkillLevel, List altRealSkillLevels) + { + int levelRequirement = requirement.getLevelRequirement(); + Requirement[] altRequirements = requirement.getAltRequirements(); + + boolean hasReq = (realSkillLevel >= levelRequirement); + if (altRequirements != null && altRealSkillLevels != null) + { + int reqCounter = 0; + for (Requirement i : altRequirements) + { + hasReq = (hasReq || hasLevelRequirement(i, altRealSkillLevels.get(reqCounter), null)); + reqCounter++; + } + } + return hasReq; + } +} diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/achievementdiary/diaries/ArdougneDiaryRequirement.java b/runelite-client/src/main/java/net/runelite/client/plugins/achievementdiary/diaries/ArdougneDiaryRequirement.java new file mode 100644 index 0000000000..a6370ad1ac --- /dev/null +++ b/runelite-client/src/main/java/net/runelite/client/plugins/achievementdiary/diaries/ArdougneDiaryRequirement.java @@ -0,0 +1,102 @@ +/* + * Copyright (c) 2018, Marshall + * Copyright (c) 2018, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.client.plugins.achievementdiary.diaries; + +import net.runelite.api.Skill; +import net.runelite.client.plugins.achievementdiary.GenericDiaryRequirement; +import net.runelite.client.plugins.achievementdiary.Requirement; + +public class ArdougneDiaryRequirement extends GenericDiaryRequirement +{ + public ArdougneDiaryRequirement() + { + // EASY + add("Steal a cake from the Ardougne market stalls.", + new Requirement(Skill.THIEVING, 5)); + + // MEDIUM + add("Grapple over Yanille's south wall.", + new Requirement(Skill.AGILITY, 39), + new Requirement(Skill.STRENGTH, 38), + new Requirement(Skill.RANGED, 21)); + add("Harvest some strawberries from the Ardougne farming patch.", + new Requirement(Skill.FARMING, 31)); + add("Cast the Ardougne Teleport spell.", + new Requirement(Skill.MAGIC, 51)); + add("Travel to Castlewars by Hot Air Balloon.", + new Requirement(Skill.FIREMAKING, 50)); + add("Claim buckets of sand from Bert in Yanille.", + new Requirement(Skill.CRAFTING, 49)); + add("Pickpocket the master farmer north of Ardougne.", + new Requirement(Skill.THIEVING, 38)); + add("Equip Iban's upgraded staff or upgrade an Iban staff.", + new Requirement(Skill.MAGIC, 50), + new Requirement(Skill.ATTACK, 50)); + + // HARD + add("Enter the Magic Guild.", + new Requirement(Skill.MAGIC, 66)); + add("Attempt to steal from King Lathas' chest.", + new Requirement(Skill.THIEVING, 72)); + add("Teleport to the Watchtower.", + new Requirement(Skill.ATTACK, 58)); + add("Catch a Red Salamander.", + new Requirement(Skill.HUNTER, 59)); + add("Check the health of a Palm tree near tree gnome village.", + new Requirement(Skill.FARMING, 68)); + add("Pick some Poison Ivy berries from the patch south of Ardougne.", + new Requirement(Skill.FARMING, 70)); + add("Smith a Mithril platebody near Ardougne.", + new Requirement(Skill.SMITHING, 68)); + add("Enter your POH from Yanille.", + new Requirement(Skill.CONSTRUCTION, 50)); + add("Smith a Dragon sq shield in West Ardougne.", + new Requirement(Skill.SMITHING, 60)); + add("Craft some Death runes.", + new Requirement(Skill.RUNECRAFT, 65)); + + // ELITE + add("Catch a Manta ray in the Fishing Trawler and cook it in Port Khazard.", + + new Requirement(Skill.FISHING, 81), + new Requirement(Skill.COOKING, 91) + ); + add("Attempt to picklock the door to the basement of Yanille Agility Dungeon.", + new Requirement(Skill.THIEVING, 82)); + add("Pickpocket a Hero.", + new Requirement(Skill.THIEVING, 80)); + add("Make a rune crossbow yourself from scratch within Witchaven or Yanille.", + new Requirement(Skill.CRAFTING, 10), + new Requirement(Skill.SMITHING, 91), + new Requirement(Skill.FLETCHING, 69)); + add("Pick some Torstol from the patch north of Ardougne.", + new Requirement(Skill.FARMING, 85)); + add("Complete a lap of Ardougne's rooftop agility course.", + new Requirement(Skill.AGILITY, 90)); + add("Cast Ice Barrage on another player within Castlewars.", + new Requirement(Skill.MAGIC, 94)); + } +} diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/achievementdiary/diaries/DesertDiaryRequirement.java b/runelite-client/src/main/java/net/runelite/client/plugins/achievementdiary/diaries/DesertDiaryRequirement.java new file mode 100644 index 0000000000..2a5aa27a3c --- /dev/null +++ b/runelite-client/src/main/java/net/runelite/client/plugins/achievementdiary/diaries/DesertDiaryRequirement.java @@ -0,0 +1,94 @@ +/* + * Copyright (c) 2018, Marshall + * Copyright (c) 2018, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.client.plugins.achievementdiary.diaries; + +import net.runelite.api.Skill; +import net.runelite.client.plugins.achievementdiary.GenericDiaryRequirement; +import net.runelite.client.plugins.achievementdiary.Requirement; + +public class DesertDiaryRequirement extends GenericDiaryRequirement +{ + public DesertDiaryRequirement() + { + // EASY + add("Catch a Golden Warbler.", + new Requirement(Skill.HUNTER, 5)); + add("Mine 5 clay in the north-eastern desert.", + new Requirement(Skill.MINING, 5)); + add("Open the Sarcophagus in the first room of Pyramid Plunder.", + new Requirement(Skill.THIEVING, 21)); + + // MEDIUM + add("Climb to the summit of the Agility Pyramid.", + new Requirement(Skill.AGILITY, 30)); + add("Slay a desert lizard.", + new Requirement(Skill.SLAYER, 22)); + add("Catch an Orange Salamander.", + new Requirement(Skill.HUNTER, 47)); + add("Steal a feather from the Desert Phoenix.", + new Requirement(Skill.THIEVING, 25)); + add("Create a combat potion in the desert.", + new Requirement(Skill.HERBLORE, 36)); + add("Teleport to Pollnivneach with a redirected teleport to house tablet.", + new Requirement(Skill.CONSTRUCTION, 20)); + add("Chop some Teak logs near Uzer.", + new Requirement(Skill.WOODCUTTING, 35)); + + // HARD + add("Knock out and pickpocket a Menaphite Thug.", + new Requirement(Skill.THIEVING, 65)); + add("Mine some Granite.", + new Requirement(Skill.MINING, 45)); + add("Refill your waterskins in the Desert using Lunar magic.", + new Requirement(Skill.MAGIC, 68)); + add("Complete a lap of the Pollnivneach agility course.", + new Requirement(Skill.AGILITY, 70)); + add("Slay a Dust Devil with a Slayer helmet equipped.", + new Requirement(Skill.SLAYER, 65), + new Requirement(Skill.DEFENCE, 10), + new Requirement(Skill.CRAFTING, 55)); + add("Defeat a Locust Rider with Keris.", + new Requirement(Skill.ATTACK, 50)); + add("Burn some yew logs on the Nardah Mayor's balcony.", + new Requirement(Skill.FIREMAKING, 60)); + add("Create a Mithril Platebody in Nardah.", + new Requirement(Skill.SMITHING, 68)); + + // ELITE + add("Bake a wild pie at the Nardah Clay Oven.", + new Requirement(Skill.COOKING, 85)); + add("Cast Ice Barrage against a foe in the Desert.", + new Requirement(Skill.MAGIC, 94)); + add("Fletch some Dragon darts at the Bedabin Camp.", + new Requirement(Skill.FLETCHING, 95)); + add("Speak to the KQ head in your POH.", + new Requirement(Skill.CONSTRUCTION, 78)); + add("Steal from the Grand Gold Chest in the final room of Pyramid Plunder.", + new Requirement(Skill.THIEVING, 91)); + add("Restore at least 85 Prayer points when praying at the Altar in Sophanem.", + new Requirement(Skill.PRAYER, 85)); + } +} diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/achievementdiary/diaries/FaladorDiaryRequirement.java b/runelite-client/src/main/java/net/runelite/client/plugins/achievementdiary/diaries/FaladorDiaryRequirement.java new file mode 100644 index 0000000000..dc0253077c --- /dev/null +++ b/runelite-client/src/main/java/net/runelite/client/plugins/achievementdiary/diaries/FaladorDiaryRequirement.java @@ -0,0 +1,105 @@ +/* + * Copyright (c) 2018, Marshall + * Copyright (c) 2018, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.client.plugins.achievementdiary.diaries; + +import net.runelite.api.Skill; +import net.runelite.client.plugins.achievementdiary.GenericDiaryRequirement; +import net.runelite.client.plugins.achievementdiary.Requirement; + +public class FaladorDiaryRequirement extends GenericDiaryRequirement +{ + public FaladorDiaryRequirement() + { + // EASY + add("Find out what your family crest is from Sir Renitee.", + new Requirement(Skill.CONSTRUCTION, 16)); + add("Climb over the western Falador wall.", + new Requirement(Skill.AGILITY, 5)); + add("Smith some Blurite Limbs on Doric's Anvil.", + new Requirement(Skill.MINING, 10), + new Requirement(Skill.SMITHING, 13)); + + // MEDIUM + add("Light a Bullseye lantern at the Chemist's in Rimmington.", + new Requirement(Skill.FIREMAKING, 49)); + add("Telegrab some Wine of Zamorak at the Chaos Temple by the Wilderness.", + new Requirement(Skill.MAGIC, 33)); + add("Place a Scarecrow in the Falador farming patch.", + new Requirement(Skill.FARMING, 23)); + add("Kill a Mogre at Mudskipper Point.", + new Requirement(Skill.SLAYER, 32)); + add("Grapple up and then jump off the north Falador wall.", + new Requirement(Skill.AGILITY, 11), + new Requirement(Skill.STRENGTH, 37), + new Requirement(Skill.RANGED, 19)); + add("Pickpocket a Falador guard.", + new Requirement(Skill.THIEVING, 40)); + add("Pray at the Altar of Guthix in Taverley whilst wearing full Initiate.", + new Requirement(Skill.PRAYER, 10), + new Requirement(Skill.DEFENCE, 20)); + add("Mine some Gold ore at the Crafting Guild.", + new Requirement(Skill.CRAFTING, 40), + new Requirement(Skill.MINING, 40)); + add("Squeeze through the crevice in the Dwarven mines.", + new Requirement(Skill.AGILITY, 42)); + add("Chop and burn some Willow logs in Taverley", + new Requirement(Skill.WOODCUTTING, 30), + new Requirement(Skill.FIREMAKING, 30)); + add("Craft a fruit basket on the Falador Farm loom.", + new Requirement(Skill.CRAFTING, 36)); + add("Teleport to Falador.", + new Requirement(Skill.MAGIC, 37)); + + // HARD + add("Craft 140 Mind runes simultaneously.", + new Requirement(Skill.RUNECRAFT, 56)); + add("Change your family crest to the Saradomin symbol.", + new Requirement(Skill.PRAYER, 70)); + add("Kill a Skeletal Wyvern in the Asgarnia Ice Dungeon.", + new Requirement(Skill.SLAYER, 72)); + add("Complete a lap of the Falador rooftop agility course.", + new Requirement(Skill.AGILITY, 50)); + add("Enter the mining guild wearing full prospector.", + new Requirement(Skill.MINING, 60)); + add("Crack a wall safe within Rogues Den.", + new Requirement(Skill.THIEVING, 50)); + add("Recharge your prayer in the Port Sarim church while wearing full Proselyte.", + new Requirement(Skill.DEFENCE, 30)); + add("Equip a dwarven helmet within the dwarven mines.", + new Requirement(Skill.DEFENCE, 50)); + + // ELITE + add("Craft 252 Air Runes simultaneously.", + new Requirement(Skill.RUNECRAFT, 88)); + add("Find at least 3 magic roots at once when digging up your magic tree in Falador.", + new Requirement(Skill.FARMING, 91), + new Requirement(Skill.WOODCUTTING, 75)); + add("Jump over the strange floor in Taverley dungeon.", + new Requirement(Skill.AGILITY, 80)); + add("Mix a Saradomin brew in Falador east bank.", + new Requirement(Skill.HERBLORE, 81)); + } +} diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/achievementdiary/diaries/FremennikDiaryRequirement.java b/runelite-client/src/main/java/net/runelite/client/plugins/achievementdiary/diaries/FremennikDiaryRequirement.java new file mode 100644 index 0000000000..1f6632a589 --- /dev/null +++ b/runelite-client/src/main/java/net/runelite/client/plugins/achievementdiary/diaries/FremennikDiaryRequirement.java @@ -0,0 +1,96 @@ +/* + * Copyright (c) 2018, Marshall + * Copyright (c) 2018, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.client.plugins.achievementdiary.diaries; + +import net.runelite.api.Skill; +import net.runelite.client.plugins.achievementdiary.GenericDiaryRequirement; +import net.runelite.client.plugins.achievementdiary.Requirement; + +public class FremennikDiaryRequirement extends GenericDiaryRequirement +{ + public FremennikDiaryRequirement() + { + // EASY + add("Catch a Cerulean twitch.", + new Requirement(Skill.HUNTER, 11)); + add("Craft a tiara from scratch in Rellekka.", + new Requirement(Skill.CRAFTING, 23), + new Requirement(Skill.MINING, 20), + new Requirement(Skill.SMITHING, 20)); + add("Steal from the Keldagrim crafting or baker's stall.", + new Requirement(Skill.THIEVING, 5)); + add("Chop and burn some oak logs in the Fremennik Province.", + new Requirement(Skill.WOODCUTTING, 15), + new Requirement(Skill.FIREMAKING, 15)); + + // MEDIUM + add("Slay a Brine rat.", + new Requirement(Skill.SLAYER, 47)); + add("Mine some coal in Rellekka.", + new Requirement(Skill.MINING, 30)); + add("Steal from the Rellekka Fish stalls.", + new Requirement(Skill.THIEVING, 42)); + add("Catch a Snowy knight.", + new Requirement(Skill.HUNTER, 35)); + add("Pick up your Pet Rock from your POH Menagerie.", + new Requirement(Skill.CONSTRUCTION, 37)); + add("Mine some gold at the Arzinian mine.", + new Requirement(Skill.MINING, 40)); + + // HARD + add("Teleport to Trollheim.", + new Requirement(Skill.MAGIC, 61)); + add("Catch a Sabre-toothed Kyatt.", + new Requirement(Skill.HUNTER, 55)); + add("Mix a super defence potion in the Fremennik province.", + new Requirement(Skill.HERBLORE, 66)); + add("Steal from the Keldagrim Gem Stall.", + new Requirement(Skill.THIEVING, 75)); + add("Craft a Fremennik shield on Neitiznot.", + new Requirement(Skill.WOODCUTTING, 56)); + add("Mine 5 Adamantite ores on Jatizso.", + new Requirement(Skill.MINING, 70)); + add("Teleport to Waterbirth Island.", + new Requirement(Skill.MAGIC, 72)); + add("Obtain the Blast Furnace Foreman's permission to use the Blast Furnace for free.", + new Requirement(Skill.SMITHING, 60)); + + // ELITE + add("Craft 56 astral runes at once.", + new Requirement(Skill.RUNECRAFT, 82)); + add("Create a dragonstone amulet in the Neitiznot furnace.", + new Requirement(Skill.CRAFTING, 80)); + add("Complete a lap of the Rellekka agility course.", + new Requirement(Skill.AGILITY, 80)); + add("Kill each of the Godwars generals.", + new Requirement(Skill.AGILITY, 70), + new Requirement(Skill.STRENGTH, 70), + new Requirement(Skill.HITPOINTS, 70), + new Requirement(Skill.RANGED, 70)); + add("Slay a Spiritual mage within the Godwars Dungeon.", + new Requirement(Skill.SLAYER, 83)); + } +} diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/achievementdiary/diaries/KandarinDiaryRequirement.java b/runelite-client/src/main/java/net/runelite/client/plugins/achievementdiary/diaries/KandarinDiaryRequirement.java new file mode 100644 index 0000000000..6c148684a0 --- /dev/null +++ b/runelite-client/src/main/java/net/runelite/client/plugins/achievementdiary/diaries/KandarinDiaryRequirement.java @@ -0,0 +1,112 @@ +/* + * Copyright (c) 2018, Marshall + * Copyright (c) 2018, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.client.plugins.achievementdiary.diaries; + +import net.runelite.api.Skill; +import net.runelite.client.plugins.achievementdiary.GenericDiaryRequirement; +import net.runelite.client.plugins.achievementdiary.Requirement; + +public class KandarinDiaryRequirement extends GenericDiaryRequirement +{ + public KandarinDiaryRequirement() + { + // EASY + add("Catch a Mackerel at Catherby.", + new Requirement(Skill.FISHING, 16)); + add("Plant some Jute seeds in the patch north of McGrubor's Wood.", + new Requirement(Skill.FARMING, 13)); + add("Cross the Coal truck log shortcut.", + new Requirement(Skill.AGILITY, 20)); + + // MEDIUM + add("Complete a lap of the Barbarian agility course.", + new Requirement(Skill.AGILITY, 35)); + add("Create a Super Antipoison potion from scratch in the Seers/Catherby Area.", + new Requirement(Skill.HERBLORE, 48)); + add("Enter the Ranging guild.", + new Requirement(Skill.RANGED, 40)); + add("Use the grapple shortcut to get from the water obelisk to Catherby shore.", + new Requirement(Skill.AGILITY, 36), + new Requirement(Skill.STRENGTH, 22), + new Requirement(Skill.RANGED, 39)); + add("Catch and cook a Bass in Catherby.", + new Requirement(Skill.FISHING, 46), + new Requirement(Skill.COOKING, 43)); + add("Teleport to Camelot.", + new Requirement(Skill.MAGIC, 45)); + add("String a Maple shortbow in Seers' Village bank.", + new Requirement(Skill.FLETCHING, 50)); + add("Pick some Limpwurt root from the farming patch in Catherby.", + new Requirement(Skill.FARMING, 26)); + add("Steal from the chest in Hemenster.", + new Requirement(Skill.THIEVING, 47)); + add("Mine some coal near the coal trucks.", + new Requirement(Skill.MINING, 53)); + + // HARD + add("Catch a Leaping Sturgeon.", + new Requirement(Skill.FISHING, 70), + new Requirement(Skill.AGILITY, 45), + new Requirement(Skill.STRENGTH, 45)); + add("Complete a lap of the Seers' Village agility course.", + new Requirement(Skill.AGILITY, 60)); + add("Create a Yew Longbow from scratch around Seers' Village.", + new Requirement(Skill.WOODCUTTING, 60), + new Requirement(Skill.FLETCHING, 70), + new Requirement(Skill.CRAFTING, 10)); + add("Enter the Seers' Village courthouse with piety turned on.", + new Requirement(Skill.PRAYER, 70), + new Requirement(Skill.DEFENCE, 70)); + add("Charge a Water Orb.", + new Requirement(Skill.MAGIC, 56)); + add("Burn some Maple logs with a bow in Seers' Village.", + new Requirement(Skill.FIREMAKING, 65)); + add("Purchase and equip a granite body from Barbarian Assault.", + new Requirement(Skill.STRENGTH, 50), + new Requirement(Skill.DEFENCE, 50)); + add("Have the Seers' estate agent decorate your house with Fancy Stone.", + new Requirement(Skill.CONSTRUCTION, 50)); + add("Smith an Adamant spear at Otto's Grotto.", + new Requirement(Skill.SMITHING, 75)); + + // ELITE + add("Pick some Dwarf weed from the herb patch at Catherby.", + new Requirement(Skill.FARMING, 79)); + add("Fish and Cook 5 Sharks in Catherby using the Cooking gauntlets.", + new Requirement(Skill.FISHING, 76), + new Requirement(Skill.COOKING, 80)); + add("Mix a Stamina Mix on top of the Seers' Village bank.", + new Requirement(Skill.HERBLORE, 86), + new Requirement(Skill.AGILITY, 60)); + add("Smith a Rune Hasta at Otto's Grotto.", + new Requirement(Skill.SMITHING, 90)); + add("Construct a Pyre ship from Magic Logs.(Requires Chewed Bones.)", + new Requirement(Skill.FIREMAKING, 85), + new Requirement(Skill.CRAFTING, 85)); + add("Teleport to Catherby.", + new Requirement(Skill.MAGIC, 87)); + } +} diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/achievementdiary/diaries/KaramjaDiaryRequirement.java b/runelite-client/src/main/java/net/runelite/client/plugins/achievementdiary/diaries/KaramjaDiaryRequirement.java new file mode 100644 index 0000000000..0f744e08ce --- /dev/null +++ b/runelite-client/src/main/java/net/runelite/client/plugins/achievementdiary/diaries/KaramjaDiaryRequirement.java @@ -0,0 +1,104 @@ +/* + * Copyright (c) 2018, Marshall + * Copyright (c) 2018, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.client.plugins.achievementdiary.diaries; + +import net.runelite.api.Skill; +import net.runelite.client.plugins.achievementdiary.GenericDiaryRequirement; +import net.runelite.client.plugins.achievementdiary.Requirement; + +public class KaramjaDiaryRequirement extends GenericDiaryRequirement +{ + public KaramjaDiaryRequirement() + { + // EASY + add("Use the rope swing to travel to the small island north-west of Karamja, where the " + + "moss giants are.", + new Requirement(Skill.AGILITY, 10)); + add("Mine some gold from the rocks on the north-west peninsula of Karamja.", + new Requirement(Skill.MINING, 40)); + add("Explore Cairn Island to the west of Karamja.", + new Requirement(Skill.AGILITY, 15)); + + // MEDIUM + add("Claim a ticket from the Agility Arena in Brimhaven.", + new Requirement(Skill.AGILITY, 30)); + add("Earn 100% favour in the village of Tai Bwo Wannai.", + new Requirement(Skill.WOODCUTTING, 10)); + add("Cook a spider on a stick.", + new Requirement(Skill.COOKING, 16)); + add("Cut a log from a teak tree.", + new Requirement(Skill.WOODCUTTING, 35)); + add("Cut a log from a mahogany tree.", + new Requirement(Skill.WOODCUTTING, 50)); + add("Catch a karambwan.", + new Requirement(Skill.FISHING, 65)); + add("Grow a healthy fruit tree in the patch near Brimhaven.", + new Requirement(Skill.FARMING, 27)); + add("Trap a horned graahk.", + new Requirement(Skill.HUNTER, 41)); + add("Chop the vines to gain deeper access to Brimhaven Dungeon.", + new Requirement(Skill.FARMING, 27)); + add("Cross the lava using the stepping stones within Brimhaven Dungeon.", + new Requirement(Skill.AGILITY, 12)); + add("Climb the stairs within Brimhaven Dungeon.", + new Requirement(Skill.WOODCUTTING, 10)); + add("Mine a red topaz from a gem rock.", + new Requirement(Skill.MINING, 40)); + + // HARD + add("Craft some nature runes.", + new Requirement(Skill.RUNECRAFT, 44)); + add("Cook a karambwan thoroughly.", + new Requirement(Skill.COOKING, 30)); + add("Kill a deathwing in the dungeon under the Kharazi Jungle.", + new Requirement(Skill.WOODCUTTING, 15), + new Requirement(Skill.STRENGTH, 50), + new Requirement(Skill.AGILITY, 50), + new Requirement(Skill.THIEVING, 50), + new Requirement(Skill.MINING, 52)); + add("Use the crossbow short cut south of the volcano.", + new Requirement(Skill.AGILITY, 53), + new Requirement(Skill.RANGED, 42), + new Requirement(Skill.STRENGTH, 21)); + add("Collect 5 palm leaves.", + new Requirement(Skill.WOODCUTTING, 15)); + add("Be assigned a Slayer task by Duradel north of Shilo Village.", + new Requirement(Skill.SLAYER, 50)); + add("Kill a metal dragon in Brimhaven Dungeon.", + new Requirement(Skill.AGILITY, 12), + new Requirement(Skill.WOODCUTTING, 34)); + + // ELITE + add("Craft 56 Nature runes at once.", + new Requirement(Skill.RUNECRAFT, 91)); + add("Check the health of a palm tree in Brimhaven.", + new Requirement(Skill.FARMING, 68)); + add("Create an antivenom potion whilst standing in the horse shoe mine.", + new Requirement(Skill.HERBLORE, 87)); + add("Check the health of your Calquat tree patch.", + new Requirement(Skill.FARMING, 72)); + } +} diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/achievementdiary/diaries/LumbridgeDiaryRequirement.java b/runelite-client/src/main/java/net/runelite/client/plugins/achievementdiary/diaries/LumbridgeDiaryRequirement.java new file mode 100644 index 0000000000..6739357e23 --- /dev/null +++ b/runelite-client/src/main/java/net/runelite/client/plugins/achievementdiary/diaries/LumbridgeDiaryRequirement.java @@ -0,0 +1,108 @@ +/* + * Copyright (c) 2018, Marshall + * Copyright (c) 2018, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.client.plugins.achievementdiary.diaries; + +import net.runelite.api.Skill; +import net.runelite.client.plugins.achievementdiary.GenericDiaryRequirement; +import net.runelite.client.plugins.achievementdiary.Requirement; + +public class LumbridgeDiaryRequirement extends GenericDiaryRequirement +{ + public LumbridgeDiaryRequirement() + { + // EASY + add("Complete a lap of the Draynor Village agility course.", + new Requirement(Skill.AGILITY, 10)); + add("Slay a Cave bug beneath Lumbridge Swamp.", + new Requirement(Skill.SLAYER, 7)); + add("Craft some water runes.", + new Requirement(Skill.RUNECRAFT, 5)); + add("Chop and burn some oak logs in Lumbridge.", + new Requirement(Skill.WOODCUTTING, 15), + new Requirement(Skill.FIREMAKING, 15)); + add("Catch some Anchovies in Al Kharid.", + new Requirement(Skill.FISHING, 15)); + add("Mine some Iron ore at the Al Kharid mine.", + new Requirement(Skill.MINING, 15)); + + // MEDIUM + add("Complete a lap of the Al Kharid agility course.", + new Requirement(Skill.AGILITY, 20)); + add("Grapple across the River Lum.", + new Requirement(Skill.AGILITY, 8), + new Requirement(Skill.STRENGTH, 19), + new Requirement(Skill.RANGED, 37)); + add("Purchase an upgraded device from Ava.", + new Requirement(Skill.RANGED, 50)); + add("Cast the teleport to Lumbridge spell.", + new Requirement(Skill.MAGIC, 31)); + add("Catch some Salmon in Lumbridge.", + new Requirement(Skill.FISHING, 30)); + add("Craft a coif in the Lumbridge cow pen.", + new Requirement(Skill.CRAFTING, 38)); + add("Chop some willow logs in Draynor Village.", + new Requirement(Skill.WOODCUTTING, 30)); + add("Pickpocket Martin the Master Gardener.", + new Requirement(Skill.THIEVING, 38)); + add("Catch an Essence or Eclectic impling in Puro-Puro.", + new Requirement(Skill.HUNTER, 42)); + add("Craft some Lava runes at the fire altar in Al Kharid.", + new Requirement(Skill.RUNECRAFT, 23)); + + // HARD + add("Cast Bones to Peaches in Al Kharid palace.", + new Requirement(Skill.MAGIC, 60)); + add("Squeeze past the jutting wall on your way to the cosmic altar.", + new Requirement(Skill.AGILITY, 46)); + add("Craft 56 Cosmic runes simultaneously.", + new Requirement(Skill.RUNECRAFT, 59)); + add("Travel from Lumbridge to Edgeville on a Waka Canoe.", + new Requirement(Skill.FARMING, 63)); + add("Pick some Belladonna from the farming patch at Draynor Manor.", + new Requirement(Skill.FARMING, 68)); + add("Light your mining helmet in the Lumbridge castle basement.", + new Requirement(Skill.FIREMAKING, 65)); + add("Recharge your prayer at Clan Wars with Smite activated.", + new Requirement(Skill.PRAYER, 52)); + add("Craft, string and enchant an Amulet of Power in Lumbridge.", + new Requirement(Skill.CRAFTING, 70), + new Requirement(Skill.MAGIC, 57)); + + // ELITE + add("Steal from a Dorgesh-Kaan rich chest.", + new Requirement(Skill.THIEVING, 78)); + add("Pickpocket Movario on the Dorgesh-Kaan Agility course.", + new Requirement(Skill.AGILITY, 70), + new Requirement(Skill.RANGED, 70), + new Requirement(Skill.STRENGTH, 70)); + add("Chop some magic logs at the Mage Training Arena.", + new Requirement(Skill.WOODCUTTING, 75)); + add("Smith an Adamant platebody down Draynor sewer.", + new Requirement(Skill.SMITHING, 88)); + add("Craft 140 or more Water runes at once.", + new Requirement(Skill.RUNECRAFT, 76)); + } +} diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/achievementdiary/diaries/MorytaniaDiaryRequirement.java b/runelite-client/src/main/java/net/runelite/client/plugins/achievementdiary/diaries/MorytaniaDiaryRequirement.java new file mode 100644 index 0000000000..4c74987a43 --- /dev/null +++ b/runelite-client/src/main/java/net/runelite/client/plugins/achievementdiary/diaries/MorytaniaDiaryRequirement.java @@ -0,0 +1,107 @@ +/* + * Copyright (c) 2018, Marshall + * Copyright (c) 2018, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.client.plugins.achievementdiary.diaries; + +import net.runelite.api.Skill; +import net.runelite.client.plugins.achievementdiary.GenericDiaryRequirement; +import net.runelite.client.plugins.achievementdiary.Requirement; + +public class MorytaniaDiaryRequirement extends GenericDiaryRequirement +{ + public MorytaniaDiaryRequirement() + { + // EASY + add("Craft any Snelm from scratch in Morytania.", + new Requirement(Skill.CRAFTING, 15)); + add("Cook a thin Snail on the Port Phasmatys range.", + new Requirement(Skill.COOKING, 12)); + add("Kill a Banshee in the Slayer Tower.", + new Requirement(Skill.SLAYER, 15)); + add("Place a Scarecrow in the Morytania flower patch.", + new Requirement(Skill.FARMING, 23)); + + // MEDIUM + add("Catch a swamp lizard.", + new Requirement(Skill.HUNTER, 29)); + add("Complete a lap of the Canifis agility course.", + new Requirement(Skill.AGILITY, 40)); + add("Obtain some Bark from a Hollow tree.", + new Requirement(Skill.WOODCUTTING, 45)); + add("Kill a Terror Dog.", + new Requirement(Skill.SLAYER, 40)); + add("Complete a game of trouble brewing.", + new Requirement(Skill.COOKING, 40)); + add("Make a batch of cannonballs at the Port Phasmatys furnace.", + new Requirement(Skill.SMITHING, 35)); + add("Kill a Fever Spider on Braindeath Island.", + new Requirement(Skill.SLAYER, 42)); + add("Mix a Guthix Balance potion while in Morytania.", + new Requirement(Skill.HERBLORE, 36)); + + // HARD + add("Enter the Kharyrll portal in your POH.", + new Requirement(Skill.MAGIC, 66), + new Requirement(Skill.CONSTRUCTION, 50)); + add("Climb the advanced spike chain within Slayer Tower.", + new Requirement(Skill.AGILITY, 71)); + add("Harvest some Watermelon from the Allotment patch on Harmony Island.", + new Requirement(Skill.FARMING, 47)); + add("Chop and burn some mahogany logs on Mos Le'Harmless.", + new Requirement(Skill.WOODCUTTING, 50), + new Requirement(Skill.FIREMAKING, 50)); + add("Kill a Cave Horror.", + new Requirement(Skill.SLAYER, 58)); + add("Harvest some Bittercap Mushrooms from the patch in Canifis.", + new Requirement(Skill.FARMING, 53)); + add("Pray at the Altar of Nature with Piety activated.", + new Requirement(Skill.PRAYER, 70), + new Requirement(Skill.DEFENCE, 70)); + add("Use the shortcut to get to the bridge over the Salve.", + new Requirement(Skill.AGILITY, 65)); + add("Mine some Mithril ore in the Abandoned Mine.", + new Requirement(Skill.MINING, 55)); + + // ELITE + add("Catch a shark in Burgh de Rott with your bare hands.", + new Requirement(Skill.FISHING, 96), + new Requirement(Skill.STRENGTH, 76)); + add("Cremate any Shade remains on a Magic or Redwood pyre.", + new Requirement(Skill.FIREMAKING, 80)); + add("Fertilize the Morytania herb patch using Lunar Magic.", + new Requirement(Skill.MAGIC, 83)); + add("Craft a Black dragonhide body in Canifis bank.", + new Requirement(Skill.CRAFTING, 84)); + add("Kill an Abyssal demon in the Slayer Tower.", + new Requirement(Skill.SLAYER, 61)); + add("Loot the Barrows chest while wearing any complete barrows set.", + new Requirement(Skill.DEFENCE, 70), + new Requirement(Skill.ATTACK, 70, + new Requirement(Skill.STRENGTH, 70), + new Requirement(Skill.RANGED, 70), + new Requirement(Skill.MAGIC, 70)) + ); + } +} diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/achievementdiary/diaries/VarrockDiaryRequirement.java b/runelite-client/src/main/java/net/runelite/client/plugins/achievementdiary/diaries/VarrockDiaryRequirement.java new file mode 100644 index 0000000000..9ee2709412 --- /dev/null +++ b/runelite-client/src/main/java/net/runelite/client/plugins/achievementdiary/diaries/VarrockDiaryRequirement.java @@ -0,0 +1,93 @@ +/* + * Copyright (c) 2018, Marshall + * Copyright (c) 2018, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.client.plugins.achievementdiary.diaries; + +import net.runelite.api.Skill; +import net.runelite.client.plugins.achievementdiary.GenericDiaryRequirement; +import net.runelite.client.plugins.achievementdiary.Requirement; + +public class VarrockDiaryRequirement extends GenericDiaryRequirement +{ + public VarrockDiaryRequirement() + { + // EASY + add("Mine some Iron in the south east mining patch near Varrock.", + new Requirement(Skill.MINING, 15)); + add("Jump over the fence south of Varrock.", + new Requirement(Skill.AGILITY, 13)); + add("Spin a bowl on the pottery wheel and fire it in the oven in Barb Village.", + new Requirement(Skill.CRAFTING, 8)); + add("Craft some Earth runes.", + new Requirement(Skill.RUNECRAFT, 9)); + add("Catch some trout in the River Lum at Barbarian Village.", + new Requirement(Skill.FISHING, 20)); + add("Steal from the Tea stall in Varrock.", + new Requirement(Skill.THIEVING, 5)); + + // MEDIUM + add("Cast the teleport to Varrock spell.", + new Requirement(Skill.MAGIC, 25)); + add("Pick a White tree fruit.", + new Requirement(Skill.FARMING, 25)); + add("Use the balloon to travel from Varrock.", + new Requirement(Skill.FIREMAKING, 40)); + add("Complete a lap of the Varrock Agility course.", + new Requirement(Skill.AGILITY, 30)); + + // HARD + add("Trade furs with the Fancy Dress Seller for a spottier cape and equip it.", + new Requirement(Skill.HUNTER, 66)); + add("Make a Waka Canoe near Edgeville.", + new Requirement(Skill.WOODCUTTING, 57)); + add("Teleport to Paddewwa.", + new Requirement(Skill.MAGIC, 54)); + add("Chop some yew logs in Varrock and burn them at the top of the Varrock church.", + new Requirement(Skill.WOODCUTTING, 60), + new Requirement(Skill.FIREMAKING, 60)); + add("Have the Varrock estate agent decorate your house with Fancy Stone.", + new Requirement(Skill.CONSTRUCTION, 50)); + add("Collect at least 2 yew roots from the Tree patch in Varrock Palace.", + new Requirement(Skill.WOODCUTTING, 60), + new Requirement(Skill.FARMING, 68)); + add("Pray at the altar in Varrock palace with Smite active.", + new Requirement(Skill.PRAYER, 52)); + add("Squeeze through the obstacle pipe in Edgeville dungeon.", + new Requirement(Skill.AGILITY, 51)); + + // ELITE + add("Create a super combat potion in Varrock west bank.", + new Requirement(Skill.HERBLORE, 90)); + add("Use Lunar magic to make 20 mahogany planks at the Lumberyard.", + new Requirement(Skill.MAGIC, 86)); + add("Bake a summer pie in the Cooking Guild.", + new Requirement(Skill.COOKING, 95)); + add("Smith and fletch ten rune darts within Varrock.", + new Requirement(Skill.SMITHING, 89), + new Requirement(Skill.FLETCHING, 81)); + add("Craft 100 or more earth runes simultaneously.", + new Requirement(Skill.RUNECRAFT, 78)); + } +} diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/achievementdiary/diaries/WesternDiaryRequirement.java b/runelite-client/src/main/java/net/runelite/client/plugins/achievementdiary/diaries/WesternDiaryRequirement.java new file mode 100644 index 0000000000..83a6ca5fc4 --- /dev/null +++ b/runelite-client/src/main/java/net/runelite/client/plugins/achievementdiary/diaries/WesternDiaryRequirement.java @@ -0,0 +1,98 @@ +/* + * Copyright (c) 2018, Marshall + * Copyright (c) 2018, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.client.plugins.achievementdiary.diaries; + +import net.runelite.api.Skill; +import net.runelite.client.plugins.achievementdiary.GenericDiaryRequirement; +import net.runelite.client.plugins.achievementdiary.Requirement; + +public class WesternDiaryRequirement extends GenericDiaryRequirement +{ + public WesternDiaryRequirement() + { + // EASY + add("Catch a Copper Longtail.", + new Requirement(Skill.HUNTER, 9)); + add("Mine some Iron Ore near Piscatoris.", + new Requirement(Skill.MINING, 15)); + add("Fletch an Oak shortbow from the Gnome Stronghold.", + new Requirement(Skill.FLETCHING, 20)); + + // MEDIUM + add("Take the agility shortcut from the Grand Tree to Otto's Grotto.", + new Requirement(Skill.AGILITY, 37)); + add("Trap a Spined Larupia.", + new Requirement(Skill.HUNTER, 31)); + add("Fish some Bass on Ape Atoll.", + new Requirement(Skill.FISHING, 46)); + add("Chop and burn some teak logs on Ape Atoll.", + new Requirement(Skill.WOODCUTTING, 35), + new Requirement(Skill.FIREMAKING, 35)); + add("Make a Chocolate Bomb at the Grand Tree.", + new Requirement(Skill.COOKING, 42)); + add("Complete a delivery for the Gnome Restaurant.", + new Requirement(Skill.COOKING, 42)); + add("Mine some Gold ore underneath the Grand Tree.", + new Requirement(Skill.MINING, 40)); + + // HARD + add("Kill an Elf with a Crystal bow.", + new Requirement(Skill.RANGED, 70), + new Requirement(Skill.AGILITY, 50)); + add("Catch and cook a Monkfish in Piscatoris.", + new Requirement(Skill.FISHING, 62), + new Requirement(Skill.COOKING, 62)); + add("Catch a Dashing Kebbit.", + new Requirement(Skill.HUNTER, 69)); + add("Complete a lap of the Ape Atoll agility course.", + new Requirement(Skill.FARMING, 63)); + add("Chop and burn some Mahogany logs on Ape Atoll.", + new Requirement(Skill.WOODCUTTING, 50), + new Requirement(Skill.FIREMAKING, 50)); + add("Mine some Adamantite ore in Tirannwn.", + new Requirement(Skill.MINING, 70)); + add("Check the health of your Palm tree in Lletya.", + new Requirement(Skill.FARMING, 68)); + add("Build an Isafdar painting in your POH Quest hall.", + new Requirement(Skill.CONSTRUCTION, 65)); + add("Teleport to Ape Atoll.", + new Requirement(Skill.MAGIC, 64)); + add("Pickpocket a Gnome.", + new Requirement(Skill.THIEVING, 75)); + + // ELITE + add("Fletch a Magic Longbow in the Elven lands.", + new Requirement(Skill.FLETCHING, 85)); + add("Kill the Thermonuclear Smoke devil (Does not require task).", + new Requirement(Skill.SLAYER, 93)); + add("Have Prissy Scilla protect your Magic tree.", + new Requirement(Skill.FARMING, 75)); + add("Use the Elven overpass advanced cliffside shortcut.", + new Requirement(Skill.AGILITY, 85)); + add("Pickpocket an Elf.", + new Requirement(Skill.THIEVING, 85)); + } +} diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/achievementdiary/diaries/WildernessDiaryRequirement.java b/runelite-client/src/main/java/net/runelite/client/plugins/achievementdiary/diaries/WildernessDiaryRequirement.java new file mode 100644 index 0000000000..d3dc26c215 --- /dev/null +++ b/runelite-client/src/main/java/net/runelite/client/plugins/achievementdiary/diaries/WildernessDiaryRequirement.java @@ -0,0 +1,98 @@ +/* + * Copyright (c) 2018, Marshall + * Copyright (c) 2018, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.client.plugins.achievementdiary.diaries; + +import net.runelite.api.Skill; +import net.runelite.client.plugins.achievementdiary.GenericDiaryRequirement; +import net.runelite.client.plugins.achievementdiary.Requirement; + +public class WildernessDiaryRequirement extends GenericDiaryRequirement +{ + public WildernessDiaryRequirement() + { + // EASY + add("Cast Low Alchemy at the Fountain of Rune.", + new Requirement(Skill.MAGIC, 21)); + add("Kill an Earth Warrior in the Wilderness beneath Edgeville.", + new Requirement(Skill.AGILITY, 15)); + add("Mine some Iron ore in the Wilderness.", + new Requirement(Skill.MINING, 15)); + + // MEDIUM + add("Mine some Mithril ore in the wilderness.", + new Requirement(Skill.MINING, 55)); + add("Chop some yew logs from a fallen Ent.", + new Requirement(Skill.WOODCUTTING, 61)); + add("Enter the Wilderness Godwars Dungeon.", + new Requirement(Skill.AGILITY, 60, + new Requirement(Skill.STRENGTH, 60)) + ); + add("Complete a lap of the Wilderness Agility course.", + new Requirement(Skill.AGILITY, 52)); + add("Charge an Earth Orb.", + new Requirement(Skill.MAGIC, 60)); + add("Kill a Bloodveld in the Wilderness Godwars Dungeon.", + new Requirement(Skill.SLAYER, 50)); + add("Smith a Golden helmet in the Resource Area.", + new Requirement(Skill.SMITHING, 50)); + + // HARD + add("Cast one of the 3 God spells against another player in the Wilderness.", + new Requirement(Skill.MAGIC, 60)); + add("Charge an Air Orb.", + new Requirement(Skill.MAGIC, 66)); + add("Catch a Black Salamander in the Wilderness.", + new Requirement(Skill.HUNTER, 67)); + add("Smith an Adamant scimitar in the Resource Area.", + new Requirement(Skill.SMITHING, 75)); + add("Take the agility shortcut from Trollheim into the Wilderness.", + new Requirement(Skill.AGILITY, 64)); + add("Kill a Spiritual warrior in the Wilderness Godwars Dungeon.", + new Requirement(Skill.SLAYER, 68)); + add("Fish some Raw Lava Eel in the Wilderness.", + new Requirement(Skill.FISHING, 53)); + + // ELITE + add("Teleport to Ghorrock.", + new Requirement(Skill.MAGIC, 96)); + add("Fish and Cook a Dark Crab in the Resource Area.", + new Requirement(Skill.FISHING, 85), + new Requirement(Skill.COOKING, 90)); + add("Smith a rune scimitar from scratch in the Resource Area.", + new Requirement(Skill.MINING, 85), + new Requirement(Skill.SMITHING, 90)); + add("Steal from the Rogues' chest.", + new Requirement(Skill.THIEVING, 84)); + add("Slay a spiritual mage inside the wilderness Godwars Dungeon.", + new Requirement(Skill.SLAYER, 83), + new Requirement(Skill.AGILITY, 60, + new Requirement(Skill.STRENGTH, 60)) + ); + add("Cut and burn some magic logs in the Resource Area.", + new Requirement(Skill.WOODCUTTING, 75), + new Requirement(Skill.FIREMAKING, 75)); + } +}