rewrite ranks list

This commit is contained in:
okx-code
2020-06-24 21:37:58 +01:00
parent 1e7805e213
commit a4be05ffa8
33 changed files with 692 additions and 456 deletions
+1 -1
View File
@@ -1,6 +1,6 @@
plugins { plugins {
id 'java' id 'java'
id "io.freefair.lombok" version "5.0.1" id "io.freefair.lombok" version "5.1.0"
} }
group 'sh.okx' group 'sh.okx'
-130
View File
@@ -1,130 +0,0 @@
package sh.okx.rankup;
import java.util.ArrayList;
import java.util.Collection;
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.ranks.Rank;
public class RankList<T extends Rank> {
protected final RankupPlugin plugin;
@Getter
protected final FileConfiguration config;
protected final Collection<T> ranks = new ArrayList<>();
public RankList(RankupPlugin plugin, FileConfiguration config, Function<ConfigurationSection, T> deserializer) {
this.plugin = plugin;
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().equalsIgnoreCase(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(Player player) {
String last = getLast();
return plugin.getPermissions().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;
}
}
+54 -44
View File
@@ -1,7 +1,5 @@
package sh.okx.rankup; package sh.okx.rankup;
import java.util.HashMap;
import java.util.Map;
import org.bukkit.configuration.ConfigurationSection; import org.bukkit.configuration.ConfigurationSection;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import sh.okx.rankup.hook.GroupProvider; import sh.okx.rankup.hook.GroupProvider;
@@ -10,8 +8,13 @@ import sh.okx.rankup.messages.Variable;
import sh.okx.rankup.prestige.Prestige; import sh.okx.rankup.prestige.Prestige;
import sh.okx.rankup.prestige.Prestiges; import sh.okx.rankup.prestige.Prestiges;
import sh.okx.rankup.ranks.Rank; import sh.okx.rankup.ranks.Rank;
import sh.okx.rankup.ranks.RankElement;
import sh.okx.rankup.ranks.Rankups; 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 * Actually performs the ranking up and prestiging for the plugin and also manages the cooldowns
* between ranking up. * between ranking up.
@@ -32,23 +35,23 @@ public class RankupHelper {
this.permissions = plugin.getPermissions(); this.permissions = plugin.getPermissions();
} }
public void doRankup(Player player, Rank rank) { public void doRankup(Player player, RankElement<Rank> rank) {
rank.runCommands(player); rank.getRank().runCommands(player);
if (rank.getRank() != null) { if (rank.getRank() != null) {
permissions.removeGroup(player.getUniqueId(), rank.getRank()); permissions.removeGroup(player.getUniqueId(), rank.getRank().getRank());
} }
permissions.addGroup(player.getUniqueId(), rank.getNext()); permissions.addGroup(player.getUniqueId(), rank.getNext().getRank().getRank());
} }
public void sendRankupMessages(Player player, Rank rank) { public void sendRankupMessages(Player player, RankElement<Rank> rank) {
plugin.getMessage(rank, Message.SUCCESS_PUBLIC) plugin.getMessage(rank.getRank(), Message.SUCCESS_PUBLIC)
.failIfEmpty() .failIfEmpty()
.replaceRanks(player, rank, rank.getNext()) .replaceRanks(player, rank.getRank(), rank.getNext().getRank())
.broadcast(); .broadcast();
plugin.getMessage(rank, Message.SUCCESS_PRIVATE) plugin.getMessage(rank.getRank(), Message.SUCCESS_PRIVATE)
.failIfEmpty() .failIfEmpty()
.replaceRanks(player, rank, rank.getNext()) .replaceRanks(player, rank.getRank(), rank.getNext().getRank())
.send(player); .send(player);
} }
@@ -64,16 +67,19 @@ public class RankupHelper {
permissions.addGroup(player.getUniqueId(), prestige.getNext()); permissions.addGroup(player.getUniqueId(), prestige.getNext());
} }
public void sendPrestigeMessages(Player player, Prestige prestige) { public void sendPrestigeMessages(Player player, RankElement<Prestige> prestige) {
plugin.getMessage(prestige, Message.PRESTIGE_SUCCESS_PUBLIC) Objects.requireNonNull(prestige);
Objects.requireNonNull(prestige.getNext());
plugin.getMessage(prestige.getRank(), Message.PRESTIGE_SUCCESS_PUBLIC)
.failIfEmpty() .failIfEmpty()
.replaceRanks(player, prestige, prestige.getNext()) .replaceRanks(player, prestige.getRank(), prestige.getNext().getRank())
.replaceFromTo(prestige) .replaceFromTo(prestige.getRank())
.broadcast(); .broadcast();
plugin.getMessage(prestige, Message.PRESTIGE_SUCCESS_PRIVATE) plugin.getMessage(prestige.getRank(), Message.PRESTIGE_SUCCESS_PRIVATE)
.failIfEmpty() .failIfEmpty()
.replaceRanks(player, prestige, prestige.getNext()) .replaceRanks(player, prestige.getRank(), prestige.getNext().getRank())
.replaceFromTo(prestige) .replaceFromTo(prestige.getRank())
.send(player); .send(player);
} }
@@ -112,12 +118,13 @@ public class RankupHelper {
return; return;
} }
Rank rank = plugin.getRankups().getByPlayer(player); RankElement<Rank> rankElement = plugin.getRankups().getByPlayer(player);
Rank rank = rankElement.getRank();
rank.applyRequirements(player); rank.applyRequirements(player);
applyCooldown(player); applyCooldown(player);
doRankup(player, rank); doRankup(player, rankElement);
sendRankupMessages(player, rank); sendRankupMessages(player, rankElement);
} }
public boolean checkRankup(Player player) { public boolean checkRankup(Player player) {
@@ -132,24 +139,26 @@ public class RankupHelper {
*/ */
public boolean checkRankup(Player player, boolean message) { public boolean checkRankup(Player player, boolean message) {
Rankups rankups = plugin.getRankups(); Rankups rankups = plugin.getRankups();
Rank rank = rankups.getByPlayer(player); RankElement<Rank> rankElement = rankups.getByPlayer(player);
if (rankups.isLast(player)) { if (rankElement == null) { // check if in ladder
Prestiges prestiges = plugin.getPrestiges();
plugin.getMessage(prestiges == null || prestiges.isLast(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) plugin.getMessage(Message.NOT_IN_LADDER)
.failIf(!message) .failIf(!message)
.replace(Variable.PLAYER, player.getName()) .replace(Variable.PLAYER, player.getName())
.send(player); .send(player);
return false; 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 } else if (!rank.hasRequirements(player)) { // check if they can afford it
if (message) { if (message) {
plugin.replaceMoneyRequirements(plugin.getMessage(rank, Message.REQUIREMENTS_NOT_MET) plugin.replaceMoneyRequirements(plugin.getMessage(rank, Message.REQUIREMENTS_NOT_MET)
.replaceRanks(player, rank, rank.getNext()), player, rank) .replaceRanks(player, rank, rankElement.getNext().getRank()), player, rank)
.send(player); .send(player);
} }
return false; return false;
@@ -165,12 +174,13 @@ public class RankupHelper {
return; return;
} }
Prestige prestige = plugin.getPrestiges().getByPlayer(player); RankElement<Prestige> rankElement = plugin.getPrestiges().getByPlayer(player);
Prestige prestige = rankElement.getRank();
prestige.applyRequirements(player); prestige.applyRequirements(player);
applyCooldown(player); applyCooldown(player);
doPrestige(player, prestige); doPrestige(player, prestige);
sendPrestigeMessages(player, prestige); sendPrestigeMessages(player, rankElement);
} }
public boolean checkPrestige(Player player) { public boolean checkPrestige(Player player) {
@@ -179,29 +189,29 @@ public class RankupHelper {
public boolean checkPrestige(Player player, boolean message) { public boolean checkPrestige(Player player, boolean message) {
Prestiges prestiges = plugin.getPrestiges(); Prestiges prestiges = plugin.getPrestiges();
Prestige prestige = prestiges.getByPlayer(player); RankElement<Prestige> prestigeElement = prestiges.getByPlayer(player);
if (prestige == null || !prestige.isEligable(player)) { // check if in ladder if (prestigeElement == null || !prestigeElement.getRank().isEligible(player)) { // check if in ladder
plugin.getMessage(Message.NOT_HIGH_ENOUGH) plugin.getMessage(Message.NOT_HIGH_ENOUGH)
.failIf(!message) .failIf(!message)
.replace(Variable.PLAYER, player.getName()) .replace(Variable.PLAYER, player.getName())
.send(player); .send(player);
return false; return false;
} else if (prestiges.isLast(player)) { // check if they are at the highest rank } else if (!prestigeElement.hasNext()) { // check if they are at the highest rank
plugin.getMessage(prestige, Message.PRESTIGE_NO_PRESTIGE) plugin.getMessage(prestigeElement.getRank(), Message.PRESTIGE_NO_PRESTIGE)
.failIf(!message) .failIf(!message)
.replaceRanks(player, prestige.getRank()) .replaceRanks(player, prestigeElement.getRank().getRank())
.replaceFromTo(prestige) .replaceFromTo(prestigeElement.getRank())
.send(player); .send(player);
return false; return false;
} else if (!prestige.hasRequirements(player)) { // check if they can afford it } else if (!prestigeElement.getRank().hasRequirements(player)) { // check if they can afford it
plugin.replaceMoneyRequirements( plugin.replaceMoneyRequirements(
plugin.getMessage(prestige, Message.PRESTIGE_REQUIREMENTS_NOT_MET) plugin.getMessage(prestigeElement.getRank(), Message.PRESTIGE_REQUIREMENTS_NOT_MET)
.failIf(!message) .failIf(!message)
.replaceRanks(player, prestige, prestiges.next(prestige).getRank()), player, prestige) .replaceRanks(player, prestigeElement.getRank(), prestigeElement.getNext().getRank().getRank()), player, prestigeElement.getRank())
.replaceFromTo(prestige) .replaceFromTo(prestigeElement.getRank())
.send(player); .send(player);
return false; return false;
} else if (checkCooldown(player, prestige)) { } else if (checkCooldown(player, prestigeElement.getRank())) {
return false; return false;
} }
+16 -39
View File
@@ -1,11 +1,5 @@
package sh.okx.rankup; package sh.okx.rankup;
import java.io.File;
import java.text.DecimalFormat;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.function.Supplier;
import lombok.Getter; import lombok.Getter;
import net.milkbowl.vault.economy.Economy; import net.milkbowl.vault.economy.Economy;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
@@ -20,16 +14,11 @@ import org.bukkit.inventory.InventoryView;
import org.bukkit.plugin.PluginManager; import org.bukkit.plugin.PluginManager;
import org.bukkit.plugin.RegisteredServiceProvider; import org.bukkit.plugin.RegisteredServiceProvider;
import org.bukkit.plugin.java.JavaPlugin; import org.bukkit.plugin.java.JavaPlugin;
import sh.okx.rankup.commands.InfoCommand; import sh.okx.rankup.commands.*;
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.gui.Gui; import sh.okx.rankup.gui.Gui;
import sh.okx.rankup.gui.GuiListener; import sh.okx.rankup.gui.GuiListener;
import sh.okx.rankup.hook.PermissionManager;
import sh.okx.rankup.hook.GroupProvider; import sh.okx.rankup.hook.GroupProvider;
import sh.okx.rankup.hook.PermissionManager;
import sh.okx.rankup.messages.Message; import sh.okx.rankup.messages.Message;
import sh.okx.rankup.messages.MessageBuilder; import sh.okx.rankup.messages.MessageBuilder;
import sh.okx.rankup.messages.NullMessageBuilder; import sh.okx.rankup.messages.NullMessageBuilder;
@@ -38,44 +27,32 @@ import sh.okx.rankup.placeholders.Placeholders;
import sh.okx.rankup.prestige.Prestige; import sh.okx.rankup.prestige.Prestige;
import sh.okx.rankup.prestige.Prestiges; import sh.okx.rankup.prestige.Prestiges;
import sh.okx.rankup.ranks.Rank; import sh.okx.rankup.ranks.Rank;
import sh.okx.rankup.ranks.RankList;
import sh.okx.rankup.ranks.Rankups; import sh.okx.rankup.ranks.Rankups;
import sh.okx.rankup.requirements.Requirement; import sh.okx.rankup.requirements.Requirement;
import sh.okx.rankup.requirements.RequirementRegistry; import sh.okx.rankup.requirements.RequirementRegistry;
import sh.okx.rankup.requirements.XpLevelDeductibleRequirement; import sh.okx.rankup.requirements.XpLevelDeductibleRequirement;
import sh.okx.rankup.requirements.requirement.BlockBreakRequirement; import sh.okx.rankup.requirements.requirement.*;
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.TokensDeductibleRequirement;
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.XpLevelRequirement;
import sh.okx.rankup.requirements.requirement.advancedachievements.AdvancedAchievementsAchievementRequirement; import sh.okx.rankup.requirements.requirement.advancedachievements.AdvancedAchievementsAchievementRequirement;
import sh.okx.rankup.requirements.requirement.advancedachievements.AdvancedAchievementsTotalRequirement; import sh.okx.rankup.requirements.requirement.advancedachievements.AdvancedAchievementsTotalRequirement;
import sh.okx.rankup.requirements.requirement.mcmmo.McMMOPowerLevelRequirement; import sh.okx.rankup.requirements.requirement.mcmmo.McMMOPowerLevelRequirement;
import sh.okx.rankup.requirements.requirement.mcmmo.McMMOSkillRequirement; 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.tokenmanager.TokensRequirement;
import sh.okx.rankup.requirements.requirement.towny.TownyKingNumberResidentsRequirement; import sh.okx.rankup.requirements.requirement.towny.*;
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.VotingPluginPointsDeductibleRequirement;
import sh.okx.rankup.requirements.requirement.votingplugin.VotingPluginPointsRequirement; import sh.okx.rankup.requirements.requirement.votingplugin.VotingPluginPointsRequirement;
import sh.okx.rankup.requirements.requirement.votingplugin.VotingPluginVotesRequirement; import sh.okx.rankup.requirements.requirement.votingplugin.VotingPluginVotesRequirement;
import sh.okx.rankup.util.UpdateNotifier; import sh.okx.rankup.util.UpdateNotifier;
import sh.okx.rankup.util.VersionChecker; import sh.okx.rankup.util.VersionChecker;
import java.io.File;
import java.text.DecimalFormat;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.function.Supplier;
public class RankupPlugin extends JavaPlugin { public class RankupPlugin extends JavaPlugin {
@Getter @Getter
@@ -227,7 +204,7 @@ public class RankupPlugin extends JavaPlugin {
} }
private void addAll(Map<String, Integer> map, RankList<? extends Rank> ranks) { private void addAll(Map<String, Integer> map, RankList<? extends Rank> ranks) {
for (Rank rank : ranks.ranks) { for (Rank rank : ranks.getTree()) {
for (Requirement requirement : rank.getRequirements().getRequirements(null)) { for (Requirement requirement : rank.getRequirements().getRequirements(null)) {
String name = requirement.getName(); String name = requirement.getName();
map.put(name, map.getOrDefault(name, 0) + 1); map.put(name, map.getOrDefault(name, 0) + 1);
@@ -477,7 +454,7 @@ public class RankupPlugin extends JavaPlugin {
} }
} }
public MessageBuilder getMessage(CommandSender player, Message message, Rank oldRank, String rankName) { public MessageBuilder getMessage(CommandSender player, Message message, Rank oldRank, Rank rankName) {
String oldRankName; String oldRankName;
if (oldRank instanceof Prestige && oldRank.getRank() == null) { if (oldRank instanceof Prestige && oldRank.getRank() == null) {
oldRankName = ((Prestige) oldRank).getFrom(); oldRankName = ((Prestige) oldRank).getFrom();
@@ -486,7 +463,7 @@ public class RankupPlugin extends JavaPlugin {
} }
return replaceMoneyRequirements(getMessage(oldRank, message) return replaceMoneyRequirements(getMessage(oldRank, message)
.replaceRanks(player, rankName) .replaceRanks(player, rankName.getRank())
.replace(Variable.OLD_RANK, oldRankName), player, oldRank) .replace(Variable.OLD_RANK, oldRankName), player, oldRank)
.replaceFromTo(oldRank); .replaceFromTo(oldRank);
} }
@@ -11,6 +11,7 @@ import sh.okx.rankup.RankupPlugin;
import sh.okx.rankup.prestige.Prestige; import sh.okx.rankup.prestige.Prestige;
import sh.okx.rankup.prestige.Prestiges; import sh.okx.rankup.prestige.Prestiges;
import sh.okx.rankup.ranks.Rank; import sh.okx.rankup.ranks.Rank;
import sh.okx.rankup.ranks.RankElement;
import sh.okx.rankup.ranks.Rankups; import sh.okx.rankup.ranks.Rankups;
import sh.okx.rankup.util.UpdateNotifier; import sh.okx.rankup.util.UpdateNotifier;
@@ -46,19 +47,19 @@ public class InfoCommand implements CommandExecutor {
} }
Rankups rankups = plugin.getRankups(); Rankups rankups = plugin.getRankups();
if (rankups.isLast(player)) { RankElement<Rank> rankElement = rankups.getByPlayer(player);
if (rankElement == null) {
sender.sendMessage(ChatColor.YELLOW + "That player is not in any rankup groups.");
return true;
} else if (!rankElement.hasNext()) {
sender.sendMessage(ChatColor.YELLOW + "That player is at the last rank."); sender.sendMessage(ChatColor.YELLOW + "That player is at the last rank.");
return true; return true;
} }
Rank rank = rankups.getByPlayer(player); Rank rank = rankElement.getRank();
if (rank == null) {
sender.sendMessage(ChatColor.YELLOW + "That player is not in any rankup groups.");
return true;
}
plugin.getHelper().doRankup(player, rank); plugin.getHelper().doRankup(player, rankElement);
plugin.getHelper().sendRankupMessages(player, rank); plugin.getHelper().sendRankupMessages(player, rankElement);
sender.sendMessage(ChatColor.GREEN + "Successfully forced " sender.sendMessage(ChatColor.GREEN + "Successfully forced "
+ ChatColor.GOLD + player.getName() + ChatColor.GOLD + player.getName()
+ ChatColor.GREEN + " to rankup from " + ChatColor.GOLD + rank.getRank() + ChatColor.GREEN + " to rankup from " + ChatColor.GOLD + rank.getRank()
@@ -82,19 +83,20 @@ public class InfoCommand implements CommandExecutor {
} }
Prestiges prestiges = plugin.getPrestiges(); Prestiges prestiges = plugin.getPrestiges();
if (prestiges.isLast(player)) { RankElement<Prestige> rankElement = prestiges.getByPlayer(player);
if (!rankElement.hasNext()) {
sender.sendMessage(ChatColor.YELLOW + "That player is at the last prestige."); sender.sendMessage(ChatColor.YELLOW + "That player is at the last prestige.");
return true; return true;
} }
Prestige prestige = prestiges.getByPlayer(player); Prestige prestige = rankElement.getRank();
if (prestige == null) { if (prestige == null) {
sender.sendMessage(ChatColor.YELLOW + "That player is not in any prestige groups."); sender.sendMessage(ChatColor.YELLOW + "That player is not in any prestige groups.");
return true; return true;
} }
plugin.getHelper().doPrestige(player, prestige); plugin.getHelper().doPrestige(player, prestige);
plugin.getHelper().sendPrestigeMessages(player, prestige); plugin.getHelper().sendPrestigeMessages(player, rankElement);
sender.sendMessage(ChatColor.GREEN + "Successfully forced " sender.sendMessage(ChatColor.GREEN + "Successfully forced "
+ ChatColor.GOLD + player.getName() + ChatColor.GOLD + player.getName()
+ ChatColor.GREEN + " to prestige " + ChatColor.GREEN + " to prestige "
@@ -8,6 +8,7 @@ import org.bukkit.entity.Player;
import sh.okx.rankup.RankupPlugin; import sh.okx.rankup.RankupPlugin;
import sh.okx.rankup.RankupHelper; import sh.okx.rankup.RankupHelper;
import sh.okx.rankup.ranks.Rank; import sh.okx.rankup.ranks.Rank;
import sh.okx.rankup.ranks.RankElement;
@RequiredArgsConstructor @RequiredArgsConstructor
public class MaxRankupCommand implements CommandExecutor { public class MaxRankupCommand implements CommandExecutor {
@@ -27,8 +28,8 @@ public class MaxRankupCommand implements CommandExecutor {
} }
do { do {
Rank rank = plugin.getRankups().getByPlayer(player); RankElement<Rank> rank = plugin.getRankups().getByPlayer(player);
rank.applyRequirements(player); rank.getRank().applyRequirements(player);
helper.doRankup(player, rank); helper.doRankup(player, rank);
@@ -11,6 +11,7 @@ import sh.okx.rankup.gui.Gui;
import sh.okx.rankup.messages.Message; import sh.okx.rankup.messages.Message;
import sh.okx.rankup.prestige.Prestige; import sh.okx.rankup.prestige.Prestige;
import sh.okx.rankup.prestige.Prestiges; import sh.okx.rankup.prestige.Prestiges;
import sh.okx.rankup.ranks.RankElement;
import java.util.Map; import java.util.Map;
import java.util.WeakHashMap; import java.util.WeakHashMap;
@@ -33,10 +34,11 @@ public class PrestigeCommand implements CommandExecutor {
Player player = (Player) sender; Player player = (Player) sender;
Prestiges prestiges = plugin.getPrestiges(); Prestiges prestiges = plugin.getPrestiges();
Prestige prestige = prestiges.getByPlayer(player);
if (!plugin.getHelper().checkPrestige(player)) { if (!plugin.getHelper().checkPrestige(player)) {
return true; return true;
} }
RankElement<Prestige> rankElement = prestiges.getByPlayer(player);
Prestige prestige = rankElement.getRank();
FileConfiguration config = plugin.getConfig(); FileConfiguration config = plugin.getConfig();
String confirmationType = config.getString("confirmation-type").toLowerCase(); String confirmationType = config.getString("confirmation-type").toLowerCase();
@@ -51,8 +53,8 @@ public class PrestigeCommand implements CommandExecutor {
switch (confirmationType) { switch (confirmationType) {
case "text": case "text":
confirming.put(player, System.currentTimeMillis()); confirming.put(player, System.currentTimeMillis());
Prestige next = prestiges.next(prestige); Prestige next = rankElement.getNext().getRank();
String nextRank = next == null ? prestiges.getLast() : next.getRank(); String nextRank = next == null ? prestiges.getTree().last().getRank().getRank() : next.getRank();
plugin.replaceMoneyRequirements(plugin.getMessage(prestige, Message.PRESTIGE_CONFIRMATION) plugin.replaceMoneyRequirements(plugin.getMessage(prestige, Message.PRESTIGE_CONFIRMATION)
.replaceRanks(player, prestige, nextRank), player, prestige) .replaceRanks(player, prestige, nextRank), player, prestige)
@@ -60,7 +62,7 @@ public class PrestigeCommand implements CommandExecutor {
.send(player); .send(player);
break; break;
case "gui": case "gui":
Gui.of(player, prestige, prestige.getNext(), plugin).open(player); Gui.of(player, prestige, rankElement.getNext().getRank(), plugin).open(player);
break; break;
case "none": case "none":
plugin.getHelper().prestige(player); plugin.getHelper().prestige(player);
@@ -9,6 +9,7 @@ import sh.okx.rankup.RankupPlugin;
import sh.okx.rankup.messages.Message; import sh.okx.rankup.messages.Message;
import sh.okx.rankup.prestige.Prestige; import sh.okx.rankup.prestige.Prestige;
import sh.okx.rankup.prestige.Prestiges; import sh.okx.rankup.prestige.Prestiges;
import sh.okx.rankup.ranks.RankElement;
@RequiredArgsConstructor @RequiredArgsConstructor
public class PrestigesCommand implements CommandExecutor { public class PrestigesCommand implements CommandExecutor {
@@ -23,26 +24,26 @@ public class PrestigesCommand implements CommandExecutor {
Prestiges prestiges = plugin.getPrestiges(); Prestiges prestiges = plugin.getPrestiges();
Prestige playerRank = null; Prestige playerRank = null;
if (sender instanceof Player) { if (sender instanceof Player) {
playerRank = prestiges.getByPlayer((Player) sender); playerRank = prestiges.getRankByPlayer((Player) sender);
} }
plugin.sendHeaderFooter(sender, playerRank, Message.PRESTIGES_HEADER); plugin.sendHeaderFooter(sender, playerRank, Message.PRESTIGES_HEADER);
Message message = playerRank == null ? Message.PRESTIGES_INCOMPLETE : Message.PRESTIGES_COMPLETE; Message message = playerRank == null ? Message.PRESTIGES_INCOMPLETE : Message.PRESTIGES_COMPLETE;
Prestige prestige = prestiges.getFirst(); RankElement<Prestige> prestige = prestiges.getTree().getFirst();
String nextRank; while (prestige.hasNext()) {
do { RankElement<Prestige> next = prestige.getNext();
nextRank = prestige.getNext(); if (prestige.getRank().equals(playerRank)) {
if (prestige.equals(playerRank)) { plugin.getMessage(sender, Message.PRESTIGES_CURRENT, prestige.getRank(), next.getRank())
plugin.getMessage(sender, Message.PRESTIGES_CURRENT, prestige, nextRank)
.send(sender); .send(sender);
message = Message.PRESTIGES_INCOMPLETE; message = Message.PRESTIGES_INCOMPLETE;
} else { } else {
plugin.getMessage(sender, message, prestige, nextRank) plugin.getMessage(sender, message, prestige.getRank(), next.getRank())
.replaceFirstPrestige(prestige, prestiges, prestige.getFrom()) .replaceFirstPrestige(prestige.getRank(), prestiges, prestige.getRank().getFrom())
.send(sender); .send(sender);
} }
} while((prestige = prestiges.getByName(nextRank)) != null); prestige = next;
}
plugin.sendHeaderFooter(sender, playerRank, Message.PRESTIGES_FOOTER); plugin.sendHeaderFooter(sender, playerRank, Message.PRESTIGES_FOOTER);
return true; return true;
@@ -8,6 +8,7 @@ import org.bukkit.entity.Player;
import sh.okx.rankup.RankupPlugin; import sh.okx.rankup.RankupPlugin;
import sh.okx.rankup.messages.Message; import sh.okx.rankup.messages.Message;
import sh.okx.rankup.ranks.Rank; import sh.okx.rankup.ranks.Rank;
import sh.okx.rankup.ranks.RankElement;
import sh.okx.rankup.ranks.Rankups; import sh.okx.rankup.ranks.Rankups;
@RequiredArgsConstructor @RequiredArgsConstructor
@@ -21,27 +22,29 @@ public class RanksCommand implements CommandExecutor {
} }
Rankups rankups = plugin.getRankups(); Rankups rankups = plugin.getRankups();
Rank playerRank = null; RankElement<Rank> playerRank = null;
Rank pRank = null;
if (sender instanceof Player) { if (sender instanceof Player) {
playerRank = rankups.getByPlayer((Player) sender); playerRank = rankups.getByPlayer((Player) sender);
pRank = playerRank == null ? null : playerRank.getRank();
} }
plugin.sendHeaderFooter(sender, playerRank, Message.RANKS_HEADER); plugin.sendHeaderFooter(sender, pRank, Message.RANKS_HEADER);
Message message = !(sender instanceof Player && rankups.isLast((Player) sender)) Message message = !(sender instanceof Player && !(playerRank != null && playerRank.hasNext()))
&& playerRank == null ? Message.RANKS_INCOMPLETE : Message.RANKS_COMPLETE; && playerRank == null ? Message.RANKS_INCOMPLETE : Message.RANKS_COMPLETE;
Rank rank = rankups.getFirst(); RankElement<Rank> rank = rankups.getTree().getFirst();
while (rank != null) { while (rank.hasNext()) {
String name = rank.getNext(); RankElement<Rank> next = rank.getNext();
if (rank.equals(playerRank)) { if (rank.getRank().equals(pRank)) {
plugin.getMessage(sender, Message.RANKS_CURRENT, rank, name).failIfEmpty().send(sender); plugin.getMessage(sender, Message.RANKS_CURRENT, rank.getRank(), next.getRank()).failIfEmpty().send(sender);
message = Message.RANKS_INCOMPLETE; message = Message.RANKS_INCOMPLETE;
} else { } else {
plugin.getMessage(sender, message, rank, name).failIfEmpty().send(sender); plugin.getMessage(sender, message, rank.getRank(), next.getRank()).failIfEmpty().send(sender);
} }
rank = rankups.getByName(name); rank = next;
} }
plugin.sendHeaderFooter(sender, playerRank, Message.RANKS_FOOTER); plugin.sendHeaderFooter(sender, pRank, Message.RANKS_FOOTER);
return true; return true;
} }
} }
@@ -10,6 +10,7 @@ import sh.okx.rankup.RankupPlugin;
import sh.okx.rankup.gui.Gui; import sh.okx.rankup.gui.Gui;
import sh.okx.rankup.messages.Message; import sh.okx.rankup.messages.Message;
import sh.okx.rankup.ranks.Rank; import sh.okx.rankup.ranks.Rank;
import sh.okx.rankup.ranks.RankElement;
import sh.okx.rankup.ranks.Rankups; import sh.okx.rankup.ranks.Rankups;
import java.util.Map; import java.util.Map;
@@ -35,10 +36,10 @@ public class RankupCommand implements CommandExecutor {
Player player = (Player) sender; Player player = (Player) sender;
Rankups rankups = plugin.getRankups(); Rankups rankups = plugin.getRankups();
Rank rank = rankups.getByPlayer(player);
if (!plugin.getHelper().checkRankup(player)) { if (!plugin.getHelper().checkRankup(player)) {
return true; return true;
} }
RankElement<Rank> rankElement = rankups.getByPlayer(player);
/*Rank next = rankups.next(rank); /*Rank next = rankups.next(rank);
if (next == null) { if (next == null) {
plugin.getLogger().severe("Rankup from " + rank.getRank() + " to " + rank.getNext() + plugin.getLogger().severe("Rankup from " + rank.getRank() + " to " + rank.getNext() +
@@ -46,7 +47,6 @@ public class RankupCommand implements CommandExecutor {
plugin.getMessage(Message.INVALID_RANKUP).failIfEmpty().send(player); plugin.getMessage(Message.INVALID_RANKUP).failIfEmpty().send(player);
return true; return true;
}*/ }*/
String next = rank.getNext();
FileConfiguration config = plugin.getConfig(); FileConfiguration config = plugin.getConfig();
String confirmationType = config.getString("confirmation-type").toLowerCase(); String confirmationType = config.getString("confirmation-type").toLowerCase();
@@ -63,12 +63,12 @@ public class RankupCommand implements CommandExecutor {
switch (confirmationType) { switch (confirmationType) {
case "text": case "text":
confirming.put(player, System.currentTimeMillis()); confirming.put(player, System.currentTimeMillis());
plugin.replaceMoneyRequirements(plugin.getMessage(rank, Message.CONFIRMATION) plugin.replaceMoneyRequirements(plugin.getMessage(rankElement.getRank(), Message.CONFIRMATION)
.replaceRanks(player, rank, next), player, rank) .replaceRanks(player, rankElement.getRank(), rankElement.getNext().getRank()), player, rankElement.getRank())
.send(player); .send(player);
break; break;
case "gui": case "gui":
Gui.of(player, rank, next, plugin).open(player); Gui.of(player, rankElement.getRank(), rankElement.getNext().getRank(), plugin).open(player);
break; break;
case "none": case "none":
plugin.getHelper().rankup(player); plugin.getHelper().rankup(player);
+5 -5
View File
@@ -17,11 +17,11 @@ import sh.okx.rankup.messages.Message;
import sh.okx.rankup.messages.MessageBuilder; import sh.okx.rankup.messages.MessageBuilder;
import sh.okx.rankup.prestige.Prestige; import sh.okx.rankup.prestige.Prestige;
import sh.okx.rankup.ranks.Rank; import sh.okx.rankup.ranks.Rank;
import sh.okx.rankup.util.ItemUtil;
import java.util.Arrays; import java.util.Arrays;
import java.util.Objects; import java.util.Objects;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import sh.okx.rankup.util.ItemUtil;
@NoArgsConstructor(access = AccessLevel.PRIVATE) @NoArgsConstructor(access = AccessLevel.PRIVATE)
public class Gui implements InventoryHolder { public class Gui implements InventoryHolder {
@@ -34,7 +34,7 @@ public class Gui implements InventoryHolder {
@Getter @Getter
private boolean prestige; private boolean prestige;
public static Gui of(Player player, Rank oldRank, String rank, RankupPlugin plugin) { public static Gui of(Player player, Rank oldRank, Rank rank, RankupPlugin plugin) {
Gui gui = new Gui(); Gui gui = new Gui();
gui.prestige = oldRank instanceof Prestige; gui.prestige = oldRank instanceof Prestige;
@@ -65,7 +65,7 @@ public class Gui implements InventoryHolder {
} }
@SuppressWarnings("deprecation") @SuppressWarnings("deprecation")
private static ItemStack getItem(RankupPlugin plugin, ConfigurationSection section, Player player, Rank oldRank, String rank) { private static ItemStack getItem(RankupPlugin plugin, ConfigurationSection section, Player player, Rank oldRank, Rank rank) {
String materialName = section.getString("material").toUpperCase(); String materialName = section.getString("material").toUpperCase();
ItemStack item; ItemStack item;
@@ -73,7 +73,7 @@ public class Gui implements InventoryHolder {
Material material = Material.valueOf(materialName); Material material = Material.valueOf(materialName);
item = new ItemStack(material); item = new ItemStack(material);
} else { } else {
// handle default material correctly on older vesions // handle default material correctly on older versions
if (materialName.equals("BLACK_STAINED_GLASS_PANE")) { if (materialName.equals("BLACK_STAINED_GLASS_PANE")) {
materialName = "STAINED_GLASS_PANE:15"; materialName = "STAINED_GLASS_PANE:15";
} }
@@ -103,7 +103,7 @@ public class Gui implements InventoryHolder {
return item; return item;
} }
private static String format(RankupPlugin plugin, String message, Player player, Rank oldRank, String rank) { private static String format(RankupPlugin plugin, String message, Player player, Rank oldRank, Rank rank) {
return plugin.replaceMoneyRequirements(new MessageBuilder(ChatColor.translateAlternateColorCodes('&', message)) return plugin.replaceMoneyRequirements(new MessageBuilder(ChatColor.translateAlternateColorCodes('&', message))
.replaceRanks(player, oldRank, rank), player, oldRank) .replaceRanks(player, oldRank, rank), player, oldRank)
.toString(); .toString();
@@ -1,9 +1,10 @@
package sh.okx.rankup.hook; package sh.okx.rankup.hook;
import net.milkbowl.vault.permission.Permission;
import org.bukkit.Bukkit;
import java.util.Objects; import java.util.Objects;
import java.util.UUID; import java.util.UUID;
import net.milkbowl.vault.permission.Permission;
import org.bukkit.Bukkit;
public class VaultGroupProvider implements GroupProvider { public class VaultGroupProvider implements GroupProvider {
private final Permission permission; private final Permission permission;
@@ -61,17 +61,34 @@ public class MessageBuilder {
return this; return this;
} }
public MessageBuilder replaceRanks(CommandSender player, Rank oldRank, Rank rank) {
replace(Variable.PLAYER, player.getName());
replaceRanks(oldRank, rank);
return this;
}
public MessageBuilder replaceRanks(String rankName) { public MessageBuilder replaceRanks(String rankName) {
replace(Variable.RANK, rankName); replace(Variable.RANK, rankName);
return this; return this;
} }
public MessageBuilder replaceRanks(Rank rank) {
replace(Variable.RANK, rank.getRank());
return this;
}
public MessageBuilder replaceRanks(Rank oldRank, String rankName) { public MessageBuilder replaceRanks(Rank oldRank, String rankName) {
replaceRanks(rankName); replaceRanks(rankName);
replace(Variable.OLD_RANK, oldRank.getRank()); replace(Variable.OLD_RANK, oldRank.getRank());
return this; return this;
} }
public MessageBuilder replaceRanks(Rank oldRank, Rank rank) {
replaceRanks(rank);
replace(Variable.OLD_RANK, oldRank.getRank());
return this;
}
public MessageBuilder replaceFromTo(Rank rank) { public MessageBuilder replaceFromTo(Rank rank) {
if (rank instanceof Prestige) { if (rank instanceof Prestige) {
Prestige prestige = (Prestige) rank; Prestige prestige = (Prestige) rank;
@@ -7,6 +7,7 @@ import sh.okx.rankup.RankupPlugin;
import sh.okx.rankup.prestige.Prestige; import sh.okx.rankup.prestige.Prestige;
import sh.okx.rankup.prestige.Prestiges; import sh.okx.rankup.prestige.Prestiges;
import sh.okx.rankup.ranks.Rank; import sh.okx.rankup.ranks.Rank;
import sh.okx.rankup.ranks.RankElement;
import sh.okx.rankup.ranks.Rankups; import sh.okx.rankup.ranks.Rankups;
import sh.okx.rankup.requirements.Requirement; import sh.okx.rankup.requirements.Requirement;
@@ -30,12 +31,15 @@ public class RankupExpansion extends PlaceholderExpansion {
params = params.toLowerCase(); params = params.toLowerCase();
Rankups rankups = plugin.getRankups(); Rankups rankups = plugin.getRankups();
Rank rank = rankups.getByPlayer(player); RankElement<Rank> rankElement = rankups.getByPlayer(player);
Rank rank = rankElement == null ? null : rankElement.getRank();
Prestiges prestiges = plugin.getPrestiges(); Prestiges prestiges = plugin.getPrestiges();
RankElement<Prestige> prestigeElement = null;
Prestige prestige = null; Prestige prestige = null;
if (prestiges != null) { if (prestiges != null) {
prestige = prestiges.getByPlayer(player); prestigeElement = prestiges.getByPlayer(player);
prestige = prestigeElement == null ? null : prestigeElement.getRank();
} }
if (params.startsWith("requirement_")) { if (params.startsWith("requirement_")) {
@@ -55,7 +59,7 @@ public class RankupExpansion extends PlaceholderExpansion {
} }
return plugin.formatMoney(Math.max(0, amount)); return plugin.formatMoney(Math.max(0, amount));
} else if (params.startsWith("status_")) { } else if (params.startsWith("status_")) {
if (rankups.isLast(player) || rank.isIn(player)) { if (rankElement != null && (!rankElement.hasNext() || rank.isIn(player))) {
return getPlaceholder("status-complete"); return getPlaceholder("status-complete");
} else { } else {
return getPlaceholder("status-incomplete"); return getPlaceholder("status-incomplete");
@@ -65,16 +69,14 @@ public class RankupExpansion extends PlaceholderExpansion {
switch (params) { switch (params) {
case "current_prestige": case "current_prestige":
requirePrestiging(prestiges, params); requirePrestiging(prestiges, params);
if (prestiges.isLast(player)) { if (prestige == null || prestige.getRank() == null) {
return prestiges.getLast();
} else if (prestige == null || prestige.getRank() == null) {
return getPlaceholder("no-prestige"); return getPlaceholder("no-prestige");
} else { } else {
return prestige.getRank(); return prestige.getRank();
} }
case "next_prestige": case "next_prestige":
requirePrestiging(prestiges, params); requirePrestiging(prestiges, params);
if (prestiges.isLast(player)) { if (prestigeElement != null && !prestigeElement.hasNext()) {
return getPlaceholder("highest-rank"); return getPlaceholder("highest-rank");
} }
return orElse(prestige, Prestige::getNext, prestiges.getFirst().getNext()); return orElse(prestige, Prestige::getNext, prestiges.getFirst().getNext());
@@ -85,15 +87,13 @@ public class RankupExpansion extends PlaceholderExpansion {
requirePrestiging(prestiges, params); requirePrestiging(prestiges, params);
return plugin.formatMoney(orElse(prestige, r -> r.isIn(player) ? r.getRequirement(player, "money").getValueDouble() : 0, 0D)); return plugin.formatMoney(orElse(prestige, r -> r.isIn(player) ? r.getRequirement(player, "money").getValueDouble() : 0, 0D));
case "current_rank": case "current_rank":
if (rankups.isLast(player)) { if (rank == null) {
return rankups.getLast();
} else if (rank == null) {
return getPlaceholder("not-in-ladder"); return getPlaceholder("not-in-ladder");
} else { } else {
return rank.getRank(); return rank.getRank();
} }
case "next_rank": case "next_rank":
if (rankups.isLast(player)) { if (rankElement != null && !rankElement.hasNext()) {
return getPlaceholder("highest-rank"); return getPlaceholder("highest-rank");
} }
return orElsePlaceholder(rank, r -> orElsePlaceholder(rank, Rank::getNext, "highest-rank"), "not-in-ladder"); return orElsePlaceholder(rank, r -> orElsePlaceholder(rank, Rank::getNext, "highest-rank"), "not-in-ladder");
@@ -0,0 +1,43 @@
package sh.okx.rankup.prestige;
import org.bukkit.entity.Player;
import sh.okx.rankup.RankupPlugin;
import sh.okx.rankup.ranks.requirements.LastRankRequirements;
import sh.okx.rankup.requirements.NullRequirement;
import sh.okx.rankup.requirements.Requirement;
import java.util.Collections;
public class LastPrestige extends Prestige {
public LastPrestige(RankupPlugin plugin, String name) {
super(null, plugin, null, name, new LastRankRequirements(), Collections.emptyList(), null, null);
}
@Override
public boolean isIn(Player player) {
return plugin.getPermissions().inGroup(player.getUniqueId(), rank);
}
@Override
public boolean hasRequirements(Player player) {
return false;
}
@Override
public Requirement getRequirement(Player player, String name) {
return new NullRequirement();
}
@Override
public void applyRequirements(Player player) {
}
@Override
public void runCommands(Player player) {
}
@Override
public boolean isEligible(Player player) {
return true;
}
}
@@ -22,7 +22,7 @@ public class Prestige extends Rank {
@Getter @Getter
private final String to; private final String to;
private Prestige(ConfigurationSection section, RankupPlugin plugin, String next, String rank, RankRequirements requirements, List<String> commands, String from, String to) { protected Prestige(ConfigurationSection section, RankupPlugin plugin, String next, String rank, RankRequirements requirements, List<String> commands, String from, String to) {
super(section, plugin, next, rank, requirements, commands); super(section, plugin, next, rank, requirements, commands);
this.from = from; this.from = from;
this.to = to; this.to = to;
@@ -47,7 +47,7 @@ public class Prestige extends Rank {
boolean inFrom = plugin.getPermissions().inGroup(player.getUniqueId(), from); boolean inFrom = plugin.getPermissions().inGroup(player.getUniqueId(), from);
if (rank == null && inFrom) { if (rank == null && inFrom) {
// not in any other prestiges // not in any other prestiges
for (Prestige prestige : plugin.getPrestiges().getOrderedList()) { for (Prestige prestige : plugin.getPrestiges().getTree()) {
if (prestige != this && prestige.isIn(player)) { if (prestige != this && prestige.isIn(player)) {
return false; return false;
} }
@@ -68,12 +68,7 @@ public class Prestige extends Rank {
return false; return false;
} }
public boolean isEligable(Player player) { public boolean isEligible(Player player) {
return plugin.getPermissions().inGroup(player.getUniqueId(), from); return plugin.getPermissions().inGroup(player.getUniqueId(), from);
} }
@Override
public boolean isLast() {
return plugin.getPrestiges().getByName(next) == null;
}
} }
@@ -1,7 +1,8 @@
package sh.okx.rankup.prestige; package sh.okx.rankup.prestige;
import org.bukkit.configuration.file.FileConfiguration; import org.bukkit.configuration.file.FileConfiguration;
import sh.okx.rankup.RankList; import sh.okx.rankup.ranks.RankElement;
import sh.okx.rankup.ranks.RankList;
import sh.okx.rankup.RankupPlugin; import sh.okx.rankup.RankupPlugin;
public class Prestiges extends RankList<Prestige> { public class Prestiges extends RankList<Prestige> {
@@ -10,13 +11,9 @@ public class Prestiges extends RankList<Prestige> {
} }
@Override @Override
public Prestige getFirst() { public void addLastRank(RankupPlugin plugin) {
for (Prestige prestige : ranks) { RankElement<Prestige> last = getTree().last();
if (prestige.getRank() == null) { last.setNext(new RankElement<>(new LastPrestige(plugin, last.getRank().getNext()), 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.");
} }
} }
@@ -0,0 +1,33 @@
package sh.okx.rankup.ranks;
import org.bukkit.entity.Player;
import sh.okx.rankup.RankupPlugin;
import sh.okx.rankup.ranks.requirements.LastRankRequirements;
import sh.okx.rankup.requirements.NullRequirement;
import sh.okx.rankup.requirements.Requirement;
import java.util.Collections;
public class LastRank extends Rank {
public LastRank(RankupPlugin plugin, String name) {
super(null, plugin, null, name, new LastRankRequirements(), Collections.emptyList());
}
@Override
public boolean hasRequirements(Player player) {
return false;
}
@Override
public Requirement getRequirement(Player player, String name) {
return new NullRequirement();
}
@Override
public void applyRequirements(Player player) {
}
@Override
public void runCommands(Player player) {
}
}
+11 -7
View File
@@ -1,11 +1,9 @@
package sh.okx.rankup.ranks; package sh.okx.rankup.ranks;
import java.util.List;
import lombok.AccessLevel; import lombok.AccessLevel;
import lombok.EqualsAndHashCode; import lombok.EqualsAndHashCode;
import lombok.Getter; import lombok.Getter;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import lombok.ToString;
import me.clip.placeholderapi.PlaceholderAPI; import me.clip.placeholderapi.PlaceholderAPI;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
import org.bukkit.configuration.ConfigurationSection; import org.bukkit.configuration.ConfigurationSection;
@@ -15,8 +13,9 @@ import sh.okx.rankup.messages.MessageBuilder;
import sh.okx.rankup.ranks.requirements.RankRequirements; import sh.okx.rankup.ranks.requirements.RankRequirements;
import sh.okx.rankup.requirements.Requirement; import sh.okx.rankup.requirements.Requirement;
import java.util.List;
@EqualsAndHashCode @EqualsAndHashCode
@ToString
@RequiredArgsConstructor(access = AccessLevel.PROTECTED) @RequiredArgsConstructor(access = AccessLevel.PROTECTED)
public class Rank { public class Rank {
@Getter @Getter
@@ -34,10 +33,6 @@ public class Rank {
return plugin.getPermissions().inGroup(player.getUniqueId(), rank); return plugin.getPermissions().inGroup(player.getUniqueId(), rank);
} }
public boolean isLast() {
return plugin.getRankups().getByName(next) == null;
}
public boolean hasRequirements(Player player) { public boolean hasRequirements(Player player) {
return requirements.hasRequirements(player); return requirements.hasRequirements(player);
} }
@@ -60,4 +55,13 @@ public class Rank {
Bukkit.dispatchCommand(Bukkit.getConsoleSender(), string); Bukkit.dispatchCommand(Bukkit.getConsoleSender(), string);
} }
} }
@Override
public String toString() {
return "Rank{" +
"next='" + next + '\'' +
", rank='" + rank + '\'' +
", commands=" + commands +
'}';
}
} }
@@ -0,0 +1,31 @@
package sh.okx.rankup.ranks;
import lombok.Getter;
import java.util.Objects;
@Getter
public class RankElement<T extends Rank> {
private boolean rootNode = true;
private final T rank;
private RankElement<T> next;
public RankElement(T rank, RankElement<T> next) {
Objects.requireNonNull(rank);
this.rank = rank;
this.next = next;
}
public void setRootNode(boolean rootNode) {
this.rootNode = rootNode;
}
public boolean hasNext() {
return next != null;
}
public void setNext(RankElement<T> next) {
this.next = next;
this.next.setRootNode(false);
}
}
@@ -0,0 +1,125 @@
package sh.okx.rankup.ranks;
import lombok.Getter;
import org.bukkit.configuration.ConfigurationSection;
import org.bukkit.configuration.file.FileConfiguration;
import org.bukkit.entity.Player;
import sh.okx.rankup.RankupPlugin;
import java.util.*;
import java.util.function.Function;
public abstract class RankList<T extends Rank> {
protected RankupPlugin plugin;
@Getter
protected FileConfiguration config;
@Getter
private RankTree<T> tree;
public RankList(RankupPlugin plugin, FileConfiguration config,
Function<ConfigurationSection, T> deserializer) {
this.plugin = plugin;
this.config = config;
List<RankElement<T>> rankElements = new ArrayList<>();
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) {
// find next
rankElements.add(findNext(apply, rankElements));
}
}
for (RankElement<T> rankElement : rankElements) {
if (rankElement.isRootNode()) {
if (tree == null) {
tree = new RankTree<>(rankElement);
addLastRank(plugin);
} else {
plugin.getLogger().severe("Multiple root rankup nodes detected (a root rankup nodes is a rankup that does not have anything that ranks up to it). This may lead to inconsistent behaviour.");
plugin.getLogger().severe("Conflicting root node: " + rankElement.getRank() + ". Using root node: " + tree.getFirst().getRank());
}
}
}
}
public abstract void addLastRank(RankupPlugin plugin);
private RankElement<T> findNext(T rank, List<RankElement<T>> rankElements) {
Objects.requireNonNull(rank);
RankElement<T> currentElement = new RankElement<>(rank, null);
for (RankElement<T> rankElement : rankElements) {
T rank1 = rankElement.getRank();
if (rank1.getRank() != null
&& rank1.getRank().equalsIgnoreCase(rank.getNext())) {
// current rank element is the next rank
currentElement.setNext(rankElement);
} else if (rank1.getNext() != null
&& rank1.getNext().equalsIgnoreCase(rank.getRank())) {
rankElement.setNext(currentElement);
}
}
return currentElement;
}
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() {
return tree.getFirst().getRank();
}
public T getByName(String name) {
if (name == null) {
return null;
}
for (T rank : tree) {
if (name.equalsIgnoreCase(rank.getRank())) {
return rank;
}
}
return null;
}
public RankElement<T> getByPlayer(Player player) {
List<RankElement<T>> list = tree.asList();
Collections.reverse(list);
for (RankElement<T> t : list) {
if (t.getRank().isIn(player)) {
return t;
}
}
return null;
}
public T getRankByPlayer(Player player) {
List<RankElement<T>> list = tree.asList();
Collections.reverse(list);
for (RankElement<T> t : list) {
if (t.getRank().isIn(player)) {
return t.getRank();
}
}
return null;
}
}
@@ -0,0 +1,65 @@
package sh.okx.rankup.ranks;
import org.jetbrains.annotations.NotNull;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
public class RankTree<T extends Rank> implements Iterable<T> {
private final RankElement<T> first;
public RankTree(RankElement<T> first) {
this.first = first;
}
public RankElement<T> getFirst() {
return first;
}
public int length() {
int len = 0;
RankElement<T> elem = first;
while (elem != null) {
len++;
elem = elem.getNext();
}
return len;
}
@NotNull
@Override
public Iterator<T> iterator() {
return new Iterator<T>() {
private RankElement<T> element = first;
@Override
public boolean hasNext() {
return element.hasNext();
}
@Override
public T next() {
element = element.getNext();
return element.getRank();
}
};
}
public List<RankElement<T>> asList() {
List<RankElement<T>> ranks = new ArrayList<>();
RankElement<T> elem = first;
while (elem != null) {
ranks.add(elem);
elem = elem.getNext();
}
return ranks;
}
public RankElement<T> last() {
RankElement<T> elem = first;
while (elem.hasNext()) {
elem = elem.getNext();
}
return elem;
}
}
@@ -1,13 +1,14 @@
package sh.okx.rankup.ranks; package sh.okx.rankup.ranks;
import java.util.List;
import org.bukkit.configuration.ConfigurationSection; import org.bukkit.configuration.ConfigurationSection;
import sh.okx.rankup.RankupPlugin; import sh.okx.rankup.RankupPlugin;
import sh.okx.rankup.ranks.requirements.RankRequirements; import sh.okx.rankup.ranks.requirements.RankRequirements;
import sh.okx.rankup.ranks.requirements.RankRequirementsFactory; import sh.okx.rankup.ranks.requirements.RankRequirementsFactory;
import java.util.List;
public class Rankup extends Rank { public class Rankup extends Rank {
public static Rank deserialize(RankupPlugin plugin, ConfigurationSection section) { public static Rankup deserialize(RankupPlugin plugin, ConfigurationSection section) {
String next = section.getString("next"); String next = section.getString("next");
String rank = section.getString("rank"); String rank = section.getString("rank");
@@ -16,15 +17,15 @@ public class Rankup extends Rank {
return null; return null;
} }
return new Rank(section, plugin, return new Rankup(section,
plugin,
next, next,
rank, rank,
RankRequirementsFactory.getRequirements(plugin, section), RankRequirementsFactory.getRequirements(plugin, section),
section.getStringList("commands")); section.getStringList("commands"));
} }
protected Rankup(ConfigurationSection section, protected Rankup(ConfigurationSection section, RankupPlugin plugin, String next, String rank,
RankupPlugin plugin, String next, String rank,
RankRequirements requirements, RankRequirements requirements,
List<String> commands) { List<String> commands) {
super(section, plugin, next, rank, requirements, commands); super(section, plugin, next, rank, requirements, commands);
@@ -1,11 +1,16 @@
package sh.okx.rankup.ranks; package sh.okx.rankup.ranks;
import org.bukkit.configuration.file.FileConfiguration; import org.bukkit.configuration.file.FileConfiguration;
import sh.okx.rankup.RankList;
import sh.okx.rankup.RankupPlugin; import sh.okx.rankup.RankupPlugin;
public class Rankups extends RankList<Rank> { public class Rankups extends RankList<Rank> {
public Rankups(RankupPlugin plugin, FileConfiguration config) { public Rankups(RankupPlugin plugin, FileConfiguration config) {
super(plugin, config, section -> Rankup.deserialize(plugin, section)); super(plugin, config, section -> Rankup.deserialize(plugin, section));
} }
@Override
public void addLastRank(RankupPlugin plugin) {
RankElement<Rank> last = getTree().last();
last.setNext(new RankElement<>(new LastRank(plugin, last.getRank().getNext()), null));
}
} }
@@ -0,0 +1,29 @@
package sh.okx.rankup.ranks.requirements;
import java.util.Collections;
import java.util.Set;
import org.bukkit.entity.Player;
import sh.okx.rankup.requirements.Requirement;
public class LastRankRequirements implements RankRequirements {
@Override
public Set<Requirement> getRequirements(Player player) {
return Collections.emptySet();
}
@Override
public boolean hasRequirements(Player player) {
return false;
}
@Override
public Requirement getRequirement(Player player, String name) {
return null;
}
@Override
public void applyRequirements(Player player) {
}
}
@@ -1,14 +1,15 @@
package sh.okx.rankup.ranks.requirements; package sh.okx.rankup.ranks.requirements;
import java.util.Map;
import java.util.Objects;
import java.util.Set;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import sh.okx.rankup.RankupPlugin; import sh.okx.rankup.RankupPlugin;
import sh.okx.rankup.prestige.Prestige; import sh.okx.rankup.prestige.Prestige;
import sh.okx.rankup.prestige.Prestiges; import sh.okx.rankup.prestige.Prestiges;
import sh.okx.rankup.requirements.Requirement; import sh.okx.rankup.requirements.Requirement;
import java.util.Map;
import java.util.Objects;
import java.util.Set;
public class PrestigeListRankRequirements implements RankRequirements { public class PrestigeListRankRequirements implements RankRequirements {
private final RankupPlugin plugin; private final RankupPlugin plugin;
private final RankRequirements defaultRequirements; private final RankRequirements defaultRequirements;
@@ -49,7 +50,7 @@ public class PrestigeListRankRequirements implements RankRequirements {
return defaultRequirements; return defaultRequirements;
} }
for (Prestige prestige : prestiges.getOrderedList()) { for (Prestige prestige : prestiges.getTree()) {
String next = prestige.getNext(); String next = prestige.getNext();
if(plugin.getPermissions().inGroup(player.getUniqueId(), next)) { if(plugin.getPermissions().inGroup(player.getUniqueId(), next)) {
RankRequirements rankRequirements = this.requirements.get(next.toLowerCase()); RankRequirements rankRequirements = this.requirements.get(next.toLowerCase());
@@ -0,0 +1,24 @@
package sh.okx.rankup.requirements;
import org.bukkit.entity.Player;
public class NullRequirement extends Requirement {
public NullRequirement() {
super(null, null);
}
@Override
public boolean check(Player player) {
return false;
}
@Override
public Requirement clone() {
return this;
}
@Override
public double getTotal(Player player) {
return 0;
}
}
@@ -1,9 +1,8 @@
package sh.okx.rankup.requirements.requirement; package sh.okx.rankup.requirements.requirement.tokenmanager;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import sh.okx.rankup.RankupPlugin; import sh.okx.rankup.RankupPlugin;
import sh.okx.rankup.requirements.DeductibleRequirement; import sh.okx.rankup.requirements.DeductibleRequirement;
import sh.okx.rankup.requirements.requirement.tokenmanager.TokensRequirement;
public class TokensDeductibleRequirement extends TokensRequirement implements DeductibleRequirement { public class TokensDeductibleRequirement extends TokensRequirement implements DeductibleRequirement {
public TokensDeductibleRequirement(RankupPlugin plugin, String name) { public TokensDeductibleRequirement(RankupPlugin plugin, String name) {