方块委托 API(ModBlockDelegate)

基本信息

属性 值
委托器 journeymap.client.model.mod.ModBlockDelegate(ModBlockDelegate.java:21)
处理者接口 ModBlockDelegate.IModBlockHandler(:106)
颜色接口 ModBlockDelegate.IModBlockColorHandler(:124)
已注册处理者 5 个(ModBlockDelegate.java:30-35)
调用时机 制图任务处理方块时(BlockMD.java:156)
作用范围 仅客户端(journeymap.client.* 包)

功能

JourneyMap 的地图颜色不是"查一张预制贴图表",而是逐方块计算。ModBlockDelegate 是这套机制留给第三方 mod 的扩展点:某个 mod 的方块若无法用通用规则正确着色(需要特殊判定、或需要在此处触发副作用如自动建路点),就实现 IModBlockHandler 接管它。

委托器持有 5 个处理者的固定列表(ModBlockDelegate.java:30-35),硬编码在构造函数中——没有公开的 register() 方法,第三方只能通过在 journeymap.client.model.mod 包内新增并修改此列表来接入。

两个接口

IModBlockHandler(:106-119):

方法 阶段 语义
boolean initialize(BlockMD) 缓存建立时,每个方块一次 声明"我接管这个方块"。返回 true 表示该方块需要交给 handleBlock 处理
BlockMD handleBlock(ChunkMD, BlockMD, int, int, int) 逐方块、制图时 返回用于着色的 BlockMD;返回 null 则回退为原 BlockMD(:62-65)

IModBlockColorHandler(:124-129):

方法 语义
Integer getBlockColor(ChunkMD, BlockMD, int globalX, int y, int globalZ) 地形图着色
Integer getTextureColor(BlockMD) 贴图取色

IModBlockColorHandler 的实现方式是设置到 BlockMD 实例上而非注册到委托器:BlockMD.setBlockColorHandler()(BlockMD.java:462)与 getModBlockHandler() / setModBlockHandler()(:724、:734)。

两个调用入口

  • ModBlockDelegate.initialize(BlockMD)(:72-78)对 5 个处理者逐个调用 initialize(),返回 true 的记 debug 日志(:88-91);抛异常只记 error 不中断(:92-99)
  • static ModBlockDelegate.handleBlock(...)(:42-67)从 blockMD.getModBlockHandler() 取出该方块专属的处理者调用;若为 null 则主动清空(:53-55)避免重复查找

数值

数值名 值
已注册处理者数 5
IModBlockHandler 方法数 2
IModBlockColorHandler 方法数 2
处理者覆盖的 mod 数 5 个 mod(含 vanilla)
BlockMD.Flag 枚举值数 见 BlockMD.java:790 起(HasAir、CustomBiomeColor、Plant、NoShadow、NoTopo、Foliage、Grass 等)

5 个已注册处理者

顺序 处理者 目标 mod 行为
1 VanillaBlockHandler.CommonHandler 原版 按 Material 与方块类继承关系批量打标(vanilla/VanillaBlockHandler.java:101-148)
2 CarpentersBlocks.CommonHandler CarpentersBlocks 解析方块 NBT 属性(cbAttrList / id / Damage)后打标(CarpentersBlocks.java:25-60)
3 TerraFirmaCraft.TfcBlockHandler terrafirmacraft / tfc2 / terrafirmacraftplus 三个 modid 依次尝试(TerraFirmaCraft.java:19-21)
4 Miscellaneous.CommonHandler Mariculture / Thaumcraft / TConstruct / ExtraUtilities / AE2 / Chisel 见下表
5 BiomesOPlenty BiomesOPlenty 按方块名匹配 45 种植物 + 1 种作物(BiomesOPlenty.java:25-26)

Miscellaneous.CommonHandler 覆盖的方块

方块 UID 处理 源码
Mariculture:kelp 加 Plant 标记,侧面贴图设为 2 Miscellaneous.java:32、:57-61
Thaumcraft:blockMagicalLeaves 加 NoTopo、Foliage 标记 :34、:62-65
TConstruct:decoration.stonetorch 加 HasAir、NoShadow :43
ExtraUtilities:magnumTorch 同上 :44
appliedenergistics2:tile.BlockQuartzTorch 同上 :45
chisel:torch1 … chisel:torch10 同上(循环生成 10 个) :46-49

所有火把类方块走同一条 torches.contains(uid) 分支(:52-55)。

Miscellaneous.OpenBlocksGraveHandler(:82)实现了 IModBlockHandler,用途是"为 OpenBlocks 墓地创建路点",但源码注释直接标注 // TODO: Buggy, don't use until fixed(:79-80),且没有被加入 ModBlockDelegate 的处理者列表(:30-35)——属于死代码,未注册。

交互

触发 行为
建立方块缓存 ModBlockDelegate.initialize(blockMD) 依次询问 5 个处理者
处理者对某方块返回 true 该方块被标记为需要 handleBlock 特殊处理
制图任务遇到该方块 ModBlockDelegate.handleBlock() 转交处理者;处理者抛异常只记 error 并回退原方块(:57-65)
处理者返回 null 回退使用原 BlockMD(:62-65)

相关条目