JewelryCraft 集成
基本信息
| 属性 | 值 |
|---|---|
| 判定 modid(注册处) | Jewelrycraft(Wawla.java:75) |
| 判定 modid(addon 内部) | ⚠️ Jewelrycraft2(AddonJewelrycraftTiles.java:24)——两处不一致 |
| 文件 | src/main/java/net/darkhax/wawla/addons/jewelrycraft/AddonJewelrycraftTiles.java(152 行) |
| 实现接口 | IWailaDataProvider |
| 配置分类 | Jewelrycraft(4 个键) |
| 反射目标 | 2 个 TileEntity |
| GTNH 状态 | 整合包含 JewelryCraft 2 |
⚠️ 头号矛盾:两个不同的 modid 字符串
这是本 mod 最值得注意的一处不一致:
| 位置 | 代码 | 判定的 modid |
|---|---|---|
Wawla.java:75 |
if (Loader.isModLoaded("Jewelrycraft")) |
Jewelrycraft |
AddonJewelrycraftTiles.java:24 |
if (Loader.isModLoaded("Jewelrycraft2")) |
Jewelrycraft2 |
Wawla.java:75 决定是否发送 IMC;AddonJewelrycraftTiles.java:24 决定构造函数里是否做 Class.forName。两处必须同时为真,addon 才能正常工作,而实际只取决于前者。
JewelryCraft 2 的真实 modid 就是 Jewelrycraft2(包名 darkknight.jewelrycraft 也印证了这是 2 代)。因此:
- 装了
Jewelrycraft2→Wawla.java:75判"Jewelrycraft"为假 → IMC 根本不发 → addon 完全不工作; - 若某整合包把 modid 改回
Jewelrycraft(1 代)→ IMC 发了,但构造函数内isModLoaded("Jewelrycraft2")为假 → 12 个类全不加载 → 仍不工作。
两种情况下这个 addon 都不会生效,除非目标 mod 的 modid 恰好同时叫这两个名字(不可能)。这与 Tinkers / 神秘时代 那种"两处 modid 一致"的做法形成鲜明对比——后两者是可用的。
⚠️ 注意 Loader.isModLoaded 在 1.7.10 里对 modid 大小写敏感,所以这不可能靠大小写差异解释。
反射缓存
| 字段 | 目标类 | 声明 |
|---|---|---|
classTileEntitySmelter |
darkknight.jewelrycraft.tileentity.TileEntitySmelter |
public static Class(:150) |
classTileEntityMolder |
darkknight.jewelrycraft.tileentity.TileEntityMolder |
public static Class(:151) |
catch 了 ClassNotFoundException 与 SecurityException 两个(:32 / :37),都只 printStackTrace。
⚠️ 注册粒度错误:TileEntity 类被当成 Block 类注册
registerAddon(:139-142):
register.registerBodyProvider(dataProvider, classTileEntitySmelter); // ← 传的是 TileEntity
register.registerNBTProvider(dataProvider, classTileEntitySmelter);
register.registerBodyProvider(dataProvider, classTileEntityMolder);
register.registerNBTProvider(dataProvider, classTileEntityMolder);
对比 神秘时代 与 Tinkers:两者都先 Class.forName 出 Block 类再注册 Block 类(classBlockJar / classDryingRack),TileEntity 类只用于 handler 内部的 compareTileEntityByClass 判断。
而本 addon 直接把 TileEntity 类交给了 registerBodyProvider。WAILA 1.7.10 的 IWailaRegistrar 注册 API 期望的是 net.minecraft.block.Block,用 TileEntity 类注册无法匹配任何方块——这两个 provider 不会被 WAILA 调用。
这与上面的 modid 不一致是两个独立的致命问题:即使 modid 判定修对了,注册粒度依然让 addon 失效。
HUD 行设计(若 modid 与注册问题都不存在时)
getWailaBody 前置:data.getBlock() != null && data.getTileEntity() != null(:61)。两组是平行 if。
熔炉(TileEntitySmelter)
熔融金属(:65-75):
| 门控键 | 输出 | 数据 |
|---|---|---|
wawla.jewelrycraft.showMoltenAmount |
Molten: <名> X <N> |
hasMoltenMetal 为真时,quantity × 10,2 位小数 |
getMetalStack(:107-113)用 new ItemStack(Item.getItemById(tag.getShort("id")), tag.getByte("Count"), tag.getShort("Damage")) 从 NBT 重建物品——注意用的是数字 id(1.7.10 的存档格式)而不是字符串注册名。
未熔金属(:77-93):
| 门控键 | 输出 | 数据 |
|---|---|---|
wawla.jewelrycraft.showMetalAmount |
Unmelted: <名> X <stackSize> |
hasMetal 为真时 |
wawla.jewelrycraft.showMeltTime |
Melt Time: <N> 秒 |
tag.getInteger("melting") / 20 |
成型台(TileEntityMolder)
:96-101 是一个无花括号的嵌套 if(if (A) if (B) tip.add(...)):
| 门控键 | 输出 | 数据 | 附加条件 |
|---|---|---|---|
wawla.jewelrycraft.showCooling |
Cooling: <N> 秒 |
tag.getInteger("cooling") / 20 |
cooling > 0 |
⚠️ 少写花括号,:97-101 的 tip.add 视觉上像属于外层 if,实际是内层 if 的唯一语句。语义正确但可读性差。
⚠️ 源码缺陷
缺陷 1:modid 两处不一致(见上,最严重)
缺陷 2:注册粒度错误(见上,独立致命)
缺陷 3:Item.getItemById 可能返回 null → new ItemStack(null, ...) 抛异常
AddonJewelrycraftTiles.java:109-112:
return new ItemStack(
Item.getItemById(metalTag.getShort("id")),
metalTag.getByte("Count"),
metalTag.getShort("Damage"));
Item.getItemById 对未注册的 id 返回 null,而 new ItemStack(Item, int, int) 会对 null item 抛异常。且 getMetalStack 的返回值在 :72 和 :84 都被直接 .getDisplayName(),全程无 null 检查。
getByte("Count") 也是有符号的——Count 为负(存档损坏)时 new ItemStack 抛 IllegalArgumentException。
缺陷 4:getMetalStack 的局部变量命名误导
两处都把变量命名为 moltenTag(:67 与 :79),但 :79 读的是 "metal"(未熔)标签。纯命名问题。
缺陷 5:整个 addon 的 4 个 tooltip 与 4 个 option 在中文语言文件里是英文
zh_CN.lang:108-117 的 8 个值全是英文(Molten / Unmelted / Melt Time / Cooling / Molten Amounts / Unmelted Amounts / Melting Time / Cooling Time)。若这个 addon 真的生效,中文玩家会看到英文提示。详见 随包资源。
缺陷 6:HUD 前缀缺失导致中英混杂
tooltip.wawla.jewelry.molten=Molten 被直接当整行文本用(:71),拼在物品名之后,形成 Molten: 金锭 X 12.5 这样的中英混排行。对比仓内其它 addon 都用 tooltip.wawla.item(物品)这类已汉化的前缀。
相关条目
- 配置项 —
Jewelrycraft分类的 4 个键 - 架构与 WAILA 接入方式 — 5 个
isModLoaded判定的总览 - 神秘时代集成 — 正确的"Block 类注册 + TileEntity 内部判断"范式
- 随包资源 — 8 个未汉化键