- 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;
+21
View File
@@ -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.