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:
okx-code
2019-08-03 15:29:44 +01:00
parent 58f38489a6
commit 11200862cd
14 changed files with 164 additions and 38 deletions
@@ -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")) {
+8 -2
View File
@@ -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);
}
+57 -12
View File
@@ -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 -1
View File
@@ -1,5 +1,5 @@
name: Rankup
version: 3.5.6
version: ${version}
main: sh.okx.rankup.Rankup
author: Okx
depend: [Vault]