增加高级阻挡功能
This commit is contained in:
parent
bd3de00f13
commit
d90559082c
|
|
@ -1,11 +1,19 @@
|
||||||
package com.extendedae_plus.mixin.ae2;
|
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.PatternProviderLogic;
|
||||||
|
import appeng.helpers.patternprovider.PatternProviderTarget;
|
||||||
|
import appeng.api.stacks.GenericStack;
|
||||||
import net.minecraft.nbt.CompoundTag;
|
import net.minecraft.nbt.CompoundTag;
|
||||||
import org.spongepowered.asm.mixin.Mixin;
|
import org.spongepowered.asm.mixin.Mixin;
|
||||||
import org.spongepowered.asm.mixin.Unique;
|
import org.spongepowered.asm.mixin.Unique;
|
||||||
import org.spongepowered.asm.mixin.injection.At;
|
import org.spongepowered.asm.mixin.injection.At;
|
||||||
import org.spongepowered.asm.mixin.injection.Inject;
|
import org.spongepowered.asm.mixin.injection.Inject;
|
||||||
|
import org.spongepowered.asm.mixin.injection.Redirect;
|
||||||
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
|
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
|
||||||
|
|
||||||
import com.extendedae_plus.api.AdvancedBlockingHolder;
|
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);
|
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