修修修

This commit is contained in:
GaLi 2025-08-22 13:41:06 +08:00
parent 20071e126d
commit e6d2125e07
3 changed files with 108 additions and 1 deletions

View File

@ -0,0 +1,102 @@
package com.extendedae_plus.mixin.ae2;
import appeng.client.gui.AEBaseScreen;
import appeng.client.gui.style.PaletteColor;
import appeng.client.gui.style.ScreenStyle;
import com.extendedae_plus.api.ExPatternPageAccessor;
import com.glodblock.github.extendedae.client.gui.GuiExPatternProvider;
import net.minecraft.client.gui.Font;
import net.minecraft.client.gui.GuiGraphics;
import org.spongepowered.asm.mixin.Mixin;
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;
@Mixin(AEBaseScreen.class)
public abstract class AEBaseScreenMixin {
@Unique
private ScreenStyle eap$getStyle(Object self) {
try {
var f = self.getClass().getDeclaredField("style");
f.setAccessible(true);
Object v = f.get(self);
if (v instanceof ScreenStyle s) return s;
} catch (Throwable ignored) {}
return null;
}
@Unique
private static int eap$getIntField(Object self, String name, int def) {
Class<?> c = self.getClass();
while (c != null && c != Object.class) {
try {
var f = c.getDeclaredField(name);
f.setAccessible(true);
Object v = f.get(self);
if (v instanceof Integer i) return i;
} catch (Throwable ignored) {}
c = c.getSuperclass();
}
return def;
}
@Unique
private static Font eap$getFont(Object self) {
Class<?> c = self.getClass();
while (c != null && c != Object.class) {
try {
var f = c.getDeclaredField("font");
f.setAccessible(true);
Object v = f.get(self);
if (v instanceof Font font) return font;
} catch (Throwable ignored) {}
c = c.getSuperclass();
}
return net.minecraft.client.Minecraft.getInstance().font;
}
// 在标签绘制后追加页码绘制仅限扩展样板供应器界面
@Inject(method = "renderLabels", at = @At("TAIL"), remap = false)
private void eap$renderPageIndicator(GuiGraphics guiGraphics, int x, int y, CallbackInfo ci) {
Object self = this;
if (!(self instanceof GuiExPatternProvider)) {
return;
}
int cur = 1;
int max = 1;
try {
if (self instanceof ExPatternPageAccessor accessor) {
cur = Math.max(0, accessor.eap$getCurrentPage()) + 1;
}
// 读取最大页 GUI 本地字段
try {
var fMax = self.getClass().getDeclaredField("eap$maxPageLocal");
fMax.setAccessible(true);
Object v = fMax.get(self);
if (v instanceof Integer i) {
max = Math.max(1, i);
}
} catch (Throwable ignored) {}
ScreenStyle style = eap$getStyle(self);
Font font = eap$getFont(self);
int leftPos = eap$getIntField(self, "leftPos", 0);
int topPos = eap$getIntField(self, "topPos", 0);
int imageWidth = eap$getIntField(self, "imageWidth", 0);
String text = cur + "/" + max;
int tx = leftPos + imageWidth - font.width(text) - 6;
int ty = topPos + 6;
int color = 0xFFFFFFFF;
if (style != null) {
try {
color = style.getColor(PaletteColor.MUTED_TEXT_COLOR).toARGB();
} catch (Throwable ignored) {}
}
guiGraphics.drawString(font, text, tx, ty, color, false);
} catch (Throwable ignored) {
}
}
}

View File

@ -193,6 +193,7 @@ public abstract class GuiExPatternProviderMixin extends PatternProviderScreen<Co
this.hoveredSlot = null; this.hoveredSlot = null;
}, Icon.ARROW_RIGHT); }, Icon.ARROW_RIGHT);
// 恢复到 AE2 左侧工具栏
this.addToLeftToolbar(this.nextPage); this.addToLeftToolbar(this.nextPage);
this.addToLeftToolbar(this.prevPage); this.addToLeftToolbar(this.prevPage);
} }
@ -242,6 +243,8 @@ public abstract class GuiExPatternProviderMixin extends PatternProviderScreen<Co
return getCurrentPage(); return getCurrentPage();
} }
// 页码文本绘制移交给 AEBaseScreenMixin.renderLabels 尾部执行
// 注意不再注入 Screen#init避免混入在某些映射情况下失败导致 TransformerError // 注意不再注入 Screen#init避免混入在某些映射情况下失败导致 TransformerError
@Override @Override
@ -270,7 +273,7 @@ public abstract class GuiExPatternProviderMixin extends PatternProviderScreen<Co
this.x5Button.setVisibility(true); this.x5Button.setVisibility(true);
} }
// 如果屏幕尺寸发生变化窗口/GUI缩放重新注册按钮避免被 Screen.init 清空 // 如果屏幕尺寸发生变化窗口/GUI缩放重新注册右侧外列的自定义按钮翻页按钮由左侧工具栏托管
if (this.width != eap$lastScreenWidth || this.height != eap$lastScreenHeight) { if (this.width != eap$lastScreenWidth || this.height != eap$lastScreenHeight) {
eap$lastScreenWidth = this.width; eap$lastScreenWidth = this.width;
eap$lastScreenHeight = this.height; eap$lastScreenHeight = this.height;
@ -306,6 +309,7 @@ public abstract class GuiExPatternProviderMixin extends PatternProviderScreen<Co
int bx = this.leftPos + this.imageWidth + 1; // 向右平移 1px 到面板外侧 int bx = this.leftPos + this.imageWidth + 1; // 向右平移 1px 到面板外侧
int by = this.topPos + 20; int by = this.topPos + 20;
int spacing = 22; int spacing = 22;
// 翻页按钮交由左侧工具栏布局无需手动定位
if (this.divideBy2Button != null) { if (this.divideBy2Button != null) {
this.divideBy2Button.setX(bx); this.divideBy2Button.setX(bx);
this.divideBy2Button.setY(by); this.divideBy2Button.setY(by);

View File

@ -4,6 +4,7 @@
"compatibilityLevel": "JAVA_17", "compatibilityLevel": "JAVA_17",
"minVersion": "0.8", "minVersion": "0.8",
"client": [ "client": [
"ae2.AEBaseScreenMixin",
"PickFromWirelessMixin", "PickFromWirelessMixin",
"accessor.AbstractContainerScreenAccessor", "accessor.AbstractContainerScreenAccessor",
"accessor.ScreenAccessor", "accessor.ScreenAccessor",