feat: 放宽扩展供应器内的样板手动倍增限制(不超int), 调整样板显示,以支持大数显示

This commit is contained in:
C-H716 2025-09-20 20:28:11 +08:00
parent 51c5d4e3d7
commit 4e2be17871
2 changed files with 47 additions and 19 deletions

View File

@ -13,7 +13,6 @@ import com.glodblock.github.extendedae.container.ContainerExPatternProvider;
import net.minecraft.world.entity.player.Inventory; import net.minecraft.world.entity.player.Inventory;
import net.minecraft.world.inventory.MenuType; import net.minecraft.world.inventory.MenuType;
import net.minecraft.world.inventory.Slot; import net.minecraft.world.inventory.Slot;
import org.jetbrains.annotations.NotNull;
import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Pseudo; import org.spongepowered.asm.mixin.Pseudo;
import org.spongepowered.asm.mixin.Unique; 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.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
import java.util.ArrayList;
import java.util.List; import java.util.List;
@Pseudo @Pseudo
@ -107,7 +107,7 @@ public abstract class ContainerExPatternProviderMixin extends PatternProviderMen
} }
@Unique @Unique
private boolean eap$checkModify(java.util.List<GenericStack> stacks, int scale, boolean div) { private boolean eap$checkModify(List<GenericStack> stacks, int scale, boolean div) {
if (stacks == null) return false; if (stacks == null) return false;
if (div) { if (div) {
for (var stack : stacks) { for (var stack : stacks) {
@ -121,10 +121,12 @@ public abstract class ContainerExPatternProviderMixin extends PatternProviderMen
} else { } else {
for (var stack : stacks) { for (var stack : stacks) {
if (stack != null) { if (stack != null) {
long upper = 999999L * stack.what().getAmountPerUnit(); long amt = stack.amount();
if (stack.amount() * scale > upper) { // 先检查乘法是否会导致超出 Long.MAX_VALUE避免溢出
if (amt > Integer.MAX_VALUE / scale) {
return false; return false;
} }
// 已移除原有的业务上限检查999999 * amountPerUnit仅保留溢出检查
} }
} }
return true; return true;
@ -132,12 +134,23 @@ public abstract class ContainerExPatternProviderMixin extends PatternProviderMen
} }
@Unique @Unique
private java.util.List<GenericStack> eap$modifyStacks(java.util.List<GenericStack> src, int scale, boolean div) { private List<GenericStack> eap$modifyStacks(List<GenericStack> src, int scale, boolean div) {
var dst = new java.util.ArrayList<GenericStack>(src.size()); var dst = new ArrayList<GenericStack>(src.size());
for (var stack : src) { for (var stack : src) {
if (stack != null) { if (stack != null) {
long amt = stack.amount(); 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)); dst.add(new GenericStack(stack.what(), newAmt));
} else { } else {
dst.add(null); dst.add(null);

View File

@ -1,5 +1,7 @@
package com.extendedae_plus.util; package com.extendedae_plus.util;
import java.text.DecimalFormat;
/** /**
* 数字格式化工具类提供大数字和小数的格式化功能 * 数字格式化工具类提供大数字和小数的格式化功能
*/ */
@ -15,13 +17,18 @@ public class NumberFormatUtil {
public static String formatNumber(long number) { public static String formatNumber(long number) {
if (number < 1000) { if (number < 1000) {
return String.valueOf(number); 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) { public static String formatNumberWithDecimal(double value) {
if (value < 1000) { if (value < 1000) {
DecimalFormat smallDf = new DecimalFormat("#.##");
// 小于1000时若是整数则显示整数否则显示最多两位小数
if (value == (long) value) { if (value == (long) value) {
return String.valueOf((long) value); return String.valueOf((long) value);
} else { } 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) { if (Math.abs(value - Math.round(value)) < 0.001) {
return String.valueOf(Math.round(value)) + suffix; return String.valueOf(Math.round(value)) + suffix;
} else { } else {
// 修复重复后缀问题先格式化数字再添加后缀 // 使用一位小数显示去掉末尾 .0
String formatted = String.format("%.1f", value).replaceAll("\\.0$", ""); String formatted = String.format("%.1f", value).replaceAll("\\.0$", "");
return formatted + suffix; return formatted + suffix;
} }