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 extends Trait> blacksmithTrait = CitizensAPI.getTraitFactory().getTraitClass("blacksmith");
+ Class extends Trait> 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_OFFERED_QUEST_FORMAT: "{name}
- {description}
{stages}{rewards}{requirements}{planner} "
+ QUESTS_INVOLVED_IN_FORMAT: "Involved in quests:
"
+ 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"