From 813500eb4281f867a54d11a8dd233e1095642ad0 Mon Sep 17 00:00:00 2001 From: GaLi Date: Wed, 3 Dec 2025 17:55:17 +0800 Subject: [PATCH] =?UTF-8?q?=E8=B6=85=E7=BA=A7=E8=A3=85=E9=85=8D=E7=9F=A9?= =?UTF-8?q?=E9=98=B5=E6=A0=B7=E6=9D=BF=E6=A0=B8=E5=BF=83=E9=80=82=E9=85=8D?= =?UTF-8?q?ui?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../GuiAssemblerMatrixPatternInfoMixin.java | 78 +++++++++++++++++++ ...ssemblerMatrixPatternSlotTrackerMixin.java | 31 ++++++++ .../resources/extendedae_plus.mixins.json | 2 + 3 files changed, 111 insertions(+) create mode 100644 src/main/java/com/extendedae_plus/mixin/extendedae/client/gui/GuiAssemblerMatrixPatternInfoMixin.java create mode 100644 src/main/java/com/extendedae_plus/mixin/extendedae/container/ContainerAssemblerMatrixPatternSlotTrackerMixin.java diff --git a/src/main/java/com/extendedae_plus/mixin/extendedae/client/gui/GuiAssemblerMatrixPatternInfoMixin.java b/src/main/java/com/extendedae_plus/mixin/extendedae/client/gui/GuiAssemblerMatrixPatternInfoMixin.java new file mode 100644 index 0000000..cbd5cf6 --- /dev/null +++ b/src/main/java/com/extendedae_plus/mixin/extendedae/client/gui/GuiAssemblerMatrixPatternInfoMixin.java @@ -0,0 +1,78 @@ +package com.extendedae_plus.mixin.extendedae.client.gui; + +import com.extendedae_plus.content.matrix.PatternCorePlusBlockEntity; +import com.glodblock.github.extendedae.common.tileentities.matrix.TileAssemblerMatrixPattern; +import net.minecraft.client.Minecraft; +import net.minecraft.core.BlockPos; +import org.spongepowered.asm.mixin.Final; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +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.callback.CallbackInfo; + +import java.lang.reflect.Constructor; +import java.util.List; + + +@Mixin(targets = "com.glodblock.github.extendedae.client.gui.GuiAssemblerMatrix$PatternInfo") +public abstract class GuiAssemblerMatrixPatternInfoMixin { + + @Shadow + @Final + private List internalRows; + + @Unique + private static Constructor extendedae_plus$patternRowCtor; + + //通过反射获取目标类中的PatternRow内部类,new出来对象 + @Unique + private static Object extendedae_plus$createPatternRow(long patternID, int offset, int slots) { + try { + if (extendedae_plus$patternRowCtor == null) { + var clazz = Class.forName("com.glodblock.github.extendedae.client.gui.GuiAssemblerMatrix$PatternRow"); + extendedae_plus$patternRowCtor = clazz.getDeclaredConstructor(long.class, int.class, int.class); + extendedae_plus$patternRowCtor.setAccessible(true); + } + return extendedae_plus$patternRowCtor.newInstance(patternID, offset, slots); + } catch (ReflectiveOperationException e) { + throw new RuntimeException("Failed to create PatternRow", e); + } + } + + @Inject(method = "", at = @At("RETURN")) + private void extendedae_plus$rebuildRows(long id, CallbackInfo ci) { + int invSize = TileAssemblerMatrixPattern.INV_SIZE;//样板核心槽位数变量 + try { + //根据目标核心类型设置用于客户端渲染的槽位数值 + var mc = Minecraft.getInstance(); + if (mc.level != null) { + BlockPos pos = BlockPos.of(id); + var be = mc.level.getBlockEntity(pos); + if (be instanceof TileAssemblerMatrixPattern tile) { + invSize = tile.getTerminalPatternInventory().size(); + } else if (be instanceof PatternCorePlusBlockEntity plus) { + invSize = plus.getTerminalPatternInventory().size(); + } + } + } catch (Throwable ignored) { + } + + if (invSize <= TileAssemblerMatrixPattern.INV_SIZE) { + return; + } + + this.internalRows.clear(); + + int left = invSize; + int offset = 0; + do { + this.internalRows.add(extendedae_plus$createPatternRow(id, offset, Math.min(left, 9))); + left -= 9; + offset += 9; + } while (left > 0); + } +} + + diff --git a/src/main/java/com/extendedae_plus/mixin/extendedae/container/ContainerAssemblerMatrixPatternSlotTrackerMixin.java b/src/main/java/com/extendedae_plus/mixin/extendedae/container/ContainerAssemblerMatrixPatternSlotTrackerMixin.java new file mode 100644 index 0000000..415e4a6 --- /dev/null +++ b/src/main/java/com/extendedae_plus/mixin/extendedae/container/ContainerAssemblerMatrixPatternSlotTrackerMixin.java @@ -0,0 +1,31 @@ +package com.extendedae_plus.mixin.extendedae.container; + +import appeng.api.inventories.InternalInventory; +import appeng.util.inv.AppEngInternalInventory; +import com.glodblock.github.extendedae.common.tileentities.matrix.TileAssemblerMatrixPattern; +import org.spongepowered.asm.mixin.Final; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Mutable; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +@Mixin(targets = "com.glodblock.github.extendedae.container.ContainerAssemblerMatrix$PatternSlotTracker") +public abstract class ContainerAssemblerMatrixPatternSlotTrackerMixin { + + @Shadow + @Final + private InternalInventory server; + + @Shadow + @Final + @Mutable + private InternalInventory client; + + @Inject(method = "", at = @At("TAIL")) + private void extendedae_plus$resizeClientInventory(TileAssemblerMatrixPattern host, CallbackInfo ci) { + this.client = new AppEngInternalInventory(this.server.size()); + } +} + diff --git a/src/main/resources/extendedae_plus.mixins.json b/src/main/resources/extendedae_plus.mixins.json index 1e549e3..828eba3 100644 --- a/src/main/resources/extendedae_plus.mixins.json +++ b/src/main/resources/extendedae_plus.mixins.json @@ -53,6 +53,7 @@ "ae2WTlib.ContainerUWirelessExPatternTerminalMixin", "extendedae.common.PartExPatternProviderMixin", "extendedae.common.TileExPatternProviderMixin", + "extendedae.container.ContainerAssemblerMatrixPatternSlotTrackerMixin", "extendedae.container.ContainerExPatternProviderMixin", "extendedae.container.ContainerExPatternTerminalMixin", "extendedae.container.ContainerWirelessExPatternTerminalMixin" @@ -82,6 +83,7 @@ "extendedae.accessor.GuiExPatternTerminalAccessor", "extendedae.accessor.GuiExPatternTerminalSlotsRowAccessor", "extendedae.client.HighlightButtonMixin", + "extendedae.client.gui.GuiAssemblerMatrixPatternInfoMixin", "extendedae.client.gui.GuiExPatternProviderMixin", "extendedae.client.gui.GuiExPatternTerminalMixin", "hooks.ModelBakeryMixin",