工具材料注册
本 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() 两轮循环:
- 筛选:
for (Materials m : Materials.values()),按 4 个条件决定m是否入选 (详见 材料逐项开关),同时为每个入选材料 预建materials.material-id.<材料>属性(0 – 100000,默认 0)并塞进configProps/configIDs。 - 注册:
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):
- 从
configProps(或现查)拿materials.material-id.<材料>属性; - 值
> 0→ 直接用; - 值
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)。
见 渲染映射。