TooltipHandler
唯一业务类(1 078 行):tooltip 分派、按键分支、数值拼装
基本信息
| 属性 | 值 |
|---|---|
| 路径 | squeek.tictooltips.TooltipHandler |
| 行数 | 1 078(占全仓 2 540 行的 42%) |
| 钩子 | @SubscribeEvent onItemTooltip(ItemTooltipEvent) |
| 注册 | MinecraftForge.EVENT_BUS.register(new TooltipHandler())(ModTiCTooltips.java:36) |
三路分派(:51-69)
if (event.entityPlayer == null) return; // :52 无玩家 → 放弃
if (event.getResult() == Result.DENY) return; // :54 已被否决 → 放弃
if (item instanceof IToolPart) { // :59 工具部件
if (ToolPartHelper.isShard(item)) return; // :60 碎片不处理
event.toolTip.addAll(getMaterialTooltip(event.itemStack));
} else if (item instanceof IPattern && !ModTiCTooltips.hasIguanaTweaks) { // :65 图纸
event.toolTip.addAll(getPatternTooltip(event.itemStack));
} else if (item instanceof ToolCore && ToolHelper.hasToolTag(event.itemStack)) { // :69 工具
// ... 按键分支
}
⚠️ 三者是 if / else if 链,不是独立判断。图纸分支被
hasIguanaTweaks 关闭后,图纸物品会继续落到第三分支去试
instanceof ToolCore(图纸不是,所以无副作用)。
插入点定位(:72-118)
工具 tooltip 不是简单 append,而是要插到 TiC 自己的提示之前,
所以先算出 toolTipIndex。优先级:
| 顺序 | 判据 | 结果 |
|---|---|---|
| 0 | toolTip.size() <= 1 |
index = 0 |
| 1 | 末行以 §9+ 开头 |
index = size - 1 |
| 2 | 末行以 Max Damage 开头(attribute.name.ammo.maxAttackDamage) |
index = size - 1 |
| 3 | 物品有附魔 | 用 enchantmentsList[id].getTranslatedName(lvl) 反查行号 |
| 4 | 兜底 | 前向找第一个 §9+ 或 Max Damage 行 |
| 5 | 还失败 | 重新调一次 ToolCore.addInformation 拿到 TiC 自己的行数再估算(:104-117,注释自称 “potentially expensive”) |
定位后 :121-143 还会倒着清场:删掉 Max Damage 行、回退跳过 §9+ 攻击加成行、
删掉空行,直到落到干净的插入点。
按键分支(:145-189)
| 条件 | 分支 | 内容 |
|---|---|---|
Shift 且非 Ctrl |
:148 |
getToolStatsTooltip 完整数值;首尾各补一个空行 |
Ctrl |
:160 |
while (size > 1) remove(1) 清空全部(保留物品名),再写 getToolMaterialsTooltip |
| 其他 | :169 |
两行引导:tictooltips.hold.key.for.stats(§eShift)/ .for.materials(§bCtrl) |
Ctrl 分支的清空动作很激进:物品名之外的原生 tooltip(附魔名、耐久条、
耐久余量)全部被删掉,只留材料构成。Mac 上 Ctrl 由
KeyHelper 映射到 Command 键。
属性拼装顺序(getToolStatsTooltip :977-1007)
| # | 段 | 方法 | 触发条件 |
|---|---|---|---|
| 1 | 修复材料 | getRepairTooltip (:961) |
getHeadMaterial 非空 |
| 2 | 弹药 / 耐久 | getAmmoCountTooltip 或 getDurabilityTooltip + getShoddinessTooltip |
hasAmmoCount / hasDurability |
| 3 | 弓 | getBowTooltip (:~830) |
isBow |
| 3’ | 武器 | getWeaponTooltip |
isWeapon(与弓互斥) |
| 4 | 投掷 | getThrownTooltip (:899) |
isThrown — ⚠️ 空实现 |
| 5 | 弹药 | getAmmoTooltip (:883) |
isAmmo — ⚠️ 空实现 |
| 6 | 投射物 | getProjectileTooltip (:905) |
isProjectile:重量 / 精准度 / 折断率 |
| 7 | 收获 | getDualHarvestTooltip 或 getHarvestTooltip 或 getUtilityTooltip |
互斥链 |
| 8 | 修饰符 | getModifiersTooltip (:921) |
总在最后 |
投射物三行(:912-916)取 ToolHelper.getWeight/getAccuracy/getBreakChance;
十字弩与长弓在 :874-878 分叉,弓速额外乘 1.5f 系数显示。
修饰符段(getModifiersTooltip :921-959)
读 NBT 里的 ModifierTip1 / ModifierTip2 … 序列(while (toolTag.hasKey("ModifierTip" + tipNum))),
逐个转成本地化 key modifier.toolstation.<name>。
⚠️ 源码注释自己承认这里在绕坑:有些 TCon 的 tip 名字带 (X of Y),
直接查表会失败,所以先 indexOf("(") 截断(:939-940),
查完再把括号段拼回去(:947)。还额外做了一次
replace(" ", "") 去掉所有空格再 canTranslate 试探(:941)。
材料构成(getToolMaterialsTooltip :1012-1052)
按 NBT 四个槽位依次输出,槽位为空则跳过:
| 槽位 | NBT key | 取法 |
|---|---|---|
| Head | Head |
tool.getHeadItem() |
| Accessory | Accessory |
tool.getAccessoryItem() |
| Extra | Extra |
tool.getExtraItem() |
| Handle | Handle |
tool.getHandleItem() |
前三段后各补一个空行,Handle 后不补。
getToolPartTooltip(:1057-1076)里有一个 ExtraTiC 特判:
ProxyExtraTiC.isExtraTiCMaterialID(matID) 为真时,
先把这个部件从 TiC 的 Item 换成 Ex TiC 的 Item(:1061),再取名。
图纸段(getPatternTooltip :425-458)
只对弓弦和箭羽两种图纸有效(PatternHelper.isBowstringPattern /
isFletchingPattern)。有效材料列表由
PatternHelper 遍历 TConstructRegistry.customMaterials 得到。
⚠️ 显示上限:if (toolTip.size() < 7 || KeyHelper.isShiftKeyDown())(:441)——
超过 6 条就折叠成一行「按住 Shift 查看更多」,且 break。7 是含标题行的总数。
相关
- ToolPartHelper - 部件分类表与着色区间
- ToolHelper - 所有 NBT 数值提取
- StringHelper - 数值转文本
- KeyHelper - 按键读取
- ProxyExtraTiC - 部件换名与材料 ID 区间判定