From d90559082c3ef868bd65322bffb63f1322007974 Mon Sep 17 00:00:00 2001 From: GaLi <3096147684@qq.com> Date: Wed, 20 Aug 2025 17:24:00 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E9=AB=98=E7=BA=A7=E9=98=BB?= =?UTF-8?q?=E6=8C=A1=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../PatternProviderLogicAdvancedMixin.java | 49 +++++++++++++++++++ 1 file changed, 49 insertions(+) diff --git a/src/main/java/com/extendedae_plus/mixin/ae2/PatternProviderLogicAdvancedMixin.java b/src/main/java/com/extendedae_plus/mixin/ae2/PatternProviderLogicAdvancedMixin.java index cefd499..d6dbfd4 100644 --- a/src/main/java/com/extendedae_plus/mixin/ae2/PatternProviderLogicAdvancedMixin.java +++ b/src/main/java/com/extendedae_plus/mixin/ae2/PatternProviderLogicAdvancedMixin.java @@ -1,11 +1,19 @@ package com.extendedae_plus.mixin.ae2; +import java.util.Collections; + +import appeng.api.crafting.IPatternDetails; +import appeng.api.crafting.IPatternDetails.IInput; +import appeng.api.stacks.AEKey; import appeng.helpers.patternprovider.PatternProviderLogic; +import appeng.helpers.patternprovider.PatternProviderTarget; +import appeng.api.stacks.GenericStack; import net.minecraft.nbt.CompoundTag; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Unique; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.Redirect; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import com.extendedae_plus.api.AdvancedBlockingHolder; @@ -43,4 +51,45 @@ public class PatternProviderLogicAdvancedMixin implements AdvancedBlockingHolder System.out.println("[EPP][NBT] readFromNBT: key missing, default=" + this.epp$advancedBlocking); } } + + // 在 pushPattern 中,重定向对 adapter.containsPatternInput(...) 的调用 + @Redirect(method = "pushPattern", at = @At(value = "INVOKE", target = "Lappeng/helpers/patternprovider/PatternProviderTarget;containsPatternInput(Ljava/util/Set;)Z"), remap = false) + private boolean epp$redirectBlockingContains(PatternProviderTarget adapter, + java.util.Set patternInputs, + IPatternDetails patternDetails, + appeng.api.stacks.KeyCounter[] inputHolder) { + // 原版是否打开阻挡 + boolean vanillaBlocking = ((PatternProviderLogic)(Object)this).isBlocking(); + if (!vanillaBlocking) { + return adapter.containsPatternInput(patternInputs); + } + + // 仅当高级阻挡启用时启用“匹配则不阻挡” + if (this.epp$advancedBlocking) { + if (epp$targetFullyMatchesPatternInputs(adapter, patternDetails)) { + // 返回 false 表示“不包含阻挡关键物”,从而不触发 continue,允许发配 + return false; + } + } + // 否则使用原判定 + return adapter.containsPatternInput(patternInputs); + } + + @Unique + private boolean epp$targetFullyMatchesPatternInputs(PatternProviderTarget adapter, IPatternDetails patternDetails) { + for (IInput in : patternDetails.getInputs()) { + boolean slotMatched = false; + for (GenericStack candidate : in.getPossibleInputs()) { + AEKey key = candidate.what().dropSecondary(); + if (adapter.containsPatternInput(Collections.singleton(key))) { + slotMatched = true; + break; + } + } + if (!slotMatched) { + return false; // 任一输入槽未匹配则失败 + } + } + return true; // 每个输入槽都至少匹配了一个候选输入 + } }