From e8d24a434a4e32e65519e4a4defd1d28a9bd1c0e Mon Sep 17 00:00:00 2001 From: okx-code Date: Sun, 2 Sep 2018 20:11:07 +0100 Subject: [PATCH] misc. changes (check description) rename SECONDS to SECONDS_LEFT, and add SECONDS. add %rankup_rank_money_left_% placeholder add permission requirement --- src/main/java/sh/okx/rankup/Rankup.java | 70 +++++++++---------- src/main/java/sh/okx/rankup/gui/Gui.java | 17 ++--- .../okx/rankup/messages/MessageBuilder.java | 9 ++- .../java/sh/okx/rankup/messages/Variable.java | 3 +- .../okx/rankup/placeholders/Placeholders.java | 8 ++- .../requirement/GroupRequirement.java | 4 +- .../requirement/MoneyRequirement.java | 4 +- .../requirement/PermissionRequirement.java | 30 ++++++++ .../PlaytimeMinutesRequirement.java | 4 +- .../requirement/XpLevelRequirement.java | 4 +- src/main/resources/messages.yml | 4 +- src/main/resources/rankups.yml | 7 +- 12 files changed, 96 insertions(+), 68 deletions(-) create mode 100644 src/main/java/sh/okx/rankup/requirements/requirement/PermissionRequirement.java diff --git a/src/main/java/sh/okx/rankup/Rankup.java b/src/main/java/sh/okx/rankup/Rankup.java index 8e320bc..8473993 100644 --- a/src/main/java/sh/okx/rankup/Rankup.java +++ b/src/main/java/sh/okx/rankup/Rankup.java @@ -37,6 +37,7 @@ import sh.okx.rankup.requirements.operation.NoneOperation; import sh.okx.rankup.requirements.operation.OneOperation; import sh.okx.rankup.requirements.requirement.GroupRequirement; import sh.okx.rankup.requirements.requirement.MoneyRequirement; +import sh.okx.rankup.requirements.requirement.PermissionRequirement; import sh.okx.rankup.requirements.requirement.PlaytimeMinutesRequirement; import sh.okx.rankup.requirements.requirement.XpLevelRequirement; @@ -161,10 +162,11 @@ public class Rankup extends JavaPlugin { } private void registerRequirements() { - requirementRegistry.addRequirement(new MoneyRequirement(this, "money")); - requirementRegistry.addRequirement(new XpLevelRequirement(this, "xp-level")); - requirementRegistry.addRequirement(new PlaytimeMinutesRequirement(this, "playtime-minutes")); - requirementRegistry.addRequirement(new GroupRequirement(this, "group")); + requirementRegistry.addRequirement(new MoneyRequirement(this)); + requirementRegistry.addRequirement(new XpLevelRequirement(this)); + requirementRegistry.addRequirement(new PlaytimeMinutesRequirement(this)); + requirementRegistry.addRequirement(new GroupRequirement(this)); + requirementRegistry.addRequirement(new PermissionRequirement(this)); operationRegistry.addOperation("all", new AllOperation()); operationRegistry.addOperation("none", new NoneOperation()); @@ -215,6 +217,29 @@ public class Rankup extends JavaPlugin { return MessageBuilder.of(messages, message); } + 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); + getMessage(rank, secondsLeft > 1 ? Message.COOLDOWN_PLURAL : Message.COOLDOWN_SINGULAR) + .failIfEmpty() + .replaceRanks(player, rank) + .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()); @@ -269,7 +294,7 @@ public class Rankup extends JavaPlugin { } } getMessage(rank, prestiges == null ? Message.NO_RANKUP : - prestiges.getByPlayer(player).isLast() ? Message.NO_RANKUP : Message.MUST_PRESTIGE) + prestiges.getByPlayer(player).isLast() ? Message.NO_RANKUP : Message.MUST_PRESTIGE) .replaceRanks(player, rank) .send(player); return false; @@ -278,21 +303,8 @@ public class Rankup extends JavaPlugin { .replaceRanks(player, rank, rankups.next(rank)), player, rank) .send(player); return false; - } else if (cooldowns.containsKey(player)) { - long time = System.currentTimeMillis() - cooldowns.get(player); - // if time passed is less than the cooldown - long timeLeft = (config.getInt("cooldown") * 1000) - time; - if (timeLeft > 0) { - long secondsLeft = (long) Math.ceil(timeLeft / 1000f); - getMessage(rank, secondsLeft > 1 ? Message.COOLDOWN_PLURAL : Message.COOLDOWN_SINGULAR) - .failIfEmpty() - .replaceRanks(player, rank) - .replace(Variable.SECONDS, secondsLeft) - .send(player); - return false; - } - // cooldown has expired so remove it - cooldowns.remove(player); + } else if (checkCooldown(player, rank)) { + return false; } return true; @@ -349,22 +361,8 @@ public class Rankup extends JavaPlugin { .replaceFromTo(prestige) .send(player); return false; - } else if (cooldowns.containsKey(player)) { - long time = System.currentTimeMillis() - cooldowns.get(player); - // if time passed is less than the cooldown - long timeLeft = (config.getInt("cooldown") * 1000) - time; - if (timeLeft > 0) { - long secondsLeft = (long) Math.ceil(timeLeft / 1000f); - getMessage(prestige, secondsLeft > 1 ? Message.COOLDOWN_PLURAL : Message.COOLDOWN_SINGULAR) - .failIfEmpty() - .replaceRanks(player, prestige) - .replaceFromTo(prestige) - .replace(Variable.SECONDS, secondsLeft) - .send(player); - return false; - } - // cooldown has expired so remove it - cooldowns.remove(player); + } else if (checkCooldown(player, prestige)) { + return false; } return true; diff --git a/src/main/java/sh/okx/rankup/gui/Gui.java b/src/main/java/sh/okx/rankup/gui/Gui.java index 5c351b6..a98afdd 100644 --- a/src/main/java/sh/okx/rankup/gui/Gui.java +++ b/src/main/java/sh/okx/rankup/gui/Gui.java @@ -40,20 +40,15 @@ public class Gui implements InventoryHolder { addItem(items, config.getConfigurationSection("fill"), player, oldRank, rank); Gui gui = new Gui(); + gui.prestige = oldRank instanceof Prestige; gui.rankup = getItem(config.getConfigurationSection("rankup"), player, oldRank, rank); gui.cancel = getItem(config.getConfigurationSection("cancel"), player, oldRank, rank); - MessageBuilder builder = plugin.getMessage(rank, Message.TITLE) - .replaceRanks(player, oldRank, rank); - if(oldRank instanceof Prestige) { - gui.prestige = true; - builder.replaceFromTo((Prestige) oldRank); - } else { - gui.prestige = false; - } - - - Inventory inventory = Bukkit.createInventory(gui, items.length, builder.toString()); + Inventory inventory = Bukkit.createInventory(gui, items.length, + plugin.getMessage(rank, Message.TITLE) + .replaceRanks(player, oldRank, rank) + .replaceFromTo(oldRank) + .toString()); inventory.setContents(items); gui.inventory = inventory; return gui; diff --git a/src/main/java/sh/okx/rankup/messages/MessageBuilder.java b/src/main/java/sh/okx/rankup/messages/MessageBuilder.java index b1dd208..ce547b2 100644 --- a/src/main/java/sh/okx/rankup/messages/MessageBuilder.java +++ b/src/main/java/sh/okx/rankup/messages/MessageBuilder.java @@ -58,9 +58,12 @@ public class MessageBuilder { return this; } - public MessageBuilder replaceFromTo(Prestige prestige) { - replace(Variable.FROM, prestige.getFrom()); - replace(Variable.TO, prestige.getTo()); + public MessageBuilder replaceFromTo(Rank rank) { + if(rank instanceof Prestige) { + Prestige prestige = (Prestige) rank; + replace(Variable.FROM, prestige.getFrom()); + replace(Variable.TO, prestige.getTo()); + } return this; } diff --git a/src/main/java/sh/okx/rankup/messages/Variable.java b/src/main/java/sh/okx/rankup/messages/Variable.java index cbdcc3e..aba7f6c 100644 --- a/src/main/java/sh/okx/rankup/messages/Variable.java +++ b/src/main/java/sh/okx/rankup/messages/Variable.java @@ -17,7 +17,8 @@ public enum Variable { AMOUNT_NEEDED, PERCENT_DONE, PERCENT_LEFT, - SECONDS; + SECONDS, + SECONDS_LEFT; public String replace(String message, String value, String type) { Pattern pattern = Pattern.compile("\\{" + type + "_" + this + "}", Pattern.CASE_INSENSITIVE); diff --git a/src/main/java/sh/okx/rankup/placeholders/Placeholders.java b/src/main/java/sh/okx/rankup/placeholders/Placeholders.java index 0152134..2425ed1 100644 --- a/src/main/java/sh/okx/rankup/placeholders/Placeholders.java +++ b/src/main/java/sh/okx/rankup/placeholders/Placeholders.java @@ -46,8 +46,12 @@ public class Placeholders extends PlaceholderExpansion { String[] parts = params.split("_", 4); return simpleFormat.format(orElse(rankups.getByName(parts[2]).getRequirement(parts[3]), Requirement::getValueDouble, 0)); } else if (params.startsWith("rank_money_")) { - String[] parts = params.split("_", 3); - return plugin.formatMoney(rankups.getByName(parts[2]).getRequirement("money").getValueDouble()); + String[] parts = params.split("_", 4); + double amount = rankups.getByName(parts[2]).getRequirement("money").getValueDouble(); + if(parts.length > 3 && parts[3].equalsIgnoreCase("left")) { + amount = amount - plugin.getEconomy().getBalance(player); + } + return plugin.formatMoney(Math.max(0, amount)); } switch (params) { diff --git a/src/main/java/sh/okx/rankup/requirements/requirement/GroupRequirement.java b/src/main/java/sh/okx/rankup/requirements/requirement/GroupRequirement.java index a5a7b6c..c30b89b 100644 --- a/src/main/java/sh/okx/rankup/requirements/requirement/GroupRequirement.java +++ b/src/main/java/sh/okx/rankup/requirements/requirement/GroupRequirement.java @@ -5,8 +5,8 @@ import sh.okx.rankup.Rankup; import sh.okx.rankup.requirements.Requirement; public class GroupRequirement extends Requirement { - public GroupRequirement(Rankup plugin, String name) { - super(plugin, name); + public GroupRequirement(Rankup plugin) { + super(plugin, "group"); } protected GroupRequirement(Requirement clone) { diff --git a/src/main/java/sh/okx/rankup/requirements/requirement/MoneyRequirement.java b/src/main/java/sh/okx/rankup/requirements/requirement/MoneyRequirement.java index b6c5c29..8df9312 100644 --- a/src/main/java/sh/okx/rankup/requirements/requirement/MoneyRequirement.java +++ b/src/main/java/sh/okx/rankup/requirements/requirement/MoneyRequirement.java @@ -7,8 +7,8 @@ import sh.okx.rankup.requirements.DeductibleRequirement; import sh.okx.rankup.requirements.Requirement; public class MoneyRequirement extends DeductibleRequirement { - public MoneyRequirement(Rankup plugin, String name) { - super(plugin, name); + public MoneyRequirement(Rankup plugin) { + super(plugin, "money"); } protected MoneyRequirement(Requirement clone) { diff --git a/src/main/java/sh/okx/rankup/requirements/requirement/PermissionRequirement.java b/src/main/java/sh/okx/rankup/requirements/requirement/PermissionRequirement.java new file mode 100644 index 0000000..eee79bb --- /dev/null +++ b/src/main/java/sh/okx/rankup/requirements/requirement/PermissionRequirement.java @@ -0,0 +1,30 @@ +package sh.okx.rankup.requirements.requirement; + +import org.bukkit.entity.Player; +import sh.okx.rankup.Rankup; +import sh.okx.rankup.requirements.Requirement; + +public class PermissionRequirement extends Requirement { + public PermissionRequirement(Rankup plugin) { + super(plugin, "permission"); + } + + protected PermissionRequirement(Requirement clone) { + super(clone); + } + + @Override + public boolean check(Player player) { + for(String permission : getValueString().split(" ")) { + if(!player.hasPermission(permission)) { + return false; + } + } + return true; + } + + @Override + public Requirement clone() { + return new PermissionRequirement(this); + } +} diff --git a/src/main/java/sh/okx/rankup/requirements/requirement/PlaytimeMinutesRequirement.java b/src/main/java/sh/okx/rankup/requirements/requirement/PlaytimeMinutesRequirement.java index b93038d..5bf59b0 100644 --- a/src/main/java/sh/okx/rankup/requirements/requirement/PlaytimeMinutesRequirement.java +++ b/src/main/java/sh/okx/rankup/requirements/requirement/PlaytimeMinutesRequirement.java @@ -9,8 +9,8 @@ public class PlaytimeMinutesRequirement extends Requirement { private static final int TICKS_PER_MINUTE = 20 * 60; private Statistic playOneTick; - public PlaytimeMinutesRequirement(Rankup plugin, String name) { - super(plugin, name); + public PlaytimeMinutesRequirement(Rankup plugin) { + super(plugin, "playtime-minutes"); try { playOneTick = Statistic.valueOf("PLAY_ONE_MINUTE"); } catch (IllegalArgumentException e) { diff --git a/src/main/java/sh/okx/rankup/requirements/requirement/XpLevelRequirement.java b/src/main/java/sh/okx/rankup/requirements/requirement/XpLevelRequirement.java index b2e1945..864309c 100644 --- a/src/main/java/sh/okx/rankup/requirements/requirement/XpLevelRequirement.java +++ b/src/main/java/sh/okx/rankup/requirements/requirement/XpLevelRequirement.java @@ -6,8 +6,8 @@ import sh.okx.rankup.requirements.DeductibleRequirement; import sh.okx.rankup.requirements.Requirement; public class XpLevelRequirement extends DeductibleRequirement { - public XpLevelRequirement(Rankup plugin, String name) { - super(plugin, name); + public XpLevelRequirement(Rankup plugin) { + super(plugin, "xp-level"); } protected XpLevelRequirement(Requirement clone) { diff --git a/src/main/resources/messages.yml b/src/main/resources/messages.yml index cba9d0c..7db23d7 100644 --- a/src/main/resources/messages.yml +++ b/src/main/resources/messages.yml @@ -35,7 +35,7 @@ rankup: footer: '' # sent when a player tries to rankup when they are on cooldown cooldown: - singular: '&cYou must wait {SECONDS} more second to rankup again.' - plural: '&cYou must wait {SECONDS} more seconds to rankup again.' + singular: '&cYou must wait {SECONDS_LEFT} more second to rankup again.' + plural: '&cYou must wait {SECONDS_LEFT} more seconds to rankup again.' not-in-ladder: "&cSorry, but we could not find any rankups for the group(s) you are in." \ No newline at end of file diff --git a/src/main/resources/rankups.yml b/src/main/resources/rankups.yml index 408d6cb..7ba972e 100644 --- a/src/main/resources/rankups.yml +++ b/src/main/resources/rankups.yml @@ -2,16 +2,13 @@ Aexample: # the name of the rank in your permissions plugin rank: 'A' # the next rank a player can rank up to. - # this must be the name of the configuration section. + # this must be the name of the configuration section, not the rank name. # for example, the name of this configuration section is "Aexample". # if this is the last rank, you don't need this. next: 'Bexample' # List of requirements to go to the next rank # (ie, this example will charge 1000 money to rankup from A to B) - # money: money from the server economy - # xp-level: amount of experience levels - # playtime-minutes: minutes a player has played - # group: requires a player to have a certain group - separate by spaces to require multiple. note that the group is not removed. + # https://github.com/okx-code/Rankup3/wiki/Requirements # custom requirements can also be added by other plugins. requirements: money: 1000