From b9da8a4524a139c2fe0991c72adf120d5ed71e8a Mon Sep 17 00:00:00 2001 From: GaLi Date: Mon, 24 Nov 2025 18:11:11 +0800 Subject: [PATCH] =?UTF-8?q?=E5=88=86=E7=A6=BBADV=E7=9A=84=E9=80=82?= =?UTF-8?q?=E9=85=8Dmixin=E5=88=B0=E5=8D=95=E7=8B=ACmixin&mixinPlugin?= =?UTF-8?q?=E4=B8=AD=E5=A2=9E=E5=8A=A0=E5=88=A4=E6=96=AD=E6=98=AF=E5=90=A6?= =?UTF-8?q?=E5=8A=A0=E8=BD=BD=E8=AF=A5mixin?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...tternProviderLogicVirtualCompatBridge.java | 9 ++ .../mixin/ExtendedAEPlusMixinPlugin.java | 63 +++++++----- ...rnProviderLogicVirtualCompletionMixin.java | 98 +++++++++++++++++++ .../PatternProviderLogicCompatMixin.java | 51 +++------- .../resources/extendedae_plus.mixins.json | 1 + 5 files changed, 157 insertions(+), 65 deletions(-) create mode 100644 src/main/java/com/extendedae_plus/compat/PatternProviderLogicVirtualCompatBridge.java create mode 100644 src/main/java/com/extendedae_plus/mixin/advancedae/compat/PatternProviderLogicVirtualCompletionMixin.java diff --git a/src/main/java/com/extendedae_plus/compat/PatternProviderLogicVirtualCompatBridge.java b/src/main/java/com/extendedae_plus/compat/PatternProviderLogicVirtualCompatBridge.java new file mode 100644 index 0000000..718bd31 --- /dev/null +++ b/src/main/java/com/extendedae_plus/compat/PatternProviderLogicVirtualCompatBridge.java @@ -0,0 +1,9 @@ +package com.extendedae_plus.compat; + +import appeng.api.networking.IManagedGridNode; + +public interface PatternProviderLogicVirtualCompatBridge { + boolean eap$compatIsVirtualCraftingEnabled(); + + IManagedGridNode eap$compatGetMainNode(); +} diff --git a/src/main/java/com/extendedae_plus/mixin/ExtendedAEPlusMixinPlugin.java b/src/main/java/com/extendedae_plus/mixin/ExtendedAEPlusMixinPlugin.java index aefb88e..90f63b3 100644 --- a/src/main/java/com/extendedae_plus/mixin/ExtendedAEPlusMixinPlugin.java +++ b/src/main/java/com/extendedae_plus/mixin/ExtendedAEPlusMixinPlugin.java @@ -8,36 +8,44 @@ import java.util.List; import java.util.Set; public class ExtendedAEPlusMixinPlugin implements IMixinConfigPlugin { - private static boolean isJeiPresent() { - try { - ClassLoader cl = Thread.currentThread().getContextClassLoader(); - Class.forName("mezz.jei.api.IModPlugin", false, cl); - return true; - } catch (Throwable ignored) { - return false; - } - } + private static boolean isClassPresent(String className) { + try { + ClassLoader cl = Thread.currentThread().getContextClassLoader(); + Class.forName(className, false, cl); + return true; + } catch (Throwable ignored) { + return false; + } + } - @Override - public void onLoad(String mixinPackage) { } + private static boolean isJeiPresent() { + return isClassPresent("mezz.jei.api.IModPlugin"); + } - @Override - public String getRefMapperConfig() { return null; } + private static boolean isAdvancedAePresent() { + return isClassPresent("net.pedroksl.advanced_ae.AdvancedAE"); + } - @Override - public boolean shouldApplyMixin(String targetClassName, String mixinClassName) { - if (!isJeiPresent()) { - // Disable all JEI package mixins and any mixins that reference JEI-only helpers - if (mixinClassName.startsWith("com.extendedae_plus.mixin.jei")) return false; - if (mixinClassName.equals("com.extendedae_plus.mixin.ae2.menu.CraftConfirmMenuGoBackMixin")) return false; - } - return true; - } + @Override + public void onLoad(String mixinPackage) { } - @Override - public void acceptTargets(Set myTargets, Set otherTargets) { } + @Override + public String getRefMapperConfig() { return null; } - @Override + @Override + public boolean shouldApplyMixin(String targetClassName, String mixinClassName) { + if (!isJeiPresent()) { + // Disable all JEI package mixins and any mixins that reference JEI-only helpers + if (mixinClassName.startsWith("com.extendedae_plus.mixin.jei")) return false; + if (mixinClassName.equals("com.extendedae_plus.mixin.ae2.menu.CraftConfirmMenuGoBackMixin")) return false; + } + if (!isAdvancedAePresent()) { + if (mixinClassName.equals("com.extendedae_plus.mixin.advancedae.compat.PatternProviderLogicVirtualCompletionMixin")) { + return false; + } + } + return true; + } public List getMixins() { return null; } @Override @@ -45,4 +53,7 @@ public class ExtendedAEPlusMixinPlugin implements IMixinConfigPlugin { @Override public void postApply(String targetClassName, ClassNode targetClass, String mixinClassName, IMixinInfo mixinInfo) { } -} \ No newline at end of file + + @Override + public void acceptTargets(Set myTargets, Set otherTargets) { } +} \ No newline at end of file diff --git a/src/main/java/com/extendedae_plus/mixin/advancedae/compat/PatternProviderLogicVirtualCompletionMixin.java b/src/main/java/com/extendedae_plus/mixin/advancedae/compat/PatternProviderLogicVirtualCompletionMixin.java new file mode 100644 index 0000000..4169029 --- /dev/null +++ b/src/main/java/com/extendedae_plus/mixin/advancedae/compat/PatternProviderLogicVirtualCompletionMixin.java @@ -0,0 +1,98 @@ +package com.extendedae_plus.mixin.advancedae.compat; + +import appeng.api.crafting.IPatternDetails; +import appeng.api.networking.crafting.ICraftingCPU; +import appeng.api.networking.crafting.ICraftingService; +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; + +/** + * AdvancedAE 版本的虚拟完成兼容逻辑。 + */ +@Mixin(value = PatternProviderLogic.class, priority = 850, remap = false) +public abstract class PatternProviderLogicVirtualCompletionMixin { + + @Inject(method = "pushPattern", at = @At("RETURN")) + private void eap$advancedaeVirtualCompletion(IPatternDetails patternDetails, KeyCounter[] inputHolder, + CallbackInfoReturnable cir) { + if (!cir.getReturnValueZ()) { + return; + } + if (!(this instanceof PatternProviderLogicVirtualCompatBridge bridge)) { + return; + } + if (!bridge.eap$compatIsVirtualCraftingEnabled()) { + return; + } + + var mainNode = bridge.eap$compatGetMainNode(); + if (mainNode == null) { + return; + } + + var node = mainNode.getNode(); + if (node == null) { + return; + } + + var grid = node.getGrid(); + 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 == null && patternDetails != null) { + var patternDefinition = patternDetails.getDefinition(); + for (var entry : tasks.entrySet()) { + var taskPattern = entry.getKey(); + if (taskPattern == patternDetails) { + progress = entry.getValue(); + break; + } + if (taskPattern != null && patternDefinition != null) { + var taskDefinition = taskPattern.getDefinition(); + if (taskDefinition != null && taskDefinition.equals(patternDefinition)) { + progress = entry.getValue(); + break; + } + } + } + } + + if (progress instanceof AdvExecutingCraftingJobTaskProgressAccessor advProgressAccessor) { + if (advProgressAccessor.eap$getAdvValue() <= 1) { + advCpu.cancelJob(); + break; + } + } + } + } + } + } + } +} diff --git a/src/main/java/com/extendedae_plus/mixin/ae2/compat/PatternProviderLogicCompatMixin.java b/src/main/java/com/extendedae_plus/mixin/ae2/compat/PatternProviderLogicCompatMixin.java index b401b6f..0ff9259 100644 --- a/src/main/java/com/extendedae_plus/mixin/ae2/compat/PatternProviderLogicCompatMixin.java +++ b/src/main/java/com/extendedae_plus/mixin/ae2/compat/PatternProviderLogicCompatMixin.java @@ -15,9 +15,7 @@ import appeng.me.cluster.implementations.CraftingCPUCluster; import com.extendedae_plus.ae.items.ChannelCardItem; import com.extendedae_plus.bridge.CompatUpgradeProvider; import com.extendedae_plus.bridge.InterfaceWirelessLinkBridge; -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.compat.PatternProviderLogicVirtualCompatBridge; import com.extendedae_plus.compat.UpgradeSlotCompat; import com.extendedae_plus.init.ModItems; import com.extendedae_plus.mixin.ae2.accessor.CraftingCpuLogicAccessor; @@ -29,7 +27,6 @@ import com.extendedae_plus.wireless.endpoint.GenericNodeEndpointImpl; import net.minecraft.nbt.CompoundTag; import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemStack; -import net.pedroksl.advanced_ae.common.cluster.AdvCraftingCPU; import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; @@ -48,7 +45,7 @@ import java.util.List; * - 建立到无线主站的网格连接。 */ @Mixin(value = PatternProviderLogic.class, priority = 900, remap = false) -public abstract class PatternProviderLogicCompatMixin implements CompatUpgradeProvider, InterfaceWirelessLinkBridge { +public abstract class PatternProviderLogicCompatMixin implements CompatUpgradeProvider, InterfaceWirelessLinkBridge, PatternProviderLogicVirtualCompatBridge { @Unique private IUpgradeInventory eap$compatUpgrades = UpgradeInventories.empty(); @@ -536,43 +533,19 @@ public abstract class PatternProviderLogicCompatMixin implements CompatUpgradePr } 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 == null && patternDetails != null) { - var patternDefinition = patternDetails.getDefinition(); - for (var entry : tasks.entrySet()) { - var taskPattern = entry.getKey(); - if (taskPattern == patternDetails) { - progress = entry.getValue(); - break; - } - if (taskPattern != null && patternDefinition != null) { - var taskDefinition = taskPattern.getDefinition(); - if (taskDefinition != null && taskDefinition.equals(patternDefinition)) { - progress = entry.getValue(); - break; - } - } - } - } - - if (progress instanceof AdvExecutingCraftingJobTaskProgressAccessor advProgressAccessor) { - if (advProgressAccessor.eap$getAdvValue() <= 1) { - advCpu.cancelJob(); - break; - } - } - } - } - } } } + @Override + public boolean eap$compatIsVirtualCraftingEnabled() { + return this.eap$compatVirtualCraftingEnabled; + } + + @Override + public IManagedGridNode eap$compatGetMainNode() { + return this.mainNode; + } + @Unique private void eap$compatSyncVirtualCraftingState() { try { diff --git a/src/main/resources/extendedae_plus.mixins.json b/src/main/resources/extendedae_plus.mixins.json index 733ca40..87b1991 100644 --- a/src/main/resources/extendedae_plus.mixins.json +++ b/src/main/resources/extendedae_plus.mixins.json @@ -12,6 +12,7 @@ "advancedae.accessor.AdvExecutingCraftingJobTaskProgressAccessor", "advancedae.helpers.AdvPatternProviderLogicAdvancedMixin", "advancedae.helpers.AdvPatternProviderLogicDoublingMixin", + "advancedae.compat.PatternProviderLogicVirtualCompletionMixin", "advancedae.menu.AdvPatternProviderMenuAdvancedMixin", "ae2.AEProcessingPatternMixin", "ae2.CraftingCalculationMixin",