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 中为空)。
相关
- StringHelper -
INFINITE_DURABILITY的消费方 - TooltipHandler - 主要调用者