ClientBlockTransformerRegistry
基本信息
| 属性 | 值 |
|---|---|
| 类名 | com.gtnewhorizons.neid.ClientBlockTransformerRegistry |
| 角色 | 客户端方块转换注册表 —— 在发送给客户端之前批量/单点改写方块+Metadata |
| 数据结构 | private static final List<ClientBlockTransformer> TRANSFORMERS |
| 线程 | 仅客户端;列表非线程安全 |
API
| 方法 | 签名 | 用途 |
|---|---|---|
registerTransformer |
void registerTransformer(ClientBlockTransformer) |
把外部 mod 的 transformer 注册进列表(按注册顺序调用) |
transformBlock |
boolean transformBlock(World, int x, int y, int z, BlockMeta blockMeta) |
遍历所有 transformer 调用 transformBlock,任一返回 true 即对 blockMeta 有改写;返回 didSomething(任一返回 true) |
transformBulk |
void transformBulk(World, IntToLongFunction coord, ShortBuffer blocks, ShortBuffer metas) |
给 N 个方块批量转换,用 coord(i) 计算世界坐标;遍历所有 transformer 调用 transformBulk(默认实现走单点 transformBlock + BlockIdCache) |
注册顺序语义
TRANSFORMERS 是 ArrayList,按 registerTransformer 调用顺序遍历;后注册的 transformer 看到的是前面 transformer 已经改写过的 BlockMeta 对象(如果它实现了 BulkIdCache 直接传引用就可能短路,因此 transformer 实现需注意缓存失效)。
调用点(Mixin 注入)
| Mixin | 调用 |
|---|---|
MixinS23PacketBlockChange |
<init>(IIILnet/minecraft/world/World;)V 末尾(构造时调用 transformBlock,若被改写则用新方块覆盖 field_148883_d / field_148884_e) |
MixinS22PacketMultiBlockChange |
构造时按每方块调用 transformBlock |
MixinS21PacketChunkData |
func_149269_a(写入 chunk data packet)末尾注入遍历:@Inject(... at = @At("TAIL")) 把每个 EBS 的 blocks[i]/metas[i] ShortBuffer 通过 transformBulk 转换 |
第三方 mod 集成模式
外部 mod(典型如 EnderIO 用颜色隐藏方块、ProjectRed 用方块替代做纹理修复)实现 ClientBlockTransformer 接口并在 mod 初始化阶段 ClientBlockTransformerRegistry.registerTransformer(...) 即可让客户端收到的方块包在显示前被改写。
相关条目
- ClientBlockTransformer 接口 - transformer 必须实现的接口
- MixinS23PacketBlockChange - 单方块包转换点
- MixinS22PacketMultiBlockChange - 多方块变化包转换点
- MixinS21PacketChunkData - 区块包批量转换点