From 5b02a094e8992ce88808dcd86ed1c154b46e4648 Mon Sep 17 00:00:00 2001 From: EpicKnarvik97 Date: Sat, 5 Nov 2022 17:55:56 +0100 Subject: [PATCH 01/16] Adds some code required for custom formatting and translation --- .../dynmapcitizens/DynmapCitizens.java | 4 + .../formatting/StringFormatter.java | 114 +++++++++++++++++ .../formatting/TranslatableMessage.java | 7 + .../dynmapcitizens/formatting/Translator.java | 120 ++++++++++++++++++ .../handler/trait/SentinelHandler.java | 12 +- .../dynmapcitizens/util/FileHelper.java | 32 +++++ .../dynmapcitizens/util/TimeFormatter.java | 2 +- src/main/resources/strings.yml | 55 ++++++++ 8 files changed, 340 insertions(+), 6 deletions(-) create mode 100644 src/main/java/net/knarcraft/dynmapcitizens/formatting/StringFormatter.java create mode 100644 src/main/java/net/knarcraft/dynmapcitizens/formatting/TranslatableMessage.java create mode 100644 src/main/java/net/knarcraft/dynmapcitizens/formatting/Translator.java create mode 100644 src/main/java/net/knarcraft/dynmapcitizens/util/FileHelper.java create mode 100644 src/main/resources/strings.yml diff --git a/src/main/java/net/knarcraft/dynmapcitizens/DynmapCitizens.java b/src/main/java/net/knarcraft/dynmapcitizens/DynmapCitizens.java index 44a9cb6..6cfee42 100644 --- a/src/main/java/net/knarcraft/dynmapcitizens/DynmapCitizens.java +++ b/src/main/java/net/knarcraft/dynmapcitizens/DynmapCitizens.java @@ -1,5 +1,6 @@ package net.knarcraft.dynmapcitizens; +import net.knarcraft.dynmapcitizens.formatting.Translator; import net.knarcraft.dynmapcitizens.handler.VaultHandler; import net.knarcraft.dynmapcitizens.handler.trait.BlacksmithHandler; import net.knarcraft.dynmapcitizens.handler.trait.CitizensTraitHandler; @@ -49,6 +50,9 @@ public final class DynmapCitizens extends JavaPlugin { configuration = this.getConfig(); this.globalSettings.load(configuration); + //Load all messages + Translator.loadLanguages("en"); + //Initialize all enabled traits initializeTraitHandlers(configuration); diff --git a/src/main/java/net/knarcraft/dynmapcitizens/formatting/StringFormatter.java b/src/main/java/net/knarcraft/dynmapcitizens/formatting/StringFormatter.java new file mode 100644 index 0000000..ce14013 --- /dev/null +++ b/src/main/java/net/knarcraft/dynmapcitizens/formatting/StringFormatter.java @@ -0,0 +1,114 @@ +package net.knarcraft.dynmapcitizens.formatting; + +import net.knarcraft.dynmapcitizens.DynmapCitizens; +import net.md_5.bungee.api.ChatColor; +import org.bukkit.command.CommandSender; + +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +/** + * A formatter for formatting displayed messages + */ +public final class StringFormatter { + + private final static String pluginName = DynmapCitizens.getInstance().getDescription().getName(); + + private StringFormatter() { + + } + + /** + * Displays a message signifying a successful action + * + * @param sender

The command sender to display the message to

+ * @param message

The translatable message to display

+ */ + public static void displaySuccessMessage(CommandSender sender, TranslatableMessage message) { + sender.sendMessage(ChatColor.GREEN + getFormattedMessage(Translator.getTranslatedMessage(message))); + } + + /** + * Displays a message signifying a successful action + * + * @param sender

The command sender to display the message to

+ * @param message

The raw message to display

+ */ + public static void displaySuccessMessage(CommandSender sender, String message) { + sender.sendMessage(ChatColor.GREEN + getFormattedMessage(message)); + } + + /** + * Displays a message signifying an unsuccessful action + * + * @param sender

The command sender to display the message to

+ * @param message

The translatable message to display

+ */ + public static void displayErrorMessage(CommandSender sender, TranslatableMessage message) { + sender.sendMessage(ChatColor.DARK_RED + getFormattedMessage(Translator.getTranslatedMessage(message))); + } + + /** + * Gets the formatted version of any chat message + * + * @param message

The message to format

+ * @return

The formatted message

+ */ + private static String getFormattedMessage(String message) { + return "[" + pluginName + "] " + ChatColor.RESET + translateColors(message); + } + + /** + * Translates & color codes to proper colors + * + * @param input

The input string to translate colors for

+ * @return

The input with color codes translated

+ */ + private static String translateColors(String input) { + return ChatColor.translateAlternateColorCodes('&', input); + } + + /** + * Replaces a placeholder in a string + * + * @param input

The input string to replace in

+ * @param placeholder

The placeholder to replace

+ * @param replacement

The replacement value

+ * @return

The input string with the placeholder replaced

+ */ + public static String replacePlaceholder(String input, String placeholder, String replacement) { + return input.replace(placeholder, replacement); + } + + /** + * Replaces placeholders in a string + * + * @param input

The input string to replace in

+ * @param placeholders

The placeholders to replace

+ * @param replacements

The replacement values

+ * @return

The input string with placeholders replaced

+ */ + public static String replacePlaceholders(String input, String[] placeholders, String[] replacements) { + for (int i = 0; i < Math.min(placeholders.length, replacements.length); i++) { + input = replacePlaceholder(input, placeholders[i], replacements[i]); + } + return input; + } + + /** + * Translates all found color codes to formatting in a string + * + * @param message

The string to search for color codes

+ * @return

The message with color codes translated

+ */ + public static String translateAllColorCodes(String message) { + message = ChatColor.translateAlternateColorCodes('&', message); + Pattern pattern = Pattern.compile("(#[a-fA-F0-9]{6})"); + Matcher matcher = pattern.matcher(message); + while (matcher.find()) { + message = message.replace(matcher.group(), "" + ChatColor.of(matcher.group())); + } + return message; + } + +} diff --git a/src/main/java/net/knarcraft/dynmapcitizens/formatting/TranslatableMessage.java b/src/main/java/net/knarcraft/dynmapcitizens/formatting/TranslatableMessage.java new file mode 100644 index 0000000..46ebefe --- /dev/null +++ b/src/main/java/net/knarcraft/dynmapcitizens/formatting/TranslatableMessage.java @@ -0,0 +1,7 @@ +package net.knarcraft.dynmapcitizens.formatting; + +public enum TranslatableMessage { + + SENTINEL_DETAILS + +} diff --git a/src/main/java/net/knarcraft/dynmapcitizens/formatting/Translator.java b/src/main/java/net/knarcraft/dynmapcitizens/formatting/Translator.java new file mode 100644 index 0000000..85c3716 --- /dev/null +++ b/src/main/java/net/knarcraft/dynmapcitizens/formatting/Translator.java @@ -0,0 +1,120 @@ +package net.knarcraft.dynmapcitizens.formatting; + +import net.knarcraft.dynmapcitizens.DynmapCitizens; +import net.knarcraft.dynmapcitizens.util.FileHelper; +import org.bukkit.configuration.file.YamlConfiguration; + +import java.io.BufferedReader; +import java.io.File; +import java.io.FileInputStream; +import java.io.FileNotFoundException; +import java.io.InputStreamReader; +import java.util.HashMap; +import java.util.Map; +import java.util.logging.Level; + +/** + * A tool to get strings translated to the correct language + */ +public final class Translator { + + private static Map translatedMessages; + private static Map backupTranslatedMessages; + + private Translator() { + + } + + /** + * Loads the languages used by this translator + */ + public static void loadLanguages(String selectedLanguage) { + backupTranslatedMessages = loadTranslatedMessages("en"); + translatedMessages = loadCustomTranslatedMessages(selectedLanguage); + if (translatedMessages == null) { + translatedMessages = loadTranslatedMessages(selectedLanguage); + } + } + + /** + * Gets a translated version of the given translatable message + * + * @param translatableMessage

The message to translate

+ * @return

The translated message

+ */ + public static String getTranslatedMessage(TranslatableMessage translatableMessage) { + if (translatedMessages == null) { + return "Translated strings not loaded"; + } + String translatedMessage; + if (translatedMessages.containsKey(translatableMessage)) { + translatedMessage = translatedMessages.get(translatableMessage); + } else if (backupTranslatedMessages.containsKey(translatableMessage)) { + translatedMessage = backupTranslatedMessages.get(translatableMessage); + } else { + translatedMessage = translatableMessage.toString(); + } + return StringFormatter.translateAllColorCodes(translatedMessage); + } + + /** + * Loads all translated messages for the given language + * + * @param language

The language chosen by the user

+ * @return

A mapping of all strings for the given language

+ */ + public static Map loadTranslatedMessages(String language) { + try { + BufferedReader reader = FileHelper.getBufferedReaderForInternalFile("/strings.yml"); + return loadTranslatableMessages(language, reader); + } catch (FileNotFoundException e) { + DynmapCitizens.getInstance().getLogger().log(Level.SEVERE, "Unable to load translated messages"); + return null; + } + } + + /** + * Tries to load translated messages from a custom strings.yml file + * + * @param language

The selected language

+ * @return

The loaded translated strings, or null if no custom language file exists

+ */ + public static Map loadCustomTranslatedMessages(String language) { + DynmapCitizens instance = DynmapCitizens.getInstance(); + + File strings = new File(instance.getDataFolder(), "strings.yml"); + if (!strings.exists()) { + instance.getLogger().log(Level.FINEST, "Strings file not found"); + return null; + } + + try { + instance.getLogger().log(Level.INFO, "Loading custom strings..."); + return loadTranslatableMessages(language, new BufferedReader(new InputStreamReader(new FileInputStream(strings)))); + } catch (FileNotFoundException e) { + instance.getLogger().log(Level.WARNING, "Unable to load custom messages"); + return null; + } + } + + /** + * Loads translatable messages from the given reader + * + * @param language

The selected language

+ * @param reader

The buffered reader to read from

+ * @return

The loaded translated strings

+ */ + private static Map loadTranslatableMessages(String language, BufferedReader reader) { + Map translatedMessages = new HashMap<>(); + YamlConfiguration configuration = YamlConfiguration.loadConfiguration(reader); + + for (TranslatableMessage message : TranslatableMessage.values()) { + String translated = configuration.getString(language + "." + message.toString()); + if (translated != null) { + translatedMessages.put(message, translated); + } + } + return translatedMessages; + } + +} \ No newline at end of file diff --git a/src/main/java/net/knarcraft/dynmapcitizens/handler/trait/SentinelHandler.java b/src/main/java/net/knarcraft/dynmapcitizens/handler/trait/SentinelHandler.java index 28a7993..dc0938e 100644 --- a/src/main/java/net/knarcraft/dynmapcitizens/handler/trait/SentinelHandler.java +++ b/src/main/java/net/knarcraft/dynmapcitizens/handler/trait/SentinelHandler.java @@ -47,12 +47,14 @@ public class SentinelHandler extends AbstractTraitHandler { description += "
Squad: " + trait.squad; } if (settings.displaySentinelStats()) { - description += "
Invincible: " + trait.invincible + "
Armor: " + - trait.armor + "
Health: " + trait.health + "
Accuracy: " + trait.accuracy + - "
Damage: " + trait.damage + "
Allow knockback: " + trait.allowKnockback; + description += "
Invincible: " + trait.invincible + "
Armor: " + trait.armor; + description += "
Health: " + trait.health + "
Accuracy: " + trait.accuracy; + description += "
Damage: " + trait.damage + "
Speed: " + trait.speed; + description += "
Allow knockback: " + trait.allowKnockback; description += "
Range: " + trait.range + "
Reach: " + trait.reach; - description += "
Targets: " + trait.allTargets.toAllInOneString() + "
Avoids: " + - trait.allAvoids.toAllInOneString() + "
Ignores: " + trait.allIgnores.toAllInOneString(); + description += "
Targets: " + trait.allTargets.toAllInOneString(); + description += "
Avoids: " + trait.allAvoids.toAllInOneString(); + description += "
Ignores: " + trait.allIgnores.toAllInOneString(); } addNPCMarker(npc.getUniqueId(), "Sentinel NPC: ", description, DynmapCitizens.getInstance().getGlobalSettings().getMarkerIcons().get(Icon.SENTINEL), super.markerSet); diff --git a/src/main/java/net/knarcraft/dynmapcitizens/util/FileHelper.java b/src/main/java/net/knarcraft/dynmapcitizens/util/FileHelper.java new file mode 100644 index 0000000..a5d13cc --- /dev/null +++ b/src/main/java/net/knarcraft/dynmapcitizens/util/FileHelper.java @@ -0,0 +1,32 @@ +package net.knarcraft.dynmapcitizens.util; + +import java.io.BufferedReader; +import java.io.FileNotFoundException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.nio.charset.StandardCharsets; + +/** + * A helper class for dealing with files + */ +public final class FileHelper { + + private FileHelper() { + + } + + /** + * Gets a buffered reader for + * + * @return

A buffered read for reading the file

+ * @throws FileNotFoundException

If unable to get an input stream for the given file

+ */ + public static BufferedReader getBufferedReaderForInternalFile(String file) throws FileNotFoundException { + InputStream inputStream = FileHelper.class.getResourceAsStream(file); + if (inputStream == null) { + throw new FileNotFoundException("Unable to read the given file"); + } + return new BufferedReader(new InputStreamReader(inputStream, StandardCharsets.UTF_8)); + } + +} diff --git a/src/main/java/net/knarcraft/dynmapcitizens/util/TimeFormatter.java b/src/main/java/net/knarcraft/dynmapcitizens/util/TimeFormatter.java index 5ebc8ba..30c0753 100644 --- a/src/main/java/net/knarcraft/dynmapcitizens/util/TimeFormatter.java +++ b/src/main/java/net/knarcraft/dynmapcitizens/util/TimeFormatter.java @@ -9,7 +9,7 @@ import java.util.HashMap; import java.util.List; import java.util.Map; -import static net.knarcraft.blacksmith.formatting.StringFormatter.replacePlaceholder; +import static net.knarcraft.dynmapcitizens.formatting.StringFormatter.replacePlaceholder; /** * A helper class for time formatting diff --git a/src/main/resources/strings.yml b/src/main/resources/strings.yml new file mode 100644 index 0000000..05aec0f --- /dev/null +++ b/src/main/resources/strings.yml @@ -0,0 +1,55 @@ +en: + SENTINEL_DESCRIPTION: | +

name

+
Squad: {squad} + {sentinelDetails} + SENTINEL_DETAILS: | +
    +
  • Invincible: {invincible}
  • +
  • Armor: {armor}
  • +
  • Health: {health}
  • +
  • Accuracy: {accuracy}
  • +
  • Damage: {damage}
  • +
  • Speed: {speed}
  • +
  • Allow knockback: {allowKnockback}
  • +
  • Range: {range}
  • +
  • Reach: {reach}
  • +
  • Targets: {targets}
  • +
  • Avoids: {avoids}
  • +
  • Ignores: {ignores}
  • +
+ QUESTS_PLANNER_DESCRIPTION: | + Planner:
    + {questCoolDown} + {questFrom} + {questUntil} + {questRepeat} +
+ QUESTS_PLANNER_COOL_DOWN: "
  • Quest repeatable after: {coolDown}
  • " + QUESTS_PLANNER_UNREPEATABLE: "
  • Quest cannot be repeated!
  • " + QUESTS_PLANNER_FROM: "
  • Quest available from {startDate}
  • " + QUESTS_PLANNER_UNTIL: "
  • Quest available until {endDate}
  • " + QUEST_PLANNER_REPEAT: "
  • Quest will become available again after {repeatDelay}
  • " + QUESTS_REQUIREMENTS_FORMAT: | + Requirements:
      + {requirementQuestPoints} + {requirementExp} + {requirementBlockedByQuests} + {requirementRequiredQuests} + {requirementRequiredItems} + {requirementMCMMOSkills} + {requirementPermissions} + {requirementCustom} +
    + QUESTS_REQUIREMENTS_QUEST_POINTS: "
  • {questPoints} quest points
  • " + QUESTS_REQUIREMENTS_EXP: "
  • {exp} exp
  • " + QUESTS_REQUIREMENTS_BLOCKED_BY_QUEST_FORMAT: "
  • Blocked by quests:
      {blockingQuests}
  • " + QUESTS_REQUIREMENTS_BLOCKED_BY_QUEST_ITEM: "
  • {questName}
  • " + QUESTS_REQUIREMENTS_REQUIRED_QUEST_FORMAT: "
  • Required quests:
      {requiredQuests}
  • " + QUESTS_REQUIREMENTS_REQUIRED_QUEST_ITEM: "
  • {questName}
  • " + QUESTS_REQUIREMENTS_REQUIRED_ITEM_FORMAT: "
  • Required items:
      {requiredItems}
  • " + QUESTS_REQUIREMENTS_REQUIRED_ITEM_ITEM: "
  • {itemName}
  • " + QUESTS_REQUIREMENTS_MCMMO_SKILL: "
  • Requires mcMMO skill {skill} at level {level}
  • " + QUESTS_REQUIREMENTS_REQUIRED_PERMISSION_FORMAT: "
  • Required permissions:
      {permissions}
  • " + QUESTS_REQUIREMENTS_REQUIRED_PERMISSION_ITEM: "
  • {permission}
  • " + \ No newline at end of file From c03e06b1327ba028d9af8571d86d7bc7f758b57b Mon Sep 17 00:00:00 2001 From: EpicKnarvik97 Date: Mon, 7 Nov 2022 02:17:07 +0100 Subject: [PATCH 02/16] Uses KnarLib to get rid of duplicate code --- pom.xml | 26 +++- .../dynmapcitizens/DynmapCitizens.java | 9 +- .../DynmapCitizensTranslatableMessage.java | 35 +++++ .../formatting/StringFormatter.java | 114 ----------------- .../formatting/TranslatableMessage.java | 7 - .../dynmapcitizens/formatting/Translator.java | 120 ------------------ .../quests/QuestPlannerInfoGenerator.java | 22 +++- .../dynmapcitizens/util/FileHelper.java | 32 ----- .../dynmapcitizens/util/TimeFormatter.java | 98 -------------- src/main/resources/strings.yml | 21 ++- 10 files changed, 104 insertions(+), 380 deletions(-) create mode 100644 src/main/java/net/knarcraft/dynmapcitizens/formatting/DynmapCitizensTranslatableMessage.java delete mode 100644 src/main/java/net/knarcraft/dynmapcitizens/formatting/StringFormatter.java delete mode 100644 src/main/java/net/knarcraft/dynmapcitizens/formatting/TranslatableMessage.java delete mode 100644 src/main/java/net/knarcraft/dynmapcitizens/formatting/Translator.java delete mode 100644 src/main/java/net/knarcraft/dynmapcitizens/util/FileHelper.java delete mode 100644 src/main/java/net/knarcraft/dynmapcitizens/util/TimeFormatter.java diff --git a/pom.xml b/pom.xml index ca25666..408bc6d 100644 --- a/pom.xml +++ b/pom.xml @@ -13,7 +13,7 @@ A plugin for displaying citizens on the dynmap map - 17 + 16 UTF-8 @@ -24,8 +24,8 @@ maven-compiler-plugin 3.8.1 - 17 - 17 + ${java.version} + ${java.version} @@ -40,6 +40,20 @@ false + + + net.knarcraft:knarlib + + net/knarcraft/knarlib/** + + + + + *.MF + *.yml + + + @@ -136,6 +150,12 @@ 1.7.3 provided + + net.knarcraft + knarlib + 1.0-SNAPSHOT + compile + org.mcmonkey sentinel diff --git a/src/main/java/net/knarcraft/dynmapcitizens/DynmapCitizens.java b/src/main/java/net/knarcraft/dynmapcitizens/DynmapCitizens.java index 6cfee42..cac77f9 100644 --- a/src/main/java/net/knarcraft/dynmapcitizens/DynmapCitizens.java +++ b/src/main/java/net/knarcraft/dynmapcitizens/DynmapCitizens.java @@ -1,6 +1,6 @@ package net.knarcraft.dynmapcitizens; -import net.knarcraft.dynmapcitizens.formatting.Translator; +import net.knarcraft.dynmapcitizens.formatting.DynmapCitizensTranslatableMessage; import net.knarcraft.dynmapcitizens.handler.VaultHandler; import net.knarcraft.dynmapcitizens.handler.trait.BlacksmithHandler; import net.knarcraft.dynmapcitizens.handler.trait.CitizensTraitHandler; @@ -8,6 +8,9 @@ import net.knarcraft.dynmapcitizens.handler.trait.MinstrelHandler; import net.knarcraft.dynmapcitizens.handler.trait.SentinelHandler; import net.knarcraft.dynmapcitizens.handler.trait.quests.QuestsHandler; import net.knarcraft.dynmapcitizens.settings.GlobalSettings; +import net.knarcraft.knarlib.KnarLib; +import net.knarcraft.knarlib.formatting.TranslatableTimeUnit; +import net.knarcraft.knarlib.formatting.Translator; import org.bukkit.Bukkit; import org.bukkit.configuration.file.FileConfiguration; import org.bukkit.plugin.Plugin; @@ -31,6 +34,8 @@ public final class DynmapCitizens extends JavaPlugin { @Override public void onEnable() { DynmapCitizens.instance = this; + KnarLib.setPlugin(this); + //Initialize quest and dynmap APIs PluginManager pluginManager = Bukkit.getPluginManager(); Plugin dynmapPlugin = pluginManager.getPlugin("dynmap"); @@ -51,6 +56,8 @@ public final class DynmapCitizens extends JavaPlugin { this.globalSettings.load(configuration); //Load all messages + Translator.registerMessageCategory(TranslatableTimeUnit.UNIT_SECOND); + Translator.registerMessageCategory(DynmapCitizensTranslatableMessage.SENTINEL_DESCRIPTION); Translator.loadLanguages("en"); //Initialize all enabled traits diff --git a/src/main/java/net/knarcraft/dynmapcitizens/formatting/DynmapCitizensTranslatableMessage.java b/src/main/java/net/knarcraft/dynmapcitizens/formatting/DynmapCitizensTranslatableMessage.java new file mode 100644 index 0000000..4c50c6a --- /dev/null +++ b/src/main/java/net/knarcraft/dynmapcitizens/formatting/DynmapCitizensTranslatableMessage.java @@ -0,0 +1,35 @@ +package net.knarcraft.dynmapcitizens.formatting; + +import net.knarcraft.knarlib.formatting.TranslatableMessage; + +/** + * An enum describing all of DynmapCitizens' translatable messages + */ +public enum DynmapCitizensTranslatableMessage implements TranslatableMessage { + + SENTINEL_DESCRIPTION, + SENTINEL_DETAILS, + QUESTS_PLANNER_DESCRIPTION, + QUESTS_PLANNER_COOL_DOWN, + QUESTS_PLANNER_UNREPEATABLE, + QUESTS_PLANNER_FROM, + QUESTS_PLANNER_UNTIL, + QUEST_PLANNER_REPEAT, + QUESTS_REQUIREMENTS_FORMAT, + QUESTS_REQUIREMENTS_QUEST_POINTS, + QUESTS_REQUIREMENTS_EXP, + QUESTS_REQUIREMENTS_BLOCKED_BY_QUEST_FORMAT, + QUESTS_REQUIREMENTS_BLOCKED_BY_QUEST_ITEM, + QUESTS_REQUIREMENTS_REQUIRED_QUEST_FORMAT, + QUESTS_REQUIREMENTS_REQUIRED_QUEST_ITEM, + QUESTS_REQUIREMENTS_REQUIRED_ITEM_FORMAT, + QUESTS_REQUIREMENTS_REQUIRED_ITEM_ITEM, + QUESTS_REQUIREMENTS_MC_MMO_SKILL, + QUESTS_REQUIREMENTS_REQUIRED_PERMISSION_FORMAT, + QUESTS_REQUIREMENTS_REQUIRED_PERMISSION_ITEM; + + @Override + public TranslatableMessage[] getAllMessages() { + return DynmapCitizensTranslatableMessage.values(); + } +} diff --git a/src/main/java/net/knarcraft/dynmapcitizens/formatting/StringFormatter.java b/src/main/java/net/knarcraft/dynmapcitizens/formatting/StringFormatter.java deleted file mode 100644 index ce14013..0000000 --- a/src/main/java/net/knarcraft/dynmapcitizens/formatting/StringFormatter.java +++ /dev/null @@ -1,114 +0,0 @@ -package net.knarcraft.dynmapcitizens.formatting; - -import net.knarcraft.dynmapcitizens.DynmapCitizens; -import net.md_5.bungee.api.ChatColor; -import org.bukkit.command.CommandSender; - -import java.util.regex.Matcher; -import java.util.regex.Pattern; - -/** - * A formatter for formatting displayed messages - */ -public final class StringFormatter { - - private final static String pluginName = DynmapCitizens.getInstance().getDescription().getName(); - - private StringFormatter() { - - } - - /** - * Displays a message signifying a successful action - * - * @param sender

    The command sender to display the message to

    - * @param message

    The translatable message to display

    - */ - public static void displaySuccessMessage(CommandSender sender, TranslatableMessage message) { - sender.sendMessage(ChatColor.GREEN + getFormattedMessage(Translator.getTranslatedMessage(message))); - } - - /** - * Displays a message signifying a successful action - * - * @param sender

    The command sender to display the message to

    - * @param message

    The raw message to display

    - */ - public static void displaySuccessMessage(CommandSender sender, String message) { - sender.sendMessage(ChatColor.GREEN + getFormattedMessage(message)); - } - - /** - * Displays a message signifying an unsuccessful action - * - * @param sender

    The command sender to display the message to

    - * @param message

    The translatable message to display

    - */ - public static void displayErrorMessage(CommandSender sender, TranslatableMessage message) { - sender.sendMessage(ChatColor.DARK_RED + getFormattedMessage(Translator.getTranslatedMessage(message))); - } - - /** - * Gets the formatted version of any chat message - * - * @param message

    The message to format

    - * @return

    The formatted message

    - */ - private static String getFormattedMessage(String message) { - return "[" + pluginName + "] " + ChatColor.RESET + translateColors(message); - } - - /** - * Translates & color codes to proper colors - * - * @param input

    The input string to translate colors for

    - * @return

    The input with color codes translated

    - */ - private static String translateColors(String input) { - return ChatColor.translateAlternateColorCodes('&', input); - } - - /** - * Replaces a placeholder in a string - * - * @param input

    The input string to replace in

    - * @param placeholder

    The placeholder to replace

    - * @param replacement

    The replacement value

    - * @return

    The input string with the placeholder replaced

    - */ - public static String replacePlaceholder(String input, String placeholder, String replacement) { - return input.replace(placeholder, replacement); - } - - /** - * Replaces placeholders in a string - * - * @param input

    The input string to replace in

    - * @param placeholders

    The placeholders to replace

    - * @param replacements

    The replacement values

    - * @return

    The input string with placeholders replaced

    - */ - public static String replacePlaceholders(String input, String[] placeholders, String[] replacements) { - for (int i = 0; i < Math.min(placeholders.length, replacements.length); i++) { - input = replacePlaceholder(input, placeholders[i], replacements[i]); - } - return input; - } - - /** - * Translates all found color codes to formatting in a string - * - * @param message

    The string to search for color codes

    - * @return

    The message with color codes translated

    - */ - public static String translateAllColorCodes(String message) { - message = ChatColor.translateAlternateColorCodes('&', message); - Pattern pattern = Pattern.compile("(#[a-fA-F0-9]{6})"); - Matcher matcher = pattern.matcher(message); - while (matcher.find()) { - message = message.replace(matcher.group(), "" + ChatColor.of(matcher.group())); - } - return message; - } - -} diff --git a/src/main/java/net/knarcraft/dynmapcitizens/formatting/TranslatableMessage.java b/src/main/java/net/knarcraft/dynmapcitizens/formatting/TranslatableMessage.java deleted file mode 100644 index 46ebefe..0000000 --- a/src/main/java/net/knarcraft/dynmapcitizens/formatting/TranslatableMessage.java +++ /dev/null @@ -1,7 +0,0 @@ -package net.knarcraft.dynmapcitizens.formatting; - -public enum TranslatableMessage { - - SENTINEL_DETAILS - -} diff --git a/src/main/java/net/knarcraft/dynmapcitizens/formatting/Translator.java b/src/main/java/net/knarcraft/dynmapcitizens/formatting/Translator.java deleted file mode 100644 index 85c3716..0000000 --- a/src/main/java/net/knarcraft/dynmapcitizens/formatting/Translator.java +++ /dev/null @@ -1,120 +0,0 @@ -package net.knarcraft.dynmapcitizens.formatting; - -import net.knarcraft.dynmapcitizens.DynmapCitizens; -import net.knarcraft.dynmapcitizens.util.FileHelper; -import org.bukkit.configuration.file.YamlConfiguration; - -import java.io.BufferedReader; -import java.io.File; -import java.io.FileInputStream; -import java.io.FileNotFoundException; -import java.io.InputStreamReader; -import java.util.HashMap; -import java.util.Map; -import java.util.logging.Level; - -/** - * A tool to get strings translated to the correct language - */ -public final class Translator { - - private static Map translatedMessages; - private static Map backupTranslatedMessages; - - private Translator() { - - } - - /** - * Loads the languages used by this translator - */ - public static void loadLanguages(String selectedLanguage) { - backupTranslatedMessages = loadTranslatedMessages("en"); - translatedMessages = loadCustomTranslatedMessages(selectedLanguage); - if (translatedMessages == null) { - translatedMessages = loadTranslatedMessages(selectedLanguage); - } - } - - /** - * Gets a translated version of the given translatable message - * - * @param translatableMessage

    The message to translate

    - * @return

    The translated message

    - */ - public static String getTranslatedMessage(TranslatableMessage translatableMessage) { - if (translatedMessages == null) { - return "Translated strings not loaded"; - } - String translatedMessage; - if (translatedMessages.containsKey(translatableMessage)) { - translatedMessage = translatedMessages.get(translatableMessage); - } else if (backupTranslatedMessages.containsKey(translatableMessage)) { - translatedMessage = backupTranslatedMessages.get(translatableMessage); - } else { - translatedMessage = translatableMessage.toString(); - } - return StringFormatter.translateAllColorCodes(translatedMessage); - } - - /** - * Loads all translated messages for the given language - * - * @param language

    The language chosen by the user

    - * @return

    A mapping of all strings for the given language

    - */ - public static Map loadTranslatedMessages(String language) { - try { - BufferedReader reader = FileHelper.getBufferedReaderForInternalFile("/strings.yml"); - return loadTranslatableMessages(language, reader); - } catch (FileNotFoundException e) { - DynmapCitizens.getInstance().getLogger().log(Level.SEVERE, "Unable to load translated messages"); - return null; - } - } - - /** - * Tries to load translated messages from a custom strings.yml file - * - * @param language

    The selected language

    - * @return

    The loaded translated strings, or null if no custom language file exists

    - */ - public static Map loadCustomTranslatedMessages(String language) { - DynmapCitizens instance = DynmapCitizens.getInstance(); - - File strings = new File(instance.getDataFolder(), "strings.yml"); - if (!strings.exists()) { - instance.getLogger().log(Level.FINEST, "Strings file not found"); - return null; - } - - try { - instance.getLogger().log(Level.INFO, "Loading custom strings..."); - return loadTranslatableMessages(language, new BufferedReader(new InputStreamReader(new FileInputStream(strings)))); - } catch (FileNotFoundException e) { - instance.getLogger().log(Level.WARNING, "Unable to load custom messages"); - return null; - } - } - - /** - * Loads translatable messages from the given reader - * - * @param language

    The selected language

    - * @param reader

    The buffered reader to read from

    - * @return

    The loaded translated strings

    - */ - private static Map loadTranslatableMessages(String language, BufferedReader reader) { - Map translatedMessages = new HashMap<>(); - YamlConfiguration configuration = YamlConfiguration.loadConfiguration(reader); - - for (TranslatableMessage message : TranslatableMessage.values()) { - String translated = configuration.getString(language + "." + message.toString()); - if (translated != null) { - translatedMessages.put(message, translated); - } - } - return translatedMessages; - } - -} \ No newline at end of file diff --git a/src/main/java/net/knarcraft/dynmapcitizens/handler/trait/quests/QuestPlannerInfoGenerator.java b/src/main/java/net/knarcraft/dynmapcitizens/handler/trait/quests/QuestPlannerInfoGenerator.java index 3d6d6e5..4bb64f9 100644 --- a/src/main/java/net/knarcraft/dynmapcitizens/handler/trait/quests/QuestPlannerInfoGenerator.java +++ b/src/main/java/net/knarcraft/dynmapcitizens/handler/trait/quests/QuestPlannerInfoGenerator.java @@ -2,7 +2,11 @@ package net.knarcraft.dynmapcitizens.handler.trait.quests; import me.blackvein.quests.quests.IQuest; import me.blackvein.quests.quests.Planner; -import net.knarcraft.dynmapcitizens.util.TimeFormatter; +import net.knarcraft.knarlib.formatting.TimeFormatter; + +import java.text.DateFormat; +import java.text.SimpleDateFormat; +import java.util.Date; /** * A class to generate a string containing all information about a quest's planner info @@ -42,13 +46,13 @@ public class QuestPlannerInfoGenerator { //Quest only becomes available after the start date if (planner.hasStart()) { plannerInfo.append("
  • Quest available from "); - plannerInfo.append(TimeFormatter.formatTimestamp(planner.getStartInMillis())).append("
  • "); + plannerInfo.append(formatTimestamp(planner.getStartInMillis())).append(""); } //Quest is only available until the end date if (planner.hasEnd()) { plannerInfo.append("
  • Quest available until "); - plannerInfo.append(TimeFormatter.formatTimestamp(planner.getEndInMillis())).append("
  • "); + plannerInfo.append(formatTimestamp(planner.getEndInMillis())).append(""); } //Quest availability repeats @@ -61,4 +65,16 @@ public class QuestPlannerInfoGenerator { return plannerInfo.toString(); } + /** + * Gets a datetime string for the given timestamp + * + * @param timestamp

    A timestamp in milliseconds

    + * @return

    A datetime string

    + */ + private String formatTimestamp(long timestamp) { + DateFormat format = new SimpleDateFormat("dd MM yyyy HH:mm:ss"); + Date date = new Date(timestamp); + return format.format(date); + } + } diff --git a/src/main/java/net/knarcraft/dynmapcitizens/util/FileHelper.java b/src/main/java/net/knarcraft/dynmapcitizens/util/FileHelper.java deleted file mode 100644 index a5d13cc..0000000 --- a/src/main/java/net/knarcraft/dynmapcitizens/util/FileHelper.java +++ /dev/null @@ -1,32 +0,0 @@ -package net.knarcraft.dynmapcitizens.util; - -import java.io.BufferedReader; -import java.io.FileNotFoundException; -import java.io.InputStream; -import java.io.InputStreamReader; -import java.nio.charset.StandardCharsets; - -/** - * A helper class for dealing with files - */ -public final class FileHelper { - - private FileHelper() { - - } - - /** - * Gets a buffered reader for - * - * @return

    A buffered read for reading the file

    - * @throws FileNotFoundException

    If unable to get an input stream for the given file

    - */ - public static BufferedReader getBufferedReaderForInternalFile(String file) throws FileNotFoundException { - InputStream inputStream = FileHelper.class.getResourceAsStream(file); - if (inputStream == null) { - throw new FileNotFoundException("Unable to read the given file"); - } - return new BufferedReader(new InputStreamReader(inputStream, StandardCharsets.UTF_8)); - } - -} diff --git a/src/main/java/net/knarcraft/dynmapcitizens/util/TimeFormatter.java b/src/main/java/net/knarcraft/dynmapcitizens/util/TimeFormatter.java deleted file mode 100644 index 30c0753..0000000 --- a/src/main/java/net/knarcraft/dynmapcitizens/util/TimeFormatter.java +++ /dev/null @@ -1,98 +0,0 @@ -package net.knarcraft.dynmapcitizens.util; - -import java.text.DateFormat; -import java.text.SimpleDateFormat; -import java.util.ArrayList; -import java.util.Collections; -import java.util.Date; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -import static net.knarcraft.dynmapcitizens.formatting.StringFormatter.replacePlaceholder; - -/** - * A helper class for time formatting - */ -public class TimeFormatter { - - /** - * Gets a datetime string for the given timestamp - * - * @param timestamp

    A timestamp in milliseconds

    - * @return

    A datetime string

    - */ - public static String formatTimestamp(long timestamp) { - DateFormat format = new SimpleDateFormat("dd MM yyyy HH:mm:ss"); - Date date = new Date(timestamp); - return format.format(date); - } - - /** - * Gets the string used for displaying this sign's duration - * - * @return

    The string used for displaying this sign's duration

    - */ - public static String getDurationString(long duration) { - if (duration == 0) { - return "immediately"; - } else { - double minute = 60; - double hour = minute * 60; - double day = hour * 24; - double week = day * 7; - double month = day * 30; - double year = day * 365; - double decade = year * 10; - - Map timeUnits = new HashMap<>(); - timeUnits.put(decade, new String[]{"decade", "decades"}); - timeUnits.put(year, new String[]{"year", "years"}); - timeUnits.put(month, new String[]{"month", "months"}); - timeUnits.put(week, new String[]{"week", "weeks"}); - timeUnits.put(day, new String[]{"day", "days"}); - timeUnits.put(hour, new String[]{"hour", "hours"}); - timeUnits.put(minute, new String[]{"minute", "minutes"}); - timeUnits.put(1D, new String[]{"second", "seconds"}); - - List sortedUnits = new ArrayList<>(timeUnits.keySet()); - Collections.sort(sortedUnits); - Collections.reverse(sortedUnits); - - for (Double unit : sortedUnits) { - if (duration / unit >= 1) { - double units = round(duration / unit); - return formatDurationString(units, timeUnits.get(unit)[units == 1 ? 0 : 1], - (units * 10) % 10 == 0); - } - } - return formatDurationString(duration, "seconds", false); - } - } - - /** - * Rounds a number to its last two digits - * - * @param number

    The number to round

    - * @return

    The rounded number

    - */ - private static double round(double number) { - return Math.round(number * 100.0) / 100.0; - } - - /** - * Formats a duration string - * - * @param duration

    The duration to display

    - * @param translatableMessage

    The time unit to display

    - * @param castToInt

    Whether to cast the duration to an int

    - * @return

    The formatted duration string

    - */ - private static String formatDurationString(double duration, String translatableMessage, boolean castToInt) { - String durationFormat = "{duration} {unit}"; - durationFormat = replacePlaceholder(durationFormat, "{unit}", translatableMessage); - return replacePlaceholder(durationFormat, "{duration}", castToInt ? String.valueOf((int) duration) : - String.valueOf(duration)); - } - -} diff --git a/src/main/resources/strings.yml b/src/main/resources/strings.yml index 05aec0f..c2ba5f6 100644 --- a/src/main/resources/strings.yml +++ b/src/main/resources/strings.yml @@ -49,7 +49,24 @@ en: QUESTS_REQUIREMENTS_REQUIRED_QUEST_ITEM: "
  • {questName}
  • " QUESTS_REQUIREMENTS_REQUIRED_ITEM_FORMAT: "
  • Required items:
      {requiredItems}
  • " QUESTS_REQUIREMENTS_REQUIRED_ITEM_ITEM: "
  • {itemName}
  • " - QUESTS_REQUIREMENTS_MCMMO_SKILL: "
  • Requires mcMMO skill {skill} at level {level}
  • " + QUESTS_REQUIREMENTS_MC_MMO_SKILL: "
  • Requires mcMMO skill {skill} at level {level}
  • " QUESTS_REQUIREMENTS_REQUIRED_PERMISSION_FORMAT: "
  • Required permissions:
      {permissions}
  • " QUESTS_REQUIREMENTS_REQUIRED_PERMISSION_ITEM: "
  • {permission}
  • " - \ No newline at end of file + DURATION_FORMAT: "in {time} {unit}" + UNIT_NOW: "imminently" + UNIT_SECOND: "second" + UNIT_SECONDS: "seconds" + UNIT_MINUTE: "minute" + UNIT_MINUTES: "minutes" + UNIT_HOUR: "hour" + UNIT_HOURS: "hours" + UNIT_DAY: "day" + UNIT_DAYS: "days" + UNIT_WEEK: "week" + UNIT_WEEKS: "weeks" + UNIT_MONTH: "month" + UNIT_MONTHS: "months" + UNIT_YEAR: "year" + UNIT_YEARS: "years" + UNIT_DECADE: "decade" + UNIT_DECADES: "decades" \ No newline at end of file From c33520d8f26e147d74aad6764a5b7f5091e6b430 Mon Sep 17 00:00:00 2001 From: EpicKnarvik97 Date: Mon, 7 Nov 2022 22:23:31 +0100 Subject: [PATCH 03/16] Changes code to account for KnarLib changes --- .../dynmapcitizens/DynmapCitizens.java | 19 ++++++++++++++----- .../quests/QuestPlannerInfoGenerator.java | 7 +++++-- 2 files changed, 19 insertions(+), 7 deletions(-) diff --git a/src/main/java/net/knarcraft/dynmapcitizens/DynmapCitizens.java b/src/main/java/net/knarcraft/dynmapcitizens/DynmapCitizens.java index cac77f9..10a8bdb 100644 --- a/src/main/java/net/knarcraft/dynmapcitizens/DynmapCitizens.java +++ b/src/main/java/net/knarcraft/dynmapcitizens/DynmapCitizens.java @@ -8,7 +8,6 @@ import net.knarcraft.dynmapcitizens.handler.trait.MinstrelHandler; import net.knarcraft.dynmapcitizens.handler.trait.SentinelHandler; import net.knarcraft.dynmapcitizens.handler.trait.quests.QuestsHandler; import net.knarcraft.dynmapcitizens.settings.GlobalSettings; -import net.knarcraft.knarlib.KnarLib; import net.knarcraft.knarlib.formatting.TranslatableTimeUnit; import net.knarcraft.knarlib.formatting.Translator; import org.bukkit.Bukkit; @@ -26,6 +25,7 @@ import java.util.logging.Level; public final class DynmapCitizens extends JavaPlugin { private static DynmapCitizens instance; + private static Translator translator; private DynmapAPI dynmapAPI; private VaultHandler vaultHandler; private GlobalSettings globalSettings; @@ -34,7 +34,6 @@ public final class DynmapCitizens extends JavaPlugin { @Override public void onEnable() { DynmapCitizens.instance = this; - KnarLib.setPlugin(this); //Initialize quest and dynmap APIs PluginManager pluginManager = Bukkit.getPluginManager(); @@ -56,9 +55,10 @@ public final class DynmapCitizens extends JavaPlugin { this.globalSettings.load(configuration); //Load all messages - Translator.registerMessageCategory(TranslatableTimeUnit.UNIT_SECOND); - Translator.registerMessageCategory(DynmapCitizensTranslatableMessage.SENTINEL_DESCRIPTION); - Translator.loadLanguages("en"); + translator = new Translator(); + translator.registerMessageCategory(TranslatableTimeUnit.UNIT_SECOND); + translator.registerMessageCategory(DynmapCitizensTranslatableMessage.SENTINEL_DESCRIPTION); + translator.loadLanguages(this.getDataFolder(), "en"); //Initialize all enabled traits initializeTraitHandlers(configuration); @@ -80,6 +80,15 @@ public final class DynmapCitizens extends JavaPlugin { //TODO: Perhaps remove icons, just in case? } + /** + * Gets the translator to use for translation + * + * @return

    The translator to use

    + */ + public static Translator getTranslator() { + return translator; + } + /** * Gets the global settings for this plugin * diff --git a/src/main/java/net/knarcraft/dynmapcitizens/handler/trait/quests/QuestPlannerInfoGenerator.java b/src/main/java/net/knarcraft/dynmapcitizens/handler/trait/quests/QuestPlannerInfoGenerator.java index 4bb64f9..d3bce69 100644 --- a/src/main/java/net/knarcraft/dynmapcitizens/handler/trait/quests/QuestPlannerInfoGenerator.java +++ b/src/main/java/net/knarcraft/dynmapcitizens/handler/trait/quests/QuestPlannerInfoGenerator.java @@ -2,6 +2,7 @@ package net.knarcraft.dynmapcitizens.handler.trait.quests; import me.blackvein.quests.quests.IQuest; import me.blackvein.quests.quests.Planner; +import net.knarcraft.dynmapcitizens.DynmapCitizens; import net.knarcraft.knarlib.formatting.TimeFormatter; import java.text.DateFormat; @@ -37,7 +38,8 @@ public class QuestPlannerInfoGenerator { //Quest can be repeated after a cool-down if (planner.hasCooldown()) { plannerInfo.append("
  • Quest repeatable after: "); - plannerInfo.append(TimeFormatter.getDurationString(planner.getCooldown() / 1000)); + plannerInfo.append(TimeFormatter.getDurationString(DynmapCitizens.getTranslator(), + planner.getCooldown() / 1000)); plannerInfo.append("
  • "); } else { plannerInfo.append("
  • Quest cannot be repeated!
  • "); @@ -58,7 +60,8 @@ public class QuestPlannerInfoGenerator { //Quest availability repeats if (planner.hasRepeat()) { plannerInfo.append("
  • Quest will become available again after "); - plannerInfo.append(TimeFormatter.getDurationString(planner.getRepeat() / 1000)).append("
  • "); + plannerInfo.append(TimeFormatter.getDurationString(DynmapCitizens.getTranslator(), + planner.getRepeat() / 1000)).append(""); } plannerInfo.append(""); From ab9cdad215cedf8a0fa06b76bef896ce11dfad72 Mon Sep 17 00:00:00 2001 From: EpicKnarvik97 Date: Mon, 14 Nov 2022 02:07:31 +0100 Subject: [PATCH 04/16] Fixes some HTTP dependencies --- pom.xml | 4 ++-- .../java/net/knarcraft/dynmapcitizens/DynmapCitizens.java | 6 +++--- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/pom.xml b/pom.xml index 408bc6d..dbb4859 100644 --- a/pom.xml +++ b/pom.xml @@ -86,11 +86,11 @@ citizens-repo - http://repo.citizensnpcs.co/ + https://repo.citizensnpcs.co/ vault-repo - http://nexus.hc.to/content/repositories/pub_releases + https://nexus.hc.to/content/repositories/pub_releases diff --git a/src/main/java/net/knarcraft/dynmapcitizens/DynmapCitizens.java b/src/main/java/net/knarcraft/dynmapcitizens/DynmapCitizens.java index 10a8bdb..71d8a95 100644 --- a/src/main/java/net/knarcraft/dynmapcitizens/DynmapCitizens.java +++ b/src/main/java/net/knarcraft/dynmapcitizens/DynmapCitizens.java @@ -26,7 +26,7 @@ public final class DynmapCitizens extends JavaPlugin { private static DynmapCitizens instance; private static Translator translator; - private DynmapAPI dynmapAPI; + private DynmapAPI dynmapAPIInstance; private VaultHandler vaultHandler; private GlobalSettings globalSettings; private List traitHandlers; @@ -43,7 +43,7 @@ public final class DynmapCitizens extends JavaPlugin { this.onDisable(); return; } - this.dynmapAPI = dynmapAPI; + this.dynmapAPIInstance = dynmapAPI; this.globalSettings = new GlobalSettings(); FileConfiguration configuration = this.getConfig(); @@ -113,7 +113,7 @@ public final class DynmapCitizens extends JavaPlugin { * @return

    A reference to the Dynmap API

    */ public DynmapAPI getDynmapAPI() { - return this.dynmapAPI; + return this.dynmapAPIInstance; } /** From fbeb03db5e34408533b2a64404ccc3c714b0e9e2 Mon Sep 17 00:00:00 2001 From: EpicKnarvik97 Date: Wed, 16 Nov 2022 13:52:27 +0100 Subject: [PATCH 05/16] Adds comments for all translatable messages --- .../DynmapCitizensTranslatableMessage.java | 120 ++++++++++++++++++ src/main/resources/strings.yml | 2 +- 2 files changed, 121 insertions(+), 1 deletion(-) diff --git a/src/main/java/net/knarcraft/dynmapcitizens/formatting/DynmapCitizensTranslatableMessage.java b/src/main/java/net/knarcraft/dynmapcitizens/formatting/DynmapCitizensTranslatableMessage.java index 4c50c6a..878d474 100644 --- a/src/main/java/net/knarcraft/dynmapcitizens/formatting/DynmapCitizensTranslatableMessage.java +++ b/src/main/java/net/knarcraft/dynmapcitizens/formatting/DynmapCitizensTranslatableMessage.java @@ -7,25 +7,145 @@ import net.knarcraft.knarlib.formatting.TranslatableMessage; */ public enum DynmapCitizensTranslatableMessage implements TranslatableMessage { + /** + * The format for the basic description of any sentinel + * + *

    Placeholders: {name}, {squad}, {sentinelDetails}

    + */ SENTINEL_DESCRIPTION, + + /** + * The format for the detailed description of any sentinel + * + *

    Placeholders: {invincible}, {armor}, {health}, {accuracy}, {damage}, {speed}, {allowKnockback}, {range}, + * {reach}, {targets}, {avoids}, {ignores}

    + */ SENTINEL_DETAILS, + + /** + * The format for a quest's planner description + * + *

    Placeholders: {questCoolDown}, {questFrom}, {questUntil}, {questRepeat}

    + */ QUESTS_PLANNER_DESCRIPTION, + + /** + * The format for a quest's cool-down + * + *

    Placeholders: {coolDown}

    + */ QUESTS_PLANNER_COOL_DOWN, + + /** + * The text to display if a quest cannot be repeated + */ QUESTS_PLANNER_UNREPEATABLE, + + /** + * The format for a quest's first availability date + * + *

    Placeholders: {startDate}

    + */ QUESTS_PLANNER_FROM, + + /** + * The format for a quest's last availability date + * + *

    Placeholders: {endDate}

    + */ QUESTS_PLANNER_UNTIL, + + /** + * The format for a quest's repeat delay + * + *

    Placeholders: {repeatDelay}

    + */ QUEST_PLANNER_REPEAT, + + /** + * The format for a quest's requirements + * + *

    Placeholders: {requirementQuestPoints}, {requirementExp}, {requirementBlockedByQuests}, + * {requirementRequiredQuests}, {requirementRequiredItems}, {requirementMCMMOSkills}, {requirementPermissions}, + * {requirementCustom}

    + */ QUESTS_REQUIREMENTS_FORMAT, + + /** + * The format for a quest's quest point requirement + * + *

    Placeholders: {questPoints}

    + */ QUESTS_REQUIREMENTS_QUEST_POINTS, + + /** + * The format for a quest's exp requirement + * + *

    Placeholders: {exp}

    + */ QUESTS_REQUIREMENTS_EXP, + + /** + * The format for a quest's blocking quests + * + *

    Placeholders: {blockingQuests}

    + */ QUESTS_REQUIREMENTS_BLOCKED_BY_QUEST_FORMAT, + + /** + * The format for one of a quest's blocking quests + * + *

    Placeholders: {questName}

    + */ QUESTS_REQUIREMENTS_BLOCKED_BY_QUEST_ITEM, + + /** + * The format for a quest's required quests + * + *

    Placeholders: {requiredQuests}

    + */ QUESTS_REQUIREMENTS_REQUIRED_QUEST_FORMAT, + + /** + * The format for one of a quest's required quests + * + *

    Placeholders: {questName}

    + */ QUESTS_REQUIREMENTS_REQUIRED_QUEST_ITEM, + + /** + * The format for a quest's required items + * + *

    Placeholders: {requiredItems}

    + */ QUESTS_REQUIREMENTS_REQUIRED_ITEM_FORMAT, + + /** + * The format for one of a quest's required items + * + *

    Placeholders: {itemName}

    + */ QUESTS_REQUIREMENTS_REQUIRED_ITEM_ITEM, + + /** + * The format for a quest's mcMMO skill requirement + * + *

    Placeholders: {skill}, {level}

    + */ QUESTS_REQUIREMENTS_MC_MMO_SKILL, + + /** + * The format for a quest's required permissions + * + *

    Placeholders: {permissions}

    + */ QUESTS_REQUIREMENTS_REQUIRED_PERMISSION_FORMAT, + + /** + * The format for one of a quest's required permissions + * + *

    Placeholders: {permission}

    + */ QUESTS_REQUIREMENTS_REQUIRED_PERMISSION_ITEM; @Override diff --git a/src/main/resources/strings.yml b/src/main/resources/strings.yml index c2ba5f6..e4c183d 100644 --- a/src/main/resources/strings.yml +++ b/src/main/resources/strings.yml @@ -1,6 +1,6 @@ en: SENTINEL_DESCRIPTION: | -

    name

    +

    {name}


    Squad: {squad} {sentinelDetails} SENTINEL_DETAILS: | From 39c0e81a9ee3eb1a279fb332c7392700b719fce3 Mon Sep 17 00:00:00 2001 From: EpicKnarvik97 Date: Wed, 16 Nov 2022 16:35:50 +0100 Subject: [PATCH 06/16] Implements translatable messages for quest requirements Splits DynmapCitizensTranslatableMessage into QuestsTranslatableMessage and SentinelTranslatableMessage. Adds a new method in DynmapCitizens to get a string formatter. Replaces hard-coded formatting with formatting defined in strings.yml. --- .../dynmapcitizens/DynmapCitizens.java | 18 +- ...ge.java => QuestsTranslatableMessage.java} | 19 +-- .../SentinelTranslatableMessage.java | 31 ++++ .../QuestRequirementsInfoGenerator.java | 154 +++++++++++++----- 4 files changed, 158 insertions(+), 64 deletions(-) rename src/main/java/net/knarcraft/dynmapcitizens/formatting/{DynmapCitizensTranslatableMessage.java => QuestsTranslatableMessage.java} (84%) create mode 100644 src/main/java/net/knarcraft/dynmapcitizens/formatting/SentinelTranslatableMessage.java diff --git a/src/main/java/net/knarcraft/dynmapcitizens/DynmapCitizens.java b/src/main/java/net/knarcraft/dynmapcitizens/DynmapCitizens.java index 71d8a95..010f928 100644 --- a/src/main/java/net/knarcraft/dynmapcitizens/DynmapCitizens.java +++ b/src/main/java/net/knarcraft/dynmapcitizens/DynmapCitizens.java @@ -1,6 +1,7 @@ package net.knarcraft.dynmapcitizens; -import net.knarcraft.dynmapcitizens.formatting.DynmapCitizensTranslatableMessage; +import net.knarcraft.dynmapcitizens.formatting.QuestsTranslatableMessage; +import net.knarcraft.dynmapcitizens.formatting.SentinelTranslatableMessage; import net.knarcraft.dynmapcitizens.handler.VaultHandler; import net.knarcraft.dynmapcitizens.handler.trait.BlacksmithHandler; import net.knarcraft.dynmapcitizens.handler.trait.CitizensTraitHandler; @@ -8,6 +9,7 @@ import net.knarcraft.dynmapcitizens.handler.trait.MinstrelHandler; import net.knarcraft.dynmapcitizens.handler.trait.SentinelHandler; import net.knarcraft.dynmapcitizens.handler.trait.quests.QuestsHandler; import net.knarcraft.dynmapcitizens.settings.GlobalSettings; +import net.knarcraft.knarlib.formatting.StringFormatter; import net.knarcraft.knarlib.formatting.TranslatableTimeUnit; import net.knarcraft.knarlib.formatting.Translator; import org.bukkit.Bukkit; @@ -26,6 +28,7 @@ public final class DynmapCitizens extends JavaPlugin { private static DynmapCitizens instance; private static Translator translator; + private static StringFormatter stringFormatter; private DynmapAPI dynmapAPIInstance; private VaultHandler vaultHandler; private GlobalSettings globalSettings; @@ -57,8 +60,10 @@ public final class DynmapCitizens extends JavaPlugin { //Load all messages translator = new Translator(); translator.registerMessageCategory(TranslatableTimeUnit.UNIT_SECOND); - translator.registerMessageCategory(DynmapCitizensTranslatableMessage.SENTINEL_DESCRIPTION); + translator.registerMessageCategory(QuestsTranslatableMessage.QUESTS_REQUIREMENTS_FORMAT); + translator.registerMessageCategory(SentinelTranslatableMessage.SENTINEL_DESCRIPTION); translator.loadLanguages(this.getDataFolder(), "en"); + stringFormatter = new StringFormatter(this.getDescription().getName(), translator); //Initialize all enabled traits initializeTraitHandlers(configuration); @@ -89,6 +94,15 @@ public final class DynmapCitizens extends JavaPlugin { return translator; } + /** + * Gets the string formatter to use for formatting + * + * @return

    The string formatter to use

    + */ + public static StringFormatter getFormatter() { + return stringFormatter; + } + /** * Gets the global settings for this plugin * diff --git a/src/main/java/net/knarcraft/dynmapcitizens/formatting/DynmapCitizensTranslatableMessage.java b/src/main/java/net/knarcraft/dynmapcitizens/formatting/QuestsTranslatableMessage.java similarity index 84% rename from src/main/java/net/knarcraft/dynmapcitizens/formatting/DynmapCitizensTranslatableMessage.java rename to src/main/java/net/knarcraft/dynmapcitizens/formatting/QuestsTranslatableMessage.java index 878d474..004693a 100644 --- a/src/main/java/net/knarcraft/dynmapcitizens/formatting/DynmapCitizensTranslatableMessage.java +++ b/src/main/java/net/knarcraft/dynmapcitizens/formatting/QuestsTranslatableMessage.java @@ -5,22 +5,7 @@ import net.knarcraft.knarlib.formatting.TranslatableMessage; /** * An enum describing all of DynmapCitizens' translatable messages */ -public enum DynmapCitizensTranslatableMessage implements TranslatableMessage { - - /** - * The format for the basic description of any sentinel - * - *

    Placeholders: {name}, {squad}, {sentinelDetails}

    - */ - SENTINEL_DESCRIPTION, - - /** - * The format for the detailed description of any sentinel - * - *

    Placeholders: {invincible}, {armor}, {health}, {accuracy}, {damage}, {speed}, {allowKnockback}, {range}, - * {reach}, {targets}, {avoids}, {ignores}

    - */ - SENTINEL_DETAILS, +public enum QuestsTranslatableMessage implements TranslatableMessage { /** * The format for a quest's planner description @@ -150,6 +135,6 @@ public enum DynmapCitizensTranslatableMessage implements TranslatableMessage { @Override public TranslatableMessage[] getAllMessages() { - return DynmapCitizensTranslatableMessage.values(); + return QuestsTranslatableMessage.values(); } } diff --git a/src/main/java/net/knarcraft/dynmapcitizens/formatting/SentinelTranslatableMessage.java b/src/main/java/net/knarcraft/dynmapcitizens/formatting/SentinelTranslatableMessage.java new file mode 100644 index 0000000..27898cc --- /dev/null +++ b/src/main/java/net/knarcraft/dynmapcitizens/formatting/SentinelTranslatableMessage.java @@ -0,0 +1,31 @@ +package net.knarcraft.dynmapcitizens.formatting; + +import net.knarcraft.knarlib.formatting.TranslatableMessage; + +/** + * An enum describing all translatable messages for sentinels + */ +public enum SentinelTranslatableMessage implements TranslatableMessage { + + /** + * The format for the basic description of any sentinel + * + *

    Placeholders: {name}, {squad}, {sentinelDetails}

    + */ + SENTINEL_DESCRIPTION, + + /** + * The format for the detailed description of any sentinel + * + *

    Placeholders: {invincible}, {armor}, {health}, {accuracy}, {damage}, {speed}, {allowKnockback}, {range}, + * {reach}, {targets}, {avoids}, {ignores}

    + */ + SENTINEL_DETAILS, + ; + + @Override + public TranslatableMessage[] getAllMessages() { + return SentinelTranslatableMessage.values(); + } + +} diff --git a/src/main/java/net/knarcraft/dynmapcitizens/handler/trait/quests/QuestRequirementsInfoGenerator.java b/src/main/java/net/knarcraft/dynmapcitizens/handler/trait/quests/QuestRequirementsInfoGenerator.java index 426b2ff..e2a9a6d 100644 --- a/src/main/java/net/knarcraft/dynmapcitizens/handler/trait/quests/QuestRequirementsInfoGenerator.java +++ b/src/main/java/net/knarcraft/dynmapcitizens/handler/trait/quests/QuestRequirementsInfoGenerator.java @@ -2,18 +2,37 @@ package net.knarcraft.dynmapcitizens.handler.trait.quests; import me.blackvein.quests.quests.IQuest; import me.blackvein.quests.quests.Requirements; +import net.knarcraft.dynmapcitizens.DynmapCitizens; import net.knarcraft.dynmapcitizens.util.QuestsHelper; +import net.knarcraft.knarlib.formatting.StringFormatter; +import net.knarcraft.knarlib.formatting.StringReplacer; +import net.knarcraft.knarlib.formatting.TranslatableMessage; import org.bukkit.inventory.ItemStack; +import java.util.ArrayList; import java.util.List; import java.util.Map; +import static net.knarcraft.dynmapcitizens.formatting.QuestsTranslatableMessage.QUESTS_REQUIREMENTS_BLOCKED_BY_QUEST_FORMAT; +import static net.knarcraft.dynmapcitizens.formatting.QuestsTranslatableMessage.QUESTS_REQUIREMENTS_BLOCKED_BY_QUEST_ITEM; +import static net.knarcraft.dynmapcitizens.formatting.QuestsTranslatableMessage.QUESTS_REQUIREMENTS_EXP; +import static net.knarcraft.dynmapcitizens.formatting.QuestsTranslatableMessage.QUESTS_REQUIREMENTS_FORMAT; +import static net.knarcraft.dynmapcitizens.formatting.QuestsTranslatableMessage.QUESTS_REQUIREMENTS_MC_MMO_SKILL; +import static net.knarcraft.dynmapcitizens.formatting.QuestsTranslatableMessage.QUESTS_REQUIREMENTS_QUEST_POINTS; +import static net.knarcraft.dynmapcitizens.formatting.QuestsTranslatableMessage.QUESTS_REQUIREMENTS_REQUIRED_ITEM_FORMAT; +import static net.knarcraft.dynmapcitizens.formatting.QuestsTranslatableMessage.QUESTS_REQUIREMENTS_REQUIRED_ITEM_ITEM; +import static net.knarcraft.dynmapcitizens.formatting.QuestsTranslatableMessage.QUESTS_REQUIREMENTS_REQUIRED_PERMISSION_FORMAT; +import static net.knarcraft.dynmapcitizens.formatting.QuestsTranslatableMessage.QUESTS_REQUIREMENTS_REQUIRED_PERMISSION_ITEM; +import static net.knarcraft.dynmapcitizens.formatting.QuestsTranslatableMessage.QUESTS_REQUIREMENTS_REQUIRED_QUEST_FORMAT; +import static net.knarcraft.dynmapcitizens.formatting.QuestsTranslatableMessage.QUESTS_REQUIREMENTS_REQUIRED_QUEST_ITEM; + /** * A class to generate a string containing all information about a quest's requirements */ public class QuestRequirementsInfoGenerator { private final IQuest quest; + private final StringFormatter formatter; /** * Instantiates a new quest requirement info generator @@ -22,6 +41,7 @@ public class QuestRequirementsInfoGenerator { */ public QuestRequirementsInfoGenerator(IQuest quest) { this.quest = quest; + formatter = DynmapCitizens.getFormatter(); } /** @@ -31,78 +51,122 @@ public class QuestRequirementsInfoGenerator { */ public String getQuestRequirementsInfo() { Requirements requirements = quest.getRequirements(); - StringBuilder requirementInfo = new StringBuilder(); if (!requirements.hasRequirement()) { - return requirementInfo.toString(); + return ""; } - requirementInfo.append("Requirements:
      "); + StringReplacer replacer = new StringReplacer(DynmapCitizens.getTranslator().getTranslatedMessage( + QUESTS_REQUIREMENTS_FORMAT)); - if (requirements.getQuestPoints() > 0) { - requirementInfo.append("
    • ").append(requirements.getQuestPoints()).append(" quest points
    • "); - } + //Add info about quest point requirement + replacer.add("{requirementQuestPoints}", requirements.getQuestPoints() > 0 ? + formatter.replacePlaceholder(QUESTS_REQUIREMENTS_QUEST_POINTS, + "{questPoints}", String.valueOf(requirements.getQuestPoints())) : ""); - if (requirements.getExp() > 0) { - requirementInfo.append("
    • ").append(requirements.getExp()).append(" exp
    • "); - } + //Add info about exp requirement + replacer.add("{requirementExp}", requirements.getExp() > 0 ? formatter.replacePlaceholder( + QUESTS_REQUIREMENTS_EXP, "{exp}", String.valueOf(requirements.getExp())) : ""); - if (!requirements.getBlockQuests().isEmpty()) { - requirementInfo.append("
    • Blocked by quests:
        "); - for (IQuest blockQuest : requirements.getBlockQuests()) { - requirementInfo.append("
      • ").append(blockQuest.getName()).append("
      • "); - } - requirementInfo.append("
    • "); - } + //Add info about blocking quests + replacer.add("{requirementBlockedByQuests}", !requirements.getBlockQuests().isEmpty() ? + getRequirementList(getQuestNames(requirements.getBlockQuests()), + QUESTS_REQUIREMENTS_BLOCKED_BY_QUEST_FORMAT, "{blockingQuests}", + QUESTS_REQUIREMENTS_BLOCKED_BY_QUEST_ITEM, "{questName}") : ""); - if (!requirements.getNeededQuests().isEmpty()) { - requirementInfo.append("
    • Required quests:
        "); - for (IQuest neededQuest : requirements.getNeededQuests()) { - requirementInfo.append("
      • ").append(neededQuest.getName()).append("
      • "); - } - requirementInfo.append("
    • "); - } + //Add info about required quests + replacer.add("{requirementRequiredQuests}", !requirements.getNeededQuests().isEmpty() ? + getRequirementList(getQuestNames(requirements.getNeededQuests()), + QUESTS_REQUIREMENTS_REQUIRED_QUEST_FORMAT, "{requiredQuests}", + QUESTS_REQUIREMENTS_REQUIRED_QUEST_ITEM, "{questName}") : ""); - if (!requirements.getItems().isEmpty()) { - requirementInfo.append("
    • Required items:
        "); - for (ItemStack item : requirements.getItems()) { - requirementInfo.append("
      • ").append(QuestsHelper.getUpperCasedItemStackString(item)).append("
      • "); - } - requirementInfo.append("
    • "); - } + //Add info about required items + replacer.add("{requirementRequiredItems}", !requirements.getItems().isEmpty() ? + getRequirementList(getItemNames(requirements.getItems()), QUESTS_REQUIREMENTS_REQUIRED_ITEM_FORMAT, + "{requiredItems}", QUESTS_REQUIREMENTS_REQUIRED_ITEM_ITEM, "{itemName}") : ""); + //Add info about required mcMMO skills if (!requirements.getMcmmoSkills().isEmpty()) { List skills = requirements.getMcmmoSkills(); List amounts = requirements.getMcmmoAmounts(); + StringBuilder mcMMOSkillsBuilder = new StringBuilder(); for (int i = 0; i < skills.size(); i++) { - requirementInfo.append("
    • Requires mcMMO skill ").append(skills.get(i)).append(" at level "); - requirementInfo.append(amounts.get(i)).append("
    • "); + mcMMOSkillsBuilder.append(formatter.replacePlaceholders(QUESTS_REQUIREMENTS_MC_MMO_SKILL, new String[]{ + "{skill}", "{level}"}, new String[]{skills.get(i), String.valueOf(amounts.get(i))})); } + replacer.add("{requirementMCMMOSkills}", mcMMOSkillsBuilder.toString()); + } else { + replacer.add("{requirementMCMMOSkills}", ""); } - if (!requirements.getPermissions().isEmpty()) { - requirementInfo.append("
    • Required permissions:
        "); - for (String permission : requirements.getPermissions()) { - requirementInfo.append("
      • ").append(permission).append("
      • "); - } - requirementInfo.append("
    • "); - } + //Add info about required permissions + replacer.add("{requirementPermissions}", !requirements.getPermissions().isEmpty() ? + getRequirementList(requirements.getPermissions(), QUESTS_REQUIREMENTS_REQUIRED_PERMISSION_FORMAT, + "{permissions}", QUESTS_REQUIREMENTS_REQUIRED_PERMISSION_ITEM, "{permission}") : ""); Map> customRequirementPlugins = requirements.getCustomRequirements(); + StringBuilder customRequirementsBuilder = new StringBuilder(); for (String plugin : customRequirementPlugins.keySet()) { - requirementInfo.append("
    • ").append(plugin).append(":
        "); + customRequirementsBuilder.append("
      • ").append(plugin).append(":
          "); //Note: The format of custom requirements is kind of weird. First, you have the key for which plugin the // requirement belongs to. Getting the value of the key gives another map. The map contains as key, the type // of value, like "Skill Amount" or "Skill Type". The value is the actual value of whatever it is. Map customRequirementEntry = customRequirementPlugins.get(plugin); for (String requirementDescription : customRequirementEntry.keySet()) { - requirementInfo.append("
        • ").append(requirementDescription).append(" "); - requirementInfo.append(customRequirementEntry.get(requirementDescription)).append("
        • "); + customRequirementsBuilder.append("
        • ").append(requirementDescription).append(" "); + customRequirementsBuilder.append(customRequirementEntry.get(requirementDescription)).append("
        • "); } - requirementInfo.append("
      • "); + customRequirementsBuilder.append("
    • "); } + replacer.add("{requirementCustom}", customRequirementsBuilder.toString()); + return replacer.replace(); + } - requirementInfo.append("
    "); - return requirementInfo.toString(); + /** + * Gets a list of item names from the given list of items + * + * @param items

    The items to get the names of

    + * @return

    The names of the given items

    + */ + private List getItemNames(List items) { + List itemNames = new ArrayList<>(); + for (ItemStack itemStack : items) { + itemNames.add(QuestsHelper.getUpperCasedItemStackString(itemStack)); + } + return itemNames; + } + + /** + * Gets a list of the quest names for the given quests + * + * @param quests

    The quests to get names for

    + * @return

    A list of quest names

    + */ + private List getQuestNames(List quests) { + List questNames = new ArrayList<>(quests.size()); + for (IQuest quest : quests) { + questNames.add(quest.getName()); + } + return questNames; + } + + /** + * Gets a string for the given list of requirements + * + * @param itemList

    The items to display in the list of requirements

    + * @param formatMessage

    The translatable message describing the list format

    + * @param formatPlaceholder

    The placeholder to replace with the list items

    + * @param itemMessage

    The translatable message describing each item's format

    + * @param itemPlaceholder

    The placeholder to replace with each item in the list

    + * @return

    The string corresponding to the given requirement list

    + */ + private String getRequirementList(List itemList, TranslatableMessage formatMessage, String formatPlaceholder, + TranslatableMessage itemMessage, String itemPlaceholder) { + StringBuilder blockedBuilder = new StringBuilder(); + for (Object requirements : itemList) { + blockedBuilder.append(formatter.replacePlaceholder(itemMessage, itemPlaceholder, + String.valueOf(requirements))); + } + return formatter.replacePlaceholder(formatMessage, formatPlaceholder, blockedBuilder.toString()); } } From 08118863902deec1b8ffef5ef021feda019b1433 Mon Sep 17 00:00:00 2001 From: EpicKnarvik97 Date: Wed, 16 Nov 2022 18:49:29 +0100 Subject: [PATCH 07/16] Adds customization for quest area descriptions --- .../formatting/QuestsTranslatableMessage.java | 31 ++++++++++++++- .../trait/quests/QuestAreaHandler.java | 39 +++++++++++++++---- src/main/resources/strings.yml | 4 ++ 3 files changed, 65 insertions(+), 9 deletions(-) diff --git a/src/main/java/net/knarcraft/dynmapcitizens/formatting/QuestsTranslatableMessage.java b/src/main/java/net/knarcraft/dynmapcitizens/formatting/QuestsTranslatableMessage.java index 004693a..1b56b61 100644 --- a/src/main/java/net/knarcraft/dynmapcitizens/formatting/QuestsTranslatableMessage.java +++ b/src/main/java/net/knarcraft/dynmapcitizens/formatting/QuestsTranslatableMessage.java @@ -131,7 +131,36 @@ public enum QuestsTranslatableMessage implements TranslatableMessage { * *

    Placeholders: {permission}

    */ - QUESTS_REQUIREMENTS_REQUIRED_PERMISSION_ITEM; + QUESTS_REQUIREMENTS_REQUIRED_PERMISSION_ITEM, + + /** + * The format for a quest's reach area name + * + *

    Placeholders: {name}

    + */ + QUESTS_REACH_AREA_NAME_FORMAT, + + /** + * The format for a quest's reach area's description + * + *

    Placeholders: {areaName}, {questName}

    + */ + QUESTS_REACH_AREA_DESCRIPTION_FORMAT, + + /** + * The format for a quest's kill area name + * + *

    Placeholders: {name}

    + */ + QUESTS_KILL_AREA_NAME_FORMAT, + + /** + * The format for a quest's kill area description + * + *

    Placeholders: {areaName}, {questName}, {mobName}, {mobAmount}

    + */ + QUESTS_KILL_AREA_DESCRIPTION_FORMAT, + ; @Override public TranslatableMessage[] getAllMessages() { diff --git a/src/main/java/net/knarcraft/dynmapcitizens/handler/trait/quests/QuestAreaHandler.java b/src/main/java/net/knarcraft/dynmapcitizens/handler/trait/quests/QuestAreaHandler.java index 25cf000..d8757fa 100644 --- a/src/main/java/net/knarcraft/dynmapcitizens/handler/trait/quests/QuestAreaHandler.java +++ b/src/main/java/net/knarcraft/dynmapcitizens/handler/trait/quests/QuestAreaHandler.java @@ -3,9 +3,13 @@ package net.knarcraft.dynmapcitizens.handler.trait.quests; import me.blackvein.quests.QuestsAPI; import me.blackvein.quests.quests.IQuest; import me.blackvein.quests.quests.IStage; +import net.knarcraft.dynmapcitizens.DynmapCitizens; import net.knarcraft.dynmapcitizens.settings.QuestsSettings; import net.knarcraft.dynmapcitizens.util.DynmapHelper; import net.knarcraft.dynmapcitizens.util.QuestsHelper; +import net.knarcraft.knarlib.formatting.StringFormatter; +import net.knarcraft.knarlib.formatting.StringReplacer; +import net.knarcraft.knarlib.formatting.Translator; import org.bukkit.Location; import org.bukkit.entity.EntityType; import org.dynmap.DynmapAPI; @@ -14,6 +18,11 @@ import org.dynmap.markers.MarkerSet; import java.util.List; +import static net.knarcraft.dynmapcitizens.formatting.QuestsTranslatableMessage.QUESTS_KILL_AREA_DESCRIPTION_FORMAT; +import static net.knarcraft.dynmapcitizens.formatting.QuestsTranslatableMessage.QUESTS_KILL_AREA_NAME_FORMAT; +import static net.knarcraft.dynmapcitizens.formatting.QuestsTranslatableMessage.QUESTS_REACH_AREA_DESCRIPTION_FORMAT; +import static net.knarcraft.dynmapcitizens.formatting.QuestsTranslatableMessage.QUESTS_REACH_AREA_NAME_FORMAT; + /** * A handler class for quest areas */ @@ -24,6 +33,7 @@ public class QuestAreaHandler { private final MarkerSet reachAreaMarkerSet; private final QuestsSettings settings; private final List unavailableQuests; + private final StringFormatter formatter; /** * Instantiates a new quest area handler @@ -38,6 +48,7 @@ public class QuestAreaHandler { this.questsAPI = questsAPI; this.settings = settings; this.unavailableQuests = unavailableQuests; + this.formatter = DynmapCitizens.getFormatter(); killAreaMarkerSet = DynmapHelper.initializeMarkerSet(dynmapAPI, settings.getKillAreaSettings()); reachAreaMarkerSet = DynmapHelper.initializeMarkerSet(dynmapAPI, settings.getReachAreaSettings()); } @@ -75,11 +86,16 @@ public class QuestAreaHandler { Location location = stage.getLocationsToReach().get(i); int radius = stage.getRadiiToReachWithin().get(i); String areaName = stage.getLocationNames().get(i); - String description = ""; + + String formattedAreaName; if (areaName != null) { - description += "" + areaName + "
    "; + formattedAreaName = formatter.replacePlaceholder(QUESTS_REACH_AREA_NAME_FORMAT, "{name}", areaName); + } else { + formattedAreaName = ""; } - description += "Target location for " + quest.getName(); + + String description = formatter.replacePlaceholders(QUESTS_REACH_AREA_DESCRIPTION_FORMAT, + new String[]{"{areaName}", "{questName}"}, new String[]{formattedAreaName, quest.getName()}); DynmapHelper.markLocation(location, radius, description, reachAreaMarkerSet, settings.getReachAreaSettings()); } } @@ -101,13 +117,20 @@ public class QuestAreaHandler { int mobAmount = stage.getMobNumToKill().get(i); String areaName = stage.getKillNames().get(i); - String description = ""; + String formattedAreaName; if (areaName != null) { - description += "" + areaName + "
    "; + formattedAreaName = formatter.replacePlaceholder(QUESTS_KILL_AREA_NAME_FORMAT, "{name}", areaName); + } else { + formattedAreaName = ""; } - description += "Kill location for " + quest.getName() + - "
    Kill " + QuestsHelper.normalizeName(mob.name()) + " x " + mobAmount; - DynmapHelper.markLocation(location, radius, description, killAreaMarkerSet, settings.getKillAreaSettings()); + + Translator translator = DynmapCitizens.getTranslator(); + StringReplacer replacer = new StringReplacer(translator.getTranslatedMessage(QUESTS_KILL_AREA_DESCRIPTION_FORMAT)); + replacer.add("{areaName}", formattedAreaName); + replacer.add("{questName}", quest.getName()); + replacer.add("{mobName}", QuestsHelper.normalizeName(mob.name())); + replacer.add("{mobAmount}", String.valueOf(mobAmount)); + DynmapHelper.markLocation(location, radius, replacer.replace(), killAreaMarkerSet, settings.getKillAreaSettings()); } } diff --git a/src/main/resources/strings.yml b/src/main/resources/strings.yml index e4c183d..21803ac 100644 --- a/src/main/resources/strings.yml +++ b/src/main/resources/strings.yml @@ -52,6 +52,10 @@ en: QUESTS_REQUIREMENTS_MC_MMO_SKILL: "
  • Requires mcMMO skill {skill} at level {level}
  • " QUESTS_REQUIREMENTS_REQUIRED_PERMISSION_FORMAT: "
  • Required permissions:
      {permissions}
  • " QUESTS_REQUIREMENTS_REQUIRED_PERMISSION_ITEM: "
  • {permission}
  • " + QUESTS_REACH_AREA_NAME_FORMAT: "{name}
    " + QUESTS_REACH_AREA_DESCRIPTION_FORMAT: "{areaName}Target location for {questName}" + QUESTS_KILL_AREA_NAME_FORMAT: "{name}
    " + QUESTS_KILL_AREA_DESCRIPTION_FORMAT: "{areaName}Kill location for {questName}
    Kill {mobName} x {mobAmount}" DURATION_FORMAT: "in {time} {unit}" UNIT_NOW: "imminently" UNIT_SECOND: "second" From 56753efbc79f3ca7a2ff4fc61e2e2588e04ba688 Mon Sep 17 00:00:00 2001 From: EpicKnarvik97 Date: Sat, 26 Nov 2022 14:36:59 +0100 Subject: [PATCH 08/16] Adds Jenkinsfile --- Jenkinsfile | 27 +++++++++++++++++++++++++++ pom.xml | 14 ++++++++++++++ 2 files changed, 41 insertions(+) create mode 100644 Jenkinsfile diff --git a/Jenkinsfile b/Jenkinsfile new file mode 100644 index 0000000..5a47c8f --- /dev/null +++ b/Jenkinsfile @@ -0,0 +1,27 @@ +pipeline { + agent any + tools { + jdk 'JDK17' + } + stages { + stage('Build') { + steps { + echo 'Building...' + sh 'mvn clean & mvn validate & mvn compile' + } + } + stage('Test') { + steps { + echo 'Testing...' + sh 'mvn test' + } + } + stage('Deploy') { + steps { + echo 'Deploying...' + sh 'mvn verify -Dmaven.test.skip=true' + archiveArtifacts artifacts: '**/target/*.jar', fingerprint: true + } + } + } +} \ No newline at end of file diff --git a/pom.xml b/pom.xml index dbb4859..f0cce07 100644 --- a/pom.xml +++ b/pom.xml @@ -68,6 +68,10 @@ + + gitea + https://git.knarcraft.net/api/packages/EpicKnarvik97/maven + codemc-repo https://repo.codemc.io/repository/maven-public/ @@ -93,6 +97,16 @@ https://nexus.hc.to/content/repositories/pub_releases + + + gitea + https://git.knarcraft.net/api/packages/EpicKnarvik97/maven + + + gitea + https://git.knarcraft.net/api/packages/EpicKnarvik97/maven + + From 633f61c54cdb1914f2bc73040e2d8bb3b7c0419b Mon Sep 17 00:00:00 2001 From: EpicKnarvik97 Date: Sat, 26 Nov 2022 14:47:00 +0100 Subject: [PATCH 09/16] Updates blacksmith version --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index f0cce07..205eb27 100644 --- a/pom.xml +++ b/pom.xml @@ -149,7 +149,7 @@ net.knarcraft blacksmith - 1.0.1-SNAPSHOT + 1.0.3-SNAPSHOT provided From e14607140f1de677a620d082ba8ff0d9bc2e2813 Mon Sep 17 00:00:00 2001 From: EpicKnarvik97 Date: Sat, 26 Nov 2022 14:52:47 +0100 Subject: [PATCH 10/16] Adds auto-deploy --- Jenkinsfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Jenkinsfile b/Jenkinsfile index 5a47c8f..0161ab8 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -19,7 +19,7 @@ pipeline { stage('Deploy') { steps { echo 'Deploying...' - sh 'mvn verify -Dmaven.test.skip=true' + sh 'mvn verify -Dmaven.test.skip=true & mvn deploy' archiveArtifacts artifacts: '**/target/*.jar', fingerprint: true } } From 06d63bd6fc0bbd88bf6d8f1199cd85e85bc8ce56 Mon Sep 17 00:00:00 2001 From: EpicKnarvik97 Date: Sat, 26 Nov 2022 15:08:16 +0100 Subject: [PATCH 11/16] Prevents install in deploy phase --- Jenkinsfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Jenkinsfile b/Jenkinsfile index 0161ab8..60ab688 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -19,7 +19,7 @@ pipeline { stage('Deploy') { steps { echo 'Deploying...' - sh 'mvn verify -Dmaven.test.skip=true & mvn deploy' + sh 'mvn verify -Dmaven.test.skip=true & mvn deploy -Dmaven.install.skip=true -Dmaven.test.skip=true' archiveArtifacts artifacts: '**/target/*.jar', fingerprint: true } } From 22e0e6a55e7531eaacd4b37da351ce11a49683cf Mon Sep 17 00:00:00 2001 From: EpicKnarvik97 Date: Sat, 26 Nov 2022 15:12:17 +0100 Subject: [PATCH 12/16] Splits verify and deploy steps --- Jenkinsfile | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/Jenkinsfile b/Jenkinsfile index 60ab688..2e16cba 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -16,10 +16,16 @@ pipeline { sh 'mvn test' } } + stage('Verify') { + steps { + echo 'Verifying...' + sh 'mvn verify -Dmaven.test.skip=true' + } + } stage('Deploy') { steps { echo 'Deploying...' - sh 'mvn verify -Dmaven.test.skip=true & mvn deploy -Dmaven.install.skip=true -Dmaven.test.skip=true' + sh 'mvn deploy -Dmaven.install.skip=true -Dmaven.test.skip=true' archiveArtifacts artifacts: '**/target/*.jar', fingerprint: true } } From 3e7fed9e3fb925826afe99ec1e8bf9e89e86df8f Mon Sep 17 00:00:00 2001 From: EpicKnarvik97 Date: Sat, 26 Nov 2022 15:38:04 +0100 Subject: [PATCH 13/16] Fixes a repo name --- pom.xml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/pom.xml b/pom.xml index 205eb27..c7e7e64 100644 --- a/pom.xml +++ b/pom.xml @@ -69,7 +69,7 @@ - gitea + knarcraft-repo https://git.knarcraft.net/api/packages/EpicKnarvik97/maven @@ -99,11 +99,11 @@ - gitea + knarcraft-repo https://git.knarcraft.net/api/packages/EpicKnarvik97/maven - gitea + knarcraft-repo https://git.knarcraft.net/api/packages/EpicKnarvik97/maven From 5618be7f99c26d047329fadb5d2236729f45a31a Mon Sep 17 00:00:00 2001 From: EpicKnarvik97 Date: Thu, 22 Dec 2022 13:10:34 +0100 Subject: [PATCH 14/16] Adds missing stage info about NPCs to talk to --- .../handler/trait/quests/QuestStagesInfoGenerator.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/main/java/net/knarcraft/dynmapcitizens/handler/trait/quests/QuestStagesInfoGenerator.java b/src/main/java/net/knarcraft/dynmapcitizens/handler/trait/quests/QuestStagesInfoGenerator.java index da57be3..daf26a3 100644 --- a/src/main/java/net/knarcraft/dynmapcitizens/handler/trait/quests/QuestStagesInfoGenerator.java +++ b/src/main/java/net/knarcraft/dynmapcitizens/handler/trait/quests/QuestStagesInfoGenerator.java @@ -90,6 +90,9 @@ public class QuestStagesInfoGenerator { for (UUID npcId : stage.getNpcsToKill()) { questInfo.append("
  • Kill NPC ").append(registry.getByUniqueId(npcId).getName()).append("
  • "); } + for (UUID npcId : stage.getNpcsToInteract()) { + questInfo.append("
  • Talk to ").append(registry.getByUniqueId(npcId).getName()).append("
  • "); + } questInfo.append(getQuestItemsTaskString(stage.getBlocksToBreak(), "
  • Break ")).append("
  • "); questInfo.append(getQuestItemsTaskString(stage.getBlocksToCut(), "
  • Cut ")).append("
  • "); From 9312e2156bc12fca68063458d6798d5ee68d8942 Mon Sep 17 00:00:00 2001 From: EpicKnarvik97 Date: Wed, 12 Apr 2023 02:34:09 +0200 Subject: [PATCH 15/16] Updates to account for some changes in quests --- pom.xml | 20 ++++----- .../dynmapcitizens/DynmapCitizens.java | 2 +- .../QuestRequirementsInfoGenerator.java | 44 ++++++++++++++----- .../handler/trait/quests/QuestsHandler.java | 2 +- 4 files changed, 45 insertions(+), 23 deletions(-) diff --git a/pom.xml b/pom.xml index c7e7e64..efbf2ea 100644 --- a/pom.xml +++ b/pom.xml @@ -93,8 +93,8 @@ https://repo.citizensnpcs.co/ - vault-repo - https://nexus.hc.to/content/repositories/pub_releases + jitpack.io + https://jitpack.io @@ -112,7 +112,7 @@ org.spigotmc spigot-api - 1.19.2-R0.1-SNAPSHOT + 1.19.4-R0.1-SNAPSHOT provided @@ -131,13 +131,13 @@ me.blackvein.quests quests-api - 4.6.0 + 4.8.1 provided me.blackvein.quests quests-core - 4.6.0 + 4.8.1 provided @@ -149,7 +149,7 @@ net.knarcraft blacksmith - 1.0.3-SNAPSHOT + 1.0.4-SNAPSHOT provided @@ -159,15 +159,15 @@ provided - net.milkbowl.vault - Vault - 1.7.3 + com.github.MilkBowl + VaultAPI + 1.7 provided net.knarcraft knarlib - 1.0-SNAPSHOT + 1.1 compile diff --git a/src/main/java/net/knarcraft/dynmapcitizens/DynmapCitizens.java b/src/main/java/net/knarcraft/dynmapcitizens/DynmapCitizens.java index 010f928..bb043c9 100644 --- a/src/main/java/net/knarcraft/dynmapcitizens/DynmapCitizens.java +++ b/src/main/java/net/knarcraft/dynmapcitizens/DynmapCitizens.java @@ -62,7 +62,7 @@ public final class DynmapCitizens extends JavaPlugin { translator.registerMessageCategory(TranslatableTimeUnit.UNIT_SECOND); translator.registerMessageCategory(QuestsTranslatableMessage.QUESTS_REQUIREMENTS_FORMAT); translator.registerMessageCategory(SentinelTranslatableMessage.SENTINEL_DESCRIPTION); - translator.loadLanguages(this.getDataFolder(), "en"); + translator.loadLanguages(this.getDataFolder(), "en", "en"); stringFormatter = new StringFormatter(this.getDescription().getName(), translator); //Initialize all enabled traits diff --git a/src/main/java/net/knarcraft/dynmapcitizens/handler/trait/quests/QuestRequirementsInfoGenerator.java b/src/main/java/net/knarcraft/dynmapcitizens/handler/trait/quests/QuestRequirementsInfoGenerator.java index e2a9a6d..03f2dc0 100644 --- a/src/main/java/net/knarcraft/dynmapcitizens/handler/trait/quests/QuestRequirementsInfoGenerator.java +++ b/src/main/java/net/knarcraft/dynmapcitizens/handler/trait/quests/QuestRequirementsInfoGenerator.java @@ -1,5 +1,6 @@ package net.knarcraft.dynmapcitizens.handler.trait.quests; +import me.blackvein.quests.QuestsAPI; import me.blackvein.quests.quests.IQuest; import me.blackvein.quests.quests.Requirements; import net.knarcraft.dynmapcitizens.DynmapCitizens; @@ -31,15 +32,18 @@ import static net.knarcraft.dynmapcitizens.formatting.QuestsTranslatableMessage. */ public class QuestRequirementsInfoGenerator { + private final QuestsAPI questsAPI; private final IQuest quest; private final StringFormatter formatter; /** * Instantiates a new quest requirement info generator * - * @param quest

    The quest to generate information about

    + * @param questsAPI

    The API to use for getting quest information

    + * @param quest

    The quest to generate information about

    */ - public QuestRequirementsInfoGenerator(IQuest quest) { + public QuestRequirementsInfoGenerator(QuestsAPI questsAPI, IQuest quest) { + this.questsAPI = questsAPI; this.quest = quest; formatter = DynmapCitizens.getFormatter(); } @@ -68,14 +72,14 @@ public class QuestRequirementsInfoGenerator { QUESTS_REQUIREMENTS_EXP, "{exp}", String.valueOf(requirements.getExp())) : ""); //Add info about blocking quests - replacer.add("{requirementBlockedByQuests}", !requirements.getBlockQuests().isEmpty() ? - getRequirementList(getQuestNames(requirements.getBlockQuests()), + replacer.add("{requirementBlockedByQuests}", !requirements.getBlockQuestIds().isEmpty() ? + getRequirementList(getQuestNames(requirements.getBlockQuestIds()), QUESTS_REQUIREMENTS_BLOCKED_BY_QUEST_FORMAT, "{blockingQuests}", QUESTS_REQUIREMENTS_BLOCKED_BY_QUEST_ITEM, "{questName}") : ""); //Add info about required quests - replacer.add("{requirementRequiredQuests}", !requirements.getNeededQuests().isEmpty() ? - getRequirementList(getQuestNames(requirements.getNeededQuests()), + replacer.add("{requirementRequiredQuests}", !requirements.getBlockQuestIds().isEmpty() ? + getRequirementList(getQuestNames(requirements.getBlockQuestIds()), QUESTS_REQUIREMENTS_REQUIRED_QUEST_FORMAT, "{requiredQuests}", QUESTS_REQUIREMENTS_REQUIRED_QUEST_ITEM, "{questName}") : ""); @@ -138,17 +142,35 @@ public class QuestRequirementsInfoGenerator { /** * Gets a list of the quest names for the given quests * - * @param quests

    The quests to get names for

    + * @param questIds

    The quests to get names for

    * @return

    A list of quest names

    */ - private List getQuestNames(List quests) { - List questNames = new ArrayList<>(quests.size()); - for (IQuest quest : quests) { - questNames.add(quest.getName()); + private List getQuestNames(List questIds) { + List questNames = new ArrayList<>(questIds.size()); + for (String questId : questIds) { + IQuest quest = getQuest(questId); + if (quest != null) { + questNames.add(quest.getName()); + } } return questNames; } + /** + * Gets the quest with the given id + * + * @param questId

    The id of the quest to get

    + * @return

    The quest, or null if not found

    + */ + private IQuest getQuest(String questId) { + for (IQuest quest : questsAPI.getLoadedQuests()) { + if (quest.getId().equals(questId)) { + return quest; + } + } + return null; + } + /** * Gets a string for the given list of requirements * diff --git a/src/main/java/net/knarcraft/dynmapcitizens/handler/trait/quests/QuestsHandler.java b/src/main/java/net/knarcraft/dynmapcitizens/handler/trait/quests/QuestsHandler.java index 3b928a0..b68cf7c 100644 --- a/src/main/java/net/knarcraft/dynmapcitizens/handler/trait/quests/QuestsHandler.java +++ b/src/main/java/net/knarcraft/dynmapcitizens/handler/trait/quests/QuestsHandler.java @@ -163,7 +163,7 @@ public class QuestsHandler extends AbstractTraitHandler { stringBuilder.append(new QuestRewardsInfoGenerator(quest).getQuestRewardsInfo()); } if (settings.displayRequirementInfo()) { - stringBuilder.append(new QuestRequirementsInfoGenerator(quest).getQuestRequirementsInfo()); + stringBuilder.append(new QuestRequirementsInfoGenerator(questsAPI, quest).getQuestRequirementsInfo()); } if (settings.displayPlannerInfo()) { stringBuilder.append(new QuestPlannerInfoGenerator(quest).getQuestPlannerInfo()); From 88bf1b28c24279420c70b41854c9aa18c96c5140 Mon Sep 17 00:00:00 2001 From: EpicKnarvik97 Date: Mon, 21 Aug 2023 22:38:07 +0200 Subject: [PATCH 16/16] Adds icons for trader NPCs --- README.MD | 6 ++- pom.xml | 2 +- .../dynmapcitizens/DynmapCitizens.java | 5 ++ .../handler/trait/DTLTradersHandler.java | 53 +++++++++++++++++++ .../trait/quests/QuestAreaHandler.java | 2 +- .../dynmapcitizens/property/Icon.java | 7 ++- .../settings/DTLTradersSettings.java | 20 +++++++ .../settings/GlobalSettings.java | 1 + src/main/resources/config.yml | 15 +++++- 9 files changed, 106 insertions(+), 5 deletions(-) create mode 100644 src/main/java/net/knarcraft/dynmapcitizens/handler/trait/DTLTradersHandler.java create mode 100644 src/main/java/net/knarcraft/dynmapcitizens/settings/DTLTradersSettings.java diff --git a/README.MD b/README.MD index 0bb4429..610ba4e 100644 --- a/README.MD +++ b/README.MD @@ -14,4 +14,8 @@ basis, and possibly choosing exactly what information to display on each trait's - [Blacksmith](https://www.spigotmc.org/resources/blacksmith.105938/) - [Quests](https://www.spigotmc.org/resources/quests.3711/) - [Sentinel](https://www.spigotmc.org/resources/sentinel.22017/) -- [Minstrel](https://git.knarcraft.net/EpicKnarvik97/Minstrel) \ No newline at end of file +- [Minstrel](https://git.knarcraft.net/EpicKnarvik97/Minstrel) + +## Somewhat supported NPC traits, because the developers have no API + +- [Trader](https://www.spigotmc.org/resources/dtltraders.35890/) \ No newline at end of file diff --git a/pom.xml b/pom.xml index efbf2ea..e3393cf 100644 --- a/pom.xml +++ b/pom.xml @@ -167,7 +167,7 @@ net.knarcraft knarlib - 1.1 + 1.2.3 compile diff --git a/src/main/java/net/knarcraft/dynmapcitizens/DynmapCitizens.java b/src/main/java/net/knarcraft/dynmapcitizens/DynmapCitizens.java index bb043c9..265f09d 100644 --- a/src/main/java/net/knarcraft/dynmapcitizens/DynmapCitizens.java +++ b/src/main/java/net/knarcraft/dynmapcitizens/DynmapCitizens.java @@ -5,6 +5,7 @@ import net.knarcraft.dynmapcitizens.formatting.SentinelTranslatableMessage; import net.knarcraft.dynmapcitizens.handler.VaultHandler; import net.knarcraft.dynmapcitizens.handler.trait.BlacksmithHandler; import net.knarcraft.dynmapcitizens.handler.trait.CitizensTraitHandler; +import net.knarcraft.dynmapcitizens.handler.trait.DTLTradersHandler; import net.knarcraft.dynmapcitizens.handler.trait.MinstrelHandler; import net.knarcraft.dynmapcitizens.handler.trait.SentinelHandler; import net.knarcraft.dynmapcitizens.handler.trait.quests.QuestsHandler; @@ -23,6 +24,9 @@ import java.util.ArrayList; import java.util.List; import java.util.logging.Level; +/** + * DynmapCitizens' main class + */ @SuppressWarnings("unused") public final class DynmapCitizens extends JavaPlugin { @@ -151,6 +155,7 @@ public final class DynmapCitizens extends JavaPlugin { this.traitHandlers.add(new QuestsHandler()); this.traitHandlers.add(new SentinelHandler()); this.traitHandlers.add(new MinstrelHandler()); + this.traitHandlers.add(new DTLTradersHandler()); //Load and initialize all enabled trait handlers for (CitizensTraitHandler handler : this.traitHandlers) { diff --git a/src/main/java/net/knarcraft/dynmapcitizens/handler/trait/DTLTradersHandler.java b/src/main/java/net/knarcraft/dynmapcitizens/handler/trait/DTLTradersHandler.java new file mode 100644 index 0000000..9657fda --- /dev/null +++ b/src/main/java/net/knarcraft/dynmapcitizens/handler/trait/DTLTradersHandler.java @@ -0,0 +1,53 @@ +package net.knarcraft.dynmapcitizens.handler.trait; + +import net.citizensnpcs.api.CitizensAPI; +import net.citizensnpcs.api.npc.NPC; +import net.citizensnpcs.api.trait.Trait; +import net.knarcraft.dynmapcitizens.DynmapCitizens; +import net.knarcraft.dynmapcitizens.property.Icon; +import net.knarcraft.dynmapcitizens.settings.DTLTradersSettings; +import net.knarcraft.dynmapcitizens.settings.TraitSettings; +import org.dynmap.markers.GenericMarker; + +/** + * A handler class for the minstrel trait + */ +public class DTLTradersHandler extends AbstractTraitHandler { + + private final DTLTradersSettings settings = new DTLTradersSettings(); + + @Override + public void initialize() { + super.isEnabled = false; + CitizensAPI.getTraitFactory().getRegisteredTraits().forEach(traitInfo -> { + if (traitInfo.getTraitName().equals("trader")) { + super.isEnabled = true; + } + }); + + if (this.isEnabled) { + super.initializeMarkerSet(); + } + } + + @Override + public TraitSettings getSettings() { + return this.settings; + } + + @Override + public void updateMarkers() { + //Remove existing markers + super.markerSet.getMarkers().forEach(GenericMarker::deleteMarker); + + Class traderTrait = CitizensAPI.getTraitFactory().getTraitClass("trader"); + for (NPC npc : CitizensAPI.getNPCRegistry()) { + if (npc.hasTrait(traderTrait)) { + String description = "

    " + npc.getName() + "

    "; + addNPCMarker(npc.getUniqueId(), "Trader NPC: ", description, + DynmapCitizens.getInstance().getGlobalSettings().getMarkerIcons().get(Icon.TRADER), super.markerSet); + } + } + } + +} diff --git a/src/main/java/net/knarcraft/dynmapcitizens/handler/trait/quests/QuestAreaHandler.java b/src/main/java/net/knarcraft/dynmapcitizens/handler/trait/quests/QuestAreaHandler.java index d8757fa..adf80b8 100644 --- a/src/main/java/net/knarcraft/dynmapcitizens/handler/trait/quests/QuestAreaHandler.java +++ b/src/main/java/net/knarcraft/dynmapcitizens/handler/trait/quests/QuestAreaHandler.java @@ -93,7 +93,7 @@ public class QuestAreaHandler { } else { formattedAreaName = ""; } - + String description = formatter.replacePlaceholders(QUESTS_REACH_AREA_DESCRIPTION_FORMAT, new String[]{"{areaName}", "{questName}"}, new String[]{formattedAreaName, quest.getName()}); DynmapHelper.markLocation(location, radius, description, reachAreaMarkerSet, settings.getReachAreaSettings()); diff --git a/src/main/java/net/knarcraft/dynmapcitizens/property/Icon.java b/src/main/java/net/knarcraft/dynmapcitizens/property/Icon.java index b0b5ee0..5f2f949 100644 --- a/src/main/java/net/knarcraft/dynmapcitizens/property/Icon.java +++ b/src/main/java/net/knarcraft/dynmapcitizens/property/Icon.java @@ -43,6 +43,11 @@ public enum Icon { /** * An icon representing a minstrel NPC */ - MINSTREL + MINSTREL, + + /** + * An icon representing a trader NPC + */ + TRADER, } diff --git a/src/main/java/net/knarcraft/dynmapcitizens/settings/DTLTradersSettings.java b/src/main/java/net/knarcraft/dynmapcitizens/settings/DTLTradersSettings.java new file mode 100644 index 0000000..80b3593 --- /dev/null +++ b/src/main/java/net/knarcraft/dynmapcitizens/settings/DTLTradersSettings.java @@ -0,0 +1,20 @@ +package net.knarcraft.dynmapcitizens.settings; + +import org.bukkit.configuration.file.FileConfiguration; + +/** + * All settings for the minstrel trait + */ +public class DTLTradersSettings extends AbstractTraitSettings { + + @Override + public void load(FileConfiguration configuration) { + super.load(configuration); + } + + @Override + protected String getTraitConfigRoot() { + return "traits.trader"; + } + +} diff --git a/src/main/java/net/knarcraft/dynmapcitizens/settings/GlobalSettings.java b/src/main/java/net/knarcraft/dynmapcitizens/settings/GlobalSettings.java index a7fe753..47f70bd 100644 --- a/src/main/java/net/knarcraft/dynmapcitizens/settings/GlobalSettings.java +++ b/src/main/java/net/knarcraft/dynmapcitizens/settings/GlobalSettings.java @@ -82,6 +82,7 @@ public class GlobalSettings { case BLACKSMITH -> "hammer"; case SENTINEL -> "shield"; case MINSTREL -> "theater"; + case TRADER -> "coins"; }; } diff --git a/src/main/resources/config.yml b/src/main/resources/config.yml index 9dd6bdc..95ef02b 100644 --- a/src/main/resources/config.yml +++ b/src/main/resources/config.yml @@ -16,6 +16,8 @@ icon: SENTINEL: "shield" # The marker used for minstrels MINSTREL: "theater" + # The marker used for traders + TRADER: "coins" # Settings for how often markers will be updated timer: @@ -129,4 +131,15 @@ traits: # Whether to hide the minstrel icon layer by default markersHiddenByDefault: false # Whether to display the list of songs a minstrel is playing - displayMinstrelSongs: true \ No newline at end of file + displayMinstrelSongs: true + # Settings for the trader trait + trader: + enabled: true + # The priority of trader markers. Higher priority markers will display on top of lower priority ones + markerSetPriority: 1 + # The id of the trader marker set. Change if it overlaps with an existing set id + markerSetId: "traders" + # The name of the trader marker set. Change it if you want a cooler name + markerSetName: "Traders" + # Whether to hide the trader icon layer by default + markersHiddenByDefault: false \ No newline at end of file