倍增样板包装类调整

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

View File

@ -1,67 +1,44 @@
package com.extendedae_plus.ae.api.crafting; package com.extendedae_plus.ae.api.crafting;
import appeng.api.crafting.IPatternDetails;
import appeng.api.stacks.AEKey; import appeng.api.stacks.AEKey;
import appeng.api.stacks.KeyCounter; import appeng.api.stacks.KeyCounter;
import appeng.crafting.pattern.AEProcessingPattern; import appeng.crafting.pattern.AEProcessingPattern;
import net.minecraft.core.Direction; import net.minecraft.core.Direction;
import net.pedroksl.advanced_ae.common.patterns.AdvPatternDetails; 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 扩展版额外实现 AdvPatternDetails 接口
* 仅在 Advanced AE 加载时使用 * 仅在 Advanced AE 加载时使用
*/ */
public final class ScaledProcessingPatternAdv extends ScaledProcessingPattern implements AdvPatternDetails { public final class ScaledProcessingPatternAdv extends ScaledProcessingPattern implements AdvPatternDetails {
private final LinkedHashMap<AEKey, Direction> dirMap;
private final AdvPatternDetails adv;
public ScaledProcessingPatternAdv(AEProcessingPattern original, long multiplier) { public ScaledProcessingPatternAdv(AEProcessingPattern original, long multiplier) {
super(original, multiplier); super(original, multiplier);
this.adv = (AdvPatternDetails) original; this.dirMap = ((AdvProcessingPattern) original).getDirectionMap();
} }
@Override @Override
public boolean directionalInputsSet() { public boolean directionalInputsSet() {
return adv.directionalInputsSet(); return this.dirMap != null && !this.dirMap.isEmpty();
} }
@Override @Override
public HashMap<AEKey, Direction> getDirectionMap() { public LinkedHashMap<AEKey, Direction> getDirectionMap() {
return adv.getDirectionMap(); return this.dirMap;
} }
@Override @Override
public Direction getDirectionSideForInputKey(AEKey key) { public Direction getDirectionSideForInputKey(AEKey key) {
return adv.getDirectionSideForInputKey(key); return this.dirMap.get(key);
} }
@Override @Override
public void pushInputsToExternalInventory(KeyCounter[] inputHolder, PatternInputSink inputSink) { public void pushInputsToExternalInventory(KeyCounter[] inputHolder, IPatternDetails.PatternInputSink inputSink) {
// // 使用 lazy 计算的 sparseInputs inputs 来驱动当两者长度一致时直接委托 super.pushInputsToExternalInventory(inputHolder, inputSink);
// 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);
// }
// }
} }
} }