From 6de6f3bd21c3e6e4829ceb9056515215dd76107e Mon Sep 17 00:00:00 2001 From: rlf Date: Sun, 3 Jul 2016 01:39:07 +0200 Subject: [PATCH] Issue #676: Allow for individual challenge to challenge requirements `requiredChallenges` --- .../ultimateskyblock/challenge/Challenge.java | 38 +++++++++++-- .../challenge/ChallengeFactory.java | 20 +++++-- .../challenge/ChallengeLogic.java | 8 ++- .../command/admin/NBTCommand.java | 13 +++-- .../ultimateskyblock/menu/SkyBlockMenu.java | 13 +---- .../ultimateskyblock/signs/SignLogic.java | 1 + uSkyBlock-Core/src/main/po/cs.po | 14 ++--- uSkyBlock-Core/src/main/po/da.po | 19 ++----- uSkyBlock-Core/src/main/po/de.po | 17 ++---- uSkyBlock-Core/src/main/po/en_GB.po | 18 ++---- uSkyBlock-Core/src/main/po/es.po | 18 ++---- uSkyBlock-Core/src/main/po/fr.po | 17 ++---- uSkyBlock-Core/src/main/po/keys.pot | 14 ++--- uSkyBlock-Core/src/main/po/ko.po | 18 ++---- uSkyBlock-Core/src/main/po/nl.po | 18 ++---- uSkyBlock-Core/src/main/po/pt_BR.po | 18 ++---- uSkyBlock-Core/src/main/po/ru.po | 18 ++---- uSkyBlock-Core/src/main/po/sv.po | 18 ++---- uSkyBlock-Core/src/main/po/vi_VN.po | 16 ++---- uSkyBlock-Core/src/main/po/xx_PIRATE.po | 32 ++++++----- uSkyBlock-Core/src/main/po/xx_lol_US.po | 32 ++++++----- uSkyBlock-Core/src/main/po/zh_CN.po | 14 ++--- .../src/main/resources/challenges.yml | 56 ++----------------- 23 files changed, 156 insertions(+), 294 deletions(-) diff --git a/uSkyBlock-Core/src/main/java/us/talabrek/ultimateskyblock/challenge/Challenge.java b/uSkyBlock-Core/src/main/java/us/talabrek/ultimateskyblock/challenge/Challenge.java index bfec98d5a..c9acbc756 100644 --- a/uSkyBlock-Core/src/main/java/us/talabrek/ultimateskyblock/challenge/Challenge.java +++ b/uSkyBlock-Core/src/main/java/us/talabrek/ultimateskyblock/challenge/Challenge.java @@ -4,19 +4,18 @@ import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.meta.ItemMeta; import us.talabrek.ultimateskyblock.handler.VaultHandler; +import us.talabrek.ultimateskyblock.player.PlayerInfo; +import us.talabrek.ultimateskyblock.uSkyBlock; import us.talabrek.ultimateskyblock.util.FormatUtil; import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collection; +import java.util.Collections; import java.util.List; -import java.util.Map; import java.util.regex.Matcher; import java.util.regex.Pattern; import static dk.lockfuglsang.minecraft.po.I18nUtil.tr; import static us.talabrek.ultimateskyblock.util.FormatUtil.*; -import static us.talabrek.ultimateskyblock.util.MetaUtil.createMap; /** * The data-object for a challenge @@ -41,6 +40,7 @@ static Type from(String s) { private final Type type; private final List requiredItems; private final List requiredEntities; + private final List requiredChallenges; private final Rank rank; private final int resetInHours; private final ItemStack displayItem; @@ -51,12 +51,13 @@ static Type from(String s) { private final Reward reward; private final Reward repeatReward; - public Challenge(String name, String displayName, String description, Type type, List requiredItems, List requiredEntities, Rank rank, int resetInHours, ItemStack displayItem, String tool, ItemStack lockedItem, boolean takeItems, int radius, Reward reward, Reward repeatReward) { + public Challenge(String name, String displayName, String description, Type type, List requiredItems, List requiredEntities, List requiredChallenges, Rank rank, int resetInHours, ItemStack displayItem, String tool, ItemStack lockedItem, boolean takeItems, int radius, Reward reward, Reward repeatReward) { this.name = name; this.displayName = displayName; this.type = type; this.requiredItems = requiredItems; this.requiredEntities = requiredEntities; + this.requiredChallenges = requiredChallenges; this.rank = rank; this.resetInHours = resetInHours; this.displayItem = displayItem; @@ -125,6 +126,10 @@ public List getRequiredEntities() { return requiredEntities; } + public List getRequiredChallenges() { + return requiredChallenges; + } + public Rank getRank() { return rank; } @@ -204,7 +209,6 @@ private List wrappedDetails(List details) { } public ItemStack getDisplayItem() { - // TODO: 10/12/2014 - R4zorax: Incorporate all the other goodies here... return new ItemStack(displayItem); // Copy } @@ -228,6 +232,28 @@ public Reward getRepeatReward() { return repeatReward; } + public List getMissingRequirements(PlayerInfo playerInfo) { + List missing = new ArrayList<>(); + for (String challengeName : requiredChallenges) { + ChallengeCompletion completion = playerInfo.getChallenge(challengeName); + if (completion != null && completion.getTimesCompleted() <= 0) { + String name = completion.getName(); + Challenge challenge = uSkyBlock.getInstance().getChallengeLogic().getChallenge(name); + if (challenge != null) { + missing.add(challenge.getDisplayName()); + } else { + missing.add(name); + } + } + } + if (missing.isEmpty()) { + return Collections.emptyList(); + } + String missingList = "" + missing; + missingList = missingList.substring(1, missingList.length()-1); + return Collections.singletonList(tr("\u00a77Requires {0}\u00a77 to unlock", missingList)); + } + @Override public String toString() { return "Challenge{" + diff --git a/uSkyBlock-Core/src/main/java/us/talabrek/ultimateskyblock/challenge/ChallengeFactory.java b/uSkyBlock-Core/src/main/java/us/talabrek/ultimateskyblock/challenge/ChallengeFactory.java index 6f1a633fa..71c89712d 100644 --- a/uSkyBlock-Core/src/main/java/us/talabrek/ultimateskyblock/challenge/ChallengeFactory.java +++ b/uSkyBlock-Core/src/main/java/us/talabrek/ultimateskyblock/challenge/ChallengeFactory.java @@ -17,6 +17,7 @@ import java.util.regex.Matcher; import java.util.regex.Pattern; +import static us.talabrek.ultimateskyblock.util.FormatUtil.normalize; import static us.talabrek.ultimateskyblock.util.ItemStackUtil.createItemStack; /** @@ -34,9 +35,9 @@ public static ChallengeDefaults createDefaults(ConfigurationSection section) { return new ChallengeDefaults( section.getInt("defaultResetInHours", 144), section.getBoolean("requiresPreviousRank", true), - section.getString("repeatableColor", "\u00a7a"), - section.getString("finishedColor", "\u00a72"), - section.getString("challengeColor", "\u00a7e"), + normalize(section.getString("repeatableColor", "&a")), + normalize(section.getString("finishedColor", "&2")), + normalize(section.getString("challengeColor", "&e")), section.getInt("rankLeeway", 1), section.getBoolean("enableEconomyPlugin", true), section.getBoolean("broadcastCompletion", true), @@ -56,13 +57,20 @@ public static Challenge createChallenge(Rank rank, ConfigurationSection section, String description = section.getString("description"); ItemStack displayItem = createItemStack( section.getString("displayItem", defaults.displayItem), - FormatUtil.normalize(displayName), description); + normalize(displayName), description); ItemStack lockedItem = section.isString("lockedDisplayItem") ? createItemStack(section.getString("lockedDisplayItem", "BARRIER"), displayName, description) : null; boolean takeItems = section.getBoolean("takeItems", true); int radius = section.getInt("radius", 10); Reward reward = createReward(section.getConfigurationSection("reward")); Reward repeatReward = createReward(section.getConfigurationSection("repeatReward")); - return new Challenge(name, displayName, description, type, requiredItems, requiredEntities, rank, resetInHours, displayItem, section.getString("tool", null), lockedItem, takeItems, radius, reward, repeatReward); + if (repeatReward == null && section.getBoolean("repeatable", false)) { + repeatReward = reward; + } + List requiredChallenges = section.getStringList("requiredChallenges"); + return new Challenge(name, displayName, description, type, + requiredItems, requiredEntities, requiredChallenges, rank, + resetInHours, displayItem, section.getString("tool", null), lockedItem, takeItems, + radius, reward, repeatReward); } private static List createEntities(List requiredEntities) { @@ -75,7 +83,7 @@ private static List createEntities(List requiredEntities) { String countStr = m.group("count"); int count = countStr != null ? Integer.parseInt(countStr, 10) : 1; EntityType entityType = EntityType.fromName(type); - Map map = meta != null ? MetaUtil.createMap(meta.substring(1)) : new HashMap(); // skip the leading ':' + Map map = meta != null ? MetaUtil.createMap(meta.substring(1)) : new HashMap(); // skip the leading ':' if (entityType != null && map != null) { entities.add(new EntityMatch(entityType, map, count)); } else { diff --git a/uSkyBlock-Core/src/main/java/us/talabrek/ultimateskyblock/challenge/ChallengeLogic.java b/uSkyBlock-Core/src/main/java/us/talabrek/ultimateskyblock/challenge/ChallengeLogic.java index 178246d31..dbbc7161c 100644 --- a/uSkyBlock-Core/src/main/java/us/talabrek/ultimateskyblock/challenge/ChallengeLogic.java +++ b/uSkyBlock-Core/src/main/java/us/talabrek/ultimateskyblock/challenge/ChallengeLogic.java @@ -473,7 +473,7 @@ public int populateChallengeRank(Inventory menu, final Rank rank, int location, meta4.setLore(lores); currentChallengeItem.setItemMeta(meta4); menu.setItem(location++, currentChallengeItem); - List missingRequirements = rank.getMissingRequirements(playerInfo); + List missingRankRequirements = rank.getMissingRequirements(playerInfo); for (Challenge challenge : rank.getChallenges()) { if ((location % 9) == 0) { location++; // Skip rank-row @@ -485,7 +485,8 @@ public int populateChallengeRank(Inventory menu, final Rank rank, int location, String challengeName = challenge.getName(); try { currentChallengeItem = getItemStack(playerInfo, challengeName); - if (!missingRequirements.isEmpty()) { + List missingReqs = challenge.getMissingRequirements(playerInfo); + if (!missingRankRequirements.isEmpty() || !missingReqs.isEmpty()) { ItemStack locked = challenge.getLockedDisplayItem(); if (locked != null) { currentChallengeItem.setType(locked.getType()); @@ -496,7 +497,8 @@ public int populateChallengeRank(Inventory menu, final Rank rank, int location, } meta4 = currentChallengeItem.getItemMeta(); meta4.setDisplayName(tr("\u00a74\u00a7lLocked Challenge")); - lores.addAll(missingRequirements); + lores.addAll(missingReqs); + lores.addAll(missingRankRequirements); meta4.setLore(lores); currentChallengeItem.setItemMeta(meta4); } diff --git a/uSkyBlock-Core/src/main/java/us/talabrek/ultimateskyblock/command/admin/NBTCommand.java b/uSkyBlock-Core/src/main/java/us/talabrek/ultimateskyblock/command/admin/NBTCommand.java index 24cd3d411..30afc0142 100644 --- a/uSkyBlock-Core/src/main/java/us/talabrek/ultimateskyblock/command/admin/NBTCommand.java +++ b/uSkyBlock-Core/src/main/java/us/talabrek/ultimateskyblock/command/admin/NBTCommand.java @@ -23,14 +23,15 @@ public NBTCommand() { @Override public boolean execute(CommandSender sender, String alias, Map data, String... args) { if (sender instanceof Player) { - Player player = (Player)sender; + Player player = (Player) sender; ItemStack itemStack = player.getInventory().getItemInMainHand(); if (itemStack != null) { - String msg = ""; - msg += tr("\u00a7eInfo for \u00a79{0}", ItemStackUtil.asString(itemStack)) + "\n"; - msg += tr("\u00a77 - name: \u00a79{0}", VaultHandler.getItemName(itemStack)) + "\n"; - msg += tr("\u00a77 - nbttag: \u00a79{0}", NBTUtil.getNBTTag(itemStack)) + "\n"; - player.sendMessage(msg.trim().split("\n")); + String[] msgs = new String[]{ + tr("\u00a7eInfo for \u00a79{0}", ItemStackUtil.asString(itemStack)), + tr("\u00a77 - name: \u00a79{0}", VaultHandler.getItemName(itemStack)), + tr("\u00a77 - nbttag: \u00a79{0}", NBTUtil.getNBTTag(itemStack)) + }; + player.sendMessage(msgs); } else { player.sendMessage(tr("\u00a7cNo item in hand!")); } diff --git a/uSkyBlock-Core/src/main/java/us/talabrek/ultimateskyblock/menu/SkyBlockMenu.java b/uSkyBlock-Core/src/main/java/us/talabrek/ultimateskyblock/menu/SkyBlockMenu.java index d41dbf0d4..1545a5d38 100644 --- a/uSkyBlock-Core/src/main/java/us/talabrek/ultimateskyblock/menu/SkyBlockMenu.java +++ b/uSkyBlock-Core/src/main/java/us/talabrek/ultimateskyblock/menu/SkyBlockMenu.java @@ -486,14 +486,6 @@ private Inventory createInitMenu(Player player) { addLore(lores, "\u00a7f", tr("Want to join another player's\nisland instead of starting\nyour own? If another player\ninvites you to their island\nyou can click here or use\n\u00a7e/island accept\u00a7f to join them.\n\u00a7e\u00a7lClick here to accept an invite!\n\u00a7e\u00a7l(You must be invited first)")); meta2.setLore(lores); menuItem.setItemMeta(meta2); - menu.setItem(menuSize-2, menuItem); - lores.clear(); - menuItem = new ItemStack(Material.SIGN, 1); - meta = menuItem.getItemMeta(); - meta.setDisplayName(tr("\u00a7a\u00a7lIsland Help")); - addLore(lores, "\u00a7f", tr("Need help with skyblock\nconcepts or commands? View\ndetails about them here.\n\u00a7e\u00a7lClick here for help!")); - meta.setLore(lores); - menuItem.setItemMeta(meta); menu.setItem(menuSize-1, menuItem); lores.clear(); return menu; @@ -753,12 +745,9 @@ private void onClickCreateMenu(InventoryClickEvent event, Player p, ItemMeta met if (slotIndex == 0) { p.closeInventory(); p.performCommand("island create"); - } else if (slotIndex == menuSize-2) { - p.closeInventory(); - p.performCommand("island accept"); } else if (slotIndex == menuSize-1) { p.closeInventory(); - p.performCommand("chestcommands open island_help"); + p.performCommand("island accept"); } else if (meta != null && meta.getDisplayName() != null) { String schemeName = stripFormatting(meta.getDisplayName()); if (plugin.getPerkLogic().getSchemes(p).contains(schemeName)) { diff --git a/uSkyBlock-Core/src/main/java/us/talabrek/ultimateskyblock/signs/SignLogic.java b/uSkyBlock-Core/src/main/java/us/talabrek/ultimateskyblock/signs/SignLogic.java index f4abab107..e577cf03a 100644 --- a/uSkyBlock-Core/src/main/java/us/talabrek/ultimateskyblock/signs/SignLogic.java +++ b/uSkyBlock-Core/src/main/java/us/talabrek/ultimateskyblock/signs/SignLogic.java @@ -164,6 +164,7 @@ private void updateSignAsync(final Location loc) { PlayerInfo playerInfo = plugin.getPlayerInfo(islandInfo.getLeaderUniqueId()); if (playerInfo != null) { isChallengeAvailable = challenge.getRank().isAvailable(playerInfo); + isChallengeAvailable &= challenge.getMissingRequirements(playerInfo).isEmpty(); } } } diff --git a/uSkyBlock-Core/src/main/po/cs.po b/uSkyBlock-Core/src/main/po/cs.po index 7bd13fdb8..71d6c0c9a 100644 --- a/uSkyBlock-Core/src/main/po/cs.po +++ b/uSkyBlock-Core/src/main/po/cs.po @@ -58,6 +58,10 @@ msgstr "§6Získáte XP: §a{0}" msgid "§dTotal times completed: §f{0}" msgstr "§dCelkově splněno: §f{0}" +#, java-format +msgid "§7Requires {0} to unlock" +msgstr "" + #, java-format msgid "§4No challenge named {0} found" msgstr "§4Nebylo nalezeno jméno úkolu {0}" @@ -1973,16 +1977,6 @@ msgid "" "§e§l(You must be invited first)" msgstr "" -msgid "§a§lIsland Help" -msgstr "§a§lPotřebuji pomoc" - -msgid "" -"Need help with skyblock\n" -"concepts or commands? View\n" -"details about them here.\n" -"§e§lClick here for help!" -msgstr "" - msgid "Island Menu" msgstr "Ostrovní menu" diff --git a/uSkyBlock-Core/src/main/po/da.po b/uSkyBlock-Core/src/main/po/da.po index bab206a8e..86e9a0bbc 100644 --- a/uSkyBlock-Core/src/main/po/da.po +++ b/uSkyBlock-Core/src/main/po/da.po @@ -58,6 +58,10 @@ msgstr "§6Erfaring: §a{0}" msgid "§dTotal times completed: §f{0}" msgstr "§dTotalt antal aflevering: §f{0}" +#, java-format +msgid "§7Requires {0} to unlock" +msgstr "" + #, java-format msgid "§4No challenge named {0} found" msgstr "§4Ingen udfordringer med navn {0} fundet!" @@ -2118,21 +2122,6 @@ msgstr "" "eller bruge §e/island accept§f for at\n" "blive medlem af deres ø." -msgid "§a§lIsland Help" -msgstr "§a§lØ Hjælp" - -msgid "" -"Need help with skyblock\n" -"concepts or commands? View\n" -"details about them here.\n" -"§e§lClick here for help!" -msgstr "" -"Har du brug for hjælp\n" -"til skyblock koncepter\n" -"eller kommandoer?\n" -"Se detaljer her.\n" -"§e§lKlik for at se hjælp." - msgid "Island Menu" msgstr "Hoved menu" diff --git a/uSkyBlock-Core/src/main/po/de.po b/uSkyBlock-Core/src/main/po/de.po index 31c1fa0a0..dc82f54bf 100644 --- a/uSkyBlock-Core/src/main/po/de.po +++ b/uSkyBlock-Core/src/main/po/de.po @@ -62,6 +62,10 @@ msgstr "§6Erfahrungsbelohnung: §a{0}" msgid "§dTotal times completed: §f{0}" msgstr "§dSchon §f{0} §dmal abgeschlossen." +#, java-format +msgid "§7Requires {0} to unlock" +msgstr "" + #, java-format msgid "§4No challenge named {0} found" msgstr "§4Keine Aufgabe namens {0} gefunden." @@ -2145,19 +2149,6 @@ msgstr "" "§e§lKlick hier um eine Einladung anzunehmen!\n" "§e§l(Du musst zuerst eingeladen werden)" -msgid "§a§lIsland Help" -msgstr "§a§lInsel Hilfe" - -msgid "" -"Need help with skyblock\n" -"concepts or commands? View\n" -"details about them here.\n" -"§e§lClick here for help!" -msgstr "" -"Brauchst Du Hilfe über Skyblock\n" -"oder Skyblock Befehle?\n" -"§e§lKlick hier für mehr Infos" - msgid "Island Menu" msgstr "Insel Menü" diff --git a/uSkyBlock-Core/src/main/po/en_GB.po b/uSkyBlock-Core/src/main/po/en_GB.po index d117a363e..2f600ed39 100644 --- a/uSkyBlock-Core/src/main/po/en_GB.po +++ b/uSkyBlock-Core/src/main/po/en_GB.po @@ -58,6 +58,10 @@ msgstr "§6Exp Reward: §a{0}" msgid "§dTotal times completed: §f{0}" msgstr "§dTotal times completed: §f{0}" +#, java-format +msgid "§7Requires {0} to unlock" +msgstr "" + #, java-format msgid "§4No challenge named {0} found" msgstr "§4* §7No challenge named §4{0} §7found" @@ -2143,20 +2147,6 @@ msgstr "" "§e§lClick here to accept an invite!\n" "§e§l(You must be invited first)" -msgid "§a§lIsland Help" -msgstr "§a§lIsland Help" - -msgid "" -"Need help with skyblock\n" -"concepts or commands? View\n" -"details about them here.\n" -"§e§lClick here for help!" -msgstr "" -"Need help with skyblock\n" -"concepts or commands? View\n" -"details about them here.\n" -"§e§lClick here for help!" - msgid "Island Menu" msgstr "Island Menu" diff --git a/uSkyBlock-Core/src/main/po/es.po b/uSkyBlock-Core/src/main/po/es.po index 41d9f3286..44c9ec05f 100644 --- a/uSkyBlock-Core/src/main/po/es.po +++ b/uSkyBlock-Core/src/main/po/es.po @@ -59,6 +59,10 @@ msgstr "§6Recompensa de XP: §a{0}" msgid "§dTotal times completed: §f{0}" msgstr "§dCantidad de veces completado: §f{0}" +#, java-format +msgid "§7Requires {0} to unlock" +msgstr "" + #, java-format msgid "§4No challenge named {0} found" msgstr "§4¡Ningún reto llamado {0} fue encontrado!" @@ -2144,20 +2148,6 @@ msgstr "" "§e§l¡Click aquí para aceptar una invitación!\n" "§e§o(Tienes que ser invitado primero)" -msgid "§a§lIsland Help" -msgstr "§a§lAyuda de la Isla" - -msgid "" -"Need help with skyblock\n" -"concepts or commands? View\n" -"details about them here.\n" -"§e§lClick here for help!" -msgstr "" -"Necesitas ayuda con comandos\n" -"o conceptos de skyblock? Mira\n" -"detalles sobre ellos aquí.\n" -"§e§l¡Click aquí para ayuda!" - msgid "Island Menu" msgstr "Menú de Isla" diff --git a/uSkyBlock-Core/src/main/po/fr.po b/uSkyBlock-Core/src/main/po/fr.po index 94e2041e6..aa292e9d5 100644 --- a/uSkyBlock-Core/src/main/po/fr.po +++ b/uSkyBlock-Core/src/main/po/fr.po @@ -57,6 +57,10 @@ msgstr "§6Expérience reçu : §a{0}" msgid "§dTotal times completed: §f{0}" msgstr "§dComplétés : §f{0} fois" +#, java-format +msgid "§7Requires {0} to unlock" +msgstr "" + #, java-format msgid "§4No challenge named {0} found" msgstr "§4Aucun défi nommé {0} trouvé" @@ -2109,19 +2113,6 @@ msgstr "" "§e§lClique ici pour accepter l'invitation !\n" "§e§l(Vous devez d'abord être invité)" -msgid "§a§lIsland Help" -msgstr "§a§lIle - Aide" - -msgid "" -"Need help with skyblock\n" -"concepts or commands? View\n" -"details about them here.\n" -"§e§lClick here for help!" -msgstr "" -"Besoin d'aide avec le skyblock\n" -"ou avec les commandes ?\n" -"§e§lClique ici pour avoir de l'aide !" - msgid "Island Menu" msgstr "Menu de l'île" diff --git a/uSkyBlock-Core/src/main/po/keys.pot b/uSkyBlock-Core/src/main/po/keys.pot index 79d77d325..c08997b07 100644 --- a/uSkyBlock-Core/src/main/po/keys.pot +++ b/uSkyBlock-Core/src/main/po/keys.pot @@ -57,6 +57,10 @@ msgstr "" msgid "§dTotal times completed: §f{0}" msgstr "" +#, java-format +msgid "§7Requires {0} to unlock" +msgstr "" + #, java-format msgid "§4No challenge named {0} found" msgstr "" @@ -1967,16 +1971,6 @@ msgid "" "§e§l(You must be invited first)" msgstr "" -msgid "§a§lIsland Help" -msgstr "" - -msgid "" -"Need help with skyblock\n" -"concepts or commands? View\n" -"details about them here.\n" -"§e§lClick here for help!" -msgstr "" - msgid "Island Menu" msgstr "" diff --git a/uSkyBlock-Core/src/main/po/ko.po b/uSkyBlock-Core/src/main/po/ko.po index 4dc269e2e..bfea9d1b6 100644 --- a/uSkyBlock-Core/src/main/po/ko.po +++ b/uSkyBlock-Core/src/main/po/ko.po @@ -57,6 +57,10 @@ msgstr "§6경험치 보상: §a{0}" msgid "§dTotal times completed: §f{0}" msgstr "§d완료된 전체 횟수: §f{0}" +#, java-format +msgid "§7Requires {0} to unlock" +msgstr "" + #, java-format msgid "§4No challenge named {0} found" msgstr "§4{0}란 이름의 도전과제를 찾지 못했습니다" @@ -2126,20 +2130,6 @@ msgstr "" "§e§l초대를 승낙하려면 여기를 누르세요\n" "§e§l(당신은 먼저 초대받아야 합니다)" -msgid "§a§lIsland Help" -msgstr "§a§l섬 도움" - -msgid "" -"Need help with skyblock\n" -"concepts or commands? View\n" -"details about them here.\n" -"§e§lClick here for help!" -msgstr "" -"skyblock의 컨셉과 커맨드에 대해\n" -"도움이 필요하세요? 여기서\n" -"그것들에 대한 디테일을 보세요\n" -"§e§l도움이 필요하면 여기를 누르세요!" - msgid "Island Menu" msgstr "섬 메뉴 (Protocodyne PTK팀 번역)" diff --git a/uSkyBlock-Core/src/main/po/nl.po b/uSkyBlock-Core/src/main/po/nl.po index 7b29bdf5d..66d5be5b1 100644 --- a/uSkyBlock-Core/src/main/po/nl.po +++ b/uSkyBlock-Core/src/main/po/nl.po @@ -58,6 +58,10 @@ msgstr "§6Exp belonging: §a{0}" msgid "§dTotal times completed: §f{0}" msgstr "§dHet aantal keer dat je de uitdaging hebt voltooid: §f{0}" +#, java-format +msgid "§7Requires {0} to unlock" +msgstr "" + #, java-format msgid "§4No challenge named {0} found" msgstr "§4De uitdaging met de naam {0} kan niet worden gevonden!" @@ -2152,20 +2156,6 @@ msgstr "" "§e§lKlik hier om een uitnodiging te accepteren!\n" "§e§l(je moet wel eerst uitgenodigd zijn dan)" -msgid "§a§lIsland Help" -msgstr "§a§lEiland Help" - -msgid "" -"Need help with skyblock\n" -"concepts or commands? View\n" -"details about them here.\n" -"§e§lClick here for help!" -msgstr "" -"Help nodig met skyblock\n" -"concept of commando's?\n" -"Bekijk details over hen hier.\n" -"§e§lKlik hier voor hulp!" - msgid "Island Menu" msgstr "Eiland Menu" diff --git a/uSkyBlock-Core/src/main/po/pt_BR.po b/uSkyBlock-Core/src/main/po/pt_BR.po index 71dcba96b..7f0966baa 100644 --- a/uSkyBlock-Core/src/main/po/pt_BR.po +++ b/uSkyBlock-Core/src/main/po/pt_BR.po @@ -57,6 +57,10 @@ msgstr "§6Prêmio em XP: §a{0}" msgid "§dTotal times completed: §f{0}" msgstr "§dTotal de vezes completado: §f{0}" +#, java-format +msgid "§7Requires {0} to unlock" +msgstr "" + #, java-format msgid "§4No challenge named {0} found" msgstr "§4Nenhum desafio com o nome {0} foi encontrado!" @@ -2127,20 +2131,6 @@ msgstr "" "§e§lClique para aceitar um convite!\n" "§e§l(Precisa ser convidado antes)" -msgid "§a§lIsland Help" -msgstr "§a§lDúvidas" - -msgid "" -"Need help with skyblock\n" -"concepts or commands? View\n" -"details about them here.\n" -"§e§lClick here for help!" -msgstr "" -"Precisa de ajuda com o skyblock?\n" -"Não sabe oque fazer?\n" -"Nós podemos te ajudar.\n" -"§e§lClique para ver um tutorial!" - msgid "Island Menu" msgstr "Menu da ilha" diff --git a/uSkyBlock-Core/src/main/po/ru.po b/uSkyBlock-Core/src/main/po/ru.po index cd5598950..7bebef422 100644 --- a/uSkyBlock-Core/src/main/po/ru.po +++ b/uSkyBlock-Core/src/main/po/ru.po @@ -59,6 +59,10 @@ msgstr "§6Награда опыт: §a{0}" msgid "§dTotal times completed: §f{0}" msgstr "§dПолное время выполнения: §f{0}" +#, java-format +msgid "§7Requires {0} to unlock" +msgstr "" + #, java-format msgid "§4No challenge named {0} found" msgstr "§4Не найдено задание {0}" @@ -2114,20 +2118,6 @@ msgstr "" "§e§lНажмите, чтобы принять приглашение!\n" "§e§l(Вас должны сначала пригласить)" -msgid "§a§lIsland Help" -msgstr "§a§lПомощь" - -msgid "" -"Need help with skyblock\n" -"concepts or commands? View\n" -"details about them here.\n" -"§e§lClick here for help!" -msgstr "" -"Нужна помощь по\n" -"концепции или командам? Смотрите\n" -"подробнее об этом здесь.\n" -"§e§lНажмите для помощи!" - msgid "Island Menu" msgstr "Меню острова" diff --git a/uSkyBlock-Core/src/main/po/sv.po b/uSkyBlock-Core/src/main/po/sv.po index aef3239b1..d12d65a49 100644 --- a/uSkyBlock-Core/src/main/po/sv.po +++ b/uSkyBlock-Core/src/main/po/sv.po @@ -62,6 +62,10 @@ msgstr "§6Belöning (exp): §a{0}" msgid "§dTotal times completed: §f{0}" msgstr "§dAntal gånger genomfört: §f{0}" +#, java-format +msgid "§7Requires {0} to unlock" +msgstr "" + #, java-format msgid "§4No challenge named {0} found" msgstr "§cInget uppdrag kallat {0} hittades" @@ -2117,20 +2121,6 @@ msgstr "" "§e§lKlicka här för att tacka ja!\n" "§e§l(Du måste bli inbjuden först)" -msgid "§a§lIsland Help" -msgstr "§a§lSkyblock hjälp" - -msgid "" -"Need help with skyblock\n" -"concepts or commands? View\n" -"details about them here.\n" -"§e§lClick here for help!" -msgstr "" -"Behöver du hjälp med Skyblock\n" -"koncept eller kommandon? Visa\n" -"detaljer om dem här.\n" -"§e§lKlicka här för hjälp!" - msgid "Island Menu" msgstr "Skyblockmeny" diff --git a/uSkyBlock-Core/src/main/po/vi_VN.po b/uSkyBlock-Core/src/main/po/vi_VN.po index ad752cdc5..8a3a36e82 100644 --- a/uSkyBlock-Core/src/main/po/vi_VN.po +++ b/uSkyBlock-Core/src/main/po/vi_VN.po @@ -57,6 +57,10 @@ msgstr "§6Kinh nghiệm được thưởng: §a{0}" msgid "§dTotal times completed: §f{0}" msgstr "§dTổng số lần hoàn thành: §f{0}" +#, java-format +msgid "§7Requires {0} to unlock" +msgstr "" + #, java-format msgid "§4No challenge named {0} found" msgstr "§4Không tìm thấy nhiệm vụ {0} " @@ -2070,18 +2074,6 @@ msgstr "" "hoặc dùng §e/island accept§f để đồng ý.\n" "§e§lNhấp để mời hoặc đồng ý lời mời!" -msgid "§a§lIsland Help" -msgstr "§a§lTrợ giúp" - -msgid "" -"Need help with skyblock\n" -"concepts or commands? View\n" -"details about them here.\n" -"§e§lClick here for help!" -msgstr "" -"Cần trợ giúp về đảo bay?\n" -"§e§lNhấp vào đây!" - msgid "Island Menu" msgstr "Đảo" diff --git a/uSkyBlock-Core/src/main/po/xx_PIRATE.po b/uSkyBlock-Core/src/main/po/xx_PIRATE.po index f1bf5e163..a204284ab 100644 --- a/uSkyBlock-Core/src/main/po/xx_PIRATE.po +++ b/uSkyBlock-Core/src/main/po/xx_PIRATE.po @@ -57,6 +57,10 @@ msgstr "§6Exp Bounty: §a{0}" msgid "§dTotal times completed: §f{0}" msgstr "§dTotal times completed: §f{0}" +#, java-format +msgid "§7Requires {0} to unlock" +msgstr "" + #, java-format msgid "§4No challenge named {0} found" msgstr "§4Nay challenge named {0} found" @@ -2121,20 +2125,6 @@ msgstr "" "§e§lClick here to accept an invite!\n" "§e§l(Ye must be invited first)" -msgid "§a§lIsland Help" -msgstr "§a§lIsland Help" - -msgid "" -"Need help with skyblock\n" -"concepts or commands? View\n" -"details about them here.\n" -"§e§lClick here for help!" -msgstr "" -"Need help with skyblock\n" -"concepts or commands? View\n" -"details about 'em here.\n" -"§e§lClick here for help!" - msgid "Island Menu" msgstr "Island Menu" @@ -2535,6 +2525,20 @@ msgstr "s" msgid "{0,number,0}:{1,number,00}.{2,number,000}" msgstr "{0,number,0}:{1,number,00}.{2,number,000}" +#~ msgid "§a§lIsland Help" +#~ msgstr "§a§lIsland Help" + +#~ msgid "" +#~ "Need help with skyblock\n" +#~ "concepts or commands? View\n" +#~ "details about them here.\n" +#~ "§e§lClick here for help!" +#~ msgstr "" +#~ "Need help with skyblock\n" +#~ "concepts or commands? View\n" +#~ "details about 'em here.\n" +#~ "§e§lClick here for help!" + #~ msgid "§eConverted {0}/{1} files" #~ msgstr "§eConverted {0}/{1} files" diff --git a/uSkyBlock-Core/src/main/po/xx_lol_US.po b/uSkyBlock-Core/src/main/po/xx_lol_US.po index 3b8466f5d..00a955aa1 100644 --- a/uSkyBlock-Core/src/main/po/xx_lol_US.po +++ b/uSkyBlock-Core/src/main/po/xx_lol_US.po @@ -57,6 +57,10 @@ msgstr "§6Exp Kitteh treet: §a{0}" msgid "§dTotal times completed: §f{0}" msgstr "§dTotal times completed: §f{0}" +#, java-format +msgid "§7Requires {0} to unlock" +msgstr "" + #, java-format msgid "§4No challenge named {0} found" msgstr "§4Noe challenge named {0} found" @@ -2126,20 +2130,6 @@ msgstr "" "§e§lClick here to accept an invite!\n" "§e§l(You must be invited first)" -msgid "§a§lIsland Help" -msgstr "§a§lIsland Help" - -msgid "" -"Need help with skyblock\n" -"concepts or commands? View\n" -"details about them here.\n" -"§e§lClick here for help!" -msgstr "" -"Need help with skyblock\n" -"concepts or commands? View\n" -"details about 'dem here.\n" -"§e§lClick here for help!" - msgid "Island Menu" msgstr "Island Menu" @@ -2541,6 +2531,20 @@ msgstr "s" msgid "{0,number,0}:{1,number,00}.{2,number,000}" msgstr "{0,number,0}:{1,number,00}.{2,number,000}" +#~ msgid "§a§lIsland Help" +#~ msgstr "§a§lIsland Help" + +#~ msgid "" +#~ "Need help with skyblock\n" +#~ "concepts or commands? View\n" +#~ "details about them here.\n" +#~ "§e§lClick here for help!" +#~ msgstr "" +#~ "Need help with skyblock\n" +#~ "concepts or commands? View\n" +#~ "details about 'dem here.\n" +#~ "§e§lClick here for help!" + #~ msgid "§eConverted {0}/{1} files" #~ msgstr "§eConverted {0}/{1} files" diff --git a/uSkyBlock-Core/src/main/po/zh_CN.po b/uSkyBlock-Core/src/main/po/zh_CN.po index bb5a58b6e..0d5677900 100644 --- a/uSkyBlock-Core/src/main/po/zh_CN.po +++ b/uSkyBlock-Core/src/main/po/zh_CN.po @@ -56,6 +56,10 @@ msgstr "§6经验奖励: §a{0}" msgid "§dTotal times completed: §f{0}" msgstr "§d总完成次数: §f{0}" +#, java-format +msgid "§7Requires {0} to unlock" +msgstr "" + #, java-format msgid "§4No challenge named {0} found" msgstr "" @@ -1995,16 +1999,6 @@ msgid "" "§e§l(You must be invited first)" msgstr "" -msgid "§a§lIsland Help" -msgstr "§a岛屿帮助" - -msgid "" -"Need help with skyblock\n" -"concepts or commands? View\n" -"details about them here.\n" -"§e§lClick here for help!" -msgstr "" - msgid "Island Menu" msgstr "" diff --git a/uSkyBlock-Core/src/main/resources/challenges.yml b/uSkyBlock-Core/src/main/resources/challenges.yml index 844b3c3a8..1651d7921 100644 --- a/uSkyBlock-Core/src/main/resources/challenges.yml +++ b/uSkyBlock-Core/src/main/resources/challenges.yml @@ -8,7 +8,7 @@ challengeSharing: island broadcastCompletion: true # [text] The color/formatting of the broadcast text when showing first time completions. -broadcastText: §6 +broadcastText: '&6' # [true/false] If true, challenges in higher level ranks require challenges in lower level ranks to be completed. requirePreviousRank: true @@ -22,13 +22,13 @@ rankLeeway: 1 defaultResetInHours: 20 #[color code] The color to use for uncompleted challenges in the list. -challengeColor: §e +challengeColor: '&e' #[color code] The color to use for completed challenges in the list. (non-repeatable) -finishedColor: §2 +finishedColor: '&2' #[color code] The color to use for completed challenges in the list. (repeatable) -repeatableColor: §a +repeatableColor: '&a' #[true/false] If true, enables vault to handle currency rewards. enableEconomyPlugin: true @@ -59,7 +59,6 @@ ranks: description: Mine from a cobblestone generator. type: onPlayer requiredItems: '4:64;+2' - repeatable: true displayItem: 1 resetInHours: 12 takeItems: true @@ -86,7 +85,6 @@ ranks: description: Reach island level 20. type: islandLevel requiredItems: '20' - repeatable: false displayItem: 16 takeItems: false takeItems: false @@ -107,7 +105,6 @@ ranks: description: Reach island level 100. type: islandLevel requiredItems: '100' - repeatable: false displayItem: 15 takeItems: false reward: @@ -124,7 +121,6 @@ ranks: description: Reach island level 250. type: islandLevel requiredItems: '250' - repeatable: true displayItem: 14 takeItems: true reward: @@ -142,7 +138,6 @@ ranks: description: Reach island level 500. type: islandLevel requiredItems: '500' - repeatable: true displayItem: 56 takeItems: true reward: @@ -160,7 +155,6 @@ ranks: description: Reach island level 1000. type: islandLevel requiredItems: '1000' - repeatable: true displayItem: 129 takeItems: true reward: @@ -190,7 +184,6 @@ ranks: description: Collect apples from trees. type: onPlayer requiredItems: '260:2;+1' - repeatable: true displayItem: 260 resetInHours: 6 takeItems: true @@ -225,7 +218,6 @@ ranks: description: Harvest cacti from a farm. type: onPlayer requiredItems: '81:64;+16' - repeatable: true displayItem: 81 takeItems: true reward: @@ -250,7 +242,6 @@ ranks: description: Harvest pumpkins from a farm. type: onPlayer requiredItems: '86:64;+4' - repeatable: true displayItem: 86 takeItems: true reward: @@ -274,7 +265,6 @@ ranks: description: Harvest sugarcane from a farm. type: onPlayer requiredItems: '338:64;+16' - repeatable: true displayItem: 338 takeItems: true reward: @@ -298,7 +288,6 @@ ranks: description: Collect red and brown mushrooms. type: onPlayer requiredItems: '39:64;+4 40:64;+4' - repeatable: true displayItem: 40 takeItems: true reward: @@ -323,9 +312,7 @@ ranks: description: Harvest wheat from a farm. type: onPlayer requiredItems: '296:64;+16' - repeatable: true displayItem: 296 - repeatable: true takeItems: true reward: text: 8 dirt @@ -347,7 +334,6 @@ ranks: description: Harvest slices of melon from a farm. type: onPlayer requiredItems: '360:128;+8' - repeatable: true displayItem: 360 takeItems: true reward: @@ -380,7 +366,6 @@ ranks: description: Collect all types of wood logs. type: onPlayer requiredItems: '17:0:16;+2 17:1:16;+2 17:2:16;+2 17:3:16;+2 162:0:16;+2 162:1:16;+2' - repeatable: true displayItem: 17 takeItems: true reward: @@ -406,7 +391,6 @@ ranks: description: Make 128 torches. type: onPlayer requiredItems: '50:128;+32' - repeatable: true displayItem: 50 takeItems: true reward: @@ -432,7 +416,6 @@ ranks: description: Make all stone tools type: onPlayer requiredItems: '273:1 274:1 275:1 291:1' - repeatable: false displayItem: 275 takeItems: true reward: @@ -451,7 +434,6 @@ ranks: description: Collect all types of wood items. type: onPlayer requiredItems: '136:16;+8 427:1;+1 186:2;+2 192:30;+15 65:30;+15 96:4;+2 72:2;+1' - repeatable: true displayItem: 58 takeItems: true reward: @@ -477,7 +459,6 @@ ranks: description: Make 64 Stone Bricks. type: onPlayer requiredItems: '98:64;+8 44:5:30;+6 98:3:30;+6 109:16;+4' - repeatable: true displayItem: 98 takeItems: true reward: @@ -503,7 +484,6 @@ ranks: description: Build a mob farm and collect mob loot. type: onPlayer requiredItems: '367:64;+4 287:32;+2 262:32;+2 352:32;+2 289:16;+1 375:5' - repeatable: true displayItem: 367 takeItems: true reward: @@ -556,7 +536,6 @@ ranks: description: Build a nether portal on your island. type: onIsland requiredItems: '49:10 90:1' - repeatable: false displayItem: 49 takeItems: false reward: @@ -573,7 +552,6 @@ ranks: description: Mine from your Nether island. type: onPlayer requiredItems: '87:64;+2 88:16;+2 13:32;+2 406:32;+2' - repeatable: true displayItem: 87 takeItems: true reward: @@ -598,7 +576,6 @@ ranks: type: onIsland radius: 50 requiredItems: '112:512 44:6:64 113:64 114:64' - repeatable: false displayItem: 113 takeItems: true reward: @@ -615,7 +592,6 @@ ranks: description: Collect some Wither Skeleton skulls. type: onPlayer requiredItems: '397:1:10;+1' - repeatable: true displayItem: '397:1' takeItems: true reward: @@ -648,7 +624,6 @@ ranks: description: Catch different types of fish. type: onPlayer requiredItems: '349:0:5;+1 349:1:5;+1 349:3:3;+1 349:2:1;+1' - repeatable: true displayItem: 349 takeItems: true reward: @@ -672,7 +647,6 @@ ranks: description: Harvest potato's from a farm. type: onPlayer requiredItems: '392:64;+16' - repeatable: true displayItem: 392 takeItems: true reward: @@ -696,7 +670,6 @@ ranks: description: Harvest carrot's from a farm. type: onPlayer requiredItems: '391:64;+16' - repeatable: true displayItem: 391 takeItems: true reward: @@ -720,7 +693,6 @@ ranks: description: Harvest many different farming resources. type: onPlayer requiredItems: '360:256;+2 353:128;+2 296:128;+2 392:128;+2 391:128;+2 86:128;+2 81:128;+2' - repeatable: true displayItem: 292 takeItems: true reward: @@ -744,7 +716,6 @@ ranks: description: Get hay bales for the horses. type: onPlayer requiredItems: '170:32;+4 420:8;+2 398:1 359:1' - repeatable: true displayItem: 170 takeItems: true reward: @@ -790,7 +761,6 @@ ranks: - Sheep:{"Color":13} - Sheep:{"Color":14} - Sheep:{"Color":15} - repeatable: true displayItem: '85' takeItems: false reward: @@ -827,7 +797,6 @@ ranks: description: Create the famous English Fish & Chips. type: onPlayer requiredItems: '350:32;+8 393:32;+8' - repeatable: true displayItem: 350 takeItems: true reward: @@ -855,7 +824,6 @@ ranks: description: Create the famous Danish smørrebrød. type: onPlayer requiredItems: '297:16;+4 350:1:8;+4 349:2:2;+1 320:8;+4 364:8;+4' - repeatable: true displayItem: '350:1' takeItems: true reward: @@ -882,7 +850,6 @@ ranks: description: Create the famous Dutch hutspot. type: onPlayer requiredItems: '392:64;+8 391:64;+8' - repeatable: true displayItem: 396 takeItems: true reward: @@ -910,7 +877,6 @@ ranks: description: Create the famous German apfelstrudel. type: onPlayer requiredItems: '260:8;+5 296:16;+5 353:16;+5 335:1' - repeatable: true displayItem: 322 takeItems: true reward: @@ -939,7 +905,6 @@ ranks: description: Create the famous American brownies. type: onPlayer requiredItems: '296:16;+5 353:16;+5 344:16;+5 351:3:16;+5 335:1' - repeatable: true displayItem: '126:5' takeItems: true reward: @@ -968,7 +933,6 @@ ranks: description: Create the famous Italian Pasta Funghi. type: onPlayer requiredItems: '296:32;+8 344:32;+8 39:16;+4 40:16;+4 335:1' - repeatable: true displayItem: 100 takeItems: true reward: @@ -996,7 +960,6 @@ ranks: description: Create the famous belgian chocolate. type: onPlayer requiredItems: '353:16;+5 351:3:16;+5 335:1' - repeatable: true displayItem: '383:120' takeItems: true reward: @@ -1037,7 +1000,6 @@ ranks: description: Collect enderpearls from endermen. type: onPlayer requiredItems: '368:10;+4' - repeatable: true displayItem: 368 takeItems: true reward: @@ -1062,7 +1024,6 @@ ranks: description: Collect slimeballs from slimes. type: onPlayer requiredItems: '341:64;+4' - repeatable: true displayItem: 341 takeItems: true reward: @@ -1086,7 +1047,6 @@ ranks: description: Collect some of every type of redstone equipment. type: onPlayer requiredItems: '331:64;+16 76:32;+4 356:5;+1 404:3;+1 33:2;+1 29:2;+1 69:1;+1 77:1;+1 70:1;+1 154:1;+1 23:1;+1 158:1;+1 151:1;+1' - repeatable: true displayItem: 331 takeItems: true reward: @@ -1112,7 +1072,6 @@ ranks: description: Collect every color of wool. type: onPlayer requiredItems: '35:0:8;+1 35:1:8;+1 35:2:8;+1 35:3:8;+1 35:4:8;+1 35:5:8;+1 35:6:8;+1 35:7:8;+1 35:8:8;+1 35:9:8;+1 35:10:8;+1 35:11:8;+1 35:12:8;+1 35:13:8;+1 35:14:8;+1 35:15:8;+1' - repeatable: true displayItem: 35 takeItems: true reward: @@ -1141,7 +1100,6 @@ ranks: description: Collect every color of stained glass panes. type: onPlayer requiredItems: '160:0:16;+2 160:1:16;+2 160:2:16;+2 160:3:16;+2 160:4:16;+2 160:5:16;+2 160:6:16;+2 160:7:16;+2 160:8:16;+2 160:9:16;+2 160:10:16;+2 160:11:16;+2 160:12:16;+2 160:13:16;+2 160:14:16;+2 160:15:16;+2' - repeatable: true displayItem: 160 takeItems: true reward: @@ -1168,7 +1126,6 @@ ranks: description: Make a jukebox and collect all music discs. type: onPlayer requiredItems: '2256:1 2257:1 2258:1 2259:1 2260:1 2261:1 2262:1 2263:1 2264:1 2265:1 2266:1 2267:1 84:1' - repeatable: true displayItem: 84 takeItems: true reward: @@ -1193,7 +1150,6 @@ ranks: description: Collect emeralds. type: onPlayer requiredItems: '388:60;+10' - repeatable: false displayItem: 388 takeItems: true reward: @@ -1232,7 +1188,6 @@ ranks: description: Collect every kind of edible food. type: onPlayer requiredItems: '393:1 297:1 354:1 366:1 350:0:1 350:1:1 349:2:1 320:1 357:1 322:0:1 396:1 282:1 400:1 364:1 360:1 391:1' - repeatable: true displayItem: 391 takeItems: true reward: @@ -1256,7 +1211,6 @@ ranks: description: Make cookies and a bucket of milk. type: onPlayer requiredItems: '357:128;+4 335:1' - repeatable: true displayItem: 357 takeItems: true reward: @@ -1280,7 +1234,6 @@ ranks: description: Bake cakes, pumpkin pies, and cookies. type: onPlayer requiredItems: '354:5;+1 400:5;+1 357:128;+4' - repeatable: true displayItem: 354 takeItems: true reward: @@ -1342,7 +1295,6 @@ ranks: # # [itemid list] The itemid:count of the items required for the challenge. # requiredItems: '' # # [true/false] If the challenge can repeated or not. -# repeatable: true # # [itemid] The itemid of the item to be displayed in the challenge menu for complete challenges. # displayItem: ## tool: