MixinS23PacketBlockChange
基本信息
| 属性 |
值 |
| Mixin 目标 |
net.minecraft.network.play.server.S23PacketBlockChange |
| Phase |
EARLY |
| 角色 |
单方块变化包 Metadata 用 short 写/读 + 构造时客户端方块转换 |
| Shadow 字段 |
field_148883_d(方块)、field_148884_e(Metadata) |
注入点
| 注入点 |
类型 |
作用 |
<init>(IIILnet/minecraft/world/World;)V 末尾 |
@Inject(at = @At("TAIL")) |
用现有字段构造 BlockMeta,调用 ClientBlockTransformerRegistry.transformBlock;若被改写则回写 field_148883_d / field_148884_e |
readPacketData 中 PacketBuffer.readUnsignedByte() ordinal = 1 |
@Redirect |
改为 readShort()(读 Metadata) |
writePacketData 中 PacketBuffer.writeByte(I) ordinal = 1 |
@Redirect |
改为 writeShort(i)(写 Metadata) |
构造注入
@Inject(method = "<init>(IIILnet/minecraft/world/World;)V", at = @At("TAIL"))
public void neid$transformBlock(int x, int y, int z, World world, CallbackInfo ci) {
BlockMeta bm = new BlockMeta(field_148883_d, field_148884_e);
if (ClientBlockTransformerRegistry.transformBlock(world, x, y, z, bm)) {
field_148883_d = bm.getBlock();
field_148884_e = bm.getBlockMeta();
}
}
注意:new BlockMeta(...) 是临时对象(非池化),因为构造完 field_148883_d/field_148884_e 字段本身已被复制,无需 mutate 池对象。
字节序
- vanilla:方块 ID(short)+ Metadata(byte,1 byte)= 3 bytes
- NEID:方块 ID(short)+ Metadata(short)= 4 bytes
相关条目