ProxyExtraTiC

ExtraTiC 部件反射映射,28 个 PartInfo + 材料 ID 区间

基本信息

属性 值
路径 squeek.tictooltips.proxy.ProxyExtraTiC
行数 114
触发条件 Loader.isModLoaded("ExtraTiC")(ModTiCTooltips.java:42)
反射目标 glassmaker.extratic.common.PartsHandler(:92)

[!WARNING] 「TiC」在这两个类里指的是不同模组 本类名 ProxyExtraTiC 里的 TiC = ExtraTiC(glassmaker.extratic), 不是本 mod 硬依赖的 Tinkers’ Construct(TConstruct)。 两者同属作者 squeek,是两个独立项目。 判定依据:PartInfo 枚举的字段类型全是 tconstruct.tools.TinkerTools 的 Item, 反射读的却是 Ex TiC 的 Item —— 明确是两套物品。 ExtraTiC 不在 Wiki 收录范围,故不建分类、不加链接。

PartInfo 枚举(:21-84)

28 个常量,每个把「TCon 侧 Item」映射到「Ex TiC 侧应归入的分类列表」。

分组 常量 TCon 侧 Item
工具头 PICKAXE_HEAD / SHOVEL_HEAD / EXCAVATOR_HEAD TinkerTools.pickaxeHead 等
武器矿镐头 HAMMER_HEAD TinkerTools.hammerHead
武器工具头 AXE_HEAD / SCYTHE_HEAD / LUMBERAXE_HEAD hatchetHead / scytheBlade / broadAxeHead
武器头 SWORD_BLADE / LARGE_SWORD_BLADE / KNIFE_BLADE / FRYPAN_HEAD / BATTLE_SIGN_HEAD TinkerTools.*
武器护手 CROSSBAR / MEDIUM_GUARD / LARGE_GUARD / FULL_GUARD crossbar / handGuard / wideGuard / fullGuard
绑线 BINDING / TOUGHBIND binding / toughBinding
杆 TOOLROD / TOUGHROD toolRod / toughRod
板 LARGEPLATE largePlate
碎片 CHUNK toolShard
箭头 ARROWHEAD TinkerWeaponry.arrowhead
凿头 CHISEL_HEAD chiselHead
1.8.0 新增 SHURIKEN / BOW_LIMB / CROSSBOW_LIMB / CROSSBOW_BODY / BOLT TinkerWeaponry.part*

⚠️ 枚举字段名与 Ex TiC 的字段名同名 —— registerParts() 用 partInfo.name() 反射读 Ex TiC PartsHandler 的静态字段 (:95)。所以两边字段名必须逐字一致,改名即失效。

setPartItem 的副作用(:74-79)

this.partItem = partItem;
this.relevantList.add(partItem);          // 加进 TCon 分类表
extraTiCParts.add(partItem);              // 加进本类总表
ticToExtraTiCParts.put(ticPart, partItem);// 记录正反映射

一次调用同时改三张表。第二张表用于「该部件是 Ex TiC 的」判定。

registerParts()(:90-108)

步骤 内容
:92 Class.forName("glassmaker.extratic.common.PartsHandler")
:94-97 遍历 PartInfo.values(),逐个读字段 → setPartItem
:98 特殊处理:常量名 TOOLROD 的额外加入 ToolPartHelper.arrowRods

⚠️ :98 的判定是 if (partInfo.name().equals("TOOLROD")) —— 按字符串比枚举名,编译期常量被降级成运行时比较。 只处理 TOOLROD,TOUGHROD 不加入箭杆列表(Ex TiC 没有对应箭杆)。

异常处理(:100-105)

} catch (RuntimeException e) { throw e; }          // RuntimeException 原样抛
  catch (Exception e) { Log.error(...); return false; }  // 受检异常只记日志

即反射失败(NoSuchFieldException 等)只打日志不崩游戏, 但 init()(:86-88)丢弃了 registerParts() 的返回值, 调用方无法知道映射是否建立成功 —— 失败时表现为部件静默不显示 tooltip。

isExtraTiCMaterialID(:110-112)

return (matID >= 100 && matID < 200) || (matID >= 2000 && matID < 3000);

Ex TiC 的材料 ID 占用两个区段:[100, 200) 与 [2000, 3000)。

⚠️ 纯魔数,无常量定义。两段区间的依据在 Ex TiC 源码里, 本仓只硬编码。Ex TiC 若调整 ID 分配,这段判定会静默失效。

用途见 TooltipHandler 的 :1060-1062: 命中时用 ticToExtraTiCParts 把部件 Item 换成 Ex TiC 版本再取显示名。

相关