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(...) 即可让客户端收到的方块包在显示前被改写。

相关条目