diff --git a/build.gradle b/build.gradle index 007bfa3..d87ef60 100644 --- a/build.gradle +++ b/build.gradle @@ -106,6 +106,9 @@ dependencies { //mae2 // modRuntimeOnly "curse.maven:modern-ae2-additions-1028068:6342203" modCompileOnly "curse.maven:modern-ae2-additions-1028068:6342203" + + //advancedae + modCompileOnly "curse.maven:advancedae-1084104:5957960" } allprojects { diff --git a/src/main/java/com/extendedae_plus/mixin/ae2/autopattern/PatternProviderLogicContainsRedirectMixin.java b/src/main/java/com/extendedae_plus/mixin/ae2/autopattern/PatternProviderLogicContainsRedirectMixin.java index 3aa18e7..d6dc2a5 100644 --- a/src/main/java/com/extendedae_plus/mixin/ae2/autopattern/PatternProviderLogicContainsRedirectMixin.java +++ b/src/main/java/com/extendedae_plus/mixin/ae2/autopattern/PatternProviderLogicContainsRedirectMixin.java @@ -9,7 +9,7 @@ import org.spongepowered.asm.mixin.injection.Redirect; import java.util.List; -/** +/**适配 * Redirect PatternProviderLogic.pushPattern 中对 List.contains 的调用, * 在遇到缩放样板时回退匹配到原始样板实例。 */ diff --git a/src/main/java/com/extendedae_plus/mixin/ae2/autopattern/adaptation/AdvPatternProviderLogicContainsRedirectMixin.java b/src/main/java/com/extendedae_plus/mixin/ae2/autopattern/adaptation/AdvPatternProviderLogicContainsRedirectMixin.java new file mode 100644 index 0000000..858c992 --- /dev/null +++ b/src/main/java/com/extendedae_plus/mixin/ae2/autopattern/adaptation/AdvPatternProviderLogicContainsRedirectMixin.java @@ -0,0 +1,40 @@ +package com.extendedae_plus.mixin.ae2.autopattern.adaptation; + +import appeng.api.crafting.IPatternDetails; +import com.extendedae_plus.content.ScaledProcessingPattern; +import net.pedroksl.advanced_ae.common.logic.AdvPatternProviderLogic; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Pseudo; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Redirect; + +import java.util.List; + +/**适配 + * Redirect PatternProviderLogic.pushPattern 中对 List.contains 的调用, + * 在遇到缩放样板时回退匹配到原始样板实例。 + */ +@Pseudo +@Mixin(value = AdvPatternProviderLogic.class, remap = false) +public class AdvPatternProviderLogicContainsRedirectMixin { + + @Redirect(method = "pushPattern", + at = @At( + value = "INVOKE", + target = "Ljava/util/List;contains(Ljava/lang/Object;)Z") + ) + private boolean eap$patternsContains(List list, Object o) { + try { + if (o instanceof ScaledProcessingPattern scaled) { + IPatternDetails base = scaled.getOriginal(); + if (base != null && list.indexOf(base) != -1) { + return true; + } + } + // 使用 indexOf 避免再次触发对 List.contains 的 redirect(防止递归) + return list.indexOf(o) != -1; + } catch (Throwable t) { + return list.indexOf(o) != -1; + } + } +} \ No newline at end of file diff --git a/src/main/java/com/extendedae_plus/mixin/extendedae/client/gui/GuiExPatternTerminalMixin.java b/src/main/java/com/extendedae_plus/mixin/extendedae/client/gui/GuiExPatternTerminalMixin.java index df08740..01622c1 100644 --- a/src/main/java/com/extendedae_plus/mixin/extendedae/client/gui/GuiExPatternTerminalMixin.java +++ b/src/main/java/com/extendedae_plus/mixin/extendedae/client/gui/GuiExPatternTerminalMixin.java @@ -9,6 +9,7 @@ import appeng.client.gui.style.ScreenStyle; import appeng.client.gui.widgets.AETextField; import appeng.client.gui.widgets.IconButton; import appeng.menu.AEBaseMenu; +import com.extendedae_plus.mixin.extendedae.accessor.GuiExPatternTerminalAccessor; import com.extendedae_plus.network.ModNetwork; import com.extendedae_plus.network.OpenProviderUiC2SPacket; import com.glodblock.github.extendedae.client.gui.GuiExPatternTerminal; @@ -39,9 +40,7 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; import java.lang.reflect.Constructor; import java.lang.reflect.Method; -import java.util.HashMap; -import java.util.Map; -import java.util.Set; +import java.util.*; @Pseudo @Mixin(value = GuiExPatternTerminal.class) @@ -218,12 +217,11 @@ public abstract class GuiExPatternTerminalMixin extends AEBaseScreen private void eap$tryOpenProviderUI(int rowIndex) { try { // 使用 Accessor 获取 rows,避免取到父类导致失败 - com.extendedae_plus.mixin.extendedae.accessor.GuiExPatternTerminalAccessor acc = - (com.extendedae_plus.mixin.extendedae.accessor.GuiExPatternTerminalAccessor) (Object) this; - java.util.ArrayList rows = acc.getRows(); + GuiExPatternTerminalAccessor acc = (GuiExPatternTerminalAccessor) this; + ArrayList rows = acc.getRows(); // 找到该分组对应的第一个 PatternContainerRecord - Class cls = com.glodblock.github.extendedae.client.gui.GuiExPatternTerminal.class; + Class cls = GuiExPatternTerminal.class; var byGroupField = cls.getDeclaredField("byGroup"); byGroupField.setAccessible(true); Object byGroup = byGroupField.get(this); // HashMultimap @@ -234,7 +232,7 @@ public abstract class GuiExPatternTerminalMixin extends AEBaseScreen Object group = groupField.get(headerRow); // 调用 byGroup.get(group),再取第一个元素 - java.util.Collection containers = (java.util.Collection) byGroup.getClass().getMethod("get", Object.class).invoke(byGroup, group); + Collection containers = (Collection) byGroup.getClass().getMethod("get", Object.class).invoke(byGroup, group); if (containers == null || containers.isEmpty()) { return; } @@ -245,7 +243,7 @@ public abstract class GuiExPatternTerminalMixin extends AEBaseScreen var infoMapField = cls.getDeclaredField("infoMap"); infoMapField.setAccessible(true); @SuppressWarnings("unchecked") - java.util.HashMap infoMap = (java.util.HashMap) infoMapField.get(this); + HashMap infoMap = (HashMap) infoMapField.get(this); Object info = infoMap.get(serverId); if (info == null) { // 无位置信息,提示 @@ -299,7 +297,7 @@ public abstract class GuiExPatternTerminalMixin extends AEBaseScreen // 通过反射调用refreshList方法 - 先尝试当前类,失败后尝试父类 try { - java.lang.reflect.Method refreshMethod = null; + Method refreshMethod = null; try { // 先尝试在当前类中查找 refreshMethod = this.getClass().getDeclaredMethod("refreshList"); @@ -514,13 +512,12 @@ public abstract class GuiExPatternTerminalMixin extends AEBaseScreen // 动态放置/创建每个组标题后的“打开UI”按钮 try { // 使用 Accessor 获取必要的字段,避免反射失败 - com.extendedae_plus.mixin.extendedae.accessor.GuiExPatternTerminalAccessor acc = - (com.extendedae_plus.mixin.extendedae.accessor.GuiExPatternTerminalAccessor) (Object) this; + GuiExPatternTerminalAccessor acc = (GuiExPatternTerminalAccessor) this; java.util.ArrayList rows = acc.getRows(); int currentScroll = acc.getScrollbar().getCurrentScroll(); // 直接引用目标类以获取其静态常量 - Class cls = com.glodblock.github.extendedae.client.gui.GuiExPatternTerminal.class; + Class cls = GuiExPatternTerminal.class; int GUI_PADDING_X = getIntConst(cls, "GUI_PADDING_X", 22); int GUI_PADDING_Y = getIntConst(cls, "GUI_PADDING_Y", 6); int GUI_HEADER_HEIGHT = getIntConst(cls, "GUI_HEADER_HEIGHT", 51); diff --git a/src/main/java/com/extendedae_plus/network/CraftingMonitorOpenProviderC2SPacket.java b/src/main/java/com/extendedae_plus/network/CraftingMonitorOpenProviderC2SPacket.java index 216546c..b1329fe 100644 --- a/src/main/java/com/extendedae_plus/network/CraftingMonitorOpenProviderC2SPacket.java +++ b/src/main/java/com/extendedae_plus/network/CraftingMonitorOpenProviderC2SPacket.java @@ -8,12 +8,12 @@ import appeng.helpers.patternprovider.PatternProviderLogic; import appeng.helpers.patternprovider.PatternProviderLogicHost; import appeng.me.service.CraftingService; import appeng.menu.AEBaseMenu; -import appeng.menu.me.crafting.CraftingCPUMenu; import appeng.menu.locator.MenuLocators; +import appeng.menu.me.crafting.CraftingCPUMenu; +import appeng.parts.AEBasePart; import com.extendedae_plus.mixin.ae2.accessor.PatternProviderLogicAccessor; import com.mojang.logging.LogUtils; import net.minecraft.network.FriendlyByteBuf; -import net.minecraft.server.level.ServerLevel; import net.minecraft.server.level.ServerPlayer; import net.minecraftforge.network.NetworkEvent; @@ -94,7 +94,7 @@ public class CraftingMonitorOpenProviderC2SPacket { // 直接打开供应器自身的 UI(调用 Host 默认方法) try { // 部件与方块实体分别选择定位器 - if (host instanceof appeng.parts.AEBasePart part) { + if (host instanceof AEBasePart part) { host.openMenu(player, MenuLocators.forPart(part)); } else { host.openMenu(player, MenuLocators.forBlockEntity(pbe)); @@ -112,4 +112,6 @@ public class CraftingMonitorOpenProviderC2SPacket { }); context.setPacketHandled(true); } + + } diff --git a/src/main/resources/extendedae_plus.mixins.json b/src/main/resources/extendedae_plus.mixins.json index dbdae71..e001c30 100644 --- a/src/main/resources/extendedae_plus.mixins.json +++ b/src/main/resources/extendedae_plus.mixins.json @@ -41,6 +41,7 @@ "ae2.autopattern.CraftingTreeNodeMixin", "ae2.autopattern.CraftingTreeProcessMixin", "ae2.autopattern.PatternProviderLogicContainsRedirectMixin", + "ae2.autopattern.adaptation.AdvPatternProviderLogicContainsRedirectMixin", "ae2.helpers.PatternProviderLogicAdvancedMixin", "ae2.helpers.PatternProviderLogicDoublingMixin", "ae2.menu.ContainerPatternEncodingTermMenuMixin",