Alignment

九宫格对齐枚举:位掩码布局与偏移换算

基本信息

属性 值
路径 com.github.lunatrius.ingameinfo.Alignment
行数 131
类型 enum,9 个常量

九个位置与默认偏移

常量 默认 X 默认 Y
TOPLEFT 2 2
TOPCENTER 0 2
TOPRIGHT -2 2
MIDDLELEFT 2 0
MIDDLECENTER 0 0
MIDDLERIGHT -2 0
BOTTOMLEFT 2 -2
BOTTOMCENTER 0 -45
BOTTOMRIGHT -2 -2

⚠️ BOTTOMCENTER 的 Y 偏移是 -45,与其余八个(±2 / 0)不同。 这不是笔误:底部居中要避开聊天框区域,所以额外上移 45 像素。 但它是硬编码在枚举构造参数里的,且与 BOTTOMLEFT / BOTTOMRIGHT 不对称 —— 想改只能在配置界面里逐项覆盖 alignment 分类下的 bottomcenter 项。

位掩码布局

alignment 字段是 int,用两组掩码编码:

掩码 值 覆盖常量
MASK_X 0x0C LEFT=0x04 / CENTER=0x0C / RIGHT=0x08
MASK_Y 0x03 TOP=0x01 / BOTTOM=0x02 / MIDDLE=0x03

⚠️ MIDDLE = 0x03 同时占了 TOP(0x01) 与 BOTTOM(0x02) 两位, 所以先判 X 再判 Y、且 getY 的 switch 里 MIDDLE 必须在 TOP / BOTTOM 之后 —— 实际代码正是这个顺序(:87-92)。

九个常量的 alignment 值在 static 块(:120-130)里统一赋值, 因为枚举构造时还不能引用其他常量。

坐标换算

getX(screenwidth, textwidth)(:76-84):

分支 公式
LEFT x
CENTER x + (screenwidth - textwidth) / 2
RIGHT x + screenwidth - textwidth

getY(screenheight, textheight)(:86-94):

分支 公式
TOP y + textheight
MIDDLE y + textheight + screenheight / 2
BOTTOM y + screenheight - textheight

⚠️ MIDDLE 分支的公式 同时加了 textheight 和 screenheight/2, 而 CENTER 只减了 textwidth/2。两者不对称: 垂直居中会把文字整体下移一整行高度。

⚠️ 两个方法都用了 Java 14+ 的 switch 表达式(case LEFT ->)。 本 mod 目标是 1.7.10 / Java 8 字节码,依赖 GTNH 构建链的 enableModernJavaSyntax(Jabel 或 JVM Downgrader)来降级。 直接用原版 JDK 8 编译会失败。

parse(:48-74)

字符串 → 枚举:startsWith("top"/"mid"/"bot") 定垂直, endsWith("left"/"center"/"right") 定水平,拼成 "TOPLEFT" 之类再 valueOf。

⚠️ 前后缀判定顺序敏感:"bottomcenter" 先 startsWith("bot") ✓, 再 endsWith("center") ✓ → BOTTOMCENTER。 但 "topcenter" 也会先命中 startsWith("top") ✓ —— 正确。 问题是没有校验前缀与后缀必须都匹配:若传 "topfoo", 前缀命中 top 得到 "TOP",后缀全不命中则 value 仍是 "TOP", valueOf("TOP") 抛异常 → 被 catch → 返回 null(:69-73)。

状态与行容器

字段 说明
defaultX / defaultY 构造参数,final,供配置界面显示
x / y 实际生效偏移,可被 setXY 改写
lines Collection<InfoText>,由 InGameInfoCore.refreshInfoTexts 填充
VALUES values() 的公开副本,供两层循环遍历

setXY(String)(:104-114)按单个空格 split(" "), 且要求 parts.length == 2;解析失败静默 catch (Exception ignored) {}。 所以配置里写两个空格或用 tab 都会静默失败,偏移保持默认值。

相关