3.7-beta
- refactoring - different requirements based on prestige
This commit is contained in:
@@ -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) {
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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)));
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user