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(物品)这类已汉化的前缀。

相关条目