diff --git a/build.gradle b/build.gradle index 7cd38bc..33726bd 100644 --- a/build.gradle +++ b/build.gradle @@ -3,7 +3,7 @@ plugins { } group 'sh.okx' -version '3.5.2' +version '3.5.3' repositories { mavenCentral() @@ -30,7 +30,7 @@ dependencies { annotationProcessor 'org.projectlombok:lombok:1.18.6' testCompile group: 'junit', name: 'junit', version: '4.12' - compile 'org.spigotmc:spigot-api:1.13.2-R0.1-SNAPSHOT' + compile 'org.spigotmc:spigot-api:1.12.2-R0.1-SNAPSHOT' compile('net.milkbowl.vault:VaultAPI:1.7') { exclude group: 'org.bukkit' diff --git a/src/main/java/sh/okx/rankup/Rankup.java b/src/main/java/sh/okx/rankup/Rankup.java index e9507bc..b57a7a6 100644 --- a/src/main/java/sh/okx/rankup/Rankup.java +++ b/src/main/java/sh/okx/rankup/Rankup.java @@ -37,7 +37,6 @@ import sh.okx.rankup.requirements.requirement.advancedachievements.AdvancedAchie import sh.okx.rankup.requirements.requirement.advancedachievements.AdvancedAchievementsTotalRequirement; import sh.okx.rankup.requirements.requirement.mcmmo.McMMOPowerLevelRequirement; import sh.okx.rankup.requirements.requirement.mcmmo.McMMOSkillRequirement; -import sh.okx.rankup.requirements.requirement.mcmmo.McMMOSkillUtil; import sh.okx.rankup.requirements.requirement.votingplugin.VotingPluginVotesRequirement; import java.io.File; @@ -185,6 +184,8 @@ public class Rankup extends JavaPlugin { rankups = new Rankups(this, loadConfig("rankups.yml")); if (config.getBoolean("prestige")) { prestiges = new Prestiges(this, loadConfig("prestiges.yml")); + } else { + prestiges = null; } } catch (Exception e) { e.printStackTrace(); @@ -226,7 +227,7 @@ public class Rankup extends JavaPlugin { requirementRegistry.addRequirement(new PermissionRequirement(this)); requirementRegistry.addRequirement(new PlaceholderRequirement(this)); requirementRegistry.addRequirement(new WorldRequirement(this)); - //requirementRegistry.addRequirement(new BlockBreakRequirement(this)); + requirementRegistry.addRequirement(new BlockBreakRequirement(this)); requirementRegistry.addRequirement(new PlayerKillsRequirement(this)); requirementRegistry.addRequirement(new MobKillsRequirement(this)); if (Bukkit.getPluginManager().isPluginEnabled("mcMMO")) { @@ -240,6 +241,10 @@ public class Rankup extends JavaPlugin { if (Bukkit.getPluginManager().isPluginEnabled("VotingPlugin")) { requirementRegistry.addRequirement(new VotingPluginVotesRequirement(this)); } + requirementRegistry.addRequirement(new ItemRequirement(this)); + requirementRegistry.addRequirement(new UseItemRequirement(this)); + requirementRegistry.addRequirement(new TotalMobKillsRequirement(this)); + requirementRegistry.addRequirement(new CraftItemRequirement(this)); } private void setupPermissions() { @@ -480,6 +485,7 @@ public class Rankup extends JavaPlugin { () -> percentFormat.format(Math.max(0, (requirement.getRemaining(player) / requirement.getValueDouble()) * 100))); replaceRequirements(builder, Variable.PERCENT_DONE, requirement, () -> percentFormat.format(Math.min(100, (1 - (requirement.getRemaining(player) / requirement.getValueDouble())) * 100))); + replaceRequirements(builder, Variable.AMOUNT_DONE, requirement, () -> simpleFormat.format(requirement.getValueDouble() - requirement.getRemaining(player))); } } catch (NumberFormatException ignored) { } diff --git a/src/main/java/sh/okx/rankup/messages/Variable.java b/src/main/java/sh/okx/rankup/messages/Variable.java index d1aa49c..c989076 100644 --- a/src/main/java/sh/okx/rankup/messages/Variable.java +++ b/src/main/java/sh/okx/rankup/messages/Variable.java @@ -10,6 +10,7 @@ public enum Variable { MONEY_NEEDED, AMOUNT, AMOUNT_NEEDED, + AMOUNT_DONE, PERCENT_DONE, PERCENT_LEFT, SECONDS, diff --git a/src/main/java/sh/okx/rankup/placeholders/RankupExpansion.java b/src/main/java/sh/okx/rankup/placeholders/RankupExpansion.java index a542067..08f2a4f 100644 --- a/src/main/java/sh/okx/rankup/placeholders/RankupExpansion.java +++ b/src/main/java/sh/okx/rankup/placeholders/RankupExpansion.java @@ -122,6 +122,8 @@ public class RankupExpansion extends PlaceholderExpansion { return orElse(requirement, Requirement::getValueString, "0"); case "left": return placeholders.getSimpleFormat().format(orElse(requirement, r -> r.getRemaining(player), 0)); + case "done": + return placeholders.getSimpleFormat().format(orElse(requirement, r -> r.getValueDouble() - r.getRemaining(player), 0)); case "percent_left": return placeholders.getPercentFormat().format(orElse(requirement, r -> (r.getRemaining(player) / r.getValueDouble()) * 100, 0)); case "percent_done": diff --git a/src/main/java/sh/okx/rankup/ranks/Rank.java b/src/main/java/sh/okx/rankup/ranks/Rank.java index 5cb0e8d..a3b5b89 100644 --- a/src/main/java/sh/okx/rankup/ranks/Rank.java +++ b/src/main/java/sh/okx/rankup/ranks/Rank.java @@ -5,6 +5,7 @@ import lombok.EqualsAndHashCode; import lombok.Getter; import lombok.RequiredArgsConstructor; import lombok.ToString; +import me.clip.placeholderapi.PlaceholderAPI; import org.bukkit.Bukkit; import org.bukkit.configuration.ConfigurationSection; import org.bukkit.entity.Player; @@ -88,8 +89,9 @@ public class Rank { public void runCommands(Player player, String next) { for (String command : commands) { + String string = new MessageBuilder(command).replaceRanks(player, this, next).toString(); Bukkit.dispatchCommand(Bukkit.getConsoleSender(), - new MessageBuilder(command).replaceRanks(player, this, next).toString()); + PlaceholderAPI.setPlaceholders(player, string)); } } } diff --git a/src/main/java/sh/okx/rankup/requirements/DeductibleRequirement.java b/src/main/java/sh/okx/rankup/requirements/DeductibleRequirement.java index f95f2f9..84985df 100644 --- a/src/main/java/sh/okx/rankup/requirements/DeductibleRequirement.java +++ b/src/main/java/sh/okx/rankup/requirements/DeductibleRequirement.java @@ -8,6 +8,10 @@ public abstract class DeductibleRequirement extends ProgressiveRequirement { super(plugin, name); } + public DeductibleRequirement(Rankup plugin, String name, boolean subRequirement) { + super(plugin, name, subRequirement); + } + protected DeductibleRequirement(Requirement clone) { super(clone); } diff --git a/src/main/java/sh/okx/rankup/requirements/Requirement.java b/src/main/java/sh/okx/rankup/requirements/Requirement.java index 568ae02..e2c6730 100644 --- a/src/main/java/sh/okx/rankup/requirements/Requirement.java +++ b/src/main/java/sh/okx/rankup/requirements/Requirement.java @@ -34,6 +34,10 @@ public abstract class Requirement implements Cloneable { public void setValue(String value) { if (hasSubRequirement()) { String[] parts = value.split(" ", 2); + if (parts.length < 2) { + throw new IllegalArgumentException("Amount and sub-requirement not present for requirement '" + getName() + "'. You must use the format '" + getName() + " '"); + } + this.sub = parts[0]; this.value = parts[1]; } else { diff --git a/src/main/java/sh/okx/rankup/requirements/requirement/BlockBreakRequirement.java b/src/main/java/sh/okx/rankup/requirements/requirement/BlockBreakRequirement.java index 8a90668..a82e303 100644 --- a/src/main/java/sh/okx/rankup/requirements/requirement/BlockBreakRequirement.java +++ b/src/main/java/sh/okx/rankup/requirements/requirement/BlockBreakRequirement.java @@ -12,18 +12,17 @@ public class BlockBreakRequirement extends ProgressiveRequirement { super(plugin, "block-break", true); } - @Override - public boolean check(Player player) { - return false; - } - protected BlockBreakRequirement(BlockBreakRequirement clone) { super(clone); } @Override public double getProgress(Player player) { - return player.getStatistic(Statistic.MINE_BLOCK, Material.matchMaterial(getSub())); + Material material = Material.matchMaterial(getSub()); + if (material == null || !material.isBlock()) { + throw new IllegalArgumentException("'" + getSub() + "' is not a valid block"); + } + return player.getStatistic(Statistic.MINE_BLOCK, material); } @Override diff --git a/src/main/java/sh/okx/rankup/requirements/requirement/CraftItemRequirement.java b/src/main/java/sh/okx/rankup/requirements/requirement/CraftItemRequirement.java new file mode 100644 index 0000000..7d8000b --- /dev/null +++ b/src/main/java/sh/okx/rankup/requirements/requirement/CraftItemRequirement.java @@ -0,0 +1,32 @@ +package sh.okx.rankup.requirements.requirement; + +import org.bukkit.Material; +import org.bukkit.Statistic; +import org.bukkit.entity.Player; +import sh.okx.rankup.Rankup; +import sh.okx.rankup.requirements.ProgressiveRequirement; +import sh.okx.rankup.requirements.Requirement; + +public class CraftItemRequirement extends ProgressiveRequirement { + public CraftItemRequirement(Rankup plugin) { + super(plugin, "craft-item", true); + } + + protected CraftItemRequirement(CraftItemRequirement clone) { + super(clone); + } + + @Override + public double getProgress(Player player) { + Material material = Material.matchMaterial(getSub()); + if (material == null) { + throw new IllegalArgumentException("'" + getSub() + "' is not a valid item"); + } + return player.getStatistic(Statistic.CRAFT_ITEM, material); + } + + @Override + public Requirement clone() { + return new CraftItemRequirement(this); + } +} diff --git a/src/main/java/sh/okx/rankup/requirements/requirement/ItemRequirement.java b/src/main/java/sh/okx/rankup/requirements/requirement/ItemRequirement.java new file mode 100644 index 0000000..c28b17a --- /dev/null +++ b/src/main/java/sh/okx/rankup/requirements/requirement/ItemRequirement.java @@ -0,0 +1,42 @@ +package sh.okx.rankup.requirements.requirement; + +import org.bukkit.Material; +import org.bukkit.Statistic; +import org.bukkit.entity.Player; +import org.bukkit.inventory.ItemStack; +import sh.okx.rankup.Rankup; +import sh.okx.rankup.requirements.DeductibleRequirement; +import sh.okx.rankup.requirements.ProgressiveRequirement; +import sh.okx.rankup.requirements.Requirement; + +public class ItemRequirement extends DeductibleRequirement { + public ItemRequirement(Rankup plugin) { + super(plugin, "item", true); + } + + protected ItemRequirement(ItemRequirement clone) { + 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))); + } + + @Override + public Requirement clone() { + return new ItemRequirement(this); + } +} diff --git a/src/main/java/sh/okx/rankup/requirements/requirement/MobKillsRequirement.java b/src/main/java/sh/okx/rankup/requirements/requirement/MobKillsRequirement.java index a7780ee..856dad5 100644 --- a/src/main/java/sh/okx/rankup/requirements/requirement/MobKillsRequirement.java +++ b/src/main/java/sh/okx/rankup/requirements/requirement/MobKillsRequirement.java @@ -7,6 +7,8 @@ import sh.okx.rankup.Rankup; import sh.okx.rankup.requirements.ProgressiveRequirement; import sh.okx.rankup.requirements.Requirement; +import java.util.Objects; + public class MobKillsRequirement extends ProgressiveRequirement { public MobKillsRequirement(Rankup plugin) { super(plugin, "mob-kills", true); @@ -18,7 +20,8 @@ public class MobKillsRequirement extends ProgressiveRequirement { @Override public double getProgress(Player player) { - return player.getStatistic(Statistic.KILL_ENTITY, EntityType.fromName(getSub())); + EntityType entity = Objects.requireNonNull(EntityType.fromName(getSub()), "Invalid entity type '" + getSub() + "' in mob-kills requirement."); + return player.getStatistic(Statistic.KILL_ENTITY, entity); } @Override diff --git a/src/main/java/sh/okx/rankup/requirements/requirement/TotalMobKillsRequirement.java b/src/main/java/sh/okx/rankup/requirements/requirement/TotalMobKillsRequirement.java new file mode 100644 index 0000000..6baea68 --- /dev/null +++ b/src/main/java/sh/okx/rankup/requirements/requirement/TotalMobKillsRequirement.java @@ -0,0 +1,27 @@ +package sh.okx.rankup.requirements.requirement; + +import org.bukkit.Statistic; +import org.bukkit.entity.Player; +import sh.okx.rankup.Rankup; +import sh.okx.rankup.requirements.ProgressiveRequirement; +import sh.okx.rankup.requirements.Requirement; + +public class TotalMobKillsRequirement extends ProgressiveRequirement { + public TotalMobKillsRequirement(Rankup plugin) { + super(plugin, "total-mob-kills"); + } + + protected TotalMobKillsRequirement(Requirement clone) { + super(clone); + } + + @Override + public double getProgress(Player player) { + return player.getStatistic(Statistic.MOB_KILLS); + } + + @Override + public Requirement clone() { + return new TotalMobKillsRequirement(this); + } +} diff --git a/src/main/java/sh/okx/rankup/requirements/requirement/UseItemRequirement.java b/src/main/java/sh/okx/rankup/requirements/requirement/UseItemRequirement.java new file mode 100644 index 0000000..bcd8782 --- /dev/null +++ b/src/main/java/sh/okx/rankup/requirements/requirement/UseItemRequirement.java @@ -0,0 +1,32 @@ +package sh.okx.rankup.requirements.requirement; + +import org.bukkit.Material; +import org.bukkit.Statistic; +import org.bukkit.entity.Player; +import sh.okx.rankup.Rankup; +import sh.okx.rankup.requirements.ProgressiveRequirement; +import sh.okx.rankup.requirements.Requirement; + +public class UseItemRequirement extends ProgressiveRequirement { + public UseItemRequirement(Rankup plugin) { + super(plugin, "use-item", true); + } + + protected UseItemRequirement(UseItemRequirement clone) { + super(clone); + } + + @Override + public double getProgress(Player player) { + Material material = Material.matchMaterial(getSub()); + if (material == null) { + throw new IllegalArgumentException("'" + getSub() + "' is not a valid item"); + } + return player.getStatistic(Statistic.USE_ITEM, material); + } + + @Override + public Requirement clone() { + return new UseItemRequirement(this); + } +} diff --git a/src/main/resources/plugin.yml b/src/main/resources/plugin.yml index ff50e2b..072e210 100644 --- a/src/main/resources/plugin.yml +++ b/src/main/resources/plugin.yml @@ -1,5 +1,5 @@ name: Rankup -version: 3.5.2 +version: 3.5.3 main: sh.okx.rankup.Rankup author: Okx depend: [Vault]