From 65cf9c9b5283428678755436b7d5f1d4d1b661df Mon Sep 17 00:00:00 2001 From: EpicKnarvik97 Date: Sun, 5 May 2024 02:27:51 +0200 Subject: [PATCH] Makes a bunch of strings configurable --- pom.xml | 10 +- .../formatting/QuestsTranslatableMessage.java | 105 +++++++++++++++++- .../handler/trait/BlacksmithHandler.java | 40 ++++++- .../quests/QuestPlannerInfoGenerator.java | 50 +++++---- .../quests/QuestRewardsInfoGenerator.java | 52 ++++++--- .../handler/trait/quests/QuestsHandler.java | 76 ++++++++----- .../dynmapcitizens/property/Icon.java | 5 + .../settings/GlobalSettings.java | 1 + src/main/resources/config.yml | 2 + src/main/resources/strings.yml | 26 ++++- 10 files changed, 285 insertions(+), 82 deletions(-) diff --git a/pom.xml b/pom.xml index d95b7c6..e10c30b 100644 --- a/pom.xml +++ b/pom.xml @@ -63,12 +63,6 @@ org/jetbrains/annotations/** - - - *.MF - *.yml - - @@ -159,7 +153,7 @@ net.knarcraft blacksmith - 1.0.4-SNAPSHOT + 1.1.0-SNAPSHOT provided @@ -177,7 +171,7 @@ net.knarcraft knarlib - 1.2.6 + 1.2.7 compile diff --git a/src/main/java/net/knarcraft/dynmapcitizens/formatting/QuestsTranslatableMessage.java b/src/main/java/net/knarcraft/dynmapcitizens/formatting/QuestsTranslatableMessage.java index 1b56b61..584a5e2 100644 --- a/src/main/java/net/knarcraft/dynmapcitizens/formatting/QuestsTranslatableMessage.java +++ b/src/main/java/net/knarcraft/dynmapcitizens/formatting/QuestsTranslatableMessage.java @@ -45,7 +45,12 @@ public enum QuestsTranslatableMessage implements TranslatableMessage { * *

Placeholders: {repeatDelay}

*/ - QUEST_PLANNER_REPEAT, + QUESTS_PLANNER_REPEAT, + + /** + * The format for displaying a planner timestamp + */ + QUESTS_PLANNER_TIMESTAMP_FORMAT, /** * The format for a quest's requirements @@ -160,6 +165,104 @@ public enum QuestsTranslatableMessage implements TranslatableMessage { *

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

*/ QUESTS_KILL_AREA_DESCRIPTION_FORMAT, + + /** + * The format for a quest's rewards + * + *

Placeholders: {money}, {experience}, {questPoints}, {permissions}, {items}, {commands}

+ */ + QUESTS_REWARDS_FORMAT, + + /** + * The format for a quest's money reward + * + *

Placeholders: {amount}, {currency}

+ */ + QUESTS_REWARDS_MONEY, + + /** + * The format for a quest's experience reward + * + *

Placeholders: {amount}

+ */ + QUESTS_REWARDS_EXPERIENCE, + + /** + * The format for a quest's quest point reward + * + *

Placeholders: {amount}

+ */ + QUESTS_REWARDS_QUEST_POINTS, + + /** + * The format for one of a quest's permission rewards + * + *

Placeholders: {permission}

+ */ + QUESTS_REWARDS_PERMISSION, + + /** + * The format for one of a quest's item rewards + * + *

Placeholders: {item}

+ */ + QUESTS_REWARDS_ITEM, + + /** + * The format for one of a quest's command rewards + * + *

Placeholders: {command}

+ */ + QUESTS_REWARDS_COMMAND, + + /** + * The format for displaying a quest marker name + * + *

Placeholders: {name}

+ */ + QUESTS_MARKER_NAME_FORMAT, + + /** + * The format for displaying offered quests on a quest NPC marker + * + *

Placeholders: {quests}

+ */ + QUESTS_OFFERED_FORMAT, + + /** + * The format for displaying one of the quests on a quest NPC marker + * + *

Placeholders: {name}, {description}, {stages}, {rewards}, {requirements}, {planner}

+ */ + QUESTS_OFFERED_QUEST_FORMAT, + + /** + * The format for displaying the different quests an NPC is involved in + * + *

Placeholders: {involvedQuests}

+ */ + QUESTS_INVOLVED_IN_FORMAT, + + /** + * The format for displaying that the NPC is a kill target in a quest + * + *

Placeholders: {questName}

+ */ + QUESTS_INVOLVED_IN_KILL, + + /** + * The format for displaying that the NPC is a delivery target in a quest + * + *

Placeholders: {questName}

+ */ + QUESTS_INVOLVED_IN_DELIVERY_TARGET, + + /** + * The format for displaying that the NPC is a interaction target in a quest + * + *

Placeholders: {questName}

+ */ + QUESTS_INVOLVED_IN_INTERACT, ; @Override diff --git a/src/main/java/net/knarcraft/dynmapcitizens/handler/trait/BlacksmithHandler.java b/src/main/java/net/knarcraft/dynmapcitizens/handler/trait/BlacksmithHandler.java index eb06ea9..b9bf7be 100644 --- a/src/main/java/net/knarcraft/dynmapcitizens/handler/trait/BlacksmithHandler.java +++ b/src/main/java/net/knarcraft/dynmapcitizens/handler/trait/BlacksmithHandler.java @@ -4,8 +4,10 @@ import net.citizensnpcs.api.CitizensAPI; import net.citizensnpcs.api.npc.NPC; import net.citizensnpcs.api.trait.Trait; import net.knarcraft.blacksmith.BlacksmithPlugin; -import net.knarcraft.blacksmith.config.NPCSettings; +import net.knarcraft.blacksmith.config.blacksmith.BlacksmithNPCSettings; +import net.knarcraft.blacksmith.config.scrapper.ScrapperNPCSettings; import net.knarcraft.blacksmith.trait.BlacksmithTrait; +import net.knarcraft.blacksmith.trait.ScrapperTrait; import net.knarcraft.dynmapcitizens.DynmapCitizens; import net.knarcraft.dynmapcitizens.property.Icon; import net.knarcraft.dynmapcitizens.settings.BlacksmithSettings; @@ -48,6 +50,7 @@ public class BlacksmithHandler extends AbstractTraitHandler { super.markerSet.getMarkers().forEach(GenericMarker::deleteMarker); Class blacksmithTrait = CitizensAPI.getTraitFactory().getTraitClass("blacksmith"); + Class scrapperTrait = CitizensAPI.getTraitFactory().getTraitClass("scrapper"); for (NPC npc : CitizensAPI.getNPCRegistry()) { if (npc.hasTrait(blacksmithTrait)) { BlacksmithTrait trait = npc.getTraitNullable(BlacksmithTrait.class); @@ -60,10 +63,43 @@ public class BlacksmithHandler extends AbstractTraitHandler { } addNPCMarker(npc.getUniqueId(), "Blacksmith NPC: ", description, DynmapCitizens.getInstance().getGlobalSettings().getMarkerIcons().get(Icon.BLACKSMITH), super.markerSet); + } else if (npc.hasTrait(scrapperTrait)) { + ScrapperTrait trait = npc.getTraitNullable(ScrapperTrait.class); + String description = ""; + if (trait == null) { + DynmapCitizens.getInstance().getLogger().log(Level.WARNING, "Unable to get scrapper trait"); + } else { + description = getDetailedScrapperInfo(npc, trait.getSettings()); + } + addNPCMarker(npc.getUniqueId(), "Scrapper NPC: ", description, + DynmapCitizens.getInstance().getGlobalSettings().getMarkerIcons().get(Icon.SCRAPPER), super.markerSet); } } } + /** + * Gets detailed information about a scrapper NPC + * + * @param npc

The NPC the settings belong to

+ * @param npcSettings

The settings to search for information

+ * @return

A string describing the scrapper

+ */ + private @NotNull String getDetailedScrapperInfo(@NotNull NPC npc, @NotNull ScrapperNPCSettings npcSettings) { + String info = "

" + npc.getName() + " the " + + npcSettings.getScrapperTitle() + "

"; + if (settings.displayBlacksmithSettings()) { + info += "Fail chance: " + npcSettings.getFailChance() + + "
Delay: " + + npcSettings.getMinSalvageDelay() + " to " + npcSettings.getMaxSalvageDelay() + + " seconds
Cool-down: " + npcSettings.getSalvageCoolDown() + " seconds
Drop item: " + + npcSettings.getDropItem(); + if (!npcSettings.getSalvageAbleItems().isEmpty()) { + info += "
Salvage-able items: " + getReforgeAbleItemsString(npcSettings.getSalvageAbleItems()); + } + } + return info; + } + /** * Gets detailed information about a blacksmith NPC * @@ -71,7 +107,7 @@ public class BlacksmithHandler extends AbstractTraitHandler { * @param npcSettings

The settings to search for information

* @return

A string describing the blacksmith

*/ - private @NotNull String getDetailedBlacksmithInfo(@NotNull NPC npc, @NotNull NPCSettings npcSettings) { + private @NotNull String getDetailedBlacksmithInfo(@NotNull NPC npc, @NotNull BlacksmithNPCSettings npcSettings) { String info = "

" + npc.getName() + " the " + npcSettings.getBlacksmithTitle() + "

"; if (settings.displayBlacksmithSettings()) { 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 6be7024..53b6646 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 @@ -3,6 +3,8 @@ package net.knarcraft.dynmapcitizens.handler.trait.quests; import me.pikamug.quests.quests.Quest; import me.pikamug.quests.quests.components.Planner; import net.knarcraft.dynmapcitizens.DynmapCitizens; +import net.knarcraft.knarlib.formatting.StringFormatter; +import net.knarcraft.knarlib.formatting.StringReplacer; import net.knarcraft.knarlib.formatting.TimeFormatter; import org.jetbrains.annotations.NotNull; @@ -10,12 +12,21 @@ import java.text.DateFormat; import java.text.SimpleDateFormat; import java.util.Date; +import static net.knarcraft.dynmapcitizens.formatting.QuestsTranslatableMessage.QUESTS_PLANNER_COOL_DOWN; +import static net.knarcraft.dynmapcitizens.formatting.QuestsTranslatableMessage.QUESTS_PLANNER_DESCRIPTION; +import static net.knarcraft.dynmapcitizens.formatting.QuestsTranslatableMessage.QUESTS_PLANNER_FROM; +import static net.knarcraft.dynmapcitizens.formatting.QuestsTranslatableMessage.QUESTS_PLANNER_REPEAT; +import static net.knarcraft.dynmapcitizens.formatting.QuestsTranslatableMessage.QUESTS_PLANNER_TIMESTAMP_FORMAT; +import static net.knarcraft.dynmapcitizens.formatting.QuestsTranslatableMessage.QUESTS_PLANNER_UNREPEATABLE; +import static net.knarcraft.dynmapcitizens.formatting.QuestsTranslatableMessage.QUESTS_PLANNER_UNTIL; + /** * A class to generate a string containing all information about a quest's planner info */ public class QuestPlannerInfoGenerator { private final Quest quest; + private final StringFormatter formatter; /** * Instantiates a new quest planner info generator @@ -24,6 +35,7 @@ public class QuestPlannerInfoGenerator { */ public QuestPlannerInfoGenerator(@NotNull Quest quest) { this.quest = quest; + this.formatter = DynmapCitizens.getFormatter(); } /** @@ -33,40 +45,30 @@ public class QuestPlannerInfoGenerator { */ public @NotNull String getQuestPlannerInfo() { Planner planner = quest.getPlanner(); - StringBuilder plannerInfo = new StringBuilder(); - plannerInfo.append("Planner:
    "); + StringReplacer replacer = new StringReplacer(formatter.getUnFormattedColoredMessage(QUESTS_PLANNER_DESCRIPTION)); //Quest can be repeated after a cool-down if (planner.hasCooldown()) { - plannerInfo.append("
  • Quest repeatable after: "); - plannerInfo.append(TimeFormatter.getDurationString(DynmapCitizens.getTranslator(), - planner.getCooldown() / 1000)); - plannerInfo.append("
  • "); + replacer.add("{questCoolDown}", formatter.replacePlaceholder(QUESTS_PLANNER_COOL_DOWN, "{coolDown}", + TimeFormatter.getDurationString(DynmapCitizens.getTranslator(), planner.getCooldown() / 1000))); } else { - plannerInfo.append("
  • Quest cannot be repeated!
  • "); + replacer.add("{questCoolDown}", formatter.getUnFormattedColoredMessage(QUESTS_PLANNER_UNREPEATABLE)); } //Quest only becomes available after the start date - if (planner.hasStart()) { - plannerInfo.append("
  • Quest available from "); - plannerInfo.append(formatTimestamp(planner.getStartInMillis())).append("
  • "); - } + replacer.add("{questFrom}", planner.hasStart() ? formatter.replacePlaceholder(QUESTS_PLANNER_FROM, + "{startDate}", formatTimestamp(planner.getStartInMillis())) : ""); //Quest is only available until the end date - if (planner.hasEnd()) { - plannerInfo.append("
  • Quest available until "); - plannerInfo.append(formatTimestamp(planner.getEndInMillis())).append("
  • "); - } + replacer.add("{questUntil}", planner.hasEnd() ? formatter.replacePlaceholder(QUESTS_PLANNER_UNTIL, + "{endDate}", formatTimestamp(planner.getEndInMillis())) : ""); - //Quest availability repeats - if (planner.hasRepeat()) { - plannerInfo.append("
  • Quest will become available again after "); - plannerInfo.append(TimeFormatter.getDurationString(DynmapCitizens.getTranslator(), - planner.getRepeat() / 1000)).append("
  • "); - } + //Quest availability repeats' + replacer.add("{questRepeat}", planner.hasRepeat() ? formatter.replacePlaceholder(QUESTS_PLANNER_REPEAT, + "{repeatDelay}", TimeFormatter.getDurationString(DynmapCitizens.getTranslator(), + planner.getRepeat() / 1000)) : ""); - plannerInfo.append("
"); - return plannerInfo.toString(); + return replacer.replace(); } /** @@ -76,7 +78,7 @@ public class QuestPlannerInfoGenerator { * @return

A datetime string

*/ private @NotNull String formatTimestamp(long timestamp) { - DateFormat format = new SimpleDateFormat("dd MM yyyy HH:mm:ss"); + DateFormat format = new SimpleDateFormat(formatter.getUnFormattedMessage(QUESTS_PLANNER_TIMESTAMP_FORMAT)); Date date = new Date(timestamp); return format.format(date); } diff --git a/src/main/java/net/knarcraft/dynmapcitizens/handler/trait/quests/QuestRewardsInfoGenerator.java b/src/main/java/net/knarcraft/dynmapcitizens/handler/trait/quests/QuestRewardsInfoGenerator.java index 6086ecd..661674f 100644 --- a/src/main/java/net/knarcraft/dynmapcitizens/handler/trait/quests/QuestRewardsInfoGenerator.java +++ b/src/main/java/net/knarcraft/dynmapcitizens/handler/trait/quests/QuestRewardsInfoGenerator.java @@ -2,16 +2,30 @@ package net.knarcraft.dynmapcitizens.handler.trait.quests; import me.pikamug.quests.quests.Quest; import me.pikamug.quests.quests.components.Rewards; +import net.knarcraft.dynmapcitizens.DynmapCitizens; import net.knarcraft.dynmapcitizens.util.QuestsHelper; +import net.knarcraft.knarlib.formatting.StringFormatter; +import net.knarcraft.knarlib.formatting.StringReplacer; import org.bukkit.inventory.ItemStack; import org.jetbrains.annotations.NotNull; +import java.util.List; + +import static net.knarcraft.dynmapcitizens.formatting.QuestsTranslatableMessage.QUESTS_REWARDS_COMMAND; +import static net.knarcraft.dynmapcitizens.formatting.QuestsTranslatableMessage.QUESTS_REWARDS_EXPERIENCE; +import static net.knarcraft.dynmapcitizens.formatting.QuestsTranslatableMessage.QUESTS_REWARDS_FORMAT; +import static net.knarcraft.dynmapcitizens.formatting.QuestsTranslatableMessage.QUESTS_REWARDS_ITEM; +import static net.knarcraft.dynmapcitizens.formatting.QuestsTranslatableMessage.QUESTS_REWARDS_MONEY; +import static net.knarcraft.dynmapcitizens.formatting.QuestsTranslatableMessage.QUESTS_REWARDS_PERMISSION; +import static net.knarcraft.dynmapcitizens.formatting.QuestsTranslatableMessage.QUESTS_REWARDS_QUEST_POINTS; + /** * A class to generate a string containing all information about a quest's rewards */ public class QuestRewardsInfoGenerator { private final Quest quest; + private final StringFormatter formatter; /** * Instantiates a new quest reward info generator @@ -20,6 +34,7 @@ public class QuestRewardsInfoGenerator { */ public QuestRewardsInfoGenerator(@NotNull Quest quest) { this.quest = quest; + this.formatter = DynmapCitizens.getFormatter(); } /** @@ -29,36 +44,39 @@ public class QuestRewardsInfoGenerator { */ public @NotNull String getQuestRewardsInfo() { Rewards reward = quest.getRewards(); - StringBuilder rewardInfo = new StringBuilder(); - rewardInfo.append("Rewards:
    "); + StringReplacer replacer = new StringReplacer(formatter.getUnFormattedColoredMessage(QUESTS_REWARDS_FORMAT)); - if (reward.getMoney() > 0) { - rewardInfo.append("
  • ").append(reward.getMoney()).append(" ").append(QuestsHelper.getCurrency( - reward.getMoney())).append("
  • "); - } + replacer.add("{money}", reward.getMoney() > 0 ? formatter.replacePlaceholders(QUESTS_REWARDS_MONEY, + List.of("{amount}", "{currency}"), List.of(String.valueOf(reward.getMoney()), + QuestsHelper.getCurrency(reward.getMoney()))) : ""); - if (reward.getExp() > 0) { - rewardInfo.append("
  • ").append(reward.getExp()).append(" exp").append("
  • "); - } + replacer.add("{experience}", reward.getExp() > 0 ? formatter.replacePlaceholder( + QUESTS_REWARDS_EXPERIENCE, "{amount}", String.valueOf(reward.getExp())) : ""); - if (reward.getQuestPoints() > 0) { - rewardInfo.append("
  • ").append(reward.getQuestPoints()).append(" quest point(s)").append("
  • "); - } + replacer.add("{questPoints}", reward.getQuestPoints() > 0 ? formatter.replacePlaceholder( + QUESTS_REWARDS_QUEST_POINTS, "{amount}", String.valueOf(reward.getQuestPoints())) : ""); + StringBuilder permissionBuilder = new StringBuilder(); for (String permission : reward.getPermissions()) { - rewardInfo.append("
  • ").append("Permission: ").append(permission).append("
  • "); + permissionBuilder.append(formatter.replacePlaceholder(QUESTS_REWARDS_PERMISSION, "{permission}", + permission)); } + replacer.add("{permissions}", permissionBuilder.toString()); + StringBuilder itemBuilder = new StringBuilder(); for (Object item : reward.getItems()) { - rewardInfo.append("
  • ").append(QuestsHelper.getUpperCasedItemStackString((ItemStack) item)).append("
  • "); + itemBuilder.append(formatter.replacePlaceholder(QUESTS_REWARDS_ITEM, "{item}", + QuestsHelper.getUpperCasedItemStackString((ItemStack) item))); } + replacer.add("{items}", itemBuilder.toString()); + StringBuilder commandBuilder = new StringBuilder(); for (String command : reward.getCommands()) { - rewardInfo.append("
  • Command: ").append(command).append("
  • "); + commandBuilder.append(formatter.replacePlaceholder(QUESTS_REWARDS_COMMAND, "{command}", command)); } + replacer.add("{commands}", commandBuilder.toString()); - rewardInfo.append("
"); - return rewardInfo.toString(); + return replacer.replace(); } } 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 5d92c88..705ca03 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 @@ -6,11 +6,14 @@ import me.pikamug.quests.quests.components.Stage; import net.citizensnpcs.api.CitizensAPI; import net.citizensnpcs.api.npc.NPCRegistry; import net.knarcraft.dynmapcitizens.DynmapCitizens; +import net.knarcraft.dynmapcitizens.formatting.QuestsTranslatableMessage; import net.knarcraft.dynmapcitizens.handler.trait.AbstractTraitHandler; import net.knarcraft.dynmapcitizens.property.Icon; import net.knarcraft.dynmapcitizens.settings.QuestsSettings; import net.knarcraft.dynmapcitizens.settings.TraitSettings; import net.knarcraft.dynmapcitizens.util.QuestsHelper; +import net.knarcraft.knarlib.formatting.StringFormatter; +import net.knarcraft.knarlib.formatting.StringReplacer; import org.bukkit.Bukkit; import org.dynmap.DynmapAPI; import org.dynmap.markers.GenericMarker; @@ -25,6 +28,14 @@ import java.util.List; import java.util.Map; import java.util.UUID; +import static net.knarcraft.dynmapcitizens.formatting.QuestsTranslatableMessage.QUESTS_INVOLVED_IN_DELIVERY_TARGET; +import static net.knarcraft.dynmapcitizens.formatting.QuestsTranslatableMessage.QUESTS_INVOLVED_IN_FORMAT; +import static net.knarcraft.dynmapcitizens.formatting.QuestsTranslatableMessage.QUESTS_INVOLVED_IN_INTERACT; +import static net.knarcraft.dynmapcitizens.formatting.QuestsTranslatableMessage.QUESTS_INVOLVED_IN_KILL; +import static net.knarcraft.dynmapcitizens.formatting.QuestsTranslatableMessage.QUESTS_MARKER_NAME_FORMAT; +import static net.knarcraft.dynmapcitizens.formatting.QuestsTranslatableMessage.QUESTS_OFFERED_FORMAT; +import static net.knarcraft.dynmapcitizens.formatting.QuestsTranslatableMessage.QUESTS_OFFERED_QUEST_FORMAT; + /** * A handler class for the quests trait */ @@ -125,7 +136,8 @@ public class QuestsHandler extends AbstractTraitHandler { List offeredQuests = info.getQuestStarts(); StringBuilder markerDescription = new StringBuilder(); - markerDescription.append("

").append(registry.getByUniqueId(npcId).getName()).append("

"); + markerDescription.append(DynmapCitizens.getFormatter().replacePlaceholder(QUESTS_MARKER_NAME_FORMAT, + "{name}", registry.getByUniqueId(npcId).getName())); //Print info about any offered quests if (!offeredQuests.isEmpty()) { @@ -153,25 +165,27 @@ public class QuestsHandler extends AbstractTraitHandler { * @param offeredQuests

The list of quests the NPC offers

*/ private void appendOfferedQuestsInfo(@NotNull StringBuilder stringBuilder, @NotNull List offeredQuests) { - stringBuilder.append("

Quests offered:

    "); + StringFormatter formatter = DynmapCitizens.getFormatter(); + StringBuilder questsInfoBuilder = new StringBuilder(); + for (Quest quest : offeredQuests) { - stringBuilder.append("
  • ").append(quest.getName()).append("

    - "); - stringBuilder.append(quest.getDescription()).append("
    "); - if (settings.displayStageInfo()) { - stringBuilder.append(new QuestStagesInfoGenerator(quest).getQuestStagesInfo()); - } - if (settings.displayRewardInfo()) { - stringBuilder.append(new QuestRewardsInfoGenerator(quest).getQuestRewardsInfo()); - } - if (settings.displayRequirementInfo()) { - stringBuilder.append(new QuestRequirementsInfoGenerator(questsAPI, quest).getQuestRequirementsInfo()); - } - if (settings.displayPlannerInfo()) { - stringBuilder.append(new QuestPlannerInfoGenerator(quest).getQuestPlannerInfo()); - } - stringBuilder.append("
  • "); + StringReplacer replacer = new StringReplacer(formatter.getUnFormattedMessage(QUESTS_OFFERED_QUEST_FORMAT)); + replacer.add("{name}", quest.getName()); + replacer.add("{description}", quest.getDescription()); + + replacer.add("{stages}", settings.displayStageInfo() ? + new QuestStagesInfoGenerator(quest).getQuestStagesInfo() : ""); + replacer.add("{rewards}", settings.displayRewardInfo() ? + new QuestRewardsInfoGenerator(quest).getQuestRewardsInfo() : ""); + replacer.add("{requirements}", settings.displayRequirementInfo() ? + new QuestRequirementsInfoGenerator(questsAPI, quest).getQuestRequirementsInfo() : ""); + replacer.add("{planner}", settings.displayPlannerInfo() ? + new QuestPlannerInfoGenerator(quest).getQuestPlannerInfo() : ""); + questsInfoBuilder.append(replacer.replace()); } - stringBuilder.append("
"); + + stringBuilder.append(formatter.replacePlaceholder(QUESTS_OFFERED_FORMAT, "{quests}", + questsInfoBuilder.toString())); } /** @@ -181,6 +195,7 @@ public class QuestsHandler extends AbstractTraitHandler { * @return

Information about an NPC's involvement in different quests

*/ private String getInvolvedInQuestsString(@NotNull NPCQuestInfo info) { + StringFormatter formatter = DynmapCitizens.getFormatter(); List questKills = info.getQuestKills(); List questInteractions = info.getQuestInteractions(); List questDeliveries = info.getQuestDeliveries(); @@ -189,25 +204,28 @@ public class QuestsHandler extends AbstractTraitHandler { return ""; } StringBuilder markerDescription = new StringBuilder(); - markerDescription.append("

Involved in quests:

    "); - addInvolvedInString("Killed in", questKills, markerDescription); - addInvolvedInString("Delivery target in", questDeliveries, markerDescription); - addInvolvedInString("Interacted with in quest", questInteractions, markerDescription); - markerDescription.append("
"); - return markerDescription.toString(); + + addInvolvedInString(formatter, QUESTS_INVOLVED_IN_KILL, questKills, markerDescription); + addInvolvedInString(formatter, QUESTS_INVOLVED_IN_DELIVERY_TARGET, questDeliveries, markerDescription); + addInvolvedInString(formatter, QUESTS_INVOLVED_IN_INTERACT, questInteractions, markerDescription); + + return formatter.replacePlaceholder(QUESTS_INVOLVED_IN_FORMAT, "{involvedQuests}", + markerDescription.toString()); } /** * Adds string explaining how an NPC is involved with the given quests * - * @param prefix

The string explaining how the NPC is involved

- * @param quests

The quests the NPC is involved in

- * @param builder

The string builder to append to

+ * @param formatter

The string formatter to use for formatting

+ * @param translatableMessage

The translatable message to display

+ * @param quests

The quests the NPC is involved in

+ * @param builder

The string builder to append to

*/ - private void addInvolvedInString(@NotNull String prefix, @NotNull List quests, + private void addInvolvedInString(@NotNull StringFormatter formatter, + @NotNull QuestsTranslatableMessage translatableMessage, @NotNull List quests, @NotNull StringBuilder builder) { for (Quest quest : new HashSet<>(quests)) { - builder.append("
  • ").append(prefix).append(": ").append(quest.getName()).append("
  • "); + builder.append(formatter.replacePlaceholder(translatableMessage, "{questName}", quest.getName())); } } diff --git a/src/main/java/net/knarcraft/dynmapcitizens/property/Icon.java b/src/main/java/net/knarcraft/dynmapcitizens/property/Icon.java index 5f2f949..375bb27 100644 --- a/src/main/java/net/knarcraft/dynmapcitizens/property/Icon.java +++ b/src/main/java/net/knarcraft/dynmapcitizens/property/Icon.java @@ -40,6 +40,11 @@ public enum Icon { */ BLACKSMITH, + /** + * An icon representing a scrapper NPC + */ + SCRAPPER, + /** * An icon representing a minstrel NPC */ diff --git a/src/main/java/net/knarcraft/dynmapcitizens/settings/GlobalSettings.java b/src/main/java/net/knarcraft/dynmapcitizens/settings/GlobalSettings.java index 04f66a5..cf2d7be 100644 --- a/src/main/java/net/knarcraft/dynmapcitizens/settings/GlobalSettings.java +++ b/src/main/java/net/knarcraft/dynmapcitizens/settings/GlobalSettings.java @@ -84,6 +84,7 @@ public class GlobalSettings { case SENTINEL -> "shield"; case MINSTREL -> "theater"; case TRADER -> "coins"; + case SCRAPPER -> "fire"; }; } diff --git a/src/main/resources/config.yml b/src/main/resources/config.yml index 95ef02b..a410602 100644 --- a/src/main/resources/config.yml +++ b/src/main/resources/config.yml @@ -12,6 +12,8 @@ icon: QUEST_CHAIN: "caution" # The marker used for blacksmiths BLACKSMITH: "hammer" + # The marker used for scrappers + SCRAPPER: "fire" # The marker used for sentinels SENTINEL: "shield" # The marker used for minstrels diff --git a/src/main/resources/strings.yml b/src/main/resources/strings.yml index 21803ac..2e5b0a5 100644 --- a/src/main/resources/strings.yml +++ b/src/main/resources/strings.yml @@ -29,7 +29,8 @@ en: 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_PLANNER_REPEAT: "
  • Quest will become available again after {repeatDelay}
  • " + QUESTS_PLANNER_TIMESTAMP_FORMAT: "dd MM yyyy HH:mm:ss" QUESTS_REQUIREMENTS_FORMAT: | Requirements:
      {requirementQuestPoints} @@ -56,6 +57,29 @@ en: 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}" + QUESTS_REWARDS_FORMAT: | + Rewards:
        + {money} + {experience} + {questPoints} + {permissions} + {items} + {commands} +
      + QUESTS_REWARDS_MONEY: "
    • {amount} {currency}
    • " + QUESTS_REWARDS_EXPERIENCE: "
    • {amount} exp
    • " + QUESTS_REWARDS_QUEST_POINTS: "
    • {amount} quest point(s)
    • " + QUESTS_REWARDS_PERMISSION: "
    • Permission: {permission}
    • " + QUESTS_REWARDS_ITEM: "
    • {item}
    • " + QUESTS_REWARDS_COMMAND: "
    • Command: {command}
    • " + QUESTS_MARKER_NAME_FORMAT: "

      {name}

      " + QUESTS_OFFERED_FORMAT: "

      Quests offered:

        {quests}
      " + QUESTS_OFFERED_QUEST_FORMAT: "
    • {name}

      - {description}
      {stages}{rewards}{requirements}{planner}
    • " + QUESTS_INVOLVED_IN_FORMAT: "

      Involved in quests:

        {involvedQuests}
      " + QUESTS_INVOLVED_IN_KILL: "
    • Killed in: {questName}
    • " + QUESTS_INVOLVED_IN_DELIVERY_TARGET: "
    • Delivery target in: {questName}
    • " + QUESTS_INVOLVED_IN_INTERACT: "
    • Interacted with in quest: {questName}
    • " + # Strings related to displayed durations DURATION_FORMAT: "in {time} {unit}" UNIT_NOW: "imminently" UNIT_SECOND: "second"