diff --git a/src/main/java/sh/okx/rankup/Rankup.java b/src/main/java/sh/okx/rankup/Rankup.java index e6e95a7..933bd38 100644 --- a/src/main/java/sh/okx/rankup/Rankup.java +++ b/src/main/java/sh/okx/rankup/Rankup.java @@ -244,6 +244,7 @@ public class Rankup extends JavaPlugin { saveLocale("pt-br"); saveLocale("ru"); saveLocale("zh_CN"); + saveLocale("fr"); } private void saveLocale(String locale) { @@ -385,15 +386,15 @@ public class Rankup extends JavaPlugin { DecimalFormat percentFormat = placeholders.getPercentFormat(); for (Requirement requirement : rank.getRequirements()) { try { - replaceRequirements(builder, Variable.AMOUNT, requirement, () -> simpleFormat.format(requirement.getValueDouble())); + replaceRequirements(builder, Variable.AMOUNT, requirement, () -> simpleFormat.format(requirement.getTotal(player))); if (rank.isIn(player)) { replaceRequirements(builder, Variable.AMOUNT_NEEDED, requirement, () -> simpleFormat.format(requirement.getRemaining(player))); replaceRequirements(builder, Variable.PERCENT_LEFT, requirement, - () -> percentFormat.format(Math.max(0, (requirement.getRemaining(player) / requirement.getValueDouble()) * 100))); + () -> percentFormat.format(Math.max(0, (requirement.getRemaining(player) / requirement.getTotal(player)) * 100))); replaceRequirements(builder, Variable.PERCENT_DONE, requirement, - () -> percentFormat.format(Math.min(100, (1 - (requirement.getRemaining(player) / requirement.getValueDouble())) * 100))); + () -> percentFormat.format(Math.min(100, (1 - (requirement.getRemaining(player) / requirement.getTotal(player))) * 100))); replaceRequirements(builder, Variable.AMOUNT_DONE, requirement, - () -> simpleFormat.format(requirement.getValueDouble() - requirement.getRemaining(player))); + () -> simpleFormat.format(requirement.getTotal(player) - requirement.getRemaining(player))); } } catch (NumberFormatException ignored) { } @@ -402,7 +403,13 @@ public class Rankup extends JavaPlugin { } private void replaceRequirements(MessageBuilder builder, Variable variable, Requirement requirement, Supplier value) { - builder.replace(variable + " " + requirement.getFullName(), value.get()); + Object get; + try { + get = value.get(); + builder.replace(variable + " " + requirement.getFullName(), value.get()); + } catch (Exception e) { + e.printStackTrace(); + } } public MessageBuilder getMessage(CommandSender player, Message message, Rank oldRank, String rankName) { diff --git a/src/main/java/sh/okx/rankup/placeholders/RankupExpansion.java b/src/main/java/sh/okx/rankup/placeholders/RankupExpansion.java index c3b485c..1f156b1 100644 --- a/src/main/java/sh/okx/rankup/placeholders/RankupExpansion.java +++ b/src/main/java/sh/okx/rankup/placeholders/RankupExpansion.java @@ -37,7 +37,7 @@ public class RankupExpansion extends PlaceholderExpansion { if (params.startsWith("requirement_")) { String[] parts = params.split("_", 3); return getPlaceholderRequirement(player, rank, - parts[1], parts.length > 2 ? parts[2] : ""); + parts[1].replace("-", "_"), parts.length > 2 ? parts[2] : ""); } else if (params.startsWith("rank_requirement_")) { String[] parts = params.split("_", 5); return getPlaceholderRequirement(player, rankups.getByName(parts[2]), diff --git a/src/main/java/sh/okx/rankup/ranks/Rank.java b/src/main/java/sh/okx/rankup/ranks/Rank.java index 83e2056..6169d4c 100644 --- a/src/main/java/sh/okx/rankup/ranks/Rank.java +++ b/src/main/java/sh/okx/rankup/ranks/Rank.java @@ -68,11 +68,7 @@ public class Rank { public Requirement getRequirement(String name) { for (Requirement requirement : requirements) { - String reqName = requirement.getName(); - if (requirement.hasSubRequirement()) { - reqName += "#" + requirement.getSub(); - } - if (reqName.equalsIgnoreCase(name)) { + if (requirement.getFullName().equalsIgnoreCase(name)) { return requirement; } } diff --git a/src/main/java/sh/okx/rankup/requirements/ProgressiveRequirement.java b/src/main/java/sh/okx/rankup/requirements/ProgressiveRequirement.java index 831140b..7ed447e 100644 --- a/src/main/java/sh/okx/rankup/requirements/ProgressiveRequirement.java +++ b/src/main/java/sh/okx/rankup/requirements/ProgressiveRequirement.java @@ -19,7 +19,7 @@ public abstract class ProgressiveRequirement extends Requirement { @Override public boolean check(Player player) { - return getRemaining(player) == 0; + return getRemaining(player) <= 0; } @Override @@ -28,7 +28,7 @@ public abstract class ProgressiveRequirement extends Requirement { } public double getRemaining(Player player, double multiplier) { - return Math.max(0, (multiplier * getValueDouble()) - getProgress(player)); + return Math.max(0, (multiplier * getTotal(player)) - getProgress(player)); } public abstract double getProgress(Player player); diff --git a/src/main/java/sh/okx/rankup/requirements/Requirement.java b/src/main/java/sh/okx/rankup/requirements/Requirement.java index d225331..593774a 100644 --- a/src/main/java/sh/okx/rankup/requirements/Requirement.java +++ b/src/main/java/sh/okx/rankup/requirements/Requirement.java @@ -97,4 +97,8 @@ public abstract class Requirement implements Cloneable { } public abstract Requirement clone(); + + public double getTotal(Player player) { + return getValueDouble(); + } } diff --git a/src/main/java/sh/okx/rankup/requirements/requirement/PlaceholderRequirement.java b/src/main/java/sh/okx/rankup/requirements/requirement/PlaceholderRequirement.java index 7853cdd..8f4185d 100644 --- a/src/main/java/sh/okx/rankup/requirements/requirement/PlaceholderRequirement.java +++ b/src/main/java/sh/okx/rankup/requirements/requirement/PlaceholderRequirement.java @@ -3,9 +3,13 @@ package sh.okx.rankup.requirements.requirement; import me.clip.placeholderapi.PlaceholderAPI; import org.bukkit.entity.Player; import sh.okx.rankup.Rankup; +import sh.okx.rankup.requirements.ProgressiveRequirement; import sh.okx.rankup.requirements.Requirement; -public class PlaceholderRequirement extends Requirement { +public class PlaceholderRequirement extends ProgressiveRequirement { + + public static final double DELTA = 0.00001D; + public PlaceholderRequirement(Rankup plugin) { super(plugin, "placeholder"); } @@ -15,20 +19,15 @@ public class PlaceholderRequirement extends Requirement { } @Override - public boolean check(Player player) { - String[] parts = getValueString().split(" "); - String parsed = PlaceholderAPI.setPlaceholders(player, parts[0]); - if (!PlaceholderAPI.containsPlaceholders(parts[0]) || parsed.equals(parts[0])) { - throw new IllegalArgumentException(parts[0] + " is not a PlaceholderAPI placeholder!"); - } else if (parts.length < 3) { - throw new IllegalArgumentException("Placeholder requirements must be in the form %placeholder% string"); - } + public double getProgress(Player player) { + String[] parts = getParts(player); + String parsed = parts[0]; String value = parts[2]; // string operations switch (parts[1]) { case "=": - return parsed.equals(value); + return parsed.equals(value) ? 1 : 0; } // numeric operations @@ -36,23 +35,52 @@ public class PlaceholderRequirement extends Requirement { double v = Double.parseDouble(value); switch (parts[1]) { case ">": - return p > v; + return p > v ? v : 0; case ">=": - return p >= v; + return Math.min(p, v); case "<": - return p < v; + return p < v ? v : 0; case "<=": - return p <= v; + return p <= v ? 1 : 0; case "==": - return p == v; + return p == v ? v : 0; } throw new IllegalArgumentException("Invalid operation: " + parts[1]); } + @Override + public double getTotal(Player player) { + String[] parts = getParts(player); + + if (parts[1].equalsIgnoreCase("=")) { + return 1; + } else { + return Double.parseDouble(parts[2]); + } + } + + private String[] getParts(Player player) { + String[] parts = getValueString().split(" "); + if (parts.length < 3) { + throw new IllegalArgumentException("Placeholder requirements must be in the form %placeholder% string"); + } + String parsed = PlaceholderAPI.setPlaceholders(player, parts[0]); + if (!PlaceholderAPI.containsPlaceholders(parts[0]) || parsed.equals(parts[0])) { + throw new IllegalArgumentException(parts[0] + " is not a PlaceholderAPI placeholder!"); + } + parts[0] = parsed; + return parts; + } + @Override public String getFullName() { String[] parts = getValueString().split(" "); - return parts[0]; + return name + "#" + parts[0].replace("%", ""); + } + + @Override + public boolean check(Player player) { + return getRemaining(player) <= 0; } @Override