3.5.7-alpha
- better reporting of configuration errors (instead of disabling the plugin, send the error on startup and whenever a command is executed) - don't check for updates if on a pre-release version - add infinite rankup loop detection - add itemh requirement (like the item requirement, but not deductible) - make it so i only have to change the plugin version in one place
This commit is contained in:
@@ -11,6 +11,10 @@ public class AutoRankup extends BukkitRunnable {
|
||||
|
||||
@Override
|
||||
public void run() {
|
||||
if (rankup.error()) {
|
||||
return;
|
||||
}
|
||||
|
||||
RankupHelper helper = rankup.getHelper();
|
||||
for (Player player : Bukkit.getOnlinePlayers()) {
|
||||
if (player.hasPermission("rankup.auto")) {
|
||||
|
||||
@@ -41,7 +41,7 @@ public class RankList<T extends Rank> {
|
||||
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 + "");
|
||||
"It is safe to just delete the final rank " + name + "");
|
||||
} else if (section.getStringList("requirements").isEmpty()) {
|
||||
throw new IllegalArgumentException("Rank " + name + " does not have any requirements.");
|
||||
}
|
||||
@@ -59,13 +59,19 @@ public class RankList<T extends Rank> {
|
||||
// nothing ranks up to this
|
||||
return rank;
|
||||
}
|
||||
return null;
|
||||
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);
|
||||
}
|
||||
|
||||
@@ -71,12 +71,11 @@ public class Rankup extends JavaPlugin {
|
||||
@Getter
|
||||
private RankupHelper helper;
|
||||
private AutoRankup autoRankup;
|
||||
private String errorMessage;
|
||||
|
||||
@Override
|
||||
public void onEnable() {
|
||||
setupPermissions();
|
||||
setupEconomy();
|
||||
reload();
|
||||
reload(true);
|
||||
|
||||
Metrics metrics = new Metrics(this);
|
||||
metrics.addCustomChart(new Metrics.SimplePie("confirmation",
|
||||
@@ -112,12 +111,20 @@ public class Rankup extends JavaPlugin {
|
||||
@Override
|
||||
public void onDisable() {
|
||||
closeInventories();
|
||||
placeholders.unregister();
|
||||
if (placeholders != null) {
|
||||
placeholders.unregister();
|
||||
}
|
||||
}
|
||||
|
||||
public void reload() {
|
||||
public void reload(boolean init) {
|
||||
errorMessage = null;
|
||||
if(!setupPermissions()) {
|
||||
errorMessage = "No permission plugin found";
|
||||
}
|
||||
setupEconomy();
|
||||
|
||||
closeInventories();
|
||||
loadConfigs();
|
||||
loadConfigs(init);
|
||||
|
||||
if (autoRankup != null) {
|
||||
autoRankup.cancel();
|
||||
@@ -141,6 +148,30 @@ public class Rankup extends JavaPlugin {
|
||||
helper = new RankupHelper(this);
|
||||
}
|
||||
|
||||
public boolean error() {
|
||||
return error(null);
|
||||
}
|
||||
|
||||
/**
|
||||
* Notify the player of an error if there is one
|
||||
* @return true if there was an error and action was taken
|
||||
*/
|
||||
public boolean error(CommandSender sender) {
|
||||
if (errorMessage == null) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if (!(sender instanceof Player)) {
|
||||
getLogger().severe("Failed to load Rankup");
|
||||
} else {
|
||||
sender.sendMessage(ChatColor.RED + "Could not load Rankup, check console for more information.");
|
||||
}
|
||||
for (String line : errorMessage.split("\n")) {
|
||||
getLogger().severe(line);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
private void addAll(Map<String, Integer> map, RankList<? extends Rank> ranks) {
|
||||
for (Rank rank : ranks.ranks) {
|
||||
for (Requirement requirement : rank.getRequirements()) {
|
||||
@@ -165,7 +196,7 @@ public class Rankup extends JavaPlugin {
|
||||
}
|
||||
}
|
||||
|
||||
private void loadConfigs() {
|
||||
private void loadConfigs(boolean init) {
|
||||
saveLocales();
|
||||
|
||||
config = loadConfig("config.yml");
|
||||
@@ -173,7 +204,14 @@ public class Rankup extends JavaPlugin {
|
||||
File localeFile = new File(new File(getDataFolder(), "locale"), locale + ".yml");
|
||||
messages = YamlConfiguration.loadConfiguration(localeFile);
|
||||
|
||||
Bukkit.getScheduler().scheduleSyncDelayedTask(this, this::refreshRanks);
|
||||
if (init) {
|
||||
Bukkit.getScheduler().scheduleSyncDelayedTask(this, () -> {
|
||||
refreshRanks();
|
||||
error();
|
||||
});
|
||||
} else {
|
||||
refreshRanks();
|
||||
}
|
||||
}
|
||||
|
||||
public void refreshRanks() {
|
||||
@@ -187,11 +225,13 @@ public class Rankup extends JavaPlugin {
|
||||
} else {
|
||||
prestiges = null;
|
||||
}
|
||||
|
||||
// check rankups are not in an infinite loop
|
||||
rankups.getOrderedList();
|
||||
prestiges.getOrderedList();
|
||||
} catch (Exception e) {
|
||||
this.errorMessage = e.getMessage();
|
||||
e.printStackTrace();
|
||||
Bukkit.getPluginManager().disablePlugin(this);
|
||||
getLogger().severe("Could not finish enabling Rankup");
|
||||
Bukkit.broadcast(ChatColor.RED + "Could not reload rankup successfully, please check console for more information.", "rankup.reload");
|
||||
}
|
||||
}
|
||||
|
||||
@@ -229,6 +269,7 @@ public class Rankup extends JavaPlugin {
|
||||
requirements.addRequirement(new PlayerKillsRequirement(this));
|
||||
requirements.addRequirement(new MobKillsRequirement(this));
|
||||
requirements.addRequirement(new ItemRequirement(this));
|
||||
requirements.addRequirement(new ItemhRequirement(this));
|
||||
requirements.addRequirement(new UseItemRequirement(this));
|
||||
requirements.addRequirement(new TotalMobKillsRequirement(this));
|
||||
requirements.addRequirement(new CraftItemRequirement(this));
|
||||
@@ -250,9 +291,13 @@ public class Rankup extends JavaPlugin {
|
||||
}
|
||||
}
|
||||
|
||||
private void setupPermissions() {
|
||||
private boolean setupPermissions() {
|
||||
RegisteredServiceProvider<Permission> rsp = getServer().getServicesManager().getRegistration(Permission.class);
|
||||
if (rsp == null) {
|
||||
return false;
|
||||
}
|
||||
permissions = rsp.getProvider();
|
||||
return permissions.hasGroupSupport();
|
||||
}
|
||||
|
||||
private void setupEconomy() {
|
||||
|
||||
@@ -1,6 +1,5 @@
|
||||
package sh.okx.rankup;
|
||||
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import net.milkbowl.vault.permission.Permission;
|
||||
import org.bukkit.configuration.ConfigurationSection;
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
@@ -24,27 +24,36 @@ public class InfoCommand implements CommandExecutor {
|
||||
public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
|
||||
if (args.length > 0) {
|
||||
if (args[0].equalsIgnoreCase("reload") && sender.hasPermission("rankup.reload")) {
|
||||
plugin.reload();
|
||||
sender.sendMessage(ChatColor.GREEN + "" + ChatColor.BOLD + "Rankup " + ChatColor.YELLOW + "Reloaded configuration files.");
|
||||
plugin.reload(false);
|
||||
if (!plugin.error(sender)) {
|
||||
sender.sendMessage(ChatColor.GREEN + "" + ChatColor.BOLD + "Rankup " + ChatColor.YELLOW + "Reloaded configuration files.");
|
||||
}
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
PluginDescriptionFile description = plugin.getDescription();
|
||||
String version = description.getVersion();
|
||||
sender.sendMessage(
|
||||
ChatColor.GREEN + "" + ChatColor.BOLD + description.getName() + " " + description.getVersion() +
|
||||
ChatColor.GREEN + "" + ChatColor.BOLD + description.getName() + " " + version +
|
||||
ChatColor.YELLOW + " by " + ChatColor.BLUE + ChatColor.BOLD + String.join(", ", description.getAuthors()));
|
||||
if (sender.hasPermission("rankup.reload")) {
|
||||
sender.sendMessage(ChatColor.GREEN + "/" + label + " reload " + ChatColor.YELLOW + "Reloads configuration files.");
|
||||
}
|
||||
if (sender.hasPermission("rankup.checkversion")) {
|
||||
if (versionMessage == null) {
|
||||
if (version.contains("alpha") || version.contains("beta") || version.contains("rc")) {
|
||||
versionMessage = ChatColor.YELLOW + "You are on a pre-release version.";
|
||||
sender.sendMessage(versionMessage);
|
||||
return true;
|
||||
}
|
||||
sender.sendMessage(ChatColor.YELLOW + "Checking version...");
|
||||
Bukkit.getScheduler().runTaskAsynchronously(plugin, () -> {
|
||||
String message;
|
||||
try {
|
||||
String latest = getLatestVersion();
|
||||
if (description.getVersion().equals(latest)) {
|
||||
if (version.equals(latest)) {
|
||||
message = ChatColor.GREEN + "You are on the latest version.";
|
||||
} else {
|
||||
message = ChatColor.YELLOW + "A new version is available: " + ChatColor.GOLD + latest
|
||||
|
||||
@@ -22,6 +22,10 @@ public class PrestigeCommand implements CommandExecutor {
|
||||
|
||||
@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;
|
||||
|
||||
@@ -16,6 +16,10 @@ public class PrestigesCommand implements CommandExecutor {
|
||||
|
||||
@Override
|
||||
public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
|
||||
if (plugin.error(sender)) {
|
||||
return true;
|
||||
}
|
||||
|
||||
Prestiges prestiges = plugin.getPrestiges();
|
||||
Prestige playerRank = null;
|
||||
if (sender instanceof Player) {
|
||||
|
||||
@@ -16,6 +16,10 @@ public class RanksCommand implements CommandExecutor {
|
||||
|
||||
@Override
|
||||
public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
|
||||
if (plugin.error(sender)) {
|
||||
return true;
|
||||
}
|
||||
|
||||
Rankups rankups = plugin.getRankups();
|
||||
Rank playerRank = null;
|
||||
if (sender instanceof Player) {
|
||||
|
||||
@@ -24,6 +24,10 @@ public class RankupCommand implements CommandExecutor {
|
||||
|
||||
@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;
|
||||
|
||||
@@ -31,7 +31,7 @@ public class RequirementRegistry {
|
||||
String name = parts[0];
|
||||
String value = parts[1];
|
||||
Requirement requirement = newRequirement(name, value);
|
||||
Objects.requireNonNull(requirement, name.equalsIgnoreCase("money") ? "Money requirement disabled because no economy was found." : "Unknown requirement: " + name);
|
||||
Objects.requireNonNull(requirement, name.equalsIgnoreCase("money") ? "The 'money' requirement is being used but no economy is found" : "Unknown requirement: " + name);
|
||||
requirements.add(requirement);
|
||||
}
|
||||
return requirements;
|
||||
|
||||
@@ -9,6 +9,8 @@ import sh.okx.rankup.requirements.DeductibleRequirement;
|
||||
import sh.okx.rankup.requirements.ProgressiveRequirement;
|
||||
import sh.okx.rankup.requirements.Requirement;
|
||||
|
||||
import java.util.Arrays;
|
||||
|
||||
public class ItemRequirement extends DeductibleRequirement {
|
||||
public ItemRequirement(Rankup plugin) {
|
||||
super(plugin, "item", true);
|
||||
@@ -18,25 +20,25 @@ public class ItemRequirement extends DeductibleRequirement {
|
||||
super(clone);
|
||||
}
|
||||
|
||||
@Override
|
||||
public double getProgress(Player player) {
|
||||
Material material = Material.matchMaterial(getSub());
|
||||
int count = 0;
|
||||
for (ItemStack item : player.getInventory().getStorageContents()) {
|
||||
if (item != null && item.getType() == material) {
|
||||
count += item.getAmount();
|
||||
}
|
||||
}
|
||||
return count;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void apply(Player player, double multiplier) {
|
||||
player.getInventory().removeItem(new ItemStack(Material.matchMaterial(getSub()), (int) (getValueInt() * multiplier)));
|
||||
Material type = Material.matchMaterial(getSub());
|
||||
if (type == null) {
|
||||
throw new IllegalArgumentException("Invalid item " + getSub());
|
||||
}
|
||||
player.getInventory().removeItem(new ItemStack(type, (int) (getValueInt() * multiplier)));
|
||||
}
|
||||
|
||||
@Override
|
||||
public Requirement clone() {
|
||||
return new ItemRequirement(this);
|
||||
}
|
||||
|
||||
@Override
|
||||
public double getProgress(Player player) {
|
||||
Material material = Material.matchMaterial(getSub());
|
||||
return Arrays.stream(player.getInventory().getStorageContents())
|
||||
.filter(item -> item != null && item.getType() == material)
|
||||
.mapToInt(ItemStack::getAmount).sum();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,33 @@
|
||||
package sh.okx.rankup.requirements.requirement;
|
||||
|
||||
import org.bukkit.Material;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.inventory.ItemStack;
|
||||
import sh.okx.rankup.Rankup;
|
||||
import sh.okx.rankup.requirements.ProgressiveRequirement;
|
||||
import sh.okx.rankup.requirements.Requirement;
|
||||
|
||||
import java.util.Arrays;
|
||||
|
||||
public class ItemhRequirement extends ProgressiveRequirement {
|
||||
public ItemhRequirement(Rankup plugin) {
|
||||
super(plugin, "itemh", true);
|
||||
}
|
||||
|
||||
protected ItemhRequirement(ItemRequirement clone) {
|
||||
super(clone);
|
||||
}
|
||||
|
||||
@Override
|
||||
public double getProgress(Player player) {
|
||||
Material material = Material.matchMaterial(getSub());
|
||||
return Arrays.stream(player.getInventory().getStorageContents())
|
||||
.filter(item -> item != null && item.getType() == material)
|
||||
.mapToInt(ItemStack::getAmount).sum();
|
||||
}
|
||||
|
||||
@Override
|
||||
public Requirement clone() {
|
||||
return new ItemhRequirement(plugin);
|
||||
}
|
||||
}
|
||||
@@ -1,5 +1,5 @@
|
||||
name: Rankup
|
||||
version: 3.5.6
|
||||
version: ${version}
|
||||
main: sh.okx.rankup.Rankup
|
||||
author: Okx
|
||||
depend: [Vault]
|
||||
|
||||
Reference in New Issue
Block a user