工具材料注册

本 mod 对 Tinkers’ Construct 行为改变最大的一处:把整个 GregTech 材料集合注册成 TiC 工具材料, 使 GT 的矿石/锭/熔融流体可以用 GT 机器加工成 Tinkers’ 的工具部件与工具。

入口:TGregworks.preInit → TGregRegistry.registerToolParts()。

流程

preInit
 └─ registry = new TGregRegistry()          // 读 general.materialIDRangeStart / addMaterialsAnyway
 └─ registry.registerItems()                // 28 个 ItemTGregPart
 └─ registry.registerToolParts()            // ← 本条目

registerToolParts() 两轮循环:

  1. 筛选:for (Materials m : Materials.values()),按 4 个条件决定 m 是否入选 (详见 材料逐项开关),同时为每个入选材料 预建 materials.material-id.<材料> 属性(0 – 100000,默认 0)并塞进 configProps / configIDs。
  2. 注册:for (Materials m : toolMaterials),依次取 getMaterialID(m) 并调用 addToolMaterial / addBowMaterial / addArrowMaterial 三个 TiC API, 同时把 matIDs.put(m, matID) 与 materialIDMap.put(matID, m) 记进双向表。

最后 ItemTGregPart.toolMaterialNames = toolMaterialNames(静态字段,供 CraftingItem 构造用)。

addToolMaterial:11 个参数

TConstructRegistry.addToolMaterial(matID, mName, mLocalizedName, mToolQuality, durability, miningSpeed, attack, handleModifier, reinforceLevel, stoneboundLevel, "", rgbColor)

# 参数 值
1 matID getMaterialID(m),见 材料倍率配置
2 mName m.mName(GT 枚举名,也是 NBT 里 material 字段的值)
3 mLocalizedName m.mLocalizedName(显示名,不是 mDefaultLocalName)
4 mToolQuality GT 的 mToolQuality 原值,未乘任何倍率(第 4 个参数)
5 耐久 (int)(m.mDurability × global.durability × materials.durability.<材料>)
6 挖掘速度 (int)(m.mToolSpeed × 100F × global.miningspeed × materials.miningspeed.<材料>)
7 攻击 (int)(m.mToolQuality × global.attack × materials.attack.<材料>)
8 手柄系数 (sanitize(m.mToolQuality) - 0.5F) × global.handlemodifier × materials.handlemodifier.<材料>
9 Reinforced 等级 getReinforcedLevel(m),默认 0–3 硬编码名单
10 Stonebound 等级 getStoneboundLevel(m),默认 ±1 硬编码名单
11 "" 空字符串——本地化前缀留空
12 颜色 (m.getRGBA()[0] << 16) | (…[1] << 8) | …[2],即 RGB 打包成 int

sanitizeToolQuality(mToolQuality) = Math.max(toolQuality, 1),用于第 8 / 13 / 14 项。

⚠️ 第 4 个参数传的是未缩放的原始 mToolQuality,而第 7 个"攻击"又用同一个值乘倍率—— 也就是说攻击值和 harvestLevel 门槛是同一份数据,改 global.attack 不会改变挖掘等级分档。 挖掘等级分档真正看的是 TiC 侧的 ToolMaterial.harvestLevel。

addBowMaterial:3 个参数

TConstructRegistry.addBowMaterial(matID, drawSpeed, flightSpeed)

参数 值
蓄力速度 (int)(sanitize(m.mToolQuality) × 10F × global.bowdrawspeed × materials.bowdrawspeed.<材料>)
飞行速度 (sanitize(m.mToolQuality) - 0.5F) × global.bowflightspeed × materials.bowflightspeed.<材料>

⚠️ 弓材料是无条件注册的——addBowMaterial 不像 addArrowMaterial 那样检查材料是否真有相关形态。

addArrowMaterial:2 个参数

TConstructRegistry.addArrowMaterial(matID, mass, breakChance)

参数 值
质量 (float)(m.getMass() / 10F × global.arrowmass × materials.arrowmass.<材料>)
折断概率 global.arrowfragility × materials.arrowfragility.<材料>,全局默认 0.9

Materials.getMass() 是 GT 按密度给出的每 1000 mB 的质量(单位 g), 除以 10 后成为 TiC 箭的 arrowMass。折断概率没有 sanitize 处理, 所以 0 是合法值(箭永不折断)。

材料 ID 分配

getMaterialID(Materials m):

  1. 从 configProps(或现查)拿 materials.material-id.<材料> 属性;
  2. 值 > 0 → 直接用;
  3. 值 0 → getLatestAvailableNumber() 分配后 configProp.set(newID) 回写。

getLatestAvailableNumber() 从 general.materialIDRangeStart(默认 1500)起, 跳过 TConstructRegistry.toolMaterials 已占用的和本 mod configIDs 已占用的,上限 16383。 用尽则 throw new RuntimeException("TConstruct tool material registry ran out of IDs!")。

⚠️ 16383 = Short.MAX_VALUE,正好卡在物品 metadata 能表达的上界。

三个缓存表

字段 类型 用途
toolMaterials ArrayList<Materials> 全部入选材料的有序列表,生成遍历用
toolMaterialNames ArrayList<String> mDefaultLocalName 列表,赋给 ItemTGregPart.toolMaterialNames
matIDs HashMap<Materials, Integer> 供 getSubItems / newItemStack / onUpdate 由材料查 ID
materialIDMap HashMap<Integer, Materials> 反向表,供修复修饰符由工具的 InfiTool.Head 查回材料

两个 HashMap 都不是有序容器,遍历它们得到的顺序与 toolMaterials 不同; configProps / configIDs 在 registerToolParts 结尾被 clear(),因此材料 ID 只在注册时分配一次。

对客户端的影响

TGregworks.init → proxy.addToolRenderMappings() → ClientProxy 对每个 toolMaterials 调 TConstructClientRegistry.addMaterialRenderMapping(matIDs.get(m), "tgregworks", "", true)。 见 渲染映射。

相关条目