方块委托 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) |