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 |
相关条目
- IExtendedBlockStorageMixin - 接口定义
- Constants -
MAX_BLOCK_ID/BLOCKS_PER_EBS - NEIDConfig - 触发开关
- MixinS21PacketChunkData - 调用
getBlockData写入区块包 - MixinAnvilChunkLoader - 调用
getBlockData/setBlockData写入 NBT