From b82defe3b57f705fa674a8ecebad3f622ea993e4 Mon Sep 17 00:00:00 2001 From: tastybento Date: Sun, 26 Nov 2023 18:52:39 -0800 Subject: [PATCH] Show money as formatted. Addresses #324 --- .../challenges/panel/CommonPanel.java | 1346 +++---- .../panel/admin/EditChallengePanel.java | 3132 ++++++++--------- 2 files changed, 1961 insertions(+), 2517 deletions(-) diff --git a/src/main/java/world/bentobox/challenges/panel/CommonPanel.java b/src/main/java/world/bentobox/challenges/panel/CommonPanel.java index 14fb725..f4236d6 100644 --- a/src/main/java/world/bentobox/challenges/panel/CommonPanel.java +++ b/src/main/java/world/bentobox/challenges/panel/CommonPanel.java @@ -3,9 +3,14 @@ // Copyright - 2021 // - package world.bentobox.challenges.panel; +import java.time.Duration; +import java.util.Arrays; +import java.util.Comparator; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; import org.bukkit.Material; import org.bukkit.World; @@ -13,10 +18,6 @@ import org.bukkit.inventory.ItemStack; import org.eclipse.jdt.annotation.NonNull; import org.eclipse.jdt.annotation.Nullable; -import java.time.*; -import java.util.*; -import java.util.stream.Collectors; - import world.bentobox.bentobox.api.panels.PanelItem; import world.bentobox.bentobox.api.panels.builders.PanelItemBuilder; import world.bentobox.bentobox.api.user.User; @@ -24,1045 +25,836 @@ import world.bentobox.bentobox.util.Util; import world.bentobox.challenges.ChallengesAddon; import world.bentobox.challenges.database.object.Challenge; import world.bentobox.challenges.database.object.ChallengeLevel; -import world.bentobox.challenges.database.object.requirements.*; +import world.bentobox.challenges.database.object.requirements.InventoryRequirements; +import world.bentobox.challenges.database.object.requirements.IslandRequirements; +import world.bentobox.challenges.database.object.requirements.OtherRequirements; +import world.bentobox.challenges.database.object.requirements.StatisticRequirements; import world.bentobox.challenges.managers.ChallengesManager; import world.bentobox.challenges.utils.Constants; import world.bentobox.challenges.utils.LevelStatus; import world.bentobox.challenges.utils.Utils; - /** * This class contains common methods for all panels. */ -public abstract class CommonPanel -{ +public abstract class CommonPanel { /** * This is default constructor for all classes that extends CommonPanel. * * @param addon ChallengesAddon instance. - * @param user User who opens panel. + * @param user User who opens panel. */ - protected CommonPanel(ChallengesAddon addon, User user, World world, String topLabel, String permissionPrefix) - { - this.addon = addon; - this.world = world; - this.manager = addon.getChallengesManager(); - this.user = user; + protected CommonPanel(ChallengesAddon addon, User user, World world, String topLabel, String permissionPrefix) { + this.addon = addon; + this.world = world; + this.manager = addon.getChallengesManager(); + this.user = user; - this.topLabel = topLabel; - this.permissionPrefix = permissionPrefix; + this.topLabel = topLabel; + this.permissionPrefix = permissionPrefix; - this.parentPanel = null; + this.parentPanel = null; - this.returnButton = new PanelItemBuilder(). - name(this.user.getTranslation(Constants.BUTTON + "quit.name")). - description(this.user.getTranslationOrNothing(Constants.BUTTON + "quit.description")). - description(""). - description(this.user.getTranslationOrNothing(Constants.TIPS + "click-to-quit")). - icon(Material.OAK_DOOR). - clickHandler((panel, user1, clickType, i) -> { - this.user.closeInventory(); - return true; - }).build(); + this.returnButton = new PanelItemBuilder().name(this.user.getTranslation(Constants.BUTTON + "quit.name")) + .description(this.user.getTranslationOrNothing(Constants.BUTTON + "quit.description")).description("") + .description(this.user.getTranslationOrNothing(Constants.TIPS + "click-to-quit")) + .icon(Material.OAK_DOOR).clickHandler((panel, user1, clickType, i) -> { + this.user.closeInventory(); + return true; + }).build(); } - /** * This is default constructor for all classes that extends CommonPanel. * * @param parentPanel Parent panel of current panel. */ - protected CommonPanel(@NonNull CommonPanel parentPanel) - { - this.addon = parentPanel.addon; - this.manager = parentPanel.manager; - this.user = parentPanel.user; - this.world = parentPanel.world; + protected CommonPanel(@NonNull CommonPanel parentPanel) { + this.addon = parentPanel.addon; + this.manager = parentPanel.manager; + this.user = parentPanel.user; + this.world = parentPanel.world; - this.topLabel = parentPanel.topLabel; - this.permissionPrefix = parentPanel.permissionPrefix; + this.topLabel = parentPanel.topLabel; + this.permissionPrefix = parentPanel.permissionPrefix; - this.parentPanel = parentPanel; + this.parentPanel = parentPanel; - this.returnButton = new PanelItemBuilder(). - name(this.user.getTranslation(Constants.BUTTON + "return.name")). - description(this.user.getTranslationOrNothing(Constants.BUTTON + "return.description")). - description(""). - description(this.user.getTranslationOrNothing(Constants.TIPS + "click-to-return")). - icon(Material.OAK_DOOR). - clickHandler((panel, user1, clickType, i) -> { - this.parentPanel.build(); - return true; - }).build(); + this.returnButton = new PanelItemBuilder().name(this.user.getTranslation(Constants.BUTTON + "return.name")) + .description(this.user.getTranslationOrNothing(Constants.BUTTON + "return.description")).description("") + .description(this.user.getTranslationOrNothing(Constants.TIPS + "click-to-return")) + .icon(Material.OAK_DOOR).clickHandler((panel, user1, clickType, i) -> { + this.parentPanel.build(); + return true; + }).build(); } - /** * This method allows building panel. */ protected abstract void build(); - /** * This method reopens given panel. + * * @param panel Panel that must be reopened. */ - public static void reopen(CommonPanel panel) - { - panel.build(); + public static void reopen(CommonPanel panel) { + panel.build(); } - // --------------------------------------------------------------------- // Section: Common methods // --------------------------------------------------------------------- - /** - * This method generates and returns given challenge description. It is used here to avoid multiple - * duplicates, as it would be nice to have single place where challenge could be generated. + * This method generates and returns given challenge description. It is used + * here to avoid multiple duplicates, as it would be nice to have single place + * where challenge could be generated. + * * @param challenge Challenge which description must be generated. - * @param target target player. + * @param target target player. * @return List of strings that will be used in challenges description. */ - protected List generateChallengeDescription(Challenge challenge, @Nullable User target) - { - // Some values to avoid over checking. - final boolean isCompletedOnce = target != null && - this.manager.isChallengeComplete(target.getUniqueId(), this.world, challenge); + protected List generateChallengeDescription(Challenge challenge, @Nullable User target) { + // Some values to avoid over checking. + final boolean isCompletedOnce = target != null + && this.manager.isChallengeComplete(target.getUniqueId(), this.world, challenge); - final long doneTimes = target != null && challenge.isRepeatable() ? - this.manager.getChallengeTimes(target, this.world, challenge) : (isCompletedOnce ? 0 : 1); + final long doneTimes = target != null && challenge.isRepeatable() + ? this.manager.getChallengeTimes(target, this.world, challenge) + : (isCompletedOnce ? 0 : 1); - boolean isCompletedAll = isCompletedOnce && - (!challenge.isRepeatable() || - challenge.getMaxTimes() > 0 && doneTimes >= challenge.getMaxTimes()); + boolean isCompletedAll = isCompletedOnce + && (!challenge.isRepeatable() || challenge.getMaxTimes() > 0 && doneTimes >= challenge.getMaxTimes()); - final String reference = Constants.DESCRIPTIONS + "challenge."; + final String reference = Constants.DESCRIPTIONS + "challenge."; - // Get description from custom translations - String description = this.user.getTranslationOrNothing( - "challenges.challenges." + challenge.getUniqueId() + ".description"); + // Get description from custom translations + String description = this.user + .getTranslationOrNothing("challenges.challenges." + challenge.getUniqueId() + ".description"); - if (description.isEmpty()) - { - // Get data from object in single string. - description = Util.translateColorCodes(String.join("\n", challenge.getDescription())); - } + if (description.isEmpty()) { + // Get data from object in single string. + description = Util.translateColorCodes(String.join("\n", challenge.getDescription())); + } - // Non-memory optimal code used for easier debugging and nicer code layout for my eye :) - // Get status in single string - String status = this.generateChallengeStatus(isCompletedOnce, - isCompletedAll, - doneTimes, - challenge.getMaxTimes()); - // Get requirements in single string - String requirements = isCompletedAll ? "" : this.generateRequirements(challenge, target); - // Get rewards in single string - String rewards = isCompletedAll ? "" : this.generateRewards(challenge, isCompletedOnce); - // Get coolDown in singe string - String coolDown = isCompletedAll || challenge.getTimeout() <= 0 ? "" : - this.generateCoolDown(challenge, target); + // Non-memory optimal code used for easier debugging and nicer code layout for + // my eye :) + // Get status in single string + String status = this.generateChallengeStatus(isCompletedOnce, isCompletedAll, doneTimes, + challenge.getMaxTimes()); + // Get requirements in single string + String requirements = isCompletedAll ? "" : this.generateRequirements(challenge, target); + // Get rewards in single string + String rewards = isCompletedAll ? "" : this.generateRewards(challenge, isCompletedOnce); + // Get coolDown in singe string + String coolDown = isCompletedAll || challenge.getTimeout() <= 0 ? "" : this.generateCoolDown(challenge, target); - if (!description.replaceAll("(?m)^[ \\t]*\\r?\\n", "").isEmpty()) - { - String returnString = this.user.getTranslationOrNothing(reference + "lore", - "[requirements]", requirements, - "[rewards]", rewards, - "[status]", status, - "[cooldown]", coolDown); + if (!description.replaceAll("(?m)^[ \\t]*\\r?\\n", "").isEmpty()) { + String returnString = this.user.getTranslationOrNothing(reference + "lore", "[requirements]", requirements, + "[rewards]", rewards, "[status]", status, "[cooldown]", coolDown); - // remove empty lines from the generated text. - List collect = - Arrays.stream(returnString.replaceAll("(?m)^[ \\t]*\\r?\\n", ""). - split("\n")). - collect(Collectors.toList()); + // remove empty lines from the generated text. + List collect = Arrays.stream(returnString.replaceAll("(?m)^[ \\t]*\\r?\\n", "").split("\n")) + .collect(Collectors.toList()); - // find and replace description from collected blocks. + // find and replace description from collected blocks. - for (int i = 0; i < collect.size(); i++) - { - if (collect.get(i).contains(Constants.PARAMETER_DESCRIPTION)) - { - collect.set(i, collect.get(i).replace(Constants.PARAMETER_DESCRIPTION, description)); - } - } + for (int i = 0; i < collect.size(); i++) { + if (collect.get(i).contains(Constants.PARAMETER_DESCRIPTION)) { + collect.set(i, collect.get(i).replace(Constants.PARAMETER_DESCRIPTION, description)); + } + } - return collect; - } - else - { - String returnString = this.user.getTranslationOrNothing(reference + "lore", - Constants.PARAMETER_DESCRIPTION, description, - "[requirements]", requirements, - "[rewards]", rewards, - "[status]", status, - "[cooldown]", coolDown); + return collect; + } else { + String returnString = this.user.getTranslationOrNothing(reference + "lore", Constants.PARAMETER_DESCRIPTION, + description, "[requirements]", requirements, "[rewards]", rewards, "[status]", status, "[cooldown]", + coolDown); - // Remove empty lines and returns as a list. + // Remove empty lines and returns as a list. - return Arrays.stream(returnString.replaceAll("(?m)^[ \\t]*\\r?\\n", ""). - split("\n")). - collect(Collectors.toList()); - } + return Arrays.stream(returnString.replaceAll("(?m)^[ \\t]*\\r?\\n", "").split("\n")) + .collect(Collectors.toList()); + } } - /** * Generate cool down string. * * @param challenge the challenge - * @param target the target + * @param target the target * @return the string */ - private String generateCoolDown(Challenge challenge, @Nullable User target) - { - final String reference = Constants.DESCRIPTIONS + "challenge.cooldown."; + private String generateCoolDown(Challenge challenge, @Nullable User target) { + final String reference = Constants.DESCRIPTIONS + "challenge.cooldown."; - String coolDown; + String coolDown; - if (target != null && this.manager.isBreachingTimeOut(target, this.world, challenge)) - { - long missing = this.manager.getLastCompletionDate(this.user, this.world, challenge) + - challenge.getTimeout() - System.currentTimeMillis(); + if (target != null && this.manager.isBreachingTimeOut(target, this.world, challenge)) { + long missing = this.manager.getLastCompletionDate(this.user, this.world, challenge) + challenge.getTimeout() + - System.currentTimeMillis(); - coolDown = this.user.getTranslation(reference + "wait-time", - "[time]", - Utils.parseDuration(Duration.ofMillis(missing), this.user)); - } - else - { - coolDown = ""; - } + coolDown = this.user.getTranslation(reference + "wait-time", "[time]", + Utils.parseDuration(Duration.ofMillis(missing), this.user)); + } else { + coolDown = ""; + } - String timeout = this.user.getTranslation(reference + "timeout", - "[time]", - Utils.parseDuration(Duration.ofMillis(challenge.getTimeout()), this.user)); + String timeout = this.user.getTranslation(reference + "timeout", "[time]", + Utils.parseDuration(Duration.ofMillis(challenge.getTimeout()), this.user)); - return this.user.getTranslation(reference + "lore", - "[timeout]", timeout, - "[wait-time]", coolDown); + return this.user.getTranslation(reference + "lore", "[timeout]", timeout, "[wait-time]", coolDown); } - /** * This method generate requirements description for given challenge. + * * @param challenge Challenge which requirements must be generated. * @return Lore message with requirements. */ - private String generateRequirements(Challenge challenge, @Nullable User target) - { - final String reference = Constants.DESCRIPTIONS + "challenge.requirements."; + private String generateRequirements(Challenge challenge, @Nullable User target) { + final String reference = Constants.DESCRIPTIONS + "challenge.requirements."; - String environment; + String environment; - if (challenge.getEnvironment().isEmpty() || challenge.getEnvironment().size() == 3) - { - // If challenge can be completed everywhere, do not display requirement. - environment = ""; - } - else if (challenge.getEnvironment().size() == 1) - { - environment = this.user.getTranslationOrNothing(reference + "environment-single", - Constants.PARAMETER_ENVIRONMENT, - Utils.prettifyObject(challenge.getEnvironment().iterator().next(), this.user)); - } - else - { - StringBuilder builder = new StringBuilder(); - builder.append(this.user.getTranslationOrNothing(reference + "environment-title")); - challenge.getEnvironment().stream().sorted().forEach(en -> - { - builder.append("\n"); - builder.append(this.user.getTranslationOrNothing(reference + "environment-single", - Constants.PARAMETER_ENVIRONMENT, - Utils.prettifyObject(en, this.user))); - }); + if (challenge.getEnvironment().isEmpty() || challenge.getEnvironment().size() == 3) { + // If challenge can be completed everywhere, do not display requirement. + environment = ""; + } else if (challenge.getEnvironment().size() == 1) { + environment = this.user.getTranslationOrNothing(reference + "environment-single", + Constants.PARAMETER_ENVIRONMENT, + Utils.prettifyObject(challenge.getEnvironment().iterator().next(), this.user)); + } else { + StringBuilder builder = new StringBuilder(); + builder.append(this.user.getTranslationOrNothing(reference + "environment-title")); + challenge.getEnvironment().stream().sorted().forEach(en -> { + builder.append("\n"); + builder.append(this.user.getTranslationOrNothing(reference + "environment-single", + Constants.PARAMETER_ENVIRONMENT, Utils.prettifyObject(en, this.user))); + }); - environment = builder.toString(); - } + environment = builder.toString(); + } - String permissions; + String permissions; - if (!challenge.getRequirements().getRequiredPermissions().isEmpty()) - { - // Yes list duplication for complete menu. - List missingPermissions = challenge.getRequirements().getRequiredPermissions().stream(). - filter(permission -> target == null || !target.hasPermission(permission)). - sorted().toList(); + if (!challenge.getRequirements().getRequiredPermissions().isEmpty()) { + // Yes list duplication for complete menu. + List missingPermissions = challenge.getRequirements().getRequiredPermissions().stream() + .filter(permission -> target == null || !target.hasPermission(permission)).sorted().toList(); - StringBuilder permissionBuilder = new StringBuilder(); + StringBuilder permissionBuilder = new StringBuilder(); - if (missingPermissions.size() == 1) - { - permissionBuilder.append(this.user.getTranslationOrNothing(reference + "permission-single", - Constants.PARAMETER_PERMISSION, missingPermissions.get(0))); - } - else if (!missingPermissions.isEmpty()) - { - permissionBuilder.append(this.user.getTranslationOrNothing(reference + "permissions-title")); - missingPermissions.forEach(permission -> - { - permissionBuilder.append("\n"); - permissionBuilder.append(this.user.getTranslationOrNothing(reference + "permissions-list", - Constants.PARAMETER_PERMISSION, permission)); - }); - } + if (missingPermissions.size() == 1) { + permissionBuilder.append(this.user.getTranslationOrNothing(reference + "permission-single", + Constants.PARAMETER_PERMISSION, missingPermissions.get(0))); + } else if (!missingPermissions.isEmpty()) { + permissionBuilder.append(this.user.getTranslationOrNothing(reference + "permissions-title")); + missingPermissions.forEach(permission -> { + permissionBuilder.append("\n"); + permissionBuilder.append(this.user.getTranslationOrNothing(reference + "permissions-list", + Constants.PARAMETER_PERMISSION, permission)); + }); + } - permissions = permissionBuilder.toString(); - } - else - { - permissions = ""; - } + permissions = permissionBuilder.toString(); + } else { + permissions = ""; + } - String typeRequirement = switch (challenge.getChallengeType()) { - case INVENTORY_TYPE -> this.generateInventoryChallenge(challenge.getRequirements()); - case ISLAND_TYPE -> this.generateIslandChallenge(challenge.getRequirements()); - case OTHER_TYPE -> this.generateOtherChallenge(challenge.getRequirements()); - case STATISTIC_TYPE -> this.generateStatisticChallenge(challenge.getRequirements()); - }; + String typeRequirement = switch (challenge.getChallengeType()) { + case INVENTORY_TYPE -> this.generateInventoryChallenge(challenge.getRequirements()); + case ISLAND_TYPE -> this.generateIslandChallenge(challenge.getRequirements()); + case OTHER_TYPE -> this.generateOtherChallenge(challenge.getRequirements()); + case STATISTIC_TYPE -> this.generateStatisticChallenge(challenge.getRequirements()); + }; - return this.user.getTranslationOrNothing(reference + "lore", - Constants.PARAMETER_ENVIRONMENT, environment, - "[type-requirement]", typeRequirement, - "[permissions]", permissions); + return this.user.getTranslationOrNothing(reference + "lore", Constants.PARAMETER_ENVIRONMENT, environment, + "[type-requirement]", typeRequirement, "[permissions]", permissions); } - /** * This method generates lore message for island requirement. + * * @param requirement Island Requirement. * @return Requirement lore message. */ - private String generateIslandChallenge(IslandRequirements requirement) - { - final String reference = Constants.DESCRIPTIONS + "challenge.requirements.island."; + private String generateIslandChallenge(IslandRequirements requirement) { + final String reference = Constants.DESCRIPTIONS + "challenge.requirements.island."; - String blocks; + String blocks; - if (!requirement.getRequiredBlocks().isEmpty()) - { - StringBuilder builder = new StringBuilder(); - builder.append(this.user.getTranslationOrNothing(reference + "blocks-title")); - requirement.getRequiredBlocks().entrySet().stream(). - sorted(Map.Entry.comparingByKey()). - forEach(entry -> - { - builder.append("\n"); + if (!requirement.getRequiredBlocks().isEmpty()) { + StringBuilder builder = new StringBuilder(); + builder.append(this.user.getTranslationOrNothing(reference + "blocks-title")); + requirement.getRequiredBlocks().entrySet().stream().sorted(Map.Entry.comparingByKey()).forEach(entry -> { + builder.append("\n"); - if (entry.getValue() > 1) - { - builder.append(this.user.getTranslationOrNothing(reference + "blocks-value", - Constants.PARAMETER_NUMBER, String.valueOf(entry.getValue()), - Constants.PARAMETER_MATERIAL, Utils.prettifyObject(entry.getKey(), this.user))); - } - else - { - builder.append(this.user.getTranslationOrNothing(reference + "block-value", - Constants.PARAMETER_MATERIAL, Utils.prettifyObject(entry.getKey(), this.user))); - } - }); + if (entry.getValue() > 1) { + builder.append(this.user.getTranslationOrNothing(reference + "blocks-value", + Constants.PARAMETER_NUMBER, String.valueOf(entry.getValue()), Constants.PARAMETER_MATERIAL, + Utils.prettifyObject(entry.getKey(), this.user))); + } else { + builder.append(this.user.getTranslationOrNothing(reference + "block-value", + Constants.PARAMETER_MATERIAL, Utils.prettifyObject(entry.getKey(), this.user))); + } + }); - blocks = builder.toString(); - } - else - { - blocks = ""; - } + blocks = builder.toString(); + } else { + blocks = ""; + } - String entities; + String entities; - if (!requirement.getRequiredEntities().isEmpty()) - { - StringBuilder builder = new StringBuilder(); - builder.append(this.user.getTranslationOrNothing(reference + "entities-title")); - requirement.getRequiredEntities().entrySet().stream(). - sorted(Map.Entry.comparingByKey()). - forEach(entry -> - { - builder.append("\n"); + if (!requirement.getRequiredEntities().isEmpty()) { + StringBuilder builder = new StringBuilder(); + builder.append(this.user.getTranslationOrNothing(reference + "entities-title")); + requirement.getRequiredEntities().entrySet().stream().sorted(Map.Entry.comparingByKey()).forEach(entry -> { + builder.append("\n"); - if (entry.getValue() > 1) - { - builder.append(this.user.getTranslationOrNothing(reference + "entities-value", - Constants.PARAMETER_NUMBER, String.valueOf(entry.getValue()), - Constants.PARAMETER_ENTITY, Utils.prettifyObject(entry.getKey(), this.user))); - } - else - { - builder.append(this.user.getTranslationOrNothing(reference + "entity-value", - Constants.PARAMETER_ENTITY, Utils.prettifyObject(entry.getKey(), this.user))); - } - }); + if (entry.getValue() > 1) { + builder.append(this.user.getTranslationOrNothing(reference + "entities-value", + Constants.PARAMETER_NUMBER, String.valueOf(entry.getValue()), Constants.PARAMETER_ENTITY, + Utils.prettifyObject(entry.getKey(), this.user))); + } else { + builder.append(this.user.getTranslationOrNothing(reference + "entity-value", + Constants.PARAMETER_ENTITY, Utils.prettifyObject(entry.getKey(), this.user))); + } + }); - entities = builder.toString(); - } - else - { - entities = ""; - } + entities = builder.toString(); + } else { + entities = ""; + } - String searchRadius = this.user.getTranslationOrNothing(reference + "search-radius", - Constants.PARAMETER_NUMBER, String.valueOf(requirement.getSearchRadius())); + String searchRadius = this.user.getTranslationOrNothing(reference + "search-radius", Constants.PARAMETER_NUMBER, + String.valueOf(requirement.getSearchRadius())); - String warningBlocks = requirement.isRemoveBlocks() ? - this.user.getTranslationOrNothing(reference + "warning-block") : ""; - String warningEntities = requirement.isRemoveEntities() ? - this.user.getTranslationOrNothing(reference + "warning-entity") : ""; + String warningBlocks = requirement.isRemoveBlocks() + ? this.user.getTranslationOrNothing(reference + "warning-block") + : ""; + String warningEntities = requirement.isRemoveEntities() + ? this.user.getTranslationOrNothing(reference + "warning-entity") + : ""; - return this.user.getTranslationOrNothing(reference + "lore", - "[blocks]", blocks, - "[entities]", entities, - "[warning-block]", warningBlocks, - "[warning-entity]", warningEntities, - "[search-radius]", searchRadius); + return this.user.getTranslationOrNothing(reference + "lore", "[blocks]", blocks, "[entities]", entities, + "[warning-block]", warningBlocks, "[warning-entity]", warningEntities, "[search-radius]", searchRadius); } - /** * This method generates lore message for inventory requirement. + * * @param requirement Inventory Requirement. * @return Requirement lore message. */ - private String generateInventoryChallenge(InventoryRequirements requirement) - { - final String reference = Constants.DESCRIPTIONS + "challenge.requirements.inventory."; + private String generateInventoryChallenge(InventoryRequirements requirement) { + final String reference = Constants.DESCRIPTIONS + "challenge.requirements.inventory."; - String items; + String items; - if (!requirement.getRequiredItems().isEmpty()) - { - StringBuilder builder = new StringBuilder(); - builder.append(this.user.getTranslationOrNothing(reference + "item-title")); - Utils.groupEqualItems(requirement.getRequiredItems(), requirement.getIgnoreMetaData()).stream(). - sorted(Comparator.comparing(ItemStack::getType)). - forEach(itemStack -> - { - builder.append("\n"); + if (!requirement.getRequiredItems().isEmpty()) { + StringBuilder builder = new StringBuilder(); + builder.append(this.user.getTranslationOrNothing(reference + "item-title")); + Utils.groupEqualItems(requirement.getRequiredItems(), requirement.getIgnoreMetaData()).stream() + .sorted(Comparator.comparing(ItemStack::getType)).forEach(itemStack -> { + builder.append("\n"); - if (itemStack.getAmount() > 1) - { - builder.append(this.user.getTranslationOrNothing(reference + "items-value", - "[number]", String.valueOf(itemStack.getAmount()), - "[item]", Utils.prettifyObject(itemStack, this.user))); - } - else - { - builder.append(this.user.getTranslationOrNothing(reference + "item-value", - "[item]", Utils.prettifyObject(itemStack, this.user))); - } - }); + if (itemStack.getAmount() > 1) { + builder.append(this.user.getTranslationOrNothing(reference + "items-value", "[number]", + String.valueOf(itemStack.getAmount()), "[item]", + Utils.prettifyObject(itemStack, this.user))); + } else { + builder.append(this.user.getTranslationOrNothing(reference + "item-value", "[item]", + Utils.prettifyObject(itemStack, this.user))); + } + }); - items = builder.toString(); - } - else - { - items = ""; - } + items = builder.toString(); + } else { + items = ""; + } - String warning = requirement.isTakeItems() ? - this.user.getTranslationOrNothing(reference + "warning") : ""; + String warning = requirement.isTakeItems() ? this.user.getTranslationOrNothing(reference + "warning") : ""; - return this.user.getTranslationOrNothing(reference + "lore", - "[items]", items, - "[warning]", warning); + return this.user.getTranslationOrNothing(reference + "lore", "[items]", items, "[warning]", warning); } - /** * This method generates lore message for other requirement. + * * @param requirement Other Requirement. * @return Requirement lore message. */ - private String generateOtherChallenge(OtherRequirements requirement) - { - final String reference = Constants.DESCRIPTIONS + "challenge.requirements.other."; + private String generateOtherChallenge(OtherRequirements requirement) { + final String reference = Constants.DESCRIPTIONS + "challenge.requirements.other."; - String experience = requirement.getRequiredExperience() <= 0 ? "" : - this.user.getTranslationOrNothing(reference + "experience", - "[number]", String.valueOf(requirement.getRequiredExperience())); + String experience = requirement.getRequiredExperience() <= 0 ? "" + : this.user.getTranslationOrNothing(reference + "experience", "[number]", + String.valueOf(requirement.getRequiredExperience())); - String experienceWarning = requirement.getRequiredExperience() > 0 && requirement.isTakeExperience() ? - this.user.getTranslationOrNothing(reference + "experience-warning") : ""; + String experienceWarning = requirement.getRequiredExperience() > 0 && requirement.isTakeExperience() + ? this.user.getTranslationOrNothing(reference + "experience-warning") + : ""; - String money = !this.addon.isEconomyProvided() || requirement.getRequiredMoney() <= 0 ? "" : - this.user.getTranslationOrNothing(reference + "money", - "[number]", String.valueOf(requirement.getRequiredMoney())); + String money = !this.addon.isEconomyProvided() || requirement.getRequiredMoney() <= 0 ? "" + : this.user.getTranslationOrNothing(reference + "money", "[number]", + String.valueOf(requirement.getRequiredMoney())); - String moneyWarning = this.addon.isEconomyProvided() && - requirement.getRequiredMoney() > 0 && - requirement.isTakeMoney() ? - this.user.getTranslationOrNothing(reference + "money-warning") : ""; + String moneyWarning = this.addon.isEconomyProvided() && requirement.getRequiredMoney() > 0 + && requirement.isTakeMoney() ? this.user.getTranslationOrNothing(reference + "money-warning") : ""; - String level = !this.addon.isLevelProvided() || requirement.getRequiredIslandLevel() <= 0 ? "" : - this.user.getTranslationOrNothing(reference + "level", - "[number]", String.valueOf(requirement.getRequiredIslandLevel())); + String level = !this.addon.isLevelProvided() || requirement.getRequiredIslandLevel() <= 0 ? "" + : this.user.getTranslationOrNothing(reference + "level", "[number]", + String.valueOf(requirement.getRequiredIslandLevel())); - return this.user.getTranslationOrNothing(reference + "lore", - "[experience]", experience, - "[experience-warning]", experienceWarning, - "[money]", money, - "[money-warning]", moneyWarning, - "[level]", level); + return this.user.getTranslationOrNothing(reference + "lore", "[experience]", experience, "[experience-warning]", + experienceWarning, "[money]", money, "[money-warning]", moneyWarning, "[level]", level); } - /** * This method generates lore message for Statistic requirement. + * * @param requirement Statistic Requirement. * @return Requirement lore message. */ - private String generateStatisticChallenge(StatisticRequirements requirement) - { - final String reference = Constants.DESCRIPTIONS + "challenge.requirements.statistic."; + private String generateStatisticChallenge(StatisticRequirements requirement) { + final String reference = Constants.DESCRIPTIONS + "challenge.requirements.statistic."; - String statistic; + String statistic; - if (requirement.getStatistic() == null) - { - // Challenges by default comes with empty statistic field. - return ""; - } + if (requirement.getStatistic() == null) { + // Challenges by default comes with empty statistic field. + return ""; + } - switch (requirement.getStatistic().getType()) - { - case UNTYPED -> statistic = this.user.getTranslationOrNothing(reference + "statistic", - "[statistic]", Utils.prettifyObject(requirement.getStatistic(), this.user), - "[number]", String.valueOf(requirement.getAmount())); - case ITEM, BLOCK -> { - if (requirement.getAmount() > 1) - { - statistic = this.user.getTranslationOrNothing(reference + "multiple-target", - "[statistic]", Utils.prettifyObject(requirement.getStatistic(), this.user), - "[number]", String.valueOf(requirement.getAmount()), - "[target]", Utils.prettifyObject(requirement.getMaterial(), this.user)); - } - else - { - statistic = this.user.getTranslationOrNothing(reference + "single-target", - "[statistic]", Utils.prettifyObject(requirement.getStatistic(), this.user), - "[target]", Utils.prettifyObject(requirement.getMaterial(), this.user)); - } - } - case ENTITY -> { - if (requirement.getAmount() > 1) - { - statistic = this.user.getTranslationOrNothing(reference + "multiple-target", - "[statistic]", Utils.prettifyObject(requirement.getStatistic(), this.user), - "[number]", String.valueOf(requirement.getAmount()), - "[target]", Utils.prettifyObject(requirement.getEntity(), this.user)); - } - else - { - statistic = this.user.getTranslationOrNothing(reference + "single-target", - "[statistic]", Utils.prettifyObject(requirement.getStatistic(), this.user), - "[target]", Utils.prettifyObject(requirement.getEntity(), this.user)); - } - } - default -> statistic = ""; - } + switch (requirement.getStatistic().getType()) { + case UNTYPED -> statistic = this.user.getTranslationOrNothing(reference + "statistic", "[statistic]", + Utils.prettifyObject(requirement.getStatistic(), this.user), "[number]", + String.valueOf(requirement.getAmount())); + case ITEM, BLOCK -> { + if (requirement.getAmount() > 1) { + statistic = this.user.getTranslationOrNothing(reference + "multiple-target", "[statistic]", + Utils.prettifyObject(requirement.getStatistic(), this.user), "[number]", + String.valueOf(requirement.getAmount()), "[target]", + Utils.prettifyObject(requirement.getMaterial(), this.user)); + } else { + statistic = this.user.getTranslationOrNothing(reference + "single-target", "[statistic]", + Utils.prettifyObject(requirement.getStatistic(), this.user), "[target]", + Utils.prettifyObject(requirement.getMaterial(), this.user)); + } + } + case ENTITY -> { + if (requirement.getAmount() > 1) { + statistic = this.user.getTranslationOrNothing(reference + "multiple-target", "[statistic]", + Utils.prettifyObject(requirement.getStatistic(), this.user), "[number]", + String.valueOf(requirement.getAmount()), "[target]", + Utils.prettifyObject(requirement.getEntity(), this.user)); + } else { + statistic = this.user.getTranslationOrNothing(reference + "single-target", "[statistic]", + Utils.prettifyObject(requirement.getStatistic(), this.user), "[target]", + Utils.prettifyObject(requirement.getEntity(), this.user)); + } + } + default -> statistic = ""; + } - String warning = requirement.isReduceStatistic() ? - this.user.getTranslationOrNothing(reference + "warning") : ""; + String warning = requirement.isReduceStatistic() ? this.user.getTranslationOrNothing(reference + "warning") + : ""; - return this.user.getTranslationOrNothing(reference + "lore", - "[statistic]", statistic, - "[warning]", warning); + return this.user.getTranslationOrNothing(reference + "lore", "[statistic]", statistic, "[warning]", warning); } - /** * This message generates challenge status description. - * @param completedOnce Indicate that challenge is completed at least one time. - * @param completedAll Indicate that challenge is not repeatable anymore. + * + * @param completedOnce Indicate that challenge is completed at least one + * time. + * @param completedAll Indicate that challenge is not repeatable anymore. * @param completionCount Number of completion count. - * @param maxCompletions Number of max completion count. + * @param maxCompletions Number of max completion count. * @return String with a text that will be generated for status. */ - private String generateChallengeStatus(boolean completedOnce, - boolean completedAll, - long completionCount, - int maxCompletions) - { - final String reference = Constants.DESCRIPTIONS + "challenge.status."; + private String generateChallengeStatus(boolean completedOnce, boolean completedAll, long completionCount, + int maxCompletions) { + final String reference = Constants.DESCRIPTIONS + "challenge.status."; - if (completedAll) - { - if (maxCompletions > 1) - { - return this.user.getTranslationOrNothing(reference + "completed-times-reached", - Constants.PARAMETER_MAX, String.valueOf(maxCompletions)); - } - else - { - return this.user.getTranslationOrNothing(reference + "completed"); - } - } - else if (completedOnce) - { - if (maxCompletions > 0) - { - return this.user.getTranslationOrNothing(reference + "completed-times-of", - Constants.PARAMETER_MAX, String.valueOf(maxCompletions), - Constants.PARAMETER_NUMBER, String.valueOf(completionCount)); - } - else - { - return this.user.getTranslationOrNothing(reference + "completed-times", - Constants.PARAMETER_NUMBER, String.valueOf(completionCount)); - } - } - else - { - return ""; - } + if (completedAll) { + if (maxCompletions > 1) { + return this.user.getTranslationOrNothing(reference + "completed-times-reached", Constants.PARAMETER_MAX, + String.valueOf(maxCompletions)); + } else { + return this.user.getTranslationOrNothing(reference + "completed"); + } + } else if (completedOnce) { + if (maxCompletions > 0) { + return this.user.getTranslationOrNothing(reference + "completed-times-of", Constants.PARAMETER_MAX, + String.valueOf(maxCompletions), Constants.PARAMETER_NUMBER, String.valueOf(completionCount)); + } else { + return this.user.getTranslationOrNothing(reference + "completed-times", Constants.PARAMETER_NUMBER, + String.valueOf(completionCount)); + } + } else { + return ""; + } } - /** * This method creates reward lore text. - * @param challenge Challenge which reward lore must be generated. - * @param isRepeating Boolean that indicate if it is repeating reward or first time. + * + * @param challenge Challenge which reward lore must be generated. + * @param isRepeating Boolean that indicate if it is repeating reward or first + * time. * @return Reward text. */ - private String generateRewards(Challenge challenge, boolean isRepeating) - { - if (isRepeating) - { - return this.generateRepeatReward(challenge); - } - else - { - return this.generateReward(challenge); - } + private String generateRewards(Challenge challenge, boolean isRepeating) { + if (isRepeating) { + return this.generateRepeatReward(challenge); + } else { + return this.generateReward(challenge); + } } - /** * This method creates repeat reward lore text. + * * @param challenge Challenge which reward lore must be generated. * @return Reward text. */ - private String generateRepeatReward(Challenge challenge) - { - final String reference = Constants.DESCRIPTIONS + "challenge.rewards."; + private String generateRepeatReward(Challenge challenge) { + final String reference = Constants.DESCRIPTIONS + "challenge.rewards."; - String items; + String items; - if (!challenge.getRepeatItemReward().isEmpty()) - { - StringBuilder builder = new StringBuilder(); - builder.append(this.user.getTranslationOrNothing(reference + "item-title")); - Utils.groupEqualItems(challenge.getRepeatItemReward(), challenge.getIgnoreRewardMetaData()).stream(). - sorted(Comparator.comparing(ItemStack::getType)). - forEach(itemStack -> - { - builder.append("\n"); + if (!challenge.getRepeatItemReward().isEmpty()) { + StringBuilder builder = new StringBuilder(); + builder.append(this.user.getTranslationOrNothing(reference + "item-title")); + Utils.groupEqualItems(challenge.getRepeatItemReward(), challenge.getIgnoreRewardMetaData()).stream() + .sorted(Comparator.comparing(ItemStack::getType)).forEach(itemStack -> { + builder.append("\n"); - if (itemStack.getAmount() > 1) - { - builder.append(this.user.getTranslationOrNothing(reference + "items-value", - "[number]", String.valueOf(itemStack.getAmount()), - "[item]", Utils.prettifyObject(itemStack, this.user))); - } - else - { - builder.append(this.user.getTranslationOrNothing(reference + "item-value", - "[item]", Utils.prettifyObject(itemStack, this.user))); - } - }); + if (itemStack.getAmount() > 1) { + builder.append(this.user.getTranslationOrNothing(reference + "items-value", "[number]", + String.valueOf(itemStack.getAmount()), "[item]", + Utils.prettifyObject(itemStack, this.user))); + } else { + builder.append(this.user.getTranslationOrNothing(reference + "item-value", "[item]", + Utils.prettifyObject(itemStack, this.user))); + } + }); - items = builder.toString(); - } - else - { - items = ""; - } + items = builder.toString(); + } else { + items = ""; + } - String experience = challenge.getRepeatExperienceReward() <= 0 ? "" : - this.user.getTranslationOrNothing(reference + "experience", - "[number]", String.valueOf(challenge.getRepeatExperienceReward())); + String experience = challenge.getRepeatExperienceReward() <= 0 ? "" + : this.user.getTranslationOrNothing(reference + "experience", "[number]", + String.valueOf(challenge.getRepeatExperienceReward())); - String money = !this.addon.isEconomyProvided() || challenge.getRepeatMoneyReward() <= 0 ? "" : - this.user.getTranslationOrNothing(reference + "money", - "[number]", String.valueOf(challenge.getRepeatMoneyReward())); + String money = !this.addon.isEconomyProvided() || challenge.getRepeatMoneyReward() <= 0 ? "" + : this.user.getTranslationOrNothing(reference + "money", "[number]", + addon.getPlugin().getVault().map(v -> v.format(challenge.getRepeatMoneyReward())) + .orElse(String.valueOf(challenge.getRepeatMoneyReward()))); - String commands; + String commands; - if (!challenge.getRepeatRewardCommands().isEmpty()) - { - StringBuilder permissionBuilder = new StringBuilder(); + if (!challenge.getRepeatRewardCommands().isEmpty()) { + StringBuilder permissionBuilder = new StringBuilder(); - if (!challenge.getRepeatRewardCommands().isEmpty()) - { - permissionBuilder.append(this.user.getTranslationOrNothing(reference + "commands-title")); + if (!challenge.getRepeatRewardCommands().isEmpty()) { + permissionBuilder.append(this.user.getTranslationOrNothing(reference + "commands-title")); - challenge.getRepeatRewardCommands().forEach(command -> - { - permissionBuilder.append("\n"); - permissionBuilder.append(this.user.getTranslationOrNothing(reference + "command", - "[command]", command)); - }); - } + challenge.getRepeatRewardCommands().forEach(command -> { + permissionBuilder.append("\n"); + permissionBuilder + .append(this.user.getTranslationOrNothing(reference + "command", "[command]", command)); + }); + } - commands = permissionBuilder.toString(); - } - else - { - commands = ""; - } + commands = permissionBuilder.toString(); + } else { + commands = ""; + } - if (challenge.getRepeatRewardText().isEmpty() && - items.isEmpty() && - experience.isEmpty() && - money.isEmpty() && - commands.isEmpty()) - { - // If everything is empty, do not return anything. - return ""; - } + if (challenge.getRepeatRewardText().isEmpty() && items.isEmpty() && experience.isEmpty() && money.isEmpty() + && commands.isEmpty()) { + // If everything is empty, do not return anything. + return ""; + } - String rewardText = this.user.getTranslationOrNothing( - "challenges.challenges." + challenge.getUniqueId() + ".repeat-reward-text"); + String rewardText = this.user + .getTranslationOrNothing("challenges.challenges." + challenge.getUniqueId() + ".repeat-reward-text"); - if (rewardText.isEmpty()) - { - rewardText = Util.translateColorCodes(String.join("\n", challenge.getRepeatRewardText())); - } + if (rewardText.isEmpty()) { + rewardText = Util.translateColorCodes(String.join("\n", challenge.getRepeatRewardText())); + } - return this.user.getTranslationOrNothing(reference + "lore", - "[text]", rewardText, - "[items]", items, - "[experience]", experience, - "[money]", money, - "[commands]", commands); + return this.user.getTranslationOrNothing(reference + "lore", "[text]", rewardText, "[items]", items, + "[experience]", experience, "[money]", money, "[commands]", commands); } - /** * This method creates reward lore text. + * * @param challenge Challenge which reward lore must be generated. * @return Reward text. */ - private String generateReward(Challenge challenge) - { - final String reference = Constants.DESCRIPTIONS + "challenge.rewards."; + private String generateReward(Challenge challenge) { + final String reference = Constants.DESCRIPTIONS + "challenge.rewards."; - String items; + String items; - if (!challenge.getRewardItems().isEmpty()) - { - StringBuilder builder = new StringBuilder(); - builder.append(this.user.getTranslationOrNothing(reference + "item-title")); - Utils.groupEqualItems(challenge.getRewardItems(), challenge.getIgnoreRewardMetaData()).stream(). - sorted(Comparator.comparing(ItemStack::getType)). - forEach(itemStack -> - { - builder.append("\n"); + if (!challenge.getRewardItems().isEmpty()) { + StringBuilder builder = new StringBuilder(); + builder.append(this.user.getTranslationOrNothing(reference + "item-title")); + Utils.groupEqualItems(challenge.getRewardItems(), challenge.getIgnoreRewardMetaData()).stream() + .sorted(Comparator.comparing(ItemStack::getType)).forEach(itemStack -> { + builder.append("\n"); - if (itemStack.getAmount() > 1) - { - builder.append(this.user.getTranslationOrNothing(reference + "items-value", - "[number]", String.valueOf(itemStack.getAmount()), - "[item]", Utils.prettifyObject(itemStack, this.user))); - } - else - { - builder.append(this.user.getTranslationOrNothing(reference + "item-value", - "[item]", Utils.prettifyObject(itemStack, this.user))); - } - }); + if (itemStack.getAmount() > 1) { + builder.append(this.user.getTranslationOrNothing(reference + "items-value", "[number]", + String.valueOf(itemStack.getAmount()), "[item]", + Utils.prettifyObject(itemStack, this.user))); + } else { + builder.append(this.user.getTranslationOrNothing(reference + "item-value", "[item]", + Utils.prettifyObject(itemStack, this.user))); + } + }); - items = builder.toString(); - } - else - { - items = ""; - } + items = builder.toString(); + } else { + items = ""; + } - String experience = challenge.getRewardExperience() <= 0 ? "" : - this.user.getTranslationOrNothing(reference + "experience", - "[number]", String.valueOf(challenge.getRewardExperience())); + String experience = challenge.getRewardExperience() <= 0 ? "" + : this.user.getTranslationOrNothing(reference + "experience", "[number]", + String.valueOf(challenge.getRewardExperience())); - String money = !this.addon.isEconomyProvided() || challenge.getRewardMoney() <= 0 ? "" : - this.user.getTranslationOrNothing(reference + "money", - "[number]", String.valueOf(challenge.getRewardMoney())); + String money = !this.addon.isEconomyProvided() || challenge.getRewardMoney() <= 0 ? "" + : this.user.getTranslationOrNothing(reference + "money", "[number]", + addon.getPlugin().getVault().map(v -> v.format(challenge.getRewardMoney())) + .orElse(String.valueOf(challenge.getRewardMoney()))); - String commands; + String commands; - if (!challenge.getRewardCommands().isEmpty()) - { - StringBuilder permissionBuilder = new StringBuilder(); + if (!challenge.getRewardCommands().isEmpty()) { + StringBuilder permissionBuilder = new StringBuilder(); - if (!challenge.getRewardCommands().isEmpty()) - { - permissionBuilder.append(this.user.getTranslationOrNothing(reference + "commands-title")); + if (!challenge.getRewardCommands().isEmpty()) { + permissionBuilder.append(this.user.getTranslationOrNothing(reference + "commands-title")); - challenge.getRewardCommands().forEach(command -> - { - permissionBuilder.append("\n"); - permissionBuilder.append(this.user.getTranslationOrNothing(reference + "command", - "[command]", command)); - }); - } + challenge.getRewardCommands().forEach(command -> { + permissionBuilder.append("\n"); + permissionBuilder + .append(this.user.getTranslationOrNothing(reference + "command", "[command]", command)); + }); + } - commands = permissionBuilder.toString(); - } - else - { - commands = ""; - } + commands = permissionBuilder.toString(); + } else { + commands = ""; + } - if (challenge.getRewardText().isEmpty() && - items.isEmpty() && - experience.isEmpty() && - money.isEmpty() && - commands.isEmpty()) - { - // If everything is empty, do not return anything. - return ""; - } + if (challenge.getRewardText().isEmpty() && items.isEmpty() && experience.isEmpty() && money.isEmpty() + && commands.isEmpty()) { + // If everything is empty, do not return anything. + return ""; + } - String rewardText = this.user.getTranslationOrNothing( - "challenges.challenges." + challenge.getUniqueId() + ".reward-text"); + String rewardText = this.user + .getTranslationOrNothing("challenges.challenges." + challenge.getUniqueId() + ".reward-text"); - if (rewardText.isEmpty()) - { - rewardText = Util.translateColorCodes(String.join("\n", challenge.getRewardText())); - } + if (rewardText.isEmpty()) { + rewardText = Util.translateColorCodes(String.join("\n", challenge.getRewardText())); + } - return this.user.getTranslationOrNothing(reference + "lore", - "[text]", rewardText, - "[items]", items, - "[experience]", experience, - "[money]", money, - "[commands]", commands); + return this.user.getTranslationOrNothing(reference + "lore", "[text]", rewardText, "[items]", items, + "[experience]", experience, "[money]", money, "[commands]", commands); } - /** * This method generates level description string. + * * @param level Level which string must be generated. * @return List with generated description. */ - protected List generateLevelDescription(ChallengeLevel level) - { - final String reference = Constants.DESCRIPTIONS + "level."; + protected List generateLevelDescription(ChallengeLevel level) { + final String reference = Constants.DESCRIPTIONS + "level."; - // Non-memory optimal code used for easier debugging and nicer code layout for my eye :) - // Get status in single string - String status = ""; - // Get requirements in single string - String waiver = this.manager.isLastLevel(level, this.world) ? "" : - this.user.getTranslationOrNothing(reference + "waiver", - "[number]", String.valueOf(level.getWaiverAmount())); - // Get rewards in single string - String rewards = this.generateReward(level); + // Non-memory optimal code used for easier debugging and nicer code layout for + // my eye :) + // Get status in single string + String status = ""; + // Get requirements in single string + String waiver = this.manager.isLastLevel(level, this.world) ? "" + : this.user.getTranslationOrNothing(reference + "waiver", "[number]", + String.valueOf(level.getWaiverAmount())); + // Get rewards in single string + String rewards = this.generateReward(level); - String returnString = this.user.getTranslation(reference + "lore", - "[text]", Util.translateColorCodes(level.getUnlockMessage()), - "[waiver]", waiver, - "[rewards]", rewards, - "[status]", status); + String returnString = this.user.getTranslation(reference + "lore", "[text]", + Util.translateColorCodes(level.getUnlockMessage()), "[waiver]", waiver, "[rewards]", rewards, + "[status]", status); - // Remove empty lines and returns as a list. + // Remove empty lines and returns as a list. - return Arrays.stream(returnString.replaceAll("(?m)^[ \\t]*\\r?\\n", ""). - split("\n")). - collect(Collectors.toList()); + return Arrays.stream(returnString.replaceAll("(?m)^[ \\t]*\\r?\\n", "").split("\n")) + .collect(Collectors.toList()); } - /** * This method generates level description string. + * * @param levelStatus Level which string must be generated. - * @param user User who calls generation. + * @param user User who calls generation. * @return List with generated description. */ - protected List generateLevelDescription(LevelStatus levelStatus, User user) - { - ChallengeLevel level = levelStatus.getLevel(); + protected List generateLevelDescription(LevelStatus levelStatus, User user) { + ChallengeLevel level = levelStatus.getLevel(); - final String reference = Constants.DESCRIPTIONS + "level."; + final String reference = Constants.DESCRIPTIONS + "level."; - // Non-memory optimal code used for easier debugging and nicer code layout for my eye :) - // Get status in single string - String status = this.generateLevelStatus(levelStatus); - // Get requirements in single string - String waiver = this.manager.isLastLevel(level, this.world) || - !levelStatus.isUnlocked() || - levelStatus.isComplete() ? - "" : this.user.getTranslationOrNothing(reference + "waiver", - "[number]", String.valueOf(level.getWaiverAmount())); - // Get rewards in single string - String rewards = !levelStatus.isUnlocked() ? "" : this.generateReward(level); + // Non-memory optimal code used for easier debugging and nicer code layout for + // my eye :) + // Get status in single string + String status = this.generateLevelStatus(levelStatus); + // Get requirements in single string + String waiver = this.manager.isLastLevel(level, this.world) || !levelStatus.isUnlocked() + || levelStatus.isComplete() ? "" + : this.user.getTranslationOrNothing(reference + "waiver", "[number]", + String.valueOf(level.getWaiverAmount())); + // Get rewards in single string + String rewards = !levelStatus.isUnlocked() ? "" : this.generateReward(level); - String description = this.user.getTranslationOrNothing( - "challenges.levels." + level.getUniqueId() + ".description"); + String description = this.user + .getTranslationOrNothing("challenges.levels." + level.getUniqueId() + ".description"); - if (description.isEmpty()) - { - description = Util.translateColorCodes(String.join("\n", level.getUnlockMessage())); - } + if (description.isEmpty()) { + description = Util.translateColorCodes(String.join("\n", level.getUnlockMessage())); + } - String returnString = this.user.getTranslation(reference + "lore", - "[text]", description, - "[waiver]", waiver, - "[rewards]", rewards, - "[status]", status); + String returnString = this.user.getTranslation(reference + "lore", "[text]", description, "[waiver]", waiver, + "[rewards]", rewards, "[status]", status); - // Remove empty lines and returns as a list. + // Remove empty lines and returns as a list. - return Arrays.stream(returnString.replaceAll("(?m)^[ \\t]*\\r?\\n", ""). - split("\n")). - collect(Collectors.toList()); + return Arrays.stream(returnString.replaceAll("(?m)^[ \\t]*\\r?\\n", "").split("\n")) + .collect(Collectors.toList()); } - /** * This method generates level status description. + * * @param levelStatus Level status which description must be generated. * @return Level status text. */ - private String generateLevelStatus(LevelStatus levelStatus) - { - final String reference = Constants.DESCRIPTIONS + "level.status."; + private String generateLevelStatus(LevelStatus levelStatus) { + final String reference = Constants.DESCRIPTIONS + "level.status."; - if (!levelStatus.isUnlocked()) - { - return this.user.getTranslationOrNothing(reference + "locked") + "\n" + - this.user.getTranslationOrNothing(reference + "missing-challenges", - "[number]", String.valueOf(levelStatus.getNumberOfChallengesStillToDo())); - } - else if (levelStatus.isComplete()) - { - return this.user.getTranslationOrNothing(reference + "completed"); - } - else - { - ChallengeLevel level = levelStatus.getLevel(); - List challengeList = this.addon.getChallengesManager().getLevelChallenges(level); + if (!levelStatus.isUnlocked()) { + return this.user.getTranslationOrNothing(reference + "locked") + "\n" + + this.user.getTranslationOrNothing(reference + "missing-challenges", "[number]", + String.valueOf(levelStatus.getNumberOfChallengesStillToDo())); + } else if (levelStatus.isComplete()) { + return this.user.getTranslationOrNothing(reference + "completed"); + } else { + ChallengeLevel level = levelStatus.getLevel(); + List challengeList = this.addon.getChallengesManager().getLevelChallenges(level); - // Check if unlock message should appear. - int doneChallenges = (int) challengeList. - stream(). - filter(challenge -> this.addon.getChallengesManager().isChallengeComplete(user.getUniqueId(), world, challenge)). - count(); + // Check if unlock message should appear. + int doneChallenges = (int) challengeList.stream().filter(challenge -> this.addon.getChallengesManager() + .isChallengeComplete(user.getUniqueId(), world, challenge)).count(); - return this.user.getTranslation(reference + "completed-challenges-of", - "[number]", String.valueOf(doneChallenges), - "[max]", String.valueOf(challengeList.size())); - } + return this.user.getTranslation(reference + "completed-challenges-of", "[number]", + String.valueOf(doneChallenges), "[max]", String.valueOf(challengeList.size())); + } } - /** * This method creates reward lore text. + * * @param level ChallengeLevel which reward lore must be generated. * @return Reward text. */ - private String generateReward(ChallengeLevel level) - { - final String reference = Constants.DESCRIPTIONS + "level.rewards."; + private String generateReward(ChallengeLevel level) { + final String reference = Constants.DESCRIPTIONS + "level.rewards."; - String items; + String items; - if (!level.getRewardItems().isEmpty()) - { - StringBuilder builder = new StringBuilder(); - builder.append(this.user.getTranslationOrNothing(reference + "item-title")); - Utils.groupEqualItems(level.getRewardItems(), level.getIgnoreRewardMetaData()).stream(). - sorted(Comparator.comparing(ItemStack::getType)). - forEach(itemStack -> - { - builder.append("\n"); + if (!level.getRewardItems().isEmpty()) { + StringBuilder builder = new StringBuilder(); + builder.append(this.user.getTranslationOrNothing(reference + "item-title")); + Utils.groupEqualItems(level.getRewardItems(), level.getIgnoreRewardMetaData()).stream() + .sorted(Comparator.comparing(ItemStack::getType)).forEach(itemStack -> { + builder.append("\n"); - if (itemStack.getAmount() > 1) - { - builder.append(this.user.getTranslationOrNothing(reference + "items-value", - "[number]", String.valueOf(itemStack.getAmount()), - "[item]", Utils.prettifyObject(itemStack, this.user))); - } - else - { - builder.append(this.user.getTranslationOrNothing(reference + "item-value", - "[item]", Utils.prettifyObject(itemStack, this.user))); - } - }); + if (itemStack.getAmount() > 1) { + builder.append(this.user.getTranslationOrNothing(reference + "items-value", "[number]", + String.valueOf(itemStack.getAmount()), "[item]", + Utils.prettifyObject(itemStack, this.user))); + } else { + builder.append(this.user.getTranslationOrNothing(reference + "item-value", "[item]", + Utils.prettifyObject(itemStack, this.user))); + } + }); - items = builder.toString(); - } - else - { - items = ""; - } + items = builder.toString(); + } else { + items = ""; + } - String experience = level.getRewardExperience() <= 0 ? "" : - this.user.getTranslationOrNothing(reference + "experience", - "[number]", String.valueOf(level.getRewardExperience())); + String experience = level.getRewardExperience() <= 0 ? "" + : this.user.getTranslationOrNothing(reference + "experience", "[number]", + String.valueOf(level.getRewardExperience())); - String money = !this.addon.isEconomyProvided() || level.getRewardMoney() <= 0 ? "" : - this.user.getTranslationOrNothing(reference + "money", - "[number]", String.valueOf(level.getRewardMoney())); + String money = !this.addon.isEconomyProvided() || level.getRewardMoney() <= 0 ? "" + : this.user.getTranslationOrNothing(reference + "money", "[number]", + String.valueOf(level.getRewardMoney())); - String commands; + String commands; - if (!level.getRewardCommands().isEmpty()) - { - StringBuilder permissionBuilder = new StringBuilder(); + if (!level.getRewardCommands().isEmpty()) { + StringBuilder permissionBuilder = new StringBuilder(); - if (!level.getRewardCommands().isEmpty()) - { - permissionBuilder.append(this.user.getTranslationOrNothing(reference + "commands-title")); + if (!level.getRewardCommands().isEmpty()) { + permissionBuilder.append(this.user.getTranslationOrNothing(reference + "commands-title")); - level.getRewardCommands().forEach(command -> - { - permissionBuilder.append("\n"); - permissionBuilder.append(this.user.getTranslationOrNothing(reference + "command", - "[command]", command)); - }); - } + level.getRewardCommands().forEach(command -> { + permissionBuilder.append("\n"); + permissionBuilder + .append(this.user.getTranslationOrNothing(reference + "command", "[command]", command)); + }); + } - commands = permissionBuilder.toString(); - } - else - { - commands = ""; - } + commands = permissionBuilder.toString(); + } else { + commands = ""; + } - if (level.getRewardText().isEmpty() && - items.isEmpty() && - experience.isEmpty() && - money.isEmpty() && - commands.isEmpty()) - { - // If everything is empty, do not return anything. - return ""; - } + if (level.getRewardText().isEmpty() && items.isEmpty() && experience.isEmpty() && money.isEmpty() + && commands.isEmpty()) { + // If everything is empty, do not return anything. + return ""; + } - String rewardText = this.user.getTranslationOrNothing( - "challenges.levels." + level.getUniqueId() + ".reward-text"); + String rewardText = this.user + .getTranslationOrNothing("challenges.levels." + level.getUniqueId() + ".reward-text"); - if (rewardText.isEmpty()) - { - rewardText = Util.translateColorCodes(String.join("\n", level.getRewardText())); - } + if (rewardText.isEmpty()) { + rewardText = Util.translateColorCodes(String.join("\n", level.getRewardText())); + } - return this.user.getTranslationOrNothing(reference + "lore", - "[text]", rewardText, - "[items]", items, - "[experience]", experience, - "[money]", money, - "[commands]", commands); + return this.user.getTranslationOrNothing(reference + "lore", "[text]", rewardText, "[items]", items, + "[experience]", experience, "[money]", money, "[commands]", commands); } - // --------------------------------------------------------------------- // Section: Variables // --------------------------------------------------------------------- - /** * This variable stores parent gui. */ diff --git a/src/main/java/world/bentobox/challenges/panel/admin/EditChallengePanel.java b/src/main/java/world/bentobox/challenges/panel/admin/EditChallengePanel.java index 8c026e4..147f8f7 100644 --- a/src/main/java/world/bentobox/challenges/panel/admin/EditChallengePanel.java +++ b/src/main/java/world/bentobox/challenges/panel/admin/EditChallengePanel.java @@ -1,8 +1,13 @@ package world.bentobox.challenges.panel.admin; - import java.time.Duration; -import java.util.*; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.Comparator; +import java.util.HashSet; +import java.util.List; +import java.util.Set; import java.util.function.Consumer; import java.util.stream.Collectors; @@ -27,2093 +32,1740 @@ import world.bentobox.challenges.database.object.requirements.OtherRequirements; import world.bentobox.challenges.database.object.requirements.StatisticRequirements; import world.bentobox.challenges.panel.CommonPanel; import world.bentobox.challenges.panel.ConversationUtils; -import world.bentobox.challenges.panel.util.*; +import world.bentobox.challenges.panel.util.EnvironmentSelector; +import world.bentobox.challenges.panel.util.ItemSelector; +import world.bentobox.challenges.panel.util.MultiBlockSelector; +import world.bentobox.challenges.panel.util.SingleBlockSelector; +import world.bentobox.challenges.panel.util.SingleEntitySelector; +import world.bentobox.challenges.panel.util.StatisticSelector; import world.bentobox.challenges.utils.Constants; import world.bentobox.challenges.utils.Utils; - /** - * This class contains all necessary methods that creates GUI and allow to edit challenges - * properties. + * This class contains all necessary methods that creates GUI and allow to edit + * challenges properties. */ -public class EditChallengePanel extends CommonPanel -{ +public class EditChallengePanel extends CommonPanel { // --------------------------------------------------------------------- // Section: Constructors // --------------------------------------------------------------------- - /** - * @param addon Addon where panel operates. - * @param world World from which panel was created. - * @param user User who created panel. - * @param topLabel Command top label which creates panel (f.e. island or ai) + * @param addon Addon where panel operates. + * @param world World from which panel was created. + * @param user User who created panel. + * @param topLabel Command top label which creates panel (f.e. island or + * ai) * @param permissionPrefix Command permission prefix (f.e. bskyblock.) - * @param challenge - challenge that needs editing + * @param challenge - challenge that needs editing */ - private EditChallengePanel(ChallengesAddon addon, - User user, - World world, - String topLabel, - String permissionPrefix, - Challenge challenge) - { - super(addon, user, world, topLabel, permissionPrefix); - this.challenge = challenge; - this.currentMenuType = MenuType.PROPERTIES; + private EditChallengePanel(ChallengesAddon addon, User user, World world, String topLabel, String permissionPrefix, + Challenge challenge) { + super(addon, user, world, topLabel, permissionPrefix); + this.challenge = challenge; + this.currentMenuType = MenuType.PROPERTIES; } - /** - * @param panel Parent panel + * @param panel Parent panel * @param challenge challenge that needs editing. */ - private EditChallengePanel(CommonPanel panel, Challenge challenge) - { - super(panel); - this.challenge = challenge; - // Default panel should be Properties. - this.currentMenuType = MenuType.PROPERTIES; + private EditChallengePanel(CommonPanel panel, Challenge challenge) { + super(panel); + this.challenge = challenge; + // Default panel should be Properties. + this.currentMenuType = MenuType.PROPERTIES; } - /** * Open the Challenges Edit GUI. * - * @param addon the addon - * @param world the world - * @param user the user - * @param topLabel the top label + * @param addon the addon + * @param world the world + * @param user the user + * @param topLabel the top label * @param permissionPrefix the permission prefix - * @param challenge - challenge that needs editing + * @param challenge - challenge that needs editing */ - public static void open(ChallengesAddon addon, - User user, - World world, - String topLabel, - String permissionPrefix, - Challenge challenge) - { - new EditChallengePanel(addon, user, world, topLabel, permissionPrefix, challenge).build(); + public static void open(ChallengesAddon addon, User user, World world, String topLabel, String permissionPrefix, + Challenge challenge) { + new EditChallengePanel(addon, user, world, topLabel, permissionPrefix, challenge).build(); } - /** * Open the Challenges Edit GUI. * - * @param panel - Parent Panel + * @param panel - Parent Panel * @param challenge - challenge that needs editing */ - public static void open(CommonPanel panel, Challenge challenge) - { - new EditChallengePanel(panel, challenge).build(); + public static void open(CommonPanel panel, Challenge challenge) { + new EditChallengePanel(panel, challenge).build(); } - // --------------------------------------------------------------------- // Section: Panel Creation related methods // --------------------------------------------------------------------- - /** * {@inheritDoc} */ @Override - protected void build() - { - PanelBuilder panelBuilder = new PanelBuilder().user(this.user).name( - this.user.getTranslation(Constants.TITLE + "edit-challenge", - "[challenge]", this.challenge.getFriendlyName())); + protected void build() { + PanelBuilder panelBuilder = new PanelBuilder().user(this.user).name(this.user + .getTranslation(Constants.TITLE + "edit-challenge", "[challenge]", this.challenge.getFriendlyName())); - PanelUtils.fillBorder(panelBuilder); + PanelUtils.fillBorder(panelBuilder); - panelBuilder.item(2, this.createMenuButton(MenuType.PROPERTIES)); - panelBuilder.item(4, this.createMenuButton(MenuType.REQUIREMENTS)); - panelBuilder.item(6, this.createMenuButton(MenuType.REWARDS)); + panelBuilder.item(2, this.createMenuButton(MenuType.PROPERTIES)); + panelBuilder.item(4, this.createMenuButton(MenuType.REQUIREMENTS)); + panelBuilder.item(6, this.createMenuButton(MenuType.REWARDS)); - if (this.currentMenuType.equals(MenuType.PROPERTIES)) - { - this.buildMainPropertiesPanel(panelBuilder); - } - else if (this.currentMenuType.equals(MenuType.REQUIREMENTS)) - { - switch (this.challenge.getChallengeType()) - { - case INVENTORY_TYPE -> this.buildInventoryRequirementsPanel(panelBuilder); - case ISLAND_TYPE -> this.buildIslandRequirementsPanel(panelBuilder); - case OTHER_TYPE -> this.buildOtherRequirementsPanel(panelBuilder); - case STATISTIC_TYPE -> this.buildStatisticRequirementsPanel(panelBuilder); - } - } - else if (this.currentMenuType.equals(MenuType.REWARDS)) - { - this.buildRewardsPanel(panelBuilder); - } + if (this.currentMenuType.equals(MenuType.PROPERTIES)) { + this.buildMainPropertiesPanel(panelBuilder); + } else if (this.currentMenuType.equals(MenuType.REQUIREMENTS)) { + switch (this.challenge.getChallengeType()) { + case INVENTORY_TYPE -> this.buildInventoryRequirementsPanel(panelBuilder); + case ISLAND_TYPE -> this.buildIslandRequirementsPanel(panelBuilder); + case OTHER_TYPE -> this.buildOtherRequirementsPanel(panelBuilder); + case STATISTIC_TYPE -> this.buildStatisticRequirementsPanel(panelBuilder); + } + } else if (this.currentMenuType.equals(MenuType.REWARDS)) { + this.buildRewardsPanel(panelBuilder); + } - panelBuilder.item(44, this.returnButton); + panelBuilder.item(44, this.returnButton); - // Every time when this GUI is build, save challenge - // This will ensure that all main things will be always stored - this.addon.getChallengesManager().saveChallenge(this.challenge); - // If for some reason challenge is not loaded, do it. - this.addon.getChallengesManager().loadChallenge(this.challenge, this.world,false, null, true); + // Every time when this GUI is build, save challenge + // This will ensure that all main things will be always stored + this.addon.getChallengesManager().saveChallenge(this.challenge); + // If for some reason challenge is not loaded, do it. + this.addon.getChallengesManager().loadChallenge(this.challenge, this.world, false, null, true); - panelBuilder.build(); + panelBuilder.build(); } - /** * This class populate ChallengesEditGUI with main challenge settings. + * * @param panelBuilder PanelBuilder where icons must be added. */ - private void buildMainPropertiesPanel(PanelBuilder panelBuilder) - { - panelBuilder.listener(new IconChanger()); + private void buildMainPropertiesPanel(PanelBuilder panelBuilder) { + panelBuilder.listener(new IconChanger()); - panelBuilder.item(10, this.createButton(Button.NAME)); - panelBuilder.item(16, this.createButton(Button.DEPLOYED)); + panelBuilder.item(10, this.createButton(Button.NAME)); + panelBuilder.item(16, this.createButton(Button.DEPLOYED)); - panelBuilder.item(19, this.createButton(Button.ICON)); - panelBuilder.item(22, this.createButton(Button.DESCRIPTION)); - panelBuilder.item(25, this.createButton(Button.ORDER)); + panelBuilder.item(19, this.createButton(Button.ICON)); + panelBuilder.item(22, this.createButton(Button.DESCRIPTION)); + panelBuilder.item(25, this.createButton(Button.ORDER)); - panelBuilder.item(28, this.createButton(Button.ENVIRONMENT)); - panelBuilder.item(31, this.createButton(Button.REMOVE_ON_COMPLETE)); + panelBuilder.item(28, this.createButton(Button.ENVIRONMENT)); + panelBuilder.item(31, this.createButton(Button.REMOVE_ON_COMPLETE)); } - /** - * This class populates ChallengesEditGUI with island challenges requirement elements. + * This class populates ChallengesEditGUI with island challenges requirement + * elements. + * * @param panelBuilder PanelBuilder where icons must be added. */ - private void buildIslandRequirementsPanel(PanelBuilder panelBuilder) - { - panelBuilder.item(19, this.createRequirementButton(RequirementButton.REQUIRED_ENTITIES)); - panelBuilder.item(28, this.createRequirementButton(RequirementButton.REMOVE_ENTITIES)); + private void buildIslandRequirementsPanel(PanelBuilder panelBuilder) { + panelBuilder.item(19, this.createRequirementButton(RequirementButton.REQUIRED_ENTITIES)); + panelBuilder.item(28, this.createRequirementButton(RequirementButton.REMOVE_ENTITIES)); - panelBuilder.item(21, this.createRequirementButton(RequirementButton.REQUIRED_BLOCKS)); - panelBuilder.item(30, this.createRequirementButton(RequirementButton.REMOVE_BLOCKS)); + panelBuilder.item(21, this.createRequirementButton(RequirementButton.REQUIRED_BLOCKS)); + panelBuilder.item(30, this.createRequirementButton(RequirementButton.REMOVE_BLOCKS)); - panelBuilder.item(23, this.createRequirementButton(RequirementButton.SEARCH_RADIUS)); - panelBuilder.item(25, this.createRequirementButton(RequirementButton.REQUIRED_PERMISSIONS)); + panelBuilder.item(23, this.createRequirementButton(RequirementButton.SEARCH_RADIUS)); + panelBuilder.item(25, this.createRequirementButton(RequirementButton.REQUIRED_PERMISSIONS)); } - /** - * This class populates ChallengesEditGUI with inventory challenges requirement elements. + * This class populates ChallengesEditGUI with inventory challenges requirement + * elements. + * * @param panelBuilder PanelBuilder where icons must be added. */ - private void buildInventoryRequirementsPanel(PanelBuilder panelBuilder) - { - panelBuilder.item(10, this.createRequirementButton(RequirementButton.REQUIRED_ITEMS)); - panelBuilder.item(19, this.createRequirementButton(RequirementButton.REMOVE_ITEMS)); + private void buildInventoryRequirementsPanel(PanelBuilder panelBuilder) { + panelBuilder.item(10, this.createRequirementButton(RequirementButton.REQUIRED_ITEMS)); + panelBuilder.item(19, this.createRequirementButton(RequirementButton.REMOVE_ITEMS)); - if (!this.challenge.getRequirements().getRequiredItems().isEmpty()) - { - panelBuilder.item(12, this.createRequirementButton(RequirementButton.ADD_IGNORED_META)); + if (!this.challenge.getRequirements().getRequiredItems().isEmpty()) { + panelBuilder.item(12, this.createRequirementButton(RequirementButton.ADD_IGNORED_META)); - if (!this.challenge.getRequirements().getIgnoreMetaData().isEmpty()) - { - panelBuilder.item(21, this.createRequirementButton(RequirementButton.REMOVE_IGNORED_META)); - } - } + if (!this.challenge.getRequirements().getIgnoreMetaData().isEmpty()) { + panelBuilder.item(21, this.createRequirementButton(RequirementButton.REMOVE_IGNORED_META)); + } + } - panelBuilder.item(25, this.createRequirementButton(RequirementButton.REQUIRED_PERMISSIONS)); + panelBuilder.item(25, this.createRequirementButton(RequirementButton.REQUIRED_PERMISSIONS)); } - /** - * This class populates ChallengesEditGUI with other challenges requirement elements. + * This class populates ChallengesEditGUI with other challenges requirement + * elements. + * * @param panelBuilder PanelBuilder where icons must be added. */ - private void buildOtherRequirementsPanel(PanelBuilder panelBuilder) - { - panelBuilder.item(10, this.createRequirementButton(RequirementButton.REQUIRED_EXPERIENCE)); - panelBuilder.item(19, this.createRequirementButton(RequirementButton.REMOVE_EXPERIENCE)); + private void buildOtherRequirementsPanel(PanelBuilder panelBuilder) { + panelBuilder.item(10, this.createRequirementButton(RequirementButton.REQUIRED_EXPERIENCE)); + panelBuilder.item(19, this.createRequirementButton(RequirementButton.REMOVE_EXPERIENCE)); - panelBuilder.item(12, this.createRequirementButton(RequirementButton.REQUIRED_MONEY)); - panelBuilder.item(21, this.createRequirementButton(RequirementButton.REMOVE_MONEY)); + panelBuilder.item(12, this.createRequirementButton(RequirementButton.REQUIRED_MONEY)); + panelBuilder.item(21, this.createRequirementButton(RequirementButton.REMOVE_MONEY)); - panelBuilder.item(23, this.createRequirementButton(RequirementButton.REQUIRED_LEVEL)); + panelBuilder.item(23, this.createRequirementButton(RequirementButton.REQUIRED_LEVEL)); - panelBuilder.item(25, this.createRequirementButton(RequirementButton.REQUIRED_PERMISSIONS)); + panelBuilder.item(25, this.createRequirementButton(RequirementButton.REQUIRED_PERMISSIONS)); } - /** - * This class populates ChallengesEditGUI with other challenges requirement elements. + * This class populates ChallengesEditGUI with other challenges requirement + * elements. + * * @param panelBuilder PanelBuilder where icons must be added. */ - private void buildStatisticRequirementsPanel(PanelBuilder panelBuilder) - { - panelBuilder.item(10, this.createRequirementButton(RequirementButton.STATISTIC)); - panelBuilder.item(19, this.createRequirementButton(RequirementButton.REMOVE_STATISTIC)); + private void buildStatisticRequirementsPanel(PanelBuilder panelBuilder) { + panelBuilder.item(10, this.createRequirementButton(RequirementButton.STATISTIC)); + panelBuilder.item(19, this.createRequirementButton(RequirementButton.REMOVE_STATISTIC)); - panelBuilder.item(11, this.createRequirementButton(RequirementButton.STATISTIC_AMOUNT)); + panelBuilder.item(11, this.createRequirementButton(RequirementButton.STATISTIC_AMOUNT)); - StatisticRequirements requirements = this.challenge.getRequirements(); + StatisticRequirements requirements = this.challenge.getRequirements(); - if (requirements.getStatistic() != null) - { - switch (requirements.getStatistic().getType()) - { - case ITEM -> panelBuilder.item(13, this.createRequirementButton(RequirementButton.STATISTIC_ITEMS)); - case BLOCK -> panelBuilder.item(13, this.createRequirementButton(RequirementButton.STATISTIC_BLOCKS)); - case ENTITY -> panelBuilder.item(13, this.createRequirementButton(RequirementButton.STATISTIC_ENTITIES)); - default -> {} - } - } + if (requirements.getStatistic() != null) { + switch (requirements.getStatistic().getType()) { + case ITEM -> panelBuilder.item(13, this.createRequirementButton(RequirementButton.STATISTIC_ITEMS)); + case BLOCK -> panelBuilder.item(13, this.createRequirementButton(RequirementButton.STATISTIC_BLOCKS)); + case ENTITY -> panelBuilder.item(13, this.createRequirementButton(RequirementButton.STATISTIC_ENTITIES)); + default -> { + } + } + } - panelBuilder.item(25, this.createRequirementButton(RequirementButton.REQUIRED_PERMISSIONS)); + panelBuilder.item(25, this.createRequirementButton(RequirementButton.REQUIRED_PERMISSIONS)); } - /** * This class populates ChallengesEditGUI with challenges reward elements. + * * @param panelBuilder PanelBuilder where icons must be added. */ - private void buildRewardsPanel(PanelBuilder panelBuilder) - { - panelBuilder.item(10, this.createRewardButton(RewardButton.REWARD_TEXT)); - panelBuilder.item(19, this.createRewardButton(RewardButton.REWARD_COMMANDS)); + private void buildRewardsPanel(PanelBuilder panelBuilder) { + panelBuilder.item(10, this.createRewardButton(RewardButton.REWARD_TEXT)); + panelBuilder.item(19, this.createRewardButton(RewardButton.REWARD_COMMANDS)); - panelBuilder.item(11, this.createRewardButton(RewardButton.REWARD_ITEMS)); - panelBuilder.item(20, this.createRewardButton(RewardButton.REWARD_EXPERIENCE)); - panelBuilder.item(29, this.createRewardButton(RewardButton.REWARD_MONEY)); + panelBuilder.item(11, this.createRewardButton(RewardButton.REWARD_ITEMS)); + panelBuilder.item(20, this.createRewardButton(RewardButton.REWARD_EXPERIENCE)); + panelBuilder.item(29, this.createRewardButton(RewardButton.REWARD_MONEY)); - panelBuilder.item(22, this.createRewardButton(RewardButton.REPEATABLE)); + panelBuilder.item(22, this.createRewardButton(RewardButton.REPEATABLE)); - if (!this.challenge.getRewardItems().isEmpty() || !this.challenge.getRepeatItemReward().isEmpty()) - { - panelBuilder.item(31, this.createRewardButton(RewardButton.ADD_IGNORED_META)); - } + if (!this.challenge.getRewardItems().isEmpty() || !this.challenge.getRepeatItemReward().isEmpty()) { + panelBuilder.item(31, this.createRewardButton(RewardButton.ADD_IGNORED_META)); + } - if (!this.challenge.getIgnoreRewardMetaData().isEmpty()) - { - panelBuilder.item(32, this.createRewardButton(RewardButton.REMOVE_IGNORED_META)); - } + if (!this.challenge.getIgnoreRewardMetaData().isEmpty()) { + panelBuilder.item(32, this.createRewardButton(RewardButton.REMOVE_IGNORED_META)); + } - if (this.challenge.isRepeatable()) - { - panelBuilder.item(13, this.createRewardButton(RewardButton.COOL_DOWN)); - panelBuilder.item(23, this.createRewardButton(RewardButton.REPEAT_COUNT)); + if (this.challenge.isRepeatable()) { + panelBuilder.item(13, this.createRewardButton(RewardButton.COOL_DOWN)); + panelBuilder.item(23, this.createRewardButton(RewardButton.REPEAT_COUNT)); - panelBuilder.item(15, this.createRewardButton(RewardButton.REPEAT_REWARD_TEXT)); - panelBuilder.item(24, this.createRewardButton(RewardButton.REPEAT_REWARD_COMMANDS)); + panelBuilder.item(15, this.createRewardButton(RewardButton.REPEAT_REWARD_TEXT)); + panelBuilder.item(24, this.createRewardButton(RewardButton.REPEAT_REWARD_COMMANDS)); - panelBuilder.item(16, this.createRewardButton(RewardButton.REPEAT_REWARD_ITEMS)); - panelBuilder.item(25, this.createRewardButton(RewardButton.REPEAT_REWARD_EXPERIENCE)); - panelBuilder.item(34, this.createRewardButton(RewardButton.REPEAT_REWARD_MONEY)); - } + panelBuilder.item(16, this.createRewardButton(RewardButton.REPEAT_REWARD_ITEMS)); + panelBuilder.item(25, this.createRewardButton(RewardButton.REPEAT_REWARD_EXPERIENCE)); + panelBuilder.item(34, this.createRewardButton(RewardButton.REPEAT_REWARD_MONEY)); + } } - // --------------------------------------------------------------------- // Section: Other methods // --------------------------------------------------------------------- - /** * This method creates top menu buttons, that allows to switch "tabs". + * * @param menuType Menu Type which button must be constructed. * @return PanelItem that represents given menu type. */ - private PanelItem createMenuButton(MenuType menuType) - { - final String reference = Constants.BUTTON + menuType.name().toLowerCase() + "."; + private PanelItem createMenuButton(MenuType menuType) { + final String reference = Constants.BUTTON + menuType.name().toLowerCase() + "."; - final String name = this.user.getTranslation(reference + "name"); - final List description = new ArrayList<>(3); - description.add(this.user.getTranslation(reference + "description")); - description.add(""); - description.add(this.user.getTranslation(Constants.TIPS + "click-to-select")); + final String name = this.user.getTranslation(reference + "name"); + final List description = new ArrayList<>(3); + description.add(this.user.getTranslation(reference + "description")); + description.add(""); + description.add(this.user.getTranslation(Constants.TIPS + "click-to-select")); - ItemStack icon; - boolean glow; - PanelItem.ClickHandler clickHandler; + ItemStack icon; + boolean glow; + PanelItem.ClickHandler clickHandler; - switch (menuType) - { - case PROPERTIES -> { - icon = new ItemStack(Material.CRAFTING_TABLE); - clickHandler = (panel, user, clickType, slot) -> { - this.currentMenuType = MenuType.PROPERTIES; - this.build(); + switch (menuType) { + case PROPERTIES -> { + icon = new ItemStack(Material.CRAFTING_TABLE); + clickHandler = (panel, user, clickType, slot) -> { + this.currentMenuType = MenuType.PROPERTIES; + this.build(); - return true; - }; - glow = this.currentMenuType.equals(MenuType.PROPERTIES); - } - case REQUIREMENTS -> { - icon = new ItemStack(Material.HOPPER); - clickHandler = (panel, user, clickType, slot) -> { - this.currentMenuType = MenuType.REQUIREMENTS; - this.build(); + return true; + }; + glow = this.currentMenuType.equals(MenuType.PROPERTIES); + } + case REQUIREMENTS -> { + icon = new ItemStack(Material.HOPPER); + clickHandler = (panel, user, clickType, slot) -> { + this.currentMenuType = MenuType.REQUIREMENTS; + this.build(); - return true; - }; - glow = this.currentMenuType.equals(MenuType.REQUIREMENTS); - } - case REWARDS -> { - icon = new ItemStack(Material.DROPPER); - clickHandler = (panel, user, clickType, slot) -> { - this.currentMenuType = MenuType.REWARDS; - this.build(); + return true; + }; + glow = this.currentMenuType.equals(MenuType.REQUIREMENTS); + } + case REWARDS -> { + icon = new ItemStack(Material.DROPPER); + clickHandler = (panel, user, clickType, slot) -> { + this.currentMenuType = MenuType.REWARDS; + this.build(); - return true; - }; - glow = this.currentMenuType.equals(MenuType.REWARDS); - } - default -> { - icon = new ItemStack(Material.PAPER); - clickHandler = null; - glow = false; - } - } + return true; + }; + glow = this.currentMenuType.equals(MenuType.REWARDS); + } + default -> { + icon = new ItemStack(Material.PAPER); + clickHandler = null; + glow = false; + } + } - return new PanelItemBuilder(). - icon(icon). - name(name). - description(description). - glow(glow). - clickHandler(clickHandler). - build(); + return new PanelItemBuilder().icon(icon).name(name).description(description).glow(glow) + .clickHandler(clickHandler).build(); } - /** * This method creates buttons for default main menu. + * * @param button Button which panel item must be created. * @return PanelItem that represents given button. */ - private PanelItem createButton(Button button) - { - final String reference = Constants.BUTTON + button.name().toLowerCase() + "."; + private PanelItem createButton(Button button) { + final String reference = Constants.BUTTON + button.name().toLowerCase() + "."; - final String name = this.user.getTranslation(reference + "name"); - final List description = new ArrayList<>(3); - description.add(this.user.getTranslation(reference + "description")); + final String name = this.user.getTranslation(reference + "name"); + final List description = new ArrayList<>(3); + description.add(this.user.getTranslation(reference + "description")); - ItemStack icon; - boolean glow; - PanelItem.ClickHandler clickHandler; + ItemStack icon; + boolean glow; + PanelItem.ClickHandler clickHandler; - switch (button) - { - case NAME -> { - description.add(this.user.getTranslation(reference + "value", - Constants.PARAMETER_NAME, this.challenge.getFriendlyName())); + switch (button) { + case NAME -> { + description.add(this.user.getTranslation(reference + "value", Constants.PARAMETER_NAME, + this.challenge.getFriendlyName())); - icon = new ItemStack(Material.NAME_TAG); + icon = new ItemStack(Material.NAME_TAG); - clickHandler = (panel, user, clickType, i) -> - { - // Create consumer that process description change - Consumer consumer = value -> - { - if (value != null) - { - this.challenge.setFriendlyName(value); - } + clickHandler = (panel, user, clickType, i) -> { + // Create consumer that process description change + Consumer consumer = value -> { + if (value != null) { + this.challenge.setFriendlyName(value); + } - this.build(); - }; + this.build(); + }; - // start conversation - ConversationUtils.createStringInput(consumer, - user, - user.getTranslation(Constants.CONVERSATIONS + "write-name"), - user.getTranslation(Constants.CONVERSATIONS + "name-changed")); + // start conversation + ConversationUtils.createStringInput(consumer, user, + user.getTranslation(Constants.CONVERSATIONS + "write-name"), + user.getTranslation(Constants.CONVERSATIONS + "name-changed")); - return true; - }; - glow = false; + return true; + }; + glow = false; - description.add(""); - description.add(this.user.getTranslation(Constants.TIPS + "click-to-change")); - } - case DEPLOYED -> { - description.add(this.user.getTranslation(reference + - (this.challenge.isDeployed() ? "enabled" : "disabled"))); + description.add(""); + description.add(this.user.getTranslation(Constants.TIPS + "click-to-change")); + } + case DEPLOYED -> { + description + .add(this.user.getTranslation(reference + (this.challenge.isDeployed() ? "enabled" : "disabled"))); - icon = new ItemStack(Material.LEVER); - clickHandler = (panel, user, clickType, slot) -> { - if (this.challenge.isValid()) - { - this.challenge.setDeployed(!this.challenge.isDeployed()); - } - else - { - Utils.sendMessage(this.user, - this.world, - Constants.CONVERSATIONS + "invalid-challenge", - Constants.PARAMETER_CHALLENGE, - this.challenge.getFriendlyName()); - this.challenge.setDeployed(false); - } + icon = new ItemStack(Material.LEVER); + clickHandler = (panel, user, clickType, slot) -> { + if (this.challenge.isValid()) { + this.challenge.setDeployed(!this.challenge.isDeployed()); + } else { + Utils.sendMessage(this.user, this.world, Constants.CONVERSATIONS + "invalid-challenge", + Constants.PARAMETER_CHALLENGE, this.challenge.getFriendlyName()); + this.challenge.setDeployed(false); + } - this.build(); - return true; - }; - glow = this.challenge.isDeployed(); + this.build(); + return true; + }; + glow = this.challenge.isDeployed(); - description.add(""); - description.add(this.user.getTranslation(Constants.TIPS + "click-to-toggle")); - } - case ICON -> { - icon = this.challenge.getIcon(); - clickHandler = (panel, user, clickType, i) -> - { - this.selectedButton = button; - this.build(); - return true; - }; - glow = this.selectedButton == button; + description.add(""); + description.add(this.user.getTranslation(Constants.TIPS + "click-to-toggle")); + } + case ICON -> { + icon = this.challenge.getIcon(); + clickHandler = (panel, user, clickType, i) -> { + this.selectedButton = button; + this.build(); + return true; + }; + glow = this.selectedButton == button; - if (this.selectedButton != button) - { - description.add(""); - description.add(this.user.getTranslation(Constants.TIPS + "click-to-change")); - } - else - { - description.add(""); - description.add(this.user.getTranslation(Constants.TIPS + "click-on-item")); - } - } - case DESCRIPTION -> { - icon = new ItemStack(Material.WRITTEN_BOOK); + if (this.selectedButton != button) { + description.add(""); + description.add(this.user.getTranslation(Constants.TIPS + "click-to-change")); + } else { + description.add(""); + description.add(this.user.getTranslation(Constants.TIPS + "click-on-item")); + } + } + case DESCRIPTION -> { + icon = new ItemStack(Material.WRITTEN_BOOK); - description.add(this.user.getTranslation(reference + "value")); - this.challenge.getDescription().forEach(line -> description.add(Util.translateColorCodes(line))); + description.add(this.user.getTranslation(reference + "value")); + this.challenge.getDescription().forEach(line -> description.add(Util.translateColorCodes(line))); - clickHandler = (panel, user, clickType, i) -> - { - // Create consumer that process description change - Consumer> consumer = value -> - { - if (value != null) - { - this.challenge.setDescription(value); - } + clickHandler = (panel, user, clickType, i) -> { + // Create consumer that process description change + Consumer> consumer = value -> { + if (value != null) { + this.challenge.setDescription(value); + } - this.build(); - }; + this.build(); + }; - if (!this.challenge.getDescription().isEmpty() && clickType.isShiftClick()) - { - // Reset to the empty value - consumer.accept(Collections.emptyList()); - } - else - { - // start conversation - ConversationUtils.createStringListInput(consumer, - user, - user.getTranslation(Constants.CONVERSATIONS + "write-description"), - user.getTranslation(Constants.CONVERSATIONS + "description-changed")); - } + if (!this.challenge.getDescription().isEmpty() && clickType.isShiftClick()) { + // Reset to the empty value + consumer.accept(Collections.emptyList()); + } else { + // start conversation + ConversationUtils.createStringListInput(consumer, user, + user.getTranslation(Constants.CONVERSATIONS + "write-description"), + user.getTranslation(Constants.CONVERSATIONS + "description-changed")); + } - return true; - }; - glow = false; + return true; + }; + glow = false; - description.add(""); - description.add(this.user.getTranslation(Constants.TIPS + "click-to-change")); + description.add(""); + description.add(this.user.getTranslation(Constants.TIPS + "click-to-change")); - if (!this.challenge.getDescription().isEmpty()) - { - description.add(this.user.getTranslation(Constants.TIPS + "shift-click-to-reset")); - } - } - case ORDER -> { - description.add(this.user.getTranslation(reference + "value", - Constants.PARAMETER_NUMBER, String.valueOf(this.challenge.getOrder()))); + if (!this.challenge.getDescription().isEmpty()) { + description.add(this.user.getTranslation(Constants.TIPS + "shift-click-to-reset")); + } + } + case ORDER -> { + description.add(this.user.getTranslation(reference + "value", Constants.PARAMETER_NUMBER, + String.valueOf(this.challenge.getOrder()))); - icon = new ItemStack(Material.HOPPER, Math.max(1, this.challenge.getOrder())); - clickHandler = (panel, user, clickType, i) -> { - Consumer numberConsumer = number -> { - if (number != null) - { - this.challenge.setOrder(number.intValue()); - } + icon = new ItemStack(Material.HOPPER, Math.max(1, this.challenge.getOrder())); + clickHandler = (panel, user, clickType, i) -> { + Consumer numberConsumer = number -> { + if (number != null) { + this.challenge.setOrder(number.intValue()); + } - // reopen panel - this.build(); - }; + // reopen panel + this.build(); + }; - ConversationUtils.createNumericInput(numberConsumer, - this.user, - this.user.getTranslation(Constants.CONVERSATIONS + "input-number"), - 0, - 2000); + ConversationUtils.createNumericInput(numberConsumer, this.user, + this.user.getTranslation(Constants.CONVERSATIONS + "input-number"), 0, 2000); - return true; - }; - glow = false; + return true; + }; + glow = false; - description.add(""); - description.add(this.user.getTranslation(Constants.TIPS + "click-to-change")); - } - case ENVIRONMENT -> { - description.add(this.user.getTranslation(this.challenge.getEnvironment().contains(World.Environment.NORMAL) ? - reference + "enabled" : reference + "disabled") + - Utils.prettifyObject(World.Environment.NORMAL, this.user)); - description.add(this.user.getTranslation(this.challenge.getEnvironment().contains(World.Environment.NETHER) ? - reference + "enabled" : reference + "disabled") + - Utils.prettifyObject(World.Environment.NETHER, this.user)); - description.add(this.user.getTranslation(this.challenge.getEnvironment().contains(World.Environment.THE_END) ? - reference + "enabled" : reference + "disabled") + - Utils.prettifyObject(World.Environment.THE_END, this.user)); + description.add(""); + description.add(this.user.getTranslation(Constants.TIPS + "click-to-change")); + } + case ENVIRONMENT -> { + description.add(this.user.getTranslation( + this.challenge.getEnvironment().contains(World.Environment.NORMAL) ? reference + "enabled" + : reference + "disabled") + + Utils.prettifyObject(World.Environment.NORMAL, this.user)); + description.add(this.user.getTranslation( + this.challenge.getEnvironment().contains(World.Environment.NETHER) ? reference + "enabled" + : reference + "disabled") + + Utils.prettifyObject(World.Environment.NETHER, this.user)); + description.add(this.user.getTranslation( + this.challenge.getEnvironment().contains(World.Environment.THE_END) ? reference + "enabled" + : reference + "disabled") + + Utils.prettifyObject(World.Environment.THE_END, this.user)); - icon = new ItemStack(Material.DROPPER); - clickHandler = (panel, user, clickType, slot) -> { - EnvironmentSelector.open(this.user, - this.challenge.getEnvironment(), - (status, value) -> { - if (status) - { - this.challenge.setEnvironment(value); - } + icon = new ItemStack(Material.DROPPER); + clickHandler = (panel, user, clickType, slot) -> { + EnvironmentSelector.open(this.user, this.challenge.getEnvironment(), (status, value) -> { + if (status) { + this.challenge.setEnvironment(value); + } - this.build(); - }); + this.build(); + }); - return true; - }; - glow = false; - } - case REMOVE_ON_COMPLETE -> { - description.add(this.user.getTranslation(reference + - (this.challenge.isRemoveWhenCompleted() ? "enabled" : "disabled"))); + return true; + }; + glow = false; + } + case REMOVE_ON_COMPLETE -> { + description.add(this.user + .getTranslation(reference + (this.challenge.isRemoveWhenCompleted() ? "enabled" : "disabled"))); - if (this.challenge.isRemoveWhenCompleted()) - { - icon = new ItemStack(Material.LAVA_BUCKET); - } - else - { - icon = new ItemStack(Material.BUCKET); - } + if (this.challenge.isRemoveWhenCompleted()) { + icon = new ItemStack(Material.LAVA_BUCKET); + } else { + icon = new ItemStack(Material.BUCKET); + } - clickHandler = (panel, user, clickType, slot) -> { - this.challenge.setRemoveWhenCompleted(!this.challenge.isRemoveWhenCompleted()); - this.build(); + clickHandler = (panel, user, clickType, slot) -> { + this.challenge.setRemoveWhenCompleted(!this.challenge.isRemoveWhenCompleted()); + this.build(); - return true; - }; - glow = this.challenge.isRemoveWhenCompleted(); + return true; + }; + glow = this.challenge.isRemoveWhenCompleted(); - description.add(""); - description.add(this.user.getTranslation(Constants.TIPS + "click-to-toggle")); - } - default -> { - icon = new ItemStack(Material.PAPER); - clickHandler = null; - glow = false; - } - } + description.add(""); + description.add(this.user.getTranslation(Constants.TIPS + "click-to-toggle")); + } + default -> { + icon = new ItemStack(Material.PAPER); + clickHandler = null; + glow = false; + } + } - return new PanelItemBuilder(). - icon(icon). - name(name). - description(description). - glow(glow). - clickHandler(clickHandler). - build(); + return new PanelItemBuilder().icon(icon).name(name).description(description).glow(glow) + .clickHandler(clickHandler).build(); } - /** * This method creates buttons for requirements menu. + * * @param button Button which panel item must be created. * @return PanelItem that represents given button. */ - private PanelItem createRequirementButton(RequirementButton button) - { - switch (button) - { - case REQUIRED_PERMISSIONS -> { - String reference = Constants.BUTTON + button.name().toLowerCase() + "."; + private PanelItem createRequirementButton(RequirementButton button) { + switch (button) { + case REQUIRED_PERMISSIONS -> { + String reference = Constants.BUTTON + button.name().toLowerCase() + "."; - String name = this.user.getTranslation(reference + "name"); - final List description = new ArrayList<>(3); - description.add(this.user.getTranslation(reference + "description")); + String name = this.user.getTranslation(reference + "name"); + final List description = new ArrayList<>(3); + description.add(this.user.getTranslation(reference + "description")); - if (this.challenge.getRequirements().getRequiredPermissions().isEmpty()) - { - description.add(this.user.getTranslation(reference + "none")); - } - else - { - description.add(this.user.getTranslation(reference + "title")); + if (this.challenge.getRequirements().getRequiredPermissions().isEmpty()) { + description.add(this.user.getTranslation(reference + "none")); + } else { + description.add(this.user.getTranslation(reference + "title")); - this.challenge.getRequirements().getRequiredPermissions().forEach(permission -> - description.add(this.user.getTranslation(reference + "permission", - "[permission]", permission))); - } + this.challenge.getRequirements().getRequiredPermissions().forEach(permission -> description + .add(this.user.getTranslation(reference + "permission", "[permission]", permission))); + } - ItemStack icon = new ItemStack(Material.REDSTONE_LAMP); + ItemStack icon = new ItemStack(Material.REDSTONE_LAMP); - PanelItem.ClickHandler clickHandler = (panel, user, clickType, i) -> - { - // Create consumer that process description change - Consumer> consumer = value -> - { - if (value != null) - { - this.challenge.getRequirements().setRequiredPermissions(new HashSet<>(value)); - } + PanelItem.ClickHandler clickHandler = (panel, user, clickType, i) -> { + // Create consumer that process description change + Consumer> consumer = value -> { + if (value != null) { + this.challenge.getRequirements().setRequiredPermissions(new HashSet<>(value)); + } - this.build(); - }; + this.build(); + }; - if (!this.challenge.getRequirements().getRequiredPermissions().isEmpty() && - clickType.isShiftClick()) - { - // Reset to the empty value - consumer.accept(Collections.emptyList()); - } - else - { - // start conversation - ConversationUtils.createStringListInput(consumer, - user, - user.getTranslation(Constants.CONVERSATIONS + "write-permissions"), - user.getTranslation(Constants.CONVERSATIONS + "permissions-changed")); - } + if (!this.challenge.getRequirements().getRequiredPermissions().isEmpty() && clickType.isShiftClick()) { + // Reset to the empty value + consumer.accept(Collections.emptyList()); + } else { + // start conversation + ConversationUtils.createStringListInput(consumer, user, + user.getTranslation(Constants.CONVERSATIONS + "write-permissions"), + user.getTranslation(Constants.CONVERSATIONS + "permissions-changed")); + } - return true; - }; + return true; + }; - description.add(""); - description.add(this.user.getTranslation(Constants.TIPS + "click-to-change")); + description.add(""); + description.add(this.user.getTranslation(Constants.TIPS + "click-to-change")); - if (!this.challenge.getRequirements().getRequiredPermissions().isEmpty()) - { - description.add(this.user.getTranslation(Constants.TIPS + "shift-click-to-reset")); - } + if (!this.challenge.getRequirements().getRequiredPermissions().isEmpty()) { + description.add(this.user.getTranslation(Constants.TIPS + "shift-click-to-reset")); + } - return new PanelItemBuilder(). - icon(icon). - name(name). - description(description). - clickHandler(clickHandler). - build(); - } - // Buttons for Island Requirements - case REQUIRED_ENTITIES, REMOVE_ENTITIES, REQUIRED_BLOCKS, REMOVE_BLOCKS, SEARCH_RADIUS -> { - return this.createIslandRequirementButton(button); - } - // Buttons for Inventory Requirements - case REQUIRED_ITEMS, REMOVE_ITEMS, ADD_IGNORED_META, REMOVE_IGNORED_META -> { - return this.createInventoryRequirementButton(button); - } - // Buttons for Other Requirements - case REQUIRED_EXPERIENCE, REMOVE_EXPERIENCE, REQUIRED_LEVEL, REQUIRED_MONEY, REMOVE_MONEY -> { - return this.createOtherRequirementButton(button); - } - // Buttons for Statistic Requirements - case STATISTIC, STATISTIC_BLOCKS, STATISTIC_ITEMS, STATISTIC_ENTITIES, STATISTIC_AMOUNT, REMOVE_STATISTIC -> { - return this.createStatisticRequirementButton(button); - } - // Default behaviour. - default -> { - return PanelItem.empty(); - } - } + return new PanelItemBuilder().icon(icon).name(name).description(description).clickHandler(clickHandler) + .build(); + } + // Buttons for Island Requirements + case REQUIRED_ENTITIES, REMOVE_ENTITIES, REQUIRED_BLOCKS, REMOVE_BLOCKS, SEARCH_RADIUS -> { + return this.createIslandRequirementButton(button); + } + // Buttons for Inventory Requirements + case REQUIRED_ITEMS, REMOVE_ITEMS, ADD_IGNORED_META, REMOVE_IGNORED_META -> { + return this.createInventoryRequirementButton(button); + } + // Buttons for Other Requirements + case REQUIRED_EXPERIENCE, REMOVE_EXPERIENCE, REQUIRED_LEVEL, REQUIRED_MONEY, REMOVE_MONEY -> { + return this.createOtherRequirementButton(button); + } + // Buttons for Statistic Requirements + case STATISTIC, STATISTIC_BLOCKS, STATISTIC_ITEMS, STATISTIC_ENTITIES, STATISTIC_AMOUNT, REMOVE_STATISTIC -> { + return this.createStatisticRequirementButton(button); + } + // Default behaviour. + default -> { + return PanelItem.empty(); + } + } } - /** * This method creates buttons for island requirements menu. + * * @param button Button which panel item must be created. * @return PanelItem that represents given button. */ - private PanelItem createIslandRequirementButton(RequirementButton button) - { - final String reference = Constants.BUTTON + button.name().toLowerCase() + "."; + private PanelItem createIslandRequirementButton(RequirementButton button) { + final String reference = Constants.BUTTON + button.name().toLowerCase() + "."; - final String name = this.user.getTranslation(reference + "name"); - final List description = new ArrayList<>(3); - description.add(this.user.getTranslation(reference + "description")); + final String name = this.user.getTranslation(reference + "name"); + final List description = new ArrayList<>(3); + description.add(this.user.getTranslation(reference + "description")); - ItemStack icon; - boolean glow; - PanelItem.ClickHandler clickHandler; + ItemStack icon; + boolean glow; + PanelItem.ClickHandler clickHandler; - final IslandRequirements requirements = this.challenge.getRequirements(); + final IslandRequirements requirements = this.challenge.getRequirements(); - switch (button) - { - case REQUIRED_ENTITIES -> { - if (requirements.getRequiredEntities().isEmpty()) - { - description.add(this.user.getTranslation(reference + "none")); - } - else - { - description.add(this.user.getTranslation(reference + "title")); + switch (button) { + case REQUIRED_ENTITIES -> { + if (requirements.getRequiredEntities().isEmpty()) { + description.add(this.user.getTranslation(reference + "none")); + } else { + description.add(this.user.getTranslation(reference + "title")); - requirements.getRequiredEntities().forEach((entity, count) -> - description.add(this.user.getTranslation(reference + "list", - "[entity]", Utils.prettifyObject(entity, this.user), - "[number]", String.valueOf(count)))); - } + requirements.getRequiredEntities().forEach( + (entity, count) -> description.add(this.user.getTranslation(reference + "list", "[entity]", + Utils.prettifyObject(entity, this.user), "[number]", String.valueOf(count)))); + } - icon = new ItemStack(Material.CREEPER_HEAD); - clickHandler = (panel, user, clickType, slot) -> { - ManageEntitiesPanel.open(this, requirements.getRequiredEntities()); - return true; - }; - glow = false; + icon = new ItemStack(Material.CREEPER_HEAD); + clickHandler = (panel, user, clickType, slot) -> { + ManageEntitiesPanel.open(this, requirements.getRequiredEntities()); + return true; + }; + glow = false; - description.add(""); - description.add(this.user.getTranslation(Constants.TIPS + "click-to-change")); - } - case REMOVE_ENTITIES -> { - description.add(this.user.getTranslation(reference + - (requirements.isRemoveEntities() ? "enabled" : "disabled"))); + description.add(""); + description.add(this.user.getTranslation(Constants.TIPS + "click-to-change")); + } + case REMOVE_ENTITIES -> { + description.add( + this.user.getTranslation(reference + (requirements.isRemoveEntities() ? "enabled" : "disabled"))); - icon = new ItemStack(Material.LEVER); - clickHandler = (panel, user, clickType, slot) -> { - requirements.setRemoveEntities(!requirements.isRemoveEntities()); - this.build(); - return true; - }; - glow = requirements.isRemoveEntities(); + icon = new ItemStack(Material.LEVER); + clickHandler = (panel, user, clickType, slot) -> { + requirements.setRemoveEntities(!requirements.isRemoveEntities()); + this.build(); + return true; + }; + glow = requirements.isRemoveEntities(); - description.add(""); - description.add(this.user.getTranslation(Constants.TIPS + "click-to-toggle")); - } - case REQUIRED_BLOCKS -> { - if (requirements.getRequiredBlocks().isEmpty()) - { - description.add(this.user.getTranslation(reference + "none")); - } - else - { - description.add(this.user.getTranslation(reference + "title")); + description.add(""); + description.add(this.user.getTranslation(Constants.TIPS + "click-to-toggle")); + } + case REQUIRED_BLOCKS -> { + if (requirements.getRequiredBlocks().isEmpty()) { + description.add(this.user.getTranslation(reference + "none")); + } else { + description.add(this.user.getTranslation(reference + "title")); - requirements.getRequiredBlocks().forEach((block, count) -> - description.add(this.user.getTranslation(reference + "list", - "[block]", Utils.prettifyObject(block, this.user), - "[number]", String.valueOf(count)))); - } + requirements.getRequiredBlocks() + .forEach((block, count) -> description.add(this.user.getTranslation(reference + "list", + "[block]", Utils.prettifyObject(block, this.user), "[number]", String.valueOf(count)))); + } - icon = new ItemStack(Material.STONE); - clickHandler = (panel, user, clickType, slot) -> { - ManageBlocksPanel.open(this, requirements.getRequiredBlocks()); - return true; - }; - glow = false; + icon = new ItemStack(Material.STONE); + clickHandler = (panel, user, clickType, slot) -> { + ManageBlocksPanel.open(this, requirements.getRequiredBlocks()); + return true; + }; + glow = false; - description.add(""); - description.add(this.user.getTranslation(Constants.TIPS + "click-to-change")); - } - case REMOVE_BLOCKS -> { - description.add(this.user.getTranslation(reference + - (requirements.isRemoveBlocks() ? "enabled" : "disabled"))); + description.add(""); + description.add(this.user.getTranslation(Constants.TIPS + "click-to-change")); + } + case REMOVE_BLOCKS -> { + description.add( + this.user.getTranslation(reference + (requirements.isRemoveBlocks() ? "enabled" : "disabled"))); - icon = new ItemStack(Material.LEVER); - clickHandler = (panel, user, clickType, slot) -> { - requirements.setRemoveBlocks(!requirements.isRemoveBlocks()); - this.build(); - return true; - }; - glow = requirements.isRemoveBlocks(); + icon = new ItemStack(Material.LEVER); + clickHandler = (panel, user, clickType, slot) -> { + requirements.setRemoveBlocks(!requirements.isRemoveBlocks()); + this.build(); + return true; + }; + glow = requirements.isRemoveBlocks(); - description.add(""); - description.add(this.user.getTranslation(Constants.TIPS + "click-to-toggle")); - } - case SEARCH_RADIUS -> { - description.add(this.user.getTranslation(reference + "value", - Constants.PARAMETER_NUMBER, String.valueOf(requirements.getSearchRadius()))); - icon = new ItemStack(Material.COBBLESTONE_WALL); - clickHandler = (panel, user, clickType, i) -> { - Consumer numberConsumer = number -> { - if (number != null) - { - requirements.setSearchRadius(number.intValue()); - } + description.add(""); + description.add(this.user.getTranslation(Constants.TIPS + "click-to-toggle")); + } + case SEARCH_RADIUS -> { + description.add(this.user.getTranslation(reference + "value", Constants.PARAMETER_NUMBER, + String.valueOf(requirements.getSearchRadius()))); + icon = new ItemStack(Material.COBBLESTONE_WALL); + clickHandler = (panel, user, clickType, i) -> { + Consumer numberConsumer = number -> { + if (number != null) { + requirements.setSearchRadius(number.intValue()); + } - // reopen panel - this.build(); - }; + // reopen panel + this.build(); + }; - int maxSearchDistance = - this.addon.getPlugin().getIWM().getAddon(this.world).map(gameModeAddon -> - gameModeAddon.getWorldSettings().getIslandDistance()).orElse(100); + int maxSearchDistance = this.addon.getPlugin().getIWM().getAddon(this.world) + .map(gameModeAddon -> gameModeAddon.getWorldSettings().getIslandDistance()).orElse(100); - ConversationUtils.createNumericInput(numberConsumer, - this.user, - this.user.getTranslation(Constants.CONVERSATIONS + "input-number"), - 1, - maxSearchDistance); + ConversationUtils.createNumericInput(numberConsumer, this.user, + this.user.getTranslation(Constants.CONVERSATIONS + "input-number"), 1, maxSearchDistance); - return true; - }; - glow = false; + return true; + }; + glow = false; - description.add(""); - description.add(this.user.getTranslation(Constants.TIPS + "click-to-change")); - } - default -> { - icon = new ItemStack(Material.PAPER); - clickHandler = null; - glow = false; - } - } + description.add(""); + description.add(this.user.getTranslation(Constants.TIPS + "click-to-change")); + } + default -> { + icon = new ItemStack(Material.PAPER); + clickHandler = null; + glow = false; + } + } - return new PanelItemBuilder(). - icon(icon). - name(name). - description(description). - glow(glow). - clickHandler(clickHandler). - build(); + return new PanelItemBuilder().icon(icon).name(name).description(description).glow(glow) + .clickHandler(clickHandler).build(); } - /** * This method creates buttons for inventory requirements menu. + * * @param button Button which panel item must be created. * @return PanelItem that represents given button. */ - private PanelItem createInventoryRequirementButton(RequirementButton button) - { - final String reference = Constants.BUTTON + button.name().toLowerCase() + "."; + private PanelItem createInventoryRequirementButton(RequirementButton button) { + final String reference = Constants.BUTTON + button.name().toLowerCase() + "."; - final String name = this.user.getTranslation(reference + "name"); - final List description = new ArrayList<>(3); - description.add(this.user.getTranslation(reference + "description")); + final String name = this.user.getTranslation(reference + "name"); + final List description = new ArrayList<>(3); + description.add(this.user.getTranslation(reference + "description")); - ItemStack icon; - boolean glow; - PanelItem.ClickHandler clickHandler; + ItemStack icon; + boolean glow; + PanelItem.ClickHandler clickHandler; - final InventoryRequirements requirements = this.challenge.getRequirements(); + final InventoryRequirements requirements = this.challenge.getRequirements(); - switch (button) - { - case REQUIRED_ITEMS -> { - if (requirements.getRequiredItems().isEmpty()) - { - description.add(this.user.getTranslation(reference + "none")); - } - else - { - description.add(this.user.getTranslation(reference + "title")); + switch (button) { + case REQUIRED_ITEMS -> { + if (requirements.getRequiredItems().isEmpty()) { + description.add(this.user.getTranslation(reference + "none")); + } else { + description.add(this.user.getTranslation(reference + "title")); - Utils.groupEqualItems(requirements.getRequiredItems(), requirements.getIgnoreMetaData()). - stream(). - sorted(Comparator.comparing(ItemStack::getType)). - forEach(itemStack -> - description.add(this.user.getTranslationOrNothing(reference + "list", - "[number]", String.valueOf(itemStack.getAmount()), - "[item]", Utils.prettifyObject(itemStack, this.user)))); - } + Utils.groupEqualItems(requirements.getRequiredItems(), requirements.getIgnoreMetaData()).stream() + .sorted(Comparator.comparing(ItemStack::getType)) + .forEach(itemStack -> description.add(this.user.getTranslationOrNothing(reference + "list", + "[number]", String.valueOf(itemStack.getAmount()), "[item]", + Utils.prettifyObject(itemStack, this.user)))); + } - icon = new ItemStack(Material.CHEST); - clickHandler = (panel, user, clickType, slot) -> { - ItemSelector.open(this.user, - requirements.getRequiredItems(), - (status, value) -> { - if (status) - { - requirements.setRequiredItems(value); - } + icon = new ItemStack(Material.CHEST); + clickHandler = (panel, user, clickType, slot) -> { + ItemSelector.open(this.user, requirements.getRequiredItems(), (status, value) -> { + if (status) { + requirements.setRequiredItems(value); + } - this.build(); - }); - return true; - }; - glow = false; + this.build(); + }); + return true; + }; + glow = false; - description.add(""); - description.add(this.user.getTranslation(Constants.TIPS + "click-to-change")); - } - case REMOVE_ITEMS -> { - description.add(this.user.getTranslation(reference + - (requirements.isTakeItems() ? "enabled" : "disabled"))); + description.add(""); + description.add(this.user.getTranslation(Constants.TIPS + "click-to-change")); + } + case REMOVE_ITEMS -> { + description + .add(this.user.getTranslation(reference + (requirements.isTakeItems() ? "enabled" : "disabled"))); - icon = new ItemStack(Material.LEVER); - clickHandler = (panel, user, clickType, slot) -> { - requirements.setTakeItems(!requirements.isTakeItems()); - this.build(); - return true; - }; - glow = requirements.isTakeItems(); + icon = new ItemStack(Material.LEVER); + clickHandler = (panel, user, clickType, slot) -> { + requirements.setTakeItems(!requirements.isTakeItems()); + this.build(); + return true; + }; + glow = requirements.isTakeItems(); - description.add(""); - description.add(this.user.getTranslation(Constants.TIPS + "click-to-toggle")); - } - case ADD_IGNORED_META -> { - if (requirements.getIgnoreMetaData().isEmpty()) - { - description.add(this.user.getTranslation(reference + "none")); - } - else - { - description.add(this.user.getTranslation(reference + "title")); + description.add(""); + description.add(this.user.getTranslation(Constants.TIPS + "click-to-toggle")); + } + case ADD_IGNORED_META -> { + if (requirements.getIgnoreMetaData().isEmpty()) { + description.add(this.user.getTranslation(reference + "none")); + } else { + description.add(this.user.getTranslation(reference + "title")); - requirements.getIgnoreMetaData().stream(). - sorted(Comparator.comparing(Material::name)). - forEach(itemStack -> - description.add(this.user.getTranslationOrNothing(reference + "list", - "[item]", Utils.prettifyObject(itemStack, this.user)))); - } + requirements.getIgnoreMetaData().stream().sorted(Comparator.comparing(Material::name)) + .forEach(itemStack -> description.add(this.user.getTranslationOrNothing(reference + "list", + "[item]", Utils.prettifyObject(itemStack, this.user)))); + } - icon = new ItemStack(Material.GREEN_SHULKER_BOX); + icon = new ItemStack(Material.GREEN_SHULKER_BOX); - clickHandler = (panel, user, clickType, slot) -> { - if (requirements.getRequiredItems().isEmpty()) - { - // Do nothing if no requirements are set. - return true; - } + clickHandler = (panel, user, clickType, slot) -> { + if (requirements.getRequiredItems().isEmpty()) { + // Do nothing if no requirements are set. + return true; + } - // Allow choosing only from inventory items. - Set collection = Arrays.stream(Material.values()).collect(Collectors.toSet()); - requirements.getRequiredItems().stream(). - map(ItemStack::getType). - forEach(collection::remove); - collection.addAll(requirements.getIgnoreMetaData()); + // Allow choosing only from inventory items. + Set collection = Arrays.stream(Material.values()).collect(Collectors.toSet()); + requirements.getRequiredItems().stream().map(ItemStack::getType).forEach(collection::remove); + collection.addAll(requirements.getIgnoreMetaData()); - if (Material.values().length == collection.size()) - { - // If there are no items anymore, then do not allow opening gui. - return true; - } + if (Material.values().length == collection.size()) { + // If there are no items anymore, then do not allow opening gui. + return true; + } - MultiBlockSelector.open(this.user, - MultiBlockSelector.Mode.ANY, - collection, - (status, materials) -> - { - if (status) - { - materials.addAll(requirements.getIgnoreMetaData()); - requirements.setIgnoreMetaData(new HashSet<>(materials)); - } + MultiBlockSelector.open(this.user, MultiBlockSelector.Mode.ANY, collection, (status, materials) -> { + if (status) { + materials.addAll(requirements.getIgnoreMetaData()); + requirements.setIgnoreMetaData(new HashSet<>(materials)); + } - this.build(); - }); - return true; - }; - glow = false; + this.build(); + }); + return true; + }; + glow = false; - description.add(""); - description.add(this.user.getTranslation(Constants.TIPS + "click-to-add")); - } - case REMOVE_IGNORED_META -> { - icon = new ItemStack(Material.RED_SHULKER_BOX); + description.add(""); + description.add(this.user.getTranslation(Constants.TIPS + "click-to-add")); + } + case REMOVE_IGNORED_META -> { + icon = new ItemStack(Material.RED_SHULKER_BOX); - clickHandler = (panel, user, clickType, slot) -> { - if (requirements.getIgnoreMetaData().isEmpty()) - { - // Do nothing if no requirements are set. - return true; - } + clickHandler = (panel, user, clickType, slot) -> { + if (requirements.getIgnoreMetaData().isEmpty()) { + // Do nothing if no requirements are set. + return true; + } - // Allow choosing only from inventory items. - Set collection = Arrays.stream(Material.values()).collect(Collectors.toSet()); - collection.removeAll(requirements.getIgnoreMetaData()); + // Allow choosing only from inventory items. + Set collection = Arrays.stream(Material.values()).collect(Collectors.toSet()); + collection.removeAll(requirements.getIgnoreMetaData()); - MultiBlockSelector.open(this.user, - MultiBlockSelector.Mode.ANY, - collection, - (status, materials) -> - { - if (status) - { - requirements.getIgnoreMetaData().removeAll(materials); - } + MultiBlockSelector.open(this.user, MultiBlockSelector.Mode.ANY, collection, (status, materials) -> { + if (status) { + requirements.getIgnoreMetaData().removeAll(materials); + } - this.build(); - }); - return true; - }; - glow = false; + this.build(); + }); + return true; + }; + glow = false; - description.add(""); - description.add(this.user.getTranslation(Constants.TIPS + "click-to-remove")); - } - default -> { - icon = new ItemStack(Material.PAPER); - clickHandler = null; - glow = false; - } - } + description.add(""); + description.add(this.user.getTranslation(Constants.TIPS + "click-to-remove")); + } + default -> { + icon = new ItemStack(Material.PAPER); + clickHandler = null; + glow = false; + } + } - return new PanelItemBuilder(). - icon(icon). - name(name). - description(description). - glow(glow). - clickHandler(clickHandler). - build(); + return new PanelItemBuilder().icon(icon).name(name).description(description).glow(glow) + .clickHandler(clickHandler).build(); } - /** * This method creates buttons for other requirements menu. + * * @param button Button which panel item must be created. * @return PanelItem that represents given button. */ - private PanelItem createOtherRequirementButton(RequirementButton button) - { - final String reference = Constants.BUTTON + button.name().toLowerCase() + "."; + private PanelItem createOtherRequirementButton(RequirementButton button) { + final String reference = Constants.BUTTON + button.name().toLowerCase() + "."; - final String name = this.user.getTranslation(reference + "name"); - final List description = new ArrayList<>(3); - description.add(this.user.getTranslation(reference + "description")); + final String name = this.user.getTranslation(reference + "name"); + final List description = new ArrayList<>(3); + description.add(this.user.getTranslation(reference + "description")); - ItemStack icon; - boolean glow; - PanelItem.ClickHandler clickHandler; + ItemStack icon; + boolean glow; + PanelItem.ClickHandler clickHandler; - final OtherRequirements requirements = this.challenge.getRequirements(); + final OtherRequirements requirements = this.challenge.getRequirements(); - switch (button) - { - case REQUIRED_EXPERIENCE -> { - description.add(this.user.getTranslation(reference + "value", - Constants.PARAMETER_NUMBER, String.valueOf(requirements.getRequiredExperience()))); - icon = new ItemStack(Material.EXPERIENCE_BOTTLE); - clickHandler = (panel, user, clickType, i) -> { - Consumer numberConsumer = number -> { - if (number != null) - { - requirements.setRequiredExperience(number.intValue()); - } + switch (button) { + case REQUIRED_EXPERIENCE -> { + description.add(this.user.getTranslation(reference + "value", Constants.PARAMETER_NUMBER, + String.valueOf(requirements.getRequiredExperience()))); + icon = new ItemStack(Material.EXPERIENCE_BOTTLE); + clickHandler = (panel, user, clickType, i) -> { + Consumer numberConsumer = number -> { + if (number != null) { + requirements.setRequiredExperience(number.intValue()); + } - // reopen panel - this.build(); - }; - ConversationUtils.createNumericInput(numberConsumer, - this.user, - this.user.getTranslation(Constants.CONVERSATIONS + "input-number"), - 0, - Integer.MAX_VALUE); + // reopen panel + this.build(); + }; + ConversationUtils.createNumericInput(numberConsumer, this.user, + this.user.getTranslation(Constants.CONVERSATIONS + "input-number"), 0, Integer.MAX_VALUE); - return true; - }; - glow = false; + return true; + }; + glow = false; - description.add(""); - description.add(this.user.getTranslation(Constants.TIPS + "click-to-change")); - } - case REMOVE_EXPERIENCE -> { - description.add(this.user.getTranslation(reference + - (requirements.isTakeExperience() ? "enabled" : "disabled"))); + description.add(""); + description.add(this.user.getTranslation(Constants.TIPS + "click-to-change")); + } + case REMOVE_EXPERIENCE -> { + description.add( + this.user.getTranslation(reference + (requirements.isTakeExperience() ? "enabled" : "disabled"))); - icon = new ItemStack(Material.LEVER); - clickHandler = (panel, user, clickType, slot) -> { - requirements.setTakeExperience(!requirements.isTakeExperience()); - this.build(); - return true; - }; - glow = requirements.isTakeExperience(); + icon = new ItemStack(Material.LEVER); + clickHandler = (panel, user, clickType, slot) -> { + requirements.setTakeExperience(!requirements.isTakeExperience()); + this.build(); + return true; + }; + glow = requirements.isTakeExperience(); - description.add(""); - description.add(this.user.getTranslation(Constants.TIPS + "click-to-toggle")); - } - case REQUIRED_LEVEL -> { - description.add(this.user.getTranslation(reference + "value", - Constants.PARAMETER_NUMBER, String.valueOf(requirements.getRequiredIslandLevel()))); - icon = new ItemStack(this.addon.isLevelProvided() ? Material.BEACON : Material.BARRIER); - clickHandler = (panel, user, clickType, i) -> { - Consumer numberConsumer = number -> { - if (number != null) - { - requirements.setRequiredIslandLevel(number.longValue()); - } + description.add(""); + description.add(this.user.getTranslation(Constants.TIPS + "click-to-toggle")); + } + case REQUIRED_LEVEL -> { + description.add(this.user.getTranslation(reference + "value", Constants.PARAMETER_NUMBER, + String.valueOf(requirements.getRequiredIslandLevel()))); + icon = new ItemStack(this.addon.isLevelProvided() ? Material.BEACON : Material.BARRIER); + clickHandler = (panel, user, clickType, i) -> { + Consumer numberConsumer = number -> { + if (number != null) { + requirements.setRequiredIslandLevel(number.longValue()); + } - // reopen panel - this.build(); - }; - ConversationUtils.createNumericInput(numberConsumer, - this.user, - this.user.getTranslation(Constants.CONVERSATIONS + "input-number"), - 0, - Integer.MAX_VALUE); + // reopen panel + this.build(); + }; + ConversationUtils.createNumericInput(numberConsumer, this.user, + this.user.getTranslation(Constants.CONVERSATIONS + "input-number"), 0, Integer.MAX_VALUE); - return true; - }; - glow = false; + return true; + }; + glow = false; - description.add(""); - description.add(this.user.getTranslation(Constants.TIPS + "click-to-change")); - } - case REQUIRED_MONEY -> { - description.add(this.user.getTranslation(reference + "value", - Constants.PARAMETER_NUMBER, String.valueOf(requirements.getRequiredMoney()))); - icon = new ItemStack(this.addon.isEconomyProvided() ? Material.GOLD_INGOT : Material.BARRIER); - clickHandler = (panel, user, clickType, i) -> { - Consumer numberConsumer = number -> { - if (number != null) - { - requirements.setRequiredMoney(number.doubleValue()); - } + description.add(""); + description.add(this.user.getTranslation(Constants.TIPS + "click-to-change")); + } + case REQUIRED_MONEY -> { + description.add(this.user.getTranslation(reference + "value", Constants.PARAMETER_NUMBER, + String.valueOf(requirements.getRequiredMoney()))); + icon = new ItemStack(this.addon.isEconomyProvided() ? Material.GOLD_INGOT : Material.BARRIER); + clickHandler = (panel, user, clickType, i) -> { + Consumer numberConsumer = number -> { + if (number != null) { + requirements.setRequiredMoney(number.doubleValue()); + } - // reopen panel - this.build(); - }; - ConversationUtils.createNumericInput(numberConsumer, - this.user, - this.user.getTranslation(Constants.CONVERSATIONS + "input-number"), - 0, - Double.MAX_VALUE); + // reopen panel + this.build(); + }; + ConversationUtils.createNumericInput(numberConsumer, this.user, + this.user.getTranslation(Constants.CONVERSATIONS + "input-number"), 0, Double.MAX_VALUE); - return true; - }; - glow = false; + return true; + }; + glow = false; - description.add(""); - description.add(this.user.getTranslation(Constants.TIPS + "click-to-change")); - } - case REMOVE_MONEY -> { - description.add(this.user.getTranslation(reference + - (requirements.isTakeMoney() ? "enabled" : "disabled"))); + description.add(""); + description.add(this.user.getTranslation(Constants.TIPS + "click-to-change")); + } + case REMOVE_MONEY -> { + description + .add(this.user.getTranslation(reference + (requirements.isTakeMoney() ? "enabled" : "disabled"))); - icon = new ItemStack(this.addon.isEconomyProvided() ? Material.LEVER : Material.BARRIER); - clickHandler = (panel, user, clickType, slot) -> { - requirements.setTakeMoney(!requirements.isTakeMoney()); - this.build(); - return true; - }; - glow = requirements.isTakeMoney(); + icon = new ItemStack(this.addon.isEconomyProvided() ? Material.LEVER : Material.BARRIER); + clickHandler = (panel, user, clickType, slot) -> { + requirements.setTakeMoney(!requirements.isTakeMoney()); + this.build(); + return true; + }; + glow = requirements.isTakeMoney(); - description.add(""); - description.add(this.user.getTranslation(Constants.TIPS + "click-to-toggle")); - } - default -> { - icon = new ItemStack(Material.PAPER); - clickHandler = null; - glow = false; - } - } + description.add(""); + description.add(this.user.getTranslation(Constants.TIPS + "click-to-toggle")); + } + default -> { + icon = new ItemStack(Material.PAPER); + clickHandler = null; + glow = false; + } + } - return new PanelItemBuilder(). - icon(icon). - name(name). - description(description). - glow(glow). - clickHandler(clickHandler). - build(); + return new PanelItemBuilder().icon(icon).name(name).description(description).glow(glow) + .clickHandler(clickHandler).build(); } - /** * Creates a button for statistic requirements. + * * @param button Button that must be created. * @return PanelItem button. */ - private PanelItem createStatisticRequirementButton(RequirementButton button) - { - final String reference = Constants.BUTTON + button.name().toLowerCase() + "."; + private PanelItem createStatisticRequirementButton(RequirementButton button) { + final String reference = Constants.BUTTON + button.name().toLowerCase() + "."; - final String name = this.user.getTranslation(reference + "name"); - final List description = new ArrayList<>(3); - description.add(this.user.getTranslation(reference + "description")); + final String name = this.user.getTranslation(reference + "name"); + final List description = new ArrayList<>(3); + description.add(this.user.getTranslation(reference + "description")); - ItemStack icon; - boolean glow; - PanelItem.ClickHandler clickHandler; + ItemStack icon; + boolean glow; + PanelItem.ClickHandler clickHandler; - final StatisticRequirements requirements = this.challenge.getRequirements(); + final StatisticRequirements requirements = this.challenge.getRequirements(); - switch (button) - { - case STATISTIC -> { - description.add(this.user.getTranslation(reference + "value", - "[statistic]", Utils.prettifyObject(requirements.getStatistic(), this.user))); + switch (button) { + case STATISTIC -> { + description.add(this.user.getTranslation(reference + "value", "[statistic]", + Utils.prettifyObject(requirements.getStatistic(), this.user))); - icon = new ItemStack(requirements.getStatistic() == null ? Material.BARRIER : Material.PAPER); - clickHandler = (panel, user, clickType, slot) -> { - StatisticSelector.open(this.user, (status, statistic) -> { - if (status) - { - requirements.setStatistic(statistic); - requirements.setMaterial(null); - requirements.setEntity(null); - requirements.setAmount(0); - } + icon = new ItemStack(requirements.getStatistic() == null ? Material.BARRIER : Material.PAPER); + clickHandler = (panel, user, clickType, slot) -> { + StatisticSelector.open(this.user, (status, statistic) -> { + if (status) { + requirements.setStatistic(statistic); + requirements.setMaterial(null); + requirements.setEntity(null); + requirements.setAmount(0); + } - this.build(); - }); - return true; - }; - glow = false; + this.build(); + }); + return true; + }; + glow = false; - description.add(""); - description.add(this.user.getTranslation(Constants.TIPS + "click-to-change")); - } - case STATISTIC_AMOUNT -> { - description.add(this.user.getTranslation(reference + "value", - Constants.PARAMETER_NUMBER, String.valueOf(requirements.getAmount()))); - icon = new ItemStack(Material.CHEST); - clickHandler = (panel, user, clickType, i) -> { - Consumer numberConsumer = number -> { - if (number != null) - { - requirements.setAmount(number.intValue()); - } + description.add(""); + description.add(this.user.getTranslation(Constants.TIPS + "click-to-change")); + } + case STATISTIC_AMOUNT -> { + description.add(this.user.getTranslation(reference + "value", Constants.PARAMETER_NUMBER, + String.valueOf(requirements.getAmount()))); + icon = new ItemStack(Material.CHEST); + clickHandler = (panel, user, clickType, i) -> { + Consumer numberConsumer = number -> { + if (number != null) { + requirements.setAmount(number.intValue()); + } - // reopen panel - this.build(); - }; - ConversationUtils.createNumericInput(numberConsumer, - this.user, - this.user.getTranslation(Constants.CONVERSATIONS + "input-number"), - 0, - Integer.MAX_VALUE); + // reopen panel + this.build(); + }; + ConversationUtils.createNumericInput(numberConsumer, this.user, + this.user.getTranslation(Constants.CONVERSATIONS + "input-number"), 0, Integer.MAX_VALUE); - return true; - }; - glow = false; + return true; + }; + glow = false; - description.add(""); - description.add(this.user.getTranslation(Constants.TIPS + "click-to-change")); - } - case REMOVE_STATISTIC -> { - description.add(this.user.getTranslation(reference + - (requirements.isReduceStatistic() ? "enabled" : "disabled"))); + description.add(""); + description.add(this.user.getTranslation(Constants.TIPS + "click-to-change")); + } + case REMOVE_STATISTIC -> { + description.add( + this.user.getTranslation(reference + (requirements.isReduceStatistic() ? "enabled" : "disabled"))); - icon = new ItemStack(Material.LEVER); - clickHandler = (panel, user, clickType, slot) -> { - requirements.setReduceStatistic(!requirements.isReduceStatistic()); - this.build(); - return true; - }; - glow = requirements.isReduceStatistic(); + icon = new ItemStack(Material.LEVER); + clickHandler = (panel, user, clickType, slot) -> { + requirements.setReduceStatistic(!requirements.isReduceStatistic()); + this.build(); + return true; + }; + glow = requirements.isReduceStatistic(); - description.add(""); - description.add(this.user.getTranslation(Constants.TIPS + "click-to-toggle")); - } - case STATISTIC_BLOCKS -> { - description.add(this.user.getTranslation(reference + "value", - "[block]", Utils.prettifyObject(requirements.getMaterial(), this.user))); + description.add(""); + description.add(this.user.getTranslation(Constants.TIPS + "click-to-toggle")); + } + case STATISTIC_BLOCKS -> { + description.add(this.user.getTranslation(reference + "value", "[block]", + Utils.prettifyObject(requirements.getMaterial(), this.user))); - icon = requirements.getMaterial() == null ? - new ItemStack(Material.BARRIER) : - new ItemStack(requirements.getMaterial()); - clickHandler = (panel, user, clickType, slot) -> { - SingleBlockSelector.open(this.user, - SingleBlockSelector.Mode.BLOCKS, - (status, block) -> { - if (status) - { - requirements.setMaterial(block); - } + icon = requirements.getMaterial() == null ? new ItemStack(Material.BARRIER) + : new ItemStack(requirements.getMaterial()); + clickHandler = (panel, user, clickType, slot) -> { + SingleBlockSelector.open(this.user, SingleBlockSelector.Mode.BLOCKS, (status, block) -> { + if (status) { + requirements.setMaterial(block); + } - this.build(); - }); + this.build(); + }); - return true; - }; - glow = false; + return true; + }; + glow = false; - description.add(""); - description.add(this.user.getTranslation(Constants.TIPS + "click-to-change")); - } - case STATISTIC_ITEMS -> { - description.add(this.user.getTranslation(reference + "value", - "[item]", Utils.prettifyObject(requirements.getMaterial(), this.user))); + description.add(""); + description.add(this.user.getTranslation(Constants.TIPS + "click-to-change")); + } + case STATISTIC_ITEMS -> { + description.add(this.user.getTranslation(reference + "value", "[item]", + Utils.prettifyObject(requirements.getMaterial(), this.user))); - icon = requirements.getMaterial() == null ? - new ItemStack(Material.BARRIER) : - new ItemStack(requirements.getMaterial()); - clickHandler = (panel, user, clickType, slot) -> { - SingleBlockSelector.open(this.user, - SingleBlockSelector.Mode.ITEMS, - (status, block) -> { - if (status) - { - requirements.setMaterial(block); - } + icon = requirements.getMaterial() == null ? new ItemStack(Material.BARRIER) + : new ItemStack(requirements.getMaterial()); + clickHandler = (panel, user, clickType, slot) -> { + SingleBlockSelector.open(this.user, SingleBlockSelector.Mode.ITEMS, (status, block) -> { + if (status) { + requirements.setMaterial(block); + } - this.build(); - }); + this.build(); + }); - return true; - }; - glow = false; + return true; + }; + glow = false; - description.add(""); - description.add(this.user.getTranslation(Constants.TIPS + "click-to-change")); - } - case STATISTIC_ENTITIES -> { - description.add(this.user.getTranslation(reference + "value", - "[entity]", Utils.prettifyObject(requirements.getEntity(), this.user))); + description.add(""); + description.add(this.user.getTranslation(Constants.TIPS + "click-to-change")); + } + case STATISTIC_ENTITIES -> { + description.add(this.user.getTranslation(reference + "value", "[entity]", + Utils.prettifyObject(requirements.getEntity(), this.user))); - icon = requirements.getEntity() == null ? - new ItemStack(Material.BARRIER) : - new ItemStack(PanelUtils.getEntityEgg(requirements.getEntity())); - clickHandler = (panel, user, clickType, slot) -> { - SingleEntitySelector.open(this.user, - true, - (status, entity) -> { - if (status) - { - requirements.setEntity(entity); - } + icon = requirements.getEntity() == null ? new ItemStack(Material.BARRIER) + : new ItemStack(PanelUtils.getEntityEgg(requirements.getEntity())); + clickHandler = (panel, user, clickType, slot) -> { + SingleEntitySelector.open(this.user, true, (status, entity) -> { + if (status) { + requirements.setEntity(entity); + } - this.build(); - }); + this.build(); + }); - return true; - }; - glow = false; + return true; + }; + glow = false; - description.add(""); - description.add(this.user.getTranslation(Constants.TIPS + "click-to-change")); - } - default -> { - icon = new ItemStack(Material.PAPER); - clickHandler = null; - glow = false; - } - } + description.add(""); + description.add(this.user.getTranslation(Constants.TIPS + "click-to-change")); + } + default -> { + icon = new ItemStack(Material.PAPER); + clickHandler = null; + glow = false; + } + } - return new PanelItemBuilder(). - icon(icon). - name(name). - description(description). - glow(glow). - clickHandler(clickHandler). - build(); + return new PanelItemBuilder().icon(icon).name(name).description(description).glow(glow) + .clickHandler(clickHandler).build(); } - /** * This method creates buttons for rewards menu. + * * @param button Button which panel item must be created. * @return PanelItem that represents given button. */ - private PanelItem createRewardButton(RewardButton button) - { - final String reference = Constants.BUTTON + button.name().toLowerCase() + "."; - - final String name = this.user.getTranslation(reference + "name"); - final List description = new ArrayList<>(3); - description.add(this.user.getTranslation(reference + "description")); - - ItemStack icon; - boolean glow; - PanelItem.ClickHandler clickHandler; - - switch (button) - { - case REWARD_TEXT -> { - icon = new ItemStack(Material.WRITTEN_BOOK); - - description.add(this.user.getTranslation(reference + "value")); - description.add(Util.translateColorCodes(this.challenge.getRewardText())); - - clickHandler = (panel, user, clickType, i) -> - { - // Create consumer that process description change - Consumer> consumer = value -> - { - if (value != null) - { - this.challenge.setRewardText(String.join("\n", value)); - } - - this.build(); - }; - - if (!this.challenge.getRewardText().isEmpty() && clickType.isShiftClick()) - { - // Reset to the empty value - consumer.accept(Collections.emptyList()); - } - else - { - // start conversation - ConversationUtils.createStringListInput(consumer, - user, - user.getTranslation(Constants.CONVERSATIONS + "write-reward-text"), - user.getTranslation(Constants.CONVERSATIONS + "reward-text-changed")); - } - - - return true; - }; - glow = false; - - description.add(""); - description.add(this.user.getTranslation(Constants.TIPS + "click-to-change")); - - if (!this.challenge.getRewardText().isEmpty()) - { - description.add(this.user.getTranslation(Constants.TIPS + "shift-click-to-reset")); - } - } - case REWARD_ITEMS -> { - - if (this.challenge.getRewardItems().isEmpty()) - { - description.add(this.user.getTranslation(reference + "none")); - } - else - { - description.add(this.user.getTranslation(reference + "title")); - - Utils.groupEqualItems(this.challenge.getRewardItems(), this.challenge.getIgnoreRewardMetaData()). - stream(). - sorted(Comparator.comparing(ItemStack::getType)). - forEach(itemStack -> - description.add(this.user.getTranslationOrNothing(reference + "list", - "[number]", String.valueOf(itemStack.getAmount()), - "[item]", Utils.prettifyObject(itemStack, this.user)))); - } - - icon = new ItemStack(Material.CHEST); - clickHandler = (panel, user, clickType, slot) -> { - ItemSelector.open(this.user, - this.challenge.getRewardItems(), - (status, value) -> { - if (status) - { - this.challenge.setRewardItems(value); - } - - this.build(); - }); - - return true; - }; - glow = false; - - description.add(""); - description.add(this.user.getTranslation(Constants.TIPS + "click-to-change")); - } - case REWARD_EXPERIENCE -> { - description.add(this.user.getTranslation(reference + "value", - Constants.PARAMETER_NUMBER, String.valueOf(this.challenge.getRewardExperience()))); - icon = new ItemStack(Material.EXPERIENCE_BOTTLE); - clickHandler = (panel, user, clickType, i) -> { - Consumer numberConsumer = number -> { - if (number != null) - { - this.challenge.setRewardExperience(number.intValue()); - } - - // reopen panel - this.build(); - }; - ConversationUtils.createNumericInput(numberConsumer, - this.user, - this.user.getTranslation(Constants.CONVERSATIONS + "input-number"), - 0, - Integer.MAX_VALUE); - - return true; - }; - glow = false; - - description.add(""); - description.add(this.user.getTranslation(Constants.TIPS + "click-to-change")); - } - case REWARD_MONEY -> { - description.add(this.user.getTranslation(reference + "value", - Constants.PARAMETER_NUMBER, String.valueOf(this.challenge.getRewardMoney()))); - icon = new ItemStack(this.addon.isEconomyProvided() ? Material.GOLD_INGOT : Material.BARRIER); - clickHandler = (panel, user, clickType, i) -> { - Consumer numberConsumer = number -> { - if (number != null) - { - this.challenge.setRewardMoney(number.doubleValue()); - } - - // reopen panel - this.build(); - }; - ConversationUtils.createNumericInput(numberConsumer, - this.user, - this.user.getTranslation(Constants.CONVERSATIONS + "input-number"), - 0, - Double.MAX_VALUE); - - return true; - }; - glow = false; - - description.add(""); - description.add(this.user.getTranslation(Constants.TIPS + "click-to-change")); - } - case REWARD_COMMANDS -> { - icon = new ItemStack(Material.COMMAND_BLOCK); - - description.add(this.user.getTranslation(reference + "value")); - description.addAll(this.challenge.getRewardCommands()); - - clickHandler = (panel, user, clickType, i) -> - { - // Create consumer that process description change - Consumer> consumer = value -> - { - if (value != null) - { - this.challenge.setRewardCommands(value); - } - - this.build(); - }; - - if (!this.challenge.getRewardCommands().isEmpty() && clickType.isShiftClick()) - { - // Reset to the empty value - consumer.accept(Collections.emptyList()); - } - else - { - // start conversation - ConversationUtils.createStringListInput(consumer, - user, - user.getTranslation(Constants.CONVERSATIONS + "write-reward-commands"), - user.getTranslation(Constants.CONVERSATIONS + "reward-commands-changed")); - } - - return true; - }; - glow = false; - - description.add(""); - description.add(this.user.getTranslation(Constants.TIPS + "click-to-change")); - - if (!this.challenge.getRewardCommands().isEmpty()) - { - description.add(this.user.getTranslation(Constants.TIPS + "shift-click-to-reset")); - } - } - case REPEATABLE -> { - description.add(this.user.getTranslation(reference + - (this.challenge.isRepeatable() ? "enabled" : "disabled"))); - - icon = new ItemStack(Material.LEVER); - clickHandler = (panel, user, clickType, slot) -> { - this.challenge.setRepeatable(!this.challenge.isRepeatable()); - this.build(); - return true; - }; - glow = this.challenge.isRepeatable(); - - description.add(""); - description.add(this.user.getTranslation(Constants.TIPS + "click-to-toggle")); - } - case REPEAT_COUNT -> { - description.add(this.user.getTranslation(reference + "value", - Constants.PARAMETER_NUMBER, String.valueOf(this.challenge.getMaxTimes()))); - icon = new ItemStack(Material.COBBLESTONE_WALL); - clickHandler = (panel, user, clickType, i) -> { - Consumer numberConsumer = number -> { - if (number != null) - { - this.challenge.setMaxTimes(number.intValue()); - } - - // reopen panel - this.build(); - }; - ConversationUtils.createNumericInput(numberConsumer, - this.user, - this.user.getTranslation(Constants.CONVERSATIONS + "input-number"), - 0, - Integer.MAX_VALUE); - - return true; - }; - glow = false; - - description.add(""); - description.add(this.user.getTranslation(Constants.TIPS + "click-to-change")); - } - case COOL_DOWN -> { - description.add(this.user.getTranslation(reference + "value", - "[time]", - Utils.parseDuration(Duration.ofMillis(this.challenge.getTimeout()), this.user))); - icon = new ItemStack(Material.CLOCK); - clickHandler = (panel, user, clickType, i) -> { - Consumer numberConsumer = number -> { - if (number != null) - { - this.challenge.setTimeout(number.longValue() * 1000); - } - - // reopen panel - this.build(); - }; - ConversationUtils.createNumericInput(numberConsumer, - this.user, - this.user.getTranslation(Constants.CONVERSATIONS + "input-seconds"), - 0, - Integer.MAX_VALUE); - - return true; - }; - glow = false; - - description.add(""); - description.add(this.user.getTranslation(Constants.TIPS + "click-to-change")); - } - case REPEAT_REWARD_TEXT -> { - icon = new ItemStack(Material.WRITTEN_BOOK); - - description.add(this.user.getTranslation(reference + "value")); - description.add(Util.translateColorCodes(this.challenge.getRepeatRewardText())); - - clickHandler = (panel, user, clickType, i) -> - { - // Create consumer that process description change - Consumer> consumer = value -> - { - if (value != null) - { - this.challenge.setRepeatRewardText(String.join("\n", value)); - } - - this.build(); - }; - - if (!this.challenge.getRepeatRewardText().isEmpty() && clickType.isShiftClick()) - { - // Reset to the empty value - consumer.accept(Collections.emptyList()); - } - else - { - // start conversation - ConversationUtils.createStringListInput(consumer, - user, - user.getTranslation(Constants.CONVERSATIONS + "write-repeat-reward-text"), - user.getTranslation(Constants.CONVERSATIONS + "repeat-reward-text-changed")); - } - - return true; - }; - glow = false; - - description.add(""); - description.add(this.user.getTranslation(Constants.TIPS + "click-to-change")); - - if (!this.challenge.getRepeatRewardText().isEmpty()) - { - description.add(this.user.getTranslation(Constants.TIPS + "shift-click-to-reset")); - } - } - case REPEAT_REWARD_ITEMS -> { - - if (this.challenge.getRepeatItemReward().isEmpty()) - { - description.add(this.user.getTranslation(reference + "none")); - } - else - { - description.add(this.user.getTranslation(reference + "title")); - - Utils.groupEqualItems(this.challenge.getRepeatItemReward(), this.challenge.getIgnoreRewardMetaData()). - stream(). - sorted(Comparator.comparing(ItemStack::getType)). - forEach(itemStack -> - description.add(this.user.getTranslationOrNothing(reference + "list", - "[number]", String.valueOf(itemStack.getAmount()), - "[item]", Utils.prettifyObject(itemStack, this.user)))); - } - - icon = new ItemStack(Material.CHEST); - clickHandler = (panel, user, clickType, slot) -> { - ItemSelector.open(this.user, - this.challenge.getRewardItems(), - (status, value) -> { - if (status) - { - this.challenge.setRepeatItemReward(value); - } - - this.build(); - }); - - return true; - }; - glow = false; - - description.add(""); - description.add(this.user.getTranslation(Constants.TIPS + "click-to-change")); - } - case REPEAT_REWARD_EXPERIENCE -> { - description.add(this.user.getTranslation(reference + "value", - Constants.PARAMETER_NUMBER, String.valueOf(this.challenge.getRepeatExperienceReward()))); - icon = new ItemStack(Material.EXPERIENCE_BOTTLE); - clickHandler = (panel, user, clickType, i) -> { - Consumer numberConsumer = number -> { - if (number != null) - { - this.challenge.setRepeatExperienceReward(number.intValue()); - } - - // reopen panel - this.build(); - }; - ConversationUtils.createNumericInput(numberConsumer, - this.user, - this.user.getTranslation(Constants.CONVERSATIONS + "input-number"), - 0, - Integer.MAX_VALUE); - - return true; - }; - glow = false; - - description.add(""); - description.add(this.user.getTranslation(Constants.TIPS + "click-to-change")); - } - case REPEAT_REWARD_MONEY -> { - description.add(this.user.getTranslation(reference + "value", - Constants.PARAMETER_NUMBER, String.valueOf(this.challenge.getRepeatMoneyReward()))); - icon = new ItemStack(this.addon.isEconomyProvided() ? Material.GOLD_NUGGET : Material.BARRIER); - clickHandler = (panel, user, clickType, i) -> { - Consumer numberConsumer = number -> { - if (number != null) - { - this.challenge.setRepeatMoneyReward(number.doubleValue()); - } - - // reopen panel - this.build(); - }; - ConversationUtils.createNumericInput(numberConsumer, - this.user, - this.user.getTranslation(Constants.CONVERSATIONS + "input-number"), - 0, - Double.MAX_VALUE); - - return true; - }; - glow = false; - - description.add(""); - description.add(this.user.getTranslation(Constants.TIPS + "click-to-change")); - } - case REPEAT_REWARD_COMMANDS -> { - icon = new ItemStack(Material.COMMAND_BLOCK); - - description.add(this.user.getTranslation(reference + "value")); - description.addAll(this.challenge.getRepeatRewardCommands()); - - clickHandler = (panel, user, clickType, i) -> - { - // Create consumer that process description change - Consumer> consumer = value -> - { - if (value != null) - { - this.challenge.setRepeatRewardCommands(value); - } - - this.build(); - }; - - if (!this.challenge.getRepeatRewardCommands().isEmpty() && clickType.isShiftClick()) - { - // Reset to the empty value - consumer.accept(Collections.emptyList()); - } - else - { - // start conversation - ConversationUtils.createStringListInput(consumer, - user, - user.getTranslation(Constants.CONVERSATIONS + "write-repeat-reward-commands"), - user.getTranslation(Constants.CONVERSATIONS + "repeat-reward-commands-changed")); - } - - return true; - }; - glow = false; - - description.add(""); - description.add(this.user.getTranslation(Constants.TIPS + "click-to-change")); - - if (!this.challenge.getRepeatRewardCommands().isEmpty()) - { - description.add(this.user.getTranslation(Constants.TIPS + "shift-click-to-reset")); - } - } - case ADD_IGNORED_META -> { - if (this.challenge.getIgnoreRewardMetaData().isEmpty()) - { - description.add(this.user.getTranslation(reference + "none")); - } - else - { - description.add(this.user.getTranslation(reference + "title")); - - this.challenge.getIgnoreRewardMetaData().stream(). - sorted(Comparator.comparing(Material::name)). - forEach(itemStack -> - description.add(this.user.getTranslationOrNothing(reference + "list", - "[item]", Utils.prettifyObject(itemStack, this.user)))); - } - - icon = new ItemStack(Material.GREEN_SHULKER_BOX); - - clickHandler = (panel, user, clickType, slot) -> { - if (this.challenge.getRewardItems().isEmpty() && - this.challenge.getRepeatItemReward().isEmpty()) - { - // Do nothing if no requirements are set. - return true; - } - - // Allow choosing only from inventory items. - Set collection = Arrays.stream(Material.values()).collect(Collectors.toSet()); - this.challenge.getRewardItems().stream(). - map(ItemStack::getType). - forEach(collection::remove); - this.challenge.getRepeatItemReward().stream(). - map(ItemStack::getType). - forEach(collection::remove); - collection.addAll(this.challenge.getIgnoreRewardMetaData()); - - if (Material.values().length == collection.size()) - { - // If there are no items anymore, then do not allow opening gui. - return true; - } - - MultiBlockSelector.open(this.user, - MultiBlockSelector.Mode.ANY, - collection, - (status, materials) -> - { - if (status) - { - materials.addAll(this.challenge.getIgnoreRewardMetaData()); - this.challenge.setIgnoreRewardMetaData(new HashSet<>(materials)); - } - - this.build(); - }); - return true; - }; - glow = false; - - description.add(""); - description.add(this.user.getTranslation(Constants.TIPS + "click-to-add")); - } - case REMOVE_IGNORED_META -> { - icon = new ItemStack(Material.RED_SHULKER_BOX); - - clickHandler = (panel, user, clickType, slot) -> { - if (this.challenge.getIgnoreRewardMetaData().isEmpty()) - { - // Do nothing if no requirements are set. - return true; - } - - // Allow choosing only from inventory items. - Set collection = Arrays.stream(Material.values()).collect(Collectors.toSet()); - collection.removeAll(this.challenge.getIgnoreRewardMetaData()); - - MultiBlockSelector.open(this.user, - MultiBlockSelector.Mode.ANY, - collection, - (status, materials) -> - { - if (status) - { - this.challenge.getIgnoreRewardMetaData().removeAll(materials); - } - - this.build(); - }); - return true; - }; - glow = false; - - description.add(""); - description.add(this.user.getTranslation(Constants.TIPS + "click-to-remove")); - } - default -> { - icon = new ItemStack(Material.PAPER); - clickHandler = null; - glow = false; - } - } - - return new PanelItemBuilder(). - icon(icon). - name(name). - description(description). - glow(glow). - clickHandler(clickHandler). - build(); + private PanelItem createRewardButton(RewardButton button) { + final String reference = Constants.BUTTON + button.name().toLowerCase() + "."; + + final String name = this.user.getTranslation(reference + "name"); + final List description = new ArrayList<>(3); + description.add(this.user.getTranslation(reference + "description")); + + ItemStack icon; + boolean glow; + PanelItem.ClickHandler clickHandler; + + switch (button) { + case REWARD_TEXT -> { + icon = new ItemStack(Material.WRITTEN_BOOK); + + description.add(this.user.getTranslation(reference + "value")); + description.add(Util.translateColorCodes(this.challenge.getRewardText())); + + clickHandler = (panel, user, clickType, i) -> { + // Create consumer that process description change + Consumer> consumer = value -> { + if (value != null) { + this.challenge.setRewardText(String.join("\n", value)); + } + + this.build(); + }; + + if (!this.challenge.getRewardText().isEmpty() && clickType.isShiftClick()) { + // Reset to the empty value + consumer.accept(Collections.emptyList()); + } else { + // start conversation + ConversationUtils.createStringListInput(consumer, user, + user.getTranslation(Constants.CONVERSATIONS + "write-reward-text"), + user.getTranslation(Constants.CONVERSATIONS + "reward-text-changed")); + } + + return true; + }; + glow = false; + + description.add(""); + description.add(this.user.getTranslation(Constants.TIPS + "click-to-change")); + + if (!this.challenge.getRewardText().isEmpty()) { + description.add(this.user.getTranslation(Constants.TIPS + "shift-click-to-reset")); + } + } + case REWARD_ITEMS -> { + + if (this.challenge.getRewardItems().isEmpty()) { + description.add(this.user.getTranslation(reference + "none")); + } else { + description.add(this.user.getTranslation(reference + "title")); + + Utils.groupEqualItems(this.challenge.getRewardItems(), this.challenge.getIgnoreRewardMetaData()) + .stream().sorted(Comparator.comparing(ItemStack::getType)) + .forEach(itemStack -> description.add(this.user.getTranslationOrNothing(reference + "list", + "[number]", String.valueOf(itemStack.getAmount()), "[item]", + Utils.prettifyObject(itemStack, this.user)))); + } + + icon = new ItemStack(Material.CHEST); + clickHandler = (panel, user, clickType, slot) -> { + ItemSelector.open(this.user, this.challenge.getRewardItems(), (status, value) -> { + if (status) { + this.challenge.setRewardItems(value); + } + + this.build(); + }); + + return true; + }; + glow = false; + + description.add(""); + description.add(this.user.getTranslation(Constants.TIPS + "click-to-change")); + } + case REWARD_EXPERIENCE -> { + description.add(this.user.getTranslation(reference + "value", Constants.PARAMETER_NUMBER, + String.valueOf(this.challenge.getRewardExperience()))); + icon = new ItemStack(Material.EXPERIENCE_BOTTLE); + clickHandler = (panel, user, clickType, i) -> { + Consumer numberConsumer = number -> { + if (number != null) { + this.challenge.setRewardExperience(number.intValue()); + } + + // reopen panel + this.build(); + }; + ConversationUtils.createNumericInput(numberConsumer, this.user, + this.user.getTranslation(Constants.CONVERSATIONS + "input-number"), 0, Integer.MAX_VALUE); + + return true; + }; + glow = false; + + description.add(""); + description.add(this.user.getTranslation(Constants.TIPS + "click-to-change")); + } + case REWARD_MONEY -> { + description.add(this.user.getTranslation(reference + "value", Constants.PARAMETER_NUMBER, + addon.getPlugin().getVault().map(v -> v.format(challenge.getRewardMoney())) + .orElse(String.valueOf(challenge.getRewardMoney())))); + icon = new ItemStack(this.addon.isEconomyProvided() ? Material.GOLD_INGOT : Material.BARRIER); + clickHandler = (panel, user, clickType, i) -> { + Consumer numberConsumer = number -> { + if (number != null) { + this.challenge.setRewardMoney(number.doubleValue()); + } + + // reopen panel + this.build(); + }; + ConversationUtils.createNumericInput(numberConsumer, this.user, + this.user.getTranslation(Constants.CONVERSATIONS + "input-number"), 0, Double.MAX_VALUE); + + return true; + }; + glow = false; + + description.add(""); + description.add(this.user.getTranslation(Constants.TIPS + "click-to-change")); + } + case REWARD_COMMANDS -> { + icon = new ItemStack(Material.COMMAND_BLOCK); + + description.add(this.user.getTranslation(reference + "value")); + description.addAll(this.challenge.getRewardCommands()); + + clickHandler = (panel, user, clickType, i) -> { + // Create consumer that process description change + Consumer> consumer = value -> { + if (value != null) { + this.challenge.setRewardCommands(value); + } + + this.build(); + }; + + if (!this.challenge.getRewardCommands().isEmpty() && clickType.isShiftClick()) { + // Reset to the empty value + consumer.accept(Collections.emptyList()); + } else { + // start conversation + ConversationUtils.createStringListInput(consumer, user, + user.getTranslation(Constants.CONVERSATIONS + "write-reward-commands"), + user.getTranslation(Constants.CONVERSATIONS + "reward-commands-changed")); + } + + return true; + }; + glow = false; + + description.add(""); + description.add(this.user.getTranslation(Constants.TIPS + "click-to-change")); + + if (!this.challenge.getRewardCommands().isEmpty()) { + description.add(this.user.getTranslation(Constants.TIPS + "shift-click-to-reset")); + } + } + case REPEATABLE -> { + description.add( + this.user.getTranslation(reference + (this.challenge.isRepeatable() ? "enabled" : "disabled"))); + + icon = new ItemStack(Material.LEVER); + clickHandler = (panel, user, clickType, slot) -> { + this.challenge.setRepeatable(!this.challenge.isRepeatable()); + this.build(); + return true; + }; + glow = this.challenge.isRepeatable(); + + description.add(""); + description.add(this.user.getTranslation(Constants.TIPS + "click-to-toggle")); + } + case REPEAT_COUNT -> { + description.add(this.user.getTranslation(reference + "value", Constants.PARAMETER_NUMBER, + String.valueOf(this.challenge.getMaxTimes()))); + icon = new ItemStack(Material.COBBLESTONE_WALL); + clickHandler = (panel, user, clickType, i) -> { + Consumer numberConsumer = number -> { + if (number != null) { + this.challenge.setMaxTimes(number.intValue()); + } + + // reopen panel + this.build(); + }; + ConversationUtils.createNumericInput(numberConsumer, this.user, + this.user.getTranslation(Constants.CONVERSATIONS + "input-number"), 0, Integer.MAX_VALUE); + + return true; + }; + glow = false; + + description.add(""); + description.add(this.user.getTranslation(Constants.TIPS + "click-to-change")); + } + case COOL_DOWN -> { + description.add(this.user.getTranslation(reference + "value", "[time]", + Utils.parseDuration(Duration.ofMillis(this.challenge.getTimeout()), this.user))); + icon = new ItemStack(Material.CLOCK); + clickHandler = (panel, user, clickType, i) -> { + Consumer numberConsumer = number -> { + if (number != null) { + this.challenge.setTimeout(number.longValue() * 1000); + } + + // reopen panel + this.build(); + }; + ConversationUtils.createNumericInput(numberConsumer, this.user, + this.user.getTranslation(Constants.CONVERSATIONS + "input-seconds"), 0, Integer.MAX_VALUE); + + return true; + }; + glow = false; + + description.add(""); + description.add(this.user.getTranslation(Constants.TIPS + "click-to-change")); + } + case REPEAT_REWARD_TEXT -> { + icon = new ItemStack(Material.WRITTEN_BOOK); + + description.add(this.user.getTranslation(reference + "value")); + description.add(Util.translateColorCodes(this.challenge.getRepeatRewardText())); + + clickHandler = (panel, user, clickType, i) -> { + // Create consumer that process description change + Consumer> consumer = value -> { + if (value != null) { + this.challenge.setRepeatRewardText(String.join("\n", value)); + } + + this.build(); + }; + + if (!this.challenge.getRepeatRewardText().isEmpty() && clickType.isShiftClick()) { + // Reset to the empty value + consumer.accept(Collections.emptyList()); + } else { + // start conversation + ConversationUtils.createStringListInput(consumer, user, + user.getTranslation(Constants.CONVERSATIONS + "write-repeat-reward-text"), + user.getTranslation(Constants.CONVERSATIONS + "repeat-reward-text-changed")); + } + + return true; + }; + glow = false; + + description.add(""); + description.add(this.user.getTranslation(Constants.TIPS + "click-to-change")); + + if (!this.challenge.getRepeatRewardText().isEmpty()) { + description.add(this.user.getTranslation(Constants.TIPS + "shift-click-to-reset")); + } + } + case REPEAT_REWARD_ITEMS -> { + + if (this.challenge.getRepeatItemReward().isEmpty()) { + description.add(this.user.getTranslation(reference + "none")); + } else { + description.add(this.user.getTranslation(reference + "title")); + + Utils.groupEqualItems(this.challenge.getRepeatItemReward(), this.challenge.getIgnoreRewardMetaData()) + .stream().sorted(Comparator.comparing(ItemStack::getType)) + .forEach(itemStack -> description.add(this.user.getTranslationOrNothing(reference + "list", + "[number]", String.valueOf(itemStack.getAmount()), "[item]", + Utils.prettifyObject(itemStack, this.user)))); + } + + icon = new ItemStack(Material.CHEST); + clickHandler = (panel, user, clickType, slot) -> { + ItemSelector.open(this.user, this.challenge.getRewardItems(), (status, value) -> { + if (status) { + this.challenge.setRepeatItemReward(value); + } + + this.build(); + }); + + return true; + }; + glow = false; + + description.add(""); + description.add(this.user.getTranslation(Constants.TIPS + "click-to-change")); + } + case REPEAT_REWARD_EXPERIENCE -> { + description.add(this.user.getTranslation(reference + "value", Constants.PARAMETER_NUMBER, + String.valueOf(this.challenge.getRepeatExperienceReward()))); + icon = new ItemStack(Material.EXPERIENCE_BOTTLE); + clickHandler = (panel, user, clickType, i) -> { + Consumer numberConsumer = number -> { + if (number != null) { + this.challenge.setRepeatExperienceReward(number.intValue()); + } + + // reopen panel + this.build(); + }; + ConversationUtils.createNumericInput(numberConsumer, this.user, + this.user.getTranslation(Constants.CONVERSATIONS + "input-number"), 0, Integer.MAX_VALUE); + + return true; + }; + glow = false; + + description.add(""); + description.add(this.user.getTranslation(Constants.TIPS + "click-to-change")); + } + case REPEAT_REWARD_MONEY -> { + description.add(this.user.getTranslation(reference + "value", Constants.PARAMETER_NUMBER, + String.valueOf(this.challenge.getRepeatMoneyReward()))); + icon = new ItemStack(this.addon.isEconomyProvided() ? Material.GOLD_NUGGET : Material.BARRIER); + clickHandler = (panel, user, clickType, i) -> { + Consumer numberConsumer = number -> { + if (number != null) { + this.challenge.setRepeatMoneyReward(number.doubleValue()); + } + + // reopen panel + this.build(); + }; + ConversationUtils.createNumericInput(numberConsumer, this.user, + this.user.getTranslation(Constants.CONVERSATIONS + "input-number"), 0, Double.MAX_VALUE); + + return true; + }; + glow = false; + + description.add(""); + description.add(this.user.getTranslation(Constants.TIPS + "click-to-change")); + } + case REPEAT_REWARD_COMMANDS -> { + icon = new ItemStack(Material.COMMAND_BLOCK); + + description.add(this.user.getTranslation(reference + "value")); + description.addAll(this.challenge.getRepeatRewardCommands()); + + clickHandler = (panel, user, clickType, i) -> { + // Create consumer that process description change + Consumer> consumer = value -> { + if (value != null) { + this.challenge.setRepeatRewardCommands(value); + } + + this.build(); + }; + + if (!this.challenge.getRepeatRewardCommands().isEmpty() && clickType.isShiftClick()) { + // Reset to the empty value + consumer.accept(Collections.emptyList()); + } else { + // start conversation + ConversationUtils.createStringListInput(consumer, user, + user.getTranslation(Constants.CONVERSATIONS + "write-repeat-reward-commands"), + user.getTranslation(Constants.CONVERSATIONS + "repeat-reward-commands-changed")); + } + + return true; + }; + glow = false; + + description.add(""); + description.add(this.user.getTranslation(Constants.TIPS + "click-to-change")); + + if (!this.challenge.getRepeatRewardCommands().isEmpty()) { + description.add(this.user.getTranslation(Constants.TIPS + "shift-click-to-reset")); + } + } + case ADD_IGNORED_META -> { + if (this.challenge.getIgnoreRewardMetaData().isEmpty()) { + description.add(this.user.getTranslation(reference + "none")); + } else { + description.add(this.user.getTranslation(reference + "title")); + + this.challenge.getIgnoreRewardMetaData().stream().sorted(Comparator.comparing(Material::name)) + .forEach(itemStack -> description.add(this.user.getTranslationOrNothing(reference + "list", + "[item]", Utils.prettifyObject(itemStack, this.user)))); + } + + icon = new ItemStack(Material.GREEN_SHULKER_BOX); + + clickHandler = (panel, user, clickType, slot) -> { + if (this.challenge.getRewardItems().isEmpty() && this.challenge.getRepeatItemReward().isEmpty()) { + // Do nothing if no requirements are set. + return true; + } + + // Allow choosing only from inventory items. + Set collection = Arrays.stream(Material.values()).collect(Collectors.toSet()); + this.challenge.getRewardItems().stream().map(ItemStack::getType).forEach(collection::remove); + this.challenge.getRepeatItemReward().stream().map(ItemStack::getType).forEach(collection::remove); + collection.addAll(this.challenge.getIgnoreRewardMetaData()); + + if (Material.values().length == collection.size()) { + // If there are no items anymore, then do not allow opening gui. + return true; + } + + MultiBlockSelector.open(this.user, MultiBlockSelector.Mode.ANY, collection, (status, materials) -> { + if (status) { + materials.addAll(this.challenge.getIgnoreRewardMetaData()); + this.challenge.setIgnoreRewardMetaData(new HashSet<>(materials)); + } + + this.build(); + }); + return true; + }; + glow = false; + + description.add(""); + description.add(this.user.getTranslation(Constants.TIPS + "click-to-add")); + } + case REMOVE_IGNORED_META -> { + icon = new ItemStack(Material.RED_SHULKER_BOX); + + clickHandler = (panel, user, clickType, slot) -> { + if (this.challenge.getIgnoreRewardMetaData().isEmpty()) { + // Do nothing if no requirements are set. + return true; + } + + // Allow choosing only from inventory items. + Set collection = Arrays.stream(Material.values()).collect(Collectors.toSet()); + collection.removeAll(this.challenge.getIgnoreRewardMetaData()); + + MultiBlockSelector.open(this.user, MultiBlockSelector.Mode.ANY, collection, (status, materials) -> { + if (status) { + this.challenge.getIgnoreRewardMetaData().removeAll(materials); + } + + this.build(); + }); + return true; + }; + glow = false; + + description.add(""); + description.add(this.user.getTranslation(Constants.TIPS + "click-to-remove")); + } + default -> { + icon = new ItemStack(Material.PAPER); + clickHandler = null; + glow = false; + } + } + + return new PanelItemBuilder().icon(icon).name(name).description(description).glow(glow) + .clickHandler(clickHandler).build(); } // --------------------------------------------------------------------- // Section: Classes // --------------------------------------------------------------------- - /** * This class allows changing icon for Generator Tier */ - private class IconChanger implements PanelListener - { - /** - * Process inventory click. If generator icon is selected and user clicks on item in his inventory, then change - * icon to the item from inventory. - * - * @param user the user - * @param event the event - */ - @Override - public void onInventoryClick(User user, InventoryClickEvent event) - { - // Handle icon changing - if (EditChallengePanel.this.selectedButton != null && - event.getCurrentItem() != null && - !event.getCurrentItem().getType().equals(Material.AIR) && - event.getRawSlot() > 44) - { - // set material and amount only. Other data should be removed. + private class IconChanger implements PanelListener { + /** + * Process inventory click. If generator icon is selected and user clicks on + * item in his inventory, then change icon to the item from inventory. + * + * @param user the user + * @param event the event + */ + @Override + public void onInventoryClick(User user, InventoryClickEvent event) { + // Handle icon changing + if (EditChallengePanel.this.selectedButton != null && event.getCurrentItem() != null + && !event.getCurrentItem().getType().equals(Material.AIR) && event.getRawSlot() > 44) { + // set material and amount only. Other data should be removed. - if (EditChallengePanel.this.selectedButton == Button.ICON) - { - EditChallengePanel.this.challenge.setIcon(event.getCurrentItem().clone()); - // Deselect icon - EditChallengePanel.this.selectedButton = null; - // Rebuild icon - EditChallengePanel.this.build(); - } - } - } + if (EditChallengePanel.this.selectedButton == Button.ICON) { + EditChallengePanel.this.challenge.setIcon(event.getCurrentItem().clone()); + // Deselect icon + EditChallengePanel.this.selectedButton = null; + // Rebuild icon + EditChallengePanel.this.build(); + } + } + } + /** + * On inventory close. + * + * @param event the event + */ + @Override + public void onInventoryClose(InventoryCloseEvent event) { + // Do nothing + } - /** - * On inventory close. - * - * @param event the event - */ - @Override - public void onInventoryClose(InventoryCloseEvent event) - { - // Do nothing - } - - - /** - * Setup current listener. - */ - @Override - public void setup() - { - // Do nothing - } + /** + * Setup current listener. + */ + @Override + public void setup() { + // Do nothing + } } - // --------------------------------------------------------------------- // Section: Enums // --------------------------------------------------------------------- - /** * Represents different types of menus */ - private enum MenuType - { - PROPERTIES, - REQUIREMENTS, - REWARDS + private enum MenuType { + PROPERTIES, REQUIREMENTS, REWARDS } - /** * Represents different buttons that could be in menus. */ - private enum Button - { - NAME, - DEPLOYED, - ICON, - DESCRIPTION, - ORDER, - ENVIRONMENT, - REMOVE_ON_COMPLETE, + private enum Button { + NAME, DEPLOYED, ICON, DESCRIPTION, ORDER, ENVIRONMENT, REMOVE_ON_COMPLETE, } - /** * Represents different rewards buttons that are used in menus. */ - private enum RewardButton - { - REWARD_TEXT, - REWARD_ITEMS, - REWARD_EXPERIENCE, - REWARD_MONEY, - REWARD_COMMANDS, + private enum RewardButton { + REWARD_TEXT, REWARD_ITEMS, REWARD_EXPERIENCE, REWARD_MONEY, REWARD_COMMANDS, - REPEATABLE, - REPEAT_COUNT, - COOL_DOWN, + REPEATABLE, REPEAT_COUNT, COOL_DOWN, - REPEAT_REWARD_TEXT, - REPEAT_REWARD_ITEMS, - REPEAT_REWARD_EXPERIENCE, - REPEAT_REWARD_MONEY, - REPEAT_REWARD_COMMANDS, + REPEAT_REWARD_TEXT, REPEAT_REWARD_ITEMS, REPEAT_REWARD_EXPERIENCE, REPEAT_REWARD_MONEY, REPEAT_REWARD_COMMANDS, - ADD_IGNORED_META, - REMOVE_IGNORED_META, + ADD_IGNORED_META, REMOVE_IGNORED_META, } - /** * Represents different requirement buttons that are used in menus. */ - private enum RequirementButton - { - REQUIRED_ENTITIES, - REMOVE_ENTITIES, - REQUIRED_BLOCKS, - REMOVE_BLOCKS, - SEARCH_RADIUS, - REQUIRED_PERMISSIONS, - REQUIRED_ITEMS, - REMOVE_ITEMS, - ADD_IGNORED_META, - REMOVE_IGNORED_META, - REQUIRED_EXPERIENCE, - REMOVE_EXPERIENCE, - REQUIRED_LEVEL, - REQUIRED_MONEY, - REMOVE_MONEY, - STATISTIC, - STATISTIC_BLOCKS, - STATISTIC_ITEMS, - STATISTIC_ENTITIES, - STATISTIC_AMOUNT, - REMOVE_STATISTIC, + private enum RequirementButton { + REQUIRED_ENTITIES, REMOVE_ENTITIES, REQUIRED_BLOCKS, REMOVE_BLOCKS, SEARCH_RADIUS, REQUIRED_PERMISSIONS, + REQUIRED_ITEMS, REMOVE_ITEMS, ADD_IGNORED_META, REMOVE_IGNORED_META, REQUIRED_EXPERIENCE, REMOVE_EXPERIENCE, + REQUIRED_LEVEL, REQUIRED_MONEY, REMOVE_MONEY, STATISTIC, STATISTIC_BLOCKS, STATISTIC_ITEMS, STATISTIC_ENTITIES, + STATISTIC_AMOUNT, REMOVE_STATISTIC, } - // --------------------------------------------------------------------- // Section: Variables // --------------------------------------------------------------------- - /** * Variable holds challenge thats needs editing. */ private final Challenge challenge; - private Button selectedButton; /**