MixinDataWatcher

基本信息

属性 值
Mixin 目标 net.minecraft.entity.DataWatcher
Phase EARLY
角色 可选扩展 DataWatcher ID 上限 31 → 127
启用条件 NEIDConfig.ExtendDataWatcher = true(Mixins.VANILLA_STARTUP_DATAWATCHER.setApplyIf)
依赖 Constants.MAX_DATA_WATCHER_ID = 127

解决的问题

vanilla DataWatcher 用 1 字节 (objectType << 5 \| dataValueId) & 0xFF 编码:5 位 type + 5 位 index = 实际 index 上限 31。 NEID 改为 (objectType << 7 \| dataValueId) & 1023:3 位 type + 7 位 index = 实际 index 上限 127。

注入点

注入 方法 改写
@ModifyConstant addObject 常量 31 → Constants.MAX_DATA_WATCHER_ID (127)
@Redirect func_151509_a 中 PacketBuffer.writeByte 改 writeShort(Constants.MAX_BLOCK_ID)(仅占位,实际传参不变)
@ModifyVariable STORE i writeWatchableObjectToPacketBuffer (objectType << 7 | dataValueId & MAX_DATA_WATCHER_ID) & 1023
@Redirect ordinal = 0 writeWatchableObjectToPacketBuffer 中 PacketBuffer.writeByte writeShort
@Redirect writeWatchedListToPacketBuffer 中 PacketBuffer.writeByte writeShort
@Redirect slice HEAD → ArrayList <init> readWatchedListFromPacketBuffer 中 PacketBuffer.readByte 强转 readShort() 为 byte
@ModifyConstant readWatchedListFromPacketBuffer 中 127 → MAX_BLOCK_ID
@ModifyVariable STORE i readWatchedListFromPacketBuffer (b0 & 896) >> 7 解出 objectType(高 3 位)
@ModifyVariable STORE j readWatchedListFromPacketBuffer b0 & MAX_DATA_WATCHER_ID 解出 index(低 7 位)

行为开关

配置 Mixin 是否加载 副作用
ExtendDataWatcher = false(默认) ❌ vanilla 31 上限
ExtendDataWatcher = true ✅ 127 上限,所有 DataWatcher 写入/读取升级

启用该选项必须保证所有 mod 配合(特别是生物 NBT 注册),否则写入端用 31 上限、读取端用 127 上限的 mod 会导致字段错位。GTNH 通过 MFQM ASM transformer 同步改写 MoreFunQuicksandMod 的同名硬编码 31 来保证一致。

相关条目

  • NEIDConfig - 开关
  • Constants - MAX_DATA_WATCHER_ID = 127
  • MFQM ASM transformer - 配套硬编码 31 改写