护甲条渲染(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)
- 仅处理
ElementType.ARMOR,其他 overlay 立即返回 - 开启
GL_BLEND - 通过
ForgeHooks.getTotalArmorValue(mc.thePlayer)读取玩家总护甲值(含属性加成) - 与缓存的
previousArmorValue比较,若变化则调用updateArmorIcons(currentArmorValue)重建 10 个图标状态(避免每帧重建) - 按
i * 8像素步进从屏幕中心偏左 91 像素处开始绘制 10 个 9×9 像素的图标 - 绘制完成后
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 内的图形化配置界面入口