feat: 放宽扩展供应器内的样板手动倍增限制(不超int), 调整样板显示,以支持大数显示
This commit is contained in:
parent
51c5d4e3d7
commit
4e2be17871
|
|
@ -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);
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue
Block a user