diff --git a/src/main/java/world/bentobox/challenges/config/Settings.java b/src/main/java/world/bentobox/challenges/config/Settings.java index 4709abd..407fb09 100644 --- a/src/main/java/world/bentobox/challenges/config/Settings.java +++ b/src/main/java/world/bentobox/challenges/config/Settings.java @@ -1,7 +1,9 @@ package world.bentobox.challenges.config; +import java.util.ArrayList; import java.util.HashSet; +import java.util.List; import java.util.Set; import org.bukkit.Material; @@ -12,7 +14,12 @@ import world.bentobox.bentobox.api.configuration.ConfigEntry; import world.bentobox.bentobox.api.configuration.ConfigObject; import world.bentobox.bentobox.api.configuration.StoreAt; +import world.bentobox.bentobox.database.objects.adapters.Adapter; import world.bentobox.challenges.config.SettingsUtils.GuiMode; +import world.bentobox.challenges.config.SettingsUtils.ChallengeLore; +import world.bentobox.challenges.config.SettingsUtils.LevelLore; +import world.bentobox.challenges.database.object.adapters.ChallengeLoreAdapter; +import world.bentobox.challenges.database.object.adapters.LevelLoreAdapter; @StoreAt(filename="config.yml", path="addons/Challenges") @@ -98,35 +105,41 @@ public class Settings implements ConfigObject @ConfigComment("one object from challenge description. If letter is not used, then its represented part") @ConfigComment("will not be in description. If use any letter that is not recognized, then it will be") @ConfigComment("ignored. Some strings can be customized via lang file under 'challenges.gui.challenge-description'.") - @ConfigComment("List of letters and their meaning: ") - @ConfigComment(" - L - Level String: '*.level'") - @ConfigComment(" - S - Status String: '*.completed'") - @ConfigComment(" - T - Times String: '*.completed-times', '*.completed-times-of' or '*.maxed-reached'") - @ConfigComment(" - D - Description String: defined in challenge object - challenge.description") - @ConfigComment(" - W - Warning String: '*.warning-items-take', '*.objects-close-by', '*.warning-entities-kill', '*.warning-blocks-remove'") - @ConfigComment(" - E - Environment String: defined in challenge object - challenge.environment") - @ConfigComment(" - Q - Requirement String: '*.required-level', '*.required-money', '*.required-experience'") - @ConfigComment(" - R - Reward String: '*.experience-reward', '*.money-reward', '*.not-repeatable'") - @ConfigComment("By adding 'i' after Q or R (requirements and rewards) will display list of items, blocks") - @ConfigComment("and entities that are defined in challenge and can be customized under 'challenges.gui.description.*'") - @ConfigEntry(path = "gui-settings.challenge-lore-message") - private String challengeLoreMessage = "LSTDEQiWRi"; + @ConfigComment("List of values and their meaning: ") + @ConfigComment(" - LEVEL - Level String: '*.level'") + @ConfigComment(" - STATUS - Status String: '*.completed'") + @ConfigComment(" - COUNT - Times String: '*.completed-times', '*.completed-times-of' or '*.maxed-reached'") + @ConfigComment(" - DESCRIPTION - Description String: defined in challenge object - challenge.description") + @ConfigComment(" - WARNINGS - Warning String: '*.warning-items-take', '*.objects-close-by', '*.warning-entities-kill', '*.warning-blocks-remove'") + @ConfigComment(" - ENVIRONMENT - Environment String: defined in challenge object - challenge.environment") + @ConfigComment(" - REQUIREMENTS - Requirement String: '*.required-level', '*.required-money', '*.required-experience' and items, blocks or entities") + @ConfigComment(" - REWARD_TEXT - Reward String: message that is defined in challenge.rewardTest and challenge.repeatRewardText") + @ConfigComment(" - REWARD_OTHER - Reward extra String: '*.experience-reward', '*.money-reward', '*.not-repeatable'") + @ConfigComment(" - REWARD_ITEMS - Reward Items: List of items that will be rewarded.") + @ConfigComment(" - REWARD_COMMANDS - Reward Commands: List of commands that will be rewarded.") + @ConfigComment("Requirement and reward items, blocks and entities that are defined in challenge and can be customized under 'challenges.gui.item-description.*'") + @ConfigEntry(path = "gui-settings.challenge-lore") + @Adapter(ChallengeLoreAdapter.class) + private List challengeLoreMessage = new ArrayList<>(); @ConfigComment("") @ConfigComment("This string allows to change element order in Level description. Each letter represents") @ConfigComment("one object from level description. If letter is not used, then its represented part") @ConfigComment("will not be in description. If use any letter that is not recognized, then it will be") @ConfigComment("ignored. Some strings can be customized via lang file under 'challenges.gui.level-description'.") - @ConfigComment("List of letters and their meaning: ") - @ConfigComment(" - S - Status String: '*.completed'") - @ConfigComment(" - T - Count of completed challenges String: '*.completed-challenges-of'") - @ConfigComment(" - D - Description String: defined in level object - challengeLevel.unlockMessage") - @ConfigComment(" - A - WaiverAmount String: '*.waver-amount'") - @ConfigComment(" - R - Reward String: '*.experience-reward', '*.money-reward', '*.not-repeatable'") - @ConfigComment("By adding 'i' after R (rewards) will display list of items that are defined in challenge") - @ConfigComment("and can be customized under 'challenges.gui.description.*'") - @ConfigEntry(path = "gui-settings.level-lore-message") - private String levelLoreMessage = "STDARi"; + @ConfigComment("List of values and their meaning: ") + @ConfigComment(" - LEVEL_STATUS - Status String: '*.completed'") + @ConfigComment(" - CHALLENGE_COUNT - Count of completed challenges String: '*.completed-challenges-of'") + @ConfigComment(" - UNLOCK_MESSAGE - Description String: defined in level object - challengeLevel.unlockMessage") + @ConfigComment(" - WAIVER_AMOUNT - WaiverAmount String: '*.waver-amount'") + @ConfigComment(" - LEVEL_REWARD_TEXT - Reward String: message that is defined in challengeLevel.rewardText.") + @ConfigComment(" - LEVEL_REWARD_OTHER - Reward extra String: '*.experience-reward', '*.money-reward'") + @ConfigComment(" - LEVEL_REWARD_ITEMS - Reward Items: List of items that will be rewarded.") + @ConfigComment(" - LEVEL_REWARD_COMMANDS - Reward Commands: List of commands that will be rewarded.") + @ConfigComment("Reward items that are defined in challenge level and can be customized under 'challenges.gui.item-description.*'") + @ConfigEntry(path = "gui-settings.level-lore") + @Adapter(LevelLoreAdapter.class) + private List levelLoreMessage = new ArrayList<>(); @ConfigComment("") @ConfigComment("This indicate if challenges data will be stored per island (true) or per player (false).") @@ -187,7 +200,7 @@ public class Settings implements ConfigObject * This method returns the challengeLoreMessage object. * @return the challengeLoreMessage object. */ - public String getChallengeLoreMessage() + public List getChallengeLoreMessage() { return challengeLoreMessage; } @@ -271,7 +284,7 @@ public class Settings implements ConfigObject * This method returns the levelLoreMessage object. * @return the levelLoreMessage object. */ - public String getLevelLoreMessage() + public List getLevelLoreMessage() { return levelLoreMessage; } @@ -455,7 +468,7 @@ public class Settings implements ConfigObject * This method sets the challengeLoreMessage object value. * @param challengeLoreMessage the challengeLoreMessage object new value. */ - public void setChallengeLoreMessage(String challengeLoreMessage) + public void setChallengeLoreMessage(List challengeLoreMessage) { this.challengeLoreMessage = challengeLoreMessage; } @@ -465,7 +478,7 @@ public class Settings implements ConfigObject * This method sets the levelLoreMessage object value. * @param levelLoreMessage the levelLoreMessage object new value. */ - public void setLevelLoreMessage(String levelLoreMessage) + public void setLevelLoreMessage(List levelLoreMessage) { this.levelLoreMessage = levelLoreMessage; } diff --git a/src/main/java/world/bentobox/challenges/config/SettingsUtils.java b/src/main/java/world/bentobox/challenges/config/SettingsUtils.java index f08215a..c1e2b61 100644 --- a/src/main/java/world/bentobox/challenges/config/SettingsUtils.java +++ b/src/main/java/world/bentobox/challenges/config/SettingsUtils.java @@ -26,4 +26,132 @@ public class SettingsUtils */ CURRENT_WORLD } + + + /** + * This enum holds all possible values for Challenge Lore Message. + */ + public enum ChallengeLore + { + /** + * Level String: 'challenges.gui.challenge-description.level' + */ + LEVEL, + + /** + * Status String: 'challenges.gui.challenge-description.completed' + */ + STATUS, + + /** + * Completion Times String: + * 'challenges.gui.challenge-description.completed-times', + * 'challenges.gui.challenge-description.completed-times-of' + * 'challenges.gui.challenge-description.maxed-reached' + */ + COUNT, + + /** + * Description String: defined in challenge object - challenge.description + */ + DESCRIPTION, + + /** + * Warning String: + * 'challenges.gui.challenge-description.warning-items-take' + * 'challenges.gui.challenge-description.objects-close-by' + * 'challenges.gui.challenge-description.warning-entities-kill' + * 'challenges.gui.challenge-description.warning-blocks-remove' + */ + WARNINGS, + + /** + * Environment String: defined in challenge object - challenge.environment + */ + ENVIRONMENT, + + /** + * Requirement String: + * 'challenges.gui.challenge-description.required-level' + * 'challenges.gui.challenge-description.required-money' + * 'challenges.gui.challenge-description.required-experience' + * and challenge.requiredItems, challenge.requiredBlocks or challenge.requiredEntities + */ + REQUIREMENTS, + + /** + * Reward String: message that is defined in challenge.rewardTest and challenge.repeatRewardText + */ + REWARD_TEXT, + + /** + * Reward other String: + * 'challenges.gui.challenge-description.experience-reward' + * 'challenges.gui.challenge-description.money-reward' + * 'challenges.gui.challenge-description.not-repeatable' + */ + REWARD_OTHER, + + /** + * Reward Items: List of items that will be rewarded defined in challenge.rewardItems and + * challenge.repeatRewardItems. + */ + REWARD_ITEMS, + + /** + * Reward commands: List of commands that will be rewarded defined in challenge.rewardCommands + * and challenge.repeatRewardCommands. + */ + REWARD_COMMANDS, + } + + + /** + * This enum holds all possible values for Level Lore Message. + */ + public enum LevelLore + { + /** + * Status String: 'challenges.gui.level-description.completed' + */ + LEVEL_STATUS, + + /** + * Completed Challenge count String: 'challenges.gui.level-description.completed-challenges-of' + */ + CHALLENGE_COUNT, + + /** + * Unlock message String: defined in challenge level object - challengeLevel.unlockMessage + */ + UNLOCK_MESSAGE, + + /** + * Count of challenges which can be skipped to unlock next level string: + * 'challenges.gui.level-description.waver-amount' + */ + WAIVER_AMOUNT, + + /** + * Reward String: message that is defined in challengeLevel.rewardTest + */ + LEVEL_REWARD_TEXT, + + /** + * Reward other String: + * 'challenges.gui.level-description.experience-reward' + * 'challenges.gui.level-description.money-reward' + */ + LEVEL_REWARD_OTHER, + + /** + * Reward Items: List of items that will be rewarded defined in challengeLevel.rewardItems. + */ + LEVEL_REWARD_ITEMS, + + /** + * Reward commands: List of commands that will be rewarded defined in challengeLevel.rewardCommands. + */ + LEVEL_REWARD_COMMANDS, + } } \ No newline at end of file diff --git a/src/main/java/world/bentobox/challenges/database/object/adapters/ChallengeLoreAdapter.java b/src/main/java/world/bentobox/challenges/database/object/adapters/ChallengeLoreAdapter.java new file mode 100644 index 0000000..450ca72 --- /dev/null +++ b/src/main/java/world/bentobox/challenges/database/object/adapters/ChallengeLoreAdapter.java @@ -0,0 +1,63 @@ +// +// Created by BONNe +// Copyright - 2019 +// + + +package world.bentobox.challenges.database.object.adapters; + + +import java.util.ArrayList; +import java.util.List; +import java.util.stream.Collectors; + +import world.bentobox.bentobox.database.objects.adapters.AdapterInterface; +import world.bentobox.challenges.config.SettingsUtils.ChallengeLore; + + +/** + * This adapter allows to serialize and deserialize ChallengeLore object. + */ +public class ChallengeLoreAdapter implements AdapterInterface, List> +{ + @SuppressWarnings("unchecked") + @Override + public List deserialize(Object from) + { + List result; + + if (from instanceof List) + { + result = ((List) from).stream(). + map(ChallengeLore::valueOf). + collect(Collectors.toCollection(ArrayList::new)); + } + else + { + result = new ArrayList<>(0); + } + + return result; + } + + + @SuppressWarnings("unchecked") + @Override + public List serialize(Object to) + { + List result; + + if (to instanceof List) + { + result = ((List) to).stream(). + map(ChallengeLore::name). + collect(Collectors.toCollection(ArrayList::new)); + } + else + { + result = new ArrayList<>(0); + } + + return result; + } +} diff --git a/src/main/java/world/bentobox/challenges/database/object/adapters/LevelLoreAdapter.java b/src/main/java/world/bentobox/challenges/database/object/adapters/LevelLoreAdapter.java new file mode 100644 index 0000000..6c60245 --- /dev/null +++ b/src/main/java/world/bentobox/challenges/database/object/adapters/LevelLoreAdapter.java @@ -0,0 +1,63 @@ +// +// Created by BONNe +// Copyright - 2019 +// + + +package world.bentobox.challenges.database.object.adapters; + + +import java.util.ArrayList; +import java.util.List; +import java.util.stream.Collectors; + +import world.bentobox.bentobox.database.objects.adapters.AdapterInterface; +import world.bentobox.challenges.config.SettingsUtils.LevelLore; + + +/** + * This adapter allows to serialize and deserialize LevelLore object. + */ +public class LevelLoreAdapter implements AdapterInterface, List> +{ + @SuppressWarnings("unchecked") + @Override + public List deserialize(Object from) + { + List result; + + if (from instanceof List) + { + result = ((List) from).stream(). + map(LevelLore::valueOf). + collect(Collectors.toCollection(ArrayList::new)); + } + else + { + result = new ArrayList<>(0); + } + + return result; + } + + + @SuppressWarnings("unchecked") + @Override + public List serialize(Object to) + { + List result; + + if (to instanceof List) + { + result = ((List) to).stream(). + map(LevelLore::name). + collect(Collectors.toCollection(ArrayList::new)); + } + else + { + result = new ArrayList<>(0); + } + + return result; + } +} diff --git a/src/main/java/world/bentobox/challenges/panel/CommonGUI.java b/src/main/java/world/bentobox/challenges/panel/CommonGUI.java index 5f9e71a..a209aba 100644 --- a/src/main/java/world/bentobox/challenges/panel/CommonGUI.java +++ b/src/main/java/world/bentobox/challenges/panel/CommonGUI.java @@ -336,186 +336,210 @@ public abstract class CommonGUI // Some values to avoid overchecking. ChallengesManager manager = this.addon.getChallengesManager(); - final boolean isCompletedOnce = manager.isChallengeComplete(user.getUniqueId(), world, challenge); + final boolean isCompletedOnce = + manager.isChallengeComplete(user.getUniqueId(), world, challenge); final long doneTimes = challenge.isRepeatable() ? - manager.getChallengeTimes(this.user, this.world, challenge) : - isCompletedOnce ? 0 : 1; - boolean isCompletedAll = isCompletedOnce && challenge.isRepeatable() && - challenge.getMaxTimes() > 0 && doneTimes >= challenge.getMaxTimes(); + manager.getChallengeTimes(this.user, this.world, challenge) : isCompletedOnce ? 0 : 1; - // Used to know if blocks, entities, items should be added after requirements and rewards. - char prevChar = ' '; + boolean isCompletedAll = isCompletedOnce && challenge.isRepeatable() && + challenge.getMaxTimes() > 0 && + doneTimes >= challenge.getMaxTimes(); - for (char c : this.addon.getChallengesSettings().getChallengeLoreMessage().toLowerCase().toCharArray()) + this.addon.getChallengesSettings().getChallengeLoreMessage().forEach(messagePart -> { + switch (messagePart) + { + case LEVEL: + { + ChallengeLevel level = manager.getLevel(challenge); + + if (level == null) + { + result.add(this.user.getTranslation("challenges.errors.missing-level", + "[level]", challenge.getLevel())); + } + else + { + result.add(this.user + .getTranslation("challenges.gui.challenge-description.level", + "[level]", level.getFriendlyName())); + } + break; + } + case STATUS: + { + if (isCompletedOnce) + { + result.add(this.user + .getTranslation("challenges.gui.challenge-description.completed")); + } + break; + } + case COUNT: + { + if (challenge.isRepeatable()) + { + if (challenge.getMaxTimes() > 0) { - switch (c) + if (isCompletedAll) { - case 'l': + result.add(this.user.getTranslation( + "challenges.gui.challenge-description.maxed-reached", + "[donetimes]", + String.valueOf(doneTimes), + "[maxtimes]", + String.valueOf(challenge.getMaxTimes()))); + } + else { - ChallengeLevel level = manager.getLevel(challenge); + result.add(this.user.getTranslation( + "challenges.gui.challenge-description.completed-times-of", + "[donetimes]", + String.valueOf(doneTimes), + "[maxtimes]", + String.valueOf(challenge.getMaxTimes()))); + } + } + else + { + result.add(this.user.getTranslation( + "challenges.gui.challenge-description.completed-times", + "[donetimes]", + String.valueOf(doneTimes))); + } + } + break; + } + case DESCRIPTION: + { + result.addAll(challenge.getDescription()); + break; + } + case WARNINGS: + { + if (!isCompletedAll) + { + if (challenge.getChallengeType().equals(Challenge.ChallengeType.INVENTORY)) + { + if (challenge.isTakeItems()) + { + result.add(this.user.getTranslation( + "challenges.gui.challenge-description.warning-items-take")); + } + } + else if (challenge.getChallengeType().equals(Challenge.ChallengeType.ISLAND)) + { + result.add(this.user.getTranslation( + "challenges.gui.challenge-description.objects-close-by")); - if (level == null) - { - result.add(this.user.getTranslation("challenges.errors.missing-level", - "[level]", challenge.getLevel())); - } - else - { - result.add(this.user.getTranslation("challenges.gui.challenge-description.level", - "[level]", level.getFriendlyName())); - } - - break; - } - case 's': + if (challenge.isRemoveEntities() && + !challenge.getRequiredEntities().isEmpty()) { - if (isCompletedOnce) - { - result.add(this.user.getTranslation("challenges.gui.challenge-description.completed")); - } - break; - } - case 't': - { - if (challenge.isRepeatable()) - { - if (challenge.getMaxTimes() > 0) - { - if (isCompletedAll) - { - result.add(this.user.getTranslation("challenges.gui.challenge-description.maxed-reached", - "[donetimes]", String.valueOf(doneTimes), - "[maxtimes]", String.valueOf(challenge.getMaxTimes()))); - } - else - { - result.add(this.user.getTranslation( - "challenges.gui.challenge-description.completed-times-of", - "[donetimes]", String.valueOf(doneTimes), - "[maxtimes]", String.valueOf(challenge.getMaxTimes()))); - } - } - else - { - result.add(this.user.getTranslation("challenges.gui.challenge-description.completed-times", - "[donetimes]", String.valueOf(doneTimes))); - } - } - break; - } - case 'd': - { - if (!isCompletedAll) - { - result.addAll(challenge.getDescription()); - } - break; - } - case 'w': - { - if (!isCompletedAll) - { - if (challenge.getChallengeType().equals(Challenge.ChallengeType.INVENTORY)) - { - if (challenge.isTakeItems()) - { - result.add(this.user.getTranslation( - "challenges.gui.challenge-description.warning-items-take")); - } - } - else if (challenge.getChallengeType().equals(Challenge.ChallengeType.ISLAND)) - { - result.add(this.user.getTranslation("challenges.gui.challenge-description.objects-close-by")); - - if (challenge.isRemoveEntities() && !challenge.getRequiredEntities().isEmpty()) - { - result.add(this.user.getTranslation( - "challenges.gui.challenge-description.warning-entities-kill")); - } - - if (challenge.isRemoveBlocks() && !challenge.getRequiredBlocks().isEmpty()) - { - result.add(this.user.getTranslation( - "challenges.gui.challenge-description.warning-blocks-remove")); - } - } - } - break; - } - case 'e': - { - // Display only if there are limited environments - - if (!isCompletedAll && - !challenge.getEnvironment().isEmpty() && - challenge.getEnvironment().size() != 3) - { - result.add(this.user.getTranslation("challenges.gui.challenge-description.environment")); - - if (challenge.getEnvironment().contains(World.Environment.NORMAL)) - { - result.add(this.user.getTranslation("challenges.gui.descriptions.normal")); - } - - if (challenge.getEnvironment().contains(World.Environment.NETHER)) - { - result.add(this.user.getTranslation("challenges.gui.descriptions.nether")); - } - - if (challenge.getEnvironment().contains(World.Environment.THE_END)) - { - result.add(this.user.getTranslation("challenges.gui.descriptions.the-end")); - } - } - break; - } - case 'q': - { - if (!isCompletedAll && challenge.getChallengeType() == Challenge.ChallengeType.OTHER) - { - result.addAll(this.getChallengeRequirements(challenge)); - } - break; - } - case 'r': - { - if (isCompletedAll) - { - result.add(this.user.getTranslation("challenges.gui.challenge-description.not-repeatable")); - } - else - { - result.addAll(this.getChallengeRewards(challenge, isCompletedOnce)); - } - break; - } - case 'i': - { - if (!isCompletedAll) - { - if (prevChar == 'q' && challenge.getChallengeType() != Challenge.ChallengeType.OTHER) - { - result.addAll(this.getChallengeRequiredItems(challenge)); - } - else if (prevChar == 'r') - { - result.addAll(this.getChallengeRewardItems(challenge, isCompletedOnce, user)); - } - } - break; - } - default: - { - break; - } + result.add(this.user.getTranslation( + "challenges.gui.challenge-description.warning-entities-kill")); } - prevChar = c; + if (challenge.isRemoveBlocks() && + !challenge.getRequiredBlocks().isEmpty()) + { + result.add(this.user.getTranslation( + "challenges.gui.challenge-description.warning-blocks-remove")); + } + } + } + break; + } + case ENVIRONMENT: + { + // Display only if there are limited environments + + if (!isCompletedAll && + !challenge.getEnvironment().isEmpty() && + challenge.getEnvironment().size() != 3) + { + result.add(this.user.getTranslation("challenges.gui.challenge-description.environment")); + + if (challenge.getEnvironment().contains(World.Environment.NORMAL)) + { + result.add(this.user.getTranslation("challenges.gui.descriptions.normal")); } - result.replaceAll(x -> x.replace("[label]", this.topLabel)); + if (challenge.getEnvironment().contains(World.Environment.NETHER)) + { + result.add(this.user.getTranslation("challenges.gui.descriptions.nether")); + } - return result; + if (challenge.getEnvironment().contains(World.Environment.THE_END)) + { + result.add(this.user.getTranslation("challenges.gui.descriptions.the-end")); + } + } + break; + } + case REQUIREMENTS: + { + if (!isCompletedAll) + { + if (challenge.getChallengeType() == Challenge.ChallengeType.OTHER) + { + result.addAll(this.getChallengeRequirements(challenge)); + } + else + { + result.addAll(this.getChallengeRequiredItems(challenge)); + } + } + + break; + } + case REWARD_TEXT: + { + if (isCompletedAll) + { + result.add(this.user.getTranslation("challenges.gui.challenge-description.not-repeatable")); + } + else + { + if (isCompletedOnce) + { + result.add(challenge.getRepeatRewardText()); + } + else + { + result.add(challenge.getRewardText()); + } + } + break; + } + case REWARD_OTHER: + { + if (!isCompletedAll) + { + result.addAll(this.getChallengeRewardOthers(challenge, isCompletedOnce)); + } + break; + } + case REWARD_ITEMS: + { + if (!isCompletedAll) + { + result.addAll(this.getChallengeRewardItems(challenge, isCompletedOnce)); + } + break; + } + case REWARD_COMMANDS: + { + if (!isCompletedAll) + { + result.addAll(this.getChallengeRewardCommands(challenge, isCompletedOnce, user)); + } + break; + } + } + }); + + result.replaceAll(x -> x.replace("[label]", this.topLabel)); + + return result; } @@ -525,31 +549,25 @@ public abstract class CommonGUI * @param isCompletedOnce indicate if must use repeat rewards * @return list of strings that contains rewards message. */ - private List getChallengeRewards(Challenge challenge, boolean isCompletedOnce) + private List getChallengeRewardOthers(Challenge challenge, boolean isCompletedOnce) { - String rewardText; double rewardMoney; int rewardExperience; if (!isCompletedOnce) { - rewardText = challenge.getRewardText(); rewardMoney = challenge.getRewardMoney(); rewardExperience = challenge.getRewardExperience(); } else { - rewardText = challenge.getRepeatRewardText(); rewardMoney = challenge.getRepeatMoneyReward(); rewardExperience = challenge.getRepeatExperienceReward(); } List result = new ArrayList<>(); - // Add reward text - result.add(rewardText); - // Add message about reward XP if (rewardExperience > 0) { @@ -569,28 +587,24 @@ public abstract class CommonGUI /** - * This method returns list of strings that contains reward items and commands from given challenge. + * This method returns list of strings that contains reward items from given challenge. * @param challenge Challenge which reward items and commands must be returned. * @param isCompletedOnce Boolean that indicate if must use repeat rewards. - * @param user Target user for command string. * @return List of strings that contains message from challenges. */ - private List getChallengeRewardItems(Challenge challenge, boolean isCompletedOnce, Player user) + private List getChallengeRewardItems(Challenge challenge, boolean isCompletedOnce) { List result = new ArrayList<>(); List rewardItems; - List rewardCommands; - if (!isCompletedOnce) + if (isCompletedOnce) { - rewardItems = challenge.getRewardItems(); - rewardCommands = challenge.getRewardCommands(); + rewardItems = challenge.getRepeatItemReward(); } else { - rewardItems = challenge.getRepeatItemReward(); - rewardCommands = challenge.getRepeatRewardCommands(); + rewardItems = challenge.getRewardItems(); } // Add message about reward items @@ -602,6 +616,32 @@ public abstract class CommonGUI result.addAll(this.generateItemStackDescription(itemStack))); } + return result; + } + + + /** + * This method returns list of strings that contains reward commands from given challenge. + * @param challenge Challenge which reward items and commands must be returned. + * @param isCompletedOnce Boolean that indicate if must use repeat rewards. + * @param user Target user for command string. + * @return List of strings that contains message from challenges. + */ + private List getChallengeRewardCommands(Challenge challenge, boolean isCompletedOnce, Player user) + { + List result = new ArrayList<>(); + + List rewardCommands; + + if (isCompletedOnce) + { + rewardCommands = challenge.getRepeatRewardCommands(); + } + else + { + rewardCommands = challenge.getRewardCommands(); + } + // Add message about reward commands if (!rewardCommands.isEmpty()) { @@ -610,7 +650,7 @@ public abstract class CommonGUI for (String command : rewardCommands) { result.add(this.user.getTranslation("challenges.gui.descriptions.command", - "[command]", command.replace("[player]", user.getName()).replace("[SELF]", ""))); + "[command]", command.replace("[player]", user.getName()).replace("[SELF]", ""))); } } @@ -723,106 +763,109 @@ public abstract class CommonGUI ChallengesManager manager = this.addon.getChallengesManager(); LevelStatus status = manager.getChallengeLevelStatus(user.getUniqueId(), this.world, level); - // Used to know if blocks, entities, items should be added after requirements and rewards. - char prevChar = ' '; + // Check if unlock message should appear. + boolean hasCompletedOne = status.isComplete() || status.isUnlocked() && + level.getChallenges().stream().anyMatch(challenge -> + this.addon.getChallengesManager().isChallengeComplete(user.getUniqueId(), world, challenge)); - for (char c : this.addon.getChallengesSettings().getLevelLoreMessage().toLowerCase().toCharArray()) - { - switch (c) + this.addon.getChallengesSettings().getLevelLoreMessage().forEach(messagePart -> { + switch (messagePart) { - case 's': - { - if (status.isComplete()) + case LEVEL_STATUS: { - result.add(this.user.getTranslation("challenges.gui.level-description.completed")); + if (status.isComplete()) + { + result.add(this.user.getTranslation("challenges.gui.level-description.completed")); + } + break; } - break; - } - case 't': - { - if (!status.isComplete()) + case CHALLENGE_COUNT: { - int doneChallengeCount = (int) level.getChallenges().stream(). + if (!status.isComplete() && status.isUnlocked()) + { + int doneChallengeCount = (int) level.getChallenges().stream(). filter(challenge -> this.addon.getChallengesManager().isChallengeComplete(user.getUniqueId(), world, challenge)). count(); - result.add(this.user.getTranslation("challenges.gui.level-description.completed-challenges-of", + result.add(this.user.getTranslation("challenges.gui.level-description.completed-challenges-of", "[number]", Integer.toString(doneChallengeCount), "[max]", Integer.toString(level.getChallenges().size()))); - } - break; - } - case 'd': - { - if (!status.isUnlocked()) - { - result.add(level.getUnlockMessage()); - } - break; - } - case 'a': - { - if (!status.isUnlocked() && !status.isComplete()) - { - result.add(this.user.getTranslation("challenges.gui.level-description.waver-amount", - "[value]", Integer.toString(level.getWaiverAmount()))); - } - break; - } - case 'r': - { - if (status.isUnlocked() && !status.isComplete()) - { - if (level.getRewardExperience() > 0) - { - result.add(this.user - .getTranslation("challenges.gui.level-description.experience-reward", - "[value]", Integer.toString(level.getRewardExperience()))); } - if (this.addon.isEconomyProvided() && level.getRewardMoney() > 0) - { - result.add(this.user.getTranslation("challenges.gui.level-description.money-reward", - "[value]", Integer.toString(level.getRewardMoney()))); - } + break; } - break; - } - case 'i': - { - if (status.isUnlocked() && !status.isComplete() && prevChar == 'r') + case UNLOCK_MESSAGE: { - // Add message about reward items - if (!level.getRewardItems().isEmpty()) + if (!hasCompletedOne) + { + result.add(level.getUnlockMessage()); + } + + break; + } + case WAIVER_AMOUNT: + { + if (status.isUnlocked() && !status.isComplete()) + { + result.add(this.user.getTranslation("challenges.gui.level-description.waver-amount", + "[value]", Integer.toString(level.getWaiverAmount()))); + } + + break; + } + case LEVEL_REWARD_TEXT: + { + if (status.isUnlocked() && !status.isComplete()) + { + result.add(level.getRewardText()); + } + break; + } + case LEVEL_REWARD_OTHER: + { + if (status.isUnlocked() && !status.isComplete()) + { + if (level.getRewardExperience() > 0) + { + result.add(this.user.getTranslation("challenges.gui.level-description.experience-reward", + "[value]", Integer.toString(level.getRewardExperience()))); + } + + if (this.addon.isEconomyProvided() && level.getRewardMoney() > 0) + { + result.add(this.user.getTranslation("challenges.gui.level-description.money-reward", + "[value]", Integer.toString(level.getRewardMoney()))); + } + } + break; + } + case LEVEL_REWARD_ITEMS: + { + if (status.isUnlocked() && !status.isComplete() && !level.getRewardItems().isEmpty()) { result.add(this.user.getTranslation("challenges.gui.level-description.reward-items")); Utils.groupEqualItems(level.getRewardItems()).forEach(itemStack -> - result.addAll(this.generateItemStackDescription(itemStack))); + result.addAll(this.generateItemStackDescription(itemStack))); } - - // Add message about reward commands - if (!level.getRewardCommands().isEmpty()) + break; + } + case LEVEL_REWARD_COMMANDS: + { + if (status.isUnlocked() && !status.isComplete() && !level.getRewardCommands().isEmpty()) { result.add(this.user.getTranslation("challenges.gui.level-description.reward-commands")); for (String command : level.getRewardCommands()) { result.add(this.user.getTranslation("challenges.gui.descriptions.command", - "[command]", command.replace("[player]", user.getName()).replace("[SELF]", ""))); + "[command]", command.replace("[player]", user.getName()).replace("[SELF]", ""))); } } + break; } - break; } - default: - { - break; - } - } - - prevChar = c; - } + }); result.replaceAll(x -> x.replace("[label]", this.topLabel)); @@ -836,7 +879,7 @@ public abstract class CommonGUI /** - * This method generates decsription for given item stack object. + * This method generates description for given item stack object. * @param itemStack Object which lore must be generated * @return List with generated description */ diff --git a/src/main/java/world/bentobox/challenges/panel/admin/EditLoreGUI.java b/src/main/java/world/bentobox/challenges/panel/admin/EditLoreGUI.java new file mode 100644 index 0000000..4da8c35 --- /dev/null +++ b/src/main/java/world/bentobox/challenges/panel/admin/EditLoreGUI.java @@ -0,0 +1,630 @@ +package world.bentobox.challenges.panel.admin; + + +import org.bukkit.Material; +import org.bukkit.event.inventory.InventoryClickEvent; +import org.bukkit.event.inventory.InventoryCloseEvent; +import org.bukkit.inventory.ItemStack; +import java.util.*; +import java.util.function.BiConsumer; +import java.util.function.Consumer; +import java.util.stream.Collectors; + +import world.bentobox.bentobox.api.panels.PanelItem; +import world.bentobox.bentobox.api.panels.PanelListener; +import world.bentobox.bentobox.api.panels.builders.PanelBuilder; +import world.bentobox.bentobox.api.panels.builders.PanelItemBuilder; +import world.bentobox.bentobox.api.user.User; +import world.bentobox.challenges.config.SettingsUtils.ChallengeLore; +import world.bentobox.challenges.config.SettingsUtils.LevelLore; +import world.bentobox.challenges.panel.CommonGUI; +import world.bentobox.challenges.utils.GuiUtils; + + +/** + * This class allows to change Input ItemStacks to different ItemStacks. + */ +public class EditLoreGUI extends CommonGUI +{ + public EditLoreGUI(CommonGUI parent, LoreType loreType) + { + super(parent); + + this.lore = loreType; + this.activeValues = new ArrayList<>(); + + switch (this.lore) + { + case CHALLENGES: + + for (ChallengeLore lore : this.addon.getChallengesSettings().getChallengeLoreMessage()) + { + this.activeValues.add(lore.name()); + } + + break; + case LEVELS: + + for (LevelLore lore : this.addon.getChallengesSettings().getLevelLoreMessage()) + { + this.activeValues.add(lore.name()); + } + + break; + } + } + + + /** + * This is static call method for easier GUI opening. + * @param parent Parent GUI. + * @param loreType loreType that will be edited. + */ + public static void open(CommonGUI parent, LoreType loreType) + { + new EditLoreGUI(parent, loreType).build(); + } + + +// --------------------------------------------------------------------- +// Section: Methods +// --------------------------------------------------------------------- + + + /** + * This method builds panel that allows to change given number value. + */ + @Override + public void build() + { + PanelBuilder panelBuilder = new PanelBuilder(). + name(this.user.getTranslation("challenges.gui.title.admin.lore-edit")). + user(this.user). + listener(new CustomPanelListener()); + + GuiUtils.fillBorder(panelBuilder, 5, Material.MAGENTA_STAINED_GLASS_PANE); + + // Define all active buttons + panelBuilder.item(1, this.getButton(Button.SAVE)); + + panelBuilder.item(3, this.getButton(Button.ADD)); + panelBuilder.item(4, this.getButton(Button.REMOVE)); + + // TODO: Need 2 View Buttons + // One for closes / One for opened. +// panelBuilder.item(6, this.getButton(Button.VIEW)); + + panelBuilder.item(44, this.returnButton); + + // necessary as I have a border around this GUI + int currentIndex = 10; + + // Only 21 elements will be displayed. On porpoise! + for (int i = 0; i < this.activeValues.size() || i > 21; i++) + { + panelBuilder.item(currentIndex++, this.getLoreButton(this.activeValues.get(i))); + + // Border element + if (currentIndex % 9 == 8) + { + currentIndex += 2; + } + + // Just in case. Should never occur. + if (currentIndex % 9 == 0) + { + currentIndex++; + } + } + + panelBuilder.build(); + } + + + /** + * This method create button that does some functionality in current gui. + * @param button Button functionality. + * @return PanelItem. + */ + private PanelItem getButton(Button button) + { + ItemStack icon; + String name; + List description; + PanelItem.ClickHandler clickHandler; + + switch (button) + { + case SAVE: + { + name = this.user.getTranslation("challenges.gui.buttons.admin.save"); + description = Collections.emptyList(); + icon = new ItemStack(Material.COMMAND_BLOCK); + clickHandler = (panel, user, clickType, slot) -> { + + switch (this.lore) + { + case CHALLENGES: + { + List lore = this.activeValues.stream(). + map(ChallengeLore::valueOf). + collect(Collectors.toCollection(() -> new ArrayList<>(this.activeValues.size()))); + + this.addon.getChallengesSettings().setChallengeLoreMessage(lore); + + break; + } + case LEVELS: + { + List lore = this.activeValues.stream(). + map(LevelLore::valueOf). + collect(Collectors.toCollection(() -> new ArrayList<>(this.activeValues.size()))); + + this.addon.getChallengesSettings().setLevelLoreMessage(lore); + + break; + } + } + + // Save and return to parent gui. + this.parentGUI.build(); + + return true; + }; + break; + } + case ADD: + { + name = this.user.getTranslation("challenges.gui.buttons.admin.add"); + description = Collections.emptyList(); + icon = new ItemStack(Material.GREEN_STAINED_GLASS_PANE); + clickHandler = (panel, user, clickType, slot) -> { + new AddLoreElementGUI(element -> { + this.activeValues.add(element); + this.build(); + }); + + return true; + }; + + break; + } + case REMOVE: + { + name = this.user.getTranslation("challenges.gui.buttons.admin.remove-selected"); + description = Collections.emptyList(); + icon = new ItemStack(Material.RED_STAINED_GLASS_PANE); + clickHandler = (panel, user, clickType, slot) -> { + new RemoveLoreElementGUI((element, index) -> { + if (this.activeValues.get(index).equals(element)) + { + this.activeValues.remove(element); + } + + this.build(); + }); + + return true; + }; + + break; + } + case VIEW: + { + name = this.user.getTranslation("challenges.gui.buttons.admin.view"); + description = Collections.emptyList(); + icon = new ItemStack(Material.YELLOW_STAINED_GLASS_PANE); + clickHandler = (panel, user, clickType, slot) -> { + return true; + }; + + break; + } + default: + return null; + } + + return new PanelItemBuilder(). + icon(icon). + name(name). + description(GuiUtils.stringSplit(description, this.addon.getChallengesSettings().getLoreLineLength())). + glow(false). + clickHandler(clickHandler). + build(); + } + + + /** + * This method creates button for lore element. + * @param loreElement String that represents current lore element. + * @return PanelItem. + */ + private PanelItem getLoreButton(String loreElement) + { + switch (this.lore) + { + case CHALLENGES: + return this.getChallengeLoreButton(loreElement); + case LEVELS: + return this.getLevelLoreButton(loreElement); + default: + // this should never happen! + return null; + } + } + + + /** + * This method creates button for challenge lore element. + * @param loreElement String that represents current challenge lore element. + * @return PanelItem. + */ + private PanelItem getChallengeLoreButton(String loreElement) + { + Material icon; + String name = loreElement; + List description = new ArrayList<>(); + description.add(this.user.getTranslation(REFERENCE_DESCRIPTION + "lore." + loreElement.toLowerCase())); + + PanelItem.ClickHandler clickHandler = (panel, user1, clickType, slot) -> true; + + switch (ChallengeLore.valueOf(loreElement)) + { + case LEVEL: + { + icon = Material.DIRT; + break; + } + case STATUS: + { + icon = Material.LEVER; + break; + } + case COUNT: + { + icon = Material.REPEATER; + break; + } + case DESCRIPTION: + { + icon = Material.WRITTEN_BOOK; + break; + } + case WARNINGS: + { + icon = Material.LAVA_BUCKET; + break; + } + case ENVIRONMENT: + { + icon = Material.GLASS; + break; + } + case REQUIREMENTS: + { + icon = Material.HOPPER; + break; + } + case REWARD_TEXT: + { + icon = Material.PAPER; + break; + } + case REWARD_OTHER: + { + icon = Material.CHEST; + break; + } + case REWARD_ITEMS: + { + icon = Material.TRAPPED_CHEST; + break; + } + case REWARD_COMMANDS: + { + icon = Material.COMMAND_BLOCK; + break; + } + default: + { + icon = Material.BARRIER; + break; + } + } + + return new PanelItemBuilder(). + name(name). + icon(icon). + description(description). + clickHandler(clickHandler). + glow(false). + build(); + } + + + /** + * This method creates button for challenge level lore element. + * @param loreElement String that represents current challenge level lore element. + * @return PanelItem. + */ + private PanelItem getLevelLoreButton(String loreElement) + { + Material icon; + String name = loreElement; + List description = new ArrayList<>(); + description.add(this.user.getTranslation(REFERENCE_DESCRIPTION + "lore." + loreElement.toLowerCase())); + + PanelItem.ClickHandler clickHandler = (panel, user1, clickType, slot) -> true; + + switch (LevelLore.valueOf(loreElement)) + { + case LEVEL_STATUS: + { + icon = Material.DIRT; + break; + } + case CHALLENGE_COUNT: + { + icon = Material.REPEATER; + break; + } + case UNLOCK_MESSAGE: + { + icon = Material.WRITTEN_BOOK; + break; + } + case WAIVER_AMOUNT: + { + icon = Material.COMPARATOR; + break; + } + case LEVEL_REWARD_TEXT: + { + icon = Material.PAPER; + break; + } + case LEVEL_REWARD_OTHER: + { + icon = Material.CHEST; + break; + } + case LEVEL_REWARD_ITEMS: + { + icon = Material.TRAPPED_CHEST; + break; + } + case LEVEL_REWARD_COMMANDS: + { + icon = Material.COMMAND_BLOCK; + break; + } + default: + { + icon = Material.BARRIER; + break; + } + } + + return new PanelItemBuilder(). + name(name). + icon(icon). + description(description). + clickHandler(clickHandler). + glow(false). + build(); + } + + +// --------------------------------------------------------------------- +// Section: Select GUI +// --------------------------------------------------------------------- + + + /** + * This class opens new GUI that add an element from all available lore values. + */ + private class AddLoreElementGUI + { + private AddLoreElementGUI(Consumer selectedElement) + { + PanelBuilder panelBuilder = new PanelBuilder(). + name(EditLoreGUI.this.user.getTranslation("challenges.gui.title.admin.lore-add")). + user(EditLoreGUI.this.user); + + GuiUtils.fillBorder(panelBuilder, 5, Material.MAGENTA_STAINED_GLASS_PANE); + + int currentIndex = 10; + + List values = new ArrayList<>(); + + // Populate list with all elements. + switch (EditLoreGUI.this.lore) + { + case CHALLENGES: + for (ChallengeLore value : ChallengeLore.values()) + { + values.add(value.name()); + } + break; + case LEVELS: + for (LevelLore value : LevelLore.values()) + { + values.add(value.name()); + } + break; + } + + for (String value : values) + { + PanelItem item = EditLoreGUI.this.getLoreButton(value); + + item.setClickHandler((panel, user1, clickType, slot) -> { + selectedElement.accept(value); + return true; + }); + + panelBuilder.item(currentIndex++, item); + + // Border element + if (currentIndex % 9 == 8) + { + currentIndex += 2; + } + + // Just in case. Should never occur. + if (currentIndex % 9 == 0) + { + currentIndex++; + } + + // Just in case. Should never occur. + if (currentIndex > 35) + { + break; + } + } + + panelBuilder.build(); + } + } + + + /** + * This class opens new GUI that remove an element from all available lore values. + */ + private class RemoveLoreElementGUI + { + private RemoveLoreElementGUI(BiConsumer selectedElement) + { + PanelBuilder panelBuilder = new PanelBuilder(). + name(EditLoreGUI.this.user.getTranslation("challenges.gui.title.admin.lore-remove")). + user(EditLoreGUI.this.user); + + GuiUtils.fillBorder(panelBuilder, 5, Material.MAGENTA_STAINED_GLASS_PANE); + + int currentIndex = 10; + + List values = EditLoreGUI.this.activeValues; + + for (int i = 0; i < values.size(); i++) + { + final int counter = i; + + String value = values.get(counter); + PanelItem item = EditLoreGUI.this.getLoreButton(value); + + item.setClickHandler((panel, user1, clickType, slot) -> { + selectedElement.accept(value, counter); + return true; + }); + + panelBuilder.item(currentIndex++, item); + + // Border element + if (currentIndex % 9 == 8) + { + currentIndex += 2; + } + + // Just in case. Should never occur. + if (currentIndex % 9 == 0) + { + currentIndex++; + } + + // Just in case. Should never occur. + if (currentIndex > 35) + { + break; + } + } + + panelBuilder.build(); + } + } + + +// --------------------------------------------------------------------- +// Section: Private classes +// --------------------------------------------------------------------- + + + /** + * This CustomPanelListener allows to move items in current panel. + */ + private class CustomPanelListener implements PanelListener + { + @Override + public void setup() + { + } + + + @Override + public void onInventoryClose(InventoryCloseEvent inventoryCloseEvent) + { + } + + + @Override + public void onInventoryClick(User user, InventoryClickEvent event) + { + // First row of elements should be ignored, as it contains buttons and blocked slots. + event.setCancelled(event.getRawSlot() < 9 || + event.getRawSlot() < 35 || + event.getRawSlot() % 9 == 0 || + event.getRawSlot() % 9 == 8); + } + } + + +// --------------------------------------------------------------------- +// Section: Enums +// --------------------------------------------------------------------- + + + /** + * This enum holds all button values in current gui. + */ + private enum Button + { + SAVE, + ADD, + REMOVE, + VIEW, + RETURN + } + + + /** + * This enum holds which Lore is edited with current GUI. + */ + public enum LoreType + { + CHALLENGES, + LEVELS, + } + + +// --------------------------------------------------------------------- +// Section: Variables +// --------------------------------------------------------------------- + + /** + * Lore that will be edited with current GUI. + */ + private final LoreType lore; + + /** + * List of lore elements that are currently enabled. + */ + private List activeValues; + + +// --------------------------------------------------------------------- +// Section: Constants +// --------------------------------------------------------------------- + + + private final static String REFERENCE_DESCRIPTION = "challenges.gui.descriptions.admin."; +} diff --git a/src/main/java/world/bentobox/challenges/panel/admin/EditSettingsGUI.java b/src/main/java/world/bentobox/challenges/panel/admin/EditSettingsGUI.java index 2c9166c..9171d97 100644 --- a/src/main/java/world/bentobox/challenges/panel/admin/EditSettingsGUI.java +++ b/src/main/java/world/bentobox/challenges/panel/admin/EditSettingsGUI.java @@ -236,21 +236,11 @@ public class EditSettingsGUI extends CommonGUI { description = new ArrayList<>(2); description.add(this.user.getTranslation("challenges.gui.descriptions.admin.level-lore")); - description.add(this.user.getTranslation("challenges.gui.descriptions.current-value", - "[value]", this.settings.getLevelLoreMessage())); name = this.user.getTranslation("challenges.gui.buttons.admin.level-lore"); icon = new ItemStack(Material.MAP); clickHandler = (panel, user1, clickType, i) -> { - // TODO: AnvilGUI is out. Need to implement better GUI for editing this. -// new AnvilGUI(this.addon.getPlugin(), -// this.user.getPlayer(), -// this.settings.getLevelLoreMessage(), -// (player, reply) -> { -// this.settings.setLevelLoreMessage(reply); -// panel.getInventory().setItem(i, this.getSettingsButton(button).getItem()); -// return reply; -// }); + EditLoreGUI.open(this, EditLoreGUI.LoreType.LEVELS); return true; }; @@ -261,21 +251,11 @@ public class EditSettingsGUI extends CommonGUI { description = new ArrayList<>(2); description.add(this.user.getTranslation("challenges.gui.descriptions.admin.challenge-lore")); - description.add(this.user.getTranslation("challenges.gui.descriptions.current-value", - "[value]", this.settings.getChallengeLoreMessage())); name = this.user.getTranslation("challenges.gui.buttons.admin.challenge-lore"); icon = new ItemStack(Material.PAPER); clickHandler = (panel, user1, clickType, i) -> { - // TODO: AnvilGUI is out. Need to implement better GUI for editing this. -// new AnvilGUI(this.addon.getPlugin(), -// this.user.getPlayer(), -// this.settings.getChallengeLoreMessage(), -// (player, reply) -> { -// this.settings.setChallengeLoreMessage(reply); -// panel.getInventory().setItem(i, this.getSettingsButton(button).getItem()); -// return reply; -// }); + EditLoreGUI.open(this, EditLoreGUI.LoreType.CHALLENGES); return true; }; diff --git a/src/main/resources/config.yml b/src/main/resources/config.yml index fb4b81c..fe3a262 100644 --- a/src/main/resources/config.yml +++ b/src/main/resources/config.yml @@ -62,32 +62,55 @@ gui-settings: # one object from challenge description. If letter is not used, then its represented part # will not be in description. If use any letter that is not recognized, then it will be # ignored. Some strings can be customized via lang file under 'challenges.gui.challenge-description'. - # List of letters and their meaning: - # - L - Level String: '*.level' - # - S - Status String: '*.completed' - # - T - Times String: '*.completed-times', '*.completed-times-of' or '*.maxed-reached' - # - D - Description String: defined in challenge object - challenge.description - # - W - Warning String: '*.warning-items-take', '*.objects-close-by', '*.warning-entities-kill', '*.warning-blocks-remove' - # - E - Environment String: defined in challenge object - challenge.environment - # - Q - Requirement String: '*.required-level', '*.required-money', '*.required-experience' - # - R - Reward String: '*.experience-reward', '*.money-reward', '*.not-repeatable' - # By adding 'i' after Q or R (requirements and rewards) will display list of items, blocks - # and entities that are defined in challenge and can be customized under 'challenges.gui.description.*' - challenge-lore-message: LSTDEQiWRi + # List of values and their meaning: + # - LEVEL - Level String: '*.level' + # - STATUS - Status String: '*.completed' + # - COUNT - Times String: '*.completed-times', '*.completed-times-of' or '*.maxed-reached' + # - DESCRIPTION - Description String: defined in challenge object - challenge.description + # - WARNINGS - Warning String: '*.warning-items-take', '*.objects-close-by', '*.warning-entities-kill', '*.warning-blocks-remove' + # - ENVIRONMENT - Environment String: defined in challenge object - challenge.environment + # - REQUIREMENTS - Requirement String: '*.required-level', '*.required-money', '*.required-experience' and items, blocks or entities + # - REWARD_TEXT - Reward String: message that is defined in challenge.rewardTest and challenge.repeatRewardText + # - REWARD_OTHER - Reward extra String: '*.experience-reward', '*.money-reward', '*.not-repeatable' + # - REWARD_ITEMS - Reward Items: List of items that will be rewarded. + # - REWARD_COMMANDS - Reward Commands: List of commands that will be rewarded. + # Requirement and reward items, blocks and entities that are defined in challenge and can be customized under 'challenges.gui.item-description.*' + challenge-lore: + - LEVEL + - STATUS + - COUNT + - DESCRIPTION + - WARNINGS + - ENVIRONMENT + - REQUIREMENTS + - REWARD_TEXT + - REWARD_OTHER + - REWARD_ITEMS + - REWARD_COMMANDS # # This string allows to change element order in Level description. Each letter represents # one object from level description. If letter is not used, then its represented part # will not be in description. If use any letter that is not recognized, then it will be # ignored. Some strings can be customized via lang file under 'challenges.gui.level-description'. - # List of letters and their meaning: - # - S - Status String: '*.completed' - # - T - Count of completed challenges String: '*.completed-challenges-of' - # - D - Description String: defined in level object - challengeLevel.unlockMessage - # - A - WaiverAmount String: '*.waver-amount' - # - R - Reward String: '*.experience-reward', '*.money-reward', '*.not-repeatable' - # By adding 'i' after R (rewards) will display list of items that are defined in challenge - # and can be customized under 'challenges.gui.description.*' - level-lore-message: STDARi + # List of values and their meaning: + # - LEVEL_STATUS - Status String: '*.completed' + # - CHALLENGE_COUNT - Count of completed challenges String: '*.completed-challenges-of' + # - UNLOCK_MESSAGE - Description String: defined in level object - challengeLevel.unlockMessage + # - WAIVER_AMOUNT - WaiverAmount String: '*.waver-amount' + # - LEVEL_REWARD_TEXT - Reward String: message that is defined in challengeLevel.rewardText. + # - LEVEL_REWARD_OTHER - Reward extra String: '*.experience-reward', '*.money-reward' + # - LEVEL_REWARD_ITEMS - Reward Items: List of items that will be rewarded. + # - LEVEL_REWARD_COMMANDS - Reward Commands: List of commands that will be rewarded. + # Reward items that are defined in challenge level and can be customized under 'challenges.gui.item-description.*' + level-lore: + - LEVEL_STATUS + - CHALLENGE_COUNT + - UNLOCK_MESSAGE + - WAIVER_AMOUNT + - LEVEL_REWARD_TEXT + - LEVEL_REWARD_OTHER + - LEVEL_REWARD_ITEMS + - LEVEL_REWARD_COMMANDS # # This indicate if challenges data will be stored per island (true) or per player (false). store-island-data: false diff --git a/src/main/resources/locales/en-US.yml b/src/main/resources/locales/en-US.yml index 0f18b12..070ffe6 100755 --- a/src/main/resources/locales/en-US.yml +++ b/src/main/resources/locales/en-US.yml @@ -273,6 +273,28 @@ challenges: library-lang: '&aLanguage: [lang]' library-gamemode: '&aPrimary for [gamemode]' + lore: + level: "Level string. | Represents translation 'challenges.gui.challenge-description.level'." + status: "Status string. | Represents translation 'challenges.gui.challenge-description.completed'." + count: "Completion count string. | Represents translation for 'challenges.gui.challenge-description.completed-times', 'challenges.gui.challenge-description.completed-times-of' and 'challenges.gui.challenge-description.maxed-reached'." + description: "Description string. | Defined in challenges object - challenge.description." + warnings: "Warning string. | Represents translation for: | 'challenges.gui.challenge-description.warning-items-take' | 'challenges.gui.challenge-description.objects-close-by' | 'challenges.gui.challenge-description.warning-entities-kill' | 'challenges.gui.challenge-description.warning-blocks-remove'." + environment: "Environment string. | Defined in challenges object - challenge.environment." + requirements: "Requirement string. | Represents translation for: | 'challenges.gui.challenge-description.required-level' | 'challenges.gui.challenge-description.required-money' | 'challenges.gui.challenge-description.required-experience' | and challenge.requiredItems, challenge.requiredBlocks or challenge.requiredEntities." + reward_text: "Reward string. | Defined in challenge.rewardText and challenge.repeatRewardText" + reward_other: "Reward other String. | Represents translation for: | 'challenges.gui.challenge-description.experience-reward' | 'challenges.gui.challenge-description.money-reward' | 'challenges.gui.challenge-description.not-repeatable'." + reward_items: "Reward Items. | List of items that will be rewarded defined in challenge.rewardItems and challenge.repeatRewardItems." + reward_commands: "Reward Commands. | List of commands that will be rewarded defined in challenge.rewardCommands and challenge.repeatRewardCommands." + + level_status: "Status string. | Represents translation 'challenges.gui.level-description.completed'." + challenge_count: "Completed challenge count string. | Represents translation for 'challenges.gui.level-description.completed-challenges-of'" + unlock_message: "Unlock message string. | Defined in challenges Level object - challengeLevel.unlockMessage." + waiver_amount: "Shippable challenge count to unlock next level string. | Represents translation for 'challenges.gui.level-description.waver-amount'" + level_reward_text: "Reward string. | Defined in challengeLevel.rewardText" + level_reward_other: "Reward other String. | Represents translation for: | 'challenges.gui.level-description.experience-reward' | 'challenges.gui.level-description.money-reward'." + level_reward_items: "Reward Items. | List of items that will be rewarded defined in challengeLevel.rewardItems." + level_reward_commands: "Reward Commands. | List of commands that will be rewarded defined in challengeLevel.rewardCommands." + current-value: '|&6Current value: [value].' enabled: 'Active' disabled: 'Disabled'