From 8bebfbe4ac4d4faa7a2df592fcdcb87aca5f98bc Mon Sep 17 00:00:00 2001 From: GaLi <133291877+GaLicn@users.noreply.github.com> Date: Fri, 29 Aug 2025 16:45:22 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E6=99=BA=E8=83=BD=E7=BC=A9?= =?UTF-8?q?=E6=94=BE=E7=BB=86=E5=88=86=E5=88=B0=E4=BE=9B=E5=BA=94=E5=99=A8?= =?UTF-8?q?=E6=8E=A7=E5=88=B6=E6=98=AF=E5=90=A6=E5=90=AF=E7=94=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../api/SmartDoublingAwarePattern.java | 6 ++++ .../mixin/ae2/AEProcessingPatternMixin.java | 22 ++++++++++++++ .../PatternProviderLogicDoublingMixin.java | 30 +++++++++++++++++++ .../PatternProviderLogicPatternsAccessor.java | 14 +++++++++ .../autopattern/CraftingTreeProcessMixin.java | 24 ++++++++++++++- .../extendedae_plus/util/PatternScaler.java | 7 +++++ .../resources/extendedae_plus.mixins.json | 2 ++ 7 files changed, 104 insertions(+), 1 deletion(-) create mode 100644 src/main/java/com/extendedae_plus/api/SmartDoublingAwarePattern.java create mode 100644 src/main/java/com/extendedae_plus/mixin/ae2/AEProcessingPatternMixin.java create mode 100644 src/main/java/com/extendedae_plus/mixin/ae2/accessor/PatternProviderLogicPatternsAccessor.java diff --git a/src/main/java/com/extendedae_plus/api/SmartDoublingAwarePattern.java b/src/main/java/com/extendedae_plus/api/SmartDoublingAwarePattern.java new file mode 100644 index 0000000..5c18658 --- /dev/null +++ b/src/main/java/com/extendedae_plus/api/SmartDoublingAwarePattern.java @@ -0,0 +1,6 @@ +package com.extendedae_plus.api; + +public interface SmartDoublingAwarePattern { + boolean eap$allowScaling(); + void eap$setAllowScaling(boolean allow); +} diff --git a/src/main/java/com/extendedae_plus/mixin/ae2/AEProcessingPatternMixin.java b/src/main/java/com/extendedae_plus/mixin/ae2/AEProcessingPatternMixin.java new file mode 100644 index 0000000..4381601 --- /dev/null +++ b/src/main/java/com/extendedae_plus/mixin/ae2/AEProcessingPatternMixin.java @@ -0,0 +1,22 @@ +package com.extendedae_plus.mixin.ae2; + +import appeng.crafting.pattern.AEProcessingPattern; +import com.extendedae_plus.api.SmartDoublingAwarePattern; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Unique; + +@Mixin(value = AEProcessingPattern.class, remap = false) +public class AEProcessingPatternMixin implements SmartDoublingAwarePattern { + @Unique + private boolean eap$allowScaling = true; // 默认允许缩放 + + @Override + public boolean eap$allowScaling() { + return eap$allowScaling; + } + + @Override + public void eap$setAllowScaling(boolean allow) { + this.eap$allowScaling = allow; + } +} diff --git a/src/main/java/com/extendedae_plus/mixin/ae2/PatternProviderLogicDoublingMixin.java b/src/main/java/com/extendedae_plus/mixin/ae2/PatternProviderLogicDoublingMixin.java index 47eaa1c..eaf1aac 100644 --- a/src/main/java/com/extendedae_plus/mixin/ae2/PatternProviderLogicDoublingMixin.java +++ b/src/main/java/com/extendedae_plus/mixin/ae2/PatternProviderLogicDoublingMixin.java @@ -2,6 +2,10 @@ package com.extendedae_plus.mixin.ae2; import appeng.helpers.patternprovider.PatternProviderLogic; import com.extendedae_plus.api.SmartDoublingHolder; +import com.extendedae_plus.api.SmartDoublingAwarePattern; +import com.extendedae_plus.mixin.ae2.accessor.PatternProviderLogicPatternsAccessor; +import appeng.api.crafting.IPatternDetails; +import appeng.crafting.pattern.AEProcessingPattern; import net.minecraft.nbt.CompoundTag; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Unique; @@ -25,6 +29,18 @@ public class PatternProviderLogicDoublingMixin implements SmartDoublingHolder { @Override public void eap$setSmartDoubling(boolean value) { this.eap$smartDoubling = value; + // 立即将开关状态应用到当前 Provider 的样板上,避免等待下一次 updatePatterns + try { + var list = ((PatternProviderLogicPatternsAccessor) this).eap$patterns(); + for (IPatternDetails details : list) { + if (details instanceof AEProcessingPattern proc && proc instanceof SmartDoublingAwarePattern aware) { + aware.eap$setAllowScaling(value); + } + } + // 触发一次刷新,让网络及时拿到最新状态(也会触发 ICraftingProvider.requestUpdate(mainNode)) + ((PatternProviderLogic) (Object) this).updatePatterns(); + } catch (Throwable ignored) { + } } @Inject(method = "writeToNBT", at = @At("TAIL"), remap = false) @@ -38,4 +54,18 @@ public class PatternProviderLogicDoublingMixin implements SmartDoublingHolder { this.eap$smartDoubling = tag.getBoolean(EPP_SMART_DOUBLING_KEY); } } + + @Inject(method = "updatePatterns", at = @At("TAIL"), remap = false) + private void eap$applySmartDoublingToPatterns(CallbackInfo ci) { + try { + var list = ((PatternProviderLogicPatternsAccessor) this).eap$patterns(); + boolean allow = this.eap$smartDoubling; + for (IPatternDetails details : list) { + if (details instanceof AEProcessingPattern proc && proc instanceof SmartDoublingAwarePattern aware) { + aware.eap$setAllowScaling(allow); + } + } + } catch (Throwable ignored) { + } + } } diff --git a/src/main/java/com/extendedae_plus/mixin/ae2/accessor/PatternProviderLogicPatternsAccessor.java b/src/main/java/com/extendedae_plus/mixin/ae2/accessor/PatternProviderLogicPatternsAccessor.java new file mode 100644 index 0000000..c1471e3 --- /dev/null +++ b/src/main/java/com/extendedae_plus/mixin/ae2/accessor/PatternProviderLogicPatternsAccessor.java @@ -0,0 +1,14 @@ +package com.extendedae_plus.mixin.ae2.accessor; + +import appeng.api.crafting.IPatternDetails; +import appeng.helpers.patternprovider.PatternProviderLogic; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.gen.Accessor; + +import java.util.List; + +@Mixin(value = PatternProviderLogic.class, remap = false) +public interface PatternProviderLogicPatternsAccessor { + @Accessor("patterns") + List eap$patterns(); +} diff --git a/src/main/java/com/extendedae_plus/mixin/autopattern/CraftingTreeProcessMixin.java b/src/main/java/com/extendedae_plus/mixin/autopattern/CraftingTreeProcessMixin.java index 484b8d8..bcea7a1 100644 --- a/src/main/java/com/extendedae_plus/mixin/autopattern/CraftingTreeProcessMixin.java +++ b/src/main/java/com/extendedae_plus/mixin/autopattern/CraftingTreeProcessMixin.java @@ -11,6 +11,8 @@ import appeng.crafting.inv.CraftingSimulationState; import appeng.crafting.pattern.AEProcessingPattern; import com.extendedae_plus.util.PatternScaler; import com.extendedae_plus.util.RequestedAmountHolder; +import com.extendedae_plus.api.SmartDoublingAwarePattern; +import com.extendedae_plus.content.ScaledProcessingPattern; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.injection.At; @@ -34,13 +36,33 @@ public abstract class CraftingTreeProcessMixin { ) private static IPatternDetails extendedae_plus$replaceDetailsAtHead(IPatternDetails original, ICraftingService cc, CraftingCalculation job, IPatternDetails details, CraftingTreeNode craftingTreeNode) { try { + // 若传入的 details 已经是缩放样板,且原始样板不允许缩放,则直接解包为原始样板 + if (details instanceof ScaledProcessingPattern sp) { + var proc0 = sp.getOriginal(); + if (proc0 instanceof SmartDoublingAwarePattern aware0 && !aware0.eap$allowScaling()) { + LOGGER.info("[extendedae_plus] 传入已缩放样板但已禁用,解包为原始样板并跳过缩放: requested={}", RequestedAmountHolder.get()); + return proc0; + } + } + if (!(details instanceof AEProcessingPattern proc)) return original; + // 若样板标记为不允许缩放,则直接跳过 + if (proc instanceof SmartDoublingAwarePattern aware && !aware.eap$allowScaling()) { + LOGGER.info("[extendedae_plus] 智能翻倍已禁用,跳过缩放: pattern={} target={} requested={}", proc, craftingTreeNode, RequestedAmountHolder.get()); + return original; + } + CraftingTreeNodeAccessor parentAcc = (CraftingTreeNodeAccessor) craftingTreeNode; AEKey parentTarget = parentAcc.extendedae_plus$getWhat(); long requested = RequestedAmountHolder.get(); // 使用当前线程栈顶的值进行缩放,不在此处清理;构造完成后应该由调用方的 pop 恢复状态 - return PatternScaler.scale(proc, parentTarget, requested); + LOGGER.info("[extendedae_plus] 执行缩放: allowScaling={} target={} requested={}", + (proc instanceof SmartDoublingAwarePattern aware2 ? aware2.eap$allowScaling() : null), + parentTarget, + requested); + var scaled = PatternScaler.scale(proc, parentTarget, requested); + return scaled != null ? scaled : original; } catch (Exception e) { LOGGER.warn("构建倍增样板出错", e); e.printStackTrace(); diff --git a/src/main/java/com/extendedae_plus/util/PatternScaler.java b/src/main/java/com/extendedae_plus/util/PatternScaler.java index dc15972..81e7d83 100644 --- a/src/main/java/com/extendedae_plus/util/PatternScaler.java +++ b/src/main/java/com/extendedae_plus/util/PatternScaler.java @@ -5,6 +5,7 @@ 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; @@ -18,6 +19,12 @@ public final class PatternScaler { 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(); diff --git a/src/main/resources/extendedae_plus.mixins.json b/src/main/resources/extendedae_plus.mixins.json index 776795c..f855dd3 100644 --- a/src/main/resources/extendedae_plus.mixins.json +++ b/src/main/resources/extendedae_plus.mixins.json @@ -34,10 +34,12 @@ "ae2.PatternProviderMenuAdvancedMixin", "ae2.PatternProviderLogicDoublingMixin", "ae2.PatternProviderMenuDoublingMixin", + "ae2.AEProcessingPatternMixin", "ae2.accessor.MEStorageMenuAccessor", "ae2.accessor.PatternEncodingTermMenuAccessor", "ae2.accessor.PatternProviderLogicAccessor", "ae2.accessor.PatternProviderLogicPatternInputsAccessor", + "ae2.accessor.PatternProviderLogicPatternsAccessor", "ae2.accessor.PatternProviderMenuAdvancedAccessor", "ae2WTlib.ContainerUWirelessExPatternTerminalMixin", "autopattern.CraftingCalculationAccessor",