MixinExtendedBlockStorage

基本信息

属性 值
Mixin 目标 net.minecraft.world.chunk.storage.ExtendedBlockStorage
Phase EARLY
实现接口 IExtendedBlockStorageMixin(暴露 16-bit short 数组给外部)
关键数组 short[4096] block16BArray + short[4096] block16BMetaArray

注入字段

字段 类型 用途
block16BArray short[BLOCKS_PER_EBS] 16-bit 方块 ID 数组(覆盖原版 blockLSBArray 8 位 + blockMSBArray 4 位 = 12 位的组合)
block16BMetaArray short[BLOCKS_PER_EBS] 16-bit Metadata 数组(覆盖原版 4 位 NibbleArray)

Overwrite 方法

方法 作用
Block getBlockByExtId(int x, int y, int z) 用 block16BArray[y << 8 | z << 4 | x] & 0xFFFF 查 ID → Block.getBlockById
int getExtBlockMetadata(int x, int y, int z) 用 block16BMetaArray[y << 8 | z << 4 | x] & 0xFFFF 查 Metadata
void func_150818_a(int x, int y, int z, Block b)(即 setExtBlockID) 维护 blockRefCount / tickRefCount;调 Block.getIdFromBlock(b);如果 CatchUnregisteredBlocks && newId == -1 抛 IllegalArgumentException;newId < 0 || newId > MAX_BLOCK_ID(且非 -1)抛 id out of range: ...;若 newId == -1 沿用旧块 ID;最后 setBlockId(x, y, z, newId)
void setExtBlockMetadata(int x, int y, int z, int meta) block16BMetaArray[y << 8 | z << 4 | x] = (short) (meta & 0xFFFF)
void removeInvalidBlocks() 遍历 block16BArray:如果 id > 0 && BlockRegistry.getObjectById(id) == null,根据 RemoveInvalidBlocks 决定把该位置清 0 或保留(保留时按 Blocks.air 之外累加 blockRefCount/tickRefCount)

索引公式

index = (y & 0xF) << 8 | (z & 0xF) << 4 | (x & 0xF)

注意 y 仅低 4 位有效(每个 EBS 是 16×16×16 = 4096 方块,与原版一致)。y << 8 实际只取低 4 位,所以 16 位 short 数组大小 4096 刚好够。

接口实现

public class MixinExtendedBlockStorage implements IExtendedBlockStorageMixin {
    @Override public short[] getBlock16BArray()        // 直接返回 this.block16BArray
    @Override public short[] getBlock16BMetaArray()     // 直接返回 this.block16BMetaArray
    @Override public byte[] getBlockData()              // 拷贝 short[] → byte[] (大端)
    @Override public byte[] getBlockMeta()              // 同上
    @Override public void setBlockData(byte[] data, int offset)   // byte[] → short[] (大端)
    @Override public void setBlockMeta(byte[] data, int offset)   // 同上
}

getBlockData / setBlockData 用于 MixinS21PacketChunkData / MixinAnvilChunkLoader 把 short[] 与 Blocks16 byte[] NBT 互转(ByteBuffer.wrap(...).asShortBuffer().put(...) 大端)。

行为开关

配置 触发位置 行为
CatchUnregisteredBlocks func_150818_a 检测到未注册方块抛异常
RemoveInvalidBlocks removeInvalidBlocks 坏块置 0

相关条目