倍增样板包装类调整

This commit is contained in:
C-H716 2025-11-03 09:31:31 +08:00
parent c792cad8e7
commit ce205cb4b7
2 changed files with 50 additions and 74 deletions

View File

@ -6,68 +6,68 @@ import appeng.api.stacks.AEKey;
import appeng.api.stacks.GenericStack;
import appeng.crafting.pattern.AEProcessingPattern;
import net.minecraft.world.level.Level;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
public class ScaledProcessingPattern implements IPatternDetails {
private final AEProcessingPattern original;
private final long multiplier;
public ScaledProcessingPattern(AEProcessingPattern original, long multiplier) {
if (original == null) throw new IllegalArgumentException("original cannot be null");
public ScaledProcessingPattern(@NotNull AEProcessingPattern original, long multiplier) {
if (multiplier <= 0) throw new IllegalArgumentException("multiplier must be > 0");
this.original = original;
this.multiplier = multiplier;
}
public AEProcessingPattern getOriginal() { return original; }
public long getMultiplier() { return multiplier; }
public AEProcessingPattern getOriginal() {return original;}
public long getMultiplier() {return multiplier;}
@Override
public AEItemKey getDefinition() {
public final AEItemKey getDefinition() {
return original.getDefinition();
}
@Override
public IInput[] getInputs() {
IPatternDetails.IInput[] orig = original.getInputs();
IInput[] scaled = new IInput[orig.length];
for (int i = 0; i < orig.length; i++) {
scaled[i] = new ScaledInput(orig[i], multiplier);
public final IInput[] getInputs() {
IPatternDetails.IInput[] original = this.original.getInputs();
IInput[] scaled = new IInput[original.length];
for (int i = 0; i < original.length; i++) {
scaled[i] = new ScaledInput(original[i], multiplier);
}
return scaled;
}
@Override
public GenericStack[] getOutputs() {
GenericStack[] orig = original.getOutputs();
GenericStack[] scaled = new GenericStack[orig.length];
for (int i = 0; i < orig.length; i++) {
if (orig[i] != null) {
scaled[i] = new GenericStack(orig[i].what(), orig[i].amount() * multiplier);
public final GenericStack[] getOutputs() {
GenericStack[] original = this.original.getOutputs();
GenericStack[] scaled = new GenericStack[original.length];
for (int i = 0; i < original.length; i++) {
if (original[i] != null) {
scaled[i] = new GenericStack(original[i].what(), original[i].amount() * multiplier);
}
}
return scaled;
}
// 兼容性方法
public GenericStack[] getSparseInputs() {
GenericStack[] orig = original.getSparseInputs();
GenericStack[] scaled = new GenericStack[orig.length];
for (int i = 0; i < orig.length; i++) {
if (orig[i] != null) {
scaled[i] = new GenericStack(orig[i].what(), orig[i].amount() * multiplier);
public final GenericStack[] getSparseInputs() {
GenericStack[] original = this.original.getSparseInputs();
GenericStack[] scaled = new GenericStack[original.length];
for (int i = 0; i < original.length; i++) {
if (original[i] != null) {
scaled[i] = new GenericStack(original[i].what(), original[i].amount() * multiplier);
}
}
return scaled;
}
public GenericStack[] getSparseOutputs() {
GenericStack[] orig = original.getSparseOutputs();
GenericStack[] scaled = new GenericStack[orig.length];
for (int i = 0; i < orig.length; i++) {
if (orig[i] != null) {
scaled[i] = new GenericStack(orig[i].what(), orig[i].amount() * multiplier);
public final GenericStack[] getSparseOutputs() {
GenericStack[] original = this.original.getSparseOutputs();
GenericStack[] scaled = new GenericStack[original.length];
for (int i = 0; i < original.length; i++) {
if (original[i] != null) {
scaled[i] = new GenericStack(original[i].what(), original[i].amount() * multiplier);
}
}
return scaled;
@ -93,18 +93,17 @@ public class ScaledProcessingPattern implements IPatternDetails {
return "Scaled[" + original.getDefinition().getItem() + " × " + multiplier + "]";
}
private static class ScaledInput implements IInput {
private final IInput delegate;
private final long mul;
private record ScaledInput(IInput delegate, long mul) implements IInput {
@Override
public GenericStack[] getPossibleInputs() {return delegate.getPossibleInputs();}
private ScaledInput(IInput delegate, long mul) {
this.delegate = delegate;
this.mul = mul;
}
@Override
public long getMultiplier() {return delegate.getMultiplier() * mul;}
@Override public GenericStack[] getPossibleInputs() { return delegate.getPossibleInputs(); }
@Override public long getMultiplier() { return delegate.getMultiplier() * mul; }
@Override public boolean isValid(AEKey input, Level level) { return delegate.isValid(input, level); }
@Override public @Nullable AEKey getRemainingKey(AEKey template) { return delegate.getRemainingKey(template); }
@Override
public boolean isValid(AEKey input, Level level) {return delegate.isValid(input, level);}
@Override
public @Nullable AEKey getRemainingKey(AEKey template) {return delegate.getRemainingKey(template);}
}
}

View File

@ -1,67 +1,44 @@
package com.extendedae_plus.ae.api.crafting;
import appeng.api.crafting.IPatternDetails;
import appeng.api.stacks.AEKey;
import appeng.api.stacks.KeyCounter;
import appeng.crafting.pattern.AEProcessingPattern;
import net.minecraft.core.Direction;
import net.pedroksl.advanced_ae.common.patterns.AdvPatternDetails;
import net.pedroksl.advanced_ae.common.patterns.AdvProcessingPattern;
import java.util.HashMap;
import java.util.LinkedHashMap;
/**
* Advanced AE 扩展版额外实现 AdvPatternDetails 接口
* 仅在 Advanced AE 加载时使用
*/
public final class ScaledProcessingPatternAdv extends ScaledProcessingPattern implements AdvPatternDetails {
private final AdvPatternDetails adv;
private final LinkedHashMap<AEKey, Direction> dirMap;
public ScaledProcessingPatternAdv(AEProcessingPattern original, long multiplier) {
super(original, multiplier);
this.adv = (AdvPatternDetails) original;
this.dirMap = ((AdvProcessingPattern) original).getDirectionMap();
}
@Override
public boolean directionalInputsSet() {
return adv.directionalInputsSet();
return this.dirMap != null && !this.dirMap.isEmpty();
}
@Override
public HashMap<AEKey, Direction> getDirectionMap() {
return adv.getDirectionMap();
public LinkedHashMap<AEKey, Direction> getDirectionMap() {
return this.dirMap;
}
@Override
public Direction getDirectionSideForInputKey(AEKey key) {
return adv.getDirectionSideForInputKey(key);
return this.dirMap.get(key);
}
@Override
public void pushInputsToExternalInventory(KeyCounter[] inputHolder, PatternInputSink inputSink) {
// // 使用 lazy 计算的 sparseInputs inputs 来驱动当两者长度一致时直接委托
// GenericStack[] sInputs = getSparseInputs();
// IInput[] ins = getInputs();
// if (sInputs.length == ins.length) {
// super.pushInputsToExternalInventory(inputHolder, inputSink);
// return;
// }
//
// KeyCounter allInputs = new KeyCounter();
// for (KeyCounter counter : inputHolder) {
// allInputs.addAll(counter);
// }
// for (GenericStack sparseInput : sInputs) {
// if (sparseInput != null) {
// AEKey key = sparseInput.what();
// long amount = sparseInput.amount();
// long available = allInputs.get(key);
// if (available < amount) {
// throw new RuntimeException("Expected at least %d of %s when pushing scaled pattern, but only %d available"
// .formatted(amount, key, available));
// }
// inputSink.pushInput(key, amount);
// allInputs.remove(key, amount);
// }
// }
public void pushInputsToExternalInventory(KeyCounter[] inputHolder, IPatternDetails.PatternInputSink inputSink) {
super.pushInputsToExternalInventory(inputHolder, inputSink);
}
}