From 260c66f4deecbd8fdca09a9cc811a46e55c9deab Mon Sep 17 00:00:00 2001 From: PikaMug <2267126+PikaMug@users.noreply.github.com> Date: Tue, 5 Apr 2022 13:55:09 -0400 Subject: [PATCH] Translate item names in Quest Journal, fixes #1915 --- .../me/blackvein/quests/config/ISettings.java | 2 + .../me/blackvein/quests/player/IQuester.java | 2 + .../me/blackvein/quests/quests/Objective.java | 2 + core/pom.xml | 2 +- .../java/me/blackvein/quests/Quester.java | 529 +++++++++++++++++- .../java/me/blackvein/quests/Settings.java | 1 + .../subcommands/QuestsJournalCommand.java | 6 +- .../blackvein/quests/item/QuestJournal.java | 115 ++-- .../quests/quests/BukkitObjective.java | 36 +- core/src/main/resources/config.yml | 1 + 10 files changed, 631 insertions(+), 65 deletions(-) diff --git a/api/src/main/java/me/blackvein/quests/config/ISettings.java b/api/src/main/java/me/blackvein/quests/config/ISettings.java index 850aac278..8aad4071d 100644 --- a/api/src/main/java/me/blackvein/quests/config/ISettings.java +++ b/api/src/main/java/me/blackvein/quests/config/ISettings.java @@ -35,6 +35,8 @@ public interface ISettings { void setDisableCommandFeedback(final boolean disableCommandFeedback); boolean canGenFilesOnJoin(); void setGenFilesOnJoin(final boolean genFilesOnJoin); + boolean canGiveJournalItem(); + void setGiveJournalItem(final boolean giveJournalItem); boolean canIgnoreLockedQuests(); void setIgnoreLockedQuests(final boolean ignoreLockedQuests); int getKillDelay(); diff --git a/api/src/main/java/me/blackvein/quests/player/IQuester.java b/api/src/main/java/me/blackvein/quests/player/IQuester.java index 5aade9158..2a7f24ed1 100644 --- a/api/src/main/java/me/blackvein/quests/player/IQuester.java +++ b/api/src/main/java/me/blackvein/quests/player/IQuester.java @@ -143,6 +143,8 @@ public interface IQuester extends Comparable { LinkedList getCurrentObjectives(final IQuest quest, final boolean ignoreOverrides); + LinkedList getCurrentObjectivesTemp(final IQuest quest, final boolean ignoreOverrides, final boolean formatItems); + LinkedList getObjectives(final IQuest quest, final boolean ignoreOverrides); boolean containsObjective(final IQuest quest, final String name); diff --git a/api/src/main/java/me/blackvein/quests/quests/Objective.java b/api/src/main/java/me/blackvein/quests/quests/Objective.java index b7021eee0..7b0dd4678 100644 --- a/api/src/main/java/me/blackvein/quests/quests/Objective.java +++ b/api/src/main/java/me/blackvein/quests/quests/Objective.java @@ -18,6 +18,8 @@ import org.bukkit.inventory.ItemStack; public interface Objective { ObjectiveType getType(); + String getMessage(); + int getProgress(); int getGoal(); diff --git a/core/pom.xml b/core/pom.xml index f5ad47dce..f6949f88d 100644 --- a/core/pom.xml +++ b/core/pom.xml @@ -132,7 +132,7 @@ com.github.PikaMug LocaleLib - 12e12cbadc + 5fb19ed10c xyz.upperlevel.spigot.book diff --git a/core/src/main/java/me/blackvein/quests/Quester.java b/core/src/main/java/me/blackvein/quests/Quester.java index 200e1bd53..6c94d30b6 100644 --- a/core/src/main/java/me/blackvein/quests/Quester.java +++ b/core/src/main/java/me/blackvein/quests/Quester.java @@ -510,7 +510,7 @@ public class Quester implements IQuester { } final int index = getJournalIndex(); if (index != -1) { - final QuestJournal journal = new QuestJournal(this); + final QuestJournal journal = new QuestJournal(plugin, this); getPlayer().getInventory().setItem(index, journal.toItemStack()); } } @@ -1089,10 +1089,10 @@ public class Quester implements IQuester { current.addAll(finishedRequirements); return current; } - + /** * Get current objectives for a quest, both finished and unfinished - * + * * @param quest The quest to get objectives of * @param ignoreOverrides Whether to ignore objective-overrides * @return List of detailed objectives @@ -1562,6 +1562,529 @@ public class Quester implements IQuester { return objectives; } + /** + * Get current objectives for a quest, both finished and unfinished + * + * @param quest The quest to get objectives of + * @param ignoreOverrides Whether to ignore objective-overrides + * @param formatItems Whether to format item names, if applicable + * @return List of detailed objectives + */ + @SuppressWarnings("deprecation") + public LinkedList getCurrentObjectivesTemp(final IQuest quest, final boolean ignoreOverrides, + final boolean formatItems) { + if (quest == null) { + plugin.getLogger().severe("Quest was null when getting objectives for " + getLastKnownName()); + return new LinkedList<>(); + } + if (getQuestData(quest) == null) { + plugin.getLogger().warning("Quest data was null when getting objectives for " + quest.getName()); + return new LinkedList<>(); + } + if (getCurrentStage(quest) == null) { + //plugin.getLogger().warning("Current stage was null when getting objectives for " + quest.getName()); + return new LinkedList<>(); + } + final IDependencies depends = plugin.getDependencies(); + if (!ignoreOverrides && !getCurrentStage(quest).getObjectiveOverrides().isEmpty()) { + final LinkedList objectives = new LinkedList<>(); + for (final String s: getCurrentStage(quest).getObjectiveOverrides()) { + String message = ChatColor.GREEN + ConfigUtil.parseString(s, quest, getPlayer()); + if (depends.getPlaceholderApi() != null) { + message = PlaceholderAPI.setPlaceholders(getPlayer(), message); + } + // TODO is this acceptable? + objectives.add(new BukkitObjective(ObjectiveType.CUSTOM, message, 0, 1)); + } + return objectives; + } + final QuestData data = getQuestData(quest); + final IStage stage = getCurrentStage(quest); + final LinkedList objectives = new LinkedList<>(); + for (final ItemStack goal : stage.getBlocksToBreak()) { + for (final ItemStack progress : data.blocksBroken) { + if (progress.getType().equals(goal.getType()) && progress.getDurability() == goal.getDurability()) { + final ChatColor color = progress.getAmount() < goal.getAmount() ? ChatColor.GREEN : ChatColor.GRAY; + String message = color + Lang.get(getPlayer(), "break"); + if (message.contains("")) { + message = message.replace("", "" + color + progress.getAmount() + "/" + + goal.getAmount()); + } else { + // Legacy + message += " " + color + color + ": " + progress.getAmount() + "/" + goal.getAmount(); + } + if (depends.getPlaceholderApi() != null) { + message = PlaceholderAPI.setPlaceholders(getPlayer(), message); + } + if (formatItems) { + message = message.replace("", ItemUtil.getName(progress)); + } + objectives.add(new BukkitObjective(ObjectiveType.BREAK_BLOCK, message, progress, goal)); + } + } + } + for (final ItemStack goal : stage.getBlocksToDamage()) { + for (final ItemStack progress : data.blocksDamaged) { + if (progress.getType().equals(goal.getType()) && progress.getDurability() == goal.getDurability()) { + final ChatColor color = progress.getAmount() < goal.getAmount() ? ChatColor.GREEN : ChatColor.GRAY; + String message = color + Lang.get(getPlayer(), "damage"); + if (message.contains("")) { + message = message.replace("", "" + color + progress.getAmount() + "/" + + goal.getAmount()); + } else { + // Legacy + message += " " + color + color + ": " + progress.getAmount() + "/" + goal.getAmount(); + } + if (depends.getPlaceholderApi() != null) { + message = PlaceholderAPI.setPlaceholders(getPlayer(), message); + } + if (formatItems) { + message = message.replace("", ItemUtil.getName(progress)); + } + objectives.add(new BukkitObjective(ObjectiveType.DAMAGE_BLOCK, message, progress, goal)); + } + } + } + for (final ItemStack goal : stage.getBlocksToPlace()) { + for (final ItemStack progress : data.blocksPlaced) { + final ChatColor color = progress.getAmount() < goal.getAmount() ? ChatColor.GREEN : ChatColor.GRAY; + String message = color + Lang.get(getPlayer(), "place"); + if (progress.getType().equals(goal.getType()) && progress.getDurability() == goal.getDurability()) { + if (message.contains("")) { + message = message.replace("", "" + color + progress.getAmount() + "/" + + goal.getAmount()); + } else { + // Legacy + message += " " + color + color + ": " + progress.getAmount() + "/" + goal.getAmount(); + } + if (depends.getPlaceholderApi() != null) { + message = PlaceholderAPI.setPlaceholders(getPlayer(), message); + } + if (formatItems) { + message = message.replace("", ItemUtil.getName(progress)); + } + objectives.add(new BukkitObjective(ObjectiveType.PLACE_BLOCK, message, progress, goal)); + } + } + } + for (final ItemStack goal : stage.getBlocksToUse()) { + for (final ItemStack progress : data.blocksUsed) { + final ChatColor color = progress.getAmount() < goal.getAmount() ? ChatColor.GREEN : ChatColor.GRAY; + String message = color + Lang.get(getPlayer(), "use"); + if (progress.getType().equals(goal.getType()) && progress.getDurability() == goal.getDurability()) { + if (message.contains("")) { + message = message.replace("", "" + color + progress.getAmount() + "/" + + goal.getAmount()); + } else { + // Legacy + message += " " + color + ": " + progress.getAmount() + "/" + goal.getAmount(); + } + if (depends.getPlaceholderApi() != null) { + message = PlaceholderAPI.setPlaceholders(getPlayer(), message); + } + if (formatItems) { + message = message.replace("", ItemUtil.getName(progress)); + } + objectives.add(new BukkitObjective(ObjectiveType.USE_BLOCK, message, progress, goal)); + } + } + } + for (final ItemStack goal : stage.getBlocksToCut()) { + for (final ItemStack progress : data.blocksCut) { + final ChatColor color = progress.getAmount() < goal.getAmount() ? ChatColor.GREEN : ChatColor.GRAY; + String message = color + Lang.get(getPlayer(), "cut"); + if (progress.getType().equals(goal.getType()) && progress.getDurability() == goal.getDurability()) { + if (message.contains("")) { + message = message.replace("", "" + color + progress.getAmount() + "/" + + goal.getAmount()); + } else { + // Legacy + message += " " + color + ": " + progress.getAmount() + "/" + goal.getAmount(); + } + if (depends.getPlaceholderApi() != null) { + message = PlaceholderAPI.setPlaceholders(getPlayer(), message); + } + if (formatItems) { + message = message.replace("", ItemUtil.getName(progress)); + } + objectives.add(new BukkitObjective(ObjectiveType.CUT_BLOCK, message, progress, goal)); + } + } + } + int craftIndex = 0; + for (final ItemStack goal : stage.getItemsToCraft()) { + if (data.itemsCrafted.size() > craftIndex) { + final ItemStack progress = data.itemsCrafted.get(craftIndex); + final int crafted = progress.getAmount(); + final int toCraft = goal.getAmount(); + final ChatColor color = crafted < toCraft ? ChatColor.GREEN : ChatColor.GRAY; + String message = color + Lang.get(getPlayer(), "craftItem"); + if (message.contains("")) { + message = message.replace("", "" + color + crafted + "/" + toCraft); + } else { + // Legacy + message += color + ": " + crafted + "/" + goal.getAmount(); + } + if (depends.getPlaceholderApi() != null) { + message = PlaceholderAPI.setPlaceholders(getPlayer(), message); + } + if (formatItems) { + message = message.replace("", ItemUtil.getName(goal)); + } + objectives.add(new BukkitObjective(ObjectiveType.CRAFT_ITEM, message, progress, goal)); + } + craftIndex++; + } + int smeltIndex = 0; + for (final ItemStack goal : stage.getItemsToSmelt()) { + if (data.itemsSmelted.size() > smeltIndex) { + final ItemStack progress = data.itemsSmelted.get(smeltIndex); + final int smelted = progress.getAmount(); + final int toSmelt = goal.getAmount(); + final ChatColor color = smelted < toSmelt ? ChatColor.GREEN : ChatColor.GRAY; + String message = color + Lang.get(getPlayer(), "smeltItem"); + if (message.contains("")) { + message = message.replace("", "" + color + smelted + "/" + toSmelt); + } else { + // Legacy + message += color + ": " + smelted + "/" + goal.getAmount(); + } + if (depends.getPlaceholderApi() != null) { + message = PlaceholderAPI.setPlaceholders(getPlayer(), message); + } + if (formatItems) { + message = message.replace("", ItemUtil.getName(goal)); + } + objectives.add(new BukkitObjective(ObjectiveType.SMELT_ITEM, message, progress, goal)); + } + smeltIndex++; + } + int enchantIndex = 0; + for (final ItemStack goal : stage.getItemsToEnchant()) { + if (data.itemsEnchanted.size() > enchantIndex) { + final ItemStack progress = data.itemsEnchanted.get(enchantIndex); + final int enchanted = progress.getAmount(); + final int toEnchant = goal.getAmount(); + final ChatColor color = enchanted < toEnchant ? ChatColor.GREEN : ChatColor.GRAY; + String message = color + Lang.get(getPlayer(), "enchItem"); + if (message.contains("")) { + message = message.replace("", "" + color + enchanted + "/" + toEnchant); + } else { + // Legacy + message += color + ": " + enchanted + "/" + goal.getAmount(); + } + if (depends.getPlaceholderApi() != null) { + message = PlaceholderAPI.setPlaceholders(getPlayer(), message); + } + if (formatItems) { + message = message.replace("", ItemUtil.getName(goal)); + } + if (goal.getEnchantments().isEmpty()) { + objectives.add(new BukkitObjective(ObjectiveType.ENCHANT_ITEM, + message.replace("", "") + .replace("", "") + .replaceAll("\\s+", " "), progress, goal)); + } else { + for (final Entry e : goal.getEnchantments().entrySet()) { + objectives.add(new BukkitObjective(ObjectiveType.ENCHANT_ITEM, + message.replace("", ItemUtil.getPrettyEnchantmentName(e.getKey())) + .replace("", RomanNumeral.getNumeral(e.getValue())), progress, goal)); + } + } + } + enchantIndex++; + } + int brewIndex = 0; + for (final ItemStack goal : stage.getItemsToBrew()) { + if (data.itemsBrewed.size() > brewIndex) { + final ItemStack progress = data.itemsBrewed.get(brewIndex); + final int brewed = progress.getAmount(); + final int toBrew = goal.getAmount(); + final ChatColor color = brewed < toBrew ? ChatColor.GREEN : ChatColor.GRAY; + String message = color + Lang.get(getPlayer(), "brewItem"); + if (message.contains("")) { + message = message.replace("", "" + color + brewed + "/" + toBrew); + } else { + // Legacy + message += color + ": " + brewed + "/" + goal.getAmount(); + } + if (depends.getPlaceholderApi() != null) { + message = PlaceholderAPI.setPlaceholders(getPlayer(), message); + } + if (formatItems) { + message = message.replace("", ItemUtil.getName(goal)); + } + objectives.add(new BukkitObjective(ObjectiveType.BREW_ITEM, message, progress, goal)); + } + brewIndex++; + } + int consumeIndex = 0; + for (final ItemStack goal : stage.getItemsToConsume()) { + if (data.itemsConsumed.size() > consumeIndex) { + final ItemStack progress = data.itemsConsumed.get(consumeIndex); + final int consumed = progress.getAmount(); + final int toConsume = goal.getAmount(); + final ChatColor color = consumed < toConsume ? ChatColor.GREEN : ChatColor.GRAY; + String message = color + Lang.get(getPlayer(), "consumeItem"); + if (message.contains("")) { + message = message.replace("", "" + color + consumed + "/" + toConsume); + } else { + // Legacy + message += color + ": " + consumed + "/" + goal.getAmount(); + } + if (depends.getPlaceholderApi() != null) { + message = PlaceholderAPI.setPlaceholders(getPlayer(), message); + } + if (formatItems) { + message = message.replace("", ItemUtil.getName(goal)); + } + objectives.add(new BukkitObjective(ObjectiveType.CONSUME_ITEM, message, progress, goal)); + } + consumeIndex++; + } + int deliverIndex = 0; + for (final ItemStack goal : stage.getItemsToDeliver()) { + if (data.itemsDelivered.size() > deliverIndex) { + final ItemStack progress = data.itemsDelivered.get(deliverIndex); + final int delivered = progress.getAmount(); + final int toDeliver = goal.getAmount(); + final Integer npc = stage.getItemDeliveryTargets().get(deliverIndex); + final ChatColor color = delivered < toDeliver ? ChatColor.GREEN : ChatColor.GRAY; + String message = color + Lang.get(getPlayer(), "deliver").replace("", depends.getNPCName(npc)); + if (message.contains("")) { + message = message.replace("", "" + color + delivered + "/" + toDeliver); + } else { + // Legacy + message += color + ": " + delivered + "/" + toDeliver; + } + if (depends.getPlaceholderApi() != null) { + message = PlaceholderAPI.setPlaceholders(getPlayer(), message); + } + if (formatItems) { + message = message.replace("", ItemUtil.getName(goal)); + } + objectives.add(new BukkitObjective(ObjectiveType.DELIVER_ITEM, message, progress, goal)); + } + deliverIndex++; + } + int interactIndex = 0; + for (final Integer n : stage.getCitizensToInteract()) { + boolean interacted = false; + if (data.citizensInteracted.size() > interactIndex) { + interacted = data.citizensInteracted.get(interactIndex); + final ChatColor color = !interacted ? ChatColor.GREEN : ChatColor.GRAY; + String message = color + Lang.get(getPlayer(), "talkTo") + .replace("", depends.getNPCName(n)); + if (depends.getPlaceholderApi() != null) { + message = PlaceholderAPI.setPlaceholders(getPlayer(), message); + } + objectives.add(new BukkitObjective(ObjectiveType.TALK_TO_NPC, message, 0, 1)); + } + interactIndex++; + } + int npcKillIndex = 0; + for (final Integer n : stage.getCitizensToKill()) { + int npcKilled = 0; + if (data.citizensNumKilled.size() > npcKillIndex) { + npcKilled = data.citizensNumKilled.get(npcKillIndex); + } + final int toNpcKill = stage.getCitizenNumToKill().get(npcKillIndex); + final ChatColor color = npcKilled < toNpcKill ? ChatColor.GREEN : ChatColor.GRAY; + String message = color + Lang.get(getPlayer(), "kill"); + if (message.contains("")) { + message = message.replace("", depends.getNPCName(n)); + } else { + message += " " + depends.getNPCName(n); + } + if (message.contains("")) { + message = message.replace("", "" + color + npcKilled + "/" + toNpcKill); + } else { + // Legacy + message += color + ": " + npcKilled + "/" + toNpcKill; + } + if (depends.getPlaceholderApi() != null) { + message = PlaceholderAPI.setPlaceholders(getPlayer(), message); + } + objectives.add(new BukkitObjective(ObjectiveType.KILL_NPC, message, npcKilled, toNpcKill)); + npcKillIndex++; + } + int mobKillIndex = 0; + for (final EntityType e : stage.getMobsToKill()) { + int mobKilled = 0; + if (data.mobNumKilled.size() > mobKillIndex) { + mobKilled = data.mobNumKilled.get(mobKillIndex); + } + final int toMobKill = stage.getMobNumToKill().get(mobKillIndex); + final ChatColor color = mobKilled < toMobKill ? ChatColor.GREEN : ChatColor.GRAY; + String message = color + ""; + if (stage.getLocationsToKillWithin().isEmpty()) { + message += Lang.get(getPlayer(), "kill"); + if (message.contains("")) { + message = message.replace("", "" + color + mobKilled + "/" + toMobKill); + } else { + // Legacy + message += ChatColor.AQUA + " " + color + ": " + mobKilled + "/" + toMobKill; + } + } else { + message += Lang.get(getPlayer(), "killAtLocation").replace("", + stage.getKillNames().get(stage.getMobsToKill().indexOf(e))); + if (message.contains("")) { + message = message.replace("", "" + color + mobKilled + "/" + toMobKill); + } else { + message += color + ": " + mobKilled + "/" + toMobKill; + } + } + if (depends.getPlaceholderApi() != null) { + message = PlaceholderAPI.setPlaceholders(getPlayer(), message); + } + message = message.replace("", MiscUtil.getProperMobName(e)); + objectives.add(new BukkitObjective(ObjectiveType.KILL_MOB, message, mobKilled, toMobKill)); + mobKillIndex++; + } + int tameIndex = 0; + for (final int toTame : stage.getMobNumToTame()) { + int tamed = 0; + if (data.mobsTamed.size() > tameIndex) { + tamed = data.mobsTamed.get(tameIndex); + } + final ChatColor color = tamed < toTame ? ChatColor.GREEN : ChatColor.GRAY; + String message = color + Lang.get(getPlayer(), "tame"); + if (!message.contains("")) { + message += " "; + } + if (message.contains("")) { + message = message.replace("", "" + color + tamed + "/" + toTame); + } else { + // Legacy + message += color + ": " + tamed + "/" + toTame; + } + message = message.replace("", MiscUtil.getProperMobName(stage.getMobsToTame().get(tameIndex))); + objectives.add(new BukkitObjective(ObjectiveType.TAME_MOB, message, tamed, toTame)); + tameIndex++; + } + if (stage.getFishToCatch() != null) { + final int caught = data.getFishCaught(); + final int toCatch = stage.getFishToCatch(); + final ChatColor color = caught < toCatch ? ChatColor.GREEN : ChatColor.GRAY; + String message = color + Lang.get(getPlayer(), "catchFish"); + if (message.contains("")) { + message = message.replace("", "" + color + caught + "/" + toCatch); + } else { + // Legacy + message += color + ": " + caught + "/" + toCatch; + } + if (depends.getPlaceholderApi() != null) { + message = PlaceholderAPI.setPlaceholders(getPlayer(), message); + } + objectives.add(new BukkitObjective(ObjectiveType.CATCH_FISH, message, caught, toCatch)); + } + if (stage.getCowsToMilk() != null) { + final int milked = data.getCowsMilked(); + final int toMilk = stage.getCowsToMilk(); + final ChatColor color = milked < toMilk ? ChatColor.GREEN : ChatColor.GRAY; + String message = color + Lang.get(getPlayer(), "milkCow"); + if (message.contains("")) { + message = message.replace("", "" + color + milked + "/" + toMilk); + } else { + // Legacy + message += color + ": " + milked + "/" + toMilk; + } + if (depends.getPlaceholderApi() != null) { + message = PlaceholderAPI.setPlaceholders(getPlayer(), message); + } + objectives.add(new BukkitObjective(ObjectiveType.MILK_COW, message, milked, toMilk)); + } + int shearIndex = 0; + for (final int toShear : stage.getSheepNumToShear()) { + int sheared = 0; + if (data.sheepSheared.size() > shearIndex) { + sheared = data.sheepSheared.get(shearIndex); + } + final ChatColor color = sheared < toShear ? ChatColor.GREEN : ChatColor.GRAY; + String message = color + Lang.get(getPlayer(), "shearSheep"); + message = message.replace("", MiscUtil.getPrettyDyeColorName(stage.getSheepToShear() + .get(shearIndex))); + if (message.contains("")) { + message = message.replace("", "" + color + sheared + "/" + toShear); + } else { + // Legacy + message += color + ": " + sheared + "/" + toShear; + } + objectives.add(new BukkitObjective(ObjectiveType.SHEAR_SHEEP, message, sheared, toShear)); + shearIndex++; + } + if (stage.getPlayersToKill() != null) { + final int killed = data.getPlayersKilled(); + final int toKill = stage.getPlayersToKill(); + final ChatColor color = data.getPlayersKilled() < stage.getPlayersToKill() ? ChatColor.GREEN + : ChatColor.GRAY; + String message = color + Lang.get(getPlayer(), "killPlayer"); + if (message.contains("")) { + message = message.replace("", "" + color + data.getPlayersKilled() + "/" + + stage.getPlayersToKill()); + } else { + // Legacy + message += color + ": " + data.getPlayersKilled() + "/" + stage.getPlayersToKill(); + } + if (depends.getPlaceholderApi() != null) { + message = PlaceholderAPI.setPlaceholders(getPlayer(), message); + } + objectives.add(new BukkitObjective(ObjectiveType.KILL_PLAYER, message, killed, toKill)); + } + for (int i = 0 ; i < stage.getLocationsToReach().size(); i++) { + if (i < data.locationsReached.size()) { + final ChatColor color = !data.locationsReached.get(i) ? ChatColor.GREEN : ChatColor.GRAY; + String message = color + Lang.get(getPlayer(), "goTo"); + message = message.replace("", stage.getLocationNames().get(i)); + objectives.add(new BukkitObjective(ObjectiveType.REACH_LOCATION, message, 0, 1)); + } + } + int passIndex = 0; + for (final String s : stage.getPasswordDisplays()) { + boolean said = false; + if (data.passwordsSaid.size() > passIndex) { + said = data.passwordsSaid.get(passIndex); + } + final ChatColor color = !said ? ChatColor.GREEN : ChatColor.GRAY; + String message = color + s; + objectives.add(new BukkitObjective(ObjectiveType.PASSWORD, message, 0, 1)); + passIndex++; + } + int customIndex = 0; + for (final ICustomObjective co : stage.getCustomObjectives()) { + int cleared = 0; + if (data.customObjectiveCounts.size() > customIndex) { + cleared = data.customObjectiveCounts.get(customIndex); + } + final int toClear = stage.getCustomObjectiveCounts().get(customIndex); + final ChatColor color = cleared < toClear ? ChatColor.GREEN : ChatColor.GRAY; + String message = color + co.getDisplay(); + for (final Entry prompt : co.getData()) { + final String replacement = "%" + prompt.getKey() + "%"; + try { + for (final Entry e : stage.getCustomObjectiveData()) { + if (e.getKey().equals(prompt.getKey())) { + if (message.contains(replacement)) { + message = message.replace(replacement, ((String) e.getValue())); + } + } + } + } catch (final NullPointerException ne) { + plugin.getLogger().severe("Unable to gather display for " + co.getName() + " on " + + quest.getName()); + ne.printStackTrace(); + } + } + if (co.canShowCount()) { + message = message.replace("%count%", cleared + "/" + toClear); + } + message = ConfigUtil.parseString(message); + objectives.add(new BukkitObjective(ObjectiveType.CUSTOM, message, cleared, toClear)); + customIndex++; + } + return objectives; + } + /** * Get current objectives for a quest, both finished and unfinished * diff --git a/core/src/main/java/me/blackvein/quests/Settings.java b/core/src/main/java/me/blackvein/quests/Settings.java index 0f861bbf2..fcd898416 100644 --- a/core/src/main/java/me/blackvein/quests/Settings.java +++ b/core/src/main/java/me/blackvein/quests/Settings.java @@ -244,6 +244,7 @@ public class Settings implements ISettings { consoleLogging = config.getInt("console-logging", 1); disableCommandFeedback = config.getBoolean("disable-command-feedback", true); genFilesOnJoin = config.getBoolean("generate-files-on-join", true); + giveJournalItem = config.getBoolean("give-journal-item", false); ignoreLockedQuests = config.getBoolean("ignore-locked-quests", false); killDelay = config.getInt("kill-delay", 600); if (Objects.requireNonNull(config.getString("language")).equalsIgnoreCase("en")) { diff --git a/core/src/main/java/me/blackvein/quests/commands/quests/subcommands/QuestsJournalCommand.java b/core/src/main/java/me/blackvein/quests/commands/quests/subcommands/QuestsJournalCommand.java index 3a92d4c93..ed8e55f11 100644 --- a/core/src/main/java/me/blackvein/quests/commands/quests/subcommands/QuestsJournalCommand.java +++ b/core/src/main/java/me/blackvein/quests/commands/quests/subcommands/QuestsJournalCommand.java @@ -80,7 +80,7 @@ public class QuestsJournalCommand extends QuestsSubCommand { } if (!plugin.getSettings().canGiveJournalItem()) { - final QuestJournal journal = new QuestJournal(quester); + final QuestJournal journal = new QuestJournal(plugin, quester); BookUtil.openPlayer(player, journal.toItemStack()); } else { final Inventory inv = player.getInventory(); @@ -90,7 +90,7 @@ public class QuestsJournalCommand extends QuestsSubCommand { Lang.send(player, ChatColor.YELLOW + Lang.get(player, "journalPutAway") .replace("", Lang.get(player, "journalTitle"))); } else if (player.getItemInHand().getType().equals(Material.AIR)) { - final QuestJournal journal = new QuestJournal(quester); + final QuestJournal journal = new QuestJournal(plugin, quester); player.setItemInHand(journal.toItemStack()); Lang.send(player, ChatColor.YELLOW + Lang.get(player, "journalTaken") .replace("", Lang.get(player, "journalTitle"))); @@ -98,7 +98,7 @@ public class QuestsJournalCommand extends QuestsSubCommand { final ItemStack[] arr = inv.getContents(); for (int i = 0; i < arr.length; i++) { if (arr[i] == null) { - final QuestJournal journal = new QuestJournal(quester); + final QuestJournal journal = new QuestJournal(plugin, quester); inv.setItem(i, journal.toItemStack()); Lang.send(player, ChatColor.YELLOW + Lang.get(player, "journalTaken") .replace("", Lang.get(player, "journalTitle"))); diff --git a/core/src/main/java/me/blackvein/quests/item/QuestJournal.java b/core/src/main/java/me/blackvein/quests/item/QuestJournal.java index 07a692664..6401711dd 100644 --- a/core/src/main/java/me/blackvein/quests/item/QuestJournal.java +++ b/core/src/main/java/me/blackvein/quests/item/QuestJournal.java @@ -12,81 +12,86 @@ package me.blackvein.quests.item; -import me.blackvein.quests.quests.IQuest; +import me.blackvein.quests.Quests; import me.blackvein.quests.player.IQuester; +import me.blackvein.quests.quests.IQuest; +import me.blackvein.quests.quests.Objective; +import me.blackvein.quests.util.ItemUtil; import me.blackvein.quests.util.Lang; +import net.md_5.bungee.api.chat.BaseComponent; +import net.md_5.bungee.api.chat.TextComponent; +import net.md_5.bungee.api.chat.TranslatableComponent; import org.bukkit.ChatColor; -import org.bukkit.Material; import org.bukkit.entity.Player; import org.bukkit.inventory.ItemStack; -import org.bukkit.inventory.meta.BookMeta; +import org.bukkit.inventory.meta.ItemMeta; +import xyz.upperlevel.spigot.book.BookUtil; +import java.util.Collections; import java.util.Comparator; +import java.util.LinkedList; import java.util.List; import java.util.stream.Collectors; public class QuestJournal { - + + final Quests plugin; final IQuester owner; - ItemStack journal = new ItemStack(Material.WRITTEN_BOOK); + final ItemStack journal; - public QuestJournal(final IQuester owner) { + public QuestJournal(Quests plugin, final IQuester owner) { + this.plugin = plugin; this.owner = owner; - final BookMeta book = (BookMeta) journal.getItemMeta(); - if (book != null) { + final Player player = owner.getPlayer(); + final String title = ChatColor.LIGHT_PURPLE + Lang.get(player, "journalTitle"); + journal = BookUtil.writtenBook() + .author(player.getName()) + .title(title) + .pages(getPages()) + .build(); + if (journal.getItemMeta() != null) { + ItemMeta meta = journal.getItemMeta(); + meta.setDisplayName(title); + journal.setItemMeta(meta); + } + } + + public List getPages() { + if (owner.getCurrentQuestsTemp().isEmpty()) { final Player player = owner.getPlayer(); final String title = Lang.get(player, "journalTitle"); - book.setDisplayName(ChatColor.LIGHT_PURPLE + title); - book.setTitle(ChatColor.LIGHT_PURPLE + title); - book.setAuthor(player.getName()); - if (owner.getCurrentQuestsTemp().isEmpty()) { - book.addPage(ChatColor.DARK_RED + Lang.get(player, "journalNoQuests").replace("", title)); - } else { - int currentLength = 0; - int currentLines = 0; - StringBuilder page = new StringBuilder(); - final List sortedList = owner.getCurrentQuestsTemp().keySet().stream() - .sorted(Comparator.comparing(IQuest::getName)) - .collect(Collectors.toList()); - for (final IQuest quest : sortedList) { - if ((currentLength + quest.getName().length() > 240) || (currentLines - + ((quest.getName().length() % 19) == 0 ? (quest.getName().length() / 19) - : ((quest.getName().length() / 19) + 1))) > 13) { - book.addPage(page.toString()); - page.append(ChatColor.DARK_PURPLE).append(ChatColor.BOLD).append(quest.getName()).append("\n"); - currentLength = quest.getName().length(); - currentLines = (quest.getName().length() % 19) == 0 ? (quest.getName().length() / 19) - : (quest.getName().length() + 1); - } else { - page.append(ChatColor.DARK_PURPLE).append(ChatColor.BOLD).append(quest.getName()).append("\n"); - currentLength += quest.getName().length(); - currentLines += (quest.getName().length() / 19); - } - if (owner.getCurrentObjectives(quest, false) != null) { - for (final String obj : owner.getCurrentObjectives(quest, false)) { - // Length/Line check - if ((currentLength + obj.length() > 240) || (currentLines + ((obj.length() % 19) - == 0 ? (obj.length() / 19) : ((obj.length() / 19) + 1))) > 13) { - book.addPage(page.toString()); - page = new StringBuilder(obj + "\n"); - currentLength = obj.length(); - currentLines = (obj.length() % 19) == 0 ? (obj.length() / 19) : (obj.length() + 1); - } else { - page.append(obj).append("\n"); - currentLength += obj.length(); - currentLines += (obj.length() / 19); - } + return Collections.singletonList(new BookUtil.PageBuilder().add(new TextComponent(ChatColor.DARK_RED + + Lang.get(player, "journalNoQuests").replace("", title))).build()); + } else { + final List pages = new LinkedList<>(); + final List sortedList = owner.getCurrentQuestsTemp().keySet().stream() + .sorted(Comparator.comparing(IQuest::getName)) + .collect(Collectors.toList()); + for (final IQuest quest : sortedList) { + final TextComponent title = new TextComponent(quest.getName()); + title.setColor(net.md_5.bungee.api.ChatColor.DARK_PURPLE); + title.setBold(true); + final BookUtil.PageBuilder builder = new BookUtil.PageBuilder().add(title).newLine(); + for (final Objective obj : owner.getCurrentObjectivesTemp(quest, false, false)) { + if (obj.getMessage() != null && obj.getMessage().contains("")) { + final String[] split = obj.getMessage().split(""); + builder.add(split[0]); + if (plugin.getSettings().canTranslateNames() && obj.getItemGoal() != null) { + final TranslatableComponent tc = new TranslatableComponent(plugin.getLocaleManager() + .queryItemStack(obj.getItemGoal())); + tc.setColor(net.md_5.bungee.api.ChatColor.DARK_AQUA); + builder.add(tc); + } else { + builder.add(ItemUtil.getName(obj.getItemGoal())); } + builder.add(split[1]).newLine(); + } else { + builder.add(obj.getMessage()).newLine(); } - if (currentLines < 13) - page.append("\n"); - book.addPage(page.toString()); - page = new StringBuilder(); - currentLines = 0; - currentLength = 0; } + pages.add(builder.build()); } - journal.setItemMeta(book); + return pages; } } diff --git a/core/src/main/java/me/blackvein/quests/quests/BukkitObjective.java b/core/src/main/java/me/blackvein/quests/quests/BukkitObjective.java index 6e2b55f2c..43b7d749a 100644 --- a/core/src/main/java/me/blackvein/quests/quests/BukkitObjective.java +++ b/core/src/main/java/me/blackvein/quests/quests/BukkitObjective.java @@ -18,22 +18,48 @@ import me.blackvein.quests.enums.ObjectiveType; public class BukkitObjective implements Objective { private final ObjectiveType type; + private final String message; private final int progress; private final int goal; private final ItemStack progressStack; private final ItemStack goalStack; - - + + /** + * @deprecated Use {@link #BukkitObjective(ObjectiveType, String, int, int)} with null message + */ public BukkitObjective(final ObjectiveType type, final int progress, final int goal) { this.type = type; + this.message = null; + this.progress = progress; + this.goal = goal; + this.progressStack = null; + this.goalStack = null; + } + + /** + * @deprecated Use {@link #BukkitObjective(ObjectiveType, String, ItemStack, ItemStack)} with null message + */ + public BukkitObjective(final ObjectiveType type, final ItemStack progress, final ItemStack goal) { + this.type = type; + this.message = null; + this.progress = progress.getAmount(); + this.goal = goal.getAmount(); + this.progressStack = progress; + this.goalStack = goal; + } + + public BukkitObjective(final ObjectiveType type, final String message, final int progress, final int goal) { + this.type = type; + this.message = message; this.progress = progress; this.goal = goal; this.progressStack = null; this.goalStack = null; } - public BukkitObjective(final ObjectiveType type, final ItemStack progress, final ItemStack goal) { + public BukkitObjective(final ObjectiveType type, final String message, final ItemStack progress, final ItemStack goal) { this.type = type; + this.message = message; this.progress = progress.getAmount(); this.goal = goal.getAmount(); this.progressStack = progress; @@ -43,6 +69,10 @@ public class BukkitObjective implements Objective { public ObjectiveType getType() { return type; } + + public String getMessage() { + return message; + } public int getProgress() { return progress; diff --git a/core/src/main/resources/config.yml b/core/src/main/resources/config.yml index d11b99ed8..0ba72e346 100644 --- a/core/src/main/resources/config.yml +++ b/core/src/main/resources/config.yml @@ -10,6 +10,7 @@ confirm-accept: true console-logging: 2 disable-command-feedback: false generate-files-on-join: true +give-journal-item: false ignore-locked-quests: false kill-delay: 600 language: en-US