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 通过
MFQMASM transformer 同步改写 MoreFunQuicksandMod 的同名硬编码 31 来保证一致。
相关条目
- NEIDConfig - 开关
- Constants -
MAX_DATA_WATCHER_ID = 127 - MFQM ASM transformer - 配套硬编码 31 改写