TiC Tooltips

[!INFO] Git Commit: c3e1b60 | Updated: 2026-10-01

给 TinkersConstruct 的工具与工具部件(tool part)追加详细 tooltip 的 纯客户端附属,modid 为 TiCTooltips。本身不注册任何方块、物品、实体或多方块结构。

身份

属性 实测值
modid TiCTooltips(混合大小写,ModInfo.java:5)
modName TiC Tooltips(gradle.properties)
资源域 tictooltips(全小写,src/main/resources/assets/)
Java 文件 15(2 540 行),TooltipHandler.java 一个类就占 1 078 行
注册内容 0(无 block / item / entity / worldgen)
配置项 0(源码中无 @Config、无 Configuration)
依赖注册 仅 init 挂一个 ItemTooltipEvent 监听器

[!NOTE] 分类名 ≠ modid ≠ 资源域 —— 三者全不一样

  • Wiki 分类名:tic-tooltips(来自仓库名 TiC-Tooltips)
  • 实际 modid:TiCTooltips
  • 资源域:tictooltips(lang 文件在 assets/tictooltips/lang/)
  • mcmod.info 六个字段全是 ${modId} 之类构建期占位符,modid 只能从 gradle.properties 的 modId = TiCTooltips 与 ModInfo.MODID 实读。

[!IMPORTANT] 定位:Tinkers’ Construct 的客户端附属,不是本体 FML 依赖串(ModTiCTooltips.java:26): required-after:TConstruct + 版本区间 [1.7.10-1.8,), 之后 after:ExtraTiC; after:TSteelworks; after:Mariculture(完整原文见 ModTiCTooltips)。 即 TConstruct 是唯一硬依赖,且被版本区间限制在 [1.7.10-1.8,)。 Tinkers 本体的内容见 tinkersconstruct,此处不复述。

关于仓库名里的 TiC:它确实指 Tinkers’ Construct(硬依赖可证), 但 TiC 在本 mod 里同时是第二重含义 —— ProxyExtraTiC 指的是另一个模组 ExtraTiC(glassmaker.extratic),二者是同一个人(作者 squeek)的两个项目, 极易混淆。判定依据要看 Loader.isModLoaded 的实参,不是看名字。

依赖关系(实测 dependencies.gradle + FML 串)

依赖 作用域 说明
TinkersConstruct api 唯一硬依赖,1.14.110-GTNH;并 exclude 自身 TiC-Tooltips
GTNHLib api 只用 NumberFormatUtil.formatNumber(千分位)
Battlegear2 compileOnly ⚠️ 源码中零引用,见「源码缺陷」
ExtraTiC FML after: 软依赖,有 ProxyExtraTiC 反射接入
TSteelworks FML after: ⚠️ 声明了但无任何代码,见「源码缺陷」
Mariculture FML after: 软依赖,有 ProxyMariculture
IguanaTweaksTConstruct 仅 Loader.isModLoaded 软依赖,有 ProxyIguanaTweaks

iguanatweakstconstruct 与 gtnhlib 已在分类登记表中 (后者尚未成文,属前向引用)。ExtraTiC / TSteelworks / Mariculture / Battlegear2 不在收录范围, 故本文只以纯文本提及,不建分类、不加链接。

交互模型

三个按键状态决定 tooltip 内容,判定入口在 TooltipHandler 的 onItemTooltip:

状态 行为
无按键 在 TiC 原生提示末尾追加「按住 Shift 查属性 / 按住 Ctrl 查材料」两行引导
Shift 追加完整数值属性(耐久、攻击、矿级、附魔、弹药、弓速、投射物、修饰符)
Ctrl 清空除首行外的所有 tooltip,只留材料下界/上界构成
Shift+Ctrl 同时命中时走 Shift 分支(shiftDown && !ctrlDown 为假)

按键读取在 KeyHelper:Mac 上 Ctrl 同时接受 KEY_LMETA / KEY_RMETA(Command),因为 GuiScreen.isCtrlKeyDown 在 Mac 只认 Option。

数值着色

所有属性都按「当前存档全部材料的相对位置」着色,实现在 ColorHelper: 7 级色阶 DARK_RED → RED → GOLD → YELLOW → DARK_GREEN → GREEN → AQUA, 线性插值 index = (val - min) / (max - min) * 6。 越界时:高于上界为 WHITE+BOLD,低于下界为 DARK_RED+BOLD;min == max 时返回 RESET。

色阶基准由 ToolPartHelper 的 determineMinAndMaxValues() 在 postInit 扫描 TConstructRegistry 全表得出。

源码缺陷

  1. ToolPartHelper.getBowStringDurabilityModifierString 取错区间 —— ToolPartHelper.java:387-390 用了 minBowStringDrawspeedModifier / maxBowStringDrawspeedModifier,而函数名与实参都是 durability。应改成 minBowStringDurabilityModifier / maxBowStringDurabilityModifier(这两个字段在 ToolPartHelper.java:197-198 已存在且被 determineMinAndMaxValues 正确赋值)。 后果:弓弦耐久修正值的颜色按「弓弦拉速修正」的区间算,可能整列同色或全白。
  2. after:TSteelworks 是空声明 —— ModTiCTooltips.java:26 声明了软依赖, 但全仓 grep -i steelworks 只命中这一行本身:无 ProxyTSteelworks、 无 Loader.isModLoaded("TSteelworks")、无 Class.forName。 对比 ExtraTiC / Mariculture / IguanaTweaks 都有真代码。
  3. Battlegear2 依赖未被使用 —— dependencies.gradle 声明 compileOnly('com.github.GTNewHorizons:Battlegear2:1.4.3:api'), 但 src/ 中 grep -ri battlegear 零命中,FML 依赖串里也没有它。属残留依赖。
  4. getAmmoTooltip / getThrownTooltip 是空实现 —— TooltipHandler.java:883-886 与 899-903 建了 ArrayList 直接 return, 弹药数与投掷物属性永远不显示(调用点 TooltipHandler.java:985、:994 仍在跑)。
  5. 若干 min 值从未被播种 —— minAccuracy、minWeight、 minFletchingDurabilityModifier、minArrowDurabilityModifier 在 determineMinAndMaxValues() 里没有对应的 needsInit 赋值分支, 始终停留在字段默认 0f(ToolPartHelper.java:176-206)。 其中 minShoddiness 被显式初始化为 0f(:157)且此后不再更新, 三个 shoddiness 字段的更新又只写在 else 分支(:220-223), 所以第一个材料的 shoddiness 永远不参与极值计算。

分类索引

核心

  • ModTiCTooltips - 模组主类:FML 依赖串、客户端事件注册、三个软依赖探测
  • TooltipHandler - 唯一业务类(1 078 行):tooltip 分派、按键分支、数值拼装
  • ModInfo - 三个常量:MODID / MODNAME / VERSION

辅助类

兼容层

源码:/Users/evlos/a/mirror/TiC-Tooltips/ 关系登记:见 data/relation.md(全局 Wiki 分类映射表)