Merge branch 'ranksgui'

# Conflicts:
#	build.gradle
This commit is contained in:
okx-code
2020-11-24 23:30:30 +00:00
16 changed files with 1206 additions and 929 deletions
+221 -221
View File
@@ -1,221 +1,221 @@
package sh.okx.rankup;
import org.bukkit.configuration.ConfigurationSection;
import org.bukkit.entity.Player;
import sh.okx.rankup.hook.GroupProvider;
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.RankElement;
import sh.okx.rankup.ranks.Rankups;
import java.util.HashMap;
import java.util.Map;
import java.util.Objects;
/**
* 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 GroupProvider permissions;
/**
* Players who cannot rankup/prestige for a certain amount of time.
*/
private final 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, RankElement<Rank> rank) {
rank.getRank().runCommands(player);
if (rank.getRank() != null) {
permissions.removeGroup(player.getUniqueId(), rank.getRank().getRank());
}
permissions.addGroup(player.getUniqueId(), rank.getNext().getRank().getRank());
}
public void sendRankupMessages(Player player, RankElement<Rank> rank) {
plugin.getMessage(rank.getRank(), Message.SUCCESS_PUBLIC)
.failIfEmpty()
.replaceRanks(player, rank.getRank(), rank.getNext().getRank())
.broadcast();
plugin.getMessage(rank.getRank(), Message.SUCCESS_PRIVATE)
.failIfEmpty()
.replaceRanks(player, rank.getRank(), rank.getNext().getRank())
.send(player);
}
public void doPrestige(Player player, RankElement<Prestige> prestige) {
Prestige rank = prestige.getRank();
rank.runCommands(player);
permissions.removeGroup(player.getUniqueId(), rank.getFrom());
permissions.addGroup(player.getUniqueId(), rank.getTo());
if (rank.getRank() != null) {
permissions.removeGroup(player.getUniqueId(), rank.getRank());
}
permissions.addGroup(player.getUniqueId(), prestige.getNext().getRank().getRank());
}
public void sendPrestigeMessages(Player player, RankElement<Prestige> prestige) {
Objects.requireNonNull(prestige);
Objects.requireNonNull(prestige.getNext());
plugin.getMessage(prestige.getRank(), Message.PRESTIGE_SUCCESS_PUBLIC)
.failIfEmpty()
.replaceRanks(player, prestige.getRank(), prestige.getNext().getRank())
.replaceFromTo(prestige.getRank())
.broadcast();
plugin.getMessage(prestige.getRank(), Message.PRESTIGE_SUCCESS_PRIVATE)
.failIfEmpty()
.replaceRanks(player, prestige.getRank(), prestige.getNext().getRank())
.replaceFromTo(prestige.getRank())
.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;
}
RankElement<Rank> rankElement = plugin.getRankups().getByPlayer(player);
Rank rank = rankElement.getRank();
rank.applyRequirements(player);
applyCooldown(player);
doRankup(player, rankElement);
sendRankupMessages(player, rankElement);
}
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();
RankElement<Rank> rankElement = rankups.getByPlayer(player);
if (rankElement == null) { // check if in ladder
plugin.getMessage(Message.NOT_IN_LADDER)
.failIf(!message)
.replace(Variable.PLAYER, player.getName())
.send(player);
return false;
}
Rank rank = rankElement.getRank();
if (!rankElement.hasNext()) {
Prestiges prestiges = plugin.getPrestiges();
plugin.getMessage(prestiges == null || !prestiges.getByPlayer(player).hasNext() ? Message.NO_RANKUP : Message.MUST_PRESTIGE)
.failIf(!message)
.replaceRanks(player, rankups.getTree().last().getRank().getRank())
.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, rankElement.getNext().getRank()), 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;
}
RankElement<Prestige> rankElement = plugin.getPrestiges().getByPlayer(player);
Prestige prestige = rankElement.getRank();
prestige.applyRequirements(player);
applyCooldown(player);
doPrestige(player, rankElement);
sendPrestigeMessages(player, rankElement);
}
public boolean checkPrestige(Player player) {
return checkPrestige(player, true);
}
public boolean checkPrestige(Player player, boolean message) {
Prestiges prestiges = plugin.getPrestiges();
RankElement<Prestige> prestigeElement = prestiges.getByPlayer(player);
if (prestigeElement == null || !prestigeElement.getRank().isEligible(player)) { // check if in ladder
plugin.getMessage(Message.NOT_HIGH_ENOUGH)
.failIf(!message)
.replace(Variable.PLAYER, player.getName())
.send(player);
return false;
} else if (!prestigeElement.hasNext()) { // check if they are at the highest rank
plugin.getMessage(prestigeElement.getRank(), Message.PRESTIGE_NO_PRESTIGE)
.failIf(!message)
.replaceRanks(player, prestigeElement.getRank().getRank())
.replaceFromTo(prestigeElement.getRank())
.send(player);
return false;
} else if (!prestigeElement.getRank().hasRequirements(player)) { // check if they can afford it
plugin.replaceMoneyRequirements(
plugin.getMessage(prestigeElement.getRank(), Message.PRESTIGE_REQUIREMENTS_NOT_MET)
.failIf(!message)
.replaceRanks(player, prestigeElement.getRank(), prestigeElement.getNext().getRank().getRank()), player, prestigeElement.getRank())
.replaceFromTo(prestigeElement.getRank())
.send(player);
return false;
} else if (checkCooldown(player, prestigeElement.getRank())) {
return false;
}
return true;
}
}
package sh.okx.rankup;
import java.util.HashMap;
import java.util.Map;
import java.util.Objects;
import org.bukkit.configuration.ConfigurationSection;
import org.bukkit.entity.Player;
import sh.okx.rankup.hook.GroupProvider;
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.RankElement;
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 GroupProvider permissions;
/**
* Players who cannot rankup/prestige for a certain amount of time.
*/
private final 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, RankElement<Rank> rank) {
if (rank.getRank() != null) {
permissions.removeGroup(player.getUniqueId(), rank.getRank().getRank());
}
permissions.addGroup(player.getUniqueId(), rank.getNext().getRank().getRank());
rank.getRank().runCommands(player);
}
public void sendRankupMessages(Player player, RankElement<Rank> rank) {
plugin.getMessage(rank.getRank(), Message.SUCCESS_PUBLIC)
.failIfEmpty()
.replaceRanks(player, rank.getRank(), rank.getNext().getRank())
.broadcast();
plugin.getMessage(rank.getRank(), Message.SUCCESS_PRIVATE)
.failIfEmpty()
.replaceRanks(player, rank.getRank(), rank.getNext().getRank())
.send(player);
}
public void doPrestige(Player player, RankElement<Prestige> prestige) {
Prestige rank = prestige.getRank();
permissions.removeGroup(player.getUniqueId(), rank.getFrom());
permissions.addGroup(player.getUniqueId(), rank.getTo());
if (rank.getRank() != null) {
permissions.removeGroup(player.getUniqueId(), rank.getRank());
}
permissions.addGroup(player.getUniqueId(), prestige.getNext().getRank().getRank());
rank.runCommands(player);
}
public void sendPrestigeMessages(Player player, RankElement<Prestige> prestige) {
Objects.requireNonNull(prestige);
Objects.requireNonNull(prestige.getNext());
plugin.getMessage(prestige.getRank(), Message.PRESTIGE_SUCCESS_PUBLIC)
.failIfEmpty()
.replaceRanks(player, prestige.getRank(), prestige.getNext().getRank())
.replaceFromTo(prestige.getRank())
.broadcast();
plugin.getMessage(prestige.getRank(), Message.PRESTIGE_SUCCESS_PRIVATE)
.failIfEmpty()
.replaceRanks(player, prestige.getRank(), prestige.getNext().getRank())
.replaceFromTo(prestige.getRank())
.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;
}
RankElement<Rank> rankElement = plugin.getRankups().getByPlayer(player);
Rank rank = rankElement.getRank();
rank.applyRequirements(player);
applyCooldown(player);
doRankup(player, rankElement);
sendRankupMessages(player, rankElement);
}
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();
RankElement<Rank> rankElement = rankups.getByPlayer(player);
if (rankElement == null) { // check if in ladder
plugin.getMessage(Message.NOT_IN_LADDER)
.failIf(!message)
.replace(Variable.PLAYER, player.getName())
.send(player);
return false;
}
Rank rank = rankElement.getRank();
if (!rankElement.hasNext()) {
Prestiges prestiges = plugin.getPrestiges();
plugin.getMessage(prestiges == null || !prestiges.getByPlayer(player).hasNext() ? Message.NO_RANKUP : Message.MUST_PRESTIGE)
.failIf(!message)
.replaceRanks(player, rankups.getTree().last().getRank().getRank())
.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, rankElement.getNext().getRank()), 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;
}
RankElement<Prestige> rankElement = plugin.getPrestiges().getByPlayer(player);
Prestige prestige = rankElement.getRank();
prestige.applyRequirements(player);
applyCooldown(player);
doPrestige(player, rankElement);
sendPrestigeMessages(player, rankElement);
}
public boolean checkPrestige(Player player) {
return checkPrestige(player, true);
}
public boolean checkPrestige(Player player, boolean message) {
Prestiges prestiges = plugin.getPrestiges();
RankElement<Prestige> prestigeElement = prestiges.getByPlayer(player);
if (prestigeElement == null || !prestigeElement.getRank().isEligible(player)) { // check if in ladder
plugin.getMessage(Message.NOT_HIGH_ENOUGH)
.failIf(!message)
.replace(Variable.PLAYER, player.getName())
.send(player);
return false;
} else if (!prestigeElement.hasNext()) { // check if they are at the highest rank
plugin.getMessage(prestigeElement.getRank(), Message.PRESTIGE_NO_PRESTIGE)
.failIf(!message)
.replaceRanks(player, prestigeElement.getRank().getRank())
.replaceFromTo(prestigeElement.getRank())
.send(player);
return false;
} else if (!prestigeElement.getRank().hasRequirements(player)) { // check if they can afford it
plugin.replaceMoneyRequirements(
plugin.getMessage(prestigeElement.getRank(), Message.PRESTIGE_REQUIREMENTS_NOT_MET)
.failIf(!message)
.replaceRanks(player, prestigeElement.getRank(), prestigeElement.getNext().getRank().getRank()), player, prestigeElement.getRank())
.replaceFromTo(prestigeElement.getRank())
.send(player);
return false;
} else if (checkCooldown(player, prestigeElement.getRank())) {
return false;
}
return true;
}
}
+49 -12
View File
@@ -1,5 +1,11 @@
package sh.okx.rankup;
import java.io.File;
import java.text.DecimalFormat;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.function.Supplier;
import lombok.Getter;
import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
@@ -14,7 +20,12 @@ import org.bukkit.plugin.PluginDescriptionFile;
import org.bukkit.plugin.PluginManager;
import org.bukkit.plugin.java.JavaPlugin;
import org.bukkit.plugin.java.JavaPluginLoader;
import sh.okx.rankup.commands.*;
import sh.okx.rankup.commands.InfoCommand;
import sh.okx.rankup.commands.MaxRankupCommand;
import sh.okx.rankup.commands.PrestigeCommand;
import sh.okx.rankup.commands.PrestigesCommand;
import sh.okx.rankup.commands.RanksCommand;
import sh.okx.rankup.commands.RankupCommand;
import sh.okx.rankup.economy.Economy;
import sh.okx.rankup.economy.EconomyProvider;
import sh.okx.rankup.economy.VaultEconomyProvider;
@@ -33,30 +44,46 @@ import sh.okx.rankup.prestige.Prestiges;
import sh.okx.rankup.ranks.Rank;
import sh.okx.rankup.ranks.RankList;
import sh.okx.rankup.ranks.Rankups;
import sh.okx.rankup.ranksgui.RanksGuiCommand;
import sh.okx.rankup.ranksgui.RanksGuiListener;
import sh.okx.rankup.requirements.Requirement;
import sh.okx.rankup.requirements.RequirementRegistry;
import sh.okx.rankup.requirements.requirement.AdvancementRequirement;
import sh.okx.rankup.requirements.requirement.BlockBreakRequirement;
import sh.okx.rankup.requirements.requirement.CraftItemRequirement;
import sh.okx.rankup.requirements.requirement.GroupRequirement;
import sh.okx.rankup.requirements.requirement.ItemDeductibleRequirement;
import sh.okx.rankup.requirements.requirement.ItemRequirement;
import sh.okx.rankup.requirements.requirement.MobKillsRequirement;
import sh.okx.rankup.requirements.requirement.MoneyDeductibleRequirement;
import sh.okx.rankup.requirements.requirement.MoneyRequirement;
import sh.okx.rankup.requirements.requirement.PermissionRequirement;
import sh.okx.rankup.requirements.requirement.PlaceholderRequirement;
import sh.okx.rankup.requirements.requirement.PlayerKillsRequirement;
import sh.okx.rankup.requirements.requirement.PlaytimeMinutesRequirement;
import sh.okx.rankup.requirements.requirement.TotalMobKillsRequirement;
import sh.okx.rankup.requirements.requirement.UseItemRequirement;
import sh.okx.rankup.requirements.requirement.WorldRequirement;
import sh.okx.rankup.requirements.requirement.XpLevelDeductibleRequirement;
import sh.okx.rankup.requirements.requirement.*;
import sh.okx.rankup.requirements.requirement.XpLevelRequirement;
import sh.okx.rankup.requirements.requirement.advancedachievements.AdvancedAchievementsAchievementRequirement;
import sh.okx.rankup.requirements.requirement.advancedachievements.AdvancedAchievementsTotalRequirement;
import sh.okx.rankup.requirements.requirement.mcmmo.McMMOPowerLevelRequirement;
import sh.okx.rankup.requirements.requirement.mcmmo.McMMOSkillRequirement;
import sh.okx.rankup.requirements.requirement.tokenmanager.TokensDeductibleRequirement;
import sh.okx.rankup.requirements.requirement.tokenmanager.TokensRequirement;
import sh.okx.rankup.requirements.requirement.towny.*;
import sh.okx.rankup.requirements.requirement.towny.TownyKingNumberResidentsRequirement;
import sh.okx.rankup.requirements.requirement.towny.TownyKingNumberTownsRequirement;
import sh.okx.rankup.requirements.requirement.towny.TownyKingRequirement;
import sh.okx.rankup.requirements.requirement.towny.TownyMayorNumberResidentsRequirement;
import sh.okx.rankup.requirements.requirement.towny.TownyMayorRequirement;
import sh.okx.rankup.requirements.requirement.towny.TownyResidentRequirement;
import sh.okx.rankup.requirements.requirement.votingplugin.VotingPluginPointsDeductibleRequirement;
import sh.okx.rankup.requirements.requirement.votingplugin.VotingPluginPointsRequirement;
import sh.okx.rankup.requirements.requirement.votingplugin.VotingPluginVotesRequirement;
import sh.okx.rankup.util.UpdateNotifier;
import sh.okx.rankup.util.VersionChecker;
import java.io.File;
import java.text.DecimalFormat;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.function.Supplier;
public class RankupPlugin extends JavaPlugin {
public static final int CONFIG_VERSION = 8;
@@ -124,7 +151,13 @@ public class RankupPlugin extends JavaPlugin {
}
if (config.getBoolean("ranks")) {
getCommand("ranks").setExecutor(new RanksCommand(this));
if (config.getBoolean("ranks-gui")) {
RanksGuiListener listener = new RanksGuiListener();
getCommand("ranks").setExecutor(new RanksGuiCommand(this, listener));
getServer().getPluginManager().registerEvents(listener, this);
} else {
getCommand("ranks").setExecutor(new RanksCommand(this));
}
}
if (config.getBoolean("prestige")) {
getCommand("prestige").setExecutor(new PrestigeCommand(this));
@@ -414,23 +447,27 @@ public class RankupPlugin extends JavaPlugin {
public MessageBuilder replaceMoneyRequirements(MessageBuilder builder, CommandSender sender,
Rank rank) {
if (builder instanceof NullMessageBuilder) {
if (builder instanceof NullMessageBuilder || rank == null) {
return builder;
}
Requirement money = rank.getRequirement(sender instanceof Player ? (Player) sender : null, "money");
if (money != null) {
Double amount = null;
Double total = null;
if (sender instanceof Player && rank.isIn((Player) sender)) {
if (economy != null) {
amount = money.getRemaining((Player) sender);
total = money.getTotal((Player) sender);
}
} else {
amount = money.getValueDouble();
total = 0D;
}
if (amount != null && economy != null) {
builder.replace(Variable.MONEY_NEEDED, formatMoney(amount));
builder.replace(Variable.MONEY, formatMoney(money.getValueDouble()));
builder.replace(Variable.MONEY_DONE, formatMoney(total));
}
}
if (sender instanceof Player) {
@@ -164,7 +164,6 @@ public class InfoCommand implements TabExecutor {
}
String[] placeholders = new String[] {
"prestige_money",
"prestige_money_formatted",
"prestige_percent_left_formatted",
"prestige_percent_done_formatted",
@@ -1,81 +1,81 @@
package sh.okx.rankup.commands;
import lombok.RequiredArgsConstructor;
import org.bukkit.ChatColor;
import org.bukkit.command.Command;
import org.bukkit.command.CommandExecutor;
import org.bukkit.command.CommandSender;
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 sh.okx.rankup.ranks.RankElement;
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();
if (!plugin.getHelper().checkPrestige(player)) {
return true;
}
RankElement<Prestige> rankElement = prestiges.getByPlayer(player);
Prestige prestige = rankElement.getRank();
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 = rankElement.getNext().getRank();
String nextRank = next == null ? prestiges.getTree().last().getRank().getRank() : next.getRank();
plugin.replaceMoneyRequirements(plugin.getMessage(prestige, Message.PRESTIGE_CONFIRMATION)
.replaceRanks(player, prestige, nextRank), player, prestige)
.replaceFromTo(prestige)
.send(player);
break;
case "gui":
Gui gui = Gui.of(player, prestige, rankElement.getNext().getRank(), plugin);
if (gui == null) {
player.sendMessage(ChatColor.RED + "GUI is not available. Check console for more informatiopn.");
return true;
}
gui.open(player);
break;
case "none":
plugin.getHelper().prestige(player);
break;
default:
throw new IllegalArgumentException("Invalid confirmation type " + confirmationType);
}
return true;
}
}
package sh.okx.rankup.commands;
import lombok.RequiredArgsConstructor;
import org.bukkit.ChatColor;
import org.bukkit.command.Command;
import org.bukkit.command.CommandExecutor;
import org.bukkit.command.CommandSender;
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 sh.okx.rankup.ranks.RankElement;
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();
if (!plugin.getHelper().checkPrestige(player)) {
return true;
}
RankElement<Prestige> rankElement = prestiges.getByPlayer(player);
Prestige prestige = rankElement.getRank();
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 = rankElement.getNext().getRank();
String nextRank = next == null ? prestiges.getTree().last().getRank().getRank() : next.getRank();
plugin.replaceMoneyRequirements(plugin.getMessage(prestige, Message.PRESTIGE_CONFIRMATION)
.replaceRanks(player, prestige, nextRank), player, prestige)
.replaceFromTo(prestige)
.send(player);
break;
case "gui":
Gui gui = Gui.of(player, prestige, rankElement.getNext().getRank(), plugin, false);
if (gui == null) {
player.sendMessage(ChatColor.RED + "GUI is not available. Check console for more informatiopn.");
return true;
}
gui.open(player);
break;
case "none":
plugin.getHelper().prestige(player);
break;
default:
throw new IllegalArgumentException("Invalid confirmation type " + confirmationType);
}
return true;
}
}
@@ -1,80 +1,81 @@
package sh.okx.rankup.commands;
import lombok.RequiredArgsConstructor;
import org.bukkit.ChatColor;
import org.bukkit.command.Command;
import org.bukkit.command.CommandExecutor;
import org.bukkit.command.CommandSender;
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.RankElement;
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();
if (!plugin.getHelper().checkRankup(player)) {
return true;
}
RankElement<Rank> rankElement = rankups.getByPlayer(player);
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(rankElement.getRank(), Message.CONFIRMATION)
.replaceRanks(player, rankElement.getRank(), rankElement.getNext().getRank()), player, rankElement.getRank())
.send(player);
break;
case "gui":
Gui gui = Gui.of(player, rankElement.getRank(), rankElement.getNext().getRank(), plugin);
if (gui == null) {
player.sendMessage(ChatColor.RED + "GUI is not available. Check console for more informatiopn.");
return true;
}
gui.open(player);
break;
case "none":
plugin.getHelper().rankup(player);
break;
default:
throw new IllegalArgumentException("Invalid confirmation type " + confirmationType);
}
return true;
}
}
package sh.okx.rankup.commands;
import lombok.RequiredArgsConstructor;
import org.bukkit.ChatColor;
import org.bukkit.command.Command;
import org.bukkit.command.CommandExecutor;
import org.bukkit.command.CommandSender;
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.RankElement;
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();
if (!plugin.getHelper().checkRankup(player)) {
return true;
}
RankElement<Rank> rankElement = rankups.getByPlayer(player);
FileConfiguration config = plugin.getConfig();
String confirmationType = config.getString("confirmation-type").toLowerCase();
// if they are on text confirming, rank them up
// clicking on the gui cannot confirm a rankup
if (confirmationType.equals("text") && confirming.containsKey(player) && !(args.length > 0 && args[0].equalsIgnoreCase("gui"))) {
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(rankElement.getRank(), Message.CONFIRMATION)
.replaceRanks(player, rankElement.getRank(), rankElement.getNext().getRank()), player, rankElement.getRank())
.send(player);
break;
case "gui":
Gui gui = Gui.of(player, rankElement.getRank(), rankElement.getNext().getRank(), plugin, args.length > 0 && args[0].equalsIgnoreCase("gui"));
if (gui == null) {
player.sendMessage(ChatColor.RED + "GUI is not available. Check console for more information.");
return true;
}
gui.open(player);
break;
case "none":
plugin.getHelper().rankup(player);
break;
default:
throw new IllegalArgumentException("Invalid confirmation type " + confirmationType);
}
return true;
}
}
+158 -143
View File
@@ -1,143 +1,158 @@
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 sh.okx.rankup.util.ItemUtil;
import java.util.Arrays;
import java.util.Objects;
import java.util.stream.Collectors;
@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, Rank 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);
if (config == null) {
plugin.getLogger().severe("You must update your config.yml and locale/en.yml to be able to use the GUI! Your configuration files are outdated.");
return null;
}
ItemStack[] items = new ItemStack[config.getInt("rows", 1) * 9];
ItemStack fill = getItem(plugin, plugin.getSection(oldRank, basePath + ".fill"), player, oldRank, rank);
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, Rank 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 versions
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, Rank 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 java.util.Arrays;
import java.util.Objects;
import java.util.stream.Collectors;
import lombok.AccessLevel;
import lombok.Getter;
import lombok.RequiredArgsConstructor;
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 sh.okx.rankup.ranks.RankElement;
import sh.okx.rankup.util.ItemUtil;
@RequiredArgsConstructor(access = AccessLevel.PRIVATE)
public class Gui implements InventoryHolder {
@Getter
private final boolean returnToRanksGui;
@Getter
private Inventory inventory;
@Getter
private ItemStack rankup;
@Getter
private ItemStack cancel;
@Getter
private boolean prestige;
public static Gui of(Player player, Rank oldRank, Rank rank, RankupPlugin plugin, boolean returnToRanksGui) {
Gui gui = new Gui(returnToRanksGui);
gui.prestige = oldRank instanceof Prestige;
String type = gui.prestige ? "prestige" : "rankup";
String basePath = type + ".gui";
ConfigurationSection config = plugin.getSection(oldRank, basePath);
if (config == null) {
plugin.getLogger().severe("You must update your config.yml and locale/en.yml to be able to use the GUI! Your configuration files are outdated.");
return null;
}
ItemStack[] items = new ItemStack[config.getInt("rows", 1) * 9];
ItemStack fill = getItem(plugin, plugin.getSection(oldRank, basePath + ".fill"), player, oldRank, rank);
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,
ChatColor.stripColor(ChatColor.translateAlternateColorCodes('&', 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;
}
public static ItemStack getItem(RankupPlugin plugin, ConfigurationSection section, Player player, RankElement<Rank> element) {
if (element == null) {
return getItem(plugin, section, player, null, null);
} else {
return getItem(plugin, section, player, element.getRank(), element.getNext().getRank());
}
}
@SuppressWarnings("deprecation")
public static ItemStack getItem(RankupPlugin plugin, ConfigurationSection section, Player player, Rank oldRank, Rank rank) {
if (section == null) {
return null;
}
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 versions
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, Rank rank) {
MessageBuilder builder = new MessageBuilder(message);
if (oldRank != null && rank != null) {
builder = builder.replaceRanks(player, oldRank, rank);
}
return ChatColor.translateAlternateColorCodes('&', plugin.replaceMoneyRequirements(builder, 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,45 @@
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();
if (gui.isReturnToRanksGui()) {
Bukkit.dispatchCommand(player, "ranksgui");
}
});
}
}
}
@@ -1,18 +1,19 @@
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,
MONEY_DONE,
AMOUNT,
AMOUNT_NEEDED,
AMOUNT_DONE,
PERCENT_DONE,
PERCENT_LEFT,
SECONDS,
SECONDS_LEFT
}
@@ -1,64 +1,64 @@
package sh.okx.rankup.ranks.requirements;
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;
import java.util.Map;
import java.util.Objects;
import java.util.Set;
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.getTree()) {
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 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;
import java.util.Map;
import java.util.Objects;
import java.util.Set;
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.getTree()) {
String next = prestige.getNext();
if(next != null && plugin.getPermissions().inGroup(player.getUniqueId(), next)) {
RankRequirements rankRequirements = this.requirements.get(next.toLowerCase());
if (rankRequirements != null) {
return rankRequirements;
}
}
}
return defaultRequirements;
}
}
@@ -0,0 +1,122 @@
package sh.okx.rankup.ranksgui;
import java.util.function.BiFunction;
import lombok.Getter;
import org.bukkit.Bukkit;
import org.bukkit.configuration.ConfigurationSection;
import org.bukkit.entity.Player;
import org.bukkit.event.inventory.InventoryClickEvent;
import org.bukkit.inventory.Inventory;
import org.bukkit.inventory.ItemStack;
import sh.okx.rankup.RankupPlugin;
import sh.okx.rankup.gui.Gui;
import sh.okx.rankup.ranks.Rank;
import sh.okx.rankup.ranks.RankElement;
public class RanksGui {
private final RankupPlugin plugin;
@Getter
private final Player player;
private int rankupSlot;
@Getter
private Inventory inventory;
public RanksGui(RankupPlugin plugin, Player player) {
this.plugin = plugin;
this.player = player;
}
public void open() {
RankElement<Rank> playerRankElement = plugin.getRankups().getByPlayer(player);
ConfigurationSection playerPath = playerRankElement == null ? null : plugin.getSection(playerRankElement.getRank(), "rankup.ranksgui");
ConfigurationSection basePath = plugin.getMessages().getConfigurationSection("rankup.ranksgui");
String title = get(ConfigurationSection::getString, "title", playerPath, basePath, "Ranks");
int rows = get(ConfigurationSection::getInt, "rows", playerPath, basePath, 3);
int offset = get(ConfigurationSection::getInt, "offset", playerPath, basePath, 10);
int width = get(ConfigurationSection::getInt, "width", playerPath, basePath, 7);
inventory = Bukkit.createInventory(null, rows * 9, title);
ItemStack fill = get((section, path) -> Gui.getItem(plugin, section.getConfigurationSection(path), player, playerRankElement), "fill", playerPath, basePath, null);
int index = offset;
int rowIndex = offset + width;
RankElement<Rank> rankElement = plugin.getRankups().getTree().getFirst();
boolean complete = playerRankElement != null;
while(rankElement.hasNext()) {
ConfigurationSection rankPath = plugin.getSection(rankElement.getRank(), "rankup.ranksgui");
String path;
if (rankElement == playerRankElement) {
path = "current";
complete = false;
rankupSlot = index;
} else if (complete) {
path = "complete";
} else {
path = "incomplete";
}
RankElement<Rank> rankElement0 = rankElement;
ItemStack item = get((section, path0) -> Gui.getItem(plugin, section.getConfigurationSection(path0), player, rankElement0), path, rankPath, basePath, null);
inventory.setItem(index++, item);
if (index == rowIndex) {
rowIndex += 9;
index += 9 - width;
}
if (index >= rows * 9) {
throw new IllegalArgumentException("Ranks GUI is too small for the number of ranks. Increase the number of rows on the ranks GUI.");
}
rankElement = rankElement.getNext();
}
if (fill != null) {
for (int i = 0; i < rows * 9; i++) {
ItemStack item = inventory.getItem(i);
if (item == null) {
inventory.setItem(i, fill);
}
}
}
player.openInventory(inventory);
}
private <T> T get(BiFunction<ConfigurationSection, String, T> fun, String path, ConfigurationSection primary, ConfigurationSection secondary, T def) {
T get = null;
if (primary != null) {
get = fun.apply(primary, path);
}
if (get != null) {
return get;
}
if (secondary != null) {
get = fun.apply(secondary, path);
}
if (get != null) {
return get;
}
return def;
}
public void click(InventoryClickEvent event) {
if (event.getClickedInventory() != event.getInventory()) {
return;
}
int slot = event.getRawSlot();
if (slot == rankupSlot) {
Bukkit.getScheduler().runTask(plugin, () -> {
player.closeInventory();
Bukkit.dispatchCommand(player, "rankup gui");
});
}
}
public void close() {
}
}
@@ -0,0 +1,26 @@
package sh.okx.rankup.ranksgui;
import lombok.RequiredArgsConstructor;
import org.bukkit.command.Command;
import org.bukkit.command.CommandExecutor;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import org.jetbrains.annotations.NotNull;
import sh.okx.rankup.RankupPlugin;
@RequiredArgsConstructor
public class RanksGuiCommand implements CommandExecutor {
private final RankupPlugin plugin;
private final RanksGuiListener listener;
@Override
public boolean onCommand(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, @NotNull String[] args) {
if (!(sender instanceof Player)) {
return false;
}
Player player = (Player) sender;
listener.open(new RanksGui(plugin, player));
return true;
}
}
@@ -0,0 +1,48 @@
package sh.okx.rankup.ranksgui;
import java.util.HashMap;
import java.util.Map;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.inventory.InventoryClickEvent;
import org.bukkit.event.inventory.InventoryCloseEvent;
public class RanksGuiListener implements Listener {
private final Map<Player, RanksGui> guiMap = new HashMap<>();
@EventHandler
public void on(InventoryCloseEvent event) {
if (!(event.getPlayer() instanceof Player)) {
return;
}
Player player = (Player) event.getPlayer();
if (guiMap.containsKey(player)) {
RanksGui ranksGui = guiMap.get(player);
if (ranksGui.getInventory() != null
&& ranksGui.getInventory() == event.getInventory()) {
guiMap.remove(player);
}
}
}
@EventHandler
public void on(InventoryClickEvent event) {
if (!(event.getWhoClicked() instanceof Player)) {
return;
}
Player player = (Player) event.getWhoClicked();
RanksGui ranksGui = guiMap.get(player);
if (ranksGui != null && event.getInventory() == ranksGui.getInventory()) {
event.setCancelled(true);
ranksGui.click(event);
}
}
public void open(RanksGui gui) {
guiMap.put(gui.getPlayer(), gui);
gui.open();
}
}