- refactoring
- different requirements based on prestige
This commit is contained in:
okx-code
2020-04-11 01:13:53 +01:00
parent ad2134a77f
commit fe01ce1c4f
22 changed files with 450 additions and 175 deletions
+11 -18
View File
@@ -1,12 +1,5 @@
package sh.okx.rankup;
import lombok.Getter;
import net.milkbowl.vault.permission.Permission;
import org.bukkit.configuration.ConfigurationSection;
import org.bukkit.configuration.file.FileConfiguration;
import org.bukkit.entity.Player;
import sh.okx.rankup.ranks.Rank;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashSet;
@@ -14,6 +7,12 @@ import java.util.List;
import java.util.Map;
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.hook.PermissionProvider;
import sh.okx.rankup.ranks.Rank;
public class RankList<T extends Rank> {
@Getter
@@ -38,18 +37,18 @@ public class RankList<T extends Rank> {
protected void validateSection(ConfigurationSection section) {
String name = "'" + section.getName() + "'";
if (section.getConfigurationSection("requirements") != null) {
/*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<String> 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.getStringList("requirements").isEmpty()) {
} else if (!section.contains("requirements")) {
throw new IllegalArgumentException("Rank " + name + " does not have any requirements.");
}
}
@@ -113,15 +112,9 @@ public class RankList<T extends Rank> {
return list.get(list.size() - 1).getNext();
}
public boolean isLast(Permission perms, Player player) {
public boolean isLast(PermissionProvider perms, Player player) {
String last = getLast();
String[] groups = perms.getPlayerGroups(null, player);
for (String group : groups) {
if (group.equalsIgnoreCase(last)) {
return true;
}
}
return false;
return perms.inGroup(player.getUniqueId(), last);
}
public T next(T rank) {
+10 -11
View File
@@ -1,8 +1,10 @@
package sh.okx.rankup;
import net.milkbowl.vault.permission.Permission;
import java.util.HashMap;
import java.util.Map;
import org.bukkit.configuration.ConfigurationSection;
import org.bukkit.entity.Player;
import sh.okx.rankup.hook.PermissionProvider;
import sh.okx.rankup.messages.Message;
import sh.okx.rankup.messages.Variable;
import sh.okx.rankup.prestige.Prestige;
@@ -10,9 +12,6 @@ import sh.okx.rankup.prestige.Prestiges;
import sh.okx.rankup.ranks.Rank;
import sh.okx.rankup.ranks.Rankups;
import java.util.HashMap;
import java.util.Map;
/**
* Actually performs the ranking up and prestiging for the plugin and also manages the cooldowns
* between ranking up.
@@ -21,7 +20,7 @@ public class RankupHelper {
private final RankupPlugin plugin;
private final ConfigurationSection config;
private final Permission permissions;
private final PermissionProvider permissions;
/**
* Players who cannot rankup/prestige for a certain amount of time.
*/
@@ -37,9 +36,9 @@ public class RankupHelper {
rank.runCommands(player);
if (rank.getRank() != null) {
permissions.playerRemoveGroup(null, player, rank.getRank());
permissions.removeGroup(player.getUniqueId(), rank.getRank());
}
permissions.playerAddGroup(null, player, rank.getNext());
permissions.addGroup(player.getUniqueId(), rank.getNext());
}
public void sendRankupMessages(Player player, Rank rank) {
@@ -56,13 +55,13 @@ public class RankupHelper {
public void doPrestige(Player player, Prestige prestige) {
prestige.runCommands(player);
permissions.playerRemoveGroup(null, player, prestige.getFrom());
permissions.playerAddGroup(null, player, prestige.getTo());
permissions.removeGroup(player.getUniqueId(), prestige.getFrom());
permissions.addGroup(player.getUniqueId(), prestige.getTo());
if (prestige.getRank() != null) {
permissions.playerRemoveGroup(null, player, prestige.getRank());
permissions.removeGroup(player.getUniqueId(), prestige.getRank());
}
permissions.playerAddGroup(null, player, prestige.getNext());
permissions.addGroup(player.getUniqueId(), prestige.getNext());
}
public void sendPrestigeMessages(Player player, Prestige prestige) {
+26 -31
View File
@@ -1,8 +1,13 @@
package sh.okx.rankup;
import java.io.File;
import java.text.DecimalFormat;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.function.Supplier;
import lombok.Getter;
import net.milkbowl.vault.economy.Economy;
import net.milkbowl.vault.permission.Permission;
import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
import org.bukkit.command.CommandSender;
@@ -23,6 +28,8 @@ import sh.okx.rankup.commands.RanksCommand;
import sh.okx.rankup.commands.RankupCommand;
import sh.okx.rankup.gui.Gui;
import sh.okx.rankup.gui.GuiListener;
import sh.okx.rankup.hook.PermissionManager;
import sh.okx.rankup.hook.PermissionProvider;
import sh.okx.rankup.messages.Message;
import sh.okx.rankup.messages.MessageBuilder;
import sh.okx.rankup.messages.NullMessageBuilder;
@@ -67,17 +74,10 @@ import sh.okx.rankup.requirements.requirement.votingplugin.VotingPluginVotesRequ
import sh.okx.rankup.util.UpdateNotifier;
import sh.okx.rankup.util.VersionChecker;
import java.io.File;
import java.text.DecimalFormat;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.function.Supplier;
public class RankupPlugin extends JavaPlugin {
@Getter
private Permission permissions;
private PermissionProvider permissions;
@Getter
private Economy economy;
/**
@@ -155,7 +155,11 @@ public class RankupPlugin extends JavaPlugin {
public void reload(boolean init) {
errorMessage = null;
if (!setupPermissions()) {
PermissionManager permissionManager = new PermissionManager(this);
permissions = permissionManager.findPermissionProvider();
if (permissions == null) {
errorMessage = "No permission plugin found";
}
setupEconomy();
@@ -215,7 +219,7 @@ public class RankupPlugin extends JavaPlugin {
private void addAll(Map<String, Integer> map, RankList<? extends Rank> ranks) {
for (Rank rank : ranks.ranks) {
for (Requirement requirement : rank.getRequirements()) {
for (Requirement requirement : rank.getRequirements().getRequirements(null)) {
String name = requirement.getName();
map.put(name, map.getOrDefault(name, 0) + 1);
}
@@ -259,10 +263,6 @@ public class RankupPlugin extends JavaPlugin {
registerRequirements();
Bukkit.getPluginManager().callEvent(new RankupRegisterEvent(this));
rankups = new Rankups(this, loadConfig("rankups.yml"));
// check rankups are not in an infinite loop
// rankups.getOrderedList();
if (config.getBoolean("prestige")) {
prestiges = new Prestiges(this, loadConfig("prestiges.yml"));
// prestiges.getOrderedList();
@@ -270,6 +270,12 @@ public class RankupPlugin extends JavaPlugin {
prestiges = null;
}
rankups = new Rankups(this, loadConfig("rankups.yml"));
// check rankups are not in an infinite loop
// rankups.getOrderedList();
} catch (Exception e) {
this.errorMessage = e.getClass().getName() + ": " + e.getMessage();
e.printStackTrace();
@@ -354,17 +360,6 @@ public class RankupPlugin extends JavaPlugin {
new TokensDeductibleRequirement(this, "tokenmanager-tokens"));
}
}
private boolean setupPermissions() {
RegisteredServiceProvider<Permission> rsp = getServer().getServicesManager()
.getRegistration(Permission.class);
if (rsp == null) {
return false;
}
permissions = rsp.getProvider();
return permissions.hasGroupSupport();
}
private void setupEconomy() {
RegisteredServiceProvider<Economy> rsp = getServer().getServicesManager()
.getRegistration(Economy.class);
@@ -392,11 +387,11 @@ public class RankupPlugin extends JavaPlugin {
}
public ConfigurationSection getSection(Rank rank, String path) {
ConfigurationSection messages = rank.getSection();
if (messages == null || !messages.isConfigurationSection(path)) {
ConfigurationSection rankSection = rank.getSection();
if (rankSection == null || !rankSection.isConfigurationSection(path)) {
return this.messages.getConfigurationSection(path);
}
return messages.getConfigurationSection(path);
return rankSection.getConfigurationSection(path);
}
public MessageBuilder getMessage(Rank rank, Message message) {
@@ -417,7 +412,7 @@ public class RankupPlugin extends JavaPlugin {
return builder;
}
Requirement money = rank.getRequirement("money");
Requirement money = rank.getRequirement(sender instanceof Player ? (Player) sender : null, "money");
if (money != null) {
Double amount = null;
if (sender instanceof Player && rank.isIn((Player) sender)) {
@@ -441,7 +436,7 @@ public class RankupPlugin extends JavaPlugin {
public MessageBuilder replaceRequirements(MessageBuilder builder, Player player, Rank rank) {
DecimalFormat simpleFormat = placeholders.getSimpleFormat();
DecimalFormat percentFormat = placeholders.getPercentFormat();
for (Requirement requirement : rank.getRequirements()) {
for (Requirement requirement : rank.getRequirements().getRequirements(player)) {
try {
replaceRequirements(builder, Variable.AMOUNT, requirement,
() -> simpleFormat.format(requirement.getTotal(player)));
+9 -10
View File
@@ -39,16 +39,17 @@ public class Gui implements InventoryHolder {
gui.prestige = oldRank instanceof Prestige;
String type = gui.prestige ? "prestige" : "rankup";
ConfigurationSection config = plugin.getSection(oldRank, type + ".gui");
String basePath = type + ".gui";
ConfigurationSection config = plugin.getSection(oldRank, basePath);
ItemStack[] items = new ItemStack[config.getInt("rows", 1) * 9];
ItemStack fill = getItem(plugin, config, "fill", player, oldRank, rank);
ItemStack cancel = getItem(plugin, config, "cancel", player, oldRank, rank);
ItemStack rankup = getItem(plugin, config, "rankup", player, oldRank, rank);
ItemStack fill = getItem(plugin, plugin.getSection(oldRank, basePath + ".fill"), player, oldRank, rank);
ItemStack cancel = getItem(plugin, plugin.getSection(oldRank, basePath + ".cancel"), player, oldRank, rank);
ItemStack rankup = getItem(plugin, plugin.getSection(oldRank, basePath + ".rankup"), player, oldRank, rank);
addItem(items, config.getConfigurationSection("rankup"), rankup);
addItem(items, config.getConfigurationSection("cancel"), cancel);
addItem(items, config.getConfigurationSection("fill"), fill);
addItem(items, plugin.getSection(oldRank, basePath + ".rankup"), rankup);
addItem(items, plugin.getSection(oldRank, basePath + ".cancel"), cancel);
addItem(items, plugin.getSection(oldRank, basePath + ".fill"), fill);
gui.rankup = rankup;
gui.cancel = cancel;
@@ -64,9 +65,7 @@ public class Gui implements InventoryHolder {
}
@SuppressWarnings("deprecation")
private static ItemStack getItem(RankupPlugin plugin, ConfigurationSection parent, String name, Player player, Rank oldRank, String rank) {
ConfigurationSection section = parent.getConfigurationSection(name);
private static ItemStack getItem(RankupPlugin plugin, ConfigurationSection section, Player player, Rank oldRank, String rank) {
String materialName = section.getString("material").toUpperCase();
ItemStack item;
@@ -0,0 +1,30 @@
package sh.okx.rankup.hook;
import net.milkbowl.vault.permission.Permission;
import org.bukkit.plugin.RegisteredServiceProvider;
import sh.okx.rankup.RankupPlugin;
public class PermissionManager {
private final RankupPlugin plugin;
public PermissionManager(RankupPlugin plugin) {
this.plugin = plugin;
}
public PermissionProvider findPermissionProvider() {
return getVaultPermissionProvider();
}
private PermissionProvider getVaultPermissionProvider() {
RegisteredServiceProvider<Permission> rsp = plugin.getServer().getServicesManager()
.getRegistration(Permission.class);
if (rsp == null) {
return null;
}
Permission provider = rsp.getProvider();
if (!provider.hasGroupSupport()) {
return null;
}
return new VaultPermissionProvider(provider);
}
}
@@ -0,0 +1,9 @@
package sh.okx.rankup.hook;
import java.util.UUID;
public interface PermissionProvider {
boolean inGroup(UUID uuid, String group);
void addGroup(UUID uuid, String group);
void removeGroup(UUID uuid, String group);
}
@@ -0,0 +1,44 @@
package sh.okx.rankup.hook;
import java.util.Objects;
import java.util.UUID;
import net.milkbowl.vault.permission.Permission;
import org.bukkit.Bukkit;
public class VaultPermissionProvider implements PermissionProvider {
private final Permission permission;
public VaultPermissionProvider(Permission permission) {
this.permission = permission;
}
@Override
public boolean inGroup(UUID uuid, String group) {
Objects.requireNonNull(uuid);
Objects.requireNonNull(group);
String[] playerGroups = permission.getPlayerGroups(null, Bukkit.getOfflinePlayer(uuid));
for (String playerGroup : playerGroups) {
if (group.equalsIgnoreCase(playerGroup)) {
return true;
}
}
return false;
}
@Override
public void addGroup(UUID uuid, String group) {
Objects.requireNonNull(uuid);
Objects.requireNonNull(group);
permission.playerAddGroup(null, Bukkit.getOfflinePlayer(uuid), group);
}
@Override
public void removeGroup(UUID uuid, String group) {
Objects.requireNonNull(uuid);
Objects.requireNonNull(group);
permission.playerRemoveGroup(null, Bukkit.getOfflinePlayer(uuid), group);
}
}
@@ -9,7 +9,7 @@ public enum Message {
SUCCESS_PUBLIC("rankup.success-public"),
SUCCESS_PRIVATE("rankup.success-private"),
CONFIRMATION("rankup.confirmation"),
TITLE("rankup.title"),
TITLE("rankup.gui.title"),
RANKS_HEADER("rankup.list.header"),
RANKS_FOOTER("rankup.list.footer"),
RANKS_COMPLETE("rankup.list.complete"),
@@ -22,7 +22,7 @@ public enum Message {
PRESTIGES_COMPLETE("prestige.list.complete"),
PRESTIGES_CURRENT("prestige.list.current"),
PRESTIGES_INCOMPLETE("prestige.list.incomplete"),
PRESTIGE_TITLE("prestige.title"),
PRESTIGE_TITLE("prestige.gui.title"),
COOLDOWN_SINGULAR("rankup.cooldown.singular"),
COOLDOWN_PLURAL("rankup.cooldown.plural"),
MUST_PRESTIGE("rankup.must-prestige"),
@@ -49,7 +49,7 @@ public class RankupExpansion extends PlaceholderExpansion {
// return placeholders.getSimpleFormat().format(orElse(rankups.getByName(parts[2]).getRequirement(parts[3]), Requirement::getValueDouble, 0));
} else if (params.startsWith("rank_money_")) {
String[] parts = params.split("_", 4);
double amount = Objects.requireNonNull(rankups.getByName(parts[2]), "Rankup " + parts[2] + " does not exist").getRequirement("money").getValueDouble();
double amount = Objects.requireNonNull(rankups.getByName(parts[2]), "Rankup " + parts[2] + " does not exist").getRequirement(player, "money").getValueDouble();
if (parts.length > 3 && parts[3].equalsIgnoreCase("left")) {
amount = amount - plugin.getEconomy().getBalance(player);
}
@@ -74,10 +74,10 @@ public class RankupExpansion extends PlaceholderExpansion {
return orElse(prestige, Prestige::getNext, prestiges.getFirst().getNext());
case "prestige_money":
requirePrestiging(prestiges, params);
return String.valueOf(simplify(orElse(prestige, r -> r.isIn(player) ? r.getRequirement("money").getValueDouble() : 0, 0)));
return String.valueOf(simplify(orElse(prestige, r -> r.isIn(player) ? r.getRequirement(player, "money").getValueDouble() : 0, 0)));
case "prestige_money_formatted":
requirePrestiging(prestiges, params);
return plugin.formatMoney(orElse(prestige, r -> r.isIn(player) ? r.getRequirement("money").getValueDouble() : 0, 0D));
return plugin.formatMoney(orElse(prestige, r -> r.isIn(player) ? r.getRequirement(player, "money").getValueDouble() : 0, 0D));
case "current_rank":
if (rankups.isLast(plugin.getPermissions(), player)) {
return rankups.getLast();
@@ -92,32 +92,32 @@ public class RankupExpansion extends PlaceholderExpansion {
}
return orElsePlaceholder(rank, r -> orElsePlaceholder(rank, Rank::getNext, "highest-rank"), "not-in-ladder");
case "money":
return String.valueOf(getMoney(rank));
return String.valueOf(getMoney(player, rank));
case "money_formatted":
return plugin.formatMoney(getMoney(rank).doubleValue());
return plugin.formatMoney(getMoney(player, rank).doubleValue());
case "money_left":
return String.valueOf(Math.max(0, orElse(rank, r -> simplify(plugin.getEconomy().getBalance(player) - r.getRequirement("money").getValueDouble()), 0).doubleValue()));
return String.valueOf(Math.max(0, orElse(rank, r -> simplify(plugin.getEconomy().getBalance(player) - r.getRequirement(player, "money").getValueDouble()), 0).doubleValue()));
case "money_left_formatted":
return plugin.formatMoney(Math.max(0D, orElse(rank, r -> plugin.getEconomy().getBalance(player) - r.getRequirement("money").getValueDouble(), 0D)));
return plugin.formatMoney(Math.max(0D, orElse(rank, r -> plugin.getEconomy().getBalance(player) - r.getRequirement(player, "money").getValueDouble(), 0D)));
case "percent_left":
return String.valueOf(Math.max(0D, orElse(rank, r -> (1 - (plugin.getEconomy().getBalance(player) / r.getRequirement("money").getValueDouble())) * 100, 0).doubleValue()));
return String.valueOf(Math.max(0D, orElse(rank, r -> (1 - (plugin.getEconomy().getBalance(player) / r.getRequirement(player, "money").getValueDouble())) * 100, 0).doubleValue()));
case "percent_left_formatted":
return placeholders.getPercentFormat().format(Math.max(0D, orElse(rank, r -> (1 - (plugin.getEconomy().getBalance(player) / r.getRequirement("money").getValueDouble())) * 100, 0).doubleValue()));
return placeholders.getPercentFormat().format(Math.max(0D, orElse(rank, r -> (1 - (plugin.getEconomy().getBalance(player) / r.getRequirement(player, "money").getValueDouble())) * 100, 0).doubleValue()));
case "percent_done":
return String.valueOf(Math.min(100D, orElse(rank, r -> (plugin.getEconomy().getBalance(player) / r.getRequirement("money").getValueDouble()) * 100, 0).doubleValue()));
return String.valueOf(Math.min(100D, orElse(rank, r -> (plugin.getEconomy().getBalance(player) / r.getRequirement(player, "money").getValueDouble()) * 100, 0).doubleValue()));
case "percent_done_formatted":
return placeholders.getPercentFormat().format(Math.min(100D, orElse(rank, r -> (plugin.getEconomy().getBalance(player) / r.getRequirement("money").getValueDouble()) * 100, 0).doubleValue()));
return placeholders.getPercentFormat().format(Math.min(100D, orElse(rank, r -> (plugin.getEconomy().getBalance(player) / r.getRequirement(player, "money").getValueDouble()) * 100, 0).doubleValue()));
case "prestige_percent_left_formatted":
return placeholders.getPercentFormat().format(Math.max(0D, orElse(prestige, r -> (1 - (plugin.getEconomy().getBalance(player) / r.getRequirement("money").getValueDouble())) * 100, 0).doubleValue()));
return placeholders.getPercentFormat().format(Math.max(0D, orElse(prestige, r -> (1 - (plugin.getEconomy().getBalance(player) / r.getRequirement(player, "money").getValueDouble())) * 100, 0).doubleValue()));
case "prestige_percent_done_formatted":
return placeholders.getPercentFormat().format(Math.min(100D, orElse(prestige, r -> (plugin.getEconomy().getBalance(player) / r.getRequirement("money").getValueDouble()) * 100, 0).doubleValue()));
return placeholders.getPercentFormat().format(Math.min(100D, orElse(prestige, r -> (plugin.getEconomy().getBalance(player) / r.getRequirement(player, "money").getValueDouble()) * 100, 0).doubleValue()));
default:
return null;
}
}
private Number getMoney(Rank rank) {
return orElse(rank, r -> simplify(r.getRequirement("money").getValueDouble()), 0);
private Number getMoney(Player player, Rank rank) {
return orElse(rank, r -> simplify(r.getRequirement(player, "money").getValueDouble()), 0);
}
private void requirePrestiging(Prestiges prestiges, String params) {
@@ -128,7 +128,7 @@ public class RankupExpansion extends PlaceholderExpansion {
if (rank == null) {
return "";
}
Requirement requirement = rank.getRequirement(requirementName);
Requirement requirement = rank.getRequirement(player, requirementName);
switch (params) {
case "":
return orElse(requirement, Requirement::getValueString, "0");
@@ -7,6 +7,8 @@ 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;
@@ -20,7 +22,7 @@ public class Prestige extends Rank {
@Getter
private final String to;
private Prestige(ConfigurationSection section, RankupPlugin plugin, String next, String rank, Set<Requirement> requirements, List<String> commands, String from, String to) {
private 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);
this.from = from;
this.to = to;
@@ -33,7 +35,7 @@ public class Prestige extends Rank {
return new Prestige(section, plugin,
section.getString("next"),
section.getString("rank"),
requirements,
new ListRankRequirements(requirements),
section.getStringList("commands"),
section.getString("from"),
section.getString("to"));
@@ -41,30 +43,33 @@ public class Prestige extends Rank {
@Override
public boolean isIn(Player player) {
String[] groups = plugin.getPermissions().getPlayerGroups(null, player);
for (String group : groups) {
if (group.equalsIgnoreCase(from) && rank == null) {
for (Prestige prestige : plugin.getPrestiges().getOrderedList()) {
if (prestige != this && prestige.isIn(player)) {
return false;
}
// 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().getOrderedList()) {
if (prestige != this && prestige.isIn(player)) {
return false;
}
return true;
} else if(group.equalsIgnoreCase(rank)) {
return true;
}
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 isEligable(Player player) {
String[] groups = plugin.getPermissions().getPlayerGroups(null, player);
for (String group : groups) {
if (group.equalsIgnoreCase(from)) {
return true;
}
}
return false;
return plugin.getPermissions().inGroup(player.getUniqueId(), from);
}
@Override
+12 -58
View File
@@ -1,6 +1,6 @@
package sh.okx.rankup.ranks;
import java.util.Collections;
import java.util.List;
import lombok.AccessLevel;
import lombok.EqualsAndHashCode;
import lombok.Getter;
@@ -12,12 +12,9 @@ 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.requirements.DeductibleRequirement;
import sh.okx.rankup.ranks.requirements.RankRequirements;
import sh.okx.rankup.requirements.Requirement;
import java.util.List;
import java.util.Set;
@EqualsAndHashCode
@ToString
@RequiredArgsConstructor(access = AccessLevel.PROTECTED)
@@ -30,73 +27,30 @@ public class Rank {
@Getter
protected final String rank;
@Getter
protected final Set<Requirement> requirements;
protected final RankRequirements requirements;
protected final List<String> commands;
public static Rank deserialize(RankupPlugin plugin, ConfigurationSection section) {
List<String> requirementsList;
if (section.isList("requirements")) {
requirementsList = section.getStringList("requirements");
} else {
requirementsList = Collections.singletonList(section.getString("requirements"));
}
Set<Requirement> requirements = plugin.getRequirements().getRequirements(requirementsList);
String next = section.getString("next");
String rank = section.getString("rank");
if (next != null && next.isEmpty()) {
plugin.getLogger().warning("Rankup section '" + section.getName() + "' has a blank 'next' field, will be ignored.");
return null;
}
return new Rank(section, plugin,
next,
rank,
requirements,
section.getStringList("commands"));
}
public boolean hasRequirements(Player player) {
for (Requirement requirement : requirements) {
if (!requirement.check(player)) {
return false;
}
}
return true;
}
public boolean isIn(Player player) {
String[] groups = plugin.getPermissions().getPlayerGroups(null, player);
for (String group : groups) {
if (group.equalsIgnoreCase(rank)) {
return true;
}
}
return false;
return plugin.getPermissions().inGroup(player.getUniqueId(), rank);
}
public boolean isLast() {
return plugin.getRankups().getByName(next) == null;
}
public Requirement getRequirement(String name) {
for (Requirement requirement : requirements) {
if (requirement.getFullName().equalsIgnoreCase(name)) {
return requirement;
}
}
return null;
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) {
for (Requirement requirement : requirements) {
if (requirement instanceof DeductibleRequirement) {
((DeductibleRequirement) requirement).apply(player);
}
}
requirements.applyRequirements(player);
}
public void runCommands(Player player) {
for (String command : commands) {
String string = new MessageBuilder(command).replaceRanks(player, this, next).toString();
@@ -0,0 +1,32 @@
package sh.okx.rankup.ranks;
import java.util.List;
import org.bukkit.configuration.ConfigurationSection;
import sh.okx.rankup.RankupPlugin;
import sh.okx.rankup.ranks.requirements.RankRequirements;
import sh.okx.rankup.ranks.requirements.RankRequirementsFactory;
public class Rankup extends Rank {
public static Rank deserialize(RankupPlugin plugin, ConfigurationSection section) {
String next = section.getString("next");
String rank = section.getString("rank");
if (next != null && next.isEmpty()) {
plugin.getLogger().warning("Rankup section '" + section.getName() + "' has a blank 'next' field, will be ignored.");
return null;
}
return new Rank(section, plugin,
next,
rank,
RankRequirementsFactory.getRequirements(plugin, section),
section.getStringList("commands"));
}
protected Rankup(ConfigurationSection section,
RankupPlugin plugin, String next, String rank,
RankRequirements requirements,
List<String> commands) {
super(section, plugin, next, rank, requirements, commands);
}
}
@@ -6,6 +6,6 @@ import sh.okx.rankup.RankupPlugin;
public class Rankups extends RankList<Rank> {
public Rankups(RankupPlugin plugin, FileConfiguration config) {
super(config, section -> Rank.deserialize(plugin, section));
super(config, section -> Rankup.deserialize(plugin, section));
}
}
@@ -0,0 +1,48 @@
package sh.okx.rankup.ranks.requirements;
import java.util.Set;
import org.bukkit.entity.Player;
import sh.okx.rankup.requirements.DeductibleRequirement;
import sh.okx.rankup.requirements.Requirement;
public class ListRankRequirements implements RankRequirements {
private final Set<Requirement> requirements;
public ListRankRequirements(Set<Requirement> requirements) {
this.requirements = requirements;
}
@Override
public Set<Requirement> getRequirements(Player player) {
return requirements;
}
@Override
public boolean hasRequirements(Player player) {
for (Requirement requirement : requirements) {
if (!requirement.check(player)) {
return false;
}
}
return true;
}
@Override
public Requirement getRequirement(Player player, String name) {
for (Requirement requirement : requirements) {
if (requirement.getFullName().equalsIgnoreCase(name)) {
return requirement;
}
}
return null;
}
@Override
public void applyRequirements(Player player) {
for (Requirement requirement : requirements) {
if (requirement instanceof DeductibleRequirement) {
((DeductibleRequirement) requirement).apply(player);
}
}
}
}
@@ -0,0 +1,63 @@
package sh.okx.rankup.ranks.requirements;
import java.util.Map;
import java.util.Objects;
import java.util.Set;
import org.bukkit.entity.Player;
import sh.okx.rankup.RankupPlugin;
import sh.okx.rankup.prestige.Prestige;
import sh.okx.rankup.prestige.Prestiges;
import sh.okx.rankup.requirements.Requirement;
public class PrestigeListRankRequirements implements RankRequirements {
private final RankupPlugin plugin;
private final RankRequirements defaultRequirements;
private final Map<String, RankRequirements> requirements;
public PrestigeListRankRequirements(RankupPlugin plugin, RankRequirements defaultRequirements, Map<String, RankRequirements> requirements) {
Objects.requireNonNull(plugin);
Objects.requireNonNull(defaultRequirements);
this.plugin = plugin;
this.defaultRequirements = defaultRequirements;
this.requirements = requirements;
}
@Override
public Set<Requirement> getRequirements(Player player) {
return getRankRequirements(player).getRequirements(player);
}
@Override
public boolean hasRequirements(Player player) {
return getRankRequirements(player).hasRequirements(player);
}
@Override
public Requirement getRequirement(Player player, String name) {
return getRankRequirements(player).getRequirement(player, name);
}
@Override
public void applyRequirements(Player player) {
getRankRequirements(player).applyRequirements(player);
}
private RankRequirements getRankRequirements(Player player) {
Prestiges prestiges = plugin.getPrestiges();
if (player == null || prestiges == null) {
return defaultRequirements;
}
for (Prestige prestige : prestiges.getOrderedList()) {
String next = prestige.getNext();
if(plugin.getPermissions().inGroup(player.getUniqueId(), next)) {
RankRequirements rankRequirements = this.requirements.get(next.toLowerCase());
if (rankRequirements != null) {
return rankRequirements;
}
}
}
return defaultRequirements;
}
}
@@ -0,0 +1,13 @@
package sh.okx.rankup.ranks.requirements;
import java.util.Set;
import org.bukkit.entity.Player;
import sh.okx.rankup.requirements.Requirement;
public interface RankRequirements {
Set<Requirement> getRequirements(Player player);
boolean hasRequirements(Player player);
Requirement getRequirement(Player player, String name);
void applyRequirements(Player player);
}
@@ -0,0 +1,72 @@
package sh.okx.rankup.ranks.requirements;
import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
import org.bukkit.configuration.ConfigurationSection;
import sh.okx.rankup.RankupPlugin;
import sh.okx.rankup.requirements.Requirement;
public class RankRequirementsFactory {
private static final String REQUIREMENTS = "requirements";
public static RankRequirements getRequirements(RankupPlugin plugin, ConfigurationSection section) {
if (section.isConfigurationSection(REQUIREMENTS)) {
return getPrestigeListRequirements(plugin, section.getConfigurationSection(REQUIREMENTS));
} else {
return getListRequirements(plugin, getRequirementStrings(section, REQUIREMENTS));
}
}
private static Collection<String> getRequirementStrings(ConfigurationSection section, String key) {
if (section.isList(key)) {
return section.getStringList(key);
} else {
String string = section.getString(key);
if (string == null) {
return null;
} else {
return Collections.singleton(string);
}
}
}
private static Set<Requirement> stringsToRequirements(RankupPlugin plugin, Iterable<String> strings) {
return plugin.getRequirements().getRequirements(strings);
}
private static RankRequirements getListRequirements(RankupPlugin plugin, Iterable<String> list) {
Set<Requirement> requirements = stringsToRequirements(plugin, list);
return new ListRankRequirements(requirements);
}
private static RankRequirements getPrestigeListRequirements(RankupPlugin plugin, ConfigurationSection section) {
if (plugin.getPrestiges() == null) {
// don't know what to do here
return null;
}
RankRequirements defaultRequirements = null;
Map<String, RankRequirements> requirements = new HashMap<>();
for (String key : section.getKeys(false)) {
Collection<String> stringRequirements = getRequirementStrings(section, key);
if (stringRequirements != null) {
RankRequirements rankRequirements = getListRequirements(plugin, stringRequirements);
if ("default".equalsIgnoreCase(key)) {
defaultRequirements = rankRequirements;
} else {
requirements.put(key.toLowerCase(), rankRequirements);
}
}
}
if (defaultRequirements == null) {
throw new IllegalArgumentException("No default requirements set for rank " + section.getParent().getName() + ". See the wiki for info.");
}
return new PrestigeListRankRequirements(plugin, defaultRequirements, requirements);
}
}
@@ -15,11 +15,9 @@ public class GroupRequirement extends Requirement {
@Override
public boolean check(Player player) {
for (String group : plugin.getPermissions().getPlayerGroups(null, player)) {
for (String value : getValuesString()) {
if (group.equalsIgnoreCase(value)) {
return true;
}
for (String group : getValuesString()) {
if (plugin.getPermissions().inGroup(player.getUniqueId(), group)) {
return true;
}
}
return false;
@@ -30,6 +30,7 @@ public class ItemRequirement extends ProgressiveRequirement {
.mapToInt(ItemStack::getAmount).sum();
}
@SuppressWarnings("deprecation")
protected boolean matchItem(ItemStack item) {
if (item == null) {
return false;