diff --git a/src/main/java/com/extendedae_plus/mixin/GuiPatternEncodingTermMixin.java b/src/main/java/com/extendedae_plus/mixin/GuiPatternEncodingTermMixin.java index 76e5114..a0e7b46 100644 --- a/src/main/java/com/extendedae_plus/mixin/GuiPatternEncodingTermMixin.java +++ b/src/main/java/com/extendedae_plus/mixin/GuiPatternEncodingTermMixin.java @@ -1,17 +1,16 @@ package com.extendedae_plus.mixin; -import com.extendedae_plus.mixin.accessor.AEBaseScreenAccessor; import appeng.client.gui.me.items.PatternEncodingTermScreen; import appeng.client.gui.widgets.IconButton; import appeng.client.gui.Icon; import appeng.client.gui.style.ScreenStyle; import appeng.menu.me.items.PatternEncodingTermMenu; +import appeng.parts.encoding.EncodingMode; +import appeng.menu.SlotSemantics; import net.minecraft.client.gui.components.Tooltip; -import net.minecraft.client.gui.components.Button; -import net.minecraft.client.gui.components.events.GuiEventListener; -import net.minecraft.client.gui.narration.NarratableEntry; import net.minecraft.network.chat.Component; import net.minecraft.world.entity.player.Inventory; +import net.minecraft.world.inventory.Slot; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Unique; import org.spongepowered.asm.mixin.injection.At; @@ -20,6 +19,8 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import com.glodblock.github.extendedae.network.EPPNetworkHandler; import com.glodblock.github.glodium.network.packet.CGenericPacket; +import com.extendedae_plus.mixin.accessor.ScreenAccessor; +import com.extendedae_plus.mixin.accessor.AEBaseScreenAccessor; /** * 在 AE2 的 PatternEncodingTermScreen 界面中,给编码按钮旁添加一个“上传到矩阵”按钮。 @@ -30,10 +31,12 @@ public abstract class GuiPatternEncodingTermMixin) (Object) this; + var menu = (PatternEncodingTermMenu) self.getMenu(); + if (menu == null) { + return; + } + boolean craftingMode = menu.getMode() == EncodingMode.CRAFTING; + + Slot encoded = null; + for (Slot s : menu.slots) { + var sem = menu.getSlotSemantic(s); + if (sem == SlotSemantics.ENCODED_PATTERN) { + encoded = s; + break; + } + } + + // 如果退回到左侧工具栏显示,则不做定位 + if (this.epp$usingToolbar) { + return; + } + + if (craftingMode && encoded != null) { + int slotX = self.getGuiLeft() + encoded.x; + int slotY = self.getGuiTop() + encoded.y; + int bw = this.epp$uploadButton.getWidth(); + int bh = this.epp$uploadButton.getHeight(); + int gap = 3; + + this.epp$uploadButton.setX(slotX - gap - bw); + this.epp$uploadButton.setY(slotY + (18 - bh) / 2); + this.epp$uploadButton.visible = true; + // 可选:当槽位有编码图样时启用 + this.epp$uploadButton.active = !encoded.getItem().isEmpty(); + } else { + this.epp$uploadButton.visible = false; + } + } catch (Throwable t) { + System.out.println("[EAE+][Client] updateBeforeRender positioning failed: " + t); + } } } diff --git a/src/main/java/com/extendedae_plus/mixin/accessor/ScreenAccessor.java b/src/main/java/com/extendedae_plus/mixin/accessor/ScreenAccessor.java new file mode 100644 index 0000000..c7d286b --- /dev/null +++ b/src/main/java/com/extendedae_plus/mixin/accessor/ScreenAccessor.java @@ -0,0 +1,14 @@ +package com.extendedae_plus.mixin.accessor; + +import net.minecraft.client.gui.components.events.GuiEventListener; +import net.minecraft.client.gui.narration.NarratableEntry; +import net.minecraft.client.gui.screens.Screen; +import net.minecraft.client.gui.components.Renderable; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.gen.Invoker; + +@Mixin(Screen.class) +public interface ScreenAccessor { + @Invoker("addRenderableWidget") + T epp$invokeAddRenderableWidget(T widget); +} diff --git a/src/main/resources/extendedae_plus.mixins.json b/src/main/resources/extendedae_plus.mixins.json index 1073507..4d2a794 100644 --- a/src/main/resources/extendedae_plus.mixins.json +++ b/src/main/resources/extendedae_plus.mixins.json @@ -9,7 +9,8 @@ "GuiExPatternTerminalMixin", "HighlightButtonMixin", "GuiPatternEncodingTermMixin", - "accessor.AEBaseScreenAccessor" + "accessor.AEBaseScreenAccessor", + "accessor.ScreenAccessor" ], "mixins": [ "ContainerExPatternProviderMixin",