diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/achievementdiary/CombatLevelRequirement.java b/runelite-client/src/main/java/net/runelite/client/plugins/achievementdiary/CombatLevelRequirement.java new file mode 100644 index 0000000000..4befd43eb1 --- /dev/null +++ b/runelite-client/src/main/java/net/runelite/client/plugins/achievementdiary/CombatLevelRequirement.java @@ -0,0 +1,41 @@ +/* + * Copyright (c) 2019 Abex + * 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 lombok.RequiredArgsConstructor; + +@RequiredArgsConstructor +@Getter +public class CombatLevelRequirement implements Requirement +{ + private final int level; + + @Override + public String toString() + { + return level + " " + "Combat"; + } +} 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 index 46f075685c..9da905fe14 100644 --- 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 @@ -25,17 +25,19 @@ */ package net.runelite.client.plugins.achievementdiary; +import com.google.common.collect.ImmutableList; +import java.util.List; import lombok.Getter; @Getter class DiaryRequirement { private final String task; - private final Requirement[] skillRequirements; + private final List requirements; - DiaryRequirement(String task, Requirement[] skillRequirements) + DiaryRequirement(String task, Requirement[] requirements) { this.task = task; - this.skillRequirements = skillRequirements; + this.requirements = ImmutableList.copyOf(requirements); } } 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 index 0c83d69e25..ff59ad8579 100644 --- 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 @@ -25,7 +25,6 @@ */ package net.runelite.client.plugins.achievementdiary; -import java.awt.Color; import java.util.ArrayList; import java.util.Collection; import java.util.HashMap; @@ -35,7 +34,6 @@ import javax.inject.Inject; import lombok.extern.slf4j.Slf4j; import net.runelite.api.Client; import net.runelite.api.ScriptID; -import net.runelite.api.Skill; import net.runelite.api.events.WidgetLoaded; import net.runelite.api.widgets.Widget; import net.runelite.api.widgets.WidgetID; @@ -55,7 +53,6 @@ import net.runelite.client.plugins.achievementdiary.diaries.MorytaniaDiaryRequir 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.ColorUtil; import net.runelite.client.util.Text; @Slf4j @@ -66,6 +63,8 @@ import net.runelite.client.util.Text; ) public class DiaryRequirementsPlugin extends Plugin { + private static final String AND_JOINER = ", "; + @Inject private Client client; @@ -233,66 +232,49 @@ public class DiaryRequirementsPlugin extends Plugin // returns a map of task -> level requirements private Map buildRequirements(Collection requirements) { - Map lineIndexRequirementMap = new HashMap<>(); + Map reqs = new HashMap<>(); for (DiaryRequirement req : requirements) { - String reqTask = req.getTask(); - List requirementBuilders = new ArrayList<>(); + StringBuilder b = new StringBuilder(); + b.append("("); - for (Requirement i : req.getSkillRequirements()) + assert req.getRequirements().size() > 0; + for (Requirement ireq : req.getRequirements()) { - RequirementStringBuilder requirementStringBuilder = new RequirementStringBuilder(i); - - Skill skill = i.getSkill(); - int realSkillLevel; - if (skill == null && i.getCustomRequirement().equals("Combat")) - { - realSkillLevel = client.getLocalPlayer().getCombatLevel(); - } - else - { - realSkillLevel = client.getRealSkillLevel(skill); - } - 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); + boolean satifisfied = satisfiesRequirement(ireq); + b.append(satifisfied ? "" : ""); + b.append(ireq.toString()); + b.append(satifisfied ? "" : ""); + b.append(AND_JOINER); } - lineIndexRequirementMap.put(reqTask, combine(requirementBuilders )); + b.delete(b.length() - AND_JOINER.length(), b.length()); + + b.append(")"); + + reqs.put(req.getTask(), b.toString()); } - return lineIndexRequirementMap; + return reqs; } - private String combine(List list) + private boolean satisfiesRequirement(Requirement r) { - StringBuilder requirementsString = new StringBuilder(); - requirementsString.append(ColorUtil.prependColorTag(" (", Color.WHITE)); - for (RequirementStringBuilder req : list) + if (r instanceof OrRequirement) { - requirementsString.append(ColorUtil.colorTag(new Color(0x80))) - .append(req.getRequirementString()) - .append(", "); + return ((OrRequirement) r).getRequirements() + .stream() + .anyMatch(this::satisfiesRequirement); } - requirementsString.deleteCharAt(requirementsString.length() - 1); - requirementsString.deleteCharAt(requirementsString.length() - 2); - requirementsString.append(ColorUtil.prependColorTag(")", Color.WHITE)); - - return requirementsString.toString(); + if (r instanceof SkillRequirement) + { + SkillRequirement s = (SkillRequirement) r; + return client.getRealSkillLevel(s.getSkill()) >= s.getLevel(); + } + if (r instanceof CombatLevelRequirement) + { + return client.getLocalPlayer().getCombatLevel() >= ((CombatLevelRequirement) r).getLevel(); + } + log.warn("Unknown requirement {}", r); + return false; } -} +} \ No newline at end of file diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/achievementdiary/OrRequirement.java b/runelite-client/src/main/java/net/runelite/client/plugins/achievementdiary/OrRequirement.java new file mode 100644 index 0000000000..7b852426f9 --- /dev/null +++ b/runelite-client/src/main/java/net/runelite/client/plugins/achievementdiary/OrRequirement.java @@ -0,0 +1,47 @@ +/* + * Copyright (c) 2019 Abex + * 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.base.Joiner; +import com.google.common.collect.ImmutableList; +import java.util.List; +import lombok.Getter; + +public class OrRequirement implements Requirement +{ + @Getter + private final List requirements; + + public OrRequirement(Requirement... reqs) + { + this.requirements = ImmutableList.copyOf(reqs); + } + + @Override + public String toString() + { + return Joiner.on(" or ").join(requirements); + } +} 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 index 3c8cc127cd..d7d0b32a13 100644 --- 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 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2018, Adam + * Copyright (c) 2019 Abex * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -23,30 +23,6 @@ * 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 +public interface Requirement { - private final Skill skill; - private final String customRequirement; - private final int levelRequirement; - private final Requirement[] altRequirements; - - public Requirement(Skill skill, int levelRequirement, Requirement... altRequirements) - { - this.skill = skill; - this.customRequirement = null; - this.levelRequirement = levelRequirement; - this.altRequirements = altRequirements; - } - - public Requirement(String customRequirement, int levelRequirement, Requirement... altRequirements) - { - this.skill = null; - this.customRequirement = customRequirement; - 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 deleted file mode 100644 index bf69eedd1d..0000000000 --- a/runelite-client/src/main/java/net/runelite/client/plugins/achievementdiary/RequirementStringBuilder.java +++ /dev/null @@ -1,94 +0,0 @@ -/* - * 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.awt.Color; -import java.util.List; -import lombok.Getter; -import net.runelite.api.Skill; -import net.runelite.client.util.ColorUtil; - -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 != null ? skill.getName() : requirement.getCustomRequirement()); - 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 = ColorUtil.wrapWithColorTag(this.requirementString, new Color(0x800000)); - } - - 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/SkillRequirement.java b/runelite-client/src/main/java/net/runelite/client/plugins/achievementdiary/SkillRequirement.java new file mode 100644 index 0000000000..1a711f91ac --- /dev/null +++ b/runelite-client/src/main/java/net/runelite/client/plugins/achievementdiary/SkillRequirement.java @@ -0,0 +1,43 @@ +/* + * Copyright (c) 2019 Abex + * 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 lombok.RequiredArgsConstructor; +import net.runelite.api.Skill; + +@RequiredArgsConstructor +@Getter +public class SkillRequirement implements Requirement +{ + private final Skill skill; + private final int level; + + @Override + public String toString() + { + return level + " " + skill.getName(); + } +}