From 49ee0c503fffbbdf3053432f0191e1b0684e3957 Mon Sep 17 00:00:00 2001 From: Hedzer Kuijlman Date: Tue, 22 Apr 2025 16:34:22 +0200 Subject: [PATCH] Fixed Chat Calc --- .../mixin/PlayerManagerMixin.java | 48 ++--------------- .../hak/survivalfabric/utils/MathUtils.java | 52 +++++++++++++++++++ 2 files changed, 55 insertions(+), 45 deletions(-) create mode 100644 src/main/java/wtf/hak/survivalfabric/utils/MathUtils.java diff --git a/src/main/java/wtf/hak/survivalfabric/mixin/PlayerManagerMixin.java b/src/main/java/wtf/hak/survivalfabric/mixin/PlayerManagerMixin.java index b683469..2067bbe 100644 --- a/src/main/java/wtf/hak/survivalfabric/mixin/PlayerManagerMixin.java +++ b/src/main/java/wtf/hak/survivalfabric/mixin/PlayerManagerMixin.java @@ -15,6 +15,7 @@ import org.spongepowered.asm.mixin.injection.ModifyArg; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import wtf.hak.survivalfabric.commands.SpectatorCommand; import wtf.hak.survivalfabric.config.ConfigManager; +import wtf.hak.survivalfabric.utils.MathUtils; import java.util.Set; @@ -56,10 +57,10 @@ public abstract class PlayerManagerMixin { String processedMessage = rawMessage; - if (isCalcEnabled) { + if (isCalcEnabled && MathUtils.hasSupportedOperator(rawMessage)) { String expression = rawMessage.endsWith("=") ? rawMessage.substring(0, rawMessage.length() - 1).trim() : rawMessage; try { - String result = String.valueOf(evaluateExpression(expression)); + String result = String.valueOf(MathUtils.evaluateExpression(expression)); StringBuilder sb = new StringBuilder(rawMessage).append("ยง6"); if (rawMessage.contains(" ")) sb.append(" "); @@ -83,47 +84,4 @@ public abstract class PlayerManagerMixin { } } - - private double evaluateExpression(String expression) { - return evaluate(expression.replaceAll("\\s", ""), new int[]{0}); - } - - private double evaluate(String expr, int[] index) { - double value = parseTerm(expr, index); - while (index[0] < expr.length()) { - char op = expr.charAt(index[0]); - if (op != '+' && op != '-') break; - index[0]++; - double nextTerm = parseTerm(expr, index); - value = (op == '+') ? value + nextTerm : value - nextTerm; - } - return value; - } - - private double parseTerm(String expr, int[] index) { - double value = parseFactor(expr, index); - while (index[0] < expr.length()) { - char op = expr.charAt(index[0]); - if (op != '*' && op != '/') break; - index[0]++; - double nextFactor = parseFactor(expr, index); - value = (op == '*') ? value * nextFactor : value / nextFactor; - } - return value; - } - - private double parseFactor(String expr, int[] index) { - if (expr.charAt(index[0]) == '(') { - index[0]++; - double value = evaluate(expr, index); - index[0]++; // Skip closing ')' - return value; - } - - int start = index[0]; - while (index[0] < expr.length() && (Character.isDigit(expr.charAt(index[0])) || expr.charAt(index[0]) == '.')) { - index[0]++; - } - return Double.parseDouble(expr.substring(start, index[0])); - } } diff --git a/src/main/java/wtf/hak/survivalfabric/utils/MathUtils.java b/src/main/java/wtf/hak/survivalfabric/utils/MathUtils.java new file mode 100644 index 0000000..b8018c6 --- /dev/null +++ b/src/main/java/wtf/hak/survivalfabric/utils/MathUtils.java @@ -0,0 +1,52 @@ +package wtf.hak.survivalfabric.utils; + +public class MathUtils { + + + public static boolean hasSupportedOperator(String msg) { + return msg.contains("+") || msg.contains("-") || msg.contains("*") || msg.contains("/"); + } + + public static double evaluateExpression(String expression) { + return evaluate(expression.replaceAll("\\s", ""), new int[]{0}); + } + + public static double evaluate(String expr, int[] index) { + double value = parseTerm(expr, index); + while (index[0] < expr.length()) { + char op = expr.charAt(index[0]); + if (op != '+' && op != '-') break; + index[0]++; + double nextTerm = parseTerm(expr, index); + value = (op == '+') ? value + nextTerm : value - nextTerm; + } + return value; + } + + public static double parseTerm(String expr, int[] index) { + double value = parseFactor(expr, index); + while (index[0] < expr.length()) { + char op = expr.charAt(index[0]); + if (op != '*' && op != '/') break; + index[0]++; + double nextFactor = parseFactor(expr, index); + value = (op == '*') ? value * nextFactor : value / nextFactor; + } + return value; + } + + public static double parseFactor(String expr, int[] index) { + if (expr.charAt(index[0]) == '(') { + index[0]++; + double value = evaluate(expr, index); + index[0]++; // Skip closing ')' + return value; + } + + int start = index[0]; + while (index[0] < expr.length() && (Character.isDigit(expr.charAt(index[0])) || expr.charAt(index[0]) == '.')) { + index[0]++; + } + return Double.parseDouble(expr.substring(start, index[0])); + } +}