From e9c1937953f3c2ba5cf4c68f5908d8dc06ce462e Mon Sep 17 00:00:00 2001 From: BeepoWuff <10000712+BeepoWuff@users.noreply.github.com> Date: Tue, 21 Sep 2021 02:08:15 +1000 Subject: [PATCH] Update quest objective matching to better match job task matching. Allows the default enchanter quest to actually detect ARROW_DAMAGE enchantment. --- .../com/gamingmesh/jobs/container/Job.java | 13 +---- .../jobs/container/QuestProgression.java | 54 +++++++++++++------ .../java/com/gamingmesh/jobs/stuff/Util.java | 13 +++++ 3 files changed, 54 insertions(+), 26 deletions(-) diff --git a/src/main/java/com/gamingmesh/jobs/container/Job.java b/src/main/java/com/gamingmesh/jobs/container/Job.java index cbb6e483..66b0d2c4 100644 --- a/src/main/java/com/gamingmesh/jobs/container/Job.java +++ b/src/main/java/com/gamingmesh/jobs/container/Job.java @@ -29,8 +29,8 @@ import java.util.Map; import java.util.Random; import java.util.function.BiPredicate; -import com.gamingmesh.jobs.CMILib.CMIEnchantment; import com.gamingmesh.jobs.actions.EnchantActionInfo; +import com.gamingmesh.jobs.stuff.Util; import org.bukkit.block.Block; import org.bukkit.command.CommandSender; import org.bukkit.entity.Entity; @@ -310,16 +310,7 @@ public class Job { } if (actionInfo instanceof EnchantActionInfo) { - EnchantActionInfo enchantActionInfo = (EnchantActionInfo)actionInfo; - - String enchantName = CMIEnchantment.get(actionInfo.getName()).toString(); - - return ( - // Enchantment without level e.g. silk_touch - jobInfo.getName().equalsIgnoreCase(enchantName) || - // Enchantment with level e.g. fire_aspect:1 - jobInfo.getName().equalsIgnoreCase(enchantName + ":" + enchantActionInfo.getLevel()) - ); + return Util.enchantMatchesActionInfo(jobInfo.getName(), (EnchantActionInfo) actionInfo); } return jobInfo.getName().equalsIgnoreCase(action.getNameWithSub()) || diff --git a/src/main/java/com/gamingmesh/jobs/container/QuestProgression.java b/src/main/java/com/gamingmesh/jobs/container/QuestProgression.java index 00c70c68..e9c71744 100644 --- a/src/main/java/com/gamingmesh/jobs/container/QuestProgression.java +++ b/src/main/java/com/gamingmesh/jobs/container/QuestProgression.java @@ -4,6 +4,8 @@ import java.util.HashMap; import java.util.Map; import java.util.Map.Entry; +import com.gamingmesh.jobs.actions.EnchantActionInfo; +import com.gamingmesh.jobs.stuff.Util; import org.bukkit.Bukkit; import org.bukkit.event.server.ServerCommandEvent; @@ -97,7 +99,9 @@ public class QuestProgression { return; Map byAction = quest.getObjectives().get(action.getType()); - if (byAction != null && !byAction.containsKey(action.getNameWithSub()) && !byAction.containsKey(action.getName())) + QuestObjective objective = objectiveForAction(action); + + if (byAction != null && objective == null) return; org.bukkit.entity.Player player = jPlayer.getPlayer(); @@ -118,20 +122,12 @@ public class QuestProgression { } } - if (!isCompleted()) { - QuestObjective objective = null; - - if (byAction != null) { - objective = byAction.get(action.getName()); - - if (objective == null) - objective = byAction.get(action.getNameWithSub()); - } - - if (objective != null) { - Integer old = done.getOrDefault(objective, 0); - done.put(objective, old < objective.getAmount() ? old + 1 : objective.getAmount()); - } + if ( + !isCompleted() && + objective != null + ) { + Integer old = done.getOrDefault(objective, 0); + done.put(objective, old < objective.getAmount() ? old + 1 : objective.getAmount()); } jPlayer.setSaved(false); @@ -159,4 +155,32 @@ public class QuestProgression { public void setGivenReward(boolean givenReward) { this.givenReward = givenReward; } + + private boolean objectiveKeyMatches(String objectiveKey, ActionInfo actionInfo) { + if (actionInfo instanceof EnchantActionInfo) { + return Util.enchantMatchesActionInfo(objectiveKey, (EnchantActionInfo) actionInfo); + } + + return ( + objectiveKey.equalsIgnoreCase(actionInfo.getNameWithSub()) || + objectiveKey.equalsIgnoreCase(actionInfo.getName()) + ); + } + + private QuestObjective objectiveForAction(ActionInfo actionInfo) { + Map byAction = quest.getObjectives().get(actionInfo.getType()); + if (byAction == null) { + return null; + } + + for (Map.Entry objectiveEntry : byAction.entrySet()) { + String objectiveKey = objectiveEntry.getKey(); + + if (objectiveKeyMatches(objectiveKey, actionInfo)) { + return objectiveEntry.getValue(); + } + } + + return null; + } } diff --git a/src/main/java/com/gamingmesh/jobs/stuff/Util.java b/src/main/java/com/gamingmesh/jobs/stuff/Util.java index 76bcc2d1..a03070b1 100644 --- a/src/main/java/com/gamingmesh/jobs/stuff/Util.java +++ b/src/main/java/com/gamingmesh/jobs/stuff/Util.java @@ -14,6 +14,8 @@ import java.util.UUID; import java.util.jar.JarEntry; import java.util.jar.JarFile; +import com.gamingmesh.jobs.CMILib.CMIEnchantment; +import com.gamingmesh.jobs.actions.EnchantActionInfo; import org.bukkit.Bukkit; import org.bukkit.Color; import org.bukkit.Location; @@ -405,4 +407,15 @@ public final class Util { return difference; } + + public static boolean enchantMatchesActionInfo(String enchant, EnchantActionInfo actionInfo) { + String enchantName = CMIEnchantment.get(actionInfo.getName()).toString(); + + return ( + // Enchantment without level e.g. silk_touch + enchant.equalsIgnoreCase(enchantName) || + // Enchantment with level e.g. fire_aspect:1 + enchant.equalsIgnoreCase(enchantName + ":" + actionInfo.getLevel()) + ); + } }