3.11 update

This commit is contained in:
okx-code
2020-12-24 00:41:27 +00:00
parent 7306e6ecaf
commit bfb2b668f2
29 changed files with 937 additions and 768 deletions
+4 -1
View File
@@ -35,8 +35,11 @@ dependencies {
implementation('com.github.MilkBowl:VaultAPI:1.7') { implementation('com.github.MilkBowl:VaultAPI:1.7') {
exclude group: 'org.bukkit' 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.pyvesb:advanced-achievements:6.7.2'
implementation 'com.github.astei:Superbvote:700fca43659b438cb9bb36c218a7646d2f2ef315'
implementation('com.github.mcMMO-Dev:mcMMO:601297') { implementation('com.github.mcMMO-Dev:mcMMO:601297') {
exclude group: 'com.sk89q.worldguard' exclude group: 'com.sk89q.worldguard'
} }
+13 -6
View File
@@ -3,8 +3,11 @@ package sh.okx.rankup;
import java.util.HashMap; import java.util.HashMap;
import java.util.Map; import java.util.Map;
import java.util.Objects; import java.util.Objects;
import org.bukkit.Bukkit;
import org.bukkit.configuration.ConfigurationSection; import org.bukkit.configuration.ConfigurationSection;
import org.bukkit.entity.Player; 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.hook.GroupProvider;
import sh.okx.rankup.messages.Message; import sh.okx.rankup.messages.Message;
import sh.okx.rankup.messages.Variable; import sh.okx.rankup.messages.Variable;
@@ -40,7 +43,9 @@ public class RankupHelper {
} }
permissions.addGroup(player.getUniqueId(), rank.getNext().getRank().getRank()); 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> rank) { public void sendRankupMessages(Player player, RankElement<Rank> rank) {
@@ -65,7 +70,9 @@ public class RankupHelper {
} }
permissions.addGroup(player.getUniqueId(), prestige.getNext().getRank().getRank()); 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> prestige) { public void sendPrestigeMessages(Player player, RankElement<Prestige> prestige) {
@@ -95,7 +102,7 @@ public class RankupHelper {
plugin plugin
.getMessage(rank, secondsLeft > 1 ? Message.COOLDOWN_PLURAL : Message.COOLDOWN_SINGULAR) .getMessage(rank, secondsLeft > 1 ? Message.COOLDOWN_PLURAL : Message.COOLDOWN_SINGULAR)
.failIfEmpty() .failIfEmpty()
.replaceRanks(player, rank.getRank()) .replaceRanks(player, rank)
.replaceFromTo(rank) .replaceFromTo(rank)
.replace(Variable.SECONDS, cooldownSeconds) .replace(Variable.SECONDS, cooldownSeconds)
.replace(Variable.SECONDS_LEFT, secondsLeft) .replace(Variable.SECONDS_LEFT, secondsLeft)
@@ -153,7 +160,7 @@ public class RankupHelper {
Prestiges prestiges = plugin.getPrestiges(); Prestiges prestiges = plugin.getPrestiges();
plugin.getMessage(prestiges == null || !prestiges.getByPlayer(player).hasNext() ? Message.NO_RANKUP : Message.MUST_PRESTIGE) plugin.getMessage(prestiges == null || !prestiges.getByPlayer(player).hasNext() ? Message.NO_RANKUP : Message.MUST_PRESTIGE)
.failIf(!message) .failIf(!message)
.replaceRanks(player, rankups.getTree().last().getRank().getRank()) .replaceRanks(player, rankups.getTree().last().getRank())
.send(player); .send(player);
return false; return false;
} else if (!rank.hasRequirements(player)) { // check if they can afford it } 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 } else if (!prestigeElement.hasNext()) { // check if they are at the highest rank
plugin.getMessage(prestigeElement.getRank(), Message.PRESTIGE_NO_PRESTIGE) plugin.getMessage(prestigeElement.getRank(), Message.PRESTIGE_NO_PRESTIGE)
.failIf(!message) .failIf(!message)
.replaceRanks(player, prestigeElement.getRank().getRank()) .replaceRanks(player, prestigeElement.getRank())
.replaceFromTo(prestigeElement.getRank()) .replaceFromTo(prestigeElement.getRank())
.send(player); .send(player);
return false; return false;
@@ -208,7 +215,7 @@ public class RankupHelper {
plugin.replaceMoneyRequirements( plugin.replaceMoneyRequirements(
plugin.getMessage(prestigeElement.getRank(), Message.PRESTIGE_REQUIREMENTS_NOT_MET) plugin.getMessage(prestigeElement.getRank(), Message.PRESTIGE_REQUIREMENTS_NOT_MET)
.failIf(!message) .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()) .replaceFromTo(prestigeElement.getRank())
.send(player); .send(player);
return false; return false;
@@ -29,6 +29,7 @@ import sh.okx.rankup.commands.RankupCommand;
import sh.okx.rankup.economy.Economy; import sh.okx.rankup.economy.Economy;
import sh.okx.rankup.economy.EconomyProvider; import sh.okx.rankup.economy.EconomyProvider;
import sh.okx.rankup.economy.VaultEconomyProvider; import sh.okx.rankup.economy.VaultEconomyProvider;
import sh.okx.rankup.events.RankupRegisterEvent;
import sh.okx.rankup.gui.Gui; import sh.okx.rankup.gui.Gui;
import sh.okx.rankup.gui.GuiListener; import sh.okx.rankup.gui.GuiListener;
import sh.okx.rankup.hook.GroupProvider; 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.advancedachievements.AdvancedAchievementsTotalRequirement;
import sh.okx.rankup.requirements.requirement.mcmmo.McMMOPowerLevelRequirement; import sh.okx.rankup.requirements.requirement.mcmmo.McMMOPowerLevelRequirement;
import sh.okx.rankup.requirements.requirement.mcmmo.McMMOSkillRequirement; 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.TokensDeductibleRequirement;
import sh.okx.rankup.requirements.requirement.tokenmanager.TokensRequirement; import sh.okx.rankup.requirements.requirement.tokenmanager.TokensRequirement;
import sh.okx.rankup.requirements.requirement.towny.TownyKingNumberResidentsRequirement; import sh.okx.rankup.requirements.requirement.towny.TownyKingNumberResidentsRequirement;
@@ -406,6 +408,9 @@ public class RankupPlugin extends JavaPlugin {
new TokensRequirement(this, "tokenmanager-tokensh"), new TokensRequirement(this, "tokenmanager-tokensh"),
new TokensDeductibleRequirement(this, "tokenmanager-tokens")); new TokensDeductibleRequirement(this, "tokenmanager-tokens"));
} }
if (Bukkit.getPluginManager().isPluginEnabled("SuperbVotes")) {
requirements.addRequirements(new SuperbVoteVotesRequirement(this));
}
} }
private void setupEconomy() { private void setupEconomy() {
economy = economyProvider.getEconomy(); economy = economyProvider.getEconomy();
@@ -521,7 +526,7 @@ public class RankupPlugin extends JavaPlugin {
} }
return replaceMoneyRequirements(getMessage(oldRank, message) return replaceMoneyRequirements(getMessage(oldRank, message)
.replaceRanks(player, rankName.getRank()) .replaceRanks(player, rankName)
.replace(Variable.OLD_RANK, oldRankName), player, oldRank) .replace(Variable.OLD_RANK, oldRankName), player, oldRank)
.replaceFromTo(oldRank); .replaceFromTo(oldRank);
} }
@@ -535,7 +540,7 @@ public class RankupPlugin extends JavaPlugin {
} else { } else {
builder = getMessage(rank, type) builder = getMessage(rank, type)
.failIfEmpty() .failIfEmpty()
.replaceRanks(sender, rank.getRank()) .replaceRanks(sender, rank)
.replaceFromTo(rank); .replaceFromTo(rank);
} }
builder.send(sender); builder.send(sender);
@@ -1,5 +1,10 @@
package sh.okx.rankup.commands; 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.Bukkit;
import org.bukkit.ChatColor; import org.bukkit.ChatColor;
import org.bukkit.command.Command; 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.ranks.Rankups;
import sh.okx.rankup.util.UpdateNotifier; import sh.okx.rankup.util.UpdateNotifier;
import java.util.*;
public class InfoCommand implements TabExecutor { public class InfoCommand implements TabExecutor {
private final RankupPlugin plugin; private final RankupPlugin plugin;
@@ -130,7 +133,7 @@ public class InfoCommand implements TabExecutor {
if (plugin.getRankups().getFirst().equals(currentRank)) { if (plugin.getRankups().getFirst().equals(currentRank)) {
sender.sendMessage(ChatColor.YELLOW + "That player is in the first rank and cannot be ranked down."); sender.sendMessage(ChatColor.YELLOW + "That player is in the first rank and cannot be ranked down.");
return true;
} }
RankElement<Rank> prevRankElement = plugin.getRankups().getTree().getFirst(); RankElement<Rank> prevRankElement = plugin.getRankups().getTree().getFirst();
@@ -140,6 +143,7 @@ public class InfoCommand implements TabExecutor {
if (!prevRankElement.hasNext()) { if (!prevRankElement.hasNext()) {
sender.sendMessage(ChatColor.YELLOW + "Could not match previous rank."); sender.sendMessage(ChatColor.YELLOW + "Could not match previous rank.");
return true;
} }
Rank prevRank = prevRankElement.getRank(); Rank prevRank = prevRankElement.getRank();
@@ -214,6 +218,7 @@ public class InfoCommand implements TabExecutor {
ChatColor.GREEN + "/" + label + " forceprestige <player> " + ChatColor.YELLOW ChatColor.GREEN + "/" + label + " forceprestige <player> " + ChatColor.YELLOW
+ "Force a player to prestige, bypassing requirements."); + "Force a player to prestige, bypassing requirements.");
} }
sender.sendMessage(ChatColor.GREEN + "/" + label + " rankdown <player> " + ChatColor.YELLOW + "Force a player to move down one rank.");
} }
if (sender.hasPermission("rankup.checkversion")) { if (sender.hasPermission("rankup.checkversion")) {
@@ -239,7 +244,7 @@ public class InfoCommand implements TabExecutor {
} else if (args.length == 2) { } else if (args.length == 2) {
if (args[0].equalsIgnoreCase("forcerankup") && sender.hasPermission("rankup.force")) { if (args[0].equalsIgnoreCase("forcerankup") && sender.hasPermission("rankup.force")) {
return StringUtil.copyPartialMatches(args[1], players(), new ArrayList<>()); 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<>()); return StringUtil.copyPartialMatches(args[1], players(), new ArrayList<>());
} else if (args[0].equalsIgnoreCase("rankdown") && sender.hasPermission("rankup.force")) { } else if (args[0].equalsIgnoreCase("rankdown") && sender.hasPermission("rankup.force")) {
return StringUtil.copyPartialMatches(args[1], players(), new ArrayList<>()); return StringUtil.copyPartialMatches(args[1], players(), new ArrayList<>());
@@ -12,6 +12,7 @@ import sh.okx.rankup.gui.Gui;
import sh.okx.rankup.messages.Message; import sh.okx.rankup.messages.Message;
import sh.okx.rankup.prestige.Prestige; import sh.okx.rankup.prestige.Prestige;
import sh.okx.rankup.prestige.Prestiges; import sh.okx.rankup.prestige.Prestiges;
import sh.okx.rankup.ranks.Rank;
import sh.okx.rankup.ranks.RankElement; import sh.okx.rankup.ranks.RankElement;
import java.util.Map; import java.util.Map;
@@ -55,7 +56,7 @@ public class PrestigeCommand implements CommandExecutor {
case "text": case "text":
confirming.put(player, System.currentTimeMillis()); confirming.put(player, System.currentTimeMillis());
Prestige next = rankElement.getNext().getRank(); 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) plugin.replaceMoneyRequirements(plugin.getMessage(prestige, Message.PRESTIGE_CONFIRMATION)
.replaceRanks(player, prestige, nextRank), player, prestige) .replaceRanks(player, prestige, nextRank), player, prestige)
@@ -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 <code>RankElement#getNext()</code> to get the prestige
* a player is ranking up to.
*/
@Getter
private final RankElement<Prestige> prestige;
public PlayerPrestigeEvent(RankupPlugin plugin, @NotNull Player who, RankElement<Prestige> prestige) {
super(who);
this.plugin = plugin;
this.prestige = prestige;
}
@Override
public HandlerList getHandlers() {
return handlers;
}
}
@@ -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 <code>RankElement#getNext()</code> to get the rank
* a player is ranking up to.
*/
@Getter
private final RankElement<Rank> rank;
public PlayerRankupEvent(RankupPlugin plugin, @NotNull Player who, RankElement<Rank> rank) {
super(who);
this.plugin = plugin;
this.rank = rank;
}
@Override
public HandlerList getHandlers() {
return handlers;
}
}
@@ -1,38 +1,39 @@
package sh.okx.rankup; package sh.okx.rankup.events;
import lombok.Getter; import lombok.Getter;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import org.bukkit.event.Event; import org.bukkit.event.Event;
import org.bukkit.event.HandlerList; import org.bukkit.event.HandlerList;
import sh.okx.rankup.requirements.Requirement; import sh.okx.rankup.RankupPlugin;
import sh.okx.rankup.requirements.RequirementRegistry; 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. * Called immediately before rankups and prestiges are registered,
* This is used to register custom requirements. * and immediately after the built-in requirements are registered.
* This is called when the plugin is enabled, and when it is reloaded from a command. * 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 { @RequiredArgsConstructor
private static final HandlerList handlers = new HandlerList(); public class RankupRegisterEvent extends Event {
@Getter private static final HandlerList handlers = new HandlerList();
private final RankupPlugin plugin; @Getter
private final RankupPlugin plugin;
public static HandlerList getHandlerList() {
return handlers; public static HandlerList getHandlerList() {
} return handlers;
}
public RequirementRegistry getRequirementRegistry() {
return plugin.getRequirements(); public RequirementRegistry getRequirementRegistry() {
} return plugin.getRequirements();
}
public void addRequirement(Requirement requirement) {
plugin.getRequirements().addRequirement(requirement); public void addRequirement(Requirement requirement, Requirement... requirements) {
} plugin.getRequirements().addRequirements(requirement, requirements);
}
@Override
public HandlerList getHandlers() { @Override
return handlers; public HandlerList getHandlers() {
} return handlers;
} }
}
+6 -4
View File
@@ -21,6 +21,7 @@ import sh.okx.rankup.messages.MessageBuilder;
import sh.okx.rankup.prestige.Prestige; import sh.okx.rankup.prestige.Prestige;
import sh.okx.rankup.ranks.Rank; import sh.okx.rankup.ranks.Rank;
import sh.okx.rankup.ranks.RankElement; import sh.okx.rankup.ranks.RankElement;
import sh.okx.rankup.util.Colour;
import sh.okx.rankup.util.ItemUtil; import sh.okx.rankup.util.ItemUtil;
@RequiredArgsConstructor(access = AccessLevel.PRIVATE) @RequiredArgsConstructor(access = AccessLevel.PRIVATE)
@@ -62,10 +63,10 @@ public class Gui implements InventoryHolder {
gui.cancel = cancel; gui.cancel = cancel;
Inventory inventory = Bukkit.createInventory(gui, items.length, 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) plugin.getMessage(oldRank, gui.prestige ? Message.PRESTIGE_TITLE : Message.TITLE)
.replaceRanks(player, oldRank, rank) .replaceRanks(player, oldRank, rank)
.replaceFromTo(oldRank), player, oldRank).toString()))); .replaceFromTo(oldRank), player, oldRank).toString()));
inventory.setContents(items); inventory.setContents(items);
gui.inventory = inventory; gui.inventory = inventory;
return gui; return gui;
@@ -75,7 +76,8 @@ public class Gui implements InventoryHolder {
if (element == null) { if (element == null) {
return getItem(plugin, section, player, null, null); return getItem(plugin, section, player, null, null);
} else { } else {
return getItem(plugin, section, player, element.getRank(), element.getNext().getRank()); RankElement<Rank> 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) { if (oldRank != null && rank != null) {
builder = builder.replaceRanks(player, oldRank, rank); 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) { private static void addItem(ItemStack[] items, ConfigurationSection section, ItemStack item) {
@@ -37,7 +37,7 @@ public class GuiListener implements Listener {
Bukkit.getScheduler().runTask(plugin, () -> { Bukkit.getScheduler().runTask(plugin, () -> {
player.closeInventory(); player.closeInventory();
if (gui.isReturnToRanksGui()) { if (gui.isReturnToRanksGui()) {
Bukkit.dispatchCommand(player, "ranksgui"); Bukkit.dispatchCommand(player, "ranks");
} }
}); });
} }
@@ -1,141 +1,156 @@
package sh.okx.rankup.messages; package sh.okx.rankup.messages;
import me.clip.placeholderapi.PlaceholderAPI; import java.util.Objects;
import org.bukkit.Bukkit; import java.util.regex.Matcher;
import org.bukkit.ChatColor; import java.util.regex.Pattern;
import org.bukkit.command.CommandSender; import me.clip.placeholderapi.PlaceholderAPI;
import org.bukkit.configuration.ConfigurationSection; import org.bukkit.Bukkit;
import org.bukkit.entity.Player; import org.bukkit.command.CommandSender;
import sh.okx.rankup.prestige.Prestige; import org.bukkit.configuration.ConfigurationSection;
import sh.okx.rankup.prestige.Prestiges; import org.bukkit.entity.Player;
import sh.okx.rankup.ranks.Rank; import sh.okx.rankup.prestige.Prestige;
import sh.okx.rankup.prestige.Prestiges;
import java.util.Objects; import sh.okx.rankup.ranks.Rank;
import java.util.regex.Matcher; import sh.okx.rankup.util.Colour;
import java.util.regex.Pattern;
public class MessageBuilder {
public class MessageBuilder { private String message;
private String message;
public MessageBuilder(String message) {
public MessageBuilder(String message) { this.message = message;
this.message = message; }
}
public static MessageBuilder of(ConfigurationSection config, Message message) {
public static MessageBuilder of(ConfigurationSection config, Message message) { return MessageBuilder.of(config, message.getName());
return MessageBuilder.of(config, message.getName()); }
}
private static MessageBuilder of(ConfigurationSection config, String message) {
private static MessageBuilder of(ConfigurationSection config, String message) { String string = config.getString(message);
String string = config.getString(message); Objects.requireNonNull(string, "Configuration message '" + message + "' not found!");
Objects.requireNonNull(string, "Configuration message '" + message + "' not found!"); return new MessageBuilder(Colour.translate(string));
return new MessageBuilder(ChatColor.translateAlternateColorCodes('&', string)); }
}
public MessageBuilder replace(Variable variable, Object value) {
public MessageBuilder replace(Variable variable, Object value) { return replace(variable.name(), value);
return replace(variable.name(), value); }
}
public MessageBuilder replace(String name, Object value) {
public MessageBuilder replace(String name, Object value) { if (value == null) {
Pattern pattern = Pattern.compile("\\{" + name + "}", Pattern.CASE_INSENSITIVE); return this;
Matcher matcher = pattern.matcher(message); }
this.message = matcher.replaceAll(String.valueOf(value)); Pattern pattern = Pattern.compile("\\{" + name + "}", Pattern.CASE_INSENSITIVE);
return this; 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); public MessageBuilder replaceFirstPrestige(Rank rank, Prestiges prestiges, String with) {
} if (prestiges != null && prestiges.getFirst().equals(rank)) {
return this; replace(Variable.OLD_RANK, with);
} }
return this;
public MessageBuilder replaceRanks(CommandSender player, String rankName) { }
replace(Variable.PLAYER, player.getName());
replaceRanks(rankName); @Deprecated
return this; public MessageBuilder replaceRanks(CommandSender player, String rankName) {
} replace(Variable.PLAYER, player.getName());
replaceRanks(rankName);
public MessageBuilder replaceRanks(CommandSender player, Rank oldRank, String rankName) { return this;
replace(Variable.PLAYER, player.getName()); }
replaceRanks(oldRank, rankName);
return this; @Deprecated
} public MessageBuilder replaceRanks(CommandSender player, Rank oldRank, String rankName) {
replace(Variable.PLAYER, player.getName());
public MessageBuilder replaceRanks(CommandSender player, Rank oldRank, Rank rank) { replaceRanks(oldRank, rankName);
replace(Variable.PLAYER, player.getName()); return this;
replaceRanks(oldRank, rank); }
return this;
} public MessageBuilder replaceRanks(CommandSender player, Rank rank) {
replace(Variable.PLAYER, player.getName());
public MessageBuilder replaceRanks(String rankName) { replaceRanks(rank);
replace(Variable.RANK, rankName); return this;
return this; }
}
public MessageBuilder replaceRanks(CommandSender player, Rank oldRank, Rank rank) {
public MessageBuilder replaceRanks(Rank rank) { replace(Variable.PLAYER, player.getName());
replace(Variable.RANK, rank.getRank()); replaceRanks(oldRank, rank);
return this; return this;
} }
public MessageBuilder replaceRanks(Rank oldRank, String rankName) { @Deprecated
replaceRanks(rankName); public MessageBuilder replaceRanks(String rankName) {
replace(Variable.OLD_RANK, oldRank.getRank()); replace(Variable.RANK, rankName);
return this; return this;
} }
public MessageBuilder replaceRanks(Rank oldRank, Rank rank) { public MessageBuilder replaceRanks(Rank rank) {
replaceRanks(rank); replace(Variable.RANK, rank.getRank());
replace(Variable.OLD_RANK, oldRank.getRank()); replace(Variable.RANK_NAME, rank.getDisplayName());
return this; return this;
} }
public MessageBuilder replaceFromTo(Rank rank) { @Deprecated
if (rank instanceof Prestige) { public MessageBuilder replaceRanks(Rank oldRank, String rankName) {
Prestige prestige = (Prestige) rank; replaceRanks(rankName);
replace(Variable.FROM, prestige.getFrom()); replace(Variable.OLD_RANK, oldRank.getRank());
replace(Variable.TO, prestige.getTo()); replace(Variable.OLD_RANK_NAME, oldRank.getDisplayName());
} return this;
return this; }
}
public MessageBuilder replaceRanks(Rank oldRank, Rank rank) {
/** replaceRanks(rank);
* Fails the MessageBuilder if the message is empty. replace(Variable.OLD_RANK, oldRank.getRank());
* if this fails, all subsequent calls to that MessageBuilder will do nothing replace(Variable.OLD_RANK_NAME, oldRank.getDisplayName());
* @return a NullMessageBuilder if the message is empty, itself otherwise return this;
*/ }
public MessageBuilder failIfEmpty() {
return failIf(message.isEmpty()); public MessageBuilder replaceFromTo(Rank rank) {
} if (rank instanceof Prestige) {
Prestige prestige = (Prestige) rank;
public MessageBuilder failIf(boolean value) { replace(Variable.FROM, prestige.getFrom());
if (value) { replace(Variable.TO, prestige.getTo());
return new NullMessageBuilder(); }
} else { return this;
return this; }
}
} /**
* Fails the MessageBuilder if the message is empty.
public void send(CommandSender sender) { * if this fails, all subsequent calls to that MessageBuilder will do nothing
String msg = message; * @return a NullMessageBuilder if the message is empty, itself otherwise
if (sender instanceof Player && Bukkit.getPluginManager().isPluginEnabled("PlaceholderAPI")) { */
msg = PlaceholderAPI.setPlaceholders((Player) sender, msg); public MessageBuilder failIfEmpty() {
} return failIf(message.isEmpty());
sender.sendMessage(msg); }
}
public MessageBuilder failIf(boolean value) {
/** if (value) {
* Sends the message to all players return new NullMessageBuilder();
* ie, calls MessageBuilder#send(Player) for all players online, and sends the message in the console. } else {
*/ return this;
public void broadcast() { }
for (Player player : Bukkit.getOnlinePlayers()) { }
send(player);
} public void send(CommandSender sender) {
send(Bukkit.getConsoleSender()); String msg = message;
} if (sender instanceof Player && Bukkit.getPluginManager().isPluginEnabled("PlaceholderAPI")) {
msg = PlaceholderAPI.setPlaceholders((Player) sender, msg);
@Override }
public String toString() { sender.sendMessage(msg);
return message; }
}
} /**
* 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;
}
}
@@ -2,7 +2,9 @@ package sh.okx.rankup.messages;
public enum Variable { public enum Variable {
PLAYER, PLAYER,
OLD_RANK_NAME,
OLD_RANK, OLD_RANK,
RANK_NAME,
RANK, RANK,
FROM, FROM,
TO, TO,
@@ -1,45 +1,41 @@
package sh.okx.rankup.placeholders; package sh.okx.rankup.placeholders;
import lombok.Getter; import java.text.DecimalFormat;
import me.clip.placeholderapi.PlaceholderAPI; import lombok.Getter;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
import sh.okx.rankup.RankupPlugin; import sh.okx.rankup.RankupPlugin;
import java.text.DecimalFormat; public class Placeholders {
private final RankupPlugin plugin;
public class Placeholders { @Getter
private final RankupPlugin plugin; private final DecimalFormat moneyFormat;
@Getter @Getter
private final DecimalFormat moneyFormat; private final DecimalFormat percentFormat;
@Getter @Getter
private final DecimalFormat percentFormat; private final DecimalFormat simpleFormat;
@Getter @Getter
private final DecimalFormat simpleFormat; private RankupExpansion expansion;
@Getter
private RankupExpansion expansion; private RankupPlaceholderExpansion papiExpansion;
private boolean registered;
public Placeholders(RankupPlugin plugin) {
public Placeholders(RankupPlugin plugin) { this.plugin = plugin;
this.plugin = plugin; this.moneyFormat = new DecimalFormat(plugin.getConfig().getString("placeholders.money-format"));
this.moneyFormat = new DecimalFormat(plugin.getConfig().getString("placeholders.money-format")); this.percentFormat = new DecimalFormat(plugin.getConfig().getString("placeholders.percent-format"));
this.percentFormat = new DecimalFormat(plugin.getConfig().getString("placeholders.percent-format")); this.simpleFormat = new DecimalFormat(plugin.getConfig().getString("placeholders.simple-format"));
this.simpleFormat = new DecimalFormat(plugin.getConfig().getString("placeholders.simple-format")); }
}
public void register() {
public void register() { expansion = new RankupExpansion(plugin, this);
expansion = new RankupExpansion(plugin, this); if (Bukkit.getPluginManager().isPluginEnabled("PlaceholderAPI")) {
if (Bukkit.getPluginManager().isPluginEnabled("PlaceholderAPI")) { papiExpansion = new RankupPlaceholderExpansion(plugin, expansion);
RankupPlaceholderExpansion placeholderExpansion = new RankupPlaceholderExpansion(plugin, expansion); papiExpansion.register();
placeholderExpansion.register(); }
registered = true; }
} else {
registered = false; public void unregister() {
} if (papiExpansion != null) {
} papiExpansion.unregister();
}
public void unregister() { }
if (registered) { }
PlaceholderAPI.unregisterPlaceholderHook("rankup");
}
}
}
@@ -1,43 +1,36 @@
package sh.okx.rankup.prestige; package sh.okx.rankup.prestige;
import org.bukkit.entity.Player; import java.util.Collections;
import sh.okx.rankup.RankupPlugin; import org.bukkit.entity.Player;
import sh.okx.rankup.ranks.requirements.LastRankRequirements; import sh.okx.rankup.RankupPlugin;
import sh.okx.rankup.requirements.NullRequirement; import sh.okx.rankup.ranks.Rank;
import sh.okx.rankup.requirements.Requirement; import sh.okx.rankup.ranks.requirements.LastRankRequirements;
import java.util.Collections; public class LastPrestige extends Prestige {
public LastPrestige(RankupPlugin plugin, String name) {
public class LastPrestige extends Prestige { super(null, plugin, null, name, new LastRankRequirements(), Collections.emptyList(), null, null);
public LastPrestige(RankupPlugin plugin, String name) { }
super(null, plugin, null, name, new LastRankRequirements(), Collections.emptyList(), null, null);
} @Override
public boolean isIn(Player player) {
@Override return plugin.getPermissions().inGroup(player.getUniqueId(), rank);
public boolean isIn(Player player) { }
return plugin.getPermissions().inGroup(player.getUniqueId(), rank);
} @Override
public boolean hasRequirements(Player player) {
@Override return false;
public boolean hasRequirements(Player player) { }
return false;
} @Override
public void applyRequirements(Player player) {
@Override }
public Requirement getRequirement(Player player, String name) {
return new NullRequirement(); @Override
} public void runCommands(Player player, Rank next) {
}
@Override
public void applyRequirements(Player player) { @Override
} public boolean isEligible(Player player) {
return true;
@Override }
public void runCommands(Player player) { }
}
@Override
public boolean isEligible(Player player) {
return true;
}
}
@@ -1,74 +1,74 @@
package sh.okx.rankup.prestige; package sh.okx.rankup.prestige;
import lombok.EqualsAndHashCode; import lombok.EqualsAndHashCode;
import lombok.Getter; import lombok.Getter;
import lombok.ToString; import lombok.ToString;
import org.bukkit.configuration.ConfigurationSection; import org.bukkit.configuration.ConfigurationSection;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import sh.okx.rankup.RankupPlugin; import sh.okx.rankup.RankupPlugin;
import sh.okx.rankup.ranks.Rank; import sh.okx.rankup.ranks.Rank;
import sh.okx.rankup.ranks.requirements.ListRankRequirements; import sh.okx.rankup.ranks.requirements.ListRankRequirements;
import sh.okx.rankup.ranks.requirements.RankRequirements; import sh.okx.rankup.ranks.requirements.RankRequirements;
import sh.okx.rankup.requirements.Requirement; import sh.okx.rankup.requirements.Requirement;
import java.util.List; import java.util.List;
import java.util.Set; import java.util.Set;
@EqualsAndHashCode(callSuper = true) @EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true) @ToString(callSuper = true)
public class Prestige extends Rank { public class Prestige extends Rank {
@Getter @Getter
private final String from; private final String from;
@Getter @Getter
private final String to; private final String to;
protected Prestige(ConfigurationSection section, RankupPlugin plugin, String next, String rank, RankRequirements requirements, List<String> commands, String from, String to) { protected Prestige(ConfigurationSection section, RankupPlugin plugin, String next, String rank, RankRequirements requirements, List<String> commands, String from, String to) {
super(section, plugin, next, rank, requirements, commands); super(section, plugin, next, rank, rank, requirements, commands);
this.from = from; this.from = from;
this.to = to; this.to = to;
} }
public static Prestige deserialize(RankupPlugin plugin, ConfigurationSection section) { public static Prestige deserialize(RankupPlugin plugin, ConfigurationSection section) {
List<String> requirementsList = section.getStringList("requirements"); List<String> requirementsList = section.getStringList("requirements");
Set<Requirement> requirements = plugin.getRequirements().getRequirements(requirementsList); Set<Requirement> requirements = plugin.getRequirements().getRequirements(requirementsList);
return new Prestige(section, plugin, return new Prestige(section, plugin,
section.getString("next"), section.getString("next"),
section.getString("rank"), section.getString("rank"),
new ListRankRequirements(requirements), new ListRankRequirements(requirements),
section.getStringList("commands"), section.getStringList("commands"),
section.getString("from"), section.getString("from"),
section.getString("to")); section.getString("to"));
} }
@Override @Override
public boolean isIn(Player player) { public boolean isIn(Player player) {
// first prestige does not have a rank // first prestige does not have a rank
boolean inFrom = plugin.getPermissions().inGroup(player.getUniqueId(), from); boolean inFrom = plugin.getPermissions().inGroup(player.getUniqueId(), from);
if (rank == null && inFrom) { if (rank == null && inFrom) {
// not in any other prestiges // not in any other prestiges
for (Prestige prestige : plugin.getPrestiges().getTree()) { for (Prestige prestige : plugin.getPrestiges().getTree()) {
if (prestige != this && prestige.isIn(player)) { if (prestige != this && prestige.isIn(player)) {
return false; return false;
} }
} }
return true; return true;
} }
if (rank == null) { if (rank == null) {
return false; return false;
} }
// subsequent prestiges // subsequent prestiges
boolean inRank = plugin.getPermissions().inGroup(player.getUniqueId(), rank); boolean inRank = plugin.getPermissions().inGroup(player.getUniqueId(), rank);
if (inRank) { if (inRank) {
return true; return true;
} }
return false; return false;
} }
public boolean isEligible(Player player) { public boolean isEligible(Player player) {
return plugin.getPermissions().inGroup(player.getUniqueId(), from); return plugin.getPermissions().inGroup(player.getUniqueId(), from);
} }
} }
@@ -1,19 +1,19 @@
package sh.okx.rankup.prestige; package sh.okx.rankup.prestige;
import org.bukkit.configuration.file.FileConfiguration; import org.bukkit.configuration.file.FileConfiguration;
import sh.okx.rankup.ranks.RankElement; import sh.okx.rankup.ranks.RankElement;
import sh.okx.rankup.ranks.RankList; import sh.okx.rankup.ranks.RankList;
import sh.okx.rankup.RankupPlugin; import sh.okx.rankup.RankupPlugin;
public class Prestiges extends RankList<Prestige> { public class Prestiges extends RankList<Prestige> {
public Prestiges(RankupPlugin plugin, FileConfiguration config) { public Prestiges(RankupPlugin plugin, FileConfiguration config) {
super(plugin, config, section -> Prestige.deserialize(plugin, section)); super(plugin, config, section -> Prestige.deserialize(plugin, section));
} }
@Override @Override
public void addLastRank(RankupPlugin plugin) { protected void addLastRank(RankupPlugin plugin) {
RankElement<Prestige> last = getTree().last(); RankElement<Prestige> last = getTree().last();
last.setNext(new RankElement<>(new LastPrestige(plugin, last.getRank().getNext()), null)); last.setNext(new RankElement<>(new LastPrestige(plugin, last.getRank().getNext()), null));
} }
} }
+25 -33
View File
@@ -1,33 +1,25 @@
package sh.okx.rankup.ranks; package sh.okx.rankup.ranks;
import org.bukkit.entity.Player; import java.util.Collections;
import sh.okx.rankup.RankupPlugin; import org.bukkit.entity.Player;
import sh.okx.rankup.ranks.requirements.LastRankRequirements; import sh.okx.rankup.RankupPlugin;
import sh.okx.rankup.requirements.NullRequirement; import sh.okx.rankup.ranks.requirements.LastRankRequirements;
import sh.okx.rankup.requirements.Requirement;
public class LastRank extends Rank {
import java.util.Collections; public LastRank(RankupPlugin plugin, String name, String displayName) {
super(null, plugin, null, name, displayName, new LastRankRequirements(), Collections.emptyList());
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 boolean hasRequirements(Player player) {
return false; @Override
} public void applyRequirements(Player player) {
}
@Override
public Requirement getRequirement(Player player, String name) { @Override
return new NullRequirement(); public void runCommands(Player player, Rank next) {
} }
}
@Override
public void applyRequirements(Player player) {
}
@Override
public void runCommands(Player player) {
}
}
+69 -67
View File
@@ -1,67 +1,69 @@
package sh.okx.rankup.ranks; package sh.okx.rankup.ranks;
import lombok.AccessLevel; import lombok.AccessLevel;
import lombok.EqualsAndHashCode; import lombok.EqualsAndHashCode;
import lombok.Getter; import lombok.Getter;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import me.clip.placeholderapi.PlaceholderAPI; import me.clip.placeholderapi.PlaceholderAPI;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
import org.bukkit.configuration.ConfigurationSection; import org.bukkit.configuration.ConfigurationSection;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import sh.okx.rankup.RankupPlugin; import sh.okx.rankup.RankupPlugin;
import sh.okx.rankup.messages.MessageBuilder; import sh.okx.rankup.messages.MessageBuilder;
import sh.okx.rankup.ranks.requirements.RankRequirements; import sh.okx.rankup.ranks.requirements.RankRequirements;
import sh.okx.rankup.requirements.Requirement; import sh.okx.rankup.requirements.Requirement;
import java.util.List; import java.util.List;
@EqualsAndHashCode @EqualsAndHashCode
@RequiredArgsConstructor(access = AccessLevel.PROTECTED) @RequiredArgsConstructor(access = AccessLevel.PROTECTED)
public class Rank { public class Rank {
@Getter @Getter
protected final ConfigurationSection section; protected final ConfigurationSection section;
protected final RankupPlugin plugin; protected final RankupPlugin plugin;
@Getter @Getter
protected final String next; protected final String next;
@Getter @Getter
protected final String rank; protected final String rank;
@Getter @Getter
protected final RankRequirements requirements; protected final String displayName;
protected final List<String> commands; @Getter
protected final RankRequirements requirements;
public boolean isIn(Player player) { @Getter
return plugin.getPermissions().inGroup(player.getUniqueId(), rank); protected final List<String> commands;
}
public boolean isIn(Player player) {
public boolean hasRequirements(Player player) { return plugin.getPermissions().inGroup(player.getUniqueId(), rank);
return requirements.hasRequirements(player); }
}
public boolean hasRequirements(Player player) {
public Requirement getRequirement(Player player, String name) { return requirements.hasRequirements(player);
return requirements.getRequirement(player, name); }
}
public Requirement getRequirement(Player player, String name) {
public void applyRequirements(Player player) { return requirements.getRequirement(player, name);
requirements.applyRequirements(player); }
}
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(); public void runCommands(Player player, Rank next) {
if (Bukkit.getPluginManager().isPluginEnabled("PlaceholderAPI")) { for (String command : commands) {
string = PlaceholderAPI.setPlaceholders(player, string); String string = new MessageBuilder(command).replaceRanks(player, this, next).toString();
} if (Bukkit.getPluginManager().isPluginEnabled("PlaceholderAPI")) {
Bukkit.dispatchCommand(Bukkit.getConsoleSender(), string); string = PlaceholderAPI.setPlaceholders(player, string);
} }
} Bukkit.dispatchCommand(Bukkit.getConsoleSender(), string);
}
@Override }
public String toString() {
return "Rank{" + @Override
"next='" + next + '\'' + public String toString() {
", rank='" + rank + '\'' + return "Rank{" +
", commands=" + commands + "next='" + next + '\'' +
'}'; ", rank='" + rank + '\'' +
} ", commands=" + commands +
} '}';
}
}
+129 -125
View File
@@ -1,125 +1,129 @@
package sh.okx.rankup.ranks; package sh.okx.rankup.ranks;
import lombok.Getter; import java.util.ArrayList;
import org.bukkit.configuration.ConfigurationSection; import java.util.Collections;
import org.bukkit.configuration.file.FileConfiguration; import java.util.List;
import org.bukkit.entity.Player; import java.util.Map;
import sh.okx.rankup.RankupPlugin; import java.util.Objects;
import java.util.Set;
import java.util.*; import java.util.function.Function;
import java.util.function.Function; import lombok.Getter;
import org.bukkit.configuration.ConfigurationSection;
public abstract class RankList<T extends Rank> { import org.bukkit.configuration.file.FileConfiguration;
import org.bukkit.entity.Player;
protected RankupPlugin plugin; import sh.okx.rankup.RankupPlugin;
@Getter
protected FileConfiguration config; public abstract class RankList<T extends Rank> {
@Getter
private RankTree<T> tree; protected RankupPlugin plugin;
@Getter
public RankList(RankupPlugin plugin, FileConfiguration config, protected FileConfiguration config;
Function<ConfigurationSection, T> deserializer) { @Getter
this.plugin = plugin; private RankTree<T> tree;
this.config = config;
List<RankElement<T>> rankElements = new ArrayList<>(); public RankList(RankupPlugin plugin, FileConfiguration config,
for (Map.Entry<String, Object> entry : config.getValues(false).entrySet()) { Function<ConfigurationSection, T> deserializer) {
ConfigurationSection rankSection = (ConfigurationSection) entry.getValue(); this.plugin = plugin;
validateSection(rankSection); this.config = config;
T apply = deserializer.apply(rankSection); List<RankElement<T>> rankElements = new ArrayList<>();
if (apply != null) { for (Map.Entry<String, Object> entry : config.getValues(false).entrySet()) {
// find next ConfigurationSection rankSection = (ConfigurationSection) entry.getValue();
rankElements.add(findNext(apply, rankElements)); validateSection(rankSection);
} T apply = deserializer.apply(rankSection);
} if (apply != null) {
// find next
for (RankElement<T> rankElement : rankElements) { rankElements.add(findNext(apply, rankElements));
if (rankElement.isRootNode()) { }
if (tree == null) { }
tree = new RankTree<>(rankElement);
addLastRank(plugin); for (RankElement<T> rankElement : rankElements) {
} else { if (rankElement.isRootNode()) {
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."); if (tree == null) {
plugin.getLogger().severe("Conflicting root node: " + rankElement.getRank() + ". Using root node: " + tree.getFirst().getRank()); 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<T> findNext(T rank, List<RankElement<T>> rankElements) { }
Objects.requireNonNull(rank);
protected abstract void addLastRank(RankupPlugin plugin);
RankElement<T> currentElement = new RankElement<>(rank, null);
private RankElement<T> findNext(T rank, List<RankElement<T>> rankElements) {
for (RankElement<T> rankElement : rankElements) { Objects.requireNonNull(rank);
T rank1 = rankElement.getRank();
if (rank1.getRank() != null RankElement<T> currentElement = new RankElement<>(rank, null);
&& rank1.getRank().equalsIgnoreCase(rank.getNext())) {
// current rank element is the next rank for (RankElement<T> rankElement : rankElements) {
currentElement.setNext(rankElement); T rank1 = rankElement.getRank();
} else if (rank1.getNext() != null if (rank1.getRank() != null
&& rank1.getNext().equalsIgnoreCase(rank.getRank())) { && rank1.getRank().equalsIgnoreCase(rank.getNext())) {
rankElement.setNext(currentElement); // current rank element is the next rank
} currentElement.setNext(rankElement);
} } else if (rank1.getNext() != null
return currentElement; && rank1.getNext().equalsIgnoreCase(rank.getRank())) {
} rankElement.setNext(currentElement);
}
protected void validateSection(ConfigurationSection section) { }
String name = "'" + section.getName() + "'"; return currentElement;
/*if (section.getConfigurationSection("requirements") != null) { }
throw new IllegalArgumentException(
"Rankup/prestige section " + name + " is using the old requirements system.\n" + protected void validateSection(ConfigurationSection section) {
"Instead of a configuration section, it is now a list of strings.\n" + String name = "'" + section.getName() + "'";
"For example, instead of \"requirements: money: 1000\" you should use \"requirements: - 'money 1000'\"."); /*if (section.getConfigurationSection("requirements") != null) {
}*/ throw new IllegalArgumentException(
Set<String> keys = section.getKeys(false); "Rankup/prestige section " + name + " is using the old requirements system.\n" +
if (keys.size() == 1 && keys.iterator().next().equalsIgnoreCase("rank")) { "Instead of a configuration section, it is now a list of strings.\n" +
throw new IllegalArgumentException( "For example, instead of \"requirements: money: 1000\" you should use \"requirements: - 'money 1000'\".");
"Having a final rank (for example: \"Z: rank: 'Z'\") from 3.4.2 or earlier should no longer be used.\n" }*/
+ Set<String> keys = section.getKeys(false);
"It is safe to just delete the final rank " + name + ""); if (keys.size() == 1 && keys.iterator().next().equalsIgnoreCase("rank")) {
} else if (!section.contains("requirements")) { throw new IllegalArgumentException(
throw new IllegalArgumentException("Rank " + name + " does not have any requirements."); "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")) {
public T getFirst() { throw new IllegalArgumentException("Rank " + name + " does not have any requirements.");
return tree.getFirst().getRank(); }
} }
public T getByName(String name) { public T getFirst() {
if (name == null) { return tree.getFirst().getRank();
return null; }
}
for (T rank : tree) { public T getByName(String name) {
if (name.equalsIgnoreCase(rank.getRank())) { if (name == null) {
return rank; return null;
} }
} for (T rank : tree) {
return null; if (name.equalsIgnoreCase(rank.getRank())) {
} return rank;
}
public RankElement<T> getByPlayer(Player player) { }
List<RankElement<T>> list = tree.asList(); return null;
Collections.reverse(list); }
for (RankElement<T> t : list) {
if (t.getRank().isIn(player)) { public RankElement<T> getByPlayer(Player player) {
return t; List<RankElement<T>> list = tree.asList();
} Collections.reverse(list);
} for (RankElement<T> t : list) {
return null; if (t.getRank().isIn(player)) {
} return t;
}
public T getRankByPlayer(Player player) { }
List<RankElement<T>> list = tree.asList(); return null;
Collections.reverse(list); }
for (RankElement<T> t : list) {
if (t.getRank().isIn(player)) { public T getRankByPlayer(Player player) {
return t.getRank(); List<RankElement<T>> list = tree.asList();
} Collections.reverse(list);
} for (RankElement<T> t : list) {
return null; if (t.getRank().isIn(player)) {
} return t.getRank();
} }
}
return null;
}
}
@@ -11,6 +11,7 @@ public class Rankup extends Rank {
public static Rankup deserialize(RankupPlugin plugin, ConfigurationSection section) { public static Rankup deserialize(RankupPlugin plugin, ConfigurationSection section) {
String next = section.getString("next"); String next = section.getString("next");
String rank = section.getString("rank"); String rank = section.getString("rank");
String displayName = section.getString("display-name");
if (next == null || next.isEmpty()) { 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" 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, plugin,
next, next,
rank, rank,
displayName,
RankRequirementsFactory.getRequirements(plugin, section), RankRequirementsFactory.getRequirements(plugin, section),
section.getStringList("commands")); 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, RankRequirements requirements,
List<String> commands) { List<String> commands) {
super(section, plugin, next, rank, requirements, commands); super(section, plugin, next, rank, displayName, requirements, commands);
} }
} }
+22 -16
View File
@@ -1,16 +1,22 @@
package sh.okx.rankup.ranks; package sh.okx.rankup.ranks;
import org.bukkit.configuration.file.FileConfiguration; import org.bukkit.configuration.file.FileConfiguration;
import sh.okx.rankup.RankupPlugin; import sh.okx.rankup.RankupPlugin;
public class Rankups extends RankList<Rank> { public class Rankups extends RankList<Rank> {
public Rankups(RankupPlugin plugin, FileConfiguration config) {
super(plugin, config, section -> Rankup.deserialize(plugin, section)); public Rankups(RankupPlugin plugin, FileConfiguration config) {
} super(plugin, config, section -> Rankup.deserialize(plugin, section));
}
@Override
public void addLastRank(RankupPlugin plugin) { @Override
RankElement<Rank> last = getTree().last(); protected void addLastRank(RankupPlugin plugin) {
last.setNext(new RankElement<>(new LastRank(plugin, last.getRank().getNext()), null)); RankElement<Rank> 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));
}
}
@@ -12,6 +12,7 @@ import sh.okx.rankup.RankupPlugin;
import sh.okx.rankup.gui.Gui; import sh.okx.rankup.gui.Gui;
import sh.okx.rankup.ranks.Rank; import sh.okx.rankup.ranks.Rank;
import sh.okx.rankup.ranks.RankElement; import sh.okx.rankup.ranks.RankElement;
import sh.okx.rankup.util.Colour;
public class RanksGui { public class RanksGui {
private final RankupPlugin plugin; private final RankupPlugin plugin;
@@ -38,7 +39,7 @@ public class RanksGui {
int offset = get(ConfigurationSection::getInt, "offset", playerPath, basePath, 10); int offset = get(ConfigurationSection::getInt, "offset", playerPath, basePath, 10);
int width = get(ConfigurationSection::getInt, "width", playerPath, basePath, 7); 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); ItemStack fill = get((section, path) -> Gui.getItem(plugin, section.getConfigurationSection(path), player, playerRankElement), "fill", playerPath, basePath, null);
@@ -1,49 +1,51 @@
package sh.okx.rankup.requirements; package sh.okx.rankup.requirements;
import java.util.Collections; import java.util.Collections;
import java.util.HashSet; import java.util.HashSet;
import java.util.Objects; import java.util.Objects;
import java.util.Set; import java.util.Set;
public class RequirementRegistry { public class RequirementRegistry {
private final Set<Requirement> requirements = new HashSet<>(); private final Set<Requirement> requirements = new HashSet<>();
public void addRequirement(Requirement requirement) { @Deprecated
requirements.add(requirement); public void addRequirement(Requirement requirement) {
} requirements.add(requirement);
}
public void addRequirements(Requirement... requirements) {
Collections.addAll(this.requirements, requirements); 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)) { public Requirement newRequirement(String name, String value) {
Requirement newRequirement = requirement.clone(); for (Requirement requirement : requirements) {
newRequirement.setValue(value); if (requirement.getName().equalsIgnoreCase(name)) {
return newRequirement; Requirement newRequirement = requirement.clone();
} newRequirement.setValue(value);
} return newRequirement;
return null; }
} }
return null;
public Set<Requirement> getRequirements(Iterable<String> list) { }
Set<Requirement> requirements = new HashSet<>();
public Set<Requirement> getRequirements(Iterable<String> list) {
for (String req : list) { Set<Requirement> requirements = new HashSet<>();
String[] parts = req.split(" ", 2);
if (parts.length < 2) { for (String req : list) {
throw new IllegalArgumentException("For requirement: '" + req + "'. Requirements must contain a space between" + String[] parts = req.split(" ", 2);
" the name of the requirement and the value of the requirement. If it already looks like it has a space, " + if (parts.length < 2) {
"make sure it is not a tab or has an invisible character."); 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); String name = parts[0];
Objects.requireNonNull(requirement, name.equalsIgnoreCase("money") ? "The 'money' requirement is being used but no economy is found" : "Unknown requirement: " + name); String value = parts[1];
requirements.add(requirement); 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);
return requirements; requirements.add(requirement);
} }
} return requirements;
}
}
@@ -1,90 +1,90 @@
package sh.okx.rankup.requirements.requirement; package sh.okx.rankup.requirements.requirement;
import me.clip.placeholderapi.PlaceholderAPI; import me.clip.placeholderapi.PlaceholderAPI;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import sh.okx.rankup.RankupPlugin; import sh.okx.rankup.RankupPlugin;
import sh.okx.rankup.requirements.ProgressiveRequirement; import sh.okx.rankup.requirements.ProgressiveRequirement;
import sh.okx.rankup.requirements.Requirement; import sh.okx.rankup.requirements.Requirement;
public class PlaceholderRequirement extends ProgressiveRequirement { public class PlaceholderRequirement extends ProgressiveRequirement {
public static final double DELTA = 0.00001D; public static final double DELTA = 0.00001D;
public PlaceholderRequirement(RankupPlugin plugin) { public PlaceholderRequirement(RankupPlugin plugin) {
super(plugin, "placeholder"); super(plugin, "placeholder");
} }
public PlaceholderRequirement(PlaceholderRequirement clone) { public PlaceholderRequirement(PlaceholderRequirement clone) {
super(clone); super(clone);
} }
@Override @Override
public double getProgress(Player player) { public double getProgress(Player player) {
String[] parts = getParts(player); String[] parts = getParts(player);
String parsed = parts[0]; String parsed = parts[0];
String value = parts[2]; String value = parts[2];
// string operations // string operations
switch (parts[1]) { switch (parts[1]) {
case "=": case "=":
return parsed.equals(value) ? 1 : 0; return parsed.equals(value) ? 1 : 0;
} }
// numeric operations // numeric operations
double p = Double.parseDouble(parsed); double p = Double.parseDouble(parsed.replace(",", ""));
double v = Double.parseDouble(value); double v = Double.parseDouble(value.replace(",", ""));
switch (parts[1]) { switch (parts[1]) {
case ">": case ">":
return p > v ? v : 0; return p > v ? v : 0;
case ">=": case ">=":
return Math.min(p, v); return Math.min(p, v);
case "<": case "<":
return p < v ? v : 0; return p < v ? v : 0;
case "<=": case "<=":
return p <= v ? 1 : 0; return p <= v ? 1 : 0;
case "==": case "==":
return p == v ? v : 0; return p == v ? v : 0;
} }
throw new IllegalArgumentException("Invalid operation: " + parts[1]); throw new IllegalArgumentException("Invalid operation: " + parts[1]);
} }
@Override @Override
public double getTotal(Player player) { public double getTotal(Player player) {
String[] parts = getParts(player); String[] parts = getParts(player);
if (parts[1].equalsIgnoreCase("=")) { if (parts[1].equalsIgnoreCase("=")) {
return 1; return 1;
} else { } else {
return Double.parseDouble(parts[2]); return Double.parseDouble(parts[2]);
} }
} }
private String[] getParts(Player player) { private String[] getParts(Player player) {
String[] parts = getValueString().split(" "); String[] parts = getValueString().split(" ");
if (parts.length < 3) { if (parts.length < 3) {
throw new IllegalArgumentException("Placeholder requirements must be in the form %placeholder% <operation> string"); throw new IllegalArgumentException("Placeholder requirements must be in the form %placeholder% <operation> string");
} }
String parsed = PlaceholderAPI.setPlaceholders(player, parts[0]); String parsed = PlaceholderAPI.setPlaceholders(player, parts[0]);
if (!PlaceholderAPI.containsPlaceholders(parts[0]) || parsed.equals(parts[0])) { if (!PlaceholderAPI.containsPlaceholders(parts[0]) || parsed.equals(parts[0])) {
throw new IllegalArgumentException(parts[0] + " is not a PlaceholderAPI placeholder!"); throw new IllegalArgumentException(parts[0] + " is not a PlaceholderAPI placeholder!");
} }
parts[0] = parsed; parts[0] = parsed;
return parts; return parts;
} }
@Override @Override
public String getFullName() { public String getFullName() {
String[] parts = getValueString().split(" "); String[] parts = getValueString().split(" ");
return name + "#" + parts[0].replace("%", ""); return name + "#" + parts[0].replace("%", "");
} }
@Override @Override
public boolean check(Player player) { public boolean check(Player player) {
return getRemaining(player) <= 0; return getRemaining(player) <= 0;
} }
@Override @Override
public Requirement clone() { public Requirement clone() {
return new PlaceholderRequirement(this); return new PlaceholderRequirement(this);
} }
} }
@@ -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);
}
}
@@ -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();
}
}
+2 -1
View File
@@ -20,7 +20,7 @@ ranks: true
# this will also make the command not autocomplete in 1.13 # this will also make the command not autocomplete in 1.13
prestiges: true prestiges: true
# whether to enabable the /ranks GUI. # whether to enable the /ranks GUI.
# will override the /ranks command # will override the /ranks command
ranks-gui: false ranks-gui: false
@@ -93,6 +93,7 @@ placeholders:
complete: "Complete" complete: "Complete"
current: "Current" current: "Current"
incomplete: "Incomplete" incomplete: "Incomplete"
last-rank-display-name: "last rank"
# what to shorten money by. # what to shorten money by.
# ie 1000 -> 1k # ie 1000 -> 1k
+1 -1
View File
@@ -3,7 +3,7 @@ version: "${version}"
main: sh.okx.rankup.RankupPlugin main: sh.okx.rankup.RankupPlugin
author: Okx author: Okx
depend: [Vault] depend: [Vault]
softdepend: [PlaceholderAPI, mcMMO, AdvancedAchievements, Towny] softdepend: [PlaceholderAPI, mcMMO, AdvancedAchievements, Towny, SuperbVote, VotingPlugin]
api-version: 1.13 api-version: 1.13
commands: commands:
+4 -4
View File
@@ -1,5 +1,8 @@
package sh.okx.rankup; 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.MockBukkit;
import be.seeseemelk.mockbukkit.ServerMock; import be.seeseemelk.mockbukkit.ServerMock;
import be.seeseemelk.mockbukkit.entity.PlayerMock; 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.Rank;
import sh.okx.rankup.ranks.RankElement; import sh.okx.rankup.ranks.RankElement;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
public class RankupTest { public class RankupTest {
protected GroupProvider groupProvider; protected GroupProvider groupProvider;
protected ServerMock server; protected ServerMock server;
@@ -73,7 +73,7 @@ public class RankupTest {
plugin.getHelper().rankup(player); 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(); player.assertNoMoreSaid();
} }