护甲条渲染(Armor Bar Rendering)

基本信息

属性 值
类型 客户端 HUD 覆写
实现类 locusway.overloadedarmorbar.overlay.ArmorBarRenderer
事件订阅 RenderGameOverlayEvent.Pre(ElementType.ARMOR,优先级 HIGHEST)
适用端 客户端(Side.CLIENT)
触发条件 玩家穿戴护甲(ForgeHooks.getTotalArmorValue(mc.thePlayer) > 0)或 alwaysShowArmorBar=true

功能

Overloaded Armor Bar 在 Forge RenderGameOverlayEvent.Pre 上以 HIGHEST 优先级拦截原版护甲条渲染,并完全替换为自定义的多级彩色版本。事件被 event.setCanceled(true) 取消,原版 drawTexturedModalRect 不再执行,因此可以支持护甲值超过 20 的情况。

渲染流程(onRenderGameOverlayEvent)

  1. 仅处理 ElementType.ARMOR,其他 overlay 立即返回
  2. 开启 GL_BLEND
  3. 通过 ForgeHooks.getTotalArmorValue(mc.thePlayer) 读取玩家总护甲值(含属性加成)
  4. 与缓存的 previousArmorValue 比较,若变化则调用 updateArmorIcons(currentArmorValue) 重建 10 个图标状态(避免每帧重建)
  5. 按 i * 8 像素步进从屏幕中心偏左 91 像素处开始绘制 10 个 9×9 像素的图标
  6. 绘制完成后 GuiIngameForge.left_height += 10(与原版一致),关闭混合并 setCanceled(true)

图标类型(ArmorIcon.Type 枚举)

类型 纹理坐标 (x, y) 尺寸 含义
FULL (34, 9) 9×9 完整护甲(=2 点)
HALF 主色 (25, 9) 5px + 次色 (30/39, 9) 4px 9×9 半格护甲(=1 点),右半用前一等级颜色
EMPTY (16, 9) 9×9 空槽位(仅当 showEmptyArmorIcons 或 alwaysShowArmorBar)
NONE — — 不渲染(默认隐藏未装备槽位)

颜色梯度算法(updateArmorIcons + ArmorIcon.updateColors)

按 20 点为一个颜色等级(scale = armorPoints / 20),每升一级切换到 colorValuesI 列表中的下一个颜色:

护甲值区间 主色 (mainColor) 次色 (secondaryColor) 说明
armorValue >= 2 colorValuesI[currentScale] 同主色 完整图标,当前等级颜色
armorValue == 1 colorValuesI[currentScale] colorValuesI[previousScale] 半格图标,左半当前等级颜色,右半上一等级颜色
armorValue == 0 colorValuesI[previousScale] — 空槽位图标,使用上一等级颜色(带渐变尾迹)

边界处理:

  • armorPoints 恰好为 scale * 20 时(即 20、40、60…),回退一格以显示"上一等级已满":scale -= 1; counter = 20
  • 半格图标在 currentArmorValue > 20 时右半使用 FULL 纹理(坐标 39),否则使用 EMPTY 纹理(坐标 30)
  • currentScale 上限钳制到 colorValuesI.length - 1,超过配置梯度数的护甲全部使用最高颜色

颜色状态切换优化(setColor)

仅当目标颜色与 colorState 不同时才调用 GL11.glColor4f,减少 OpenGL 状态切换。

配置项(ConfigurationHandler)

配置键 默认值 说明
Always Show armor bar? false 即使护甲为 0 仍显示护甲条;启用后所有槽位强制显示 EMPTY 图标(10 格)
Show empty armor icons? false 护甲 > 0 时,未填满的槽位显示 EMPTY 占位图标而非 NONE(隐藏)
Armor Icon Colors ["#FFFFFF", "#FF5500", "#FFC747", "#27FFE3", "#00FF00", "#7F00FF"] 颜色梯度数组,按护甲等级 0/20/40/60/80/100 依次使用;必须是 #RRGGBB 格式,否则该槽位回退到 #FFFFFF

配置变更

  • 通过 ConfigChangedEvent.OnConfigChangedEvent 监听 GUI 配置修改,匹配 OverloadedArmorBar.MODID 后重新加载
  • 加载完成后若 config.hasChanged() 则保存到磁盘并调用 ArmorBarRenderer.forceUpdate() 重置缓存,使新颜色立即生效

数值

数值 值 含义
ARMOR_ICON_SIZE 9 单个图标宽高(像素)
ARMOR_FIRST_HALF_WIDTH 5 半格图标左半宽度
ARMOR_SECOND_HALF_WIDTH 4 半格图标右半宽度
armorIcons.length 10 渲染的图标数量
颜色梯度长度 0-6(按配置) colorValues 数组元素数;超出部分使用最高颜色
图标步进 8 px 槽位间距
Y 偏移 GuiIngameForge.left_height 与原版一致

第三方 mod 集成

无——本 mod 仅依赖 Minecraft Forge 自身的 RenderGameOverlayEvent 与 ForgeHooks.getTotalArmorValue,不调用任何第三方 mod API。

相关条目

  • 配置 GUI - Mod 内的图形化配置界面入口