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

相关条目