From 46f2fecd7d72948f6f846f224b5daa32687f105b Mon Sep 17 00:00:00 2001 From: Josh Roy <10731363+JRoy@users.noreply.github.com> Date: Mon, 31 Mar 2025 08:43:51 -0400 Subject: [PATCH 1/2] Fix further trade sign validation mismatches --- .../earth2me/essentials/signs/SignTrade.java | 49 +++++++++++++------ 1 file changed, 34 insertions(+), 15 deletions(-) diff --git a/Essentials/src/main/java/com/earth2me/essentials/signs/SignTrade.java b/Essentials/src/main/java/com/earth2me/essentials/signs/SignTrade.java index f773eb2940f..1f1012ef310 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/signs/SignTrade.java +++ b/Essentials/src/main/java/com/earth2me/essentials/signs/SignTrade.java @@ -16,7 +16,6 @@ import java.math.BigDecimal; import java.util.Map; -//TODO: TL exceptions public class SignTrade extends EssentialsSign { private static final int MAX_STOCK_LINE_LENGTH = 15; @@ -67,6 +66,11 @@ protected boolean onSignInteract(final ISign sign, final User player, final Stri final Trade charge = getTrade(sign, 1, AmountType.COST, false, true, ess); final Trade trade = getTrade(sign, 2, AmountType.COST, true, true, ess); charge.isAffordableFor(player); + + // validate addAmount + subtractAmount first to ensure they both do not throw exceptions + addAmount(sign, 1, charge, ess, true); + subtractAmount(sign, 2, trade, ess, true); + addAmount(sign, 1, charge, ess); subtractAmount(sign, 2, trade, ess); if (!trade.pay(player)) { @@ -268,37 +272,44 @@ protected final Trade getTrade(final ISign sign, final int index, final AmountTy } protected final void subtractAmount(final ISign sign, final int index, final Trade trade, final IEssentials ess) throws SignException { + subtractAmount(sign, index, trade, ess, false); + } + + protected final void subtractAmount(final ISign sign, final int index, final Trade trade, final IEssentials ess, final boolean validationRun) throws SignException { final BigDecimal money = trade.getMoney(); if (money != null) { - changeAmount(sign, index, money.negate(), ess); + changeAmount(sign, index, money.negate(), ess, validationRun); } final ItemStack item = trade.getItemStack(); if (item != null) { - changeAmount(sign, index, BigDecimal.valueOf(-item.getAmount()), ess); + changeAmount(sign, index, BigDecimal.valueOf(-item.getAmount()), ess, validationRun); } final Integer exp = trade.getExperience(); if (exp != null) { - changeAmount(sign, index, BigDecimal.valueOf(-exp), ess); + changeAmount(sign, index, BigDecimal.valueOf(-exp), ess, validationRun); } } protected final void addAmount(final ISign sign, final int index, final Trade trade, final IEssentials ess) throws SignException { + addAmount(sign, index, trade, ess, false); + } + + protected final void addAmount(final ISign sign, final int index, final Trade trade, final IEssentials ess, final boolean validationRun) throws SignException { final BigDecimal money = trade.getMoney(); if (money != null) { - changeAmount(sign, index, money, ess); + changeAmount(sign, index, money, ess, validationRun); } final ItemStack item = trade.getItemStack(); if (item != null) { - changeAmount(sign, index, BigDecimal.valueOf(item.getAmount()), ess); + changeAmount(sign, index, BigDecimal.valueOf(item.getAmount()), ess, validationRun); } final Integer exp = trade.getExperience(); if (exp != null) { - changeAmount(sign, index, BigDecimal.valueOf(exp), ess); + changeAmount(sign, index, BigDecimal.valueOf(exp), ess, validationRun); } } - //TODO: Translate these exceptions. - private void changeAmount(final ISign sign, final int index, final BigDecimal value, final IEssentials ess) throws SignException { + private void changeAmount(final ISign sign, final int index, final BigDecimal value, final IEssentials ess, final boolean validationRun) throws SignException { final String line = sign.getLine(index).trim(); if (line.isEmpty()) { throw new SignException("emptySignLine", index + 1); @@ -307,20 +318,22 @@ private void changeAmount(final ISign sign, final int index, final BigDecimal va if (split.length == 2) { final BigDecimal amount = getBigDecimal(split[1], ess).add(value); - setAmount(sign, index, amount, ess); + setAmount(sign, index, amount, ess, validationRun); return; } if (split.length == 3) { final BigDecimal amount = getBigDecimal(split[2], ess).add(value); - setAmount(sign, index, amount, ess); + setAmount(sign, index, amount, ess, validationRun); return; } throw new SignException("invalidSignLine", index + 1); } - //TODO: Translate these exceptions. private void setAmount(final ISign sign, final int index, final BigDecimal value, final IEssentials ess) throws SignException { + setAmount(sign, index, value, ess, false); + } + private void setAmount(final ISign sign, final int index, final BigDecimal value, final IEssentials ess, final boolean validationRun) throws SignException { final String line = sign.getLine(index).trim(); if (line.isEmpty()) { throw new SignException("emptySignLine", index + 1); @@ -333,7 +346,9 @@ private void setAmount(final ISign sign, final int index, final BigDecimal value if (money != null && amount != null) { final String newline = NumberUtil.shortCurrency(money, ess) + ":" + NumberUtil.formatAsCurrency(value); validateSignLength(newline); - sign.setLine(index, newline); + if (!validationRun) { + sign.setLine(index, newline); + } return; } } @@ -343,12 +358,16 @@ private void setAmount(final ISign sign, final int index, final BigDecimal value if (split[1].equalsIgnoreCase("exp") || split[1].equalsIgnoreCase("xp")) { final String newline = stackAmount + " " + split[1] + ":" + value.intValueExact(); validateSignLength(newline); - sign.setLine(index, newline); + if (!validationRun) { + sign.setLine(index, newline); + } } else { getItemStack(split[1], stackAmount, ess); final String newline = stackAmount + " " + split[1] + ":" + value.intValueExact(); validateSignLength(newline); - sign.setLine(index, newline); + if (!validationRun) { + sign.setLine(index, newline); + } } return; } From 99bf4449550a680c24172c751ac29e1f5af13e3a Mon Sep 17 00:00:00 2001 From: Josh Roy <10731363+JRoy@users.noreply.github.com> Date: Mon, 31 Mar 2025 13:40:25 -0400 Subject: [PATCH 2/2] remove overflows --- .../earth2me/essentials/signs/SignTrade.java | 30 ++++++------------- 1 file changed, 9 insertions(+), 21 deletions(-) diff --git a/Essentials/src/main/java/com/earth2me/essentials/signs/SignTrade.java b/Essentials/src/main/java/com/earth2me/essentials/signs/SignTrade.java index 1f1012ef310..f5fe53b7c09 100644 --- a/Essentials/src/main/java/com/earth2me/essentials/signs/SignTrade.java +++ b/Essentials/src/main/java/com/earth2me/essentials/signs/SignTrade.java @@ -46,14 +46,14 @@ protected boolean onSignInteract(final ISign sign, final User player, final Stri final Trade stored; try { stored = getTrade(sign, 1, AmountType.TOTAL, true, true, ess); - subtractAmount(sign, 1, stored, ess); + subtractAmount(sign, 1, stored, ess, false); final Map withdraw = stored.pay(player, OverflowType.RETURN); if (withdraw == null) { Trade.log("Sign", "Trade", "Withdraw", username, store, username, null, sign.getBlock().getLocation(), player.getMoney(), ess); } else { - setAmount(sign, 1, BigDecimal.valueOf(withdraw.get(0).getAmount()), ess); + setAmount(sign, 1, BigDecimal.valueOf(withdraw.get(0).getAmount()), ess, false); Trade.log("Sign", "Trade", "Withdraw", username, stored, username, new Trade(withdraw.get(0), ess), sign.getBlock().getLocation(), player.getMoney(), ess); } } catch (final SignException e) { @@ -71,11 +71,11 @@ protected boolean onSignInteract(final ISign sign, final User player, final Stri addAmount(sign, 1, charge, ess, true); subtractAmount(sign, 2, trade, ess, true); - addAmount(sign, 1, charge, ess); - subtractAmount(sign, 2, trade, ess); + addAmount(sign, 1, charge, ess, false); + subtractAmount(sign, 2, trade, ess, false); if (!trade.pay(player)) { - subtractAmount(sign, 1, charge, ess); - addAmount(sign, 2, trade, ess); + subtractAmount(sign, 1, charge, ess, false); + addAmount(sign, 2, trade, ess, false); throw new ChargeException("inventoryFull"); } charge.charge(player); @@ -97,7 +97,7 @@ private Trade rechargeSign(final ISign sign, final IEssentials ess, final User p stack = stack.clone(); stack.setAmount(amount); final Trade store = new Trade(stack, ess); - addAmount(sign, 2, store, ess); + addAmount(sign, 2, store, ess, false); store.charge(player); return store; } @@ -131,10 +131,10 @@ protected boolean onSignBreak(final ISign sign, final User player, final String return true; } - setAmount(sign, 1, BigDecimal.valueOf(withdraw1 == null ? 0L : withdraw1.get(0).getAmount()), ess); + setAmount(sign, 1, BigDecimal.valueOf(withdraw1 == null ? 0L : withdraw1.get(0).getAmount()), ess, false); Trade.log("Sign", "Trade", "Withdraw", signOwner.substring(2), stored1, username, withdraw1 == null ? null : new Trade(withdraw1.get(0), ess), sign.getBlock().getLocation(), player.getMoney(), ess); - setAmount(sign, 2, BigDecimal.valueOf(withdraw2 == null ? 0L : withdraw2.get(0).getAmount()), ess); + setAmount(sign, 2, BigDecimal.valueOf(withdraw2 == null ? 0L : withdraw2.get(0).getAmount()), ess, false); Trade.log("Sign", "Trade", "Withdraw", signOwner.substring(2), stored2, username, withdraw2 == null ? null : new Trade(withdraw2.get(0), ess), sign.getBlock().getLocation(), player.getMoney(), ess); sign.updateSign(); @@ -271,10 +271,6 @@ protected final Trade getTrade(final ISign sign, final int index, final AmountTy throw new SignException("invalidSignLine", index + 1); } - protected final void subtractAmount(final ISign sign, final int index, final Trade trade, final IEssentials ess) throws SignException { - subtractAmount(sign, index, trade, ess, false); - } - protected final void subtractAmount(final ISign sign, final int index, final Trade trade, final IEssentials ess, final boolean validationRun) throws SignException { final BigDecimal money = trade.getMoney(); if (money != null) { @@ -290,10 +286,6 @@ protected final void subtractAmount(final ISign sign, final int index, final Tra } } - protected final void addAmount(final ISign sign, final int index, final Trade trade, final IEssentials ess) throws SignException { - addAmount(sign, index, trade, ess, false); - } - protected final void addAmount(final ISign sign, final int index, final Trade trade, final IEssentials ess, final boolean validationRun) throws SignException { final BigDecimal money = trade.getMoney(); if (money != null) { @@ -329,10 +321,6 @@ private void changeAmount(final ISign sign, final int index, final BigDecimal va throw new SignException("invalidSignLine", index + 1); } - private void setAmount(final ISign sign, final int index, final BigDecimal value, final IEssentials ess) throws SignException { - setAmount(sign, index, value, ess, false); - } - private void setAmount(final ISign sign, final int index, final BigDecimal value, final IEssentials ess, final boolean validationRun) throws SignException { final String line = sign.getLine(index).trim(); if (line.isEmpty()) {