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 是含标题行的总数。

相关