diff --git a/LICENSE.md b/LICENSE.md index e1c3eab..7d3e802 100644 --- a/LICENSE.md +++ b/LICENSE.md @@ -1,7 +1,6 @@ - The MIT License (MIT) -Copyright (c) 2018 +Copyright (c) 2018-2020 Okx Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/build.gradle b/build.gradle index 17121fe..fcd1d70 100644 --- a/build.gradle +++ b/build.gradle @@ -4,7 +4,7 @@ plugins { } group 'sh.okx' -version '3.6.2' +version '3.7-beta' repositories { mavenCentral() @@ -30,7 +30,7 @@ repositories { dependencies { testImplementation group: 'junit', name: 'junit', version: '4.12' compileOnly 'org.jetbrains:annotations:16.0.2' - implementation 'org.spigotmc:spigot:1.12.2-R0.1-SNAPSHOT' + implementation 'org.spigotmc:spigot:1.15.2-R0.1-SNAPSHOT' implementation('com.github.Realizedd:TokenManager:3.2.4') { transitive = false } diff --git a/src/main/java/sh/okx/rankup/RankList.java b/src/main/java/sh/okx/rankup/RankList.java index 9372ee9..9544f30 100644 --- a/src/main/java/sh/okx/rankup/RankList.java +++ b/src/main/java/sh/okx/rankup/RankList.java @@ -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 { @Getter @@ -38,18 +37,18 @@ public class RankList { 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 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 { 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) { diff --git a/src/main/java/sh/okx/rankup/RankupHelper.java b/src/main/java/sh/okx/rankup/RankupHelper.java index 79caf88..40c372b 100644 --- a/src/main/java/sh/okx/rankup/RankupHelper.java +++ b/src/main/java/sh/okx/rankup/RankupHelper.java @@ -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) { diff --git a/src/main/java/sh/okx/rankup/RankupPlugin.java b/src/main/java/sh/okx/rankup/RankupPlugin.java index 0fc251a..b2c400b 100644 --- a/src/main/java/sh/okx/rankup/RankupPlugin.java +++ b/src/main/java/sh/okx/rankup/RankupPlugin.java @@ -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 map, RankList 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 rsp = getServer().getServicesManager() - .getRegistration(Permission.class); - if (rsp == null) { - return false; - } - permissions = rsp.getProvider(); - return permissions.hasGroupSupport(); - } - private void setupEconomy() { RegisteredServiceProvider 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))); diff --git a/src/main/java/sh/okx/rankup/gui/Gui.java b/src/main/java/sh/okx/rankup/gui/Gui.java index bb21e07..fe1cac1 100644 --- a/src/main/java/sh/okx/rankup/gui/Gui.java +++ b/src/main/java/sh/okx/rankup/gui/Gui.java @@ -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; diff --git a/src/main/java/sh/okx/rankup/hook/PermissionManager.java b/src/main/java/sh/okx/rankup/hook/PermissionManager.java new file mode 100644 index 0000000..0f1e46b --- /dev/null +++ b/src/main/java/sh/okx/rankup/hook/PermissionManager.java @@ -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 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); + } +} diff --git a/src/main/java/sh/okx/rankup/hook/PermissionProvider.java b/src/main/java/sh/okx/rankup/hook/PermissionProvider.java new file mode 100644 index 0000000..53b941d --- /dev/null +++ b/src/main/java/sh/okx/rankup/hook/PermissionProvider.java @@ -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); +} diff --git a/src/main/java/sh/okx/rankup/hook/VaultPermissionProvider.java b/src/main/java/sh/okx/rankup/hook/VaultPermissionProvider.java new file mode 100644 index 0000000..d229e8d --- /dev/null +++ b/src/main/java/sh/okx/rankup/hook/VaultPermissionProvider.java @@ -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); + } +} diff --git a/src/main/java/sh/okx/rankup/messages/Message.java b/src/main/java/sh/okx/rankup/messages/Message.java index 94fb51d..91b1190 100644 --- a/src/main/java/sh/okx/rankup/messages/Message.java +++ b/src/main/java/sh/okx/rankup/messages/Message.java @@ -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"), diff --git a/src/main/java/sh/okx/rankup/placeholders/RankupExpansion.java b/src/main/java/sh/okx/rankup/placeholders/RankupExpansion.java index ba508f0..ce49058 100644 --- a/src/main/java/sh/okx/rankup/placeholders/RankupExpansion.java +++ b/src/main/java/sh/okx/rankup/placeholders/RankupExpansion.java @@ -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"); diff --git a/src/main/java/sh/okx/rankup/prestige/Prestige.java b/src/main/java/sh/okx/rankup/prestige/Prestige.java index 5aa4b61..204e0af 100644 --- a/src/main/java/sh/okx/rankup/prestige/Prestige.java +++ b/src/main/java/sh/okx/rankup/prestige/Prestige.java @@ -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 requirements, List commands, String from, String to) { + private Prestige(ConfigurationSection section, RankupPlugin plugin, String next, String rank, RankRequirements requirements, List commands, String from, String to) { super(section, plugin, next, rank, requirements, commands); this.from = from; this.to = to; @@ -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 diff --git a/src/main/java/sh/okx/rankup/ranks/Rank.java b/src/main/java/sh/okx/rankup/ranks/Rank.java index 79ded2e..bd6a1e3 100644 --- a/src/main/java/sh/okx/rankup/ranks/Rank.java +++ b/src/main/java/sh/okx/rankup/ranks/Rank.java @@ -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 requirements; + protected final RankRequirements requirements; protected final List commands; - public static Rank deserialize(RankupPlugin plugin, ConfigurationSection section) { - List requirementsList; - if (section.isList("requirements")) { - requirementsList = section.getStringList("requirements"); - } else { - requirementsList = Collections.singletonList(section.getString("requirements")); - } - Set 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(); diff --git a/src/main/java/sh/okx/rankup/ranks/Rankup.java b/src/main/java/sh/okx/rankup/ranks/Rankup.java new file mode 100644 index 0000000..b1f836e --- /dev/null +++ b/src/main/java/sh/okx/rankup/ranks/Rankup.java @@ -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 commands) { + super(section, plugin, next, rank, requirements, commands); + } +} diff --git a/src/main/java/sh/okx/rankup/ranks/Rankups.java b/src/main/java/sh/okx/rankup/ranks/Rankups.java index ed5bbd9..30965ff 100644 --- a/src/main/java/sh/okx/rankup/ranks/Rankups.java +++ b/src/main/java/sh/okx/rankup/ranks/Rankups.java @@ -6,6 +6,6 @@ import sh.okx.rankup.RankupPlugin; public class Rankups extends RankList { public Rankups(RankupPlugin plugin, FileConfiguration config) { - super(config, section -> Rank.deserialize(plugin, section)); + super(config, section -> Rankup.deserialize(plugin, section)); } } diff --git a/src/main/java/sh/okx/rankup/ranks/requirements/ListRankRequirements.java b/src/main/java/sh/okx/rankup/ranks/requirements/ListRankRequirements.java new file mode 100644 index 0000000..fad922a --- /dev/null +++ b/src/main/java/sh/okx/rankup/ranks/requirements/ListRankRequirements.java @@ -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 requirements; + + public ListRankRequirements(Set requirements) { + this.requirements = requirements; + } + + @Override + public Set 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); + } + } + } +} diff --git a/src/main/java/sh/okx/rankup/ranks/requirements/PrestigeListRankRequirements.java b/src/main/java/sh/okx/rankup/ranks/requirements/PrestigeListRankRequirements.java new file mode 100644 index 0000000..ddeddd0 --- /dev/null +++ b/src/main/java/sh/okx/rankup/ranks/requirements/PrestigeListRankRequirements.java @@ -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 requirements; + + public PrestigeListRankRequirements(RankupPlugin plugin, RankRequirements defaultRequirements, Map requirements) { + Objects.requireNonNull(plugin); + Objects.requireNonNull(defaultRequirements); + + this.plugin = plugin; + this.defaultRequirements = defaultRequirements; + this.requirements = requirements; + } + + @Override + public Set 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; + } +} diff --git a/src/main/java/sh/okx/rankup/ranks/requirements/RankRequirements.java b/src/main/java/sh/okx/rankup/ranks/requirements/RankRequirements.java new file mode 100644 index 0000000..19f416d --- /dev/null +++ b/src/main/java/sh/okx/rankup/ranks/requirements/RankRequirements.java @@ -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 getRequirements(Player player); + + boolean hasRequirements(Player player); + Requirement getRequirement(Player player, String name); + void applyRequirements(Player player); +} diff --git a/src/main/java/sh/okx/rankup/ranks/requirements/RankRequirementsFactory.java b/src/main/java/sh/okx/rankup/ranks/requirements/RankRequirementsFactory.java new file mode 100644 index 0000000..41fe1d5 --- /dev/null +++ b/src/main/java/sh/okx/rankup/ranks/requirements/RankRequirementsFactory.java @@ -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 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 stringsToRequirements(RankupPlugin plugin, Iterable strings) { + return plugin.getRequirements().getRequirements(strings); + } + + private static RankRequirements getListRequirements(RankupPlugin plugin, Iterable list) { + Set 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 requirements = new HashMap<>(); + + for (String key : section.getKeys(false)) { + Collection 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); + } +} diff --git a/src/main/java/sh/okx/rankup/requirements/requirement/GroupRequirement.java b/src/main/java/sh/okx/rankup/requirements/requirement/GroupRequirement.java index b280a1b..0f92e19 100644 --- a/src/main/java/sh/okx/rankup/requirements/requirement/GroupRequirement.java +++ b/src/main/java/sh/okx/rankup/requirements/requirement/GroupRequirement.java @@ -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; diff --git a/src/main/java/sh/okx/rankup/requirements/requirement/ItemRequirement.java b/src/main/java/sh/okx/rankup/requirements/requirement/ItemRequirement.java index 905f5f6..ad6c361 100644 --- a/src/main/java/sh/okx/rankup/requirements/requirement/ItemRequirement.java +++ b/src/main/java/sh/okx/rankup/requirements/requirement/ItemRequirement.java @@ -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; diff --git a/src/main/resources/LICENSE.txt b/src/main/resources/LICENSE.txt new file mode 100644 index 0000000..7d3e802 --- /dev/null +++ b/src/main/resources/LICENSE.txt @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2018-2020 Okx + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE.