diff --git a/build.gradle b/build.gradle index edb5a52..d188b4b 100644 --- a/build.gradle +++ b/build.gradle @@ -24,7 +24,7 @@ repositories { dependencies { compileOnly 'org.spigotmc:spigot-api:1.16.3-R0.1-SNAPSHOT' - compileOnly 'me.clip:placeholderapi:2.11.1' + compileOnly 'me.clip:placeholderapi:2.11.6' compileOnly 'org.jetbrains:annotations:23.0.0' compileOnly 'com.github.MilkBowl:VaultAPI:1.7' } diff --git a/src/main/java/at/helpch/placeholderapi/expansion/vault/EconomyHook.java b/src/main/java/at/helpch/placeholderapi/expansion/vault/EconomyHook.java index 95c6ad0..8169ac6 100644 --- a/src/main/java/at/helpch/placeholderapi/expansion/vault/EconomyHook.java +++ b/src/main/java/at/helpch/placeholderapi/expansion/vault/EconomyHook.java @@ -6,6 +6,9 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import java.math.BigDecimal; +import java.math.BigInteger; +import java.math.RoundingMode; import java.text.DecimalFormat; import java.util.HashMap; import java.util.Map; @@ -21,21 +24,24 @@ public class EconomyHook extends VaultHook { private static final DecimalFormat FIXED_FORMAT = new DecimalFormat("#"); private static final Map DECIMAL_FORMATS_CACHE = new HashMap<>(); - private final NavigableMap suffixes = new TreeMap<>(); + private final NavigableMap suffixes = new TreeMap<>(); private Economy economy; public EconomyHook(VaultExpansion expansion) { super(expansion); - suffixes.put(1_000L, expansion.getString("formatting.thousands", "K")); - suffixes.put(1_000_000L, expansion.getString("formatting.millions", "M")); - suffixes.put(1_000_000_000L, expansion.getString("formatting.billions", "B")); - suffixes.put(1_000_000_000_000L, expansion.getString("formatting.trillions", "T")); - suffixes.put(1_000_000_000_000_000L, expansion.getString("formatting.quadrillions", "Q")); + suffixes.put(IntegerUtil.getBigInteger("1_000"), expansion.getString("formatting.thousands", "K")); + suffixes.put(IntegerUtil.getBigInteger("1_000_000"), expansion.getString("formatting.millions", "M")); + suffixes.put(IntegerUtil.getBigInteger("1_000_000_000"), expansion.getString("formatting.billions", "B")); + suffixes.put(IntegerUtil.getBigInteger("1_000_000_000_000"), expansion.getString("formatting.trillions", "T")); + suffixes.put(IntegerUtil.getBigInteger("1_000_000_000_000_000"), expansion.getString("formatting.quadrillions", "Q")); + suffixes.put(IntegerUtil.getBigInteger("1_000_000_000_000_000_000"), expansion.getString("formatting.quintillion", "Qi")); + suffixes.put(IntegerUtil.getBigInteger("1_000_000_000_000_000_000_000"), expansion.getString("formatting.sextillion", "Sx")); + suffixes.put(IntegerUtil.getBigInteger("1_000_000_000_000_000_000_000_000"), expansion.getString("formatting.septillion", "Sp")); setup(); } - private double getBalance(@NotNull final OfflinePlayer player) { - return economy.getBalance(player); + private BigDecimal getBalance(@NotNull final OfflinePlayer player) { + return IntegerUtil.getBigDecimal(economy.getBalance(player)); } private @NotNull String setDecimalPoints(double balance, int points) { @@ -59,26 +65,24 @@ private double getBalance(@NotNull final OfflinePlayer player) { * @return balance formatted * @author assylias (source) */ - private @NotNull String formatBalance(long balance) { - //Long.MIN_VALUE == -Long.MIN_VALUE, so we need an adjustment here - if (balance == Long.MIN_VALUE) { - return formatBalance(Long.MIN_VALUE + 1); - } - if (balance < 0) { - return "-" + formatBalance(-balance); + private @NotNull String formatBalance(BigDecimal balance) { + if (balance.compareTo(BigDecimal.ZERO) == 0) { + return "0"; } - if (balance < 1000) { - return Long.toString(balance); //deal with easy case + BigInteger intPart = new BigInteger(balance.toPlainString().split("\\.")[0]); + Map.Entry e = suffixes.floorEntry(intPart); + + if (e == null) { + return balance.stripTrailingZeros().toPlainString(); } - final Map.Entry e = suffixes.floorEntry(balance); - final Long divideBy = e.getKey(); - final String suffix = e.getValue(); + BigDecimal divideBy = new BigDecimal(e.getKey()); + String suffix = e.getValue(); - long truncated = balance / (divideBy / 10); //the number part of the output times 10 - boolean hasDecimal = truncated < 100 && (truncated / 10d) != (truncated / 10); - return hasDecimal ? (truncated / 10d) + suffix : (truncated / 10) + suffix; + BigDecimal result = balance.divide(divideBy, 3, RoundingMode.DOWN).stripTrailingZeros(); + + return result.toPlainString() + suffix; } @Override @@ -98,7 +102,7 @@ public boolean isReady() { return ""; } - final double balance = getBalance(offlinePlayer); + final BigDecimal balance = getBalance(offlinePlayer); if (params.startsWith("balance_")) { final Matcher matcher = BALANCE_DECIMAL_POINTS_PATTERN.matcher(params); @@ -110,17 +114,18 @@ public boolean isReady() { return matcher.group("points") + " is not a valid number"; } - return setDecimalPoints(balance, points); + return setDecimalPoints(balance.doubleValue(), points); } } switch (params) { case "balance": - return setDecimalPoints(balance, Math.max(2, economy.fractionalDigits())); + return setDecimalPoints(balance.doubleValue(), Math.max(2, economy.fractionalDigits())); case "balance_fixed": return FIXED_FORMAT.format(balance); - case "balance_formatted": - return formatBalance((long) balance); + case "balance_formatted": { + return formatBalance(balance); + } case "balance_commas": return COMMAS_FORMAT.format(balance); default: diff --git a/src/main/java/at/helpch/placeholderapi/expansion/vault/IntegerUtil.java b/src/main/java/at/helpch/placeholderapi/expansion/vault/IntegerUtil.java new file mode 100644 index 0000000..6584809 --- /dev/null +++ b/src/main/java/at/helpch/placeholderapi/expansion/vault/IntegerUtil.java @@ -0,0 +1,17 @@ +package at.helpch.placeholderapi.expansion.vault; + +import org.jetbrains.annotations.NotNull; + +import java.math.BigDecimal; +import java.math.BigInteger; + +public class IntegerUtil { + + public static BigInteger getBigInteger(@NotNull String number) { + return new BigInteger(number.replaceAll("_", "")); + } + + public static BigDecimal getBigDecimal(double number) { + return new BigDecimal(Double.toString(number)); + } +} diff --git a/src/main/java/at/helpch/placeholderapi/expansion/vault/VaultExpansion.java b/src/main/java/at/helpch/placeholderapi/expansion/vault/VaultExpansion.java index 7badbd1..3aad9d1 100644 --- a/src/main/java/at/helpch/placeholderapi/expansion/vault/VaultExpansion.java +++ b/src/main/java/at/helpch/placeholderapi/expansion/vault/VaultExpansion.java @@ -49,6 +49,9 @@ public Map getDefaults() { .put("formatting.billions", "B") .put("formatting.trillions", "T") .put("formatting.quadrillions", "Q") + .put("formatting.quintillion", "Qi") + .put("formatting.sextillion", "Sx") + .put("formatting.septillion", "Sp") .build(); }