122 lines
5.2 KiB
Java
122 lines
5.2 KiB
Java
package com.extendedae_plus.util;
|
||
|
||
import appeng.api.crafting.IPatternDetails.IInput;
|
||
import appeng.api.stacks.AEKey;
|
||
import appeng.api.stacks.GenericStack;
|
||
import appeng.crafting.pattern.AEProcessingPattern;
|
||
import com.extendedae_plus.content.ScaledProcessingPattern;
|
||
import com.extendedae_plus.api.SmartDoublingAwarePattern;
|
||
|
||
import java.util.Arrays;
|
||
|
||
import static com.extendedae_plus.util.ExtendedAELogger.LOGGER;
|
||
|
||
public final class PatternScaler {
|
||
private PatternScaler() {
|
||
}
|
||
|
||
public static ScaledProcessingPattern scale(AEProcessingPattern base, AEKey target, long requestedAmount) {
|
||
if (base == null) throw new IllegalArgumentException("base");
|
||
if (target == null) throw new IllegalArgumentException("target");
|
||
|
||
// 双保险:若样板标记为不允许缩放,直接放弃缩放(返回 null 表示调用方应保持原样板)
|
||
if (base instanceof SmartDoublingAwarePattern aware && !aware.eap$allowScaling()) {
|
||
LOGGER.info("[extendedae_plus] PatternScaler: 智能翻倍禁用,跳过缩放 target={} requested={}", target, requestedAmount);
|
||
return null;
|
||
}
|
||
|
||
GenericStack[] baseSparseInputs = base.getSparseInputs();
|
||
GenericStack[] baseSparseOutputs = base.getSparseOutputs();
|
||
IInput[] baseInputs = base.getInputs();
|
||
GenericStack[] baseOutputs = base.getOutputs();
|
||
|
||
// 新逻辑:不再对样板进行单位化处理
|
||
// 找到目标输出在 outputs 中的索引(尝试匹配 target,否则取第一个非空输出)
|
||
int targetOutIndex = -1;
|
||
for (int i = 0; i < baseOutputs.length; i++) {
|
||
var out = baseOutputs[i];
|
||
if (out != null && target != null && out.what() != null && out.what().equals(target)) {
|
||
targetOutIndex = i;
|
||
break;
|
||
}
|
||
}
|
||
if (targetOutIndex == -1) {
|
||
for (int i = 0; i < baseOutputs.length; i++) {
|
||
if (baseOutputs[i] != null) {
|
||
targetOutIndex = i;
|
||
break;
|
||
}
|
||
}
|
||
}
|
||
if (targetOutIndex == -1 && baseOutputs.length > 0) targetOutIndex = 0;
|
||
|
||
long perOperationTarget = 1L;
|
||
if (targetOutIndex >= 0 && baseOutputs[targetOutIndex] != null) {
|
||
long amt = baseOutputs[targetOutIndex].amount();
|
||
if (amt > 0) perOperationTarget = amt;
|
||
}
|
||
|
||
// 使用最小整数倍(ceil)策略:直接选择满足请求的最小倍数
|
||
long multiplier = 1L;
|
||
if (requestedAmount > 0) {
|
||
long needed = requestedAmount / perOperationTarget + ((requestedAmount % perOperationTarget) == 0 ? 0 : 1);
|
||
multiplier = needed <= 1L ? 1L : needed;
|
||
}
|
||
|
||
// 构建压缩输入(将每个输入的 multiplier 翻倍,保留每个模板的原始数量)
|
||
IInput[] scaledInputs = new IInput[baseInputs.length];
|
||
for (int i = 0; i < baseInputs.length; i++) {
|
||
var in = baseInputs[i];
|
||
var template = in.getPossibleInputs();
|
||
GenericStack[] scaledTemplates = new GenericStack[template.length];
|
||
for (int j = 0; j < template.length; j++) {
|
||
scaledTemplates[j] = new GenericStack(template[j].what(), template[j].amount());
|
||
}
|
||
scaledInputs[i] = new ScaledProcessingPattern.Input(scaledTemplates, in.getMultiplier() * multiplier);
|
||
}
|
||
|
||
/* 4. 构建压缩输出 */
|
||
GenericStack[] scaledCondensedOutputs = new GenericStack[baseOutputs.length];
|
||
for (int i = 0; i < baseOutputs.length; i++) {
|
||
GenericStack out = baseOutputs[i];
|
||
if (out != null) {
|
||
scaledCondensedOutputs[i] = new GenericStack(out.what(), out.amount() * multiplier);
|
||
}
|
||
}
|
||
|
||
// 构建并打印稀疏表示(直接按 multiplier 放大)
|
||
GenericStack[] scaledSparseInputs = new GenericStack[baseSparseInputs.length];
|
||
for (int i = 0; i < baseSparseInputs.length; i++) {
|
||
var in = baseSparseInputs[i];
|
||
if (in != null) {
|
||
scaledSparseInputs[i] = new GenericStack(in.what(), in.amount() * multiplier);
|
||
}
|
||
}
|
||
GenericStack[] scaledSparseOutputs = new GenericStack[baseSparseOutputs.length];
|
||
for (int i = 0; i < baseSparseOutputs.length; i++) {
|
||
var out = baseSparseOutputs[i];
|
||
if (out != null) {
|
||
scaledSparseOutputs[i] = new GenericStack(out.what(), out.amount() * multiplier);
|
||
}
|
||
}
|
||
|
||
|
||
/* Debug 输出 */
|
||
LOGGER.info("[extendedae_plus] 正在缩放样板: 目标物品: {} 请求数量: {} 缩放后输入: {} 缩放后输出: {} 缩放后稀疏输入: {} 缩放后稀疏输出: {}",
|
||
target,
|
||
requestedAmount,
|
||
Arrays.toString(scaledInputs),
|
||
Arrays.toString(scaledCondensedOutputs),
|
||
Arrays.toString(scaledSparseInputs),
|
||
Arrays.toString(scaledSparseOutputs));
|
||
|
||
|
||
return new ScaledProcessingPattern(base,
|
||
base.getDefinition(),
|
||
scaledSparseInputs,
|
||
scaledSparseOutputs,
|
||
scaledInputs,
|
||
scaledCondensedOutputs);
|
||
}
|
||
}
|