回退样板供应器按钮倍增的调整

This commit is contained in:
C-H716 2025-09-20 21:25:26 +08:00
parent 20262814ba
commit 5a9e7bfc7c

View File

@ -20,7 +20,6 @@ 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 +106,7 @@ public abstract class ContainerExPatternProviderMixin extends PatternProviderMen
} }
@Unique @Unique
private boolean eap$checkModify(List<GenericStack> stacks, int scale, boolean div) { private boolean eap$checkModify(java.util.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,12 +120,10 @@ public abstract class ContainerExPatternProviderMixin extends PatternProviderMen
} else { } else {
for (var stack : stacks) { for (var stack : stacks) {
if (stack != null) { if (stack != null) {
long amt = stack.amount(); long upper = 999999L * stack.what().getAmountPerUnit();
// 先检查乘法是否会导致超出 Long.MAX_VALUE避免溢出 if (stack.amount() * scale > upper) {
if (amt > Integer.MAX_VALUE / scale) {
return false; return false;
} }
// 已移除原有的业务上限检查999999 * amountPerUnit仅保留溢出检查
} }
} }
return true; return true;
@ -134,23 +131,12 @@ public abstract class ContainerExPatternProviderMixin extends PatternProviderMen
} }
@Unique @Unique
private List<GenericStack> eap$modifyStacks(List<GenericStack> src, int scale, boolean div) { private java.util.List<GenericStack> eap$modifyStacks(java.util.List<GenericStack> src, int scale, boolean div) {
var dst = new ArrayList<GenericStack>(src.size()); var dst = new java.util.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; long newAmt = div ? (amt / scale) : (amt * scale);
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);