Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -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'
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -21,21 +24,24 @@ public class EconomyHook extends VaultHook {
private static final DecimalFormat FIXED_FORMAT = new DecimalFormat("#");
private static final Map<Integer, DecimalFormat> DECIMAL_FORMATS_CACHE = new HashMap<>();

private final NavigableMap<Long, String> suffixes = new TreeMap<>();
private final NavigableMap<BigInteger, String> 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) {
Expand All @@ -59,26 +65,24 @@ private double getBalance(@NotNull final OfflinePlayer player) {
* @return balance formatted
* @author <a href="https://stackoverflow.com/users/829571/assylias">assylias</a> (<a href="https://stackoverflow.com/a/30661479/11496439">source</a>)
*/
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<BigInteger, String> e = suffixes.floorEntry(intPart);

if (e == null) {
return balance.stripTrailingZeros().toPlainString();
}

final Map.Entry<Long, String> 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
Expand All @@ -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);
Expand All @@ -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:
Expand Down
Original file line number Diff line number Diff line change
@@ -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));
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,9 @@ public Map<String, Object> 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();
}

Expand Down