- 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
+1 -2
View File
@@ -1,7 +1,6 @@
The MIT License (MIT) 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 Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal of this software and associated documentation files (the "Software"), to deal
+2 -2
View File
@@ -4,7 +4,7 @@ plugins {
} }
group 'sh.okx' group 'sh.okx'
version '3.6.2' version '3.7-beta'
repositories { repositories {
mavenCentral() mavenCentral()
@@ -30,7 +30,7 @@ repositories {
dependencies { dependencies {
testImplementation group: 'junit', name: 'junit', version: '4.12' testImplementation group: 'junit', name: 'junit', version: '4.12'
compileOnly 'org.jetbrains:annotations:16.0.2' 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') { implementation('com.github.Realizedd:TokenManager:3.2.4') {
transitive = false transitive = false
} }
+11 -18
View File
@@ -1,12 +1,5 @@
package sh.okx.rankup; 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.ArrayList;
import java.util.Collections; import java.util.Collections;
import java.util.HashSet; import java.util.HashSet;
@@ -14,6 +7,12 @@ import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Set; import java.util.Set;
import java.util.function.Function; 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> { public class RankList<T extends Rank> {
@Getter @Getter
@@ -38,18 +37,18 @@ public class RankList<T extends Rank> {
protected void validateSection(ConfigurationSection section) { protected void validateSection(ConfigurationSection section) {
String name = "'" + section.getName() + "'"; String name = "'" + section.getName() + "'";
if (section.getConfigurationSection("requirements") != null) { /*if (section.getConfigurationSection("requirements") != null) {
throw new IllegalArgumentException( throw new IllegalArgumentException(
"Rankup/prestige section " + name + " is using the old requirements system.\n" + "Rankup/prestige section " + name + " is using the old requirements system.\n" +
"Instead of a configuration section, it is now a list of strings.\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'\"."); "For example, instead of \"requirements: money: 1000\" you should use \"requirements: - 'money 1000'\".");
} }*/
Set<String> keys = section.getKeys(false); Set<String> keys = section.getKeys(false);
if (keys.size() == 1 && keys.iterator().next().equalsIgnoreCase("rank")) { if (keys.size() == 1 && keys.iterator().next().equalsIgnoreCase("rank")) {
throw new IllegalArgumentException( throw new IllegalArgumentException(
"Having a final rank (for example: \"Z: rank: 'Z'\") from 3.4.2 or earlier should no longer be used.\n" + "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 + ""); "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."); 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(); 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 last = getLast();
String[] groups = perms.getPlayerGroups(null, player); return perms.inGroup(player.getUniqueId(), last);
for (String group : groups) {
if (group.equalsIgnoreCase(last)) {
return true;
}
}
return false;
} }
public T next(T rank) { public T next(T rank) {
+10 -11
View File
@@ -1,8 +1,10 @@
package sh.okx.rankup; 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.configuration.ConfigurationSection;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import sh.okx.rankup.hook.PermissionProvider;
import sh.okx.rankup.messages.Message; import sh.okx.rankup.messages.Message;
import sh.okx.rankup.messages.Variable; import sh.okx.rankup.messages.Variable;
import sh.okx.rankup.prestige.Prestige; 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.Rank;
import sh.okx.rankup.ranks.Rankups; 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 * Actually performs the ranking up and prestiging for the plugin and also manages the cooldowns
* between ranking up. * between ranking up.
@@ -21,7 +20,7 @@ public class RankupHelper {
private final RankupPlugin plugin; private final RankupPlugin plugin;
private final ConfigurationSection config; private final ConfigurationSection config;
private final Permission permissions; private final PermissionProvider permissions;
/** /**
* Players who cannot rankup/prestige for a certain amount of time. * Players who cannot rankup/prestige for a certain amount of time.
*/ */
@@ -37,9 +36,9 @@ public class RankupHelper {
rank.runCommands(player); rank.runCommands(player);
if (rank.getRank() != null) { 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) { public void sendRankupMessages(Player player, Rank rank) {
@@ -56,13 +55,13 @@ public class RankupHelper {
public void doPrestige(Player player, Prestige prestige) { public void doPrestige(Player player, Prestige prestige) {
prestige.runCommands(player); prestige.runCommands(player);
permissions.playerRemoveGroup(null, player, prestige.getFrom()); permissions.removeGroup(player.getUniqueId(), prestige.getFrom());
permissions.playerAddGroup(null, player, prestige.getTo()); permissions.addGroup(player.getUniqueId(), prestige.getTo());
if (prestige.getRank() != null) { 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) { public void sendPrestigeMessages(Player player, Prestige prestige) {
+26 -31
View File
@@ -1,8 +1,13 @@
package sh.okx.rankup; 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 lombok.Getter;
import net.milkbowl.vault.economy.Economy; import net.milkbowl.vault.economy.Economy;
import net.milkbowl.vault.permission.Permission;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
import org.bukkit.ChatColor; import org.bukkit.ChatColor;
import org.bukkit.command.CommandSender; 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.commands.RankupCommand;
import sh.okx.rankup.gui.Gui; import sh.okx.rankup.gui.Gui;
import sh.okx.rankup.gui.GuiListener; import sh.okx.rankup.gui.GuiListener;
import sh.okx.rankup.hook.PermissionManager;
import sh.okx.rankup.hook.PermissionProvider;
import sh.okx.rankup.messages.Message; import sh.okx.rankup.messages.Message;
import sh.okx.rankup.messages.MessageBuilder; import sh.okx.rankup.messages.MessageBuilder;
import sh.okx.rankup.messages.NullMessageBuilder; 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.UpdateNotifier;
import sh.okx.rankup.util.VersionChecker; 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 { public class RankupPlugin extends JavaPlugin {
@Getter @Getter
private Permission permissions; private PermissionProvider permissions;
@Getter @Getter
private Economy economy; private Economy economy;
/** /**
@@ -155,7 +155,11 @@ public class RankupPlugin extends JavaPlugin {
public void reload(boolean init) { public void reload(boolean init) {
errorMessage = null; errorMessage = null;
if (!setupPermissions()) {
PermissionManager permissionManager = new PermissionManager(this);
permissions = permissionManager.findPermissionProvider();
if (permissions == null) {
errorMessage = "No permission plugin found"; errorMessage = "No permission plugin found";
} }
setupEconomy(); setupEconomy();
@@ -215,7 +219,7 @@ public class RankupPlugin extends JavaPlugin {
private void addAll(Map<String, Integer> map, RankList<? extends Rank> ranks) { private void addAll(Map<String, Integer> map, RankList<? extends Rank> ranks) {
for (Rank rank : ranks.ranks) { for (Rank rank : ranks.ranks) {
for (Requirement requirement : rank.getRequirements()) { for (Requirement requirement : rank.getRequirements().getRequirements(null)) {
String name = requirement.getName(); String name = requirement.getName();
map.put(name, map.getOrDefault(name, 0) + 1); map.put(name, map.getOrDefault(name, 0) + 1);
} }
@@ -259,10 +263,6 @@ public class RankupPlugin extends JavaPlugin {
registerRequirements(); registerRequirements();
Bukkit.getPluginManager().callEvent(new RankupRegisterEvent(this)); 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")) { if (config.getBoolean("prestige")) {
prestiges = new Prestiges(this, loadConfig("prestiges.yml")); prestiges = new Prestiges(this, loadConfig("prestiges.yml"));
// prestiges.getOrderedList(); // prestiges.getOrderedList();
@@ -270,6 +270,12 @@ public class RankupPlugin extends JavaPlugin {
prestiges = null; prestiges = null;
} }
rankups = new Rankups(this, loadConfig("rankups.yml"));
// check rankups are not in an infinite loop
// rankups.getOrderedList();
} catch (Exception e) { } catch (Exception e) {
this.errorMessage = e.getClass().getName() + ": " + e.getMessage(); this.errorMessage = e.getClass().getName() + ": " + e.getMessage();
e.printStackTrace(); e.printStackTrace();
@@ -354,17 +360,6 @@ public class RankupPlugin extends JavaPlugin {
new TokensDeductibleRequirement(this, "tokenmanager-tokens")); 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() { private void setupEconomy() {
RegisteredServiceProvider<Economy> rsp = getServer().getServicesManager() RegisteredServiceProvider<Economy> rsp = getServer().getServicesManager()
.getRegistration(Economy.class); .getRegistration(Economy.class);
@@ -392,11 +387,11 @@ public class RankupPlugin extends JavaPlugin {
} }
public ConfigurationSection getSection(Rank rank, String path) { public ConfigurationSection getSection(Rank rank, String path) {
ConfigurationSection messages = rank.getSection(); ConfigurationSection rankSection = rank.getSection();
if (messages == null || !messages.isConfigurationSection(path)) { if (rankSection == null || !rankSection.isConfigurationSection(path)) {
return this.messages.getConfigurationSection(path); return this.messages.getConfigurationSection(path);
} }
return messages.getConfigurationSection(path); return rankSection.getConfigurationSection(path);
} }
public MessageBuilder getMessage(Rank rank, Message message) { public MessageBuilder getMessage(Rank rank, Message message) {
@@ -417,7 +412,7 @@ public class RankupPlugin extends JavaPlugin {
return builder; return builder;
} }
Requirement money = rank.getRequirement("money"); Requirement money = rank.getRequirement(sender instanceof Player ? (Player) sender : null, "money");
if (money != null) { if (money != null) {
Double amount = null; Double amount = null;
if (sender instanceof Player && rank.isIn((Player) sender)) { 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) { public MessageBuilder replaceRequirements(MessageBuilder builder, Player player, Rank rank) {
DecimalFormat simpleFormat = placeholders.getSimpleFormat(); DecimalFormat simpleFormat = placeholders.getSimpleFormat();
DecimalFormat percentFormat = placeholders.getPercentFormat(); DecimalFormat percentFormat = placeholders.getPercentFormat();
for (Requirement requirement : rank.getRequirements()) { for (Requirement requirement : rank.getRequirements().getRequirements(player)) {
try { try {
replaceRequirements(builder, Variable.AMOUNT, requirement, replaceRequirements(builder, Variable.AMOUNT, requirement,
() -> simpleFormat.format(requirement.getTotal(player))); () -> simpleFormat.format(requirement.getTotal(player)));
+9 -10
View File
@@ -39,16 +39,17 @@ public class Gui implements InventoryHolder {
gui.prestige = oldRank instanceof Prestige; gui.prestige = oldRank instanceof Prestige;
String type = gui.prestige ? "prestige" : "rankup"; 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[] items = new ItemStack[config.getInt("rows", 1) * 9];
ItemStack fill = getItem(plugin, config, "fill", player, oldRank, rank); ItemStack fill = getItem(plugin, plugin.getSection(oldRank, basePath + ".fill"), player, oldRank, rank);
ItemStack cancel = getItem(plugin, config, "cancel", player, oldRank, rank); ItemStack cancel = getItem(plugin, plugin.getSection(oldRank, basePath + ".cancel"), player, oldRank, rank);
ItemStack rankup = getItem(plugin, config, "rankup", player, oldRank, rank); ItemStack rankup = getItem(plugin, plugin.getSection(oldRank, basePath + ".rankup"), player, oldRank, rank);
addItem(items, config.getConfigurationSection("rankup"), rankup); addItem(items, plugin.getSection(oldRank, basePath + ".rankup"), rankup);
addItem(items, config.getConfigurationSection("cancel"), cancel); addItem(items, plugin.getSection(oldRank, basePath + ".cancel"), cancel);
addItem(items, config.getConfigurationSection("fill"), fill); addItem(items, plugin.getSection(oldRank, basePath + ".fill"), fill);
gui.rankup = rankup; gui.rankup = rankup;
gui.cancel = cancel; gui.cancel = cancel;
@@ -64,9 +65,7 @@ public class Gui implements InventoryHolder {
} }
@SuppressWarnings("deprecation") @SuppressWarnings("deprecation")
private static ItemStack getItem(RankupPlugin plugin, ConfigurationSection parent, String name, Player player, Rank oldRank, String rank) { private static ItemStack getItem(RankupPlugin plugin, ConfigurationSection section, Player player, Rank oldRank, String rank) {
ConfigurationSection section = parent.getConfigurationSection(name);
String materialName = section.getString("material").toUpperCase(); String materialName = section.getString("material").toUpperCase();
ItemStack item; 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_PUBLIC("rankup.success-public"),
SUCCESS_PRIVATE("rankup.success-private"), SUCCESS_PRIVATE("rankup.success-private"),
CONFIRMATION("rankup.confirmation"), CONFIRMATION("rankup.confirmation"),
TITLE("rankup.title"), TITLE("rankup.gui.title"),
RANKS_HEADER("rankup.list.header"), RANKS_HEADER("rankup.list.header"),
RANKS_FOOTER("rankup.list.footer"), RANKS_FOOTER("rankup.list.footer"),
RANKS_COMPLETE("rankup.list.complete"), RANKS_COMPLETE("rankup.list.complete"),
@@ -22,7 +22,7 @@ public enum Message {
PRESTIGES_COMPLETE("prestige.list.complete"), PRESTIGES_COMPLETE("prestige.list.complete"),
PRESTIGES_CURRENT("prestige.list.current"), PRESTIGES_CURRENT("prestige.list.current"),
PRESTIGES_INCOMPLETE("prestige.list.incomplete"), PRESTIGES_INCOMPLETE("prestige.list.incomplete"),
PRESTIGE_TITLE("prestige.title"), PRESTIGE_TITLE("prestige.gui.title"),
COOLDOWN_SINGULAR("rankup.cooldown.singular"), COOLDOWN_SINGULAR("rankup.cooldown.singular"),
COOLDOWN_PLURAL("rankup.cooldown.plural"), COOLDOWN_PLURAL("rankup.cooldown.plural"),
MUST_PRESTIGE("rankup.must-prestige"), 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)); // return placeholders.getSimpleFormat().format(orElse(rankups.getByName(parts[2]).getRequirement(parts[3]), Requirement::getValueDouble, 0));
} else if (params.startsWith("rank_money_")) { } else if (params.startsWith("rank_money_")) {
String[] parts = params.split("_", 4); 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")) { if (parts.length > 3 && parts[3].equalsIgnoreCase("left")) {
amount = amount - plugin.getEconomy().getBalance(player); amount = amount - plugin.getEconomy().getBalance(player);
} }
@@ -74,10 +74,10 @@ public class RankupExpansion extends PlaceholderExpansion {
return orElse(prestige, Prestige::getNext, prestiges.getFirst().getNext()); return orElse(prestige, Prestige::getNext, prestiges.getFirst().getNext());
case "prestige_money": case "prestige_money":
requirePrestiging(prestiges, params); 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": case "prestige_money_formatted":
requirePrestiging(prestiges, params); 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": case "current_rank":
if (rankups.isLast(plugin.getPermissions(), player)) { if (rankups.isLast(plugin.getPermissions(), player)) {
return rankups.getLast(); 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"); return orElsePlaceholder(rank, r -> orElsePlaceholder(rank, Rank::getNext, "highest-rank"), "not-in-ladder");
case "money": case "money":
return String.valueOf(getMoney(rank)); return String.valueOf(getMoney(player, rank));
case "money_formatted": case "money_formatted":
return plugin.formatMoney(getMoney(rank).doubleValue()); return plugin.formatMoney(getMoney(player, rank).doubleValue());
case "money_left": 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": 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": 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": 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": 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": 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": 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": 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: default:
return null; return null;
} }
} }
private Number getMoney(Rank rank) { private Number getMoney(Player player, Rank rank) {
return orElse(rank, r -> simplify(r.getRequirement("money").getValueDouble()), 0); return orElse(rank, r -> simplify(r.getRequirement(player, "money").getValueDouble()), 0);
} }
private void requirePrestiging(Prestiges prestiges, String params) { private void requirePrestiging(Prestiges prestiges, String params) {
@@ -128,7 +128,7 @@ public class RankupExpansion extends PlaceholderExpansion {
if (rank == null) { if (rank == null) {
return ""; return "";
} }
Requirement requirement = rank.getRequirement(requirementName); Requirement requirement = rank.getRequirement(player, requirementName);
switch (params) { switch (params) {
case "": case "":
return orElse(requirement, Requirement::getValueString, "0"); return orElse(requirement, Requirement::getValueString, "0");
@@ -7,6 +7,8 @@ import org.bukkit.configuration.ConfigurationSection;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import sh.okx.rankup.RankupPlugin; import sh.okx.rankup.RankupPlugin;
import sh.okx.rankup.ranks.Rank; import sh.okx.rankup.ranks.Rank;
import sh.okx.rankup.ranks.requirements.ListRankRequirements;
import sh.okx.rankup.ranks.requirements.RankRequirements;
import sh.okx.rankup.requirements.Requirement; import sh.okx.rankup.requirements.Requirement;
import java.util.List; import java.util.List;
@@ -20,7 +22,7 @@ public class Prestige extends Rank {
@Getter @Getter
private final String to; 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); super(section, plugin, next, rank, requirements, commands);
this.from = from; this.from = from;
this.to = to; this.to = to;
@@ -33,7 +35,7 @@ public class Prestige extends Rank {
return new Prestige(section, plugin, return new Prestige(section, plugin,
section.getString("next"), section.getString("next"),
section.getString("rank"), section.getString("rank"),
requirements, new ListRankRequirements(requirements),
section.getStringList("commands"), section.getStringList("commands"),
section.getString("from"), section.getString("from"),
section.getString("to")); section.getString("to"));
@@ -41,30 +43,33 @@ public class Prestige extends Rank {
@Override @Override
public boolean isIn(Player player) { public boolean isIn(Player player) {
String[] groups = plugin.getPermissions().getPlayerGroups(null, player); // first prestige does not have a rank
for (String group : groups) { boolean inFrom = plugin.getPermissions().inGroup(player.getUniqueId(), from);
if (group.equalsIgnoreCase(from) && rank == null) { if (rank == null && inFrom) {
// not in any other prestiges
for (Prestige prestige : plugin.getPrestiges().getOrderedList()) { for (Prestige prestige : plugin.getPrestiges().getOrderedList()) {
if (prestige != this && prestige.isIn(player)) { if (prestige != this && prestige.isIn(player)) {
return false; return false;
} }
} }
return true; return true;
} else if(group.equalsIgnoreCase(rank)) { }
if (rank == null) {
return false;
}
// subsequent prestiges
boolean inRank = plugin.getPermissions().inGroup(player.getUniqueId(), rank);
if (inRank) {
return true; return true;
} }
}
return false; return false;
} }
public boolean isEligable(Player player) { public boolean isEligable(Player player) {
String[] groups = plugin.getPermissions().getPlayerGroups(null, player); return plugin.getPermissions().inGroup(player.getUniqueId(), from);
for (String group : groups) {
if (group.equalsIgnoreCase(from)) {
return true;
}
}
return false;
} }
@Override @Override
+11 -57
View File
@@ -1,6 +1,6 @@
package sh.okx.rankup.ranks; package sh.okx.rankup.ranks;
import java.util.Collections; import java.util.List;
import lombok.AccessLevel; import lombok.AccessLevel;
import lombok.EqualsAndHashCode; import lombok.EqualsAndHashCode;
import lombok.Getter; import lombok.Getter;
@@ -12,12 +12,9 @@ import org.bukkit.configuration.ConfigurationSection;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import sh.okx.rankup.RankupPlugin; import sh.okx.rankup.RankupPlugin;
import sh.okx.rankup.messages.MessageBuilder; import sh.okx.rankup.messages.MessageBuilder;
import sh.okx.rankup.requirements.DeductibleRequirement; import sh.okx.rankup.ranks.requirements.RankRequirements;
import sh.okx.rankup.requirements.Requirement; import sh.okx.rankup.requirements.Requirement;
import java.util.List;
import java.util.Set;
@EqualsAndHashCode @EqualsAndHashCode
@ToString @ToString
@RequiredArgsConstructor(access = AccessLevel.PROTECTED) @RequiredArgsConstructor(access = AccessLevel.PROTECTED)
@@ -30,73 +27,30 @@ public class Rank {
@Getter @Getter
protected final String rank; protected final String rank;
@Getter @Getter
protected final Set<Requirement> requirements; protected final RankRequirements requirements;
protected final List<String> commands; 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) { public boolean isIn(Player player) {
String[] groups = plugin.getPermissions().getPlayerGroups(null, player); return plugin.getPermissions().inGroup(player.getUniqueId(), rank);
for (String group : groups) {
if (group.equalsIgnoreCase(rank)) {
return true;
}
}
return false;
} }
public boolean isLast() { public boolean isLast() {
return plugin.getRankups().getByName(next) == null; return plugin.getRankups().getByName(next) == null;
} }
public Requirement getRequirement(String name) { public boolean hasRequirements(Player player) {
for (Requirement requirement : requirements) { return requirements.hasRequirements(player);
if (requirement.getFullName().equalsIgnoreCase(name)) {
return requirement;
} }
}
return null; public Requirement getRequirement(Player player, String name) {
return requirements.getRequirement(player, name);
} }
public void applyRequirements(Player player) { public void applyRequirements(Player player) {
for (Requirement requirement : requirements) { requirements.applyRequirements(player);
if (requirement instanceof DeductibleRequirement) {
((DeductibleRequirement) requirement).apply(player);
}
}
} }
public void runCommands(Player player) { public void runCommands(Player player) {
for (String command : commands) { for (String command : commands) {
String string = new MessageBuilder(command).replaceRanks(player, this, next).toString(); 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 class Rankups extends RankList<Rank> {
public Rankups(RankupPlugin plugin, FileConfiguration config) { 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,13 +15,11 @@ public class GroupRequirement extends Requirement {
@Override @Override
public boolean check(Player player) { public boolean check(Player player) {
for (String group : plugin.getPermissions().getPlayerGroups(null, player)) { for (String group : getValuesString()) {
for (String value : getValuesString()) { if (plugin.getPermissions().inGroup(player.getUniqueId(), group)) {
if (group.equalsIgnoreCase(value)) {
return true; return true;
} }
} }
}
return false; return false;
} }
@@ -30,6 +30,7 @@ public class ItemRequirement extends ProgressiveRequirement {
.mapToInt(ItemStack::getAmount).sum(); .mapToInt(ItemStack::getAmount).sum();
} }
@SuppressWarnings("deprecation")
protected boolean matchItem(ItemStack item) { protected boolean matchItem(ItemStack item) {
if (item == null) { if (item == null) {
return false; 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.