增加高级阻挡功能
This commit is contained in:
parent
bd3de00f13
commit
d90559082c
|
|
@ -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; // 每个输入槽都至少匹配了一个候选输入
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user