From 4e2be178717ce10e9a2072349b70ec01b014366d Mon Sep 17 00:00:00 2001 From: C-H716 <1536152356@qq.com> Date: Sat, 20 Sep 2025 20:28:11 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=94=BE=E5=AE=BD=E6=89=A9=E5=B1=95?= =?UTF-8?q?=E4=BE=9B=E5=BA=94=E5=99=A8=E5=86=85=E7=9A=84=E6=A0=B7=E6=9D=BF?= =?UTF-8?q?=E6=89=8B=E5=8A=A8=E5=80=8D=E5=A2=9E=E9=99=90=E5=88=B6(?= =?UTF-8?q?=E4=B8=8D=E8=B6=85int),=20=E8=B0=83=E6=95=B4=E6=A0=B7=E6=9D=BF?= =?UTF-8?q?=E6=98=BE=E7=A4=BA=EF=BC=8C=E4=BB=A5=E6=94=AF=E6=8C=81=E5=A4=A7?= =?UTF-8?q?=E6=95=B0=E6=98=BE=E7=A4=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ContainerExPatternProviderMixin.java | 27 +++++++++---- .../util/NumberFormatUtil.java | 39 +++++++++++++------ 2 files changed, 47 insertions(+), 19 deletions(-) diff --git a/src/main/java/com/extendedae_plus/mixin/extendedae/container/ContainerExPatternProviderMixin.java b/src/main/java/com/extendedae_plus/mixin/extendedae/container/ContainerExPatternProviderMixin.java index a91cb09..145bc62 100644 --- a/src/main/java/com/extendedae_plus/mixin/extendedae/container/ContainerExPatternProviderMixin.java +++ b/src/main/java/com/extendedae_plus/mixin/extendedae/container/ContainerExPatternProviderMixin.java @@ -13,7 +13,6 @@ import com.glodblock.github.extendedae.container.ContainerExPatternProvider; import net.minecraft.world.entity.player.Inventory; import net.minecraft.world.inventory.MenuType; import net.minecraft.world.inventory.Slot; -import org.jetbrains.annotations.NotNull; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Pseudo; import org.spongepowered.asm.mixin.Unique; @@ -21,6 +20,7 @@ import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; +import java.util.ArrayList; import java.util.List; @Pseudo @@ -107,7 +107,7 @@ public abstract class ContainerExPatternProviderMixin extends PatternProviderMen } @Unique - private boolean eap$checkModify(java.util.List stacks, int scale, boolean div) { + private boolean eap$checkModify(List stacks, int scale, boolean div) { if (stacks == null) return false; if (div) { for (var stack : stacks) { @@ -121,10 +121,12 @@ public abstract class ContainerExPatternProviderMixin extends PatternProviderMen } else { for (var stack : stacks) { if (stack != null) { - long upper = 999999L * stack.what().getAmountPerUnit(); - if (stack.amount() * scale > upper) { + long amt = stack.amount(); + // 先检查乘法是否会导致超出 Long.MAX_VALUE,避免溢出 + if (amt > Integer.MAX_VALUE / scale) { return false; } + // 已移除原有的业务上限检查(999999 * amountPerUnit),仅保留溢出检查 } } return true; @@ -132,12 +134,23 @@ public abstract class ContainerExPatternProviderMixin extends PatternProviderMen } @Unique - private java.util.List eap$modifyStacks(java.util.List src, int scale, boolean div) { - var dst = new java.util.ArrayList(src.size()); + private List eap$modifyStacks(List src, int scale, boolean div) { + var dst = new ArrayList(src.size()); for (var stack : src) { if (stack != null) { long amt = stack.amount(); - long newAmt = div ? (amt / scale) : (amt * scale); + long newAmt; + if (div) { // 如果是除法操作 + newAmt = amt / scale; // 执行除法 + } else { // 如果是乘法操作 + // 防御性检查:确保不会发生溢出,尽管上层应已验证 + if (amt > Integer.MAX_VALUE / scale) { + // 遇到潜在溢出时跳过,保持为 null;调用方应通过 eap$checkModify 避免此分支 + dst.add(null); + continue; + } + newAmt = amt * scale; // 执行乘法 + } dst.add(new GenericStack(stack.what(), newAmt)); } else { dst.add(null); diff --git a/src/main/java/com/extendedae_plus/util/NumberFormatUtil.java b/src/main/java/com/extendedae_plus/util/NumberFormatUtil.java index 760b7be..b9aec75 100644 --- a/src/main/java/com/extendedae_plus/util/NumberFormatUtil.java +++ b/src/main/java/com/extendedae_plus/util/NumberFormatUtil.java @@ -1,5 +1,7 @@ package com.extendedae_plus.util; +import java.text.DecimalFormat; + /** * 数字格式化工具类,提供大数字和小数的格式化功能 */ @@ -15,13 +17,18 @@ public class NumberFormatUtil { public static String formatNumber(long number) { if (number < 1000) { return String.valueOf(number); - } else if (number < 1000000) { - double value = number / 1000.0; - return formatDecimal(value, "k"); - } else { - double value = number / 1000000.0; - return formatDecimal(value, "m"); } + + String[] preFixes = new String[]{"k", "M", "G", "T", "P", "E", "Z", "Y"}; + double value = number; + String level = ""; + + for (int offset = 0; value >= 1000.0 && offset < preFixes.length; ++offset) { + value /= 1000.0; + level = preFixes[offset]; + } + + return formatDecimal(value, level); } /** @@ -31,16 +38,24 @@ public class NumberFormatUtil { */ public static String formatNumberWithDecimal(double value) { if (value < 1000) { + DecimalFormat smallDf = new DecimalFormat("#.##"); + // 小于1000时,若是整数则显示整数,否则显示最多两位小数 if (value == (long) value) { return String.valueOf((long) value); } else { - return String.format("%.1f", value).replaceAll("\\.0$", ""); + return smallDf.format(value); } - } else if (value < 1000000) { - return formatDecimal(value / 1000.0, "k"); - } else { - return formatDecimal(value / 1000000.0, "m"); } + + String[] preFixes = new String[]{"k", "M", "G", "T", "P", "E", "Z", "Y"}; + String level = ""; + for (int offset = 0; value >= 1000.0 && offset < preFixes.length; ++offset) { + value /= 1000.0; + level = preFixes[offset]; + } + + DecimalFormat df = new DecimalFormat("#.##"); + return df.format(value) + level; } /** @@ -54,7 +69,7 @@ public class NumberFormatUtil { if (Math.abs(value - Math.round(value)) < 0.001) { return String.valueOf(Math.round(value)) + suffix; } else { - // 修复重复后缀问题:先格式化数字,再添加后缀 + // 使用一位小数显示,去掉末尾 .0 String formatted = String.format("%.1f", value).replaceAll("\\.0$", ""); return formatted + suffix; }