3.7 add prestige-based requirements

This commit is contained in:
okx-code
2020-04-13 14:24:31 +01:00
parent fe01ce1c4f
commit b7dfd5d9e3
92 changed files with 5908 additions and 5906 deletions
+29 -29
View File
@@ -1,29 +1,29 @@
package sh.okx.rankup;
import lombok.RequiredArgsConstructor;
import org.bukkit.Bukkit;
import org.bukkit.entity.Player;
import org.bukkit.scheduler.BukkitRunnable;
@RequiredArgsConstructor
public class AutoRankup extends BukkitRunnable {
private final RankupPlugin rankup;
@Override
public void run() {
if (rankup.error()) {
return;
}
RankupHelper helper = rankup.getHelper();
for (Player player : Bukkit.getOnlinePlayers()) {
if (player.hasPermission("rankup.auto")) {
if (helper.checkRankup(player, false)) {
helper.rankup(player);
} else if (rankup.getPrestiges() != null && helper.checkPrestige(player, false)) {
helper.prestige(player);
}
}
}
}
}
package sh.okx.rankup;
import lombok.RequiredArgsConstructor;
import org.bukkit.Bukkit;
import org.bukkit.entity.Player;
import org.bukkit.scheduler.BukkitRunnable;
@RequiredArgsConstructor
public class AutoRankup extends BukkitRunnable {
private final RankupPlugin rankup;
@Override
public void run() {
if (rankup.error()) {
return;
}
RankupHelper helper = rankup.getHelper();
for (Player player : Bukkit.getOnlinePlayers()) {
if (player.hasPermission("rankup.auto")) {
if (helper.checkRankup(player, false)) {
helper.rankup(player);
} else if (rankup.getPrestiges() != null && helper.checkPrestige(player, false)) {
helper.prestige(player);
}
}
}
}
}
@@ -1,31 +1,31 @@
package sh.okx.rankup;
import java.util.function.Supplier;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.player.PlayerJoinEvent;
import sh.okx.rankup.util.UpdateNotifier;
public class JoinUpdateNotifier implements Listener {
private final UpdateNotifier notifier;
private final Supplier<Boolean> enabledSupplier;
private final String permission;
public JoinUpdateNotifier(UpdateNotifier notifier,
Supplier<Boolean> enabledSupplier, String permission) {
this.notifier = notifier;
this.enabledSupplier = enabledSupplier;
this.permission = permission;
}
@EventHandler
public void on(PlayerJoinEvent e) {
if (enabledSupplier.get()) {
Player player = e.getPlayer();
if (player.hasPermission(permission)) {
notifier.notify(player, true);
}
}
}
}
package sh.okx.rankup;
import java.util.function.Supplier;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.player.PlayerJoinEvent;
import sh.okx.rankup.util.UpdateNotifier;
public class JoinUpdateNotifier implements Listener {
private final UpdateNotifier notifier;
private final Supplier<Boolean> enabledSupplier;
private final String permission;
public JoinUpdateNotifier(UpdateNotifier notifier,
Supplier<Boolean> enabledSupplier, String permission) {
this.notifier = notifier;
this.enabledSupplier = enabledSupplier;
this.permission = permission;
}
@EventHandler
public void on(PlayerJoinEvent e) {
if (enabledSupplier.get()) {
Player player = e.getPlayer();
if (player.hasPermission(permission)) {
notifier.notify(player, true);
}
}
}
}
File diff suppressed because it is too large Load Diff
+128 -128
View File
@@ -1,128 +1,128 @@
package sh.okx.rankup;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashSet;
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
protected final FileConfiguration config;
protected final Set<T> ranks = new HashSet<>();
public RankList(FileConfiguration config, Function<ConfigurationSection, T> deserializer) {
this.config = config;
for (Map.Entry<String, Object> entry : config.getValues(false).entrySet()) {
ConfigurationSection rankSection = (ConfigurationSection) entry.getValue();
validateSection(rankSection);
T apply = deserializer.apply(rankSection);
if (apply != null) {
ranks.add(apply);
}
}
List<T> ordered = getOrderedList();
Set<T> provisionalRanks = new HashSet<>(ordered);
this.ranks.clear();
this.ranks.addAll(provisionalRanks);
}
protected void validateSection(ConfigurationSection section) {
String name = "'" + section.getName() + "'";
/*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.contains("requirements")) {
throw new IllegalArgumentException("Rank " + name + " does not have any requirements.");
}
}
public T getFirst() {
OUTER:
for (T rank : ranks) {
// see if anything ranks up to this
for (T rank0 : ranks) {
if (rank0.getNext().equals(rank.getRank())) {
continue OUTER;
}
}
// nothing ranks up to this
return rank;
}
throw new IllegalArgumentException("Could not find a first rank. First ranks must not have anything that ranks up to them.");
}
public List<T> getOrderedList() {
List<T> list = new ArrayList<>();
T t = getFirst();
while (t != null) {
for (T existing : list) {
if (existing.equals(t)) {
throw new IllegalArgumentException("Infinite rankup loop detected at rank " + t.getRank() + " to " + t.getNext()
+ "\nMake sure no there are no rankups to previous ranks or to the same rank");
}
}
list.add(t);
t = next(t);
}
return list;
}
public T getByName(String name) {
if (name == null) {
return null;
}
for (T rank : ranks) {
if (name.equalsIgnoreCase(rank.getRank())) {
return rank;
}
}
return null;
}
public T getByPlayer(Player player) {
List<T> list = getOrderedList();
Collections.reverse(list);
for (T t : list) {
if (t.isIn(player)) {
return t;
}
}
return null;
}
public String getLast() {
List<T> list = getOrderedList();
return list.get(list.size() - 1).getNext();
}
public boolean isLast(PermissionProvider perms, Player player) {
String last = getLast();
return perms.inGroup(player.getUniqueId(), last);
}
public T next(T rank) {
for (T nextRank : ranks) {
if (rank.getNext() != null && rank.getNext().equalsIgnoreCase(nextRank.getRank())) {
return nextRank;
}
}
return null;
}
}
package sh.okx.rankup;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashSet;
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
protected final FileConfiguration config;
protected final Set<T> ranks = new HashSet<>();
public RankList(FileConfiguration config, Function<ConfigurationSection, T> deserializer) {
this.config = config;
for (Map.Entry<String, Object> entry : config.getValues(false).entrySet()) {
ConfigurationSection rankSection = (ConfigurationSection) entry.getValue();
validateSection(rankSection);
T apply = deserializer.apply(rankSection);
if (apply != null) {
ranks.add(apply);
}
}
List<T> ordered = getOrderedList();
Set<T> provisionalRanks = new HashSet<>(ordered);
this.ranks.clear();
this.ranks.addAll(provisionalRanks);
}
protected void validateSection(ConfigurationSection section) {
String name = "'" + section.getName() + "'";
/*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.contains("requirements")) {
throw new IllegalArgumentException("Rank " + name + " does not have any requirements.");
}
}
public T getFirst() {
OUTER:
for (T rank : ranks) {
// see if anything ranks up to this
for (T rank0 : ranks) {
if (rank0.getNext().equals(rank.getRank())) {
continue OUTER;
}
}
// nothing ranks up to this
return rank;
}
throw new IllegalArgumentException("Could not find a first rank. First ranks must not have anything that ranks up to them.");
}
public List<T> getOrderedList() {
List<T> list = new ArrayList<>();
T t = getFirst();
while (t != null) {
for (T existing : list) {
if (existing.equals(t)) {
throw new IllegalArgumentException("Infinite rankup loop detected at rank " + t.getRank() + " to " + t.getNext()
+ "\nMake sure no there are no rankups to previous ranks or to the same rank");
}
}
list.add(t);
t = next(t);
}
return list;
}
public T getByName(String name) {
if (name == null) {
return null;
}
for (T rank : ranks) {
if (name.equalsIgnoreCase(rank.getRank())) {
return rank;
}
}
return null;
}
public T getByPlayer(Player player) {
List<T> list = getOrderedList();
Collections.reverse(list);
for (T t : list) {
if (t.isIn(player)) {
return t;
}
}
return null;
}
public String getLast() {
List<T> list = getOrderedList();
return list.get(list.size() - 1).getNext();
}
public boolean isLast(PermissionProvider perms, Player player) {
String last = getLast();
return perms.inGroup(player.getUniqueId(), last);
}
public T next(T rank) {
for (T nextRank : ranks) {
if (rank.getNext() != null && rank.getNext().equalsIgnoreCase(nextRank.getRank())) {
return nextRank;
}
}
return null;
}
}
+211 -211
View File
@@ -1,211 +1,211 @@
package sh.okx.rankup;
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;
import sh.okx.rankup.prestige.Prestiges;
import sh.okx.rankup.ranks.Rank;
import sh.okx.rankup.ranks.Rankups;
/**
* Actually performs the ranking up and prestiging for the plugin and also manages the cooldowns
* between ranking up.
*/
public class RankupHelper {
private final RankupPlugin plugin;
private final ConfigurationSection config;
private final PermissionProvider permissions;
/**
* Players who cannot rankup/prestige for a certain amount of time.
*/
private Map<Player, Long> cooldowns = new HashMap<>();
public RankupHelper(RankupPlugin plugin) {
this.plugin = plugin;
this.config = plugin.getConfig();
this.permissions = plugin.getPermissions();
}
public void doRankup(Player player, Rank rank) {
rank.runCommands(player);
if (rank.getRank() != null) {
permissions.removeGroup(player.getUniqueId(), rank.getRank());
}
permissions.addGroup(player.getUniqueId(), rank.getNext());
}
public void sendRankupMessages(Player player, Rank rank) {
plugin.getMessage(rank, Message.SUCCESS_PUBLIC)
.failIfEmpty()
.replaceRanks(player, rank, rank.getNext())
.broadcast();
plugin.getMessage(rank, Message.SUCCESS_PRIVATE)
.failIfEmpty()
.replaceRanks(player, rank, rank.getNext())
.send(player);
}
public void doPrestige(Player player, Prestige prestige) {
prestige.runCommands(player);
permissions.removeGroup(player.getUniqueId(), prestige.getFrom());
permissions.addGroup(player.getUniqueId(), prestige.getTo());
if (prestige.getRank() != null) {
permissions.removeGroup(player.getUniqueId(), prestige.getRank());
}
permissions.addGroup(player.getUniqueId(), prestige.getNext());
}
public void sendPrestigeMessages(Player player, Prestige prestige) {
plugin.getMessage(prestige, Message.PRESTIGE_SUCCESS_PUBLIC)
.failIfEmpty()
.replaceRanks(player, prestige, prestige.getNext())
.replaceFromTo(prestige)
.broadcast();
plugin.getMessage(prestige, Message.PRESTIGE_SUCCESS_PRIVATE)
.failIfEmpty()
.replaceRanks(player, prestige, prestige.getNext())
.replaceFromTo(prestige)
.send(player);
}
private boolean checkCooldown(Player player, Rank rank) {
if (cooldowns.containsKey(player)) {
long time = System.currentTimeMillis() - cooldowns.get(player);
// if time passed is less than the cooldown
long cooldownSeconds = config.getInt("cooldown");
long timeLeft = (cooldownSeconds * 1000) - time;
if (timeLeft > 0) {
long secondsLeft = (long) Math.ceil(timeLeft / 1000f);
plugin
.getMessage(rank, secondsLeft > 1 ? Message.COOLDOWN_PLURAL : Message.COOLDOWN_SINGULAR)
.failIfEmpty()
.replaceRanks(player, rank.getRank())
.replaceFromTo(rank)
.replace(Variable.SECONDS, cooldownSeconds)
.replace(Variable.SECONDS_LEFT, secondsLeft)
.send(player);
return true;
}
// cooldown has expired so remove it
cooldowns.remove(player);
}
return false;
}
private void applyCooldown(Player player) {
if (config.getInt("cooldown") > 0) {
cooldowns.put(player, System.currentTimeMillis());
}
}
public void rankup(Player player) {
if (!checkRankup(player)) {
return;
}
Rank rank = plugin.getRankups().getByPlayer(player);
rank.applyRequirements(player);
applyCooldown(player);
doRankup(player, rank);
sendRankupMessages(player, rank);
}
public boolean checkRankup(Player player) {
return checkRankup(player, true);
}
/**
* Checks if a player can rankup, and if they can't, sends the player a message and returns false
*
* @param player the player to check if they can rankup
* @return true if the player can rankup, false otherwise
*/
public boolean checkRankup(Player player, boolean message) {
Rankups rankups = plugin.getRankups();
Rank rank = rankups.getByPlayer(player);
if (rankups.isLast(permissions, player)) {
Prestiges prestiges = plugin.getPrestiges();
plugin.getMessage(prestiges == null || prestiges.isLast(permissions, player) ? Message.NO_RANKUP : Message.MUST_PRESTIGE)
.failIf(!message)
.replaceRanks(player, rankups.getLast())
.send(player);
return false;
} else if (rank == null) { // check if in ladder
plugin.getMessage(Message.NOT_IN_LADDER)
.failIf(!message)
.replace(Variable.PLAYER, player.getName())
.send(player);
return false;
} else if (!rank.hasRequirements(player)) { // check if they can afford it
if (message) {
plugin.replaceMoneyRequirements(plugin.getMessage(rank, Message.REQUIREMENTS_NOT_MET)
.replaceRanks(player, rank, rank.getNext()), player, rank)
.send(player);
}
return false;
} else if (message && checkCooldown(player, rank)) {
return false;
}
return true;
}
public void prestige(Player player) {
if (!checkPrestige(player)) {
return;
}
Prestige prestige = plugin.getPrestiges().getByPlayer(player);
prestige.applyRequirements(player);
applyCooldown(player);
doPrestige(player, prestige);
sendPrestigeMessages(player, prestige);
}
public boolean checkPrestige(Player player) {
return checkPrestige(player, true);
}
public boolean checkPrestige(Player player, boolean message) {
Prestiges prestiges = plugin.getPrestiges();
Prestige prestige = prestiges.getByPlayer(player);
if (prestige == null || !prestige.isEligable(player)) { // check if in ladder
plugin.getMessage(Message.NOT_HIGH_ENOUGH)
.failIf(!message)
.replace(Variable.PLAYER, player.getName())
.send(player);
return false;
} else if (prestiges
.isLast(plugin.getPermissions(), player)) { // check if they are at the highest rank
plugin.getMessage(prestige, Message.PRESTIGE_NO_PRESTIGE)
.failIf(!message)
.replaceRanks(player, prestige.getRank())
.replaceFromTo(prestige)
.send(player);
return false;
} else if (!prestige.hasRequirements(player)) { // check if they can afford it
plugin.replaceMoneyRequirements(
plugin.getMessage(prestige, Message.PRESTIGE_REQUIREMENTS_NOT_MET)
.failIf(!message)
.replaceRanks(player, prestige, prestiges.next(prestige).getRank()), player, prestige)
.replaceFromTo(prestige)
.send(player);
return false;
} else if (checkCooldown(player, prestige)) {
return false;
}
return true;
}
}
package sh.okx.rankup;
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;
import sh.okx.rankup.prestige.Prestiges;
import sh.okx.rankup.ranks.Rank;
import sh.okx.rankup.ranks.Rankups;
/**
* Actually performs the ranking up and prestiging for the plugin and also manages the cooldowns
* between ranking up.
*/
public class RankupHelper {
private final RankupPlugin plugin;
private final ConfigurationSection config;
private final PermissionProvider permissions;
/**
* Players who cannot rankup/prestige for a certain amount of time.
*/
private Map<Player, Long> cooldowns = new HashMap<>();
public RankupHelper(RankupPlugin plugin) {
this.plugin = plugin;
this.config = plugin.getConfig();
this.permissions = plugin.getPermissions();
}
public void doRankup(Player player, Rank rank) {
rank.runCommands(player);
if (rank.getRank() != null) {
permissions.removeGroup(player.getUniqueId(), rank.getRank());
}
permissions.addGroup(player.getUniqueId(), rank.getNext());
}
public void sendRankupMessages(Player player, Rank rank) {
plugin.getMessage(rank, Message.SUCCESS_PUBLIC)
.failIfEmpty()
.replaceRanks(player, rank, rank.getNext())
.broadcast();
plugin.getMessage(rank, Message.SUCCESS_PRIVATE)
.failIfEmpty()
.replaceRanks(player, rank, rank.getNext())
.send(player);
}
public void doPrestige(Player player, Prestige prestige) {
prestige.runCommands(player);
permissions.removeGroup(player.getUniqueId(), prestige.getFrom());
permissions.addGroup(player.getUniqueId(), prestige.getTo());
if (prestige.getRank() != null) {
permissions.removeGroup(player.getUniqueId(), prestige.getRank());
}
permissions.addGroup(player.getUniqueId(), prestige.getNext());
}
public void sendPrestigeMessages(Player player, Prestige prestige) {
plugin.getMessage(prestige, Message.PRESTIGE_SUCCESS_PUBLIC)
.failIfEmpty()
.replaceRanks(player, prestige, prestige.getNext())
.replaceFromTo(prestige)
.broadcast();
plugin.getMessage(prestige, Message.PRESTIGE_SUCCESS_PRIVATE)
.failIfEmpty()
.replaceRanks(player, prestige, prestige.getNext())
.replaceFromTo(prestige)
.send(player);
}
private boolean checkCooldown(Player player, Rank rank) {
if (cooldowns.containsKey(player)) {
long time = System.currentTimeMillis() - cooldowns.get(player);
// if time passed is less than the cooldown
long cooldownSeconds = config.getInt("cooldown");
long timeLeft = (cooldownSeconds * 1000) - time;
if (timeLeft > 0) {
long secondsLeft = (long) Math.ceil(timeLeft / 1000f);
plugin
.getMessage(rank, secondsLeft > 1 ? Message.COOLDOWN_PLURAL : Message.COOLDOWN_SINGULAR)
.failIfEmpty()
.replaceRanks(player, rank.getRank())
.replaceFromTo(rank)
.replace(Variable.SECONDS, cooldownSeconds)
.replace(Variable.SECONDS_LEFT, secondsLeft)
.send(player);
return true;
}
// cooldown has expired so remove it
cooldowns.remove(player);
}
return false;
}
private void applyCooldown(Player player) {
if (config.getInt("cooldown") > 0) {
cooldowns.put(player, System.currentTimeMillis());
}
}
public void rankup(Player player) {
if (!checkRankup(player)) {
return;
}
Rank rank = plugin.getRankups().getByPlayer(player);
rank.applyRequirements(player);
applyCooldown(player);
doRankup(player, rank);
sendRankupMessages(player, rank);
}
public boolean checkRankup(Player player) {
return checkRankup(player, true);
}
/**
* Checks if a player can rankup, and if they can't, sends the player a message and returns false
*
* @param player the player to check if they can rankup
* @return true if the player can rankup, false otherwise
*/
public boolean checkRankup(Player player, boolean message) {
Rankups rankups = plugin.getRankups();
Rank rank = rankups.getByPlayer(player);
if (rankups.isLast(permissions, player)) {
Prestiges prestiges = plugin.getPrestiges();
plugin.getMessage(prestiges == null || prestiges.isLast(permissions, player) ? Message.NO_RANKUP : Message.MUST_PRESTIGE)
.failIf(!message)
.replaceRanks(player, rankups.getLast())
.send(player);
return false;
} else if (rank == null) { // check if in ladder
plugin.getMessage(Message.NOT_IN_LADDER)
.failIf(!message)
.replace(Variable.PLAYER, player.getName())
.send(player);
return false;
} else if (!rank.hasRequirements(player)) { // check if they can afford it
if (message) {
plugin.replaceMoneyRequirements(plugin.getMessage(rank, Message.REQUIREMENTS_NOT_MET)
.replaceRanks(player, rank, rank.getNext()), player, rank)
.send(player);
}
return false;
} else if (message && checkCooldown(player, rank)) {
return false;
}
return true;
}
public void prestige(Player player) {
if (!checkPrestige(player)) {
return;
}
Prestige prestige = plugin.getPrestiges().getByPlayer(player);
prestige.applyRequirements(player);
applyCooldown(player);
doPrestige(player, prestige);
sendPrestigeMessages(player, prestige);
}
public boolean checkPrestige(Player player) {
return checkPrestige(player, true);
}
public boolean checkPrestige(Player player, boolean message) {
Prestiges prestiges = plugin.getPrestiges();
Prestige prestige = prestiges.getByPlayer(player);
if (prestige == null || !prestige.isEligable(player)) { // check if in ladder
plugin.getMessage(Message.NOT_HIGH_ENOUGH)
.failIf(!message)
.replace(Variable.PLAYER, player.getName())
.send(player);
return false;
} else if (prestiges
.isLast(plugin.getPermissions(), player)) { // check if they are at the highest rank
plugin.getMessage(prestige, Message.PRESTIGE_NO_PRESTIGE)
.failIf(!message)
.replaceRanks(player, prestige.getRank())
.replaceFromTo(prestige)
.send(player);
return false;
} else if (!prestige.hasRequirements(player)) { // check if they can afford it
plugin.replaceMoneyRequirements(
plugin.getMessage(prestige, Message.PRESTIGE_REQUIREMENTS_NOT_MET)
.failIf(!message)
.replaceRanks(player, prestige, prestiges.next(prestige).getRank()), player, prestige)
.replaceFromTo(prestige)
.send(player);
return false;
} else if (checkCooldown(player, prestige)) {
return false;
}
return true;
}
}
File diff suppressed because it is too large Load Diff
@@ -1,38 +1,38 @@
package sh.okx.rankup;
import lombok.Getter;
import lombok.RequiredArgsConstructor;
import org.bukkit.event.Event;
import org.bukkit.event.HandlerList;
import sh.okx.rankup.requirements.Requirement;
import sh.okx.rankup.requirements.RequirementRegistry;
/**
* Called immediately before rankups and prestiges are registered,
* and immediately after the built-in requirements are registered.
* This is used to register custom requirements.
* This is called when the plugin is enabled, and when it is reloaded from a command.
*/
@RequiredArgsConstructor
public class RankupRegisterEvent extends Event {
private static final HandlerList handlers = new HandlerList();
@Getter
private final RankupPlugin plugin;
public static HandlerList getHandlerList() {
return handlers;
}
public RequirementRegistry getRequirementRegistry() {
return plugin.getRequirements();
}
public void addRequirement(Requirement requirement) {
plugin.getRequirements().addRequirement(requirement);
}
@Override
public HandlerList getHandlers() {
return handlers;
}
}
package sh.okx.rankup;
import lombok.Getter;
import lombok.RequiredArgsConstructor;
import org.bukkit.event.Event;
import org.bukkit.event.HandlerList;
import sh.okx.rankup.requirements.Requirement;
import sh.okx.rankup.requirements.RequirementRegistry;
/**
* Called immediately before rankups and prestiges are registered,
* and immediately after the built-in requirements are registered.
* This is used to register custom requirements.
* This is called when the plugin is enabled, and when it is reloaded from a command.
*/
@RequiredArgsConstructor
public class RankupRegisterEvent extends Event {
private static final HandlerList handlers = new HandlerList();
@Getter
private final RankupPlugin plugin;
public static HandlerList getHandlerList() {
return handlers;
}
public RequirementRegistry getRequirementRegistry() {
return plugin.getRequirements();
}
public void addRequirement(Requirement requirement) {
plugin.getRequirements().addRequirement(requirement);
}
@Override
public HandlerList getHandlers() {
return handlers;
}
}
@@ -1,130 +1,130 @@
package sh.okx.rankup.commands;
import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
import org.bukkit.command.Command;
import org.bukkit.command.CommandExecutor;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import org.bukkit.plugin.PluginDescriptionFile;
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.Rankups;
import sh.okx.rankup.util.UpdateNotifier;
public class InfoCommand implements CommandExecutor {
private final RankupPlugin plugin;
private final UpdateNotifier notifier;
public InfoCommand(RankupPlugin plugin, UpdateNotifier notifier) {
this.plugin = plugin;
this.notifier = notifier;
}
@Override
public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
if (args.length > 0) {
if (args[0].equalsIgnoreCase("reload") && sender.hasPermission("rankup.reload")) {
plugin.reload(false);
if (!plugin.error(sender)) {
sender.sendMessage(ChatColor.GREEN + "" + ChatColor.BOLD + "Rankup " + ChatColor.YELLOW + "Reloaded configuration files.");
}
return true;
} else if (args[0].equalsIgnoreCase("forcerankup") && sender.hasPermission("rankup.force")) {
if (args.length < 2) {
sender.sendMessage(ChatColor.YELLOW + "Usage: /" + label + " forcerankup <player>");
return true;
}
Player player = Bukkit.getPlayer(args[1]);
if (player == null) {
sender.sendMessage(ChatColor.YELLOW + "Player not found.");
return true;
}
Rankups rankups = plugin.getRankups();
if (rankups.isLast(plugin.getPermissions(), player)) {
sender.sendMessage(ChatColor.YELLOW + "That player is at the last rank.");
return true;
}
Rank rank = rankups.getByPlayer(player);
if (rank == null) {
sender.sendMessage(ChatColor.YELLOW + "That player is not in any rankup groups.");
return true;
}
plugin.getHelper().doRankup(player, rank);
plugin.getHelper().sendRankupMessages(player, rank);
sender.sendMessage(ChatColor.GREEN + "Successfully forced "
+ ChatColor.GOLD + player.getName()
+ ChatColor.GREEN + " to rankup from " + ChatColor.GOLD + rank.getRank()
+ ChatColor.GREEN + " to " + ChatColor.GOLD + rank.getNext());
return true;
} else if (args[0].equalsIgnoreCase("forceprestige") && sender.hasPermission("rankup.force")) {
if (plugin.getPrestiges() == null) {
sender.sendMessage(ChatColor.RED + "Prestige is disabled.");
return true;
}
if (args.length < 2) {
sender.sendMessage(ChatColor.YELLOW + "Usage: /" + label + " forceprestige <player>");
return true;
}
Player player = Bukkit.getPlayer(args[1]);
if (player == null) {
sender.sendMessage(ChatColor.YELLOW + "Player not found.");
return true;
}
Prestiges prestiges = plugin.getPrestiges();
if (prestiges.isLast(plugin.getPermissions(), player)) {
sender.sendMessage(ChatColor.YELLOW + "That player is at the last prestige.");
return true;
}
Prestige prestige = prestiges.getByPlayer(player);
if (prestige == null) {
sender.sendMessage(ChatColor.YELLOW + "That player is not in any prestige groups.");
return true;
}
plugin.getHelper().doPrestige(player, prestige);
plugin.getHelper().sendPrestigeMessages(player, prestige);
sender.sendMessage(ChatColor.GREEN + "Successfully forced "
+ ChatColor.GOLD + player.getName()
+ ChatColor.GREEN + " to prestige "
+ ChatColor.GOLD + prestige.getRank()
+ ChatColor.GREEN + " from " + ChatColor.GOLD + prestige.getFrom()
+ ChatColor.GREEN + " to " + ChatColor.GOLD + prestige.getTo());
return true;
}
}
PluginDescriptionFile description = plugin.getDescription();
String version = description.getVersion();
sender.sendMessage(
ChatColor.GREEN + "" + ChatColor.BOLD + description.getName() + " " + version +
ChatColor.YELLOW + " by " + ChatColor.BLUE + ChatColor.BOLD + String.join(", ", description.getAuthors()));
if (sender.hasPermission("rankup.reload")) {
sender.sendMessage(ChatColor.GREEN + "/" + label + " reload " + ChatColor.YELLOW + "Reloads configuration files.");
sender.sendMessage(ChatColor.GREEN + "/" + label + " forcerankup <player> " + ChatColor.YELLOW + "Force a player to rankup, bypassing requirements.");
if (plugin.getPrestiges() != null) {
sender.sendMessage(
ChatColor.GREEN + "/" + label + " forceprestige <player> " + ChatColor.YELLOW
+ "Force a player to prestige, bypassing requirements.");
}
}
if (sender.hasPermission("rankup.checkversion")) {
notifier.notify(sender, false);
}
return true;
}
}
package sh.okx.rankup.commands;
import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
import org.bukkit.command.Command;
import org.bukkit.command.CommandExecutor;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import org.bukkit.plugin.PluginDescriptionFile;
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.Rankups;
import sh.okx.rankup.util.UpdateNotifier;
public class InfoCommand implements CommandExecutor {
private final RankupPlugin plugin;
private final UpdateNotifier notifier;
public InfoCommand(RankupPlugin plugin, UpdateNotifier notifier) {
this.plugin = plugin;
this.notifier = notifier;
}
@Override
public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
if (args.length > 0) {
if (args[0].equalsIgnoreCase("reload") && sender.hasPermission("rankup.reload")) {
plugin.reload(false);
if (!plugin.error(sender)) {
sender.sendMessage(ChatColor.GREEN + "" + ChatColor.BOLD + "Rankup " + ChatColor.YELLOW + "Reloaded configuration files.");
}
return true;
} else if (args[0].equalsIgnoreCase("forcerankup") && sender.hasPermission("rankup.force")) {
if (args.length < 2) {
sender.sendMessage(ChatColor.YELLOW + "Usage: /" + label + " forcerankup <player>");
return true;
}
Player player = Bukkit.getPlayer(args[1]);
if (player == null) {
sender.sendMessage(ChatColor.YELLOW + "Player not found.");
return true;
}
Rankups rankups = plugin.getRankups();
if (rankups.isLast(plugin.getPermissions(), player)) {
sender.sendMessage(ChatColor.YELLOW + "That player is at the last rank.");
return true;
}
Rank rank = rankups.getByPlayer(player);
if (rank == null) {
sender.sendMessage(ChatColor.YELLOW + "That player is not in any rankup groups.");
return true;
}
plugin.getHelper().doRankup(player, rank);
plugin.getHelper().sendRankupMessages(player, rank);
sender.sendMessage(ChatColor.GREEN + "Successfully forced "
+ ChatColor.GOLD + player.getName()
+ ChatColor.GREEN + " to rankup from " + ChatColor.GOLD + rank.getRank()
+ ChatColor.GREEN + " to " + ChatColor.GOLD + rank.getNext());
return true;
} else if (args[0].equalsIgnoreCase("forceprestige") && sender.hasPermission("rankup.force")) {
if (plugin.getPrestiges() == null) {
sender.sendMessage(ChatColor.RED + "Prestige is disabled.");
return true;
}
if (args.length < 2) {
sender.sendMessage(ChatColor.YELLOW + "Usage: /" + label + " forceprestige <player>");
return true;
}
Player player = Bukkit.getPlayer(args[1]);
if (player == null) {
sender.sendMessage(ChatColor.YELLOW + "Player not found.");
return true;
}
Prestiges prestiges = plugin.getPrestiges();
if (prestiges.isLast(plugin.getPermissions(), player)) {
sender.sendMessage(ChatColor.YELLOW + "That player is at the last prestige.");
return true;
}
Prestige prestige = prestiges.getByPlayer(player);
if (prestige == null) {
sender.sendMessage(ChatColor.YELLOW + "That player is not in any prestige groups.");
return true;
}
plugin.getHelper().doPrestige(player, prestige);
plugin.getHelper().sendPrestigeMessages(player, prestige);
sender.sendMessage(ChatColor.GREEN + "Successfully forced "
+ ChatColor.GOLD + player.getName()
+ ChatColor.GREEN + " to prestige "
+ ChatColor.GOLD + prestige.getRank()
+ ChatColor.GREEN + " from " + ChatColor.GOLD + prestige.getFrom()
+ ChatColor.GREEN + " to " + ChatColor.GOLD + prestige.getTo());
return true;
}
}
PluginDescriptionFile description = plugin.getDescription();
String version = description.getVersion();
sender.sendMessage(
ChatColor.GREEN + "" + ChatColor.BOLD + description.getName() + " " + version +
ChatColor.YELLOW + " by " + ChatColor.BLUE + ChatColor.BOLD + String.join(", ", description.getAuthors()));
if (sender.hasPermission("rankup.reload")) {
sender.sendMessage(ChatColor.GREEN + "/" + label + " reload " + ChatColor.YELLOW + "Reloads configuration files.");
sender.sendMessage(ChatColor.GREEN + "/" + label + " forcerankup <player> " + ChatColor.YELLOW + "Force a player to rankup, bypassing requirements.");
if (plugin.getPrestiges() != null) {
sender.sendMessage(
ChatColor.GREEN + "/" + label + " forceprestige <player> " + ChatColor.YELLOW
+ "Force a player to prestige, bypassing requirements.");
}
}
if (sender.hasPermission("rankup.checkversion")) {
notifier.notify(sender, false);
}
return true;
}
}
@@ -1,45 +1,45 @@
package sh.okx.rankup.commands;
import lombok.RequiredArgsConstructor;
import org.bukkit.command.Command;
import org.bukkit.command.CommandExecutor;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import sh.okx.rankup.RankupPlugin;
import sh.okx.rankup.RankupHelper;
import sh.okx.rankup.ranks.Rank;
@RequiredArgsConstructor
public class MaxRankupCommand implements CommandExecutor {
private final RankupPlugin plugin;
@Override
public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
if (!(sender instanceof Player)) {
return false;
}
RankupHelper helper = plugin.getHelper();
Player player = (Player) sender;
if (!helper.checkRankup(player)) {
return true;
}
do {
Rank rank = plugin.getRankups().getByPlayer(player);
rank.applyRequirements(player);
helper.doRankup(player, rank);
// if the individual-messages setting is disabled, only send the "well done you ranked up"
// messages if they can't rank up any more.
if (plugin.getConfig().getBoolean("max-rankup.individual-messages")
|| !helper.checkRankup(player, false)) {
helper.sendRankupMessages(player, rank);
}
} while (helper.checkRankup(player, false));
return true;
}
}
package sh.okx.rankup.commands;
import lombok.RequiredArgsConstructor;
import org.bukkit.command.Command;
import org.bukkit.command.CommandExecutor;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import sh.okx.rankup.RankupPlugin;
import sh.okx.rankup.RankupHelper;
import sh.okx.rankup.ranks.Rank;
@RequiredArgsConstructor
public class MaxRankupCommand implements CommandExecutor {
private final RankupPlugin plugin;
@Override
public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
if (!(sender instanceof Player)) {
return false;
}
RankupHelper helper = plugin.getHelper();
Player player = (Player) sender;
if (!helper.checkRankup(player)) {
return true;
}
do {
Rank rank = plugin.getRankups().getByPlayer(player);
rank.applyRequirements(player);
helper.doRankup(player, rank);
// if the individual-messages setting is disabled, only send the "well done you ranked up"
// messages if they can't rank up any more.
if (plugin.getConfig().getBoolean("max-rankup.individual-messages")
|| !helper.checkRankup(player, false)) {
helper.sendRankupMessages(player, rank);
}
} while (helper.checkRankup(player, false));
return true;
}
}
@@ -1,73 +1,73 @@
package sh.okx.rankup.commands;
import lombok.RequiredArgsConstructor;
import org.bukkit.command.Command;
import org.bukkit.command.CommandExecutor;
import org.bukkit.command.CommandSender;
import org.bukkit.configuration.file.FileConfiguration;
import org.bukkit.entity.Player;
import sh.okx.rankup.RankupPlugin;
import sh.okx.rankup.gui.Gui;
import sh.okx.rankup.messages.Message;
import sh.okx.rankup.prestige.Prestige;
import sh.okx.rankup.prestige.Prestiges;
import java.util.Map;
import java.util.WeakHashMap;
@RequiredArgsConstructor
public class PrestigeCommand implements CommandExecutor {
private final Map<Player, Long> confirming = new WeakHashMap<>();
private final RankupPlugin plugin;
@Override
public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
if (plugin.error(sender)) {
return true;
}
// check if player
if (!(sender instanceof Player)) {
return false;
}
Player player = (Player) sender;
Prestiges prestiges = plugin.getPrestiges();
Prestige prestige = prestiges.getByPlayer(player);
if (!plugin.getHelper().checkPrestige(player)) {
return true;
}
FileConfiguration config = plugin.getConfig();
String confirmationType = config.getString("confirmation-type").toLowerCase();
if (confirmationType.equals("text") && confirming.containsKey(player)) {
long time = System.currentTimeMillis() - confirming.remove(player);
if (time < config.getInt("text.timeout") * 1000) {
plugin.getHelper().prestige(player);
return true;
}
}
switch (confirmationType) {
case "text":
confirming.put(player, System.currentTimeMillis());
Prestige next = prestiges.next(prestige);
String nextRank = next == null ? prestiges.getLast() : next.getRank();
plugin.replaceMoneyRequirements(plugin.getMessage(prestige, Message.PRESTIGE_CONFIRMATION)
.replaceRanks(player, prestige, nextRank), player, prestige)
.replaceFromTo(prestige)
.send(player);
break;
case "gui":
Gui.of(player, prestige, prestige.getNext(), plugin).open(player);
break;
case "none":
plugin.getHelper().prestige(player);
break;
default:
throw new IllegalArgumentException("Invalid confirmation type " + confirmationType);
}
return true;
}
}
package sh.okx.rankup.commands;
import lombok.RequiredArgsConstructor;
import org.bukkit.command.Command;
import org.bukkit.command.CommandExecutor;
import org.bukkit.command.CommandSender;
import org.bukkit.configuration.file.FileConfiguration;
import org.bukkit.entity.Player;
import sh.okx.rankup.RankupPlugin;
import sh.okx.rankup.gui.Gui;
import sh.okx.rankup.messages.Message;
import sh.okx.rankup.prestige.Prestige;
import sh.okx.rankup.prestige.Prestiges;
import java.util.Map;
import java.util.WeakHashMap;
@RequiredArgsConstructor
public class PrestigeCommand implements CommandExecutor {
private final Map<Player, Long> confirming = new WeakHashMap<>();
private final RankupPlugin plugin;
@Override
public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
if (plugin.error(sender)) {
return true;
}
// check if player
if (!(sender instanceof Player)) {
return false;
}
Player player = (Player) sender;
Prestiges prestiges = plugin.getPrestiges();
Prestige prestige = prestiges.getByPlayer(player);
if (!plugin.getHelper().checkPrestige(player)) {
return true;
}
FileConfiguration config = plugin.getConfig();
String confirmationType = config.getString("confirmation-type").toLowerCase();
if (confirmationType.equals("text") && confirming.containsKey(player)) {
long time = System.currentTimeMillis() - confirming.remove(player);
if (time < config.getInt("text.timeout") * 1000) {
plugin.getHelper().prestige(player);
return true;
}
}
switch (confirmationType) {
case "text":
confirming.put(player, System.currentTimeMillis());
Prestige next = prestiges.next(prestige);
String nextRank = next == null ? prestiges.getLast() : next.getRank();
plugin.replaceMoneyRequirements(plugin.getMessage(prestige, Message.PRESTIGE_CONFIRMATION)
.replaceRanks(player, prestige, nextRank), player, prestige)
.replaceFromTo(prestige)
.send(player);
break;
case "gui":
Gui.of(player, prestige, prestige.getNext(), plugin).open(player);
break;
case "none":
plugin.getHelper().prestige(player);
break;
default:
throw new IllegalArgumentException("Invalid confirmation type " + confirmationType);
}
return true;
}
}
@@ -1,50 +1,50 @@
package sh.okx.rankup.commands;
import lombok.RequiredArgsConstructor;
import org.bukkit.command.Command;
import org.bukkit.command.CommandExecutor;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import sh.okx.rankup.RankupPlugin;
import sh.okx.rankup.messages.Message;
import sh.okx.rankup.prestige.Prestige;
import sh.okx.rankup.prestige.Prestiges;
@RequiredArgsConstructor
public class PrestigesCommand implements CommandExecutor {
private final RankupPlugin plugin;
@Override
public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
if (plugin.error(sender)) {
return true;
}
Prestiges prestiges = plugin.getPrestiges();
Prestige playerRank = null;
if (sender instanceof Player) {
playerRank = prestiges.getByPlayer((Player) sender);
}
plugin.sendHeaderFooter(sender, playerRank, Message.PRESTIGES_HEADER);
Message message = playerRank == null ? Message.PRESTIGES_INCOMPLETE : Message.PRESTIGES_COMPLETE;
Prestige prestige = prestiges.getFirst();
String nextRank;
do {
nextRank = prestige.getNext();
if (prestige.equals(playerRank)) {
plugin.getMessage(sender, Message.PRESTIGES_CURRENT, prestige, nextRank)
.send(sender);
message = Message.PRESTIGES_INCOMPLETE;
} else {
plugin.getMessage(sender, message, prestige, nextRank)
.replaceFirstPrestige(prestige, prestiges, prestige.getFrom())
.send(sender);
}
} while((prestige = prestiges.getByName(nextRank)) != null);
plugin.sendHeaderFooter(sender, playerRank, Message.PRESTIGES_FOOTER);
return true;
}
}
package sh.okx.rankup.commands;
import lombok.RequiredArgsConstructor;
import org.bukkit.command.Command;
import org.bukkit.command.CommandExecutor;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import sh.okx.rankup.RankupPlugin;
import sh.okx.rankup.messages.Message;
import sh.okx.rankup.prestige.Prestige;
import sh.okx.rankup.prestige.Prestiges;
@RequiredArgsConstructor
public class PrestigesCommand implements CommandExecutor {
private final RankupPlugin plugin;
@Override
public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
if (plugin.error(sender)) {
return true;
}
Prestiges prestiges = plugin.getPrestiges();
Prestige playerRank = null;
if (sender instanceof Player) {
playerRank = prestiges.getByPlayer((Player) sender);
}
plugin.sendHeaderFooter(sender, playerRank, Message.PRESTIGES_HEADER);
Message message = playerRank == null ? Message.PRESTIGES_INCOMPLETE : Message.PRESTIGES_COMPLETE;
Prestige prestige = prestiges.getFirst();
String nextRank;
do {
nextRank = prestige.getNext();
if (prestige.equals(playerRank)) {
plugin.getMessage(sender, Message.PRESTIGES_CURRENT, prestige, nextRank)
.send(sender);
message = Message.PRESTIGES_INCOMPLETE;
} else {
plugin.getMessage(sender, message, prestige, nextRank)
.replaceFirstPrestige(prestige, prestiges, prestige.getFrom())
.send(sender);
}
} while((prestige = prestiges.getByName(nextRank)) != null);
plugin.sendHeaderFooter(sender, playerRank, Message.PRESTIGES_FOOTER);
return true;
}
}
@@ -1,47 +1,47 @@
package sh.okx.rankup.commands;
import lombok.RequiredArgsConstructor;
import org.bukkit.command.Command;
import org.bukkit.command.CommandExecutor;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import sh.okx.rankup.RankupPlugin;
import sh.okx.rankup.messages.Message;
import sh.okx.rankup.ranks.Rank;
import sh.okx.rankup.ranks.Rankups;
@RequiredArgsConstructor
public class RanksCommand implements CommandExecutor {
private final RankupPlugin plugin;
@Override
public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
if (plugin.error(sender)) {
return true;
}
Rankups rankups = plugin.getRankups();
Rank playerRank = null;
if (sender instanceof Player) {
playerRank = rankups.getByPlayer((Player) sender);
}
plugin.sendHeaderFooter(sender, playerRank, Message.RANKS_HEADER);
Message message = !(sender instanceof Player && rankups.isLast(plugin.getPermissions(), (Player) sender))
&& playerRank == null ? Message.RANKS_INCOMPLETE : Message.RANKS_COMPLETE;
Rank rank = rankups.getFirst();
while (rank != null) {
String name = rank.getNext();
if (rank.equals(playerRank)) {
plugin.getMessage(sender, Message.RANKS_CURRENT, rank, name).send(sender);
message = Message.RANKS_INCOMPLETE;
} else {
plugin.getMessage(sender, message, rank, name).send(sender);
}
rank = rankups.getByName(name);
}
plugin.sendHeaderFooter(sender, playerRank, Message.RANKS_FOOTER);
return true;
}
}
package sh.okx.rankup.commands;
import lombok.RequiredArgsConstructor;
import org.bukkit.command.Command;
import org.bukkit.command.CommandExecutor;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import sh.okx.rankup.RankupPlugin;
import sh.okx.rankup.messages.Message;
import sh.okx.rankup.ranks.Rank;
import sh.okx.rankup.ranks.Rankups;
@RequiredArgsConstructor
public class RanksCommand implements CommandExecutor {
private final RankupPlugin plugin;
@Override
public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
if (plugin.error(sender)) {
return true;
}
Rankups rankups = plugin.getRankups();
Rank playerRank = null;
if (sender instanceof Player) {
playerRank = rankups.getByPlayer((Player) sender);
}
plugin.sendHeaderFooter(sender, playerRank, Message.RANKS_HEADER);
Message message = !(sender instanceof Player && rankups.isLast(plugin.getPermissions(), (Player) sender))
&& playerRank == null ? Message.RANKS_INCOMPLETE : Message.RANKS_COMPLETE;
Rank rank = rankups.getFirst();
while (rank != null) {
String name = rank.getNext();
if (rank.equals(playerRank)) {
plugin.getMessage(sender, Message.RANKS_CURRENT, rank, name).send(sender);
message = Message.RANKS_INCOMPLETE;
} else {
plugin.getMessage(sender, message, rank, name).send(sender);
}
rank = rankups.getByName(name);
}
plugin.sendHeaderFooter(sender, playerRank, Message.RANKS_FOOTER);
return true;
}
}
@@ -1,81 +1,81 @@
package sh.okx.rankup.commands;
import lombok.RequiredArgsConstructor;
import org.bukkit.command.Command;
import org.bukkit.command.CommandExecutor;
import org.bukkit.command.CommandSender;
import org.bukkit.configuration.file.FileConfiguration;
import org.bukkit.entity.Player;
import sh.okx.rankup.RankupPlugin;
import sh.okx.rankup.gui.Gui;
import sh.okx.rankup.messages.Message;
import sh.okx.rankup.ranks.Rank;
import sh.okx.rankup.ranks.Rankups;
import java.util.Map;
import java.util.WeakHashMap;
@RequiredArgsConstructor
public class RankupCommand implements CommandExecutor {
// weak hash maps so players going offline are automatically removed.
// otherwise there is a potential (albeit small) memory leak.
private final Map<Player, Long> confirming = new WeakHashMap<>();
private final RankupPlugin plugin;
@Override
public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
if (plugin.error(sender)) {
return true;
}
// check if player
if (!(sender instanceof Player)) {
return false;
}
Player player = (Player) sender;
Rankups rankups = plugin.getRankups();
Rank rank = rankups.getByPlayer(player);
if (!plugin.getHelper().checkRankup(player)) {
return true;
}
/*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;
}*/
String next = rank.getNext();
FileConfiguration config = plugin.getConfig();
String confirmationType = config.getString("confirmation-type").toLowerCase();
// if they are on text confirming, rank them up
if (confirmationType.equals("text") && confirming.containsKey(player)) {
long time = System.currentTimeMillis() - confirming.remove(player);
if (time < config.getInt("text.timeout") * 1000) {
plugin.getHelper().rankup(player);
return true;
}
}
switch (confirmationType) {
case "text":
confirming.put(player, System.currentTimeMillis());
plugin.replaceMoneyRequirements(plugin.getMessage(rank, Message.CONFIRMATION)
.replaceRanks(player, rank, next), player, rank)
.send(player);
break;
case "gui":
Gui.of(player, rank, next, plugin).open(player);
break;
case "none":
plugin.getHelper().rankup(player);
break;
default:
throw new IllegalArgumentException("Invalid confirmation type " + confirmationType);
}
return true;
}
}
package sh.okx.rankup.commands;
import lombok.RequiredArgsConstructor;
import org.bukkit.command.Command;
import org.bukkit.command.CommandExecutor;
import org.bukkit.command.CommandSender;
import org.bukkit.configuration.file.FileConfiguration;
import org.bukkit.entity.Player;
import sh.okx.rankup.RankupPlugin;
import sh.okx.rankup.gui.Gui;
import sh.okx.rankup.messages.Message;
import sh.okx.rankup.ranks.Rank;
import sh.okx.rankup.ranks.Rankups;
import java.util.Map;
import java.util.WeakHashMap;
@RequiredArgsConstructor
public class RankupCommand implements CommandExecutor {
// weak hash maps so players going offline are automatically removed.
// otherwise there is a potential (albeit small) memory leak.
private final Map<Player, Long> confirming = new WeakHashMap<>();
private final RankupPlugin plugin;
@Override
public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
if (plugin.error(sender)) {
return true;
}
// check if player
if (!(sender instanceof Player)) {
return false;
}
Player player = (Player) sender;
Rankups rankups = plugin.getRankups();
Rank rank = rankups.getByPlayer(player);
if (!plugin.getHelper().checkRankup(player)) {
return true;
}
/*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;
}*/
String next = rank.getNext();
FileConfiguration config = plugin.getConfig();
String confirmationType = config.getString("confirmation-type").toLowerCase();
// if they are on text confirming, rank them up
if (confirmationType.equals("text") && confirming.containsKey(player)) {
long time = System.currentTimeMillis() - confirming.remove(player);
if (time < config.getInt("text.timeout") * 1000) {
plugin.getHelper().rankup(player);
return true;
}
}
switch (confirmationType) {
case "text":
confirming.put(player, System.currentTimeMillis());
plugin.replaceMoneyRequirements(plugin.getMessage(rank, Message.CONFIRMATION)
.replaceRanks(player, rank, next), player, rank)
.send(player);
break;
case "gui":
Gui.of(player, rank, next, plugin).open(player);
break;
case "none":
plugin.getHelper().rankup(player);
break;
default:
throw new IllegalArgumentException("Invalid confirmation type " + confirmationType);
}
return true;
}
}
+139 -139
View File
@@ -1,139 +1,139 @@
package sh.okx.rankup.gui;
import lombok.AccessLevel;
import lombok.Getter;
import lombok.NoArgsConstructor;
import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
import org.bukkit.Material;
import org.bukkit.configuration.ConfigurationSection;
import org.bukkit.entity.Player;
import org.bukkit.inventory.Inventory;
import org.bukkit.inventory.InventoryHolder;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.ItemMeta;
import sh.okx.rankup.RankupPlugin;
import sh.okx.rankup.messages.Message;
import sh.okx.rankup.messages.MessageBuilder;
import sh.okx.rankup.prestige.Prestige;
import sh.okx.rankup.ranks.Rank;
import java.util.Arrays;
import java.util.Objects;
import java.util.stream.Collectors;
import sh.okx.rankup.util.ItemUtil;
@NoArgsConstructor(access = AccessLevel.PRIVATE)
public class Gui implements InventoryHolder {
@Getter
private Inventory inventory;
@Getter
private ItemStack rankup;
@Getter
private ItemStack cancel;
@Getter
private boolean prestige;
public static Gui of(Player player, Rank oldRank, String rank, RankupPlugin plugin) {
Gui gui = new Gui();
gui.prestige = oldRank instanceof Prestige;
String type = gui.prestige ? "prestige" : "rankup";
String basePath = type + ".gui";
ConfigurationSection config = plugin.getSection(oldRank, basePath);
ItemStack[] items = new ItemStack[config.getInt("rows", 1) * 9];
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, 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;
Inventory inventory = Bukkit.createInventory(gui, items.length,
plugin.replaceMoneyRequirements(
plugin.getMessage(oldRank, gui.prestige ? Message.PRESTIGE_TITLE : Message.TITLE)
.replaceRanks(player, oldRank, rank)
.replaceFromTo(oldRank), player, oldRank).toString());
inventory.setContents(items);
gui.inventory = inventory;
return gui;
}
@SuppressWarnings("deprecation")
private static ItemStack getItem(RankupPlugin plugin, ConfigurationSection section, Player player, Rank oldRank, String rank) {
String materialName = section.getString("material").toUpperCase();
ItemStack item;
if (ItemUtil.isServerFlattened()) {
Material material = Material.valueOf(materialName);
item = new ItemStack(material);
} else {
// handle default material correctly on older vesions
if (materialName.equals("BLACK_STAINED_GLASS_PANE")) {
materialName = "STAINED_GLASS_PANE:15";
}
String[] parts = materialName.split(":");
Material material = Material.valueOf(parts[0]);
short type = parts.length > 1 ? Short.parseShort(parts[1]) : 0;
item = new ItemStack(material, 1, type);
}
if (item.getType() == Material.AIR && section.getName().equalsIgnoreCase("fill")) {
return item;
}
ItemMeta meta = item.getItemMeta();
if (section.contains("lore")) {
meta.setLore(Arrays.stream(format(plugin, section.getString("lore"), player, oldRank, rank).split("\n"))
.map(string -> ChatColor.RESET + string)
.collect(Collectors.toList()));
}
if (section.contains("name")) {
meta.setDisplayName(ChatColor.RESET + format(plugin, section.getString("name"), player, oldRank, rank));
}
item.setItemMeta(meta);
return item;
}
private static String format(RankupPlugin plugin, String message, Player player, Rank oldRank, String rank) {
return plugin.replaceMoneyRequirements(new MessageBuilder(ChatColor.translateAlternateColorCodes('&', message))
.replaceRanks(player, oldRank, rank), player, oldRank)
.toString();
}
private static void addItem(ItemStack[] items, ConfigurationSection section, ItemStack item) {
Objects.requireNonNull(section, "GUI configuration section not found");
if (section.getName().equalsIgnoreCase("fill")) {
for (int i = 0; i < items.length; i++) {
if (items[i] == null) {
items[i] = item;
}
}
return;
}
String[] locations = section.getString("index").split(" ");
for (String location : locations) {
String[] parts = location.split("-");
if (parts.length == 1) {
items[Integer.parseInt(parts[0])] = item;
} else {
for (int i = Integer.parseInt(parts[0]); i <= Integer.parseInt(parts[1]); i++) {
items[i] = item;
}
}
}
}
public void open(Player player) {
player.openInventory(inventory);
}
}
package sh.okx.rankup.gui;
import lombok.AccessLevel;
import lombok.Getter;
import lombok.NoArgsConstructor;
import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
import org.bukkit.Material;
import org.bukkit.configuration.ConfigurationSection;
import org.bukkit.entity.Player;
import org.bukkit.inventory.Inventory;
import org.bukkit.inventory.InventoryHolder;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.ItemMeta;
import sh.okx.rankup.RankupPlugin;
import sh.okx.rankup.messages.Message;
import sh.okx.rankup.messages.MessageBuilder;
import sh.okx.rankup.prestige.Prestige;
import sh.okx.rankup.ranks.Rank;
import java.util.Arrays;
import java.util.Objects;
import java.util.stream.Collectors;
import sh.okx.rankup.util.ItemUtil;
@NoArgsConstructor(access = AccessLevel.PRIVATE)
public class Gui implements InventoryHolder {
@Getter
private Inventory inventory;
@Getter
private ItemStack rankup;
@Getter
private ItemStack cancel;
@Getter
private boolean prestige;
public static Gui of(Player player, Rank oldRank, String rank, RankupPlugin plugin) {
Gui gui = new Gui();
gui.prestige = oldRank instanceof Prestige;
String type = gui.prestige ? "prestige" : "rankup";
String basePath = type + ".gui";
ConfigurationSection config = plugin.getSection(oldRank, basePath);
ItemStack[] items = new ItemStack[config.getInt("rows", 1) * 9];
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, 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;
Inventory inventory = Bukkit.createInventory(gui, items.length,
plugin.replaceMoneyRequirements(
plugin.getMessage(oldRank, gui.prestige ? Message.PRESTIGE_TITLE : Message.TITLE)
.replaceRanks(player, oldRank, rank)
.replaceFromTo(oldRank), player, oldRank).toString());
inventory.setContents(items);
gui.inventory = inventory;
return gui;
}
@SuppressWarnings("deprecation")
private static ItemStack getItem(RankupPlugin plugin, ConfigurationSection section, Player player, Rank oldRank, String rank) {
String materialName = section.getString("material").toUpperCase();
ItemStack item;
if (ItemUtil.isServerFlattened()) {
Material material = Material.valueOf(materialName);
item = new ItemStack(material);
} else {
// handle default material correctly on older vesions
if (materialName.equals("BLACK_STAINED_GLASS_PANE")) {
materialName = "STAINED_GLASS_PANE:15";
}
String[] parts = materialName.split(":");
Material material = Material.valueOf(parts[0]);
short type = parts.length > 1 ? Short.parseShort(parts[1]) : 0;
item = new ItemStack(material, 1, type);
}
if (item.getType() == Material.AIR && section.getName().equalsIgnoreCase("fill")) {
return item;
}
ItemMeta meta = item.getItemMeta();
if (section.contains("lore")) {
meta.setLore(Arrays.stream(format(plugin, section.getString("lore"), player, oldRank, rank).split("\n"))
.map(string -> ChatColor.RESET + string)
.collect(Collectors.toList()));
}
if (section.contains("name")) {
meta.setDisplayName(ChatColor.RESET + format(plugin, section.getString("name"), player, oldRank, rank));
}
item.setItemMeta(meta);
return item;
}
private static String format(RankupPlugin plugin, String message, Player player, Rank oldRank, String rank) {
return plugin.replaceMoneyRequirements(new MessageBuilder(ChatColor.translateAlternateColorCodes('&', message))
.replaceRanks(player, oldRank, rank), player, oldRank)
.toString();
}
private static void addItem(ItemStack[] items, ConfigurationSection section, ItemStack item) {
Objects.requireNonNull(section, "GUI configuration section not found");
if (section.getName().equalsIgnoreCase("fill")) {
for (int i = 0; i < items.length; i++) {
if (items[i] == null) {
items[i] = item;
}
}
return;
}
String[] locations = section.getString("index").split(" ");
for (String location : locations) {
String[] parts = location.split("-");
if (parts.length == 1) {
items[Integer.parseInt(parts[0])] = item;
} else {
for (int i = Integer.parseInt(parts[0]); i <= Integer.parseInt(parts[1]); i++) {
items[i] = item;
}
}
}
}
public void open(Player player) {
player.openInventory(inventory);
}
}
@@ -1,40 +1,40 @@
package sh.okx.rankup.gui;
import lombok.RequiredArgsConstructor;
import org.bukkit.Bukkit;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.inventory.InventoryClickEvent;
import org.bukkit.inventory.Inventory;
import sh.okx.rankup.RankupPlugin;
@RequiredArgsConstructor
public class GuiListener implements Listener {
private final RankupPlugin plugin;
@EventHandler
public void on(InventoryClickEvent e) {
Inventory inventory = e.getInventory();
if (inventory == null
|| !(inventory.getHolder() instanceof Gui)
|| !inventory.equals(e.getClickedInventory())) {
return;
}
e.setCancelled(true);
Player player = (Player) e.getWhoClicked();
Gui gui = (Gui) inventory.getHolder();
if (gui.getRankup().isSimilar(e.getCurrentItem())) {
Bukkit.getScheduler().runTask(plugin, player::closeInventory);
if (gui.isPrestige()) {
plugin.getHelper().prestige(player);
} else {
plugin.getHelper().rankup(player);
}
} else if (gui.getCancel().isSimilar(e.getCurrentItem())) {
Bukkit.getScheduler().runTask(plugin, player::closeInventory);
}
}
}
package sh.okx.rankup.gui;
import lombok.RequiredArgsConstructor;
import org.bukkit.Bukkit;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.inventory.InventoryClickEvent;
import org.bukkit.inventory.Inventory;
import sh.okx.rankup.RankupPlugin;
@RequiredArgsConstructor
public class GuiListener implements Listener {
private final RankupPlugin plugin;
@EventHandler
public void on(InventoryClickEvent e) {
Inventory inventory = e.getInventory();
if (inventory == null
|| !(inventory.getHolder() instanceof Gui)
|| !inventory.equals(e.getClickedInventory())) {
return;
}
e.setCancelled(true);
Player player = (Player) e.getWhoClicked();
Gui gui = (Gui) inventory.getHolder();
if (gui.getRankup().isSimilar(e.getCurrentItem())) {
Bukkit.getScheduler().runTask(plugin, player::closeInventory);
if (gui.isPrestige()) {
plugin.getHelper().prestige(player);
} else {
plugin.getHelper().rankup(player);
}
} else if (gui.getCancel().isSimilar(e.getCurrentItem())) {
Bukkit.getScheduler().runTask(plugin, player::closeInventory);
}
}
}
@@ -1,30 +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);
}
}
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);
}
}
@@ -1,9 +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);
}
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);
}
@@ -1,44 +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);
}
}
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);
}
}
@@ -1,41 +1,41 @@
package sh.okx.rankup.messages;
import lombok.Getter;
public enum Message {
NOT_IN_LADDER("not-in-ladder"),
REQUIREMENTS_NOT_MET("rankup.requirements-not-met"),
NO_RANKUP("rankup.no-rankup"),
SUCCESS_PUBLIC("rankup.success-public"),
SUCCESS_PRIVATE("rankup.success-private"),
CONFIRMATION("rankup.confirmation"),
TITLE("rankup.gui.title"),
RANKS_HEADER("rankup.list.header"),
RANKS_FOOTER("rankup.list.footer"),
RANKS_COMPLETE("rankup.list.complete"),
RANKS_CURRENT("rankup.list.current"),
RANKS_INCOMPLETE("rankup.list.incomplete"),
PRESTIGE_REQUIREMENTS_NOT_MET("prestige.requirements-not-met"),
PRESTIGE_NO_PRESTIGE("prestige.no-prestige"),
PRESTIGES_HEADER("prestige.list.header"),
PRESTIGES_FOOTER("prestige.list.footer"),
PRESTIGES_COMPLETE("prestige.list.complete"),
PRESTIGES_CURRENT("prestige.list.current"),
PRESTIGES_INCOMPLETE("prestige.list.incomplete"),
PRESTIGE_TITLE("prestige.gui.title"),
COOLDOWN_SINGULAR("rankup.cooldown.singular"),
COOLDOWN_PLURAL("rankup.cooldown.plural"),
MUST_PRESTIGE("rankup.must-prestige"),
NOT_HIGH_ENOUGH("not-high-enough"),
PRESTIGE_SUCCESS_PUBLIC("prestige.success-public"),
PRESTIGE_SUCCESS_PRIVATE("prestige.success-private"),
PRESTIGE_CONFIRMATION("prestige.confirmation"),
INVALID_RANKUP("invalid-rankup");
@Getter
private final String name;
Message(String name) {
this.name = name;
}
package sh.okx.rankup.messages;
import lombok.Getter;
public enum Message {
NOT_IN_LADDER("not-in-ladder"),
REQUIREMENTS_NOT_MET("rankup.requirements-not-met"),
NO_RANKUP("rankup.no-rankup"),
SUCCESS_PUBLIC("rankup.success-public"),
SUCCESS_PRIVATE("rankup.success-private"),
CONFIRMATION("rankup.confirmation"),
TITLE("rankup.gui.title"),
RANKS_HEADER("rankup.list.header"),
RANKS_FOOTER("rankup.list.footer"),
RANKS_COMPLETE("rankup.list.complete"),
RANKS_CURRENT("rankup.list.current"),
RANKS_INCOMPLETE("rankup.list.incomplete"),
PRESTIGE_REQUIREMENTS_NOT_MET("prestige.requirements-not-met"),
PRESTIGE_NO_PRESTIGE("prestige.no-prestige"),
PRESTIGES_HEADER("prestige.list.header"),
PRESTIGES_FOOTER("prestige.list.footer"),
PRESTIGES_COMPLETE("prestige.list.complete"),
PRESTIGES_CURRENT("prestige.list.current"),
PRESTIGES_INCOMPLETE("prestige.list.incomplete"),
PRESTIGE_TITLE("prestige.gui.title"),
COOLDOWN_SINGULAR("rankup.cooldown.singular"),
COOLDOWN_PLURAL("rankup.cooldown.plural"),
MUST_PRESTIGE("rankup.must-prestige"),
NOT_HIGH_ENOUGH("not-high-enough"),
PRESTIGE_SUCCESS_PUBLIC("prestige.success-public"),
PRESTIGE_SUCCESS_PRIVATE("prestige.success-private"),
PRESTIGE_CONFIRMATION("prestige.confirmation"),
INVALID_RANKUP("invalid-rankup");
@Getter
private final String name;
Message(String name) {
this.name = name;
}
}
@@ -1,124 +1,124 @@
package sh.okx.rankup.messages;
import me.clip.placeholderapi.PlaceholderAPI;
import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
import org.bukkit.command.CommandSender;
import org.bukkit.configuration.ConfigurationSection;
import org.bukkit.entity.Player;
import sh.okx.rankup.prestige.Prestige;
import sh.okx.rankup.prestige.Prestiges;
import sh.okx.rankup.ranks.Rank;
import java.util.Objects;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class MessageBuilder {
private String message;
public MessageBuilder(String message) {
this.message = message;
}
public static MessageBuilder of(ConfigurationSection config, Message message) {
return MessageBuilder.of(config, message.getName());
}
private static MessageBuilder of(ConfigurationSection config, String message) {
String string = config.getString(message);
Objects.requireNonNull(string, "Configuration message '" + message + "' not found!");
return new MessageBuilder(ChatColor.translateAlternateColorCodes('&', string));
}
public MessageBuilder replace(Variable variable, Object value) {
return replace(variable.name(), value);
}
public MessageBuilder replace(String name, Object value) {
Pattern pattern = Pattern.compile("\\{" + name + "}", Pattern.CASE_INSENSITIVE);
Matcher matcher = pattern.matcher(message);
this.message = matcher.replaceAll(String.valueOf(value));
return this;
}
public MessageBuilder replaceFirstPrestige(Rank rank, Prestiges prestiges, String with) {
if (prestiges != null && prestiges.getFirst().equals(rank)) {
replace(Variable.OLD_RANK, with);
}
return this;
}
public MessageBuilder replaceRanks(CommandSender player, String rankName) {
replace(Variable.PLAYER, player.getName());
replaceRanks(rankName);
return this;
}
public MessageBuilder replaceRanks(CommandSender player, Rank oldRank, String rankName) {
replace(Variable.PLAYER, player.getName());
replaceRanks(oldRank, rankName);
return this;
}
public MessageBuilder replaceRanks(String rankName) {
replace(Variable.RANK, rankName);
return this;
}
public MessageBuilder replaceRanks(Rank oldRank, String rankName) {
replaceRanks(rankName);
replace(Variable.OLD_RANK, oldRank.getRank());
return this;
}
public MessageBuilder replaceFromTo(Rank rank) {
if (rank instanceof Prestige) {
Prestige prestige = (Prestige) rank;
replace(Variable.FROM, prestige.getFrom());
replace(Variable.TO, prestige.getTo());
}
return this;
}
/**
* Fails the MessageBuilder if the message is empty.
* if this fails, all subsequent calls to that MessageBuilder will do nothing
* @return a NullMessageBuilder if the message is empty, itself otherwise
*/
public MessageBuilder failIfEmpty() {
return failIf(message.isEmpty());
}
public MessageBuilder failIf(boolean value) {
if (value) {
return new NullMessageBuilder();
} else {
return this;
}
}
public void send(CommandSender sender) {
String msg = message;
if (sender instanceof Player && Bukkit.getPluginManager().isPluginEnabled("PlaceholderAPI")) {
msg = PlaceholderAPI.setPlaceholders((Player) sender, msg);
}
sender.sendMessage(msg);
}
/**
* Sends the message to all players
* ie, calls MessageBuilder#send(Player) for all players online, and sends the message in the console.
*/
public void broadcast() {
for (Player player : Bukkit.getOnlinePlayers()) {
send(player);
}
send(Bukkit.getConsoleSender());
}
@Override
public String toString() {
return message;
}
}
package sh.okx.rankup.messages;
import me.clip.placeholderapi.PlaceholderAPI;
import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
import org.bukkit.command.CommandSender;
import org.bukkit.configuration.ConfigurationSection;
import org.bukkit.entity.Player;
import sh.okx.rankup.prestige.Prestige;
import sh.okx.rankup.prestige.Prestiges;
import sh.okx.rankup.ranks.Rank;
import java.util.Objects;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class MessageBuilder {
private String message;
public MessageBuilder(String message) {
this.message = message;
}
public static MessageBuilder of(ConfigurationSection config, Message message) {
return MessageBuilder.of(config, message.getName());
}
private static MessageBuilder of(ConfigurationSection config, String message) {
String string = config.getString(message);
Objects.requireNonNull(string, "Configuration message '" + message + "' not found!");
return new MessageBuilder(ChatColor.translateAlternateColorCodes('&', string));
}
public MessageBuilder replace(Variable variable, Object value) {
return replace(variable.name(), value);
}
public MessageBuilder replace(String name, Object value) {
Pattern pattern = Pattern.compile("\\{" + name + "}", Pattern.CASE_INSENSITIVE);
Matcher matcher = pattern.matcher(message);
this.message = matcher.replaceAll(String.valueOf(value));
return this;
}
public MessageBuilder replaceFirstPrestige(Rank rank, Prestiges prestiges, String with) {
if (prestiges != null && prestiges.getFirst().equals(rank)) {
replace(Variable.OLD_RANK, with);
}
return this;
}
public MessageBuilder replaceRanks(CommandSender player, String rankName) {
replace(Variable.PLAYER, player.getName());
replaceRanks(rankName);
return this;
}
public MessageBuilder replaceRanks(CommandSender player, Rank oldRank, String rankName) {
replace(Variable.PLAYER, player.getName());
replaceRanks(oldRank, rankName);
return this;
}
public MessageBuilder replaceRanks(String rankName) {
replace(Variable.RANK, rankName);
return this;
}
public MessageBuilder replaceRanks(Rank oldRank, String rankName) {
replaceRanks(rankName);
replace(Variable.OLD_RANK, oldRank.getRank());
return this;
}
public MessageBuilder replaceFromTo(Rank rank) {
if (rank instanceof Prestige) {
Prestige prestige = (Prestige) rank;
replace(Variable.FROM, prestige.getFrom());
replace(Variable.TO, prestige.getTo());
}
return this;
}
/**
* Fails the MessageBuilder if the message is empty.
* if this fails, all subsequent calls to that MessageBuilder will do nothing
* @return a NullMessageBuilder if the message is empty, itself otherwise
*/
public MessageBuilder failIfEmpty() {
return failIf(message.isEmpty());
}
public MessageBuilder failIf(boolean value) {
if (value) {
return new NullMessageBuilder();
} else {
return this;
}
}
public void send(CommandSender sender) {
String msg = message;
if (sender instanceof Player && Bukkit.getPluginManager().isPluginEnabled("PlaceholderAPI")) {
msg = PlaceholderAPI.setPlaceholders((Player) sender, msg);
}
sender.sendMessage(msg);
}
/**
* Sends the message to all players
* ie, calls MessageBuilder#send(Player) for all players online, and sends the message in the console.
*/
public void broadcast() {
for (Player player : Bukkit.getOnlinePlayers()) {
send(player);
}
send(Bukkit.getConsoleSender());
}
@Override
public String toString() {
return message;
}
}
@@ -1,35 +1,35 @@
package sh.okx.rankup.messages;
import org.bukkit.command.CommandSender;
/**
* A no-op implementation of MessageBuilder
*/
public class NullMessageBuilder extends MessageBuilder {
NullMessageBuilder() {
super(null);
}
@Override
public MessageBuilder failIf(boolean value) {
return this;
}
@Override
public MessageBuilder replace(Variable variable, Object value) {
return this;
}
@Override
public void send(CommandSender sender) {
}
@Override
public void broadcast() {
}
@Override
public String toString() {
return null;
}
}
package sh.okx.rankup.messages;
import org.bukkit.command.CommandSender;
/**
* A no-op implementation of MessageBuilder
*/
public class NullMessageBuilder extends MessageBuilder {
NullMessageBuilder() {
super(null);
}
@Override
public MessageBuilder failIf(boolean value) {
return this;
}
@Override
public MessageBuilder replace(Variable variable, Object value) {
return this;
}
@Override
public void send(CommandSender sender) {
}
@Override
public void broadcast() {
}
@Override
public String toString() {
return null;
}
}
@@ -1,18 +1,18 @@
package sh.okx.rankup.messages;
public enum Variable {
PLAYER,
OLD_RANK,
RANK,
FROM,
TO,
MONEY,
MONEY_NEEDED,
AMOUNT,
AMOUNT_NEEDED,
AMOUNT_DONE,
PERCENT_DONE,
PERCENT_LEFT,
SECONDS,
SECONDS_LEFT
}
package sh.okx.rankup.messages;
public enum Variable {
PLAYER,
OLD_RANK,
RANK,
FROM,
TO,
MONEY,
MONEY_NEEDED,
AMOUNT,
AMOUNT_NEEDED,
AMOUNT_DONE,
PERCENT_DONE,
PERCENT_LEFT,
SECONDS,
SECONDS_LEFT
}
@@ -1,44 +1,44 @@
package sh.okx.rankup.placeholders;
import lombok.Getter;
import me.clip.placeholderapi.PlaceholderAPI;
import org.bukkit.Bukkit;
import sh.okx.rankup.RankupPlugin;
import java.text.DecimalFormat;
public class Placeholders {
private final RankupPlugin plugin;
@Getter
private final DecimalFormat moneyFormat;
@Getter
private final DecimalFormat percentFormat;
@Getter
private final DecimalFormat simpleFormat;
@Getter
private RankupExpansion expansion;
private boolean registered;
public Placeholders(RankupPlugin plugin) {
this.plugin = plugin;
this.moneyFormat = new DecimalFormat(plugin.getConfig().getString("placeholders.money-format"));
this.percentFormat = new DecimalFormat(plugin.getConfig().getString("placeholders.percent-format"));
this.simpleFormat = new DecimalFormat(plugin.getConfig().getString("placeholders.simple-format"));
}
public void register() {
if (Bukkit.getPluginManager().isPluginEnabled("PlaceholderAPI")) {
expansion = new RankupExpansion(plugin, this);
expansion.register();
registered = true;
} else {
registered = false;
}
}
public void unregister() {
if (registered) {
PlaceholderAPI.unregisterPlaceholderHook("rankup");
}
}
}
package sh.okx.rankup.placeholders;
import lombok.Getter;
import me.clip.placeholderapi.PlaceholderAPI;
import org.bukkit.Bukkit;
import sh.okx.rankup.RankupPlugin;
import java.text.DecimalFormat;
public class Placeholders {
private final RankupPlugin plugin;
@Getter
private final DecimalFormat moneyFormat;
@Getter
private final DecimalFormat percentFormat;
@Getter
private final DecimalFormat simpleFormat;
@Getter
private RankupExpansion expansion;
private boolean registered;
public Placeholders(RankupPlugin plugin) {
this.plugin = plugin;
this.moneyFormat = new DecimalFormat(plugin.getConfig().getString("placeholders.money-format"));
this.percentFormat = new DecimalFormat(plugin.getConfig().getString("placeholders.percent-format"));
this.simpleFormat = new DecimalFormat(plugin.getConfig().getString("placeholders.simple-format"));
}
public void register() {
if (Bukkit.getPluginManager().isPluginEnabled("PlaceholderAPI")) {
expansion = new RankupExpansion(plugin, this);
expansion.register();
registered = true;
} else {
registered = false;
}
}
public void unregister() {
if (registered) {
PlaceholderAPI.unregisterPlaceholderHook("rankup");
}
}
}
@@ -1,219 +1,219 @@
package sh.okx.rankup.placeholders;
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.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("(.*)#(.*)");
private final RankupPlugin plugin;
private final Placeholders placeholders;
@Override
public String onPlaceholderRequest(Player player, String params) {
if (player == null) {
return "";
}
params = params.toLowerCase();
Rankups rankups = plugin.getRankups();
Rank rank = rankups.getByPlayer(player);
Prestiges prestiges = plugin.getPrestiges();
Prestige prestige = null;
if (prestiges != null) {
prestige = prestiges.getByPlayer(player);
}
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));
}
switch (params) {
case "current_prestige":
requirePrestiging(prestiges, params);
if (prestiges.isLast(plugin.getPermissions(), player)) {
return prestiges.getLast();
} else if (prestige == null || prestige.getRank() == null) {
return getPlaceholder("no-prestige");
} else {
return prestige.getRank();
}
case "next_prestige":
requirePrestiging(prestiges, params);
if (prestiges.isLast(plugin.getPermissions(), player)) {
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 (rankups.isLast(plugin.getPermissions(), player)) {
return rankups.getLast();
} else if (rank == null) {
return getPlaceholder("not-in-ladder");
} else {
return rank.getRank();
}
case "next_rank":
if (rankups.isLast(plugin.getPermissions(), player)) {
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);
}
@Override
public String getIdentifier() {
return "rankup";
}
@Override
public String getAuthor() {
return String.join(", ", plugin.getDescription().getAuthors());
}
@Override
public String getVersion() {
return plugin.getDescription().getVersion();
}
@Override
public boolean persist() {
return true;
}
@Override
public boolean canRegister() {
return true;
}
}
package sh.okx.rankup.placeholders;
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.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("(.*)#(.*)");
private final RankupPlugin plugin;
private final Placeholders placeholders;
@Override
public String onPlaceholderRequest(Player player, String params) {
if (player == null) {
return "";
}
params = params.toLowerCase();
Rankups rankups = plugin.getRankups();
Rank rank = rankups.getByPlayer(player);
Prestiges prestiges = plugin.getPrestiges();
Prestige prestige = null;
if (prestiges != null) {
prestige = prestiges.getByPlayer(player);
}
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));
}
switch (params) {
case "current_prestige":
requirePrestiging(prestiges, params);
if (prestiges.isLast(plugin.getPermissions(), player)) {
return prestiges.getLast();
} else if (prestige == null || prestige.getRank() == null) {
return getPlaceholder("no-prestige");
} else {
return prestige.getRank();
}
case "next_prestige":
requirePrestiging(prestiges, params);
if (prestiges.isLast(plugin.getPermissions(), player)) {
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 (rankups.isLast(plugin.getPermissions(), player)) {
return rankups.getLast();
} else if (rank == null) {
return getPlaceholder("not-in-ladder");
} else {
return rank.getRank();
}
case "next_rank":
if (rankups.isLast(plugin.getPermissions(), player)) {
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);
}
@Override
public String getIdentifier() {
return "rankup";
}
@Override
public String getAuthor() {
return String.join(", ", plugin.getDescription().getAuthors());
}
@Override
public String getVersion() {
return plugin.getDescription().getVersion();
}
@Override
public boolean persist() {
return true;
}
@Override
public boolean canRegister() {
return true;
}
}
@@ -1,79 +1,79 @@
package sh.okx.rankup.prestige;
import lombok.EqualsAndHashCode;
import lombok.Getter;
import lombok.ToString;
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;
import java.util.Set;
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
public class Prestige extends Rank {
@Getter
private final String from;
@Getter
private final 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;
}
public static Prestige deserialize(RankupPlugin plugin, ConfigurationSection section) {
List<String> requirementsList = section.getStringList("requirements");
Set<Requirement> requirements = plugin.getRequirements().getRequirements(requirementsList);
return new Prestige(section, plugin,
section.getString("next"),
section.getString("rank"),
new ListRankRequirements(requirements),
section.getStringList("commands"),
section.getString("from"),
section.getString("to"));
}
@Override
public boolean isIn(Player player) {
// 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;
}
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) {
return plugin.getPermissions().inGroup(player.getUniqueId(), from);
}
@Override
public boolean isLast() {
return plugin.getPrestiges().getByName(next) == null;
}
}
package sh.okx.rankup.prestige;
import lombok.EqualsAndHashCode;
import lombok.Getter;
import lombok.ToString;
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;
import java.util.Set;
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
public class Prestige extends Rank {
@Getter
private final String from;
@Getter
private final 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;
}
public static Prestige deserialize(RankupPlugin plugin, ConfigurationSection section) {
List<String> requirementsList = section.getStringList("requirements");
Set<Requirement> requirements = plugin.getRequirements().getRequirements(requirementsList);
return new Prestige(section, plugin,
section.getString("next"),
section.getString("rank"),
new ListRankRequirements(requirements),
section.getStringList("commands"),
section.getString("from"),
section.getString("to"));
}
@Override
public boolean isIn(Player player) {
// 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;
}
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) {
return plugin.getPermissions().inGroup(player.getUniqueId(), from);
}
@Override
public boolean isLast() {
return plugin.getPrestiges().getByName(next) == null;
}
}
@@ -1,22 +1,22 @@
package sh.okx.rankup.prestige;
import org.bukkit.configuration.file.FileConfiguration;
import sh.okx.rankup.RankList;
import sh.okx.rankup.RankupPlugin;
public class Prestiges extends RankList<Prestige> {
public Prestiges(RankupPlugin plugin, FileConfiguration config) {
super(config, section -> Prestige.deserialize(plugin, section));
}
@Override
public Prestige getFirst() {
for (Prestige prestige : ranks) {
if (prestige.getRank() == null) {
return prestige;
}
}
throw new IllegalStateException("No prestige found for first prestige (first prestige is counted as a prestige without a rank set). " +
"Disable prestiges in config.yml if you don't want any.");
}
}
package sh.okx.rankup.prestige;
import org.bukkit.configuration.file.FileConfiguration;
import sh.okx.rankup.RankList;
import sh.okx.rankup.RankupPlugin;
public class Prestiges extends RankList<Prestige> {
public Prestiges(RankupPlugin plugin, FileConfiguration config) {
super(config, section -> Prestige.deserialize(plugin, section));
}
@Override
public Prestige getFirst() {
for (Prestige prestige : ranks) {
if (prestige.getRank() == null) {
return prestige;
}
}
throw new IllegalStateException("No prestige found for first prestige (first prestige is counted as a prestige without a rank set). " +
"Disable prestiges in config.yml if you don't want any.");
}
}
+63 -63
View File
@@ -1,63 +1,63 @@
package sh.okx.rankup.ranks;
import java.util.List;
import lombok.AccessLevel;
import lombok.EqualsAndHashCode;
import lombok.Getter;
import lombok.RequiredArgsConstructor;
import lombok.ToString;
import me.clip.placeholderapi.PlaceholderAPI;
import org.bukkit.Bukkit;
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.ranks.requirements.RankRequirements;
import sh.okx.rankup.requirements.Requirement;
@EqualsAndHashCode
@ToString
@RequiredArgsConstructor(access = AccessLevel.PROTECTED)
public class Rank {
@Getter
protected final ConfigurationSection section;
protected final RankupPlugin plugin;
@Getter
protected final String next;
@Getter
protected final String rank;
@Getter
protected final RankRequirements requirements;
protected final List<String> commands;
public boolean isIn(Player player) {
return plugin.getPermissions().inGroup(player.getUniqueId(), rank);
}
public boolean isLast() {
return plugin.getRankups().getByName(next) == 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) {
requirements.applyRequirements(player);
}
public void runCommands(Player player) {
for (String command : commands) {
String string = new MessageBuilder(command).replaceRanks(player, this, next).toString();
if (Bukkit.getPluginManager().isPluginEnabled("PlaceholderAPI")) {
string = PlaceholderAPI.setPlaceholders(player, string);
}
Bukkit.dispatchCommand(Bukkit.getConsoleSender(), string);
}
}
}
package sh.okx.rankup.ranks;
import java.util.List;
import lombok.AccessLevel;
import lombok.EqualsAndHashCode;
import lombok.Getter;
import lombok.RequiredArgsConstructor;
import lombok.ToString;
import me.clip.placeholderapi.PlaceholderAPI;
import org.bukkit.Bukkit;
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.ranks.requirements.RankRequirements;
import sh.okx.rankup.requirements.Requirement;
@EqualsAndHashCode
@ToString
@RequiredArgsConstructor(access = AccessLevel.PROTECTED)
public class Rank {
@Getter
protected final ConfigurationSection section;
protected final RankupPlugin plugin;
@Getter
protected final String next;
@Getter
protected final String rank;
@Getter
protected final RankRequirements requirements;
protected final List<String> commands;
public boolean isIn(Player player) {
return plugin.getPermissions().inGroup(player.getUniqueId(), rank);
}
public boolean isLast() {
return plugin.getRankups().getByName(next) == 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) {
requirements.applyRequirements(player);
}
public void runCommands(Player player) {
for (String command : commands) {
String string = new MessageBuilder(command).replaceRanks(player, this, next).toString();
if (Bukkit.getPluginManager().isPluginEnabled("PlaceholderAPI")) {
string = PlaceholderAPI.setPlaceholders(player, string);
}
Bukkit.dispatchCommand(Bukkit.getConsoleSender(), string);
}
}
}
+32 -32
View File
@@ -1,32 +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);
}
}
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);
}
}
+11 -11
View File
@@ -1,11 +1,11 @@
package sh.okx.rankup.ranks;
import org.bukkit.configuration.file.FileConfiguration;
import sh.okx.rankup.RankList;
import sh.okx.rankup.RankupPlugin;
public class Rankups extends RankList<Rank> {
public Rankups(RankupPlugin plugin, FileConfiguration config) {
super(config, section -> Rankup.deserialize(plugin, section));
}
}
package sh.okx.rankup.ranks;
import org.bukkit.configuration.file.FileConfiguration;
import sh.okx.rankup.RankList;
import sh.okx.rankup.RankupPlugin;
public class Rankups extends RankList<Rank> {
public Rankups(RankupPlugin plugin, FileConfiguration config) {
super(config, section -> Rankup.deserialize(plugin, section));
}
}
@@ -1,48 +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);
}
}
}
}
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);
}
}
}
}
@@ -1,63 +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;
}
}
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;
}
}
@@ -1,13 +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);
}
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);
}
@@ -1,72 +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);
}
}
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);
}
}
@@ -1,20 +1,22 @@
package sh.okx.rankup.requirements;
import org.bukkit.entity.Player;
public interface DeductibleRequirement {
/**
* Apply the effect of this requirement to the player.
* For money, this could be taking money away from the player.
* You can assume that <code>Requirement#check(Player)</code> has been called,
* and has returned true immediately prior to this.
*
* @param player the player to take from
* @param multiplier The multiplier for the value
*/
void apply(Player player, double multiplier);
default void apply(Player player) {
apply(player, 1);
}
}
package sh.okx.rankup.requirements;
import org.bukkit.entity.Player;
public interface DeductibleRequirement {
/**
* Apply the effect of this requirement to the player.
* For money, this could be taking money away from the player.
* You can assume that <code>Requirement#check(Player)</code> has been called,
* and has returned true immediately prior to this.
*
* Currently the multiplier will always be 1, but that may change in the future.
*
* @param player the player to take from
* @param multiplier The multiplier for the value
*/
void apply(Player player, double multiplier);
default void apply(Player player) {
apply(player, 1);
}
}
@@ -1,34 +1,34 @@
package sh.okx.rankup.requirements;
import org.bukkit.entity.Player;
import sh.okx.rankup.RankupPlugin;
public abstract class ProgressiveRequirement extends Requirement {
public ProgressiveRequirement(RankupPlugin plugin, String name) {
super(plugin, name);
}
public ProgressiveRequirement(RankupPlugin plugin, String name, boolean subRequirement) {
super(plugin, name, subRequirement);
}
protected ProgressiveRequirement(Requirement clone) {
super(clone);
}
@Override
public boolean check(Player player) {
return getRemaining(player) <= 0;
}
@Override
public final double getRemaining(Player player) {
return getRemaining(player, 1);
}
public double getRemaining(Player player, double multiplier) {
return Math.max(0, (multiplier * getTotal(player)) - getProgress(player));
}
public abstract double getProgress(Player player);
}
package sh.okx.rankup.requirements;
import org.bukkit.entity.Player;
import sh.okx.rankup.RankupPlugin;
public abstract class ProgressiveRequirement extends Requirement {
public ProgressiveRequirement(RankupPlugin plugin, String name) {
super(plugin, name);
}
public ProgressiveRequirement(RankupPlugin plugin, String name, boolean subRequirement) {
super(plugin, name, subRequirement);
}
protected ProgressiveRequirement(Requirement clone) {
super(clone);
}
@Override
public boolean check(Player player) {
return getRemaining(player) <= 0;
}
@Override
public final double getRemaining(Player player) {
return getRemaining(player, 1);
}
public double getRemaining(Player player, double multiplier) {
return Math.max(0, (multiplier * getTotal(player)) - getProgress(player));
}
public abstract double getProgress(Player player);
}
@@ -1,104 +1,104 @@
package sh.okx.rankup.requirements;
import lombok.Getter;
import org.bukkit.entity.Player;
import sh.okx.rankup.RankupPlugin;
public abstract class Requirement implements Cloneable {
protected final RankupPlugin plugin;
@Getter
protected final String name;
private String value;
@Getter
private String sub;
private boolean subRequirement;
public Requirement(RankupPlugin plugin, String name) {
this(plugin, name, false);
}
public Requirement(RankupPlugin plugin, String name, boolean subRequirement) {
this.plugin = plugin;
this.name = name;
this.subRequirement = subRequirement;
}
protected Requirement(Requirement clone) {
this.plugin = clone.plugin;
this.name = clone.name;
this.value = clone.value;
this.sub = clone.sub;
this.subRequirement = clone.subRequirement;
}
public void setValue(String value) {
if (hasSubRequirement()) {
String[] parts = value.split(" ", 2);
if (parts.length < 2) {
throw new IllegalArgumentException("Amount and sub-requirement not present for requirement '" + getName() + "'. You must use the format '" + getName() + " <sub-requirement> <amount>'");
}
this.sub = parts[0];
this.value = parts[1];
} else {
this.value = value;
}
}
public String getValueString() {
return value;
}
public String[] getValuesString() {
return value.split(" ");
}
public double getValueDouble() {
return Double.parseDouble(value);
}
public int getValueInt() {
return Integer.parseInt(value);
}
public boolean getValueBoolean() {
return Boolean.parseBoolean(value);
}
public String getFullName() {
if (hasSubRequirement()) {
return name + "#" + sub;
} else {
return name;
}
}
/**
* Check if a player meets this requirement
*
* @param player the player to check
* @return true if they meet the requirement, false otherwise
*/
public abstract boolean check(Player player);
/**
* Get the remaining amount needed for <code>Requirement#check(Player)</code> to yield true.
* This is not required and is only used in placeholders.
*
* @param player the player to find the remaining amount of
* @return the remaining amount needed. Should be non-negative.
*/
public double getRemaining(Player player) {
return check(player) ? 0 : 1;
}
public final boolean hasSubRequirement() {
return subRequirement;
}
public abstract Requirement clone();
public double getTotal(Player player) {
return getValueDouble();
}
}
package sh.okx.rankup.requirements;
import lombok.Getter;
import org.bukkit.entity.Player;
import sh.okx.rankup.RankupPlugin;
public abstract class Requirement implements Cloneable {
protected final RankupPlugin plugin;
@Getter
protected final String name;
private String value;
@Getter
private String sub;
private boolean subRequirement;
public Requirement(RankupPlugin plugin, String name) {
this(plugin, name, false);
}
public Requirement(RankupPlugin plugin, String name, boolean subRequirement) {
this.plugin = plugin;
this.name = name;
this.subRequirement = subRequirement;
}
protected Requirement(Requirement clone) {
this.plugin = clone.plugin;
this.name = clone.name;
this.value = clone.value;
this.sub = clone.sub;
this.subRequirement = clone.subRequirement;
}
public void setValue(String value) {
if (hasSubRequirement()) {
String[] parts = value.split(" ", 2);
if (parts.length < 2) {
throw new IllegalArgumentException("Amount and sub-requirement not present for requirement '" + getName() + "'. You must use the format '" + getName() + " <sub-requirement> <amount>'");
}
this.sub = parts[0];
this.value = parts[1];
} else {
this.value = value;
}
}
public String getValueString() {
return value;
}
public String[] getValuesString() {
return value.split(" ");
}
public double getValueDouble() {
return Double.parseDouble(value);
}
public int getValueInt() {
return Integer.parseInt(value);
}
public boolean getValueBoolean() {
return Boolean.parseBoolean(value);
}
public String getFullName() {
if (hasSubRequirement()) {
return name + "#" + sub;
} else {
return name;
}
}
/**
* Check if a player meets this requirement
*
* @param player the player to check
* @return true if they meet the requirement, false otherwise
*/
public abstract boolean check(Player player);
/**
* Get the remaining amount needed for <code>Requirement#check(Player)</code> to yield true.
* This is not required and is only used in placeholders.
*
* @param player the player to find the remaining amount of
* @return the remaining amount needed. Should be non-negative.
*/
public double getRemaining(Player player) {
return check(player) ? 0 : 1;
}
public final boolean hasSubRequirement() {
return subRequirement;
}
public abstract Requirement clone();
public double getTotal(Player player) {
return getValueDouble();
}
}
@@ -1,49 +1,49 @@
package sh.okx.rankup.requirements;
import java.util.Collections;
import java.util.HashSet;
import java.util.Objects;
import java.util.Set;
public class RequirementRegistry {
private Set<Requirement> requirements = new HashSet<>();
public void addRequirement(Requirement requirement) {
requirements.add(requirement);
}
public void addRequirements(Requirement... requirements) {
Collections.addAll(this.requirements, requirements);
}
public Requirement newRequirement(String name, String value) {
for (Requirement requirement : requirements) {
if (requirement.getName().equalsIgnoreCase(name)) {
Requirement newRequirement = requirement.clone();
newRequirement.setValue(value);
return newRequirement;
}
}
return null;
}
public Set<Requirement> getRequirements(Iterable<String> list) {
Set<Requirement> requirements = new HashSet<>();
for (String req : list) {
String[] parts = req.split(" ", 2);
if (parts.length < 2) {
throw new IllegalArgumentException("For requirement: '" + req + "'. Requirements must contain a space between" +
" the name of the requirement and the value of the requirement. If it already looks like it has a space, " +
"make sure it is not a tab or has an invisible character.");
}
String name = parts[0];
String value = parts[1];
Requirement requirement = newRequirement(name, value);
Objects.requireNonNull(requirement, name.equalsIgnoreCase("money") ? "The 'money' requirement is being used but no economy is found" : "Unknown requirement: " + name);
requirements.add(requirement);
}
return requirements;
}
}
package sh.okx.rankup.requirements;
import java.util.Collections;
import java.util.HashSet;
import java.util.Objects;
import java.util.Set;
public class RequirementRegistry {
private Set<Requirement> requirements = new HashSet<>();
public void addRequirement(Requirement requirement) {
requirements.add(requirement);
}
public void addRequirements(Requirement... requirements) {
Collections.addAll(this.requirements, requirements);
}
public Requirement newRequirement(String name, String value) {
for (Requirement requirement : requirements) {
if (requirement.getName().equalsIgnoreCase(name)) {
Requirement newRequirement = requirement.clone();
newRequirement.setValue(value);
return newRequirement;
}
}
return null;
}
public Set<Requirement> getRequirements(Iterable<String> list) {
Set<Requirement> requirements = new HashSet<>();
for (String req : list) {
String[] parts = req.split(" ", 2);
if (parts.length < 2) {
throw new IllegalArgumentException("For requirement: '" + req + "'. Requirements must contain a space between" +
" the name of the requirement and the value of the requirement. If it already looks like it has a space, " +
"make sure it is not a tab or has an invisible character.");
}
String name = parts[0];
String value = parts[1];
Requirement requirement = newRequirement(name, value);
Objects.requireNonNull(requirement, name.equalsIgnoreCase("money") ? "The 'money' requirement is being used but no economy is found" : "Unknown requirement: " + name);
requirements.add(requirement);
}
return requirements;
}
}
@@ -1,26 +1,26 @@
package sh.okx.rankup.requirements;
import org.bukkit.entity.Player;
import sh.okx.rankup.RankupPlugin;
import sh.okx.rankup.requirements.requirement.XpLevelRequirement;
public class XpLevelDeductibleRequirement extends XpLevelRequirement implements DeductibleRequirement {
public XpLevelDeductibleRequirement(RankupPlugin plugin, String name) {
super(plugin, name);
}
private XpLevelDeductibleRequirement(XpLevelDeductibleRequirement clone) {
super(clone);
}
@Override
public void apply(Player player, double multiplier) {
player.setLevel(player.getLevel() - (int) Math.round(getValueInt() * multiplier));
}
@Override
public Requirement clone() {
return new XpLevelDeductibleRequirement(this);
}
}
package sh.okx.rankup.requirements;
import org.bukkit.entity.Player;
import sh.okx.rankup.RankupPlugin;
import sh.okx.rankup.requirements.requirement.XpLevelRequirement;
public class XpLevelDeductibleRequirement extends XpLevelRequirement implements DeductibleRequirement {
public XpLevelDeductibleRequirement(RankupPlugin plugin, String name) {
super(plugin, name);
}
private XpLevelDeductibleRequirement(XpLevelDeductibleRequirement clone) {
super(clone);
}
@Override
public void apply(Player player, double multiplier) {
player.setLevel(player.getLevel() - (int) Math.round(getValueInt() * multiplier));
}
@Override
public Requirement clone() {
return new XpLevelDeductibleRequirement(this);
}
}
@@ -1,32 +1,32 @@
package sh.okx.rankup.requirements.requirement;
import org.bukkit.Material;
import org.bukkit.Statistic;
import org.bukkit.entity.Player;
import sh.okx.rankup.RankupPlugin;
import sh.okx.rankup.requirements.ProgressiveRequirement;
import sh.okx.rankup.requirements.Requirement;
public class BlockBreakRequirement extends ProgressiveRequirement {
public BlockBreakRequirement(RankupPlugin plugin) {
super(plugin, "block-break", true);
}
protected BlockBreakRequirement(BlockBreakRequirement clone) {
super(clone);
}
@Override
public double getProgress(Player player) {
Material material = Material.matchMaterial(getSub());
if (material == null || !material.isBlock()) {
throw new IllegalArgumentException("'" + getSub() + "' is not a valid block");
}
return player.getStatistic(Statistic.MINE_BLOCK, material);
}
@Override
public Requirement clone() {
return new BlockBreakRequirement(this);
}
}
package sh.okx.rankup.requirements.requirement;
import org.bukkit.Material;
import org.bukkit.Statistic;
import org.bukkit.entity.Player;
import sh.okx.rankup.RankupPlugin;
import sh.okx.rankup.requirements.ProgressiveRequirement;
import sh.okx.rankup.requirements.Requirement;
public class BlockBreakRequirement extends ProgressiveRequirement {
public BlockBreakRequirement(RankupPlugin plugin) {
super(plugin, "block-break", true);
}
protected BlockBreakRequirement(BlockBreakRequirement clone) {
super(clone);
}
@Override
public double getProgress(Player player) {
Material material = Material.matchMaterial(getSub());
if (material == null || !material.isBlock()) {
throw new IllegalArgumentException("'" + getSub() + "' is not a valid block");
}
return player.getStatistic(Statistic.MINE_BLOCK, material);
}
@Override
public Requirement clone() {
return new BlockBreakRequirement(this);
}
}
@@ -1,32 +1,32 @@
package sh.okx.rankup.requirements.requirement;
import org.bukkit.Material;
import org.bukkit.Statistic;
import org.bukkit.entity.Player;
import sh.okx.rankup.RankupPlugin;
import sh.okx.rankup.requirements.ProgressiveRequirement;
import sh.okx.rankup.requirements.Requirement;
public class CraftItemRequirement extends ProgressiveRequirement {
public CraftItemRequirement(RankupPlugin plugin) {
super(plugin, "craft-item", true);
}
protected CraftItemRequirement(CraftItemRequirement clone) {
super(clone);
}
@Override
public double getProgress(Player player) {
Material material = Material.matchMaterial(getSub());
if (material == null) {
throw new IllegalArgumentException("'" + getSub() + "' is not a valid item");
}
return player.getStatistic(Statistic.CRAFT_ITEM, material);
}
@Override
public Requirement clone() {
return new CraftItemRequirement(this);
}
}
package sh.okx.rankup.requirements.requirement;
import org.bukkit.Material;
import org.bukkit.Statistic;
import org.bukkit.entity.Player;
import sh.okx.rankup.RankupPlugin;
import sh.okx.rankup.requirements.ProgressiveRequirement;
import sh.okx.rankup.requirements.Requirement;
public class CraftItemRequirement extends ProgressiveRequirement {
public CraftItemRequirement(RankupPlugin plugin) {
super(plugin, "craft-item", true);
}
protected CraftItemRequirement(CraftItemRequirement clone) {
super(clone);
}
@Override
public double getProgress(Player player) {
Material material = Material.matchMaterial(getSub());
if (material == null) {
throw new IllegalArgumentException("'" + getSub() + "' is not a valid item");
}
return player.getStatistic(Statistic.CRAFT_ITEM, material);
}
@Override
public Requirement clone() {
return new CraftItemRequirement(this);
}
}
@@ -1,30 +1,30 @@
package sh.okx.rankup.requirements.requirement;
import org.bukkit.entity.Player;
import sh.okx.rankup.RankupPlugin;
import sh.okx.rankup.requirements.Requirement;
public class GroupRequirement extends Requirement {
public GroupRequirement(RankupPlugin plugin) {
super(plugin, "group");
}
protected GroupRequirement(Requirement clone) {
super(clone);
}
@Override
public boolean check(Player player) {
for (String group : getValuesString()) {
if (plugin.getPermissions().inGroup(player.getUniqueId(), group)) {
return true;
}
}
return false;
}
@Override
public Requirement clone() {
return new GroupRequirement(this);
}
}
package sh.okx.rankup.requirements.requirement;
import org.bukkit.entity.Player;
import sh.okx.rankup.RankupPlugin;
import sh.okx.rankup.requirements.Requirement;
public class GroupRequirement extends Requirement {
public GroupRequirement(RankupPlugin plugin) {
super(plugin, "group");
}
protected GroupRequirement(Requirement clone) {
super(clone);
}
@Override
public boolean check(Player player) {
for (String group : getValuesString()) {
if (plugin.getPermissions().inGroup(player.getUniqueId(), group)) {
return true;
}
}
return false;
}
@Override
public Requirement clone() {
return new GroupRequirement(this);
}
}
@@ -1,49 +1,49 @@
package sh.okx.rankup.requirements.requirement;
import org.bukkit.entity.Player;
import org.bukkit.inventory.ItemStack;
import sh.okx.rankup.RankupPlugin;
import sh.okx.rankup.requirements.DeductibleRequirement;
import sh.okx.rankup.requirements.Requirement;
public class ItemDeductibleRequirement extends ItemRequirement implements DeductibleRequirement {
public ItemDeductibleRequirement(RankupPlugin plugin, String name) {
super(plugin, name);
}
public ItemDeductibleRequirement(ItemDeductibleRequirement clone) {
super(clone);
}
@Override
public void apply(Player player, double multiplier) {
int count = (int) (getTotal(player) * multiplier);
ItemStack[] contents = player.getInventory().getStorageContents();
for (int i = 0; i < contents.length && count > 0; i++) {
ItemStack item = contents[i];
if (matchItem(item)) {
if (count < item.getAmount()) {
item.setAmount(item.getAmount() - count);
count = 0;
} else {
count -= item.getAmount();
contents[i] = null;
}
}
}
player.getInventory().setStorageContents(contents);
if (count > 0) {
throw new IllegalStateException("REPORT THIS ERROR TO THE DEV - COULD NOT DEDUCT ALL ITEMS");
}
}
@Override
public Requirement clone() {
return new ItemDeductibleRequirement(this);
}
}
package sh.okx.rankup.requirements.requirement;
import org.bukkit.entity.Player;
import org.bukkit.inventory.ItemStack;
import sh.okx.rankup.RankupPlugin;
import sh.okx.rankup.requirements.DeductibleRequirement;
import sh.okx.rankup.requirements.Requirement;
public class ItemDeductibleRequirement extends ItemRequirement implements DeductibleRequirement {
public ItemDeductibleRequirement(RankupPlugin plugin, String name) {
super(plugin, name);
}
public ItemDeductibleRequirement(ItemDeductibleRequirement clone) {
super(clone);
}
@Override
public void apply(Player player, double multiplier) {
int count = (int) (getTotal(player) * multiplier);
ItemStack[] contents = player.getInventory().getStorageContents();
for (int i = 0; i < contents.length && count > 0; i++) {
ItemStack item = contents[i];
if (matchItem(item)) {
if (count < item.getAmount()) {
item.setAmount(item.getAmount() - count);
count = 0;
} else {
count -= item.getAmount();
contents[i] = null;
}
}
}
player.getInventory().setStorageContents(contents);
if (count > 0) {
throw new IllegalStateException("REPORT THIS ERROR TO THE DEV - COULD NOT DEDUCT ALL ITEMS");
}
}
@Override
public Requirement clone() {
return new ItemDeductibleRequirement(this);
}
}
@@ -1,62 +1,62 @@
package sh.okx.rankup.requirements.requirement;
import org.bukkit.Material;
import org.bukkit.entity.Player;
import org.bukkit.inventory.ItemStack;
import sh.okx.rankup.RankupPlugin;
import sh.okx.rankup.requirements.ProgressiveRequirement;
import sh.okx.rankup.requirements.Requirement;
import java.util.Arrays;
public class ItemRequirement extends ProgressiveRequirement {
public ItemRequirement(RankupPlugin plugin, String name) {
super(plugin, name, true);
}
protected ItemRequirement(ItemRequirement clone) {
super(clone);
}
@Override
public Requirement clone() {
return new ItemRequirement(this);
}
@Override
public double getProgress(Player player) {
return Arrays.stream(player.getInventory().getStorageContents())
.filter(this::matchItem)
.mapToInt(ItemStack::getAmount).sum();
}
@SuppressWarnings("deprecation")
protected boolean matchItem(ItemStack item) {
if (item == null) {
return false;
}
String sub = getSub();
String[] parts = sub.split(":");
Material material = Material.matchMaterial(parts[0]);
if (material == null) {
throw new IllegalArgumentException("[item requirement] could not find material name: " + parts[0]);
}
if (parts.length > 1) {
int durability;
try {
durability = Integer.parseInt(parts[1]);
} catch (NumberFormatException e) {
throw new IllegalArgumentException("[item requirement] durability '" + parts[1] + "' must be a number in item: '" + sub + "'");
}
if (durability != item.getDurability()) {
return false;
}
}
return material == item.getType();
}
}
package sh.okx.rankup.requirements.requirement;
import org.bukkit.Material;
import org.bukkit.entity.Player;
import org.bukkit.inventory.ItemStack;
import sh.okx.rankup.RankupPlugin;
import sh.okx.rankup.requirements.ProgressiveRequirement;
import sh.okx.rankup.requirements.Requirement;
import java.util.Arrays;
public class ItemRequirement extends ProgressiveRequirement {
public ItemRequirement(RankupPlugin plugin, String name) {
super(plugin, name, true);
}
protected ItemRequirement(ItemRequirement clone) {
super(clone);
}
@Override
public Requirement clone() {
return new ItemRequirement(this);
}
@Override
public double getProgress(Player player) {
return Arrays.stream(player.getInventory().getStorageContents())
.filter(this::matchItem)
.mapToInt(ItemStack::getAmount).sum();
}
@SuppressWarnings("deprecation")
protected boolean matchItem(ItemStack item) {
if (item == null) {
return false;
}
String sub = getSub();
String[] parts = sub.split(":");
Material material = Material.matchMaterial(parts[0]);
if (material == null) {
throw new IllegalArgumentException("[item requirement] could not find material name: " + parts[0]);
}
if (parts.length > 1) {
int durability;
try {
durability = Integer.parseInt(parts[1]);
} catch (NumberFormatException e) {
throw new IllegalArgumentException("[item requirement] durability '" + parts[1] + "' must be a number in item: '" + sub + "'");
}
if (durability != item.getDurability()) {
return false;
}
}
return material == item.getType();
}
}
@@ -1,32 +1,32 @@
package sh.okx.rankup.requirements.requirement;
import org.bukkit.Statistic;
import org.bukkit.entity.EntityType;
import org.bukkit.entity.Player;
import sh.okx.rankup.RankupPlugin;
import sh.okx.rankup.requirements.ProgressiveRequirement;
import sh.okx.rankup.requirements.Requirement;
import java.util.Objects;
public class MobKillsRequirement extends ProgressiveRequirement {
public MobKillsRequirement(RankupPlugin plugin) {
super(plugin, "mob-kills", true);
}
protected MobKillsRequirement(Requirement clone) {
super(clone);
}
@SuppressWarnings("deprecation")
@Override
public double getProgress(Player player) {
EntityType entity = Objects.requireNonNull(EntityType.fromName(getSub()), "Invalid entity type '" + getSub() + "' in mob-kills requirement.");
return player.getStatistic(Statistic.KILL_ENTITY, entity);
}
@Override
public Requirement clone() {
return new MobKillsRequirement(this);
}
}
package sh.okx.rankup.requirements.requirement;
import org.bukkit.Statistic;
import org.bukkit.entity.EntityType;
import org.bukkit.entity.Player;
import sh.okx.rankup.RankupPlugin;
import sh.okx.rankup.requirements.ProgressiveRequirement;
import sh.okx.rankup.requirements.Requirement;
import java.util.Objects;
public class MobKillsRequirement extends ProgressiveRequirement {
public MobKillsRequirement(RankupPlugin plugin) {
super(plugin, "mob-kills", true);
}
protected MobKillsRequirement(Requirement clone) {
super(clone);
}
@SuppressWarnings("deprecation")
@Override
public double getProgress(Player player) {
EntityType entity = Objects.requireNonNull(EntityType.fromName(getSub()), "Invalid entity type '" + getSub() + "' in mob-kills requirement.");
return player.getStatistic(Statistic.KILL_ENTITY, entity);
}
@Override
public Requirement clone() {
return new MobKillsRequirement(this);
}
}
@@ -1,29 +1,29 @@
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.requirements.DeductibleRequirement;
import sh.okx.rankup.requirements.Requirement;
public class MoneyDeductibleRequirement extends MoneyRequirement implements DeductibleRequirement {
public MoneyDeductibleRequirement(RankupPlugin plugin, String name) {
super(plugin, name);
}
protected MoneyDeductibleRequirement(MoneyDeductibleRequirement clone) {
super(clone);
}
@Override
public void apply(Player player, double multiplier) {
Economy economy = plugin.getEconomy();
economy.withdrawPlayer(player, getValueDouble() * multiplier);
}
@Override
public Requirement clone() {
return new MoneyDeductibleRequirement(this);
}
}
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.requirements.DeductibleRequirement;
import sh.okx.rankup.requirements.Requirement;
public class MoneyDeductibleRequirement extends MoneyRequirement implements DeductibleRequirement {
public MoneyDeductibleRequirement(RankupPlugin plugin, String name) {
super(plugin, name);
}
protected MoneyDeductibleRequirement(MoneyDeductibleRequirement clone) {
super(clone);
}
@Override
public void apply(Player player, double multiplier) {
Economy economy = plugin.getEconomy();
economy.withdrawPlayer(player, getValueDouble() * multiplier);
}
@Override
public Requirement clone() {
return new MoneyDeductibleRequirement(this);
}
}
@@ -1,26 +1,26 @@
package sh.okx.rankup.requirements.requirement;
import org.bukkit.entity.Player;
import sh.okx.rankup.RankupPlugin;
import sh.okx.rankup.requirements.ProgressiveRequirement;
import sh.okx.rankup.requirements.Requirement;
public class MoneyRequirement extends ProgressiveRequirement {
public MoneyRequirement(RankupPlugin plugin, String name) {
super(plugin, name);
}
protected MoneyRequirement(MoneyRequirement clone) {
super(clone);
}
@Override
public double getProgress(Player player) {
return plugin.getEconomy().getBalance(player);
}
@Override
public Requirement clone() {
return new MoneyRequirement(this);
}
package sh.okx.rankup.requirements.requirement;
import org.bukkit.entity.Player;
import sh.okx.rankup.RankupPlugin;
import sh.okx.rankup.requirements.ProgressiveRequirement;
import sh.okx.rankup.requirements.Requirement;
public class MoneyRequirement extends ProgressiveRequirement {
public MoneyRequirement(RankupPlugin plugin, String name) {
super(plugin, name);
}
protected MoneyRequirement(MoneyRequirement clone) {
super(clone);
}
@Override
public double getProgress(Player player) {
return plugin.getEconomy().getBalance(player);
}
@Override
public Requirement clone() {
return new MoneyRequirement(this);
}
}
@@ -1,30 +1,30 @@
package sh.okx.rankup.requirements.requirement;
import org.bukkit.entity.Player;
import sh.okx.rankup.RankupPlugin;
import sh.okx.rankup.requirements.Requirement;
public class PermissionRequirement extends Requirement {
public PermissionRequirement(RankupPlugin plugin) {
super(plugin, "permission");
}
protected PermissionRequirement(Requirement clone) {
super(clone);
}
@Override
public boolean check(Player player) {
for (String permission : getValuesString()) {
if (player.hasPermission(permission)) {
return true;
}
}
return false;
}
@Override
public Requirement clone() {
return new PermissionRequirement(this);
}
}
package sh.okx.rankup.requirements.requirement;
import org.bukkit.entity.Player;
import sh.okx.rankup.RankupPlugin;
import sh.okx.rankup.requirements.Requirement;
public class PermissionRequirement extends Requirement {
public PermissionRequirement(RankupPlugin plugin) {
super(plugin, "permission");
}
protected PermissionRequirement(Requirement clone) {
super(clone);
}
@Override
public boolean check(Player player) {
for (String permission : getValuesString()) {
if (player.hasPermission(permission)) {
return true;
}
}
return false;
}
@Override
public Requirement clone() {
return new PermissionRequirement(this);
}
}
@@ -1,90 +1,90 @@
package sh.okx.rankup.requirements.requirement;
import me.clip.placeholderapi.PlaceholderAPI;
import org.bukkit.entity.Player;
import sh.okx.rankup.RankupPlugin;
import sh.okx.rankup.requirements.ProgressiveRequirement;
import sh.okx.rankup.requirements.Requirement;
public class PlaceholderRequirement extends ProgressiveRequirement {
public static final double DELTA = 0.00001D;
public PlaceholderRequirement(RankupPlugin plugin) {
super(plugin, "placeholder");
}
public PlaceholderRequirement(PlaceholderRequirement clone) {
super(clone);
}
@Override
public double getProgress(Player player) {
String[] parts = getParts(player);
String parsed = parts[0];
String value = parts[2];
// string operations
switch (parts[1]) {
case "=":
return parsed.equals(value) ? 1 : 0;
}
// numeric operations
double p = Double.parseDouble(parsed);
double v = Double.parseDouble(value);
switch (parts[1]) {
case ">":
return p > v ? v : 0;
case ">=":
return Math.min(p, v);
case "<":
return p < v ? v : 0;
case "<=":
return p <= v ? 1 : 0;
case "==":
return p == v ? v : 0;
}
throw new IllegalArgumentException("Invalid operation: " + parts[1]);
}
@Override
public double getTotal(Player player) {
String[] parts = getParts(player);
if (parts[1].equalsIgnoreCase("=")) {
return 1;
} else {
return Double.parseDouble(parts[2]);
}
}
private String[] getParts(Player player) {
String[] parts = getValueString().split(" ");
if (parts.length < 3) {
throw new IllegalArgumentException("Placeholder requirements must be in the form %placeholder% <operation> string");
}
String parsed = PlaceholderAPI.setPlaceholders(player, parts[0]);
if (!PlaceholderAPI.containsPlaceholders(parts[0]) || parsed.equals(parts[0])) {
throw new IllegalArgumentException(parts[0] + " is not a PlaceholderAPI placeholder!");
}
parts[0] = parsed;
return parts;
}
@Override
public String getFullName() {
String[] parts = getValueString().split(" ");
return name + "#" + parts[0].replace("%", "");
}
@Override
public boolean check(Player player) {
return getRemaining(player) <= 0;
}
@Override
public Requirement clone() {
return new PlaceholderRequirement(this);
}
}
package sh.okx.rankup.requirements.requirement;
import me.clip.placeholderapi.PlaceholderAPI;
import org.bukkit.entity.Player;
import sh.okx.rankup.RankupPlugin;
import sh.okx.rankup.requirements.ProgressiveRequirement;
import sh.okx.rankup.requirements.Requirement;
public class PlaceholderRequirement extends ProgressiveRequirement {
public static final double DELTA = 0.00001D;
public PlaceholderRequirement(RankupPlugin plugin) {
super(plugin, "placeholder");
}
public PlaceholderRequirement(PlaceholderRequirement clone) {
super(clone);
}
@Override
public double getProgress(Player player) {
String[] parts = getParts(player);
String parsed = parts[0];
String value = parts[2];
// string operations
switch (parts[1]) {
case "=":
return parsed.equals(value) ? 1 : 0;
}
// numeric operations
double p = Double.parseDouble(parsed);
double v = Double.parseDouble(value);
switch (parts[1]) {
case ">":
return p > v ? v : 0;
case ">=":
return Math.min(p, v);
case "<":
return p < v ? v : 0;
case "<=":
return p <= v ? 1 : 0;
case "==":
return p == v ? v : 0;
}
throw new IllegalArgumentException("Invalid operation: " + parts[1]);
}
@Override
public double getTotal(Player player) {
String[] parts = getParts(player);
if (parts[1].equalsIgnoreCase("=")) {
return 1;
} else {
return Double.parseDouble(parts[2]);
}
}
private String[] getParts(Player player) {
String[] parts = getValueString().split(" ");
if (parts.length < 3) {
throw new IllegalArgumentException("Placeholder requirements must be in the form %placeholder% <operation> string");
}
String parsed = PlaceholderAPI.setPlaceholders(player, parts[0]);
if (!PlaceholderAPI.containsPlaceholders(parts[0]) || parsed.equals(parts[0])) {
throw new IllegalArgumentException(parts[0] + " is not a PlaceholderAPI placeholder!");
}
parts[0] = parsed;
return parts;
}
@Override
public String getFullName() {
String[] parts = getValueString().split(" ");
return name + "#" + parts[0].replace("%", "");
}
@Override
public boolean check(Player player) {
return getRemaining(player) <= 0;
}
@Override
public Requirement clone() {
return new PlaceholderRequirement(this);
}
}
@@ -1,27 +1,27 @@
package sh.okx.rankup.requirements.requirement;
import org.bukkit.Statistic;
import org.bukkit.entity.Player;
import sh.okx.rankup.RankupPlugin;
import sh.okx.rankup.requirements.ProgressiveRequirement;
import sh.okx.rankup.requirements.Requirement;
public class PlayerKillsRequirement extends ProgressiveRequirement {
public PlayerKillsRequirement(RankupPlugin plugin) {
super(plugin, "player-kills");
}
protected PlayerKillsRequirement(Requirement clone) {
super(clone);
}
@Override
public double getProgress(Player player) {
return player.getStatistic(Statistic.PLAYER_KILLS);
}
@Override
public Requirement clone() {
return new PlayerKillsRequirement(this);
}
}
package sh.okx.rankup.requirements.requirement;
import org.bukkit.Statistic;
import org.bukkit.entity.Player;
import sh.okx.rankup.RankupPlugin;
import sh.okx.rankup.requirements.ProgressiveRequirement;
import sh.okx.rankup.requirements.Requirement;
public class PlayerKillsRequirement extends ProgressiveRequirement {
public PlayerKillsRequirement(RankupPlugin plugin) {
super(plugin, "player-kills");
}
protected PlayerKillsRequirement(Requirement clone) {
super(clone);
}
@Override
public double getProgress(Player player) {
return player.getStatistic(Statistic.PLAYER_KILLS);
}
@Override
public Requirement clone() {
return new PlayerKillsRequirement(this);
}
}
@@ -1,37 +1,37 @@
package sh.okx.rankup.requirements.requirement;
import org.bukkit.Statistic;
import org.bukkit.entity.Player;
import sh.okx.rankup.RankupPlugin;
import sh.okx.rankup.requirements.ProgressiveRequirement;
import sh.okx.rankup.requirements.Requirement;
public class PlaytimeMinutesRequirement extends ProgressiveRequirement {
private static final int TICKS_PER_MINUTE = 20 * 60;
private Statistic playOneTick;
public PlaytimeMinutesRequirement(RankupPlugin plugin) {
super(plugin, "playtime-minutes");
try {
playOneTick = Statistic.valueOf("PLAY_ONE_MINUTE");
} catch (IllegalArgumentException e) {
// statistic was changed in 1.13.
playOneTick = Statistic.valueOf("PLAY_ONE_TICK");
}
}
protected PlaytimeMinutesRequirement(PlaytimeMinutesRequirement clone) {
super(clone);
this.playOneTick = clone.playOneTick;
}
@Override
public double getProgress(Player player) {
return player.getStatistic(playOneTick) / TICKS_PER_MINUTE;
}
@Override
public Requirement clone() {
return new PlaytimeMinutesRequirement(this);
}
}
package sh.okx.rankup.requirements.requirement;
import org.bukkit.Statistic;
import org.bukkit.entity.Player;
import sh.okx.rankup.RankupPlugin;
import sh.okx.rankup.requirements.ProgressiveRequirement;
import sh.okx.rankup.requirements.Requirement;
public class PlaytimeMinutesRequirement extends ProgressiveRequirement {
private static final int TICKS_PER_MINUTE = 20 * 60;
private Statistic playOneTick;
public PlaytimeMinutesRequirement(RankupPlugin plugin) {
super(plugin, "playtime-minutes");
try {
playOneTick = Statistic.valueOf("PLAY_ONE_MINUTE");
} catch (IllegalArgumentException e) {
// statistic was changed in 1.13.
playOneTick = Statistic.valueOf("PLAY_ONE_TICK");
}
}
protected PlaytimeMinutesRequirement(PlaytimeMinutesRequirement clone) {
super(clone);
this.playOneTick = clone.playOneTick;
}
@Override
public double getProgress(Player player) {
return player.getStatistic(playOneTick) / TICKS_PER_MINUTE;
}
@Override
public Requirement clone() {
return new PlaytimeMinutesRequirement(this);
}
}
@@ -1,26 +1,26 @@
package sh.okx.rankup.requirements.requirement;
import org.bukkit.entity.Player;
import sh.okx.rankup.RankupPlugin;
import sh.okx.rankup.requirements.DeductibleRequirement;
import sh.okx.rankup.requirements.requirement.tokenmanager.TokensRequirement;
public class TokensDeductibleRequirement extends TokensRequirement implements DeductibleRequirement {
public TokensDeductibleRequirement(RankupPlugin plugin, String name) {
super(plugin, name);
}
protected TokensDeductibleRequirement(TokensDeductibleRequirement clone) {
super(clone);
}
@Override
public void apply(Player player, double multiplier) {
manager.removeTokens(player, (long) (getValueInt() * multiplier));
}
@Override
public TokensRequirement clone() {
return new TokensDeductibleRequirement(this);
}
}
package sh.okx.rankup.requirements.requirement;
import org.bukkit.entity.Player;
import sh.okx.rankup.RankupPlugin;
import sh.okx.rankup.requirements.DeductibleRequirement;
import sh.okx.rankup.requirements.requirement.tokenmanager.TokensRequirement;
public class TokensDeductibleRequirement extends TokensRequirement implements DeductibleRequirement {
public TokensDeductibleRequirement(RankupPlugin plugin, String name) {
super(plugin, name);
}
protected TokensDeductibleRequirement(TokensDeductibleRequirement clone) {
super(clone);
}
@Override
public void apply(Player player, double multiplier) {
manager.removeTokens(player, (long) (getValueInt() * multiplier));
}
@Override
public TokensRequirement clone() {
return new TokensDeductibleRequirement(this);
}
}
@@ -1,27 +1,27 @@
package sh.okx.rankup.requirements.requirement;
import org.bukkit.Statistic;
import org.bukkit.entity.Player;
import sh.okx.rankup.RankupPlugin;
import sh.okx.rankup.requirements.ProgressiveRequirement;
import sh.okx.rankup.requirements.Requirement;
public class TotalMobKillsRequirement extends ProgressiveRequirement {
public TotalMobKillsRequirement(RankupPlugin plugin) {
super(plugin, "total-mob-kills");
}
private TotalMobKillsRequirement(Requirement clone) {
super(clone);
}
@Override
public double getProgress(Player player) {
return player.getStatistic(Statistic.MOB_KILLS);
}
@Override
public Requirement clone() {
return new TotalMobKillsRequirement(this);
}
}
package sh.okx.rankup.requirements.requirement;
import org.bukkit.Statistic;
import org.bukkit.entity.Player;
import sh.okx.rankup.RankupPlugin;
import sh.okx.rankup.requirements.ProgressiveRequirement;
import sh.okx.rankup.requirements.Requirement;
public class TotalMobKillsRequirement extends ProgressiveRequirement {
public TotalMobKillsRequirement(RankupPlugin plugin) {
super(plugin, "total-mob-kills");
}
private TotalMobKillsRequirement(Requirement clone) {
super(clone);
}
@Override
public double getProgress(Player player) {
return player.getStatistic(Statistic.MOB_KILLS);
}
@Override
public Requirement clone() {
return new TotalMobKillsRequirement(this);
}
}
@@ -1,32 +1,32 @@
package sh.okx.rankup.requirements.requirement;
import org.bukkit.Material;
import org.bukkit.Statistic;
import org.bukkit.entity.Player;
import sh.okx.rankup.RankupPlugin;
import sh.okx.rankup.requirements.ProgressiveRequirement;
import sh.okx.rankup.requirements.Requirement;
public class UseItemRequirement extends ProgressiveRequirement {
public UseItemRequirement(RankupPlugin plugin) {
super(plugin, "use-item", true);
}
protected UseItemRequirement(UseItemRequirement clone) {
super(clone);
}
@Override
public double getProgress(Player player) {
Material material = Material.matchMaterial(getSub());
if (material == null) {
throw new IllegalArgumentException("'" + getSub() + "' is not a valid item");
}
return player.getStatistic(Statistic.USE_ITEM, material);
}
@Override
public Requirement clone() {
return new UseItemRequirement(this);
}
}
package sh.okx.rankup.requirements.requirement;
import org.bukkit.Material;
import org.bukkit.Statistic;
import org.bukkit.entity.Player;
import sh.okx.rankup.RankupPlugin;
import sh.okx.rankup.requirements.ProgressiveRequirement;
import sh.okx.rankup.requirements.Requirement;
public class UseItemRequirement extends ProgressiveRequirement {
public UseItemRequirement(RankupPlugin plugin) {
super(plugin, "use-item", true);
}
protected UseItemRequirement(UseItemRequirement clone) {
super(clone);
}
@Override
public double getProgress(Player player) {
Material material = Material.matchMaterial(getSub());
if (material == null) {
throw new IllegalArgumentException("'" + getSub() + "' is not a valid item");
}
return player.getStatistic(Statistic.USE_ITEM, material);
}
@Override
public Requirement clone() {
return new UseItemRequirement(this);
}
}
@@ -1,29 +1,29 @@
package sh.okx.rankup.requirements.requirement;
import org.bukkit.entity.Player;
import sh.okx.rankup.RankupPlugin;
import sh.okx.rankup.requirements.Requirement;
public class WorldRequirement extends Requirement {
public WorldRequirement(RankupPlugin plugin) {
super(plugin, "world");
}
protected WorldRequirement(Requirement clone) {
super(clone);
}
@Override
public boolean check(Player player) {
String[] worlds = getValuesString();
for (String world : worlds) {
return player.getWorld().getName().equalsIgnoreCase(world);
}
return false;
}
@Override
public Requirement clone() {
return new WorldRequirement(this);
}
}
package sh.okx.rankup.requirements.requirement;
import org.bukkit.entity.Player;
import sh.okx.rankup.RankupPlugin;
import sh.okx.rankup.requirements.Requirement;
public class WorldRequirement extends Requirement {
public WorldRequirement(RankupPlugin plugin) {
super(plugin, "world");
}
protected WorldRequirement(Requirement clone) {
super(clone);
}
@Override
public boolean check(Player player) {
String[] worlds = getValuesString();
for (String world : worlds) {
return player.getWorld().getName().equalsIgnoreCase(world);
}
return false;
}
@Override
public Requirement clone() {
return new WorldRequirement(this);
}
}
@@ -1,26 +1,26 @@
package sh.okx.rankup.requirements.requirement;
import org.bukkit.entity.Player;
import sh.okx.rankup.RankupPlugin;
import sh.okx.rankup.requirements.ProgressiveRequirement;
import sh.okx.rankup.requirements.Requirement;
public class XpLevelRequirement extends ProgressiveRequirement {
public XpLevelRequirement(RankupPlugin plugin, String name) {
super(plugin, name);
}
protected XpLevelRequirement(XpLevelRequirement clone) {
super(clone);
}
@Override
public double getProgress(Player player) {
return player.getLevel();
}
@Override
public Requirement clone() {
return new XpLevelRequirement(this);
}
package sh.okx.rankup.requirements.requirement;
import org.bukkit.entity.Player;
import sh.okx.rankup.RankupPlugin;
import sh.okx.rankup.requirements.ProgressiveRequirement;
import sh.okx.rankup.requirements.Requirement;
public class XpLevelRequirement extends ProgressiveRequirement {
public XpLevelRequirement(RankupPlugin plugin, String name) {
super(plugin, name);
}
protected XpLevelRequirement(XpLevelRequirement clone) {
super(clone);
}
@Override
public double getProgress(Player player) {
return player.getLevel();
}
@Override
public Requirement clone() {
return new XpLevelRequirement(this);
}
}
@@ -1,38 +1,38 @@
package sh.okx.rankup.requirements.requirement.advancedachievements;
import com.hm.achievement.api.AdvancedAchievementsAPI;
import com.hm.achievement.api.AdvancedAchievementsAPIFetcher;
import org.bukkit.entity.Player;
import sh.okx.rankup.RankupPlugin;
import sh.okx.rankup.requirements.Requirement;
public class AdvancedAchievementsAchievementRequirement extends Requirement {
public AdvancedAchievementsAchievementRequirement(RankupPlugin plugin) {
super(plugin, "advancedachievements-achievement");
}
protected AdvancedAchievementsAchievementRequirement(Requirement clone) {
super(clone);
}
@Override
public boolean check(Player player) {
AdvancedAchievementsAPI api = AdvancedAchievementsAPIFetcher.fetchInstance().get();
return api.hasPlayerReceivedAchievement(player.getUniqueId(), getValueString());
}
@Override
public String getFullName() {
return super.getFullName() + "#" + getValueString();
}
@Override
public double getTotal(Player player) {
return 1;
}
@Override
public Requirement clone() {
return new AdvancedAchievementsAchievementRequirement(this);
}
}
package sh.okx.rankup.requirements.requirement.advancedachievements;
import com.hm.achievement.api.AdvancedAchievementsAPI;
import com.hm.achievement.api.AdvancedAchievementsAPIFetcher;
import org.bukkit.entity.Player;
import sh.okx.rankup.RankupPlugin;
import sh.okx.rankup.requirements.Requirement;
public class AdvancedAchievementsAchievementRequirement extends Requirement {
public AdvancedAchievementsAchievementRequirement(RankupPlugin plugin) {
super(plugin, "advancedachievements-achievement");
}
protected AdvancedAchievementsAchievementRequirement(Requirement clone) {
super(clone);
}
@Override
public boolean check(Player player) {
AdvancedAchievementsAPI api = AdvancedAchievementsAPIFetcher.fetchInstance().get();
return api.hasPlayerReceivedAchievement(player.getUniqueId(), getValueString());
}
@Override
public String getFullName() {
return super.getFullName() + "#" + getValueString();
}
@Override
public double getTotal(Player player) {
return 1;
}
@Override
public Requirement clone() {
return new AdvancedAchievementsAchievementRequirement(this);
}
}
@@ -1,27 +1,27 @@
package sh.okx.rankup.requirements.requirement.advancedachievements;
import com.hm.achievement.api.AdvancedAchievementsAPIFetcher;
import org.bukkit.entity.Player;
import sh.okx.rankup.RankupPlugin;
import sh.okx.rankup.requirements.Requirement;
import sh.okx.rankup.requirements.ProgressiveRequirement;
public class AdvancedAchievementsTotalRequirement extends ProgressiveRequirement {
public AdvancedAchievementsTotalRequirement(RankupPlugin plugin) {
super(plugin, "advancedachievements-total");
}
private AdvancedAchievementsTotalRequirement(Requirement clone) {
super(clone);
}
@Override
public double getProgress(Player player) {
return AdvancedAchievementsAPIFetcher.fetchInstance().get().getPlayerTotalAchievements(player.getUniqueId());
}
@Override
public Requirement clone() {
return new AdvancedAchievementsTotalRequirement(this);
}
}
package sh.okx.rankup.requirements.requirement.advancedachievements;
import com.hm.achievement.api.AdvancedAchievementsAPIFetcher;
import org.bukkit.entity.Player;
import sh.okx.rankup.RankupPlugin;
import sh.okx.rankup.requirements.Requirement;
import sh.okx.rankup.requirements.ProgressiveRequirement;
public class AdvancedAchievementsTotalRequirement extends ProgressiveRequirement {
public AdvancedAchievementsTotalRequirement(RankupPlugin plugin) {
super(plugin, "advancedachievements-total");
}
private AdvancedAchievementsTotalRequirement(Requirement clone) {
super(clone);
}
@Override
public double getProgress(Player player) {
return AdvancedAchievementsAPIFetcher.fetchInstance().get().getPlayerTotalAchievements(player.getUniqueId());
}
@Override
public Requirement clone() {
return new AdvancedAchievementsTotalRequirement(this);
}
}
@@ -1,27 +1,27 @@
package sh.okx.rankup.requirements.requirement.mcmmo;
import com.gmail.nossr50.util.player.UserManager;
import org.bukkit.entity.Player;
import sh.okx.rankup.RankupPlugin;
import sh.okx.rankup.requirements.Requirement;
import sh.okx.rankup.requirements.ProgressiveRequirement;
public class McMMOPowerLevelRequirement extends ProgressiveRequirement {
public McMMOPowerLevelRequirement(RankupPlugin plugin) {
super(plugin, "mcmmo-power-level");
}
protected McMMOPowerLevelRequirement(Requirement clone) {
super(clone);
}
@Override
public double getProgress(Player player) {
return UserManager.getPlayer(player).getPowerLevel();
}
@Override
public Requirement clone() {
return new McMMOPowerLevelRequirement(this);
}
}
package sh.okx.rankup.requirements.requirement.mcmmo;
import com.gmail.nossr50.util.player.UserManager;
import org.bukkit.entity.Player;
import sh.okx.rankup.RankupPlugin;
import sh.okx.rankup.requirements.Requirement;
import sh.okx.rankup.requirements.ProgressiveRequirement;
public class McMMOPowerLevelRequirement extends ProgressiveRequirement {
public McMMOPowerLevelRequirement(RankupPlugin plugin) {
super(plugin, "mcmmo-power-level");
}
protected McMMOPowerLevelRequirement(Requirement clone) {
super(clone);
}
@Override
public double getProgress(Player player) {
return UserManager.getPlayer(player).getPowerLevel();
}
@Override
public Requirement clone() {
return new McMMOPowerLevelRequirement(this);
}
}
@@ -1,26 +1,26 @@
package sh.okx.rankup.requirements.requirement.mcmmo;
import org.bukkit.entity.Player;
import sh.okx.rankup.RankupPlugin;
import sh.okx.rankup.requirements.Requirement;
import sh.okx.rankup.requirements.ProgressiveRequirement;
public class McMMOSkillRequirement extends ProgressiveRequirement {
public McMMOSkillRequirement(RankupPlugin plugin) {
super(plugin, "mcmmo", true);
}
protected McMMOSkillRequirement(McMMOSkillRequirement clone) {
super(clone);
}
@Override
public double getProgress(Player player) {
return McMMOSkillUtil.getInstance().getSkillLevel(player, getSub());
}
@Override
public Requirement clone() {
return new McMMOSkillRequirement(this);
}
}
package sh.okx.rankup.requirements.requirement.mcmmo;
import org.bukkit.entity.Player;
import sh.okx.rankup.RankupPlugin;
import sh.okx.rankup.requirements.Requirement;
import sh.okx.rankup.requirements.ProgressiveRequirement;
public class McMMOSkillRequirement extends ProgressiveRequirement {
public McMMOSkillRequirement(RankupPlugin plugin) {
super(plugin, "mcmmo", true);
}
protected McMMOSkillRequirement(McMMOSkillRequirement clone) {
super(clone);
}
@Override
public double getProgress(Player player) {
return McMMOSkillUtil.getInstance().getSkillLevel(player, getSub());
}
@Override
public Requirement clone() {
return new McMMOSkillRequirement(this);
}
}
@@ -1,91 +1,91 @@
package sh.okx.rankup.requirements.requirement.mcmmo;
import com.gmail.nossr50.datatypes.player.McMMOPlayer;
import com.gmail.nossr50.util.player.UserManager;
import org.bukkit.entity.Player;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
/**
* Because mcMMO like changing the name of their skill types.
* Singleton class to access different mcMMO versions.
*/
public class McMMOSkillUtil {
private static McMMOSkillUtil instance;
private Class<?> skillTypeClass;
private Method values;
private Method valueOf;
//private Class<?> userManagerClass;
private Method getSkillLevel;
private McMMOSkillUtil() {
final String pckg = "com.gmail.nossr50.datatypes.skills.";
try {
skillTypeClass = Class.forName(pckg + "PrimarySkillType");
} catch (ClassNotFoundException e0) {
try {
skillTypeClass = Class.forName(pckg + "PrimarySkill");
} catch (ClassNotFoundException e1) {
try {
skillTypeClass = Class.forName(pckg + "SkillType");
} catch (ClassNotFoundException e2) {
throw new UnsupportedOperationException("mcMMO Skill Type class not found");
}
}
}
try {
values = skillTypeClass.getMethod("values");
} catch (NoSuchMethodException e) {
throw new UnsupportedOperationException("mcMMO " + skillTypeClass + ".values() not found");
}
try {
valueOf = skillTypeClass.getMethod("valueOf", String.class);
} catch (NoSuchMethodException e) {
throw new UnsupportedOperationException("mcMMO" + skillTypeClass + ".valueOf(String) not found");
}
/*try {
userManagerClass = Class.forName("com.gmail.nossr50.util.player.UserManager");
} catch (ClassNotFoundException e) {
throw new RuntimeException("mcMMO UserManager class not found");
}*/
try {
getSkillLevel = McMMOPlayer.class.getMethod("getSkillLevel", skillTypeClass);
} catch (NoSuchMethodException e) {
throw new UnsupportedOperationException("mcMMO UserManager.getSkillLevel(" + skillTypeClass + ") not found");
}
}
public static McMMOSkillUtil getInstance() {
if (instance == null) {
instance = new McMMOSkillUtil();
}
return instance;
}
/*public String[] getSkills() {
try {
Enum<?>[] skills = (Enum<?>[]) values.invoke(null);
String[] stringSkills = new String[skills.length];
for (int i = 0; i < skills.length; i++) {
stringSkills[i] = skills[i].name();
}
return stringSkills;
} catch (IllegalAccessException | InvocationTargetException e) {
throw new RuntimeException(e);
}
}*/
public int getSkillLevel(Player player, String skill) {
McMMOPlayer mcMMOPlayer = UserManager.getPlayer(player);
try {
Object skillType = skillTypeClass.cast(valueOf.invoke(null, skill.toUpperCase()));
return (int) getSkillLevel.invoke(mcMMOPlayer, skillType);
} catch (IllegalAccessException | InvocationTargetException e) {
throw new RuntimeException(e);
}
}
}
package sh.okx.rankup.requirements.requirement.mcmmo;
import com.gmail.nossr50.datatypes.player.McMMOPlayer;
import com.gmail.nossr50.util.player.UserManager;
import org.bukkit.entity.Player;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
/**
* Because mcMMO like changing the name of their skill types.
* Singleton class to access different mcMMO versions.
*/
public class McMMOSkillUtil {
private static McMMOSkillUtil instance;
private Class<?> skillTypeClass;
private Method values;
private Method valueOf;
//private Class<?> userManagerClass;
private Method getSkillLevel;
private McMMOSkillUtil() {
final String pckg = "com.gmail.nossr50.datatypes.skills.";
try {
skillTypeClass = Class.forName(pckg + "PrimarySkillType");
} catch (ClassNotFoundException e0) {
try {
skillTypeClass = Class.forName(pckg + "PrimarySkill");
} catch (ClassNotFoundException e1) {
try {
skillTypeClass = Class.forName(pckg + "SkillType");
} catch (ClassNotFoundException e2) {
throw new UnsupportedOperationException("mcMMO Skill Type class not found");
}
}
}
try {
values = skillTypeClass.getMethod("values");
} catch (NoSuchMethodException e) {
throw new UnsupportedOperationException("mcMMO " + skillTypeClass + ".values() not found");
}
try {
valueOf = skillTypeClass.getMethod("valueOf", String.class);
} catch (NoSuchMethodException e) {
throw new UnsupportedOperationException("mcMMO" + skillTypeClass + ".valueOf(String) not found");
}
/*try {
userManagerClass = Class.forName("com.gmail.nossr50.util.player.UserManager");
} catch (ClassNotFoundException e) {
throw new RuntimeException("mcMMO UserManager class not found");
}*/
try {
getSkillLevel = McMMOPlayer.class.getMethod("getSkillLevel", skillTypeClass);
} catch (NoSuchMethodException e) {
throw new UnsupportedOperationException("mcMMO UserManager.getSkillLevel(" + skillTypeClass + ") not found");
}
}
public static McMMOSkillUtil getInstance() {
if (instance == null) {
instance = new McMMOSkillUtil();
}
return instance;
}
/*public String[] getSkills() {
try {
Enum<?>[] skills = (Enum<?>[]) values.invoke(null);
String[] stringSkills = new String[skills.length];
for (int i = 0; i < skills.length; i++) {
stringSkills[i] = skills[i].name();
}
return stringSkills;
} catch (IllegalAccessException | InvocationTargetException e) {
throw new RuntimeException(e);
}
}*/
public int getSkillLevel(Player player, String skill) {
McMMOPlayer mcMMOPlayer = UserManager.getPlayer(player);
try {
Object skillType = skillTypeClass.cast(valueOf.invoke(null, skill.toUpperCase()));
return (int) getSkillLevel.invoke(mcMMOPlayer, skillType);
} catch (IllegalAccessException | InvocationTargetException e) {
throw new RuntimeException(e);
}
}
}
@@ -1,30 +1,30 @@
package sh.okx.rankup.requirements.requirement.tokenmanager;
import java.util.Objects;
import me.realized.tokenmanager.api.TokenManager;
import org.bukkit.Bukkit;
import org.bukkit.entity.Player;
import sh.okx.rankup.RankupPlugin;
import sh.okx.rankup.requirements.ProgressiveRequirement;
public class TokensRequirement extends ProgressiveRequirement {
protected final TokenManager manager = (TokenManager) Objects.requireNonNull(Bukkit.getPluginManager().getPlugin("TokenManager"));
public TokensRequirement(RankupPlugin plugin, String name) {
super(plugin, name);
}
protected TokensRequirement(TokensRequirement clone) {
super(clone);
}
@Override
public double getProgress(Player player) {
return manager.getTokens(player).orElse(0);
}
@Override
public TokensRequirement clone() {
return new TokensRequirement(this);
}
}
package sh.okx.rankup.requirements.requirement.tokenmanager;
import java.util.Objects;
import me.realized.tokenmanager.api.TokenManager;
import org.bukkit.Bukkit;
import org.bukkit.entity.Player;
import sh.okx.rankup.RankupPlugin;
import sh.okx.rankup.requirements.ProgressiveRequirement;
public class TokensRequirement extends ProgressiveRequirement {
protected final TokenManager manager = (TokenManager) Objects.requireNonNull(Bukkit.getPluginManager().getPlugin("TokenManager"));
public TokensRequirement(RankupPlugin plugin, String name) {
super(plugin, name);
}
protected TokensRequirement(TokensRequirement clone) {
super(clone);
}
@Override
public double getProgress(Player player) {
return manager.getTokens(player).orElse(0);
}
@Override
public TokensRequirement clone() {
return new TokensRequirement(this);
}
}
@@ -1,30 +1,30 @@
package sh.okx.rankup.requirements.requirement.towny;
import org.bukkit.entity.Player;
import sh.okx.rankup.RankupPlugin;
import sh.okx.rankup.requirements.ProgressiveRequirement;
import sh.okx.rankup.requirements.Requirement;
public class TownyKingNumberResidentsRequirement extends ProgressiveRequirement {
public TownyKingNumberResidentsRequirement(RankupPlugin plugin) {
super(plugin, "towny-king-residents");
}
protected TownyKingNumberResidentsRequirement(Requirement clone) {
super(clone);
}
@Override
public double getProgress(Player player) {
if (TownyUtils.getInstance().isKing(player)) {
return TownyUtils.getInstance().getNation(player).getNumResidents();
} else {
return 0;
}
}
@Override
public Requirement clone() {
return new TownyKingNumberResidentsRequirement(this);
}
}
package sh.okx.rankup.requirements.requirement.towny;
import org.bukkit.entity.Player;
import sh.okx.rankup.RankupPlugin;
import sh.okx.rankup.requirements.ProgressiveRequirement;
import sh.okx.rankup.requirements.Requirement;
public class TownyKingNumberResidentsRequirement extends ProgressiveRequirement {
public TownyKingNumberResidentsRequirement(RankupPlugin plugin) {
super(plugin, "towny-king-residents");
}
protected TownyKingNumberResidentsRequirement(Requirement clone) {
super(clone);
}
@Override
public double getProgress(Player player) {
if (TownyUtils.getInstance().isKing(player)) {
return TownyUtils.getInstance().getNation(player).getNumResidents();
} else {
return 0;
}
}
@Override
public Requirement clone() {
return new TownyKingNumberResidentsRequirement(this);
}
}
@@ -1,30 +1,30 @@
package sh.okx.rankup.requirements.requirement.towny;
import org.bukkit.entity.Player;
import sh.okx.rankup.RankupPlugin;
import sh.okx.rankup.requirements.ProgressiveRequirement;
import sh.okx.rankup.requirements.Requirement;
public class TownyKingNumberTownsRequirement extends ProgressiveRequirement {
public TownyKingNumberTownsRequirement(RankupPlugin plugin) {
super(plugin, "towny-king-towns");
}
protected TownyKingNumberTownsRequirement(TownyKingNumberTownsRequirement clone) {
super(clone);
}
@Override
public double getProgress(Player player) {
if (TownyUtils.getInstance().isKing(player)) {
return TownyUtils.getInstance().getNation(player).getNumTowns();
} else {
return 0;
}
}
@Override
public Requirement clone() {
return new TownyKingNumberTownsRequirement(this);
}
}
package sh.okx.rankup.requirements.requirement.towny;
import org.bukkit.entity.Player;
import sh.okx.rankup.RankupPlugin;
import sh.okx.rankup.requirements.ProgressiveRequirement;
import sh.okx.rankup.requirements.Requirement;
public class TownyKingNumberTownsRequirement extends ProgressiveRequirement {
public TownyKingNumberTownsRequirement(RankupPlugin plugin) {
super(plugin, "towny-king-towns");
}
protected TownyKingNumberTownsRequirement(TownyKingNumberTownsRequirement clone) {
super(clone);
}
@Override
public double getProgress(Player player) {
if (TownyUtils.getInstance().isKing(player)) {
return TownyUtils.getInstance().getNation(player).getNumTowns();
} else {
return 0;
}
}
@Override
public Requirement clone() {
return new TownyKingNumberTownsRequirement(this);
}
}
@@ -1,25 +1,25 @@
package sh.okx.rankup.requirements.requirement.towny;
import org.bukkit.entity.Player;
import sh.okx.rankup.RankupPlugin;
import sh.okx.rankup.requirements.Requirement;
public class TownyKingRequirement extends Requirement {
public TownyKingRequirement(RankupPlugin plugin) {
super(plugin, "towny-king");
}
protected TownyKingRequirement(Requirement clone) {
super(clone);
}
@Override
public boolean check(Player player) {
return TownyUtils.getInstance().isKing(player) == getValueBoolean();
}
@Override
public Requirement clone() {
return new TownyKingRequirement(this);
}
}
package sh.okx.rankup.requirements.requirement.towny;
import org.bukkit.entity.Player;
import sh.okx.rankup.RankupPlugin;
import sh.okx.rankup.requirements.Requirement;
public class TownyKingRequirement extends Requirement {
public TownyKingRequirement(RankupPlugin plugin) {
super(plugin, "towny-king");
}
protected TownyKingRequirement(Requirement clone) {
super(clone);
}
@Override
public boolean check(Player player) {
return TownyUtils.getInstance().isKing(player) == getValueBoolean();
}
@Override
public Requirement clone() {
return new TownyKingRequirement(this);
}
}
@@ -1,30 +1,30 @@
package sh.okx.rankup.requirements.requirement.towny;
import org.bukkit.entity.Player;
import sh.okx.rankup.RankupPlugin;
import sh.okx.rankup.requirements.ProgressiveRequirement;
import sh.okx.rankup.requirements.Requirement;
public class TownyMayorNumberResidentsRequirement extends ProgressiveRequirement {
public TownyMayorNumberResidentsRequirement(RankupPlugin plugin) {
super(plugin, "towny-mayor-residents");
}
protected TownyMayorNumberResidentsRequirement(Requirement clone) {
super(clone);
}
@Override
public double getProgress(Player player) {
if (TownyUtils.getInstance().isMayor(player)) {
return TownyUtils.getInstance().getTown(player).getNumResidents();
} else {
return 0;
}
}
@Override
public Requirement clone() {
return new TownyMayorNumberResidentsRequirement(this);
}
}
package sh.okx.rankup.requirements.requirement.towny;
import org.bukkit.entity.Player;
import sh.okx.rankup.RankupPlugin;
import sh.okx.rankup.requirements.ProgressiveRequirement;
import sh.okx.rankup.requirements.Requirement;
public class TownyMayorNumberResidentsRequirement extends ProgressiveRequirement {
public TownyMayorNumberResidentsRequirement(RankupPlugin plugin) {
super(plugin, "towny-mayor-residents");
}
protected TownyMayorNumberResidentsRequirement(Requirement clone) {
super(clone);
}
@Override
public double getProgress(Player player) {
if (TownyUtils.getInstance().isMayor(player)) {
return TownyUtils.getInstance().getTown(player).getNumResidents();
} else {
return 0;
}
}
@Override
public Requirement clone() {
return new TownyMayorNumberResidentsRequirement(this);
}
}
@@ -1,25 +1,25 @@
package sh.okx.rankup.requirements.requirement.towny;
import org.bukkit.entity.Player;
import sh.okx.rankup.RankupPlugin;
import sh.okx.rankup.requirements.Requirement;
public class TownyMayorRequirement extends Requirement {
public TownyMayorRequirement(RankupPlugin plugin) {
super(plugin, "towny-mayor");
}
protected TownyMayorRequirement(Requirement clone) {
super(clone);
}
@Override
public boolean check(Player player) {
return TownyUtils.getInstance().isMayor(player) == getValueBoolean();
}
@Override
public Requirement clone() {
return new TownyMayorRequirement(this);
}
}
package sh.okx.rankup.requirements.requirement.towny;
import org.bukkit.entity.Player;
import sh.okx.rankup.RankupPlugin;
import sh.okx.rankup.requirements.Requirement;
public class TownyMayorRequirement extends Requirement {
public TownyMayorRequirement(RankupPlugin plugin) {
super(plugin, "towny-mayor");
}
protected TownyMayorRequirement(Requirement clone) {
super(clone);
}
@Override
public boolean check(Player player) {
return TownyUtils.getInstance().isMayor(player) == getValueBoolean();
}
@Override
public Requirement clone() {
return new TownyMayorRequirement(this);
}
}
@@ -1,25 +1,25 @@
package sh.okx.rankup.requirements.requirement.towny;
import org.bukkit.entity.Player;
import sh.okx.rankup.RankupPlugin;
import sh.okx.rankup.requirements.Requirement;
public class TownyResidentRequirement extends Requirement {
public TownyResidentRequirement(RankupPlugin plugin) {
super(plugin, "towny-resident");
}
protected TownyResidentRequirement(Requirement clone) {
super(clone);
}
@Override
public boolean check(Player player) {
return TownyUtils.getInstance().isResident(player) == getValueBoolean();
}
@Override
public Requirement clone() {
return new TownyResidentRequirement(this);
}
}
package sh.okx.rankup.requirements.requirement.towny;
import org.bukkit.entity.Player;
import sh.okx.rankup.RankupPlugin;
import sh.okx.rankup.requirements.Requirement;
public class TownyResidentRequirement extends Requirement {
public TownyResidentRequirement(RankupPlugin plugin) {
super(plugin, "towny-resident");
}
protected TownyResidentRequirement(Requirement clone) {
super(clone);
}
@Override
public boolean check(Player player) {
return TownyUtils.getInstance().isResident(player) == getValueBoolean();
}
@Override
public Requirement clone() {
return new TownyResidentRequirement(this);
}
}
@@ -1,71 +1,71 @@
package sh.okx.rankup.requirements.requirement.towny;
import com.palmergames.bukkit.towny.exceptions.NotRegisteredException;
import com.palmergames.bukkit.towny.object.Nation;
import com.palmergames.bukkit.towny.object.Resident;
import com.palmergames.bukkit.towny.object.Town;
import com.palmergames.bukkit.towny.object.TownyUniverse;
import org.bukkit.entity.Player;
public class TownyUtils {
private static TownyUtils instance;
public static TownyUtils getInstance() {
if (instance == null) {
instance = new TownyUtils();
}
return instance;
}
public boolean isResident(Player player) {
try {
Town town = TownyUniverse.getDataSource().getResident(player.getName()).getTown();
return town != null;
} catch (NotRegisteredException e) {
return false;
}
}
public Resident getResident(Player player) {
try {
return TownyUniverse.getDataSource().getResident(player.getName());
} catch (NotRegisteredException e) {
return null;
}
}
public Town getTown(Player player) {
try {
return TownyUniverse.getDataSource().getResident(player.getName()).getTown();
} catch (NotRegisteredException e) {
return null;
}
}
public Nation getNation(Player player) {
Town town = getTown(player);
try {
return getTown(player) == null ? null : town.getNation();
} catch (NotRegisteredException e) {
return null;
}
}
public boolean isMayor(Player player) {
try {
return TownyUniverse.getDataSource().getResident(player.getName()).isMayor();
} catch (NotRegisteredException e) {
return false;
}
}
public boolean isKing(Player player) {
try {
return TownyUniverse.getDataSource().getResident(player.getName()).isKing();
} catch (NotRegisteredException e) {
return false;
}
}
}
package sh.okx.rankup.requirements.requirement.towny;
import com.palmergames.bukkit.towny.exceptions.NotRegisteredException;
import com.palmergames.bukkit.towny.object.Nation;
import com.palmergames.bukkit.towny.object.Resident;
import com.palmergames.bukkit.towny.object.Town;
import com.palmergames.bukkit.towny.object.TownyUniverse;
import org.bukkit.entity.Player;
public class TownyUtils {
private static TownyUtils instance;
public static TownyUtils getInstance() {
if (instance == null) {
instance = new TownyUtils();
}
return instance;
}
public boolean isResident(Player player) {
try {
Town town = TownyUniverse.getDataSource().getResident(player.getName()).getTown();
return town != null;
} catch (NotRegisteredException e) {
return false;
}
}
public Resident getResident(Player player) {
try {
return TownyUniverse.getDataSource().getResident(player.getName());
} catch (NotRegisteredException e) {
return null;
}
}
public Town getTown(Player player) {
try {
return TownyUniverse.getDataSource().getResident(player.getName()).getTown();
} catch (NotRegisteredException e) {
return null;
}
}
public Nation getNation(Player player) {
Town town = getTown(player);
try {
return getTown(player) == null ? null : town.getNation();
} catch (NotRegisteredException e) {
return null;
}
}
public boolean isMayor(Player player) {
try {
return TownyUniverse.getDataSource().getResident(player.getName()).isMayor();
} catch (NotRegisteredException e) {
return false;
}
}
public boolean isKing(Player player) {
try {
return TownyUniverse.getDataSource().getResident(player.getName()).isKing();
} catch (NotRegisteredException e) {
return false;
}
}
}
@@ -1,27 +1,27 @@
package sh.okx.rankup.requirements.requirement.votingplugin;
import com.Ben12345rocks.VotingPlugin.UserManager.UserManager;
import org.bukkit.entity.Player;
import sh.okx.rankup.RankupPlugin;
import sh.okx.rankup.requirements.Requirement;
import sh.okx.rankup.requirements.ProgressiveRequirement;
public class VotingPluginVotesRequirement extends ProgressiveRequirement {
public VotingPluginVotesRequirement(RankupPlugin plugin) {
super(plugin, "votingplugin-votes");
}
protected VotingPluginVotesRequirement(Requirement clone) {
super(clone);
}
@Override
public double getProgress(Player player) {
return UserManager.getInstance().getVotingPluginUser(player).getPoints();
}
@Override
public Requirement clone() {
return new VotingPluginVotesRequirement(this);
}
}
package sh.okx.rankup.requirements.requirement.votingplugin;
import com.Ben12345rocks.VotingPlugin.UserManager.UserManager;
import org.bukkit.entity.Player;
import sh.okx.rankup.RankupPlugin;
import sh.okx.rankup.requirements.Requirement;
import sh.okx.rankup.requirements.ProgressiveRequirement;
public class VotingPluginVotesRequirement extends ProgressiveRequirement {
public VotingPluginVotesRequirement(RankupPlugin plugin) {
super(plugin, "votingplugin-votes");
}
protected VotingPluginVotesRequirement(Requirement clone) {
super(clone);
}
@Override
public double getProgress(Player player) {
return UserManager.getInstance().getVotingPluginUser(player).getPoints();
}
@Override
public Requirement clone() {
return new VotingPluginVotesRequirement(this);
}
}
+29 -29
View File
@@ -1,29 +1,29 @@
package sh.okx.rankup.util;
import org.bukkit.Material;
public class ItemUtil {
private static boolean flattened;
static {
try {
Material.valueOf("BLACK_STAINED_GLASS_PANE");
flattened = true;
} catch (IllegalArgumentException e) {
flattened = false;
}
}
/**
* Determines if a server is post-flattening or pre-flattening.
* The flattening is the name for the event where, instead of using durability to represent
* similar items, Mojang decided to use distinct item types for each item.
* This caused many {@link Material} names to change, making some things incompatible.
* The flattening happened in 1.13.
*
* @return true if the server is post-flattening (server versions 1.13, 1.14, 1.15) or false if it is pre-flattening (1.12, 1.11, 1.10 etc)
*/
public static boolean isServerFlattened() {
return flattened;
}
}
package sh.okx.rankup.util;
import org.bukkit.Material;
public class ItemUtil {
private static boolean flattened;
static {
try {
Material.valueOf("BLACK_STAINED_GLASS_PANE");
flattened = true;
} catch (IllegalArgumentException e) {
flattened = false;
}
}
/**
* Determines if a server is post-flattening or pre-flattening.
* The flattening is the name for the event where, instead of using durability to represent
* similar items, Mojang decided to use distinct item types for each item.
* This caused many {@link Material} names to change, making some things incompatible.
* The flattening happened in 1.13.
*
* @return true if the server is post-flattening (server versions 1.13, 1.14, 1.15) or false if it is pre-flattening (1.12, 1.11, 1.10 etc)
*/
public static boolean isServerFlattened() {
return flattened;
}
}
@@ -1,57 +1,57 @@
package sh.okx.rankup.util;
import org.bukkit.ChatColor;
import org.bukkit.command.CommandSender;
import sh.okx.rankup.util.VersionChecker.VersionCheckerCallback;
public class UpdateNotifier {
private final String prefix;
private final VersionChecker checker;
public UpdateNotifier(VersionChecker checker) {
this.prefix = ChatColor.GREEN + "" + ChatColor.BOLD + checker.getPlugin().getName() + ChatColor.RESET + " ";
this.checker = checker;
}
public void notify(CommandSender sender, boolean join) {
if (!checker.hasChecked() && !join) {
send(sender, false, ChatColor.YELLOW + "Checking version...");
}
checker.checkVersion(new VersionCheckerCallback() {
@Override
public void onLatestVersion(String version) {
if (!join) {
send(sender, false, ChatColor.GREEN + "You are on the latest version.");
}
}
@Override
public void onOutdatedVersion(String currentVersion, String latestVersion) {
send(sender, join, ChatColor.YELLOW + "A new version is available: " + ChatColor.GOLD + latestVersion
+ ChatColor.YELLOW + ". You are on: " + ChatColor.GOLD + currentVersion
+ ChatColor.GOLD + "\nhttps://www.spigotmc.org/resources/" + VersionChecker.RESOURCE_ID + "/");
}
@Override
public void onPreReleaseVersion(String version) {
send(sender, join, ChatColor.RED + "You are on a pre-release version.");
}
@Override
public void onFailure() {
if (!join) {
send(sender, false, ChatColor.RED + "Error while checking version.");
}
}
});
}
private void send(CommandSender sender, boolean prefix, String message) {
if (prefix) {
sender.sendMessage(this.prefix + message);
} else {
sender.sendMessage(message);
}
}
}
package sh.okx.rankup.util;
import org.bukkit.ChatColor;
import org.bukkit.command.CommandSender;
import sh.okx.rankup.util.VersionChecker.VersionCheckerCallback;
public class UpdateNotifier {
private final String prefix;
private final VersionChecker checker;
public UpdateNotifier(VersionChecker checker) {
this.prefix = ChatColor.GREEN + "" + ChatColor.BOLD + checker.getPlugin().getName() + ChatColor.RESET + " ";
this.checker = checker;
}
public void notify(CommandSender sender, boolean join) {
if (!checker.hasChecked() && !join) {
send(sender, false, ChatColor.YELLOW + "Checking version...");
}
checker.checkVersion(new VersionCheckerCallback() {
@Override
public void onLatestVersion(String version) {
if (!join) {
send(sender, false, ChatColor.GREEN + "You are on the latest version.");
}
}
@Override
public void onOutdatedVersion(String currentVersion, String latestVersion) {
send(sender, join, ChatColor.YELLOW + "A new version is available: " + ChatColor.GOLD + latestVersion
+ ChatColor.YELLOW + ". You are on: " + ChatColor.GOLD + currentVersion
+ ChatColor.GOLD + "\nhttps://www.spigotmc.org/resources/" + VersionChecker.RESOURCE_ID + "/");
}
@Override
public void onPreReleaseVersion(String version) {
send(sender, join, ChatColor.RED + "You are on a pre-release version.");
}
@Override
public void onFailure() {
if (!join) {
send(sender, false, ChatColor.RED + "Error while checking version.");
}
}
});
}
private void send(CommandSender sender, boolean prefix, String message) {
if (prefix) {
sender.sendMessage(this.prefix + message);
} else {
sender.sendMessage(message);
}
}
}
@@ -1,150 +1,150 @@
package sh.okx.rankup.util;
import com.google.common.base.Charsets;
import com.google.common.io.CharStreams;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.URL;
import org.bukkit.Bukkit;
import org.bukkit.plugin.Plugin;
public class VersionChecker {
public static final int RESOURCE_ID = 76964;
private final Plugin plugin;
private final String currentVersion;
private String latestVersion;
private boolean checked = false;
public VersionChecker(Plugin plugin) {
this.currentVersion = plugin.getDescription().getVersion();
this.plugin = plugin;
}
public Plugin getPlugin() {
return plugin;
}
/**
* Checks if the version checker has already made an asynchronous call to the web server to check
* the version, so future checks will run instantly.
*
* @return true if the version checker already knows the latest version, false otherwise
*/
public boolean hasChecked() {
return checked;
}
public void checkVersion(VersionCheckerCallback callback) {
if (latestVersion != null) {
if (currentVersion.equals(latestVersion)) {
callback.onLatestVersion(currentVersion);
} else {
callback.onOutdatedVersion(currentVersion, latestVersion);
}
} else if (currentVersion.contains("alpha")
|| currentVersion.contains("beta")
|| currentVersion.contains("rc")) {
checked = true;
callback.onPreReleaseVersion(currentVersion);
} else {
Bukkit.getScheduler().runTaskAsynchronously(plugin, () -> checkVersionAsync(callback));
}
}
private void checkVersionAsync(VersionCheckerCallback callback) {
try {
latestVersion = getLatestVersion();
checked = true;
if (currentVersion.equals(latestVersion)) {
callback.onLatestVersion(currentVersion);
} else {
callback.onOutdatedVersion(currentVersion, latestVersion);
}
} catch (IOException e) {
callback.onFailure();
}
}
private String getLatestVersion() throws IOException {
URL url = new URL("https://api.spigotmc.org/legacy/update.php?resource=" + RESOURCE_ID);
return CharStreams.toString(new InputStreamReader(url.openStream(), Charsets.UTF_8));
}
/**
* A callback used when a version check runs
*/
public interface VersionCheckerCallback {
/**
* Called when the plugin is already on the latest version
* May be called asynchronously
*
* @param version the current, and latest, version of the plugin
*/
void onLatestVersion(String version);
/**
* Called when the plugin is on a version other than the latest on the SpigotMC plugin page.
* May be called asynchronously.
*
* @param currentVersion the current version of the plugin specified in plugin.yml
* @param latestVersion the latest version of the plugin specified on SpigotMC.
*/
void onOutdatedVersion(String currentVersion, String latestVersion);
/**
* Called when the plugin is on a pre-release version and is exempt to the usual update system.
*
* @param version the current version of the plugin
*/
void onPreReleaseVersion(String version);
/**
* Called when the version checker was unable to retrieve the latest version.
* May be called asynchronously.
*/
void onFailure();
}
/**
* An implementation of {@link VersionCheckerCallback} that is called asynchronously, and then
* forwards the calls an underlying VersionCheckerCallback synchronously on the main Bukkit
* thread.
*/
static class SyncVersionCheckerCallback implements VersionCheckerCallback {
private final Plugin plugin;
private final VersionCheckerCallback callback;
SyncVersionCheckerCallback(Plugin plugin, VersionCheckerCallback callback) {
this.plugin = plugin;
this.callback = callback;
}
@Override
public void onLatestVersion(String version) {
doSync(() -> callback.onLatestVersion(version));
}
@Override
public void onOutdatedVersion(String currentVersion, String latestVersion) {
doSync(() -> callback.onOutdatedVersion(currentVersion, latestVersion));
}
@Override
public void onPreReleaseVersion(String version) {
doSync(() -> callback.onPreReleaseVersion(version));
}
@Override
public void onFailure() {
doSync(callback::onFailure);
}
private void doSync(Runnable r) {
Bukkit.getScheduler().scheduleSyncDelayedTask(plugin, r);
}
}
}
package sh.okx.rankup.util;
import com.google.common.base.Charsets;
import com.google.common.io.CharStreams;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.URL;
import org.bukkit.Bukkit;
import org.bukkit.plugin.Plugin;
public class VersionChecker {
public static final int RESOURCE_ID = 76964;
private final Plugin plugin;
private final String currentVersion;
private String latestVersion;
private boolean checked = false;
public VersionChecker(Plugin plugin) {
this.currentVersion = plugin.getDescription().getVersion();
this.plugin = plugin;
}
public Plugin getPlugin() {
return plugin;
}
/**
* Checks if the version checker has already made an asynchronous call to the web server to check
* the version, so future checks will run instantly.
*
* @return true if the version checker already knows the latest version, false otherwise
*/
public boolean hasChecked() {
return checked;
}
public void checkVersion(VersionCheckerCallback callback) {
if (latestVersion != null) {
if (currentVersion.equals(latestVersion)) {
callback.onLatestVersion(currentVersion);
} else {
callback.onOutdatedVersion(currentVersion, latestVersion);
}
} else if (currentVersion.contains("alpha")
|| currentVersion.contains("beta")
|| currentVersion.contains("rc")) {
checked = true;
callback.onPreReleaseVersion(currentVersion);
} else {
Bukkit.getScheduler().runTaskAsynchronously(plugin, () -> checkVersionAsync(callback));
}
}
private void checkVersionAsync(VersionCheckerCallback callback) {
try {
latestVersion = getLatestVersion();
checked = true;
if (currentVersion.equals(latestVersion)) {
callback.onLatestVersion(currentVersion);
} else {
callback.onOutdatedVersion(currentVersion, latestVersion);
}
} catch (IOException e) {
callback.onFailure();
}
}
private String getLatestVersion() throws IOException {
URL url = new URL("https://api.spigotmc.org/legacy/update.php?resource=" + RESOURCE_ID);
return CharStreams.toString(new InputStreamReader(url.openStream(), Charsets.UTF_8));
}
/**
* A callback used when a version check runs
*/
public interface VersionCheckerCallback {
/**
* Called when the plugin is already on the latest version
* May be called asynchronously
*
* @param version the current, and latest, version of the plugin
*/
void onLatestVersion(String version);
/**
* Called when the plugin is on a version other than the latest on the SpigotMC plugin page.
* May be called asynchronously.
*
* @param currentVersion the current version of the plugin specified in plugin.yml
* @param latestVersion the latest version of the plugin specified on SpigotMC.
*/
void onOutdatedVersion(String currentVersion, String latestVersion);
/**
* Called when the plugin is on a pre-release version and is exempt to the usual update system.
*
* @param version the current version of the plugin
*/
void onPreReleaseVersion(String version);
/**
* Called when the version checker was unable to retrieve the latest version.
* May be called asynchronously.
*/
void onFailure();
}
/**
* An implementation of {@link VersionCheckerCallback} that is called asynchronously, and then
* forwards the calls an underlying VersionCheckerCallback synchronously on the main Bukkit
* thread.
*/
static class SyncVersionCheckerCallback implements VersionCheckerCallback {
private final Plugin plugin;
private final VersionCheckerCallback callback;
SyncVersionCheckerCallback(Plugin plugin, VersionCheckerCallback callback) {
this.plugin = plugin;
this.callback = callback;
}
@Override
public void onLatestVersion(String version) {
doSync(() -> callback.onLatestVersion(version));
}
@Override
public void onOutdatedVersion(String currentVersion, String latestVersion) {
doSync(() -> callback.onOutdatedVersion(currentVersion, latestVersion));
}
@Override
public void onPreReleaseVersion(String version) {
doSync(() -> callback.onPreReleaseVersion(version));
}
@Override
public void onFailure() {
doSync(callback::onFailure);
}
private void doSync(Runnable r) {
Bukkit.getScheduler().scheduleSyncDelayedTask(plugin, r);
}
}
}