口渴已被夺走:Mixin服务器修复

口渴已被夺走:Mixin服务器修复

Universal NBT ItemStack 空指针安全补丁。修复任何模组在服务器与客户端同步期间发生的 EncoderException 崩溃。使用 Mixins 防止空引用,无需修改源代码。最初为 TWT(Thirst Was Taken)开发。

Bug修复

口渴已取:服务器修复

🔧 这个模组是什么?

一个关键的补丁模组,修复了在服务器与客户端通信期间影响 ItemStack 序列化的 NBT 标签同步崩溃。最初为 Thirst Was TakenThirst-No-More 模组发现并解决,此修复普遍适用于任何在 Netty 数据包编码期间遇到空 ItemStack 崩溃的模组。

🐛 问题所在

多个模组(特别是水/饮水容器类模组)使用 ItemStack.getOrCreateTag() 模式,这可能会无意中创建包含空 ItemStack 引用的 NBT 标签。当这些物品从服务器同步到客户端时,Netty 编码器尝试序列化空 ItemStack 对象,从而导致:

EncoderException: Cannot invoke net.minecraft.world.item.ItemStack.m_41619_()
because p_130056_ is null

此崩溃会完全阻止玩家加入服务器。

✅ 解决方案

此模组使用 Forge Mixins 在网络层注入保护性补丁,而无需修改原始模组:

  • FriendlyByteBufItemStackMixin:拦截所有对网络数据包的 ItemStack 写入,并用 ItemStack.EMPTY 安全替换空 ItemStack 引用,保持数据包协议完整性
  • ItemStackNullSafetyMixin:保护关键的 ItemStack 序列化方法(save()getMaxStackSize()isEmpty()getItem()

🎯 为什么选择此模组?

  • 无需修改源代码 - Mixin 在运行时打补丁
  • 通用解决方案 - 适用于任何存在空 ItemStack 问题的模组
  • 安全 - 用有效的空堆栈替换空值,保持服务器稳定性
  • 透明 - 零配置要求,安装后立即可用

📋 兼容性

  • Minecraft:目前仅支持 1.20.1
  • 适用于:Thirst Was Taken、Thirst-No-More,以及任何存在 ItemStack NBT 同步问题的模组

🔍 起源

此修复旨在解决使用 Thirst Was TakenThirst-No-More 模组的服务器中出现的严重加入崩溃问题。底层问题(NBT 序列化中的空 ItemStack)可能发生在任何模组中,因此此解决方案作为通用补丁提供。


遇到问题? 如果遇到任何问题,请连同您的 latest.log 一并报告。