增加高级阻挡功能

This commit is contained in:
GaLi 2025-08-20 17:24:00 +08:00
parent bd3de00f13
commit d90559082c

View File

@ -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<AEKey> 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; // 每个输入槽都至少匹配了一个候选输入
}
}