From 98a0dec1229c9d362b9241d8231ad4cfd94537b7 Mon Sep 17 00:00:00 2001 From: okx-code Date: Tue, 22 Jun 2021 02:59:47 +0100 Subject: [PATCH] 3.12.1 - add /pru playtime add - add dutch locale - add quotient option for requirements --- build.gradle | 2 +- src/main/java/sh/okx/rankup/RankupPlugin.java | 1 + .../sh/okx/rankup/commands/InfoCommand.java | 50 +++++++- .../messages/pebble/RequirementContext.java | 6 +- .../rankup/placeholders/RankupExpansion.java | 1 - .../requirement/PlaceholderRequirement.java | 20 +-- .../okx/rankup/text/LegacyTextProcessor.java | 4 +- src/main/resources/locale/nl.yml | 119 ++++++++++++++++++ .../rankup/legacy/LegacyPlaceholderTest.java | 1 + .../messages/RankupPlaceholderTest.java | 25 +++- src/test/resources/placeholder/rankups.yml | 7 ++ 11 files changed, 219 insertions(+), 17 deletions(-) create mode 100644 src/main/resources/locale/nl.yml create mode 100644 src/test/resources/placeholder/rankups.yml diff --git a/build.gradle b/build.gradle index fe34596..944af8e 100644 --- a/build.gradle +++ b/build.gradle @@ -5,7 +5,7 @@ plugins { } group 'sh.okx' -version '3.12' +version '3.12.1' java { sourceCompatibility = JavaVersion.VERSION_1_8 diff --git a/src/main/java/sh/okx/rankup/RankupPlugin.java b/src/main/java/sh/okx/rankup/RankupPlugin.java index 46f2f62..c413c48 100644 --- a/src/main/java/sh/okx/rankup/RankupPlugin.java +++ b/src/main/java/sh/okx/rankup/RankupPlugin.java @@ -335,6 +335,7 @@ public class RankupPlugin extends JavaPlugin { saveLocale("fr"); saveLocale("it"); saveLocale("es"); + saveLocale("nl"); } private void saveLocale(String locale) { diff --git a/src/main/java/sh/okx/rankup/commands/InfoCommand.java b/src/main/java/sh/okx/rankup/commands/InfoCommand.java index 0e7d3b2..af9816f 100644 --- a/src/main/java/sh/okx/rankup/commands/InfoCommand.java +++ b/src/main/java/sh/okx/rankup/commands/InfoCommand.java @@ -264,6 +264,39 @@ public class InfoCommand implements TabExecutor { player.setStatistic(playOneTick, minutes * 20 * 60); player.sendMessage(ChatColor.LIGHT_PURPLE + "Updated playtime for " + player.getName() + " to " + minutes + " minutes"); return true; + } else if (args[1].equalsIgnoreCase("add") && sender.hasPermission("rankup.playtime.set")) { + if (args.length < 4) { + sender.sendMessage(ChatColor.GREEN + "/" + label + " " + args[0] + " add " + ChatColor.YELLOW + " Increase the playtime statistic for a player"); + return true; + } + + Player player = Bukkit.getPlayer(args[2]); + if (player == null) { + sender.sendMessage(ChatColor.GRAY + "Player not found"); + return true; + } + + int minutes; + try { + minutes = Integer.parseInt(args[3]); + } catch (NumberFormatException e) { + sender.sendMessage(ChatColor.GRAY + "Invalid number: " + args[3]); + return true; + } + + int oldMinutes = player.getStatistic(playOneTick) / 20 / 60; + if (minutes > 0) { + player.incrementStatistic(playOneTick, minutes * 20 * 60); + } else if (minutes < 0) { + if (oldMinutes + minutes < 0) { + player.sendMessage(ChatColor.GRAY + "Playtime cannot be negative"); + return true; + } + player.decrementStatistic(playOneTick, -minutes * 20 * 60); + } + int newMinutes = oldMinutes + minutes; + player.sendMessage(ChatColor.LIGHT_PURPLE + "Increased playtime for " + player.getName() + " to " + oldMinutes + (minutes >= 0 ? "+" : "") + minutes + "=" + newMinutes + " minutes"); + return true; } } if (sender.hasPermission("rankup.playtime.get")) { @@ -275,13 +308,14 @@ public class InfoCommand implements TabExecutor { sender.sendMessage( ChatColor.GREEN + "/" + label + " " + args[0] + " set " + ChatColor.YELLOW + " Update the playtime statistic for a player"); + sender.sendMessage( + ChatColor.GREEN + "/" + label + " " + args[0] + " add " + + ChatColor.YELLOW + " Increase the playtime statistic for a player"); } return true; } } - // Set playtime & get playtime for other players? - PluginDescriptionFile description = plugin.getDescription(); String version = description.getVersion(); sender.sendMessage( @@ -322,7 +356,7 @@ public class InfoCommand implements TabExecutor { list.add("forceprestige"); list.add("rankdown"); } - if (sender.hasPermission("rankup.playtime")) { + if (sender.hasPermission("rankup.playtime.get") || sender.hasPermission("rankup.playtime.set")) { list.add("playtime"); } return StringUtil.copyPartialMatches(args[0], list, new ArrayList<>()); @@ -333,6 +367,16 @@ public class InfoCommand implements TabExecutor { return StringUtil.copyPartialMatches(args[1], players(), new ArrayList<>()); } else if (args[0].equalsIgnoreCase("rankdown") && sender.hasPermission("rankup.force")) { return StringUtil.copyPartialMatches(args[1], players(), new ArrayList<>()); + } else if (args[0].equalsIgnoreCase("playtime")) { + List options = new ArrayList<>(); + if (sender.hasPermission("rankup.playtime.get")) { + options.add("get"); + } + if (sender.hasPermission("rankup.playtime.set")) { + options.add("set"); + options.add("add"); + } + return StringUtil.copyPartialMatches(args[1], options, new ArrayList<>()); } } return Collections.emptyList(); diff --git a/src/main/java/sh/okx/rankup/messages/pebble/RequirementContext.java b/src/main/java/sh/okx/rankup/messages/pebble/RequirementContext.java index 4979903..edcf1b3 100644 --- a/src/main/java/sh/okx/rankup/messages/pebble/RequirementContext.java +++ b/src/main/java/sh/okx/rankup/messages/pebble/RequirementContext.java @@ -33,10 +33,14 @@ public class RequirementContext { return requirement.getName(); } - public double getPercent() { + public double getQuotient() { return getProgress() / getTotal(); } + public double getPercent() { + return getProgress() / getTotal() * 100; + } + public String toString() { return "Requirement[" + requirement.getFullName() + "]"; } diff --git a/src/main/java/sh/okx/rankup/placeholders/RankupExpansion.java b/src/main/java/sh/okx/rankup/placeholders/RankupExpansion.java index 777658c..40d1268 100644 --- a/src/main/java/sh/okx/rankup/placeholders/RankupExpansion.java +++ b/src/main/java/sh/okx/rankup/placeholders/RankupExpansion.java @@ -49,7 +49,6 @@ public class RankupExpansion implements Expansion { String[] parts = params.split("_", 5); return getPlaceholderRequirement(player, rankups.getRankByName(parts[2]), replacePattern(parts[3]), parts.length > 4 ? parts[4] : ""); -// return placeholders.getSimpleFormat().format(orElse(rankups.getByName(parts[2]).getRequirement(parts[3]), Requirement::getValueDouble, 0)); } else if (params.startsWith("rank_money_")) { String[] parts = params.split("_", 4); double amount = Objects.requireNonNull(rankups.getRankByName(parts[2]), "Rankup " + parts[2] + " does not exist").getRequirement(player, "money").getValueDouble(); diff --git a/src/main/java/sh/okx/rankup/requirements/requirement/PlaceholderRequirement.java b/src/main/java/sh/okx/rankup/requirements/requirement/PlaceholderRequirement.java index b727e6e..583833f 100644 --- a/src/main/java/sh/okx/rankup/requirements/requirement/PlaceholderRequirement.java +++ b/src/main/java/sh/okx/rankup/requirements/requirement/PlaceholderRequirement.java @@ -28,6 +28,8 @@ public class PlaceholderRequirement extends ProgressiveRequirement { switch (parts[1]) { case "=": return parsed.equals(value) ? 1 : 0; + case "!=": + return parsed.equals(value) ? 0 : 1; } // numeric operations @@ -35,15 +37,15 @@ public class PlaceholderRequirement extends ProgressiveRequirement { double v = Double.parseDouble(value.replace(",", "")); switch (parts[1]) { case ">": - return p > v ? v : 0; + return p > v ? 1 : 0; case ">=": return Math.min(p, v); case "<": - return p < v ? v : 0; + return p < v ? 1 : 0; case "<=": return p <= v ? 1 : 0; case "==": - return p == v ? v : 0; + return p == v ? 1 : 0; } throw new IllegalArgumentException("Invalid operation: " + parts[1]); } @@ -52,17 +54,19 @@ public class PlaceholderRequirement extends ProgressiveRequirement { public double getTotal(Player player) { String[] parts = getParts(player); - if (parts[1].equalsIgnoreCase("=")) { - return 1; - } else { - return Double.parseDouble(parts[2]); + switch (parts[1]) { + case ">=": + return Double.parseDouble(parts[2]); + default: + return 1; } } private String[] getParts(Player player) { String[] parts = getValueString().split(" "); if (parts.length < 3) { - throw new IllegalArgumentException("Placeholder requirements must be in the form %placeholder% string"); + throw new IllegalArgumentException( + "Placeholder requirements must be in the form %placeholder% string"); } String parsed = PlaceholderAPI.setPlaceholders(player, parts[0]); if (!PlaceholderAPI.containsPlaceholders(parts[0]) || parsed.equals(parts[0])) { diff --git a/src/main/java/sh/okx/rankup/text/LegacyTextProcessor.java b/src/main/java/sh/okx/rankup/text/LegacyTextProcessor.java index 40099b9..709ea6d 100644 --- a/src/main/java/sh/okx/rankup/text/LegacyTextProcessor.java +++ b/src/main/java/sh/okx/rankup/text/LegacyTextProcessor.java @@ -82,11 +82,11 @@ public class LegacyTextProcessor implements TextProcessor { } else if (p.toLowerCase().startsWith("percent_done ")) { String requirement = p.substring("percent_done ".length()); return get("rank", p, o -> this.options.getPercentFormat() - .format(((RankContext) o).getReq(requirement).getPercent() * 100)); + .format(((RankContext) o).getReq(requirement).getPercent())); } else if (p.toLowerCase().startsWith("percent_left ")) { String requirement = p.substring("percent_left ".length()); return get("rank", p, o -> this.options.getPercentFormat() - .format(100 - ((RankContext) o).getReq(requirement).getPercent() * 100)); + .format(100 - ((RankContext) o).getReq(requirement).getPercent())); } return get(p, "{" + p + "}"); diff --git a/src/main/resources/locale/nl.yml b/src/main/resources/locale/nl.yml new file mode 100644 index 0000000..f922899 --- /dev/null +++ b/src/main/resources/locale/nl.yml @@ -0,0 +1,119 @@ +# De berichten in deze afdeling kunnen worden aangepast voor elke Rankup in rankups.yml +rankup: + requirements-not-met: "&cJe hebt {{rank.requirement('money').total | simple }} geld nodig om te ranken." + no-rankup: "&eJe bent op de hoogste rang." + # Zet de string leeg, bijvoorbeeld: success-public: "" + # Om het bericht te verbergen. + success-public: "&a{{player}} &eis gerankt naar: &d{{next.rank}}" + success-private: "&aJe bent gerankt naar: &d{{next.rank}}" + # Gebruikt voor tekst bevestiging. + confirmation: |- + &eWeet je zeker dat je de volgende rang &a{{next.rank}} &ewilt? + &eType nogmaals &c/rankup &eom te bevestigen. + must-prestige: "&cJe moet prestigen om verder te ranken!" + + gui: + rows: 1 + title: "Rank naar {{next.rank}}" + rankup: + material: EMERALD_BLOCK + # "index" kan worden verdeeld tot groupen door spaties te gebruiken. + # Bijvoorbeeld: 0-3 9-12 18-21 + # Je kan ook apparte getallen gebruiken in plaats van een bereik. + index: 0-3 + name: '&a&lBevestigen' + # "lore" is optioneel. + lore: '&6Rank naar &b{{next.rank}}' + cancel: + material: REDSTONE_BLOCK + index: 5-8 + name: '&c&lAnnuleren' + fill: + name: ' ' + # Als je versies 1.8-1.12 gebruikt en je wilt dit veranderen, + # moet je gebruiken, bijvoorbeeld STAINED_GLASS_PANE:8 + # Dit werkt voor zowel "rankup" als "cancel". + material: BLACK_STAINED_GLASS_PANE + + ranksgui: + title: "Rangen" + rows: 3 + offset: 10 + width: 7 + complete: + material: GREEN_STAINED_GLASS_PANE + name: "&aRang &7{{next.rank}} &a(compleet)" + current: + material: ORANGE_STAINED_GLASS_PANE + name: "&dRank naar &7{{next.rank}}" + incomplete: + material: RED_STAINED_GLASS_PANE + name: "&cRang &7{{next.rank}} &c(vereist hogere rang)" + fill: + material: BLACK_STAINED_GLASS_PANE + name: ' ' + + + # Je kan (en waarschijnlijk moet) deze overschrijven in de rankups.yml. + # Om specifieke eisen te weergeven voor elke rang. + # Hoewel als je de "money" eis gebruikt, hoef je niet het bericht te veranderen voor elke rang. Je kan een combinatie gebruiken van: + # {{rank.requirement('money').total | simple}} {MONEY_NEEDED} {PERCENT_DONE } {PERCENT_LEFT } {AMOUNT } {AMOUNT_NEEDED } + # {{rank.requirement('money').total | simple}} en {MONEY_NEEDED} zijn anders dan {AMOUNT money} en {AMOUNT_NEEDED money} want ze gebruiken een verschillend formaat. + # Hier is een voorbeeld met alleen de "money" eis: + #list: + # complete: "&7{{rank.rank}} &8\xbb &7{{next.rank}} &evoor &7${{rank.requirement('money').total | simple}}" + # current: "&c{{rank.rank}} &e\xbb &c{{next.rank}} &evoor &a${{rank.requirement('money').total | simple}} &e{PERCENT_DONE money}%" + # incomplete: "&r{{rank.rank}} &e\xbb &r{{next.rank}} &evoor &a${{rank.requirement('money').total | simple}}" + list: + complete: "&7{{rank.rank}} &8\xbb &7{{next.rank}}" + current: "&c{{rank.rank}} &e\xbb &c{{next.rank}}" + incomplete: "&r{{rank.rank}} &e\xbb &r{{next.rank}}" + # Een lege string ("") schakelt het bericht uit. + header: "" + footer: "" + # Verzonden wanneer een speler probeert te ranken terwijl ze in cooldown zitten. + cooldown: + singular: "&cJe moet {{seconds_left}} seconde wachten om weer te ranken." + plural: "&cJe moet {{seconds_left}} secondes wachten om weer te ranken." +# Prestige berichten kunnen ook worden aangepast. +prestige: + requirements-not-met: "&cJe hebt {{rank.requirement('money').total | simple}} geld nodig om te prestigen." + no-prestige: "&eJe bent op de hoogste prestige." + + success-public: "&a{{player}} &eis geprestiged naar: &d{{next.rank}}" + success-private: "&aJe bent geprestiged naar: &d{{next.rank}}" + + confirmation: |- + &eWeet je zeker dat je wilt prestigen naar &a{{next.rank}}&e? + &eType nogmaals &c/prestige &eom te bevestigen. + gui: + title: "Prestige naar {{next.rank}}" + rankup: + material: GOLD_BLOCK + index: 0-3 + name: '&a&lBevestigen' + lore: '&6Prestige naar &b{{next.rank}}' + cancel: + material: REDSTONE_BLOCK + index: 5-8 + name: '&c&lAnnuleren' + fill: + name: ' ' + # Als je versies 1.8-1.12 gebruikt en je wilt dit veranderen, + # moet je gebruiken, bijvoorbeeld STAINED_GLASS_PANE:8 + # Dit werkt voor zowel "rankup" als "cancel". + material: BLACK_STAINED_GLASS_PANE + + list: + complete: "&7{{rank.rank}} &8\xbb &7{{next.rank}}" + current: "&c{{rank.rank}} &e\xbb &c{{next.rank}}" + incomplete: "&r{{rank.rank}} &e\xbb &r{{next.rank}}" + header: "" + footer: "" + cooldown: + singular: "&cJe moet {{seconds_left}} seconde wachten om weer te prestigen." + plural: "&cJe moet {{seconds_left}} secondes wachten om weer te prestigen." + +not-high-enough: "&cJe kan niet prestigen in jouw rang!" +not-in-ladder: "&cSorry, maar we konden geen rangen vinden voor de group(en) waar jij in zit. Gebruik /ranks om de lijst van rangen te weergeven." +invalid-rankup: "&cOngeldige rang gedefinieerd in de configuratie, check AUB het bedieningspaneel." \ No newline at end of file diff --git a/src/test/java/sh/okx/rankup/legacy/LegacyPlaceholderTest.java b/src/test/java/sh/okx/rankup/legacy/LegacyPlaceholderTest.java index a27f717..b230991 100644 --- a/src/test/java/sh/okx/rankup/legacy/LegacyPlaceholderTest.java +++ b/src/test/java/sh/okx/rankup/legacy/LegacyPlaceholderTest.java @@ -20,5 +20,6 @@ public class LegacyPlaceholderTest extends RankupTest { plugin.getHelper().rankup(player); player.assertSaid("testPlayer A B A-display last rank 1,000 900 4 1 3 25 75"); + player.assertNoMoreSaid(); } } diff --git a/src/test/java/sh/okx/rankup/messages/RankupPlaceholderTest.java b/src/test/java/sh/okx/rankup/messages/RankupPlaceholderTest.java index 66a49f5..529392e 100644 --- a/src/test/java/sh/okx/rankup/messages/RankupPlaceholderTest.java +++ b/src/test/java/sh/okx/rankup/messages/RankupPlaceholderTest.java @@ -1,12 +1,19 @@ package sh.okx.rankup.messages; + +import static org.junit.Assert.assertNotNull; + import be.seeseemelk.mockbukkit.entity.PlayerMock; import org.junit.Test; import sh.okx.rankup.RankupTest; public class RankupPlaceholderTest extends RankupTest { + public RankupPlaceholderTest() { + super("placeholder"); + } + @Test - public void testSuccessPublicIsSame() { + public void testReceivesSuccessMessages() { PlayerMock player = server.addPlayer(); PlayerMock receiver = server.addPlayer(); @@ -20,5 +27,21 @@ public class RankupPlaceholderTest extends RankupTest { // receiver does not receive success-private receiver.assertNoMoreSaid(); + + // player receives success-private and nothing else + assertNotNull(player.nextMessage()); + player.assertNoMoreSaid(); + } + + @Test + public void testQuotientAndPercent() { + PlayerMock player = server.addPlayer(); + + plugin.getEconomy().setPlayer(player, 100); + + groupProvider.addGroup(player.getUniqueId(), "A"); + plugin.getHelper().rankup(player); + + player.assertSaid("0.1 10"); } } diff --git a/src/test/resources/placeholder/rankups.yml b/src/test/resources/placeholder/rankups.yml new file mode 100644 index 0000000..8afed18 --- /dev/null +++ b/src/test/resources/placeholder/rankups.yml @@ -0,0 +1,7 @@ +A: + rank: 'A' + next: 'B' + requirements: + - 'money 1000' + rankup: + requirements-not-met: '{{rank.requirement("money").quotient | simple}} {{rank.requirement("money").percent | simple}}' \ No newline at end of file