ToolHelper

ToolCore 查询与 NBT 数值提取(63 个方法)

基本信息

属性 值
路径 squeek.tictooltips.helpers.ToolHelper
行数 360
公开方法数 63(全为 public static,工具类)

本类不产出文本,只做两件事:把 TCon 的 ToolCore trait 翻译成布尔判定, 把工具 NBT(InfiTool 复合标签)里的原始字段翻译成 int / float。

工具标签定位

方法 实现
hasToolTag (:24) itemStack.hasTagCompound() && getTagCompound().hasKey("InfiTool")
getToolTag (:28) getTagCompound().getCompoundTag("InfiTool")

⚠️ getToolTag 不判空,直接链式 getTagCompound().getCompoundTag(...)。 安全性依赖调用方先过 hasToolTag。 TooltipHandler 的 :69 确实这么做了。

NBT 键位表

NBT key 类型 读取方法 含义
Damage int getUsedDurability (:90) 已耗耐久
TotalDurability int getMaxDurability (:94) 总耐久
Unbreaking int getReinforcedLevel (:105) 强化等级 0-10
Shoddy float getStonebound (:117) 正=石绑,负=锯齿
Attack int getRawDamage (:121) 攻击力
Head int getHeadMaterial (:34) 头部材料 ID
Modifiers int getModifiersTooltip 内读 剩余修饰符数
BaseAttack int getBaseDamage (:127) 弹药类专用
ModifierTip1..N string getModifiersTooltip 内读 修饰符名序列

有效耐久(:98-103)

if (isUnbreakable(reinforcedLevel)) return INFINITE_DURABILITY;
else return (int) (getMaxDurability(toolTag) / (1f - reinforcedLevel / 10f));

强化等级 10 → INFINITE_DURABILITY(Integer.MAX_VALUE);否则按 总耐久 / (1 - 等级/10) 放大。等级 9 时放大 10 倍。

伤害计算(:121-176)

方法 说明
getRawDamage (:121) NBT Attack - tool.getDamageVsEntity(null)
getBaseDamage (:127) 仅 AmmoItem 且有 BaseAttack 时返回,否则 -1(源码注释 :126 明确写了 -1 表示「不使用基础攻击」)
getPreciseDamage (:137) float 版,内部再按 damageModifier(shoddiness 加成)缩放
getDamage (:133/:159) 上面两者的 (int) 截断版,直接截断而非四舍五入
getCriticalDamageRange (:167) 返回 float[2],暴击区间
getSprintDamage (:178) 冲刺伤害
getSmiteDamageRange (:187) int[2] 附魔对亡灵加成区间
getAntiSpiderDamageRange (:204) int[2] 蜘蛛加成区间

⚠️ 暴击 / 石绑 / 锯齿的区间由本 mod 自己按公式重算, 不是读 TCon 已算好的值。所以装了改变这些公式的附属时, tooltip 数值可能与实际伤害不符。

trait 判定(:43-80)

hasToolCategory(tool, cat) 遍历 tool.getTraits() 做 String.equals。 9 个包装方法各查一个固定 trait 名:

方法 trait
isWeapon "weapon"
isBow "bow"
isAmmo "ammo"
isDualHarvestTool "dualharvest"
isHarvestTool "harvest"
isUtilityTool "utility"
isThrown "thrown"
isProjectile "projectile"

⚠️ isWeapon / isBow 等只判 trait 存在,不判工具实际形态。 装了给同一 trait 加新工具的附属时,分支会走偏。

hasDurability(:86-88)的运算符优先级值得注意:

return !hasAmmoCount(item) && item instanceof ToolCore || item instanceof ArmorCore;

&& 优先于 ||,等价于 (!hasAmmoCount && item instanceof ToolCore) || (item instanceof ArmorCore)。 即护甲永远有耐久,哪怕它同时是 IAmmo。

采矿速度(:316-350)

方法 说明
getMiningSpeedModifier (:316) 按 trait 取修正系数
getPrimaryMiningSpeed (:322) 主矿速
getSecondaryMiningSpeed (:326) 次矿速
getTotalMiningSpeed (:330) 两者合并
getPrimaryHarvestLevel (:352) 主矿级
getSecondaryHarvestLevel (:356) 次矿级

shoddiness 公式(:254-290)

方法 说明
getShoddinessDamageBonus (:254) 攻击加成
getMaxShoddinessDamageBonus (:261) 满石绑的上限
getShoddinessModifierConstant (:268) 取材料能力常量
getShoddinessBonus (:274) 线性插值
getShoddinessSpeedBonus (:278) 速度加成
getMaxShoddinessSpeedBonus (:285) 速度加成上限

无用方法

init()(:22)是空方法体,但仍被 ModTiCTooltips 的 :53 调用。 getSprintKnockback(:244)、getAmmoDamage(:300)等 在本仓内无调用点(跨 mod 的 compat 库语义,但本 mod 没有 API 包, apiPackage 在 gradle.properties 中为空)。

相关