From bfb2b668f260c3cb3c66b075ccbcb25a5dae71c2 Mon Sep 17 00:00:00 2001 From: okx-code Date: Thu, 24 Dec 2020 00:41:27 +0000 Subject: [PATCH] 3.11 update --- build.gradle | 5 +- src/main/java/sh/okx/rankup/RankupHelper.java | 19 +- src/main/java/sh/okx/rankup/RankupPlugin.java | 9 +- .../sh/okx/rankup/commands/InfoCommand.java | 13 +- .../okx/rankup/commands/PrestigeCommand.java | 3 +- .../rankup/events/PlayerPrestigeEvent.java | 36 +++ .../okx/rankup/events/PlayerRankupEvent.java | 36 +++ .../{ => events}/RankupRegisterEvent.java | 77 ++--- src/main/java/sh/okx/rankup/gui/Gui.java | 10 +- .../java/sh/okx/rankup/gui/GuiListener.java | 2 +- .../okx/rankup/messages/MessageBuilder.java | 297 +++++++++--------- .../java/sh/okx/rankup/messages/Variable.java | 2 + .../okx/rankup/placeholders/Placeholders.java | 86 +++-- .../sh/okx/rankup/prestige/LastPrestige.java | 79 +++-- .../java/sh/okx/rankup/prestige/Prestige.java | 148 ++++----- .../sh/okx/rankup/prestige/Prestiges.java | 38 +-- .../java/sh/okx/rankup/ranks/LastRank.java | 58 ++-- src/main/java/sh/okx/rankup/ranks/Rank.java | 136 ++++---- .../java/sh/okx/rankup/ranks/RankList.java | 254 +++++++-------- src/main/java/sh/okx/rankup/ranks/Rankup.java | 6 +- .../java/sh/okx/rankup/ranks/Rankups.java | 38 ++- .../java/sh/okx/rankup/ranksgui/RanksGui.java | 3 +- .../requirements/RequirementRegistry.java | 100 +++--- .../requirement/PlaceholderRequirement.java | 180 +++++------ .../SuperbVoteVotesRequirement.java | 27 ++ src/main/java/sh/okx/rankup/util/Colour.java | 30 ++ src/main/resources/config.yml | 3 +- src/main/resources/plugin.yml | 2 +- src/test/java/sh/okx/rankup/RankupTest.java | 8 +- 29 files changed, 937 insertions(+), 768 deletions(-) create mode 100644 src/main/java/sh/okx/rankup/events/PlayerPrestigeEvent.java create mode 100644 src/main/java/sh/okx/rankup/events/PlayerRankupEvent.java rename src/main/java/sh/okx/rankup/{ => events}/RankupRegisterEvent.java (80%) create mode 100644 src/main/java/sh/okx/rankup/requirements/requirement/superbvote/SuperbVoteVotesRequirement.java create mode 100644 src/main/java/sh/okx/rankup/util/Colour.java diff --git a/build.gradle b/build.gradle index cdff463..935084f 100644 --- a/build.gradle +++ b/build.gradle @@ -35,8 +35,11 @@ dependencies { implementation('com.github.MilkBowl:VaultAPI:1.7') { exclude group: 'org.bukkit' } - implementation 'me.clip:placeholderapi:2.10.6' + implementation ('me.clip:placeholderapi:2.10.9') { + exclude group: 'org.bstats' + } implementation 'com.github.pyvesb:advanced-achievements:6.7.2' + implementation 'com.github.astei:Superbvote:700fca43659b438cb9bb36c218a7646d2f2ef315' implementation('com.github.mcMMO-Dev:mcMMO:601297') { exclude group: 'com.sk89q.worldguard' } diff --git a/src/main/java/sh/okx/rankup/RankupHelper.java b/src/main/java/sh/okx/rankup/RankupHelper.java index 26a9ce5..c6800e0 100644 --- a/src/main/java/sh/okx/rankup/RankupHelper.java +++ b/src/main/java/sh/okx/rankup/RankupHelper.java @@ -3,8 +3,11 @@ package sh.okx.rankup; import java.util.HashMap; import java.util.Map; import java.util.Objects; +import org.bukkit.Bukkit; import org.bukkit.configuration.ConfigurationSection; import org.bukkit.entity.Player; +import sh.okx.rankup.events.PlayerPrestigeEvent; +import sh.okx.rankup.events.PlayerRankupEvent; import sh.okx.rankup.hook.GroupProvider; import sh.okx.rankup.messages.Message; import sh.okx.rankup.messages.Variable; @@ -40,7 +43,9 @@ public class RankupHelper { } permissions.addGroup(player.getUniqueId(), rank.getNext().getRank().getRank()); - rank.getRank().runCommands(player); + rank.getRank().runCommands(player, rank.getNext().getRank()); + + Bukkit.getPluginManager().callEvent(new PlayerRankupEvent(plugin, player, rank)); } public void sendRankupMessages(Player player, RankElement rank) { @@ -65,7 +70,9 @@ public class RankupHelper { } permissions.addGroup(player.getUniqueId(), prestige.getNext().getRank().getRank()); - rank.runCommands(player); + rank.runCommands(player, prestige.getNext().getRank()); + + Bukkit.getPluginManager().callEvent(new PlayerPrestigeEvent(plugin, player, prestige)); } public void sendPrestigeMessages(Player player, RankElement prestige) { @@ -95,7 +102,7 @@ public class RankupHelper { plugin .getMessage(rank, secondsLeft > 1 ? Message.COOLDOWN_PLURAL : Message.COOLDOWN_SINGULAR) .failIfEmpty() - .replaceRanks(player, rank.getRank()) + .replaceRanks(player, rank) .replaceFromTo(rank) .replace(Variable.SECONDS, cooldownSeconds) .replace(Variable.SECONDS_LEFT, secondsLeft) @@ -153,7 +160,7 @@ public class RankupHelper { Prestiges prestiges = plugin.getPrestiges(); plugin.getMessage(prestiges == null || !prestiges.getByPlayer(player).hasNext() ? Message.NO_RANKUP : Message.MUST_PRESTIGE) .failIf(!message) - .replaceRanks(player, rankups.getTree().last().getRank().getRank()) + .replaceRanks(player, rankups.getTree().last().getRank()) .send(player); return false; } else if (!rank.hasRequirements(player)) { // check if they can afford it @@ -200,7 +207,7 @@ public class RankupHelper { } else if (!prestigeElement.hasNext()) { // check if they are at the highest rank plugin.getMessage(prestigeElement.getRank(), Message.PRESTIGE_NO_PRESTIGE) .failIf(!message) - .replaceRanks(player, prestigeElement.getRank().getRank()) + .replaceRanks(player, prestigeElement.getRank()) .replaceFromTo(prestigeElement.getRank()) .send(player); return false; @@ -208,7 +215,7 @@ public class RankupHelper { plugin.replaceMoneyRequirements( plugin.getMessage(prestigeElement.getRank(), Message.PRESTIGE_REQUIREMENTS_NOT_MET) .failIf(!message) - .replaceRanks(player, prestigeElement.getRank(), prestigeElement.getNext().getRank().getRank()), player, prestigeElement.getRank()) + .replaceRanks(player, prestigeElement.getRank(), prestigeElement.getNext().getRank()), player, prestigeElement.getRank()) .replaceFromTo(prestigeElement.getRank()) .send(player); return false; diff --git a/src/main/java/sh/okx/rankup/RankupPlugin.java b/src/main/java/sh/okx/rankup/RankupPlugin.java index dbed06b..a50ef6e 100644 --- a/src/main/java/sh/okx/rankup/RankupPlugin.java +++ b/src/main/java/sh/okx/rankup/RankupPlugin.java @@ -29,6 +29,7 @@ import sh.okx.rankup.commands.RankupCommand; import sh.okx.rankup.economy.Economy; import sh.okx.rankup.economy.EconomyProvider; import sh.okx.rankup.economy.VaultEconomyProvider; +import sh.okx.rankup.events.RankupRegisterEvent; import sh.okx.rankup.gui.Gui; import sh.okx.rankup.gui.GuiListener; import sh.okx.rankup.hook.GroupProvider; @@ -70,6 +71,7 @@ import sh.okx.rankup.requirements.requirement.advancedachievements.AdvancedAchie import sh.okx.rankup.requirements.requirement.advancedachievements.AdvancedAchievementsTotalRequirement; import sh.okx.rankup.requirements.requirement.mcmmo.McMMOPowerLevelRequirement; import sh.okx.rankup.requirements.requirement.mcmmo.McMMOSkillRequirement; +import sh.okx.rankup.requirements.requirement.superbvote.SuperbVoteVotesRequirement; import sh.okx.rankup.requirements.requirement.tokenmanager.TokensDeductibleRequirement; import sh.okx.rankup.requirements.requirement.tokenmanager.TokensRequirement; import sh.okx.rankup.requirements.requirement.towny.TownyKingNumberResidentsRequirement; @@ -406,6 +408,9 @@ public class RankupPlugin extends JavaPlugin { new TokensRequirement(this, "tokenmanager-tokensh"), new TokensDeductibleRequirement(this, "tokenmanager-tokens")); } + if (Bukkit.getPluginManager().isPluginEnabled("SuperbVotes")) { + requirements.addRequirements(new SuperbVoteVotesRequirement(this)); + } } private void setupEconomy() { economy = economyProvider.getEconomy(); @@ -521,7 +526,7 @@ public class RankupPlugin extends JavaPlugin { } return replaceMoneyRequirements(getMessage(oldRank, message) - .replaceRanks(player, rankName.getRank()) + .replaceRanks(player, rankName) .replace(Variable.OLD_RANK, oldRankName), player, oldRank) .replaceFromTo(oldRank); } @@ -535,7 +540,7 @@ public class RankupPlugin extends JavaPlugin { } else { builder = getMessage(rank, type) .failIfEmpty() - .replaceRanks(sender, rank.getRank()) + .replaceRanks(sender, rank) .replaceFromTo(rank); } builder.send(sender); diff --git a/src/main/java/sh/okx/rankup/commands/InfoCommand.java b/src/main/java/sh/okx/rankup/commands/InfoCommand.java index 1db9b53..0b12c71 100644 --- a/src/main/java/sh/okx/rankup/commands/InfoCommand.java +++ b/src/main/java/sh/okx/rankup/commands/InfoCommand.java @@ -1,5 +1,10 @@ package sh.okx.rankup.commands; +import java.util.ArrayList; +import java.util.Collections; +import java.util.HashSet; +import java.util.List; +import java.util.Set; import org.bukkit.Bukkit; import org.bukkit.ChatColor; import org.bukkit.command.Command; @@ -18,8 +23,6 @@ import sh.okx.rankup.ranks.RankElement; import sh.okx.rankup.ranks.Rankups; import sh.okx.rankup.util.UpdateNotifier; -import java.util.*; - public class InfoCommand implements TabExecutor { private final RankupPlugin plugin; @@ -130,7 +133,7 @@ public class InfoCommand implements TabExecutor { if (plugin.getRankups().getFirst().equals(currentRank)) { sender.sendMessage(ChatColor.YELLOW + "That player is in the first rank and cannot be ranked down."); - + return true; } RankElement prevRankElement = plugin.getRankups().getTree().getFirst(); @@ -140,6 +143,7 @@ public class InfoCommand implements TabExecutor { if (!prevRankElement.hasNext()) { sender.sendMessage(ChatColor.YELLOW + "Could not match previous rank."); + return true; } Rank prevRank = prevRankElement.getRank(); @@ -214,6 +218,7 @@ public class InfoCommand implements TabExecutor { ChatColor.GREEN + "/" + label + " forceprestige " + ChatColor.YELLOW + "Force a player to prestige, bypassing requirements."); } + sender.sendMessage(ChatColor.GREEN + "/" + label + " rankdown " + ChatColor.YELLOW + "Force a player to move down one rank."); } if (sender.hasPermission("rankup.checkversion")) { @@ -239,7 +244,7 @@ public class InfoCommand implements TabExecutor { } else if (args.length == 2) { if (args[0].equalsIgnoreCase("forcerankup") && sender.hasPermission("rankup.force")) { return StringUtil.copyPartialMatches(args[1], players(), new ArrayList<>()); - } else if (args[0].equalsIgnoreCase("forceprestige") && sender.hasPermission("rankup.force")) { + } else if (args[0].equalsIgnoreCase("forceprestige") && sender.hasPermission("rankup.force") && plugin.getPrestiges() != null) { 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<>()); diff --git a/src/main/java/sh/okx/rankup/commands/PrestigeCommand.java b/src/main/java/sh/okx/rankup/commands/PrestigeCommand.java index fd10161..36327d9 100644 --- a/src/main/java/sh/okx/rankup/commands/PrestigeCommand.java +++ b/src/main/java/sh/okx/rankup/commands/PrestigeCommand.java @@ -12,6 +12,7 @@ import sh.okx.rankup.gui.Gui; import sh.okx.rankup.messages.Message; import sh.okx.rankup.prestige.Prestige; import sh.okx.rankup.prestige.Prestiges; +import sh.okx.rankup.ranks.Rank; import sh.okx.rankup.ranks.RankElement; import java.util.Map; @@ -55,7 +56,7 @@ public class PrestigeCommand implements CommandExecutor { case "text": confirming.put(player, System.currentTimeMillis()); Prestige next = rankElement.getNext().getRank(); - String nextRank = next == null ? prestiges.getTree().last().getRank().getRank() : next.getRank(); + Rank nextRank = next == null ? prestiges.getTree().last().getRank() : next; plugin.replaceMoneyRequirements(plugin.getMessage(prestige, Message.PRESTIGE_CONFIRMATION) .replaceRanks(player, prestige, nextRank), player, prestige) diff --git a/src/main/java/sh/okx/rankup/events/PlayerPrestigeEvent.java b/src/main/java/sh/okx/rankup/events/PlayerPrestigeEvent.java new file mode 100644 index 0000000..6dcd4dc --- /dev/null +++ b/src/main/java/sh/okx/rankup/events/PlayerPrestigeEvent.java @@ -0,0 +1,36 @@ +package sh.okx.rankup.events; + +import lombok.Getter; +import org.bukkit.entity.Player; +import org.bukkit.event.HandlerList; +import org.bukkit.event.player.PlayerEvent; +import org.jetbrains.annotations.NotNull; +import sh.okx.rankup.RankupPlugin; +import sh.okx.rankup.prestige.Prestige; +import sh.okx.rankup.ranks.RankElement; + +/** + * Called when a player ranks up from one prestige to another. + */ +public class PlayerPrestigeEvent extends PlayerEvent { + private static final HandlerList handlers = new HandlerList(); + @Getter + private final RankupPlugin plugin; + /** + * The prestige someone is current at. Use RankElement#getNext() to get the prestige + * a player is ranking up to. + */ + @Getter + private final RankElement prestige; + + public PlayerPrestigeEvent(RankupPlugin plugin, @NotNull Player who, RankElement prestige) { + super(who); + this.plugin = plugin; + this.prestige = prestige; + } + + @Override + public HandlerList getHandlers() { + return handlers; + } +} diff --git a/src/main/java/sh/okx/rankup/events/PlayerRankupEvent.java b/src/main/java/sh/okx/rankup/events/PlayerRankupEvent.java new file mode 100644 index 0000000..ea9ac75 --- /dev/null +++ b/src/main/java/sh/okx/rankup/events/PlayerRankupEvent.java @@ -0,0 +1,36 @@ +package sh.okx.rankup.events; + +import lombok.Getter; +import org.bukkit.entity.Player; +import org.bukkit.event.HandlerList; +import org.bukkit.event.player.PlayerEvent; +import org.jetbrains.annotations.NotNull; +import sh.okx.rankup.RankupPlugin; +import sh.okx.rankup.ranks.Rank; +import sh.okx.rankup.ranks.RankElement; + +/** + * Called when a player ranks up from one rank to another. + */ +public class PlayerRankupEvent extends PlayerEvent { + private static final HandlerList handlers = new HandlerList(); + @Getter + private final RankupPlugin plugin; + /** + * The rank someone is current at. Use RankElement#getNext() to get the rank + * a player is ranking up to. + */ + @Getter + private final RankElement rank; + + public PlayerRankupEvent(RankupPlugin plugin, @NotNull Player who, RankElement rank) { + super(who); + this.plugin = plugin; + this.rank = rank; + } + + @Override + public HandlerList getHandlers() { + return handlers; + } +} diff --git a/src/main/java/sh/okx/rankup/RankupRegisterEvent.java b/src/main/java/sh/okx/rankup/events/RankupRegisterEvent.java similarity index 80% rename from src/main/java/sh/okx/rankup/RankupRegisterEvent.java rename to src/main/java/sh/okx/rankup/events/RankupRegisterEvent.java index fb8be5c..e698c3c 100644 --- a/src/main/java/sh/okx/rankup/RankupRegisterEvent.java +++ b/src/main/java/sh/okx/rankup/events/RankupRegisterEvent.java @@ -1,38 +1,39 @@ -package sh.okx.rankup; - -import lombok.Getter; -import lombok.RequiredArgsConstructor; -import org.bukkit.event.Event; -import org.bukkit.event.HandlerList; -import sh.okx.rankup.requirements.Requirement; -import sh.okx.rankup.requirements.RequirementRegistry; - -/** - * Called immediately before rankups and prestiges are registered, - * and immediately after the built-in requirements are registered. - * This is used to register custom requirements. - * This is called when the plugin is enabled, and when it is reloaded from a command. - */ -@RequiredArgsConstructor -public class RankupRegisterEvent extends Event { - private static final HandlerList handlers = new HandlerList(); - @Getter - private final RankupPlugin plugin; - - public static HandlerList getHandlerList() { - return handlers; - } - - public RequirementRegistry getRequirementRegistry() { - return plugin.getRequirements(); - } - - public void addRequirement(Requirement requirement) { - plugin.getRequirements().addRequirement(requirement); - } - - @Override - public HandlerList getHandlers() { - return handlers; - } -} +package sh.okx.rankup.events; + +import lombok.Getter; +import lombok.RequiredArgsConstructor; +import org.bukkit.event.Event; +import org.bukkit.event.HandlerList; +import sh.okx.rankup.RankupPlugin; +import sh.okx.rankup.requirements.Requirement; +import sh.okx.rankup.requirements.RequirementRegistry; + +/** + * Called immediately before rankups and prestiges are registered, + * and immediately after the built-in requirements are registered. + * This is used to register custom requirements. + * This is called when the plugin is enabled, and when it is reloaded from a command. + */ +@RequiredArgsConstructor +public class RankupRegisterEvent extends Event { + private static final HandlerList handlers = new HandlerList(); + @Getter + private final RankupPlugin plugin; + + public static HandlerList getHandlerList() { + return handlers; + } + + public RequirementRegistry getRequirementRegistry() { + return plugin.getRequirements(); + } + + public void addRequirement(Requirement requirement, Requirement... requirements) { + plugin.getRequirements().addRequirements(requirement, requirements); + } + + @Override + public HandlerList getHandlers() { + return handlers; + } +} diff --git a/src/main/java/sh/okx/rankup/gui/Gui.java b/src/main/java/sh/okx/rankup/gui/Gui.java index 59cd5d4..c77fb5c 100644 --- a/src/main/java/sh/okx/rankup/gui/Gui.java +++ b/src/main/java/sh/okx/rankup/gui/Gui.java @@ -21,6 +21,7 @@ import sh.okx.rankup.messages.MessageBuilder; import sh.okx.rankup.prestige.Prestige; import sh.okx.rankup.ranks.Rank; import sh.okx.rankup.ranks.RankElement; +import sh.okx.rankup.util.Colour; import sh.okx.rankup.util.ItemUtil; @RequiredArgsConstructor(access = AccessLevel.PRIVATE) @@ -62,10 +63,10 @@ public class Gui implements InventoryHolder { gui.cancel = cancel; Inventory inventory = Bukkit.createInventory(gui, items.length, - ChatColor.stripColor(ChatColor.translateAlternateColorCodes('&', plugin.replaceMoneyRequirements( + Colour.translate(plugin.replaceMoneyRequirements( plugin.getMessage(oldRank, gui.prestige ? Message.PRESTIGE_TITLE : Message.TITLE) .replaceRanks(player, oldRank, rank) - .replaceFromTo(oldRank), player, oldRank).toString()))); + .replaceFromTo(oldRank), player, oldRank).toString())); inventory.setContents(items); gui.inventory = inventory; return gui; @@ -75,7 +76,8 @@ public class Gui implements InventoryHolder { if (element == null) { return getItem(plugin, section, player, null, null); } else { - return getItem(plugin, section, player, element.getRank(), element.getNext().getRank()); + RankElement next = element.getNext(); + return getItem(plugin, section, player, element.getRank(), (next == null ? element : next).getRank()); } } @@ -125,7 +127,7 @@ public class Gui implements InventoryHolder { if (oldRank != null && rank != null) { builder = builder.replaceRanks(player, oldRank, rank); } - return ChatColor.translateAlternateColorCodes('&', plugin.replaceMoneyRequirements(builder, player, oldRank).toString()); + return Colour.translate(plugin.replaceMoneyRequirements(builder, player, oldRank).toString()); } private static void addItem(ItemStack[] items, ConfigurationSection section, ItemStack item) { diff --git a/src/main/java/sh/okx/rankup/gui/GuiListener.java b/src/main/java/sh/okx/rankup/gui/GuiListener.java index 7e22446..841f660 100644 --- a/src/main/java/sh/okx/rankup/gui/GuiListener.java +++ b/src/main/java/sh/okx/rankup/gui/GuiListener.java @@ -37,7 +37,7 @@ public class GuiListener implements Listener { Bukkit.getScheduler().runTask(plugin, () -> { player.closeInventory(); if (gui.isReturnToRanksGui()) { - Bukkit.dispatchCommand(player, "ranksgui"); + Bukkit.dispatchCommand(player, "ranks"); } }); } diff --git a/src/main/java/sh/okx/rankup/messages/MessageBuilder.java b/src/main/java/sh/okx/rankup/messages/MessageBuilder.java index fcbb216..1841fd2 100644 --- a/src/main/java/sh/okx/rankup/messages/MessageBuilder.java +++ b/src/main/java/sh/okx/rankup/messages/MessageBuilder.java @@ -1,141 +1,156 @@ -package sh.okx.rankup.messages; - -import me.clip.placeholderapi.PlaceholderAPI; -import org.bukkit.Bukkit; -import org.bukkit.ChatColor; -import org.bukkit.command.CommandSender; -import org.bukkit.configuration.ConfigurationSection; -import org.bukkit.entity.Player; -import sh.okx.rankup.prestige.Prestige; -import sh.okx.rankup.prestige.Prestiges; -import sh.okx.rankup.ranks.Rank; - -import java.util.Objects; -import java.util.regex.Matcher; -import java.util.regex.Pattern; - -public class MessageBuilder { - private String message; - - public MessageBuilder(String message) { - this.message = message; - } - - public static MessageBuilder of(ConfigurationSection config, Message message) { - return MessageBuilder.of(config, message.getName()); - } - - private static MessageBuilder of(ConfigurationSection config, String message) { - String string = config.getString(message); - Objects.requireNonNull(string, "Configuration message '" + message + "' not found!"); - return new MessageBuilder(ChatColor.translateAlternateColorCodes('&', string)); - } - - public MessageBuilder replace(Variable variable, Object value) { - return replace(variable.name(), value); - } - - public MessageBuilder replace(String name, Object value) { - Pattern pattern = Pattern.compile("\\{" + name + "}", Pattern.CASE_INSENSITIVE); - Matcher matcher = pattern.matcher(message); - this.message = matcher.replaceAll(String.valueOf(value)); - return this; - } - - public MessageBuilder replaceFirstPrestige(Rank rank, Prestiges prestiges, String with) { - if (prestiges != null && prestiges.getFirst().equals(rank)) { - replace(Variable.OLD_RANK, with); - } - return this; - } - - public MessageBuilder replaceRanks(CommandSender player, String rankName) { - replace(Variable.PLAYER, player.getName()); - replaceRanks(rankName); - return this; - } - - public MessageBuilder replaceRanks(CommandSender player, Rank oldRank, String rankName) { - replace(Variable.PLAYER, player.getName()); - replaceRanks(oldRank, rankName); - return this; - } - - public MessageBuilder replaceRanks(CommandSender player, Rank oldRank, Rank rank) { - replace(Variable.PLAYER, player.getName()); - replaceRanks(oldRank, rank); - return this; - } - - public MessageBuilder replaceRanks(String rankName) { - replace(Variable.RANK, rankName); - return this; - } - - public MessageBuilder replaceRanks(Rank rank) { - replace(Variable.RANK, rank.getRank()); - return this; - } - - public MessageBuilder replaceRanks(Rank oldRank, String rankName) { - replaceRanks(rankName); - replace(Variable.OLD_RANK, oldRank.getRank()); - return this; - } - - public MessageBuilder replaceRanks(Rank oldRank, Rank rank) { - replaceRanks(rank); - replace(Variable.OLD_RANK, oldRank.getRank()); - return this; - } - - public MessageBuilder replaceFromTo(Rank rank) { - if (rank instanceof Prestige) { - Prestige prestige = (Prestige) rank; - replace(Variable.FROM, prestige.getFrom()); - replace(Variable.TO, prestige.getTo()); - } - return this; - } - - /** - * Fails the MessageBuilder if the message is empty. - * if this fails, all subsequent calls to that MessageBuilder will do nothing - * @return a NullMessageBuilder if the message is empty, itself otherwise - */ - public MessageBuilder failIfEmpty() { - return failIf(message.isEmpty()); - } - - public MessageBuilder failIf(boolean value) { - if (value) { - return new NullMessageBuilder(); - } else { - return this; - } - } - - public void send(CommandSender sender) { - String msg = message; - if (sender instanceof Player && Bukkit.getPluginManager().isPluginEnabled("PlaceholderAPI")) { - msg = PlaceholderAPI.setPlaceholders((Player) sender, msg); - } - sender.sendMessage(msg); - } - - /** - * Sends the message to all players - * ie, calls MessageBuilder#send(Player) for all players online, and sends the message in the console. - */ - public void broadcast() { - for (Player player : Bukkit.getOnlinePlayers()) { - send(player); - } - send(Bukkit.getConsoleSender()); - } - - @Override - public String toString() { - return message; - } -} +package sh.okx.rankup.messages; + +import java.util.Objects; +import java.util.regex.Matcher; +import java.util.regex.Pattern; +import me.clip.placeholderapi.PlaceholderAPI; +import org.bukkit.Bukkit; +import org.bukkit.command.CommandSender; +import org.bukkit.configuration.ConfigurationSection; +import org.bukkit.entity.Player; +import sh.okx.rankup.prestige.Prestige; +import sh.okx.rankup.prestige.Prestiges; +import sh.okx.rankup.ranks.Rank; +import sh.okx.rankup.util.Colour; + +public class MessageBuilder { + private String message; + + public MessageBuilder(String message) { + this.message = message; + } + + public static MessageBuilder of(ConfigurationSection config, Message message) { + return MessageBuilder.of(config, message.getName()); + } + + private static MessageBuilder of(ConfigurationSection config, String message) { + String string = config.getString(message); + Objects.requireNonNull(string, "Configuration message '" + message + "' not found!"); + return new MessageBuilder(Colour.translate(string)); + } + + public MessageBuilder replace(Variable variable, Object value) { + return replace(variable.name(), value); + } + + public MessageBuilder replace(String name, Object value) { + if (value == null) { + return this; + } + Pattern pattern = Pattern.compile("\\{" + name + "}", Pattern.CASE_INSENSITIVE); + Matcher matcher = pattern.matcher(message); + this.message = matcher.replaceAll(String.valueOf(value)); + return this; + } + + public MessageBuilder replaceFirstPrestige(Rank rank, Prestiges prestiges, String with) { + if (prestiges != null && prestiges.getFirst().equals(rank)) { + replace(Variable.OLD_RANK, with); + } + return this; + } + + @Deprecated + public MessageBuilder replaceRanks(CommandSender player, String rankName) { + replace(Variable.PLAYER, player.getName()); + replaceRanks(rankName); + return this; + } + + @Deprecated + public MessageBuilder replaceRanks(CommandSender player, Rank oldRank, String rankName) { + replace(Variable.PLAYER, player.getName()); + replaceRanks(oldRank, rankName); + return this; + } + + public MessageBuilder replaceRanks(CommandSender player, Rank rank) { + replace(Variable.PLAYER, player.getName()); + replaceRanks(rank); + return this; + } + + public MessageBuilder replaceRanks(CommandSender player, Rank oldRank, Rank rank) { + replace(Variable.PLAYER, player.getName()); + replaceRanks(oldRank, rank); + return this; + } + + @Deprecated + public MessageBuilder replaceRanks(String rankName) { + replace(Variable.RANK, rankName); + return this; + } + + public MessageBuilder replaceRanks(Rank rank) { + replace(Variable.RANK, rank.getRank()); + replace(Variable.RANK_NAME, rank.getDisplayName()); + return this; + } + + @Deprecated + public MessageBuilder replaceRanks(Rank oldRank, String rankName) { + replaceRanks(rankName); + replace(Variable.OLD_RANK, oldRank.getRank()); + replace(Variable.OLD_RANK_NAME, oldRank.getDisplayName()); + return this; + } + + public MessageBuilder replaceRanks(Rank oldRank, Rank rank) { + replaceRanks(rank); + replace(Variable.OLD_RANK, oldRank.getRank()); + replace(Variable.OLD_RANK_NAME, oldRank.getDisplayName()); + return this; + } + + public MessageBuilder replaceFromTo(Rank rank) { + if (rank instanceof Prestige) { + Prestige prestige = (Prestige) rank; + replace(Variable.FROM, prestige.getFrom()); + replace(Variable.TO, prestige.getTo()); + } + return this; + } + + /** + * Fails the MessageBuilder if the message is empty. + * if this fails, all subsequent calls to that MessageBuilder will do nothing + * @return a NullMessageBuilder if the message is empty, itself otherwise + */ + public MessageBuilder failIfEmpty() { + return failIf(message.isEmpty()); + } + + public MessageBuilder failIf(boolean value) { + if (value) { + return new NullMessageBuilder(); + } else { + return this; + } + } + + public void send(CommandSender sender) { + String msg = message; + if (sender instanceof Player && Bukkit.getPluginManager().isPluginEnabled("PlaceholderAPI")) { + msg = PlaceholderAPI.setPlaceholders((Player) sender, msg); + } + sender.sendMessage(msg); + } + + /** + * Sends the message to all players + * ie, calls MessageBuilder#send(Player) for all players online, and sends the message in the console. + */ + public void broadcast() { + for (Player player : Bukkit.getOnlinePlayers()) { + send(player); + } + send(Bukkit.getConsoleSender()); + } + + @Override + public String toString() { + return message; + } +} diff --git a/src/main/java/sh/okx/rankup/messages/Variable.java b/src/main/java/sh/okx/rankup/messages/Variable.java index bd3b99a..1ff5bf6 100644 --- a/src/main/java/sh/okx/rankup/messages/Variable.java +++ b/src/main/java/sh/okx/rankup/messages/Variable.java @@ -2,7 +2,9 @@ package sh.okx.rankup.messages; public enum Variable { PLAYER, + OLD_RANK_NAME, OLD_RANK, + RANK_NAME, RANK, FROM, TO, diff --git a/src/main/java/sh/okx/rankup/placeholders/Placeholders.java b/src/main/java/sh/okx/rankup/placeholders/Placeholders.java index 73d8baf..a6262c6 100644 --- a/src/main/java/sh/okx/rankup/placeholders/Placeholders.java +++ b/src/main/java/sh/okx/rankup/placeholders/Placeholders.java @@ -1,45 +1,41 @@ -package sh.okx.rankup.placeholders; - -import lombok.Getter; -import me.clip.placeholderapi.PlaceholderAPI; -import org.bukkit.Bukkit; -import sh.okx.rankup.RankupPlugin; - -import java.text.DecimalFormat; - -public class Placeholders { - private final RankupPlugin plugin; - @Getter - private final DecimalFormat moneyFormat; - @Getter - private final DecimalFormat percentFormat; - @Getter - private final DecimalFormat simpleFormat; - @Getter - private RankupExpansion expansion; - private boolean registered; - - public Placeholders(RankupPlugin plugin) { - this.plugin = plugin; - this.moneyFormat = new DecimalFormat(plugin.getConfig().getString("placeholders.money-format")); - this.percentFormat = new DecimalFormat(plugin.getConfig().getString("placeholders.percent-format")); - this.simpleFormat = new DecimalFormat(plugin.getConfig().getString("placeholders.simple-format")); - } - - public void register() { - expansion = new RankupExpansion(plugin, this); - if (Bukkit.getPluginManager().isPluginEnabled("PlaceholderAPI")) { - RankupPlaceholderExpansion placeholderExpansion = new RankupPlaceholderExpansion(plugin, expansion); - placeholderExpansion.register(); - registered = true; - } else { - registered = false; - } - } - - public void unregister() { - if (registered) { - PlaceholderAPI.unregisterPlaceholderHook("rankup"); - } - } -} +package sh.okx.rankup.placeholders; + +import java.text.DecimalFormat; +import lombok.Getter; +import org.bukkit.Bukkit; +import sh.okx.rankup.RankupPlugin; + +public class Placeholders { + private final RankupPlugin plugin; + @Getter + private final DecimalFormat moneyFormat; + @Getter + private final DecimalFormat percentFormat; + @Getter + private final DecimalFormat simpleFormat; + @Getter + private RankupExpansion expansion; + + private RankupPlaceholderExpansion papiExpansion; + + public Placeholders(RankupPlugin plugin) { + this.plugin = plugin; + this.moneyFormat = new DecimalFormat(plugin.getConfig().getString("placeholders.money-format")); + this.percentFormat = new DecimalFormat(plugin.getConfig().getString("placeholders.percent-format")); + this.simpleFormat = new DecimalFormat(plugin.getConfig().getString("placeholders.simple-format")); + } + + public void register() { + expansion = new RankupExpansion(plugin, this); + if (Bukkit.getPluginManager().isPluginEnabled("PlaceholderAPI")) { + papiExpansion = new RankupPlaceholderExpansion(plugin, expansion); + papiExpansion.register(); + } + } + + public void unregister() { + if (papiExpansion != null) { + papiExpansion.unregister(); + } + } +} diff --git a/src/main/java/sh/okx/rankup/prestige/LastPrestige.java b/src/main/java/sh/okx/rankup/prestige/LastPrestige.java index f3f4450..4ffdb95 100644 --- a/src/main/java/sh/okx/rankup/prestige/LastPrestige.java +++ b/src/main/java/sh/okx/rankup/prestige/LastPrestige.java @@ -1,43 +1,36 @@ -package sh.okx.rankup.prestige; - -import org.bukkit.entity.Player; -import sh.okx.rankup.RankupPlugin; -import sh.okx.rankup.ranks.requirements.LastRankRequirements; -import sh.okx.rankup.requirements.NullRequirement; -import sh.okx.rankup.requirements.Requirement; - -import java.util.Collections; - -public class LastPrestige extends Prestige { - public LastPrestige(RankupPlugin plugin, String name) { - super(null, plugin, null, name, new LastRankRequirements(), Collections.emptyList(), null, null); - } - - @Override - public boolean isIn(Player player) { - return plugin.getPermissions().inGroup(player.getUniqueId(), rank); - } - - @Override - public boolean hasRequirements(Player player) { - return false; - } - - @Override - public Requirement getRequirement(Player player, String name) { - return new NullRequirement(); - } - - @Override - public void applyRequirements(Player player) { - } - - @Override - public void runCommands(Player player) { - } - - @Override - public boolean isEligible(Player player) { - return true; - } -} +package sh.okx.rankup.prestige; + +import java.util.Collections; +import org.bukkit.entity.Player; +import sh.okx.rankup.RankupPlugin; +import sh.okx.rankup.ranks.Rank; +import sh.okx.rankup.ranks.requirements.LastRankRequirements; + +public class LastPrestige extends Prestige { + public LastPrestige(RankupPlugin plugin, String name) { + super(null, plugin, null, name, new LastRankRequirements(), Collections.emptyList(), null, null); + } + + @Override + public boolean isIn(Player player) { + return plugin.getPermissions().inGroup(player.getUniqueId(), rank); + } + + @Override + public boolean hasRequirements(Player player) { + return false; + } + + @Override + public void applyRequirements(Player player) { + } + + @Override + public void runCommands(Player player, Rank next) { + } + + @Override + public boolean isEligible(Player player) { + return true; + } +} diff --git a/src/main/java/sh/okx/rankup/prestige/Prestige.java b/src/main/java/sh/okx/rankup/prestige/Prestige.java index f897e63..b676c72 100644 --- a/src/main/java/sh/okx/rankup/prestige/Prestige.java +++ b/src/main/java/sh/okx/rankup/prestige/Prestige.java @@ -1,74 +1,74 @@ -package sh.okx.rankup.prestige; - -import lombok.EqualsAndHashCode; -import lombok.Getter; -import lombok.ToString; -import org.bukkit.configuration.ConfigurationSection; -import org.bukkit.entity.Player; -import sh.okx.rankup.RankupPlugin; -import sh.okx.rankup.ranks.Rank; -import sh.okx.rankup.ranks.requirements.ListRankRequirements; -import sh.okx.rankup.ranks.requirements.RankRequirements; -import sh.okx.rankup.requirements.Requirement; - -import java.util.List; -import java.util.Set; - -@EqualsAndHashCode(callSuper = true) -@ToString(callSuper = true) -public class Prestige extends Rank { - @Getter - private final String from; - @Getter - private final String to; - - protected Prestige(ConfigurationSection section, RankupPlugin plugin, String next, String rank, RankRequirements requirements, List commands, String from, String to) { - super(section, plugin, next, rank, requirements, commands); - this.from = from; - this.to = to; - } - - public static Prestige deserialize(RankupPlugin plugin, ConfigurationSection section) { - List requirementsList = section.getStringList("requirements"); - Set requirements = plugin.getRequirements().getRequirements(requirementsList); - - return new Prestige(section, plugin, - section.getString("next"), - section.getString("rank"), - new ListRankRequirements(requirements), - section.getStringList("commands"), - section.getString("from"), - section.getString("to")); - } - - @Override - public boolean isIn(Player player) { - // first prestige does not have a rank - boolean inFrom = plugin.getPermissions().inGroup(player.getUniqueId(), from); - if (rank == null && inFrom) { - // not in any other prestiges - for (Prestige prestige : plugin.getPrestiges().getTree()) { - if (prestige != this && prestige.isIn(player)) { - return false; - } - } - return true; - } - - if (rank == null) { - return false; - } - - // subsequent prestiges - boolean inRank = plugin.getPermissions().inGroup(player.getUniqueId(), rank); - if (inRank) { - return true; - } - - return false; - } - - public boolean isEligible(Player player) { - return plugin.getPermissions().inGroup(player.getUniqueId(), from); - } -} +package sh.okx.rankup.prestige; + +import lombok.EqualsAndHashCode; +import lombok.Getter; +import lombok.ToString; +import org.bukkit.configuration.ConfigurationSection; +import org.bukkit.entity.Player; +import sh.okx.rankup.RankupPlugin; +import sh.okx.rankup.ranks.Rank; +import sh.okx.rankup.ranks.requirements.ListRankRequirements; +import sh.okx.rankup.ranks.requirements.RankRequirements; +import sh.okx.rankup.requirements.Requirement; + +import java.util.List; +import java.util.Set; + +@EqualsAndHashCode(callSuper = true) +@ToString(callSuper = true) +public class Prestige extends Rank { + @Getter + private final String from; + @Getter + private final String to; + + protected Prestige(ConfigurationSection section, RankupPlugin plugin, String next, String rank, RankRequirements requirements, List commands, String from, String to) { + super(section, plugin, next, rank, rank, requirements, commands); + this.from = from; + this.to = to; + } + + public static Prestige deserialize(RankupPlugin plugin, ConfigurationSection section) { + List requirementsList = section.getStringList("requirements"); + Set requirements = plugin.getRequirements().getRequirements(requirementsList); + + return new Prestige(section, plugin, + section.getString("next"), + section.getString("rank"), + new ListRankRequirements(requirements), + section.getStringList("commands"), + section.getString("from"), + section.getString("to")); + } + + @Override + public boolean isIn(Player player) { + // first prestige does not have a rank + boolean inFrom = plugin.getPermissions().inGroup(player.getUniqueId(), from); + if (rank == null && inFrom) { + // not in any other prestiges + for (Prestige prestige : plugin.getPrestiges().getTree()) { + if (prestige != this && prestige.isIn(player)) { + return false; + } + } + return true; + } + + if (rank == null) { + return false; + } + + // subsequent prestiges + boolean inRank = plugin.getPermissions().inGroup(player.getUniqueId(), rank); + if (inRank) { + return true; + } + + return false; + } + + public boolean isEligible(Player player) { + return plugin.getPermissions().inGroup(player.getUniqueId(), from); + } +} diff --git a/src/main/java/sh/okx/rankup/prestige/Prestiges.java b/src/main/java/sh/okx/rankup/prestige/Prestiges.java index ce760e3..8514cff 100644 --- a/src/main/java/sh/okx/rankup/prestige/Prestiges.java +++ b/src/main/java/sh/okx/rankup/prestige/Prestiges.java @@ -1,19 +1,19 @@ -package sh.okx.rankup.prestige; - -import org.bukkit.configuration.file.FileConfiguration; -import sh.okx.rankup.ranks.RankElement; -import sh.okx.rankup.ranks.RankList; -import sh.okx.rankup.RankupPlugin; - -public class Prestiges extends RankList { - public Prestiges(RankupPlugin plugin, FileConfiguration config) { - super(plugin, config, section -> Prestige.deserialize(plugin, section)); - } - - @Override - public void addLastRank(RankupPlugin plugin) { - RankElement last = getTree().last(); - last.setNext(new RankElement<>(new LastPrestige(plugin, last.getRank().getNext()), null)); - } - -} +package sh.okx.rankup.prestige; + +import org.bukkit.configuration.file.FileConfiguration; +import sh.okx.rankup.ranks.RankElement; +import sh.okx.rankup.ranks.RankList; +import sh.okx.rankup.RankupPlugin; + +public class Prestiges extends RankList { + public Prestiges(RankupPlugin plugin, FileConfiguration config) { + super(plugin, config, section -> Prestige.deserialize(plugin, section)); + } + + @Override + protected void addLastRank(RankupPlugin plugin) { + RankElement last = getTree().last(); + last.setNext(new RankElement<>(new LastPrestige(plugin, last.getRank().getNext()), null)); + } + +} diff --git a/src/main/java/sh/okx/rankup/ranks/LastRank.java b/src/main/java/sh/okx/rankup/ranks/LastRank.java index ecfa727..1c9668f 100644 --- a/src/main/java/sh/okx/rankup/ranks/LastRank.java +++ b/src/main/java/sh/okx/rankup/ranks/LastRank.java @@ -1,33 +1,25 @@ -package sh.okx.rankup.ranks; - -import org.bukkit.entity.Player; -import sh.okx.rankup.RankupPlugin; -import sh.okx.rankup.ranks.requirements.LastRankRequirements; -import sh.okx.rankup.requirements.NullRequirement; -import sh.okx.rankup.requirements.Requirement; - -import java.util.Collections; - -public class LastRank extends Rank { - public LastRank(RankupPlugin plugin, String name) { - super(null, plugin, null, name, new LastRankRequirements(), Collections.emptyList()); - } - - @Override - public boolean hasRequirements(Player player) { - return false; - } - - @Override - public Requirement getRequirement(Player player, String name) { - return new NullRequirement(); - } - - @Override - public void applyRequirements(Player player) { - } - - @Override - public void runCommands(Player player) { - } -} +package sh.okx.rankup.ranks; + +import java.util.Collections; +import org.bukkit.entity.Player; +import sh.okx.rankup.RankupPlugin; +import sh.okx.rankup.ranks.requirements.LastRankRequirements; + +public class LastRank extends Rank { + public LastRank(RankupPlugin plugin, String name, String displayName) { + super(null, plugin, null, name, displayName, new LastRankRequirements(), Collections.emptyList()); + } + + @Override + public boolean hasRequirements(Player player) { + return false; + } + + @Override + public void applyRequirements(Player player) { + } + + @Override + public void runCommands(Player player, Rank next) { + } +} diff --git a/src/main/java/sh/okx/rankup/ranks/Rank.java b/src/main/java/sh/okx/rankup/ranks/Rank.java index 83fa9b3..b2f81c9 100644 --- a/src/main/java/sh/okx/rankup/ranks/Rank.java +++ b/src/main/java/sh/okx/rankup/ranks/Rank.java @@ -1,67 +1,69 @@ -package sh.okx.rankup.ranks; - -import lombok.AccessLevel; -import lombok.EqualsAndHashCode; -import lombok.Getter; -import lombok.RequiredArgsConstructor; -import me.clip.placeholderapi.PlaceholderAPI; -import org.bukkit.Bukkit; -import org.bukkit.configuration.ConfigurationSection; -import org.bukkit.entity.Player; -import sh.okx.rankup.RankupPlugin; -import sh.okx.rankup.messages.MessageBuilder; -import sh.okx.rankup.ranks.requirements.RankRequirements; -import sh.okx.rankup.requirements.Requirement; - -import java.util.List; - -@EqualsAndHashCode -@RequiredArgsConstructor(access = AccessLevel.PROTECTED) -public class Rank { - @Getter - protected final ConfigurationSection section; - protected final RankupPlugin plugin; - @Getter - protected final String next; - @Getter - protected final String rank; - @Getter - protected final RankRequirements requirements; - protected final List commands; - - public boolean isIn(Player player) { - return plugin.getPermissions().inGroup(player.getUniqueId(), rank); - } - - public boolean hasRequirements(Player player) { - return requirements.hasRequirements(player); - } - - public Requirement getRequirement(Player player, String name) { - return requirements.getRequirement(player, name); - } - - public void applyRequirements(Player player) { - requirements.applyRequirements(player); - } - - - public void runCommands(Player player) { - for (String command : commands) { - String string = new MessageBuilder(command).replaceRanks(player, this, next).toString(); - if (Bukkit.getPluginManager().isPluginEnabled("PlaceholderAPI")) { - string = PlaceholderAPI.setPlaceholders(player, string); - } - Bukkit.dispatchCommand(Bukkit.getConsoleSender(), string); - } - } - - @Override - public String toString() { - return "Rank{" + - "next='" + next + '\'' + - ", rank='" + rank + '\'' + - ", commands=" + commands + - '}'; - } -} +package sh.okx.rankup.ranks; + +import lombok.AccessLevel; +import lombok.EqualsAndHashCode; +import lombok.Getter; +import lombok.RequiredArgsConstructor; +import me.clip.placeholderapi.PlaceholderAPI; +import org.bukkit.Bukkit; +import org.bukkit.configuration.ConfigurationSection; +import org.bukkit.entity.Player; +import sh.okx.rankup.RankupPlugin; +import sh.okx.rankup.messages.MessageBuilder; +import sh.okx.rankup.ranks.requirements.RankRequirements; +import sh.okx.rankup.requirements.Requirement; + +import java.util.List; + +@EqualsAndHashCode +@RequiredArgsConstructor(access = AccessLevel.PROTECTED) +public class Rank { + @Getter + protected final ConfigurationSection section; + protected final RankupPlugin plugin; + @Getter + protected final String next; + @Getter + protected final String rank; + @Getter + protected final String displayName; + @Getter + protected final RankRequirements requirements; + @Getter + protected final List commands; + + public boolean isIn(Player player) { + return plugin.getPermissions().inGroup(player.getUniqueId(), rank); + } + + public boolean hasRequirements(Player player) { + return requirements.hasRequirements(player); + } + + public Requirement getRequirement(Player player, String name) { + return requirements.getRequirement(player, name); + } + + public void applyRequirements(Player player) { + requirements.applyRequirements(player); + } + + public void runCommands(Player player, Rank next) { + for (String command : commands) { + String string = new MessageBuilder(command).replaceRanks(player, this, next).toString(); + if (Bukkit.getPluginManager().isPluginEnabled("PlaceholderAPI")) { + string = PlaceholderAPI.setPlaceholders(player, string); + } + Bukkit.dispatchCommand(Bukkit.getConsoleSender(), string); + } + } + + @Override + public String toString() { + return "Rank{" + + "next='" + next + '\'' + + ", rank='" + rank + '\'' + + ", commands=" + commands + + '}'; + } +} diff --git a/src/main/java/sh/okx/rankup/ranks/RankList.java b/src/main/java/sh/okx/rankup/ranks/RankList.java index 61478c1..a7d1848 100644 --- a/src/main/java/sh/okx/rankup/ranks/RankList.java +++ b/src/main/java/sh/okx/rankup/ranks/RankList.java @@ -1,125 +1,129 @@ -package sh.okx.rankup.ranks; - -import lombok.Getter; -import org.bukkit.configuration.ConfigurationSection; -import org.bukkit.configuration.file.FileConfiguration; -import org.bukkit.entity.Player; -import sh.okx.rankup.RankupPlugin; - -import java.util.*; -import java.util.function.Function; - -public abstract class RankList { - - protected RankupPlugin plugin; - @Getter - protected FileConfiguration config; - @Getter - private RankTree tree; - - public RankList(RankupPlugin plugin, FileConfiguration config, - Function deserializer) { - this.plugin = plugin; - this.config = config; - List> rankElements = new ArrayList<>(); - for (Map.Entry entry : config.getValues(false).entrySet()) { - ConfigurationSection rankSection = (ConfigurationSection) entry.getValue(); - validateSection(rankSection); - T apply = deserializer.apply(rankSection); - if (apply != null) { - // find next - rankElements.add(findNext(apply, rankElements)); - } - } - - for (RankElement rankElement : rankElements) { - if (rankElement.isRootNode()) { - if (tree == null) { - tree = new RankTree<>(rankElement); - addLastRank(plugin); - } else { - plugin.getLogger().severe("Multiple root rankup nodes detected (a root rankup nodes is a rankup that does not have anything that ranks up to it). This may lead to inconsistent behaviour."); - plugin.getLogger().severe("Conflicting root node: " + rankElement.getRank() + ". Using root node: " + tree.getFirst().getRank()); - } - } - } - } - - public abstract void addLastRank(RankupPlugin plugin); - - private RankElement findNext(T rank, List> rankElements) { - Objects.requireNonNull(rank); - - RankElement currentElement = new RankElement<>(rank, null); - - for (RankElement rankElement : rankElements) { - T rank1 = rankElement.getRank(); - if (rank1.getRank() != null - && rank1.getRank().equalsIgnoreCase(rank.getNext())) { - // current rank element is the next rank - currentElement.setNext(rankElement); - } else if (rank1.getNext() != null - && rank1.getNext().equalsIgnoreCase(rank.getRank())) { - rankElement.setNext(currentElement); - } - } - return currentElement; - } - - protected void validateSection(ConfigurationSection section) { - String name = "'" + section.getName() + "'"; - /*if (section.getConfigurationSection("requirements") != null) { - throw new IllegalArgumentException( - "Rankup/prestige section " + name + " is using the old requirements system.\n" + - "Instead of a configuration section, it is now a list of strings.\n" + - "For example, instead of \"requirements: money: 1000\" you should use \"requirements: - 'money 1000'\"."); - }*/ - Set keys = section.getKeys(false); - if (keys.size() == 1 && keys.iterator().next().equalsIgnoreCase("rank")) { - throw new IllegalArgumentException( - "Having a final rank (for example: \"Z: rank: 'Z'\") from 3.4.2 or earlier should no longer be used.\n" - + - "It is safe to just delete the final rank " + name + ""); - } else if (!section.contains("requirements")) { - throw new IllegalArgumentException("Rank " + name + " does not have any requirements."); - } - } - - public T getFirst() { - return tree.getFirst().getRank(); - } - - public T getByName(String name) { - if (name == null) { - return null; - } - for (T rank : tree) { - if (name.equalsIgnoreCase(rank.getRank())) { - return rank; - } - } - return null; - } - - public RankElement getByPlayer(Player player) { - List> list = tree.asList(); - Collections.reverse(list); - for (RankElement t : list) { - if (t.getRank().isIn(player)) { - return t; - } - } - return null; - } - - public T getRankByPlayer(Player player) { - List> list = tree.asList(); - Collections.reverse(list); - for (RankElement t : list) { - if (t.getRank().isIn(player)) { - return t.getRank(); - } - } - return null; - } -} +package sh.okx.rankup.ranks; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.Set; +import java.util.function.Function; +import lombok.Getter; +import org.bukkit.configuration.ConfigurationSection; +import org.bukkit.configuration.file.FileConfiguration; +import org.bukkit.entity.Player; +import sh.okx.rankup.RankupPlugin; + +public abstract class RankList { + + protected RankupPlugin plugin; + @Getter + protected FileConfiguration config; + @Getter + private RankTree tree; + + public RankList(RankupPlugin plugin, FileConfiguration config, + Function deserializer) { + this.plugin = plugin; + this.config = config; + List> rankElements = new ArrayList<>(); + for (Map.Entry entry : config.getValues(false).entrySet()) { + ConfigurationSection rankSection = (ConfigurationSection) entry.getValue(); + validateSection(rankSection); + T apply = deserializer.apply(rankSection); + if (apply != null) { + // find next + rankElements.add(findNext(apply, rankElements)); + } + } + + for (RankElement rankElement : rankElements) { + if (rankElement.isRootNode()) { + if (tree == null) { + tree = new RankTree<>(rankElement); + addLastRank(plugin); + } else { + plugin.getLogger().severe("Multiple root rankup nodes detected (a root rankup nodes is a rankup that does not have anything that ranks up to it). This may lead to inconsistent behaviour."); + plugin.getLogger().severe("Conflicting root node: " + rankElement.getRank() + ". Using root node: " + tree.getFirst().getRank()); + } + } + } + } + + protected abstract void addLastRank(RankupPlugin plugin); + + private RankElement findNext(T rank, List> rankElements) { + Objects.requireNonNull(rank); + + RankElement currentElement = new RankElement<>(rank, null); + + for (RankElement rankElement : rankElements) { + T rank1 = rankElement.getRank(); + if (rank1.getRank() != null + && rank1.getRank().equalsIgnoreCase(rank.getNext())) { + // current rank element is the next rank + currentElement.setNext(rankElement); + } else if (rank1.getNext() != null + && rank1.getNext().equalsIgnoreCase(rank.getRank())) { + rankElement.setNext(currentElement); + } + } + return currentElement; + } + + protected void validateSection(ConfigurationSection section) { + String name = "'" + section.getName() + "'"; + /*if (section.getConfigurationSection("requirements") != null) { + throw new IllegalArgumentException( + "Rankup/prestige section " + name + " is using the old requirements system.\n" + + "Instead of a configuration section, it is now a list of strings.\n" + + "For example, instead of \"requirements: money: 1000\" you should use \"requirements: - 'money 1000'\"."); + }*/ + Set keys = section.getKeys(false); + if (keys.size() == 1 && keys.iterator().next().equalsIgnoreCase("rank")) { + throw new IllegalArgumentException( + "Having a final rank (for example: \"Z: rank: 'Z'\") from 3.4.2 or earlier should no longer be used.\n" + + + "It is safe to just delete the final rank " + name + ""); + } else if (!section.contains("requirements")) { + throw new IllegalArgumentException("Rank " + name + " does not have any requirements."); + } + } + + public T getFirst() { + return tree.getFirst().getRank(); + } + + public T getByName(String name) { + if (name == null) { + return null; + } + for (T rank : tree) { + if (name.equalsIgnoreCase(rank.getRank())) { + return rank; + } + } + return null; + } + + public RankElement getByPlayer(Player player) { + List> list = tree.asList(); + Collections.reverse(list); + for (RankElement t : list) { + if (t.getRank().isIn(player)) { + return t; + } + } + return null; + } + + public T getRankByPlayer(Player player) { + List> list = tree.asList(); + Collections.reverse(list); + for (RankElement t : list) { + if (t.getRank().isIn(player)) { + return t.getRank(); + } + } + return null; + } +} diff --git a/src/main/java/sh/okx/rankup/ranks/Rankup.java b/src/main/java/sh/okx/rankup/ranks/Rankup.java index 30afebe..cdb1b1e 100644 --- a/src/main/java/sh/okx/rankup/ranks/Rankup.java +++ b/src/main/java/sh/okx/rankup/ranks/Rankup.java @@ -11,6 +11,7 @@ public class Rankup extends Rank { public static Rankup deserialize(RankupPlugin plugin, ConfigurationSection section) { String next = section.getString("next"); String rank = section.getString("rank"); + String displayName = section.getString("display-name"); if (next == null || next.isEmpty()) { plugin.getLogger().warning("Having a final rank (for example: \"Z: rank: 'Z'\") from 3.4.2 or earlier should no longer be used.\n" @@ -23,13 +24,14 @@ public class Rankup extends Rank { plugin, next, rank, + displayName, RankRequirementsFactory.getRequirements(plugin, section), section.getStringList("commands")); } - protected Rankup(ConfigurationSection section, RankupPlugin plugin, String next, String rank, + protected Rankup(ConfigurationSection section, RankupPlugin plugin, String next, String rank, String displayName, RankRequirements requirements, List commands) { - super(section, plugin, next, rank, requirements, commands); + super(section, plugin, next, rank, displayName, requirements, commands); } } diff --git a/src/main/java/sh/okx/rankup/ranks/Rankups.java b/src/main/java/sh/okx/rankup/ranks/Rankups.java index 8038eb8..ebb2c45 100644 --- a/src/main/java/sh/okx/rankup/ranks/Rankups.java +++ b/src/main/java/sh/okx/rankup/ranks/Rankups.java @@ -1,16 +1,22 @@ -package sh.okx.rankup.ranks; - -import org.bukkit.configuration.file.FileConfiguration; -import sh.okx.rankup.RankupPlugin; - -public class Rankups extends RankList { - public Rankups(RankupPlugin plugin, FileConfiguration config) { - super(plugin, config, section -> Rankup.deserialize(plugin, section)); - } - - @Override - public void addLastRank(RankupPlugin plugin) { - RankElement last = getTree().last(); - last.setNext(new RankElement<>(new LastRank(plugin, last.getRank().getNext()), null)); - } -} +package sh.okx.rankup.ranks; + +import org.bukkit.configuration.file.FileConfiguration; +import sh.okx.rankup.RankupPlugin; + +public class Rankups extends RankList { + + public Rankups(RankupPlugin plugin, FileConfiguration config) { + super(plugin, config, section -> Rankup.deserialize(plugin, section)); + } + + @Override + protected void addLastRank(RankupPlugin plugin) { + RankElement last = getTree().last(); + String lastRankDisplayName = plugin.getConfig().getString("placeholders.last-rank-display-name"); + String lastRankName = last.getRank().getNext(); + if (lastRankDisplayName == null) { + lastRankDisplayName = lastRankName; + } + last.setNext(new RankElement<>(new LastRank(plugin, lastRankName, lastRankDisplayName), null)); + } +} diff --git a/src/main/java/sh/okx/rankup/ranksgui/RanksGui.java b/src/main/java/sh/okx/rankup/ranksgui/RanksGui.java index a0abb7b..b041ee2 100644 --- a/src/main/java/sh/okx/rankup/ranksgui/RanksGui.java +++ b/src/main/java/sh/okx/rankup/ranksgui/RanksGui.java @@ -12,6 +12,7 @@ import sh.okx.rankup.RankupPlugin; import sh.okx.rankup.gui.Gui; import sh.okx.rankup.ranks.Rank; import sh.okx.rankup.ranks.RankElement; +import sh.okx.rankup.util.Colour; public class RanksGui { private final RankupPlugin plugin; @@ -38,7 +39,7 @@ public class RanksGui { int offset = get(ConfigurationSection::getInt, "offset", playerPath, basePath, 10); int width = get(ConfigurationSection::getInt, "width", playerPath, basePath, 7); - inventory = Bukkit.createInventory(null, rows * 9, title); + inventory = Bukkit.createInventory(null, rows * 9, Colour.translate(title)); ItemStack fill = get((section, path) -> Gui.getItem(plugin, section.getConfigurationSection(path), player, playerRankElement), "fill", playerPath, basePath, null); diff --git a/src/main/java/sh/okx/rankup/requirements/RequirementRegistry.java b/src/main/java/sh/okx/rankup/requirements/RequirementRegistry.java index 6d790d1..437294a 100644 --- a/src/main/java/sh/okx/rankup/requirements/RequirementRegistry.java +++ b/src/main/java/sh/okx/rankup/requirements/RequirementRegistry.java @@ -1,49 +1,51 @@ -package sh.okx.rankup.requirements; - -import java.util.Collections; -import java.util.HashSet; -import java.util.Objects; -import java.util.Set; - -public class RequirementRegistry { - private final Set requirements = new HashSet<>(); - - public void addRequirement(Requirement requirement) { - requirements.add(requirement); - } - - public void addRequirements(Requirement... requirements) { - Collections.addAll(this.requirements, requirements); - } - - public Requirement newRequirement(String name, String value) { - for (Requirement requirement : requirements) { - if (requirement.getName().equalsIgnoreCase(name)) { - Requirement newRequirement = requirement.clone(); - newRequirement.setValue(value); - return newRequirement; - } - } - return null; - } - - public Set getRequirements(Iterable list) { - Set requirements = new HashSet<>(); - - for (String req : list) { - String[] parts = req.split(" ", 2); - if (parts.length < 2) { - throw new IllegalArgumentException("For requirement: '" + req + "'. Requirements must contain a space between" + - " the name of the requirement and the value of the requirement. If it already looks like it has a space, " + - "make sure it is not a tab or has an invisible character."); - } - - String name = parts[0]; - String value = parts[1]; - Requirement requirement = newRequirement(name, value); - Objects.requireNonNull(requirement, name.equalsIgnoreCase("money") ? "The 'money' requirement is being used but no economy is found" : "Unknown requirement: " + name); - requirements.add(requirement); - } - return requirements; - } -} +package sh.okx.rankup.requirements; + +import java.util.Collections; +import java.util.HashSet; +import java.util.Objects; +import java.util.Set; + +public class RequirementRegistry { + private final Set requirements = new HashSet<>(); + + @Deprecated + public void addRequirement(Requirement requirement) { + requirements.add(requirement); + } + + public void addRequirements(Requirement requirement, Requirement... requirements) { + this.requirements.add(requirement); + Collections.addAll(this.requirements, requirements); + } + + public Requirement newRequirement(String name, String value) { + for (Requirement requirement : requirements) { + if (requirement.getName().equalsIgnoreCase(name)) { + Requirement newRequirement = requirement.clone(); + newRequirement.setValue(value); + return newRequirement; + } + } + return null; + } + + public Set getRequirements(Iterable list) { + Set requirements = new HashSet<>(); + + for (String req : list) { + String[] parts = req.split(" ", 2); + if (parts.length < 2) { + throw new IllegalArgumentException("For requirement: '" + req + "'. Requirements must contain a space between" + + " the name of the requirement and the value of the requirement. If it already looks like it has a space, " + + "make sure it is not a tab or has an invisible character."); + } + + String name = parts[0]; + String value = parts[1]; + Requirement requirement = newRequirement(name, value); + Objects.requireNonNull(requirement, name.equalsIgnoreCase("money") ? "The 'money' requirement is being used but no economy is found" : "Unknown requirement: " + name); + requirements.add(requirement); + } + return requirements; + } +} 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 6c9ea63..b727e6e 100644 --- a/src/main/java/sh/okx/rankup/requirements/requirement/PlaceholderRequirement.java +++ b/src/main/java/sh/okx/rankup/requirements/requirement/PlaceholderRequirement.java @@ -1,90 +1,90 @@ -package sh.okx.rankup.requirements.requirement; - -import me.clip.placeholderapi.PlaceholderAPI; -import org.bukkit.entity.Player; -import sh.okx.rankup.RankupPlugin; -import sh.okx.rankup.requirements.ProgressiveRequirement; -import sh.okx.rankup.requirements.Requirement; - -public class PlaceholderRequirement extends ProgressiveRequirement { - - public static final double DELTA = 0.00001D; - - public PlaceholderRequirement(RankupPlugin plugin) { - super(plugin, "placeholder"); - } - - public PlaceholderRequirement(PlaceholderRequirement clone) { - super(clone); - } - - @Override - public double getProgress(Player player) { - String[] parts = getParts(player); - String parsed = parts[0]; - String value = parts[2]; - - // string operations - switch (parts[1]) { - case "=": - return parsed.equals(value) ? 1 : 0; - } - - // numeric operations - double p = Double.parseDouble(parsed); - double v = Double.parseDouble(value); - switch (parts[1]) { - case ">": - return p > v ? v : 0; - case ">=": - return Math.min(p, v); - case "<": - return p < v ? v : 0; - case "<=": - return p <= v ? 1 : 0; - case "==": - return p == v ? v : 0; - } - throw new IllegalArgumentException("Invalid operation: " + parts[1]); - } - - @Override - public double getTotal(Player player) { - String[] parts = getParts(player); - - if (parts[1].equalsIgnoreCase("=")) { - return 1; - } else { - return Double.parseDouble(parts[2]); - } - } - - 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"); - } - String parsed = PlaceholderAPI.setPlaceholders(player, parts[0]); - if (!PlaceholderAPI.containsPlaceholders(parts[0]) || parsed.equals(parts[0])) { - throw new IllegalArgumentException(parts[0] + " is not a PlaceholderAPI placeholder!"); - } - parts[0] = parsed; - return parts; - } - - @Override - public String getFullName() { - String[] parts = getValueString().split(" "); - return name + "#" + parts[0].replace("%", ""); - } - - @Override - public boolean check(Player player) { - return getRemaining(player) <= 0; - } - - @Override - public Requirement clone() { - return new PlaceholderRequirement(this); - } -} +package sh.okx.rankup.requirements.requirement; + +import me.clip.placeholderapi.PlaceholderAPI; +import org.bukkit.entity.Player; +import sh.okx.rankup.RankupPlugin; +import sh.okx.rankup.requirements.ProgressiveRequirement; +import sh.okx.rankup.requirements.Requirement; + +public class PlaceholderRequirement extends ProgressiveRequirement { + + public static final double DELTA = 0.00001D; + + public PlaceholderRequirement(RankupPlugin plugin) { + super(plugin, "placeholder"); + } + + public PlaceholderRequirement(PlaceholderRequirement clone) { + super(clone); + } + + @Override + public double getProgress(Player player) { + String[] parts = getParts(player); + String parsed = parts[0]; + String value = parts[2]; + + // string operations + switch (parts[1]) { + case "=": + return parsed.equals(value) ? 1 : 0; + } + + // numeric operations + double p = Double.parseDouble(parsed.replace(",", "")); + double v = Double.parseDouble(value.replace(",", "")); + switch (parts[1]) { + case ">": + return p > v ? v : 0; + case ">=": + return Math.min(p, v); + case "<": + return p < v ? v : 0; + case "<=": + return p <= v ? 1 : 0; + case "==": + return p == v ? v : 0; + } + throw new IllegalArgumentException("Invalid operation: " + parts[1]); + } + + @Override + public double getTotal(Player player) { + String[] parts = getParts(player); + + if (parts[1].equalsIgnoreCase("=")) { + return 1; + } else { + return Double.parseDouble(parts[2]); + } + } + + 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"); + } + String parsed = PlaceholderAPI.setPlaceholders(player, parts[0]); + if (!PlaceholderAPI.containsPlaceholders(parts[0]) || parsed.equals(parts[0])) { + throw new IllegalArgumentException(parts[0] + " is not a PlaceholderAPI placeholder!"); + } + parts[0] = parsed; + return parts; + } + + @Override + public String getFullName() { + String[] parts = getValueString().split(" "); + return name + "#" + parts[0].replace("%", ""); + } + + @Override + public boolean check(Player player) { + return getRemaining(player) <= 0; + } + + @Override + public Requirement clone() { + return new PlaceholderRequirement(this); + } +} diff --git a/src/main/java/sh/okx/rankup/requirements/requirement/superbvote/SuperbVoteVotesRequirement.java b/src/main/java/sh/okx/rankup/requirements/requirement/superbvote/SuperbVoteVotesRequirement.java new file mode 100644 index 0000000..47d7253 --- /dev/null +++ b/src/main/java/sh/okx/rankup/requirements/requirement/superbvote/SuperbVoteVotesRequirement.java @@ -0,0 +1,27 @@ +package sh.okx.rankup.requirements.requirement.superbvote; + +import io.minimum.minecraft.superbvote.SuperbVote; +import org.bukkit.entity.Player; +import sh.okx.rankup.RankupPlugin; +import sh.okx.rankup.requirements.ProgressiveRequirement; +import sh.okx.rankup.requirements.Requirement; + +public class SuperbVoteVotesRequirement extends ProgressiveRequirement { + public SuperbVoteVotesRequirement(RankupPlugin plugin) { + super(plugin, "superbvote-votes"); + } + + private SuperbVoteVotesRequirement(Requirement clone) { + super(clone); + } + + @Override + public double getProgress(Player player) { + return SuperbVote.getPlugin().getVoteStorage().getVotes(player.getUniqueId()).getVotes(); + } + + @Override + public Requirement clone() { + return new SuperbVoteVotesRequirement(this); + } +} diff --git a/src/main/java/sh/okx/rankup/util/Colour.java b/src/main/java/sh/okx/rankup/util/Colour.java new file mode 100644 index 0000000..0af5218 --- /dev/null +++ b/src/main/java/sh/okx/rankup/util/Colour.java @@ -0,0 +1,30 @@ +package sh.okx.rankup.util; + +import net.md_5.bungee.api.ChatColor; + +public class Colour { + + private static final char altColorChar = '&'; + + public static String translate(String string) { + StringBuilder result = new StringBuilder(); + char[] b = string.toCharArray(); + for (int i = 0; i < b.length; i++) { + if (b[i] == altColorChar && i < b.length - 1) { + if ("0123456789AaBbCcDdEeFfKkLlMmNnOoRr".indexOf(b[i + 1]) > -1) { + result.append(ChatColor.COLOR_CHAR).append(Character.toLowerCase(b[i + 1])); + i ++; + } else if ('#' == b[i + 1] && i < b.length - 7) { + String hex = string.substring(i + 1, i + 8); + result.append(ChatColor.of(hex)); + i += 7; + } else { + result.append(b[i]); + } + } else { + result.append(b[i]); + } + } + return result.toString(); + } +} diff --git a/src/main/resources/config.yml b/src/main/resources/config.yml index df673c8..beb731f 100644 --- a/src/main/resources/config.yml +++ b/src/main/resources/config.yml @@ -20,7 +20,7 @@ ranks: true # this will also make the command not autocomplete in 1.13 prestiges: true -# whether to enabable the /ranks GUI. +# whether to enable the /ranks GUI. # will override the /ranks command ranks-gui: false @@ -93,6 +93,7 @@ placeholders: complete: "Complete" current: "Current" incomplete: "Incomplete" + last-rank-display-name: "last rank" # what to shorten money by. # ie 1000 -> 1k diff --git a/src/main/resources/plugin.yml b/src/main/resources/plugin.yml index 00887f9..20e5cf7 100644 --- a/src/main/resources/plugin.yml +++ b/src/main/resources/plugin.yml @@ -3,7 +3,7 @@ version: "${version}" main: sh.okx.rankup.RankupPlugin author: Okx depend: [Vault] -softdepend: [PlaceholderAPI, mcMMO, AdvancedAchievements, Towny] +softdepend: [PlaceholderAPI, mcMMO, AdvancedAchievements, Towny, SuperbVote, VotingPlugin] api-version: 1.13 commands: diff --git a/src/test/java/sh/okx/rankup/RankupTest.java b/src/test/java/sh/okx/rankup/RankupTest.java index ba83ad9..012b1f7 100644 --- a/src/test/java/sh/okx/rankup/RankupTest.java +++ b/src/test/java/sh/okx/rankup/RankupTest.java @@ -1,5 +1,8 @@ package sh.okx.rankup; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; + import be.seeseemelk.mockbukkit.MockBukkit; import be.seeseemelk.mockbukkit.ServerMock; import be.seeseemelk.mockbukkit.entity.PlayerMock; @@ -15,9 +18,6 @@ import sh.okx.rankup.messages.Variable; import sh.okx.rankup.ranks.Rank; import sh.okx.rankup.ranks.RankElement; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertTrue; - public class RankupTest { protected GroupProvider groupProvider; protected ServerMock server; @@ -73,7 +73,7 @@ public class RankupTest { plugin.getHelper().rankup(player); - player.assertSaid(plugin.getMessage(Message.NO_RANKUP).replaceRanks(player, plugin.getRankups().getTree().last().getRank().getRank()).toString()); + player.assertSaid(plugin.getMessage(Message.NO_RANKUP).replaceRanks(player, plugin.getRankups().getTree().last().getRank()).toString()); player.assertNoMoreSaid(); }