From feee94e2c2ce01262f3eb47d7b356ca9821bdb79 Mon Sep 17 00:00:00 2001 From: olim Date: Fri, 26 Apr 2024 18:01:09 +0100 Subject: add command add command to be able to use the calculator and fix crash with emty equations --- .../java/de/hysky/skyblocker/SkyblockerMod.java | 2 + .../skyblocker/mixins/SignEditScreenMixin.java | 4 +- .../hysky/skyblocker/skyblock/SignCalculator.java | 67 ---------------------- .../skyblock/calculators/CalculatorCommand.java | 57 ++++++++++++++++++ .../skyblock/calculators/SignCalculator.java | 62 ++++++++++++++++++++ .../java/de/hysky/skyblocker/utils/Calculator.java | 14 ++--- 6 files changed, 129 insertions(+), 77 deletions(-) delete mode 100644 src/main/java/de/hysky/skyblocker/skyblock/SignCalculator.java create mode 100644 src/main/java/de/hysky/skyblocker/skyblock/calculators/CalculatorCommand.java create mode 100644 src/main/java/de/hysky/skyblocker/skyblock/calculators/SignCalculator.java (limited to 'src/main') diff --git a/src/main/java/de/hysky/skyblocker/SkyblockerMod.java b/src/main/java/de/hysky/skyblocker/SkyblockerMod.java index 3336cefb..9840c02f 100644 --- a/src/main/java/de/hysky/skyblocker/SkyblockerMod.java +++ b/src/main/java/de/hysky/skyblocker/SkyblockerMod.java @@ -7,6 +7,7 @@ import de.hysky.skyblocker.config.ImageRepoLoader; import de.hysky.skyblocker.config.SkyblockerConfigManager; import de.hysky.skyblocker.debug.Debug; import de.hysky.skyblocker.skyblock.*; +import de.hysky.skyblocker.skyblock.calculators.CalculatorCommand; import de.hysky.skyblocker.skyblock.chat.ChatRuleAnnouncementScreen; import de.hysky.skyblocker.skyblock.chat.ChatRulesHandler; import de.hysky.skyblocker.skyblock.crimson.kuudra.Kuudra; @@ -132,6 +133,7 @@ public class SkyblockerMod implements ClientModInitializer { Shortcuts.init(); ChatRulesHandler.init(); ChatRuleAnnouncementScreen.init(); + CalculatorCommand.init(); DiscordRPCManager.init(); LividColor.init(); FishingHelper.init(); diff --git a/src/main/java/de/hysky/skyblocker/mixins/SignEditScreenMixin.java b/src/main/java/de/hysky/skyblocker/mixins/SignEditScreenMixin.java index 867edb7d..88c54878 100644 --- a/src/main/java/de/hysky/skyblocker/mixins/SignEditScreenMixin.java +++ b/src/main/java/de/hysky/skyblocker/mixins/SignEditScreenMixin.java @@ -2,10 +2,8 @@ package de.hysky.skyblocker.mixin; import de.hysky.skyblocker.config.SkyblockerConfigManager; -import de.hysky.skyblocker.skyblock.SignCalculator; +import de.hysky.skyblocker.skyblock.calculators.SignCalculator; import de.hysky.skyblocker.utils.Utils; -import net.minecraft.block.entity.SignBlockEntity; -import net.minecraft.client.MinecraftClient; import net.minecraft.client.gui.DrawContext; import net.minecraft.client.gui.screen.ingame.AbstractSignEditScreen; import org.spongepowered.asm.mixin.Final; diff --git a/src/main/java/de/hysky/skyblocker/skyblock/SignCalculator.java b/src/main/java/de/hysky/skyblocker/skyblock/SignCalculator.java deleted file mode 100644 index be393b49..00000000 --- a/src/main/java/de/hysky/skyblocker/skyblock/SignCalculator.java +++ /dev/null @@ -1,67 +0,0 @@ -package de.hysky.skyblocker.skyblock; - -import de.hysky.skyblocker.skyblock.dungeon.puzzle.waterboard.Switch; -import de.hysky.skyblocker.utils.Calculator; -import net.minecraft.client.MinecraftClient; -import net.minecraft.client.gui.DrawContext; -import net.minecraft.text.Text; -import net.minecraft.util.Formatting; -import net.minecraft.util.Util; - -import java.text.DecimalFormat; -import java.util.*; -import java.util.regex.Matcher; -import java.util.regex.Pattern; - -public class SignCalculator { - - private static final MinecraftClient CLIENT = MinecraftClient.getInstance(); - - private static final DecimalFormat FORMATTER = new DecimalFormat("#,###.##"); - - private static String lastInput; - private static String input; - private static Double output; - - public static void renderSign(DrawContext context, String[] messages){ - input = messages[0]; - - - //only update output if new input - if (!input.equals(lastInput)) { // - try { - output = Calculator.calculate(input); - } catch (Exception e){ - output = null; - } - } - - render(context); - - lastInput = input; - } - - public static String getNewValue(Boolean isPrice) { - if (output == null) { - return ""; - } - //price can except decimals and exponents - if (isPrice) { - return output.toString(); - } - //amounts want an integer number so round - return Long.toString(Math.round(output)); - } - - private static void render(DrawContext context) { - Text text; - if (output == null) { - text = Text.translatable("text.autoconfig.skyblocker.option.general.enableSignCalculator.invalidEquation").formatted(Formatting.RED); - } - else { - text = Text.literal(input +" = " + FORMATTER.format(output)).formatted(Formatting.GREEN); - } - - context.drawCenteredTextWithShadow(CLIENT.textRenderer, text,context.getScaledWindowWidth() /2 , 55,0xFFFFFFFF); - } -} diff --git a/src/main/java/de/hysky/skyblocker/skyblock/calculators/CalculatorCommand.java b/src/main/java/de/hysky/skyblocker/skyblock/calculators/CalculatorCommand.java new file mode 100644 index 00000000..f9b8b4cf --- /dev/null +++ b/src/main/java/de/hysky/skyblocker/skyblock/calculators/CalculatorCommand.java @@ -0,0 +1,57 @@ +package de.hysky.skyblocker.skyblock.calculators; + +import com.mojang.brigadier.Command; +import com.mojang.brigadier.CommandDispatcher; +import com.mojang.brigadier.arguments.StringArgumentType; +import de.hysky.skyblocker.SkyblockerMod; +import de.hysky.skyblocker.utils.Calculator; +import de.hysky.skyblocker.utils.Constants; +import net.fabricmc.fabric.api.client.command.v2.ClientCommandRegistrationCallback; +import net.fabricmc.fabric.api.client.command.v2.FabricClientCommandSource; +import net.minecraft.client.MinecraftClient; +import net.minecraft.command.CommandRegistryAccess; +import net.minecraft.text.MutableText; +import net.minecraft.text.Text; +import net.minecraft.util.Formatting; + +import java.text.DecimalFormat; + +import static com.mojang.brigadier.arguments.StringArgumentType.getString; +import static net.fabricmc.fabric.api.client.command.v2.ClientCommandManager.argument; +import static net.fabricmc.fabric.api.client.command.v2.ClientCommandManager.literal; + +public class CalculatorCommand { + private static final MinecraftClient CLIENT = MinecraftClient.getInstance(); + + private static final DecimalFormat FORMATTER = new DecimalFormat("#,###.##"); + + public static void init() { + ClientCommandRegistrationCallback.EVENT.register(CalculatorCommand::calculate); + } + + private static void calculate(CommandDispatcher dispatcher, CommandRegistryAccess registryAccess) { + dispatcher.register(literal(SkyblockerMod.NAMESPACE) + .then(literal("calculate") + .then(argument("equation", StringArgumentType.greedyString()) + .executes(context -> doCalculation(getString(context, "equation")) ) + ) + ) + ); + } + + private static int doCalculation(String calculation) { + MutableText text = Constants.PREFIX.get(); + try { + text.append(Text.literal(FORMATTER.format(Calculator.calculate(calculation))).formatted(Formatting.GREEN)); + } catch (UnsupportedOperationException e) { + text.append(Text.literal("text.autoconfig.skyblocker.option.general.enableSignCalculator.invalidEquation").formatted(Formatting.RED)); + } + + if (CLIENT == null || CLIENT.player == null) { + return 0; + } + + CLIENT.player.sendMessage(text, false); + return Command.SINGLE_SUCCESS; + } +} diff --git a/src/main/java/de/hysky/skyblocker/skyblock/calculators/SignCalculator.java b/src/main/java/de/hysky/skyblocker/skyblock/calculators/SignCalculator.java new file mode 100644 index 00000000..7dbeabd9 --- /dev/null +++ b/src/main/java/de/hysky/skyblocker/skyblock/calculators/SignCalculator.java @@ -0,0 +1,62 @@ +package de.hysky.skyblocker.skyblock.calculators; + +import de.hysky.skyblocker.utils.Calculator; +import net.minecraft.client.MinecraftClient; +import net.minecraft.client.gui.DrawContext; +import net.minecraft.text.Text; +import net.minecraft.util.Formatting; + +import java.text.DecimalFormat; + +public class SignCalculator { + + private static final MinecraftClient CLIENT = MinecraftClient.getInstance(); + + private static final DecimalFormat FORMATTER = new DecimalFormat("#,###.##"); + + private static String lastInput; + private static String input; + private static Double output; + + public static void renderSign(DrawContext context, String[] messages){ + input = messages[0]; + + + //only update output if new input + if (!input.equals(lastInput)) { // + try { + output = Calculator.calculate(input); + } catch (Exception e){ + output = null; + } + } + + render(context); + + lastInput = input; + } + + public static String getNewValue(Boolean isPrice) { + if (output == null) { + return ""; + } + //price can except decimals and exponents + if (isPrice) { + return output.toString(); + } + //amounts want an integer number so round + return Long.toString(Math.round(output)); + } + + private static void render(DrawContext context) { + Text text; + if (output == null) { + text = Text.translatable("text.autoconfig.skyblocker.option.general.enableSignCalculator.invalidEquation").formatted(Formatting.RED); + } + else { + text = Text.literal(input +" = " + FORMATTER.format(output)).formatted(Formatting.GREEN); + } + + context.drawCenteredTextWithShadow(CLIENT.textRenderer, text,context.getScaledWindowWidth() /2 , 55,0xFFFFFFFF); + } +} diff --git a/src/main/java/de/hysky/skyblocker/utils/Calculator.java b/src/main/java/de/hysky/skyblocker/utils/Calculator.java index c8dcb6d8..19155708 100644 --- a/src/main/java/de/hysky/skyblocker/utils/Calculator.java +++ b/src/main/java/de/hysky/skyblocker/utils/Calculator.java @@ -1,6 +1,5 @@ package de.hysky.skyblocker.utils; -import de.hysky.skyblocker.skyblock.SignCalculator; import net.minecraft.util.Util; import java.util.*; @@ -148,9 +147,7 @@ public class Calculator { case "*","/" -> { return 1; } - default -> { - throw new UnsupportedOperationException("invalid operator"); - } + default -> throw new UnsupportedOperationException("Invalid operator"); } } @@ -188,24 +185,27 @@ public class Calculator { } } case L_PARENTHESIS, R_PARENTHESIS -> { - throw new UnsupportedOperationException("equation is not in RPN"); + throw new UnsupportedOperationException("Equation is not in RPN"); } } } + if (values.isEmpty()) { + throw new UnsupportedOperationException("Equation is empty"); + } return values.pop(); } private static double calculateValue(String value) { Matcher numberMatcher = NUMBER_PATTERN.matcher(value.toLowerCase()); if (!numberMatcher.matches()) { - throw new UnsupportedOperationException("invalid number"); + throw new UnsupportedOperationException("Invalid number"); } double number = Double.parseDouble(numberMatcher.group(1)); String magnitude = numberMatcher.group(2); if (!magnitude.isEmpty()) { if (!magnitudeValues.containsKey(magnitude)) {//its invalid if its another letter - throw new UnsupportedOperationException("invalid magnitude"); + throw new UnsupportedOperationException("Invalid magnitude"); } number *= magnitudeValues.get(magnitude); } -- cgit