分离ADV的适配mixin到单独mixin&mixinPlugin中增加判断是否加载该mixin

This commit is contained in:
GaLi 2025-11-24 18:25:10 +08:00
parent b5498588ba
commit 80b2194a85
4 changed files with 97 additions and 22 deletions

View File

@ -0,0 +1,12 @@
package com.extendedae_plus.compat;
import appeng.api.networking.IGrid;
import appeng.api.networking.IManagedGridNode;
public interface PatternProviderLogicVirtualCompatBridge {
boolean eap$compatIsVirtualCraftingEnabled();
IGrid eap$compatGetGrid();
IManagedGridNode eap$compatGetMainNode();
}

View File

@ -0,0 +1,67 @@
package com.extendedae_plus.mixin.advancedae.compat;
import appeng.api.networking.crafting.ICraftingCPU;
import appeng.api.networking.crafting.ICraftingService;
import appeng.api.crafting.IPatternDetails;
import appeng.api.stacks.KeyCounter;
import appeng.helpers.patternprovider.PatternProviderLogic;
import com.extendedae_plus.compat.PatternProviderLogicVirtualCompatBridge;
import com.extendedae_plus.mixin.advancedae.accessor.AdvCraftingCPULogicAccessor;
import com.extendedae_plus.mixin.advancedae.accessor.AdvExecutingCraftingJobAccessor;
import com.extendedae_plus.mixin.advancedae.accessor.AdvExecutingCraftingJobTaskProgressAccessor;
import net.pedroksl.advanced_ae.common.cluster.AdvCraftingCPU;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
@Mixin(value = PatternProviderLogic.class, priority = 450, remap = false)
public abstract class PatternProviderLogicVirtualCompletionMixin {
@Inject(method = "pushPattern", at = @At("RETURN"))
private void eap$advancedaeVirtualCompletion(IPatternDetails patternDetails, KeyCounter[] inputHolder,
CallbackInfoReturnable<Boolean> cir) {
if (!cir.getReturnValueZ()) {
return;
}
if (!(this instanceof PatternProviderLogicVirtualCompatBridge bridge)) {
return;
}
if (!bridge.eap$compatIsVirtualCraftingEnabled()) {
return;
}
var grid = bridge.eap$compatGetGrid();
if (grid == null) {
return;
}
ICraftingService craftingService = grid.getCraftingService();
if (craftingService == null) {
return;
}
for (ICraftingCPU cpu : craftingService.getCpus()) {
if (!cpu.isBusy()) {
continue;
}
if (cpu instanceof AdvCraftingCPU advCpu) {
var logic = advCpu.craftingLogic;
if (logic instanceof AdvCraftingCPULogicAccessor advLogicAccessor) {
var job = advLogicAccessor.eap$getAdvJob();
if (job != null && job instanceof AdvExecutingCraftingJobAccessor advJobAccessor) {
var tasks = advJobAccessor.eap$getAdvTasks();
var progress = tasks.get(patternDetails);
if (progress instanceof AdvExecutingCraftingJobTaskProgressAccessor advProgressAccessor) {
if (advProgressAccessor.eap$getAdvValue() <= 1) {
advCpu.cancelJob();
break;
}
}
}
}
}
}
}
}

View File

@ -12,19 +12,16 @@ import appeng.api.upgrades.UpgradeInventories;
import appeng.helpers.patternprovider.PatternProviderLogic;
import appeng.helpers.patternprovider.PatternProviderLogicHost;
import appeng.me.cluster.implementations.CraftingCPUCluster;
import com.extendedae_plus.mixin.advancedae.accessor.AdvCraftingCPULogicAccessor;
import com.extendedae_plus.mixin.advancedae.accessor.AdvExecutingCraftingJobAccessor;
import com.extendedae_plus.mixin.advancedae.accessor.AdvExecutingCraftingJobTaskProgressAccessor;
import com.extendedae_plus.ae.wireless.WirelessSlaveLink;
import com.extendedae_plus.ae.wireless.endpoint.GenericNodeEndpointImpl;
import com.extendedae_plus.api.bridge.IInterfaceWirelessLinkBridge;
import com.extendedae_plus.compat.PatternProviderLogicVirtualCompatBridge;
import com.extendedae_plus.compat.UpgradeSlotCompat;
import com.extendedae_plus.init.ModItems;
import com.extendedae_plus.items.materials.ChannelCardItem;
import com.extendedae_plus.mixin.ae2.accessor.CraftingCpuLogicAccessor;
import com.extendedae_plus.mixin.ae2.accessor.ExecutingCraftingJobAccessor;
import com.extendedae_plus.util.Logger;
import net.pedroksl.advanced_ae.common.cluster.AdvCraftingCPU;
import net.minecraft.nbt.CompoundTag;
import net.minecraft.world.item.ItemStack;
import org.spongepowered.asm.mixin.Final;
@ -45,7 +42,7 @@ import java.util.List;
* 根据appflux是否存在来决定是否实现IUpgradeableObject接口
*/
@Mixin(value = PatternProviderLogic.class, priority = 500, remap = false)
public abstract class PatternProviderLogicCompatMixin implements IUpgradeableObject, IInterfaceWirelessLinkBridge {
public abstract class PatternProviderLogicCompatMixin implements IUpgradeableObject, IInterfaceWirelessLinkBridge, PatternProviderLogicVirtualCompatBridge {
@Unique
private IUpgradeInventory eap$compatUpgrades = UpgradeInventories.empty();
@ -148,23 +145,6 @@ public abstract class PatternProviderLogicCompatMixin implements IUpgradeableObj
}
}
}
continue;
}
if (cpu instanceof AdvCraftingCPU advCpu) {
var logic = advCpu.craftingLogic;
if (logic instanceof AdvCraftingCPULogicAccessor advLogicAccessor) {
var job = advLogicAccessor.eap$getAdvJob();
if (job != null && job instanceof AdvExecutingCraftingJobAccessor advJobAccessor) {
var tasks = advJobAccessor.eap$getAdvTasks();
var progress = tasks.get(patternDetails);
if (progress instanceof AdvExecutingCraftingJobTaskProgressAccessor advProgressAccessor) {
if (advProgressAccessor.eap$getAdvValue() <= 1) {
advCpu.cancelJob();
break;
}
}
}
}
}
}
}
@ -274,6 +254,21 @@ public abstract class PatternProviderLogicCompatMixin implements IUpgradeableObj
}
}
@Override
public boolean eap$compatIsVirtualCraftingEnabled() {
return this.eap$compatVirtualCraftingEnabled;
}
@Override
public IGrid eap$compatGetGrid() {
return this.getGrid();
}
@Override
public IManagedGridNode eap$compatGetMainNode() {
return this.mainNode;
}
@Inject(method = "pushPattern", at = @At("HEAD"))
private void eap$compatOnPushPattern(IPatternDetails patternDetails, KeyCounter[] inputHolder, CallbackInfoReturnable<Boolean> cir) {
eap$compatTryVirtualCompletion(patternDetails);

View File

@ -46,6 +46,7 @@
"advancedae.helpers.AdvPatternProviderLogicDoublingMixin",
"advancedae.menu.AdvPatternProviderMenuAdvancedMixin",
"advancedae.menu.AdvPatternProviderMenuDoublingMixin",
"advancedae.compat.PatternProviderLogicVirtualCompletionMixin",
"ae2.AEProcessingPatternMixin",
"ae2.CraftingCalculationMixin",
"ae2.CraftingCPUClusterMixin",