3.9-beta.2
This commit is contained in:
@@ -27,7 +27,7 @@ public class RankupHelper {
|
||||
/**
|
||||
* Players who cannot rankup/prestige for a certain amount of time.
|
||||
*/
|
||||
private Map<Player, Long> cooldowns = new HashMap<>();
|
||||
private final Map<Player, Long> cooldowns = new HashMap<>();
|
||||
|
||||
public RankupHelper(RankupPlugin plugin) {
|
||||
this.plugin = plugin;
|
||||
|
||||
@@ -1,7 +1,6 @@
|
||||
package sh.okx.rankup;
|
||||
|
||||
import lombok.Getter;
|
||||
import net.milkbowl.vault.economy.Economy;
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.ChatColor;
|
||||
import org.bukkit.command.CommandSender;
|
||||
@@ -11,14 +10,19 @@ import org.bukkit.configuration.file.YamlConfiguration;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.event.inventory.InventoryType;
|
||||
import org.bukkit.inventory.InventoryView;
|
||||
import org.bukkit.plugin.PluginDescriptionFile;
|
||||
import org.bukkit.plugin.PluginManager;
|
||||
import org.bukkit.plugin.RegisteredServiceProvider;
|
||||
import org.bukkit.plugin.java.JavaPlugin;
|
||||
import org.bukkit.plugin.java.JavaPluginLoader;
|
||||
import sh.okx.rankup.commands.*;
|
||||
import sh.okx.rankup.economy.Economy;
|
||||
import sh.okx.rankup.economy.EconomyProvider;
|
||||
import sh.okx.rankup.economy.VaultEconomyProvider;
|
||||
import sh.okx.rankup.gui.Gui;
|
||||
import sh.okx.rankup.gui.GuiListener;
|
||||
import sh.okx.rankup.hook.GroupProvider;
|
||||
import sh.okx.rankup.hook.PermissionManager;
|
||||
import sh.okx.rankup.hook.VaultPermissionManager;
|
||||
import sh.okx.rankup.messages.Message;
|
||||
import sh.okx.rankup.messages.MessageBuilder;
|
||||
import sh.okx.rankup.messages.NullMessageBuilder;
|
||||
@@ -31,7 +35,7 @@ import sh.okx.rankup.ranks.RankList;
|
||||
import sh.okx.rankup.ranks.Rankups;
|
||||
import sh.okx.rankup.requirements.Requirement;
|
||||
import sh.okx.rankup.requirements.RequirementRegistry;
|
||||
import sh.okx.rankup.requirements.XpLevelDeductibleRequirement;
|
||||
import sh.okx.rankup.requirements.requirement.XpLevelDeductibleRequirement;
|
||||
import sh.okx.rankup.requirements.requirement.*;
|
||||
import sh.okx.rankup.requirements.requirement.advancedachievements.AdvancedAchievementsAchievementRequirement;
|
||||
import sh.okx.rankup.requirements.requirement.advancedachievements.AdvancedAchievementsTotalRequirement;
|
||||
@@ -78,8 +82,20 @@ public class RankupPlugin extends JavaPlugin {
|
||||
private Placeholders placeholders;
|
||||
@Getter
|
||||
private RankupHelper helper;
|
||||
private AutoRankup autoRankup;
|
||||
protected AutoRankup autoRankup = new AutoRankup(this);
|
||||
private String errorMessage;
|
||||
private PermissionManager permissionManager = new VaultPermissionManager(this);
|
||||
private EconomyProvider economyProvider = new VaultEconomyProvider();
|
||||
|
||||
public RankupPlugin() {
|
||||
super();
|
||||
}
|
||||
|
||||
protected RankupPlugin(JavaPluginLoader loader, PluginDescriptionFile description, File dataFolder, File file, PermissionManager permissionManager, EconomyProvider economyProvider) {
|
||||
super(loader, description, dataFolder, file);
|
||||
this.permissionManager = permissionManager;
|
||||
this.economyProvider = economyProvider;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onEnable() {
|
||||
@@ -87,23 +103,25 @@ public class RankupPlugin extends JavaPlugin {
|
||||
|
||||
reload(true);
|
||||
|
||||
Metrics metrics = new Metrics(this);
|
||||
metrics.addCustomChart(new Metrics.SimplePie("confirmation",
|
||||
() -> config.getString("confirmation-type", "unknown")));
|
||||
metrics.addCustomChart(new Metrics.AdvancedPie("requirements", () -> {
|
||||
Map<String, Integer> map = new HashMap<>();
|
||||
addAll(map, rankups);
|
||||
if (prestiges != null) {
|
||||
addAll(map, prestiges);
|
||||
}
|
||||
return map;
|
||||
}));
|
||||
metrics.addCustomChart(new Metrics.SimplePie("prestige",
|
||||
() -> config.getBoolean("prestige") ? "enabled" : "disabled"));
|
||||
metrics.addCustomChart(new Metrics.SimplePie("permission-rankup",
|
||||
() -> config.getBoolean("permission-rankup") ? "enabled" : "disabled"));
|
||||
metrics.addCustomChart(new Metrics.SimplePie("notify-update",
|
||||
() -> config.getBoolean("notify-update") ? "enabled" : "disabled"));
|
||||
if (System.getProperty("TEST") == null) {
|
||||
Metrics metrics = new Metrics(this);
|
||||
metrics.addCustomChart(new Metrics.SimplePie("confirmation",
|
||||
() -> config.getString("confirmation-type", "unknown")));
|
||||
metrics.addCustomChart(new Metrics.AdvancedPie("requirements", () -> {
|
||||
Map<String, Integer> map = new HashMap<>();
|
||||
addAll(map, rankups);
|
||||
if (prestiges != null) {
|
||||
addAll(map, prestiges);
|
||||
}
|
||||
return map;
|
||||
}));
|
||||
metrics.addCustomChart(new Metrics.SimplePie("prestige",
|
||||
() -> config.getBoolean("prestige") ? "enabled" : "disabled"));
|
||||
metrics.addCustomChart(new Metrics.SimplePie("permission-rankup",
|
||||
() -> config.getBoolean("permission-rankup") ? "enabled" : "disabled"));
|
||||
metrics.addCustomChart(new Metrics.SimplePie("notify-update",
|
||||
() -> config.getBoolean("notify-update") ? "enabled" : "disabled"));
|
||||
}
|
||||
|
||||
if (config.getBoolean("ranks")) {
|
||||
getCommand("ranks").setExecutor(new RanksCommand(this));
|
||||
@@ -142,8 +160,6 @@ public class RankupPlugin extends JavaPlugin {
|
||||
|
||||
config = loadConfig("config.yml");
|
||||
|
||||
PermissionManager permissionManager = new PermissionManager(this);
|
||||
|
||||
if (config.getBoolean("permission-rankup")) {
|
||||
permissions = permissionManager.permissionOnlyProvider();
|
||||
} else {
|
||||
@@ -158,12 +174,11 @@ public class RankupPlugin extends JavaPlugin {
|
||||
closeInventories();
|
||||
loadConfigs(init);
|
||||
|
||||
if (autoRankup != null) {
|
||||
autoRankup.cancel();
|
||||
}
|
||||
long time = (long) (config.getDouble("autorankup-interval") * 60 * 20);
|
||||
if (time > 0) {
|
||||
autoRankup = new AutoRankup(this);
|
||||
if (!autoRankup.isCancelled()) {
|
||||
autoRankup.cancel();
|
||||
}
|
||||
autoRankup.runTaskTimer(this, time, time);
|
||||
}
|
||||
|
||||
@@ -239,7 +254,7 @@ public class RankupPlugin extends JavaPlugin {
|
||||
messages = YamlConfiguration.loadConfiguration(localeFile);
|
||||
|
||||
if (init) {
|
||||
Bukkit.getScheduler().scheduleSyncDelayedTask(this, () -> {
|
||||
Bukkit.getScheduler().runTask(this, () -> {
|
||||
refreshRanks();
|
||||
error();
|
||||
});
|
||||
@@ -302,6 +317,7 @@ public class RankupPlugin extends JavaPlugin {
|
||||
new XpLevelRequirement(this, "xp-levelh"),
|
||||
new XpLevelDeductibleRequirement(this, "xp-level"),
|
||||
new PlaytimeMinutesRequirement(this),
|
||||
new AdvancementRequirement(this),
|
||||
new GroupRequirement(this),
|
||||
new PermissionRequirement(this),
|
||||
new PlaceholderRequirement(this),
|
||||
@@ -353,13 +369,7 @@ public class RankupPlugin extends JavaPlugin {
|
||||
}
|
||||
}
|
||||
private void setupEconomy() {
|
||||
RegisteredServiceProvider<Economy> rsp = getServer().getServicesManager()
|
||||
.getRegistration(Economy.class);
|
||||
if (rsp != null) {
|
||||
economy = rsp.getProvider();
|
||||
} else {
|
||||
getLogger().warning("No economy found. The 'money' requirement will be disabled.");
|
||||
}
|
||||
economy = economyProvider.getEconomy();
|
||||
}
|
||||
|
||||
public String formatMoney(double money) {
|
||||
|
||||
@@ -158,7 +158,7 @@ public class InfoCommand implements TabExecutor {
|
||||
if (args.length > 1 && args[1].equalsIgnoreCase("status")) {
|
||||
for (Rank rank : plugin.getRankups().getTree()) {
|
||||
String placeholder = "status_" + rank.getRank();
|
||||
sender.sendMessage(placeholder + ": " + plugin.getPlaceholders().getExpansion().onPlaceholderRequest(sender instanceof Player ? (Player) sender : null, placeholder));
|
||||
sender.sendMessage(placeholder + ": " + plugin.getPlaceholders().getExpansion().placeholder(sender instanceof Player ? (Player) sender : null, placeholder));
|
||||
}
|
||||
return true;
|
||||
}
|
||||
@@ -178,7 +178,7 @@ public class InfoCommand implements TabExecutor {
|
||||
"next_rank",
|
||||
};
|
||||
for (String placeholder : placeholders) {
|
||||
sender.sendMessage(placeholder + ": " + plugin.getPlaceholders().getExpansion().onPlaceholderRequest(sender instanceof Player ? (Player) sender : null, placeholder));
|
||||
sender.sendMessage(placeholder + ": " + plugin.getPlaceholders().getExpansion().placeholder(sender instanceof Player ? (Player) sender : null, placeholder));
|
||||
}
|
||||
return true;
|
||||
} else if (args[0].equalsIgnoreCase("tree") && sender.hasPermission("rankup.admin")) {
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
package sh.okx.rankup.commands;
|
||||
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import org.bukkit.ChatColor;
|
||||
import org.bukkit.command.Command;
|
||||
import org.bukkit.command.CommandExecutor;
|
||||
import org.bukkit.command.CommandSender;
|
||||
@@ -62,7 +63,12 @@ public class PrestigeCommand implements CommandExecutor {
|
||||
.send(player);
|
||||
break;
|
||||
case "gui":
|
||||
Gui.of(player, prestige, rankElement.getNext().getRank(), plugin).open(player);
|
||||
Gui gui = Gui.of(player, prestige, rankElement.getNext().getRank(), plugin);
|
||||
if (gui == null) {
|
||||
player.sendMessage(ChatColor.RED + "GUI is not available. Check console for more informatiopn.");
|
||||
return true;
|
||||
}
|
||||
gui.open(player);
|
||||
break;
|
||||
case "none":
|
||||
plugin.getHelper().prestige(player);
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
package sh.okx.rankup.commands;
|
||||
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import org.bukkit.ChatColor;
|
||||
import org.bukkit.command.Command;
|
||||
import org.bukkit.command.CommandExecutor;
|
||||
import org.bukkit.command.CommandSender;
|
||||
@@ -40,13 +41,6 @@ public class RankupCommand implements CommandExecutor {
|
||||
return true;
|
||||
}
|
||||
RankElement<Rank> rankElement = rankups.getByPlayer(player);
|
||||
/*Rank next = rankups.next(rank);
|
||||
if (next == null) {
|
||||
plugin.getLogger().severe("Rankup from " + rank.getRank() + " to " + rank.getNext() +
|
||||
" is defined but " + rank.getNext() + " does not exist.");
|
||||
plugin.getMessage(Message.INVALID_RANKUP).failIfEmpty().send(player);
|
||||
return true;
|
||||
}*/
|
||||
|
||||
FileConfiguration config = plugin.getConfig();
|
||||
String confirmationType = config.getString("confirmation-type").toLowerCase();
|
||||
@@ -68,7 +62,12 @@ public class RankupCommand implements CommandExecutor {
|
||||
.send(player);
|
||||
break;
|
||||
case "gui":
|
||||
Gui.of(player, rankElement.getRank(), rankElement.getNext().getRank(), plugin).open(player);
|
||||
Gui gui = Gui.of(player, rankElement.getRank(), rankElement.getNext().getRank(), plugin);
|
||||
if (gui == null) {
|
||||
player.sendMessage(ChatColor.RED + "GUI is not available. Check console for more informatiopn.");
|
||||
return true;
|
||||
}
|
||||
gui.open(player);
|
||||
break;
|
||||
case "none":
|
||||
plugin.getHelper().rankup(player);
|
||||
|
||||
@@ -1,4 +1,9 @@
|
||||
package sh.okx.rankup.economy;
|
||||
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
public interface Economy {
|
||||
double getBalance(Player player);
|
||||
void withdrawPlayer(Player player, double amount);
|
||||
void setPlayer(Player player, double amount);
|
||||
}
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
package sh.okx.rankup.economy;
|
||||
|
||||
public interface EconomyProvider {
|
||||
Economy getEconomy();
|
||||
}
|
||||
|
||||
@@ -1,4 +1,27 @@
|
||||
package sh.okx.rankup.economy;
|
||||
|
||||
public class VaultEconomy {
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
public class VaultEconomy implements Economy {
|
||||
private final net.milkbowl.vault.economy.Economy economy;
|
||||
|
||||
public VaultEconomy(net.milkbowl.vault.economy.Economy economy) {
|
||||
this.economy = economy;
|
||||
}
|
||||
|
||||
@Override
|
||||
public double getBalance(Player player) {
|
||||
return economy.getBalance(player);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void withdrawPlayer(Player player, double amount) {
|
||||
economy.withdrawPlayer(player, amount);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setPlayer(Player player, double amount) {
|
||||
throw new UnsupportedOperationException();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -1,4 +1,17 @@
|
||||
package sh.okx.rankup.economy;
|
||||
|
||||
public class VaultEconomyProvider {
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.plugin.RegisteredServiceProvider;
|
||||
|
||||
public class VaultEconomyProvider implements EconomyProvider {
|
||||
@Override
|
||||
public Economy getEconomy() {
|
||||
RegisteredServiceProvider<net.milkbowl.vault.economy.Economy> rsp = Bukkit.getServer().getServicesManager()
|
||||
.getRegistration(net.milkbowl.vault.economy.Economy.class);
|
||||
if (rsp != null) {
|
||||
return new VaultEconomy(rsp.getProvider());
|
||||
} else {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -41,6 +41,11 @@ public class Gui implements InventoryHolder {
|
||||
String type = gui.prestige ? "prestige" : "rankup";
|
||||
String basePath = type + ".gui";
|
||||
ConfigurationSection config = plugin.getSection(oldRank, basePath);
|
||||
if (config == null) {
|
||||
plugin.getLogger().severe("You must update your config.yml and locale/en.yml to be able to use the GUI! Your configuration files are outdated.");
|
||||
return null;
|
||||
}
|
||||
|
||||
ItemStack[] items = new ItemStack[config.getInt("rows", 1) * 9];
|
||||
|
||||
ItemStack fill = getItem(plugin, plugin.getSection(oldRank, basePath + ".fill"), player, oldRank, rank);
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
package sh.okx.rankup.hook;
|
||||
|
||||
public interface PermisionManager {
|
||||
public interface PermissionManager {
|
||||
|
||||
GroupProvider findPermissionProvider();
|
||||
|
||||
GroupProvider permissionOnlyProvider();
|
||||
|
||||
@@ -4,13 +4,14 @@ import net.milkbowl.vault.permission.Permission;
|
||||
import org.bukkit.plugin.RegisteredServiceProvider;
|
||||
import sh.okx.rankup.RankupPlugin;
|
||||
|
||||
public class PermissionManager {
|
||||
public class VaultPermissionManager implements PermissionManager {
|
||||
private final RankupPlugin plugin;
|
||||
|
||||
public PermissionManager(RankupPlugin plugin) {
|
||||
public VaultPermissionManager(RankupPlugin plugin) {
|
||||
this.plugin = plugin;
|
||||
}
|
||||
|
||||
@Override
|
||||
public GroupProvider findPermissionProvider() {
|
||||
return getVaultPermissionProvider();
|
||||
}
|
||||
@@ -28,6 +29,7 @@ public class PermissionManager {
|
||||
return new VaultGroupProvider(provider);
|
||||
}
|
||||
|
||||
@Override
|
||||
public GroupProvider permissionOnlyProvider() {
|
||||
return new PermissionGroupProvider();
|
||||
}
|
||||
|
||||
@@ -1,4 +1,7 @@
|
||||
package sh.okx.rankup.placeholders;
|
||||
|
||||
public class Expansion {
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
public interface Expansion {
|
||||
String placeholder(Player player, String placeholder);
|
||||
}
|
||||
|
||||
@@ -27,9 +27,10 @@ public class Placeholders {
|
||||
}
|
||||
|
||||
public void register() {
|
||||
expansion = new RankupExpansion(plugin, this);
|
||||
if (Bukkit.getPluginManager().isPluginEnabled("PlaceholderAPI")) {
|
||||
expansion = new RankupExpansion(plugin, this);
|
||||
expansion.register();
|
||||
RankupPlaceholderExpansion placeholderExpansion = new RankupPlaceholderExpansion(plugin, expansion);
|
||||
placeholderExpansion.register();
|
||||
registered = true;
|
||||
} else {
|
||||
registered = false;
|
||||
|
||||
@@ -1,4 +1,218 @@
|
||||
package sh.okx.rankup.placeholders;
|
||||
|
||||
public class RankupExpansion {
|
||||
import lombok.RequiredArgsConstructor;
|
||||
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.ranks.Rank;
|
||||
import sh.okx.rankup.ranks.RankElement;
|
||||
import sh.okx.rankup.ranks.Rankups;
|
||||
import sh.okx.rankup.requirements.Requirement;
|
||||
|
||||
import java.util.Objects;
|
||||
import java.util.function.Function;
|
||||
import java.util.regex.Matcher;
|
||||
import java.util.regex.Pattern;
|
||||
|
||||
@RequiredArgsConstructor
|
||||
public class RankupExpansion implements Expansion {
|
||||
private static final Pattern PATTERN = Pattern.compile("(.*)#(.*)");
|
||||
|
||||
private final RankupPlugin plugin;
|
||||
private final Placeholders placeholders;
|
||||
|
||||
@Override
|
||||
public String placeholder(Player player, String params) {
|
||||
if (player == null) {
|
||||
return "";
|
||||
}
|
||||
params = params.toLowerCase();
|
||||
|
||||
Rankups rankups = plugin.getRankups();
|
||||
RankElement<Rank> rankElement = rankups.getByPlayer(player);
|
||||
Rank rank = rankElement == null ? null : rankElement.getRank();
|
||||
|
||||
Prestiges prestiges = plugin.getPrestiges();
|
||||
RankElement<Prestige> prestigeElement = null;
|
||||
Prestige prestige = null;
|
||||
if (prestiges != null) {
|
||||
prestigeElement = prestiges.getByPlayer(player);
|
||||
prestige = prestigeElement == null ? null : prestigeElement.getRank();
|
||||
}
|
||||
|
||||
if (params.startsWith("requirement_")) {
|
||||
String[] parts = params.split("_", 3);
|
||||
return getPlaceholderRequirement(player, rank,
|
||||
replacePattern(parts[1]), parts.length > 2 ? parts[2] : "");
|
||||
} else if (params.startsWith("rank_requirement_")) {
|
||||
String[] parts = params.split("_", 5);
|
||||
return getPlaceholderRequirement(player, rankups.getByName(parts[2]),
|
||||
replacePattern(parts[3]), parts.length > 4 ? parts[4] : "");
|
||||
// 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(player, "money").getValueDouble();
|
||||
if (parts.length > 3 && parts[3].equalsIgnoreCase("left")) {
|
||||
amount = amount - plugin.getEconomy().getBalance(player);
|
||||
}
|
||||
return plugin.formatMoney(Math.max(0, amount));
|
||||
} else if (params.startsWith("status_")) {
|
||||
String[] parts = params.split("_", 2);
|
||||
Rank statusRank = rankups.getByName(parts[1]);
|
||||
|
||||
if (statusRank == null) {
|
||||
return null;
|
||||
}
|
||||
if (rank == null) {
|
||||
return getPlaceholder("status.incomplete");
|
||||
}
|
||||
if (statusRank.equals(rank)) {
|
||||
return getPlaceholder("status.current");
|
||||
}
|
||||
|
||||
// is playerRank before or after statusRank?
|
||||
for (RankElement<Rank> element : rankups.getTree().asList()) {
|
||||
if (element.getRank().equals(statusRank)) {
|
||||
return getPlaceholder("status.complete");
|
||||
} else if (element.getRank().equals(rank)) {
|
||||
return getPlaceholder("status.incomplete");
|
||||
}
|
||||
}
|
||||
|
||||
// this should not happen
|
||||
return null;
|
||||
}
|
||||
|
||||
switch (params) {
|
||||
case "current_prestige":
|
||||
requirePrestiging(prestiges, params);
|
||||
if (prestige == null || prestige.getRank() == null) {
|
||||
return getPlaceholder("no-prestige");
|
||||
} else {
|
||||
return prestige.getRank();
|
||||
}
|
||||
case "next_prestige":
|
||||
requirePrestiging(prestiges, params);
|
||||
if (prestigeElement != null && !prestigeElement.hasNext()) {
|
||||
return getPlaceholder("highest-rank");
|
||||
}
|
||||
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(player, "money").getValueDouble() : 0, 0)));
|
||||
case "prestige_money_formatted":
|
||||
requirePrestiging(prestiges, params);
|
||||
return plugin.formatMoney(orElse(prestige, r -> r.isIn(player) ? r.getRequirement(player, "money").getValueDouble() : 0, 0D));
|
||||
case "current_rank":
|
||||
if (rank == null) {
|
||||
return getPlaceholder("not-in-ladder");
|
||||
} else {
|
||||
return rank.getRank();
|
||||
}
|
||||
case "next_rank":
|
||||
if (rankElement != null && !rankElement.hasNext()) {
|
||||
return getPlaceholder("highest-rank");
|
||||
}
|
||||
return orElsePlaceholder(rank, r -> orElsePlaceholder(rank, Rank::getNext, "highest-rank"), "not-in-ladder");
|
||||
case "money":
|
||||
return String.valueOf(getMoney(player, rank));
|
||||
case "money_formatted":
|
||||
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(player, "money").getValueDouble()), 0).doubleValue()));
|
||||
case "money_left_formatted":
|
||||
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(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(player, "money").getValueDouble())) * 100, 0).doubleValue()));
|
||||
case "percent_done":
|
||||
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(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(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(player, "money").getValueDouble()) * 100, 0).doubleValue()));
|
||||
default:
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
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) {
|
||||
Objects.requireNonNull(prestiges, "Using %rankup_" + params + "% prestige placeholder but prestiging is disabled.");
|
||||
}
|
||||
|
||||
private String getPlaceholderRequirement(Player player, Rank rank, String requirementName, String params) {
|
||||
if (rank == null) {
|
||||
return "";
|
||||
}
|
||||
Requirement requirement = rank.getRequirement(player, requirementName);
|
||||
switch (params) {
|
||||
case "":
|
||||
return orElse(requirement, Requirement::getValueString, "0");
|
||||
case "left":
|
||||
return placeholders.getSimpleFormat().format(orElse(requirement, r -> r.getRemaining(player), 0));
|
||||
case "done":
|
||||
return placeholders.getSimpleFormat().format(orElse(requirement, r -> r.getValueDouble() - r.getRemaining(player), 0));
|
||||
case "percent_left":
|
||||
return placeholders.getPercentFormat().format(orElse(requirement, r -> (r.getRemaining(player) / r.getValueDouble()) * 100, 0));
|
||||
case "percent_done":
|
||||
return placeholders.getPercentFormat().format(orElse(requirement, r -> (1 - (r.getRemaining(player) / r.getValueDouble())) * 100, 100));
|
||||
default:
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
private Number simplify(Number number) {
|
||||
if (number instanceof Float) {
|
||||
return (float) number % 1 == 0 ? number.intValue() : number;
|
||||
} else if (number instanceof Double) {
|
||||
return (double) number % 1 == 0 ? number.longValue() : number;
|
||||
} else {
|
||||
return number;
|
||||
}
|
||||
}
|
||||
|
||||
private <T> String orElsePlaceholder(T t, Function<T, Object> value, Object fallback) {
|
||||
if (t == null) {
|
||||
return getPlaceholder(String.valueOf(fallback));
|
||||
}
|
||||
|
||||
try {
|
||||
return String.valueOf(value.apply(t));
|
||||
} catch (NullPointerException ex) {
|
||||
return getPlaceholder(String.valueOf(fallback));
|
||||
}
|
||||
}
|
||||
|
||||
private <T, R> R orElse(T t, Function<T, R> value, R fallback) {
|
||||
if (t == null) {
|
||||
return fallback;
|
||||
}
|
||||
|
||||
try {
|
||||
return value.apply(t);
|
||||
} catch (NullPointerException ex) {
|
||||
return fallback;
|
||||
}
|
||||
}
|
||||
|
||||
private String replacePattern(String string) {
|
||||
Matcher matcher = PATTERN.matcher(string);
|
||||
if (matcher.matches()) {
|
||||
return matcher.group(1) + "#" + matcher.group(2).replace("-", "_");
|
||||
} else {
|
||||
return string;
|
||||
}
|
||||
}
|
||||
|
||||
private String getPlaceholder(String name) {
|
||||
return plugin.getConfig().getString("placeholders." + name);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -4,217 +4,15 @@ import lombok.RequiredArgsConstructor;
|
||||
import me.clip.placeholderapi.expansion.PlaceholderExpansion;
|
||||
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.ranks.Rank;
|
||||
import sh.okx.rankup.ranks.RankElement;
|
||||
import sh.okx.rankup.ranks.Rankups;
|
||||
import sh.okx.rankup.requirements.Requirement;
|
||||
|
||||
import java.util.Objects;
|
||||
import java.util.function.Function;
|
||||
import java.util.regex.Matcher;
|
||||
import java.util.regex.Pattern;
|
||||
|
||||
@RequiredArgsConstructor
|
||||
public class RankupExpansion extends PlaceholderExpansion {
|
||||
private static final Pattern PATTERN = Pattern.compile("(.*)#(.*)");
|
||||
|
||||
public class RankupPlaceholderExpansion extends PlaceholderExpansion {
|
||||
private final RankupPlugin plugin;
|
||||
private final Placeholders placeholders;
|
||||
private final RankupExpansion expansion;
|
||||
|
||||
@Override
|
||||
public String onPlaceholderRequest(Player player, String params) {
|
||||
if (player == null) {
|
||||
return "";
|
||||
}
|
||||
params = params.toLowerCase();
|
||||
|
||||
Rankups rankups = plugin.getRankups();
|
||||
RankElement<Rank> rankElement = rankups.getByPlayer(player);
|
||||
Rank rank = rankElement == null ? null : rankElement.getRank();
|
||||
|
||||
Prestiges prestiges = plugin.getPrestiges();
|
||||
RankElement<Prestige> prestigeElement = null;
|
||||
Prestige prestige = null;
|
||||
if (prestiges != null) {
|
||||
prestigeElement = prestiges.getByPlayer(player);
|
||||
prestige = prestigeElement == null ? null : prestigeElement.getRank();
|
||||
}
|
||||
|
||||
if (params.startsWith("requirement_")) {
|
||||
String[] parts = params.split("_", 3);
|
||||
return getPlaceholderRequirement(player, rank,
|
||||
replacePattern(parts[1]), parts.length > 2 ? parts[2] : "");
|
||||
} else if (params.startsWith("rank_requirement_")) {
|
||||
String[] parts = params.split("_", 5);
|
||||
return getPlaceholderRequirement(player, rankups.getByName(parts[2]),
|
||||
replacePattern(parts[3]), parts.length > 4 ? parts[4] : "");
|
||||
// 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(player, "money").getValueDouble();
|
||||
if (parts.length > 3 && parts[3].equalsIgnoreCase("left")) {
|
||||
amount = amount - plugin.getEconomy().getBalance(player);
|
||||
}
|
||||
return plugin.formatMoney(Math.max(0, amount));
|
||||
} else if (params.startsWith("status_")) {
|
||||
String[] parts = params.split("_", 2);
|
||||
Rank statusRank = rankups.getByName(parts[1]);
|
||||
|
||||
if (statusRank == null) {
|
||||
return null;
|
||||
}
|
||||
if (rank == null) {
|
||||
return getPlaceholder("status.incomplete");
|
||||
}
|
||||
if (statusRank.equals(rank)) {
|
||||
return getPlaceholder("status.current");
|
||||
}
|
||||
|
||||
// is playerRank before or after statusRank?
|
||||
for (RankElement<Rank> element : rankups.getTree().asList()) {
|
||||
if (element.getRank().equals(statusRank)) {
|
||||
return getPlaceholder("status.complete");
|
||||
} else if (element.getRank().equals(rank)) {
|
||||
return getPlaceholder("status.incomplete");
|
||||
}
|
||||
}
|
||||
|
||||
// this should not happen
|
||||
return null;
|
||||
}
|
||||
|
||||
switch (params) {
|
||||
case "current_prestige":
|
||||
requirePrestiging(prestiges, params);
|
||||
if (prestige == null || prestige.getRank() == null) {
|
||||
return getPlaceholder("no-prestige");
|
||||
} else {
|
||||
return prestige.getRank();
|
||||
}
|
||||
case "next_prestige":
|
||||
requirePrestiging(prestiges, params);
|
||||
if (prestigeElement != null && !prestigeElement.hasNext()) {
|
||||
return getPlaceholder("highest-rank");
|
||||
}
|
||||
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(player, "money").getValueDouble() : 0, 0)));
|
||||
case "prestige_money_formatted":
|
||||
requirePrestiging(prestiges, params);
|
||||
return plugin.formatMoney(orElse(prestige, r -> r.isIn(player) ? r.getRequirement(player, "money").getValueDouble() : 0, 0D));
|
||||
case "current_rank":
|
||||
if (rank == null) {
|
||||
return getPlaceholder("not-in-ladder");
|
||||
} else {
|
||||
return rank.getRank();
|
||||
}
|
||||
case "next_rank":
|
||||
if (rankElement != null && !rankElement.hasNext()) {
|
||||
return getPlaceholder("highest-rank");
|
||||
}
|
||||
return orElsePlaceholder(rank, r -> orElsePlaceholder(rank, Rank::getNext, "highest-rank"), "not-in-ladder");
|
||||
case "money":
|
||||
return String.valueOf(getMoney(player, rank));
|
||||
case "money_formatted":
|
||||
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(player, "money").getValueDouble()), 0).doubleValue()));
|
||||
case "money_left_formatted":
|
||||
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(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(player, "money").getValueDouble())) * 100, 0).doubleValue()));
|
||||
case "percent_done":
|
||||
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(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(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(player, "money").getValueDouble()) * 100, 0).doubleValue()));
|
||||
default:
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
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) {
|
||||
Objects.requireNonNull(prestiges, "Using %rankup_" + params + "% prestige placeholder but prestiging is disabled.");
|
||||
}
|
||||
|
||||
private String getPlaceholderRequirement(Player player, Rank rank, String requirementName, String params) {
|
||||
if (rank == null) {
|
||||
return "";
|
||||
}
|
||||
Requirement requirement = rank.getRequirement(player, requirementName);
|
||||
switch (params) {
|
||||
case "":
|
||||
return orElse(requirement, Requirement::getValueString, "0");
|
||||
case "left":
|
||||
return placeholders.getSimpleFormat().format(orElse(requirement, r -> r.getRemaining(player), 0));
|
||||
case "done":
|
||||
return placeholders.getSimpleFormat().format(orElse(requirement, r -> r.getValueDouble() - r.getRemaining(player), 0));
|
||||
case "percent_left":
|
||||
return placeholders.getPercentFormat().format(orElse(requirement, r -> (r.getRemaining(player) / r.getValueDouble()) * 100, 0));
|
||||
case "percent_done":
|
||||
return placeholders.getPercentFormat().format(orElse(requirement, r -> (1 - (r.getRemaining(player) / r.getValueDouble())) * 100, 100));
|
||||
default:
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
private Number simplify(Number number) {
|
||||
if (number instanceof Float) {
|
||||
return (float) number % 1 == 0 ? number.intValue() : number;
|
||||
} else if (number instanceof Double) {
|
||||
return (double) number % 1 == 0 ? number.longValue() : number;
|
||||
} else {
|
||||
return number;
|
||||
}
|
||||
}
|
||||
|
||||
private <T> String orElsePlaceholder(T t, Function<T, Object> value, Object fallback) {
|
||||
if (t == null) {
|
||||
return getPlaceholder(String.valueOf(fallback));
|
||||
}
|
||||
|
||||
try {
|
||||
return String.valueOf(value.apply(t));
|
||||
} catch (NullPointerException ex) {
|
||||
return getPlaceholder(String.valueOf(fallback));
|
||||
}
|
||||
}
|
||||
|
||||
private <T, R> R orElse(T t, Function<T, R> value, R fallback) {
|
||||
if (t == null) {
|
||||
return fallback;
|
||||
}
|
||||
|
||||
try {
|
||||
return value.apply(t);
|
||||
} catch (NullPointerException ex) {
|
||||
return fallback;
|
||||
}
|
||||
}
|
||||
|
||||
private String replacePattern(String string) {
|
||||
Matcher matcher = PATTERN.matcher(string);
|
||||
if (matcher.matches()) {
|
||||
return matcher.group(1) + "#" + matcher.group(2).replace("-", "_");
|
||||
} else {
|
||||
return string;
|
||||
}
|
||||
}
|
||||
|
||||
private String getPlaceholder(String name) {
|
||||
return plugin.getConfig().getString("placeholders." + name);
|
||||
return expansion.placeholder(player, params);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -1,4 +1,57 @@
|
||||
package sh.okx.rankup.requirements.requirement;
|
||||
|
||||
public class AdvancementRequirement {
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.advancement.Advancement;
|
||||
import org.bukkit.advancement.AdvancementProgress;
|
||||
import org.bukkit.entity.Player;
|
||||
import sh.okx.rankup.RankupPlugin;
|
||||
import sh.okx.rankup.requirements.Requirement;
|
||||
|
||||
import java.util.Iterator;
|
||||
import java.util.regex.Pattern;
|
||||
|
||||
/**
|
||||
* Advancement requirement
|
||||
* @author Link, with modifications from Okx
|
||||
*/
|
||||
public class AdvancementRequirement extends Requirement {
|
||||
public AdvancementRequirement(RankupPlugin plugin) {
|
||||
super(plugin, "advancement");
|
||||
}
|
||||
|
||||
protected AdvancementRequirement(Requirement clone) {
|
||||
super(clone);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean check(Player player) {
|
||||
for (String string : getValuesString()) {
|
||||
Iterator<Advancement> advancementIterator = Bukkit.advancementIterator();
|
||||
while (advancementIterator.hasNext()) {
|
||||
Advancement adv = advancementIterator.next();
|
||||
String key = adv.getKey().getKey();
|
||||
Pattern pattern = Pattern.compile(string.replace("*", ".*").replace("-", ""));
|
||||
boolean positive = false;
|
||||
if (pattern.matcher(key).find()) {
|
||||
positive = !string.startsWith("-");
|
||||
}
|
||||
|
||||
AdvancementProgress progress = player.getAdvancementProgress(adv);
|
||||
if (progress.isDone() == positive) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Requirement clone() {
|
||||
return new AdvancementRequirement(this);
|
||||
}
|
||||
|
||||
@Override
|
||||
public double getValueDouble() {
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
|
||||
+1
-1
@@ -1,8 +1,8 @@
|
||||
package sh.okx.rankup.requirements.requirement;
|
||||
|
||||
import net.milkbowl.vault.economy.Economy;
|
||||
import org.bukkit.entity.Player;
|
||||
import sh.okx.rankup.RankupPlugin;
|
||||
import sh.okx.rankup.economy.Economy;
|
||||
import sh.okx.rankup.requirements.DeductibleRequirement;
|
||||
import sh.okx.rankup.requirements.Requirement;
|
||||
|
||||
|
||||
+3
-2
@@ -1,8 +1,9 @@
|
||||
package sh.okx.rankup.requirements;
|
||||
package sh.okx.rankup.requirements.requirement;
|
||||
|
||||
import org.bukkit.entity.Player;
|
||||
import sh.okx.rankup.RankupPlugin;
|
||||
import sh.okx.rankup.requirements.requirement.XpLevelRequirement;
|
||||
import sh.okx.rankup.requirements.DeductibleRequirement;
|
||||
import sh.okx.rankup.requirements.Requirement;
|
||||
|
||||
public class XpLevelDeductibleRequirement extends XpLevelRequirement implements DeductibleRequirement {
|
||||
|
||||
|
||||
Reference in New Issue
Block a user