跳到正文

Weather, Storms & Tornadoes – Concurrent Packet Fix

作者:BachCter

通过实现线程安全的 NBT 序列化,修复因 ConcurrentModificationException 导致的断开连接问题。这是一项全局补丁,可修复 Weather2 及其他存在类似多线程问题的模组。

收藏

介绍

介绍由机器翻译自 CurseForge 原页面,仅供参考。

CompoundTag 并发修改修复

这是一款轻量级 Mixin 补丁,可消除 NBT 数据序列化期间因 java.util.ConcurrentModificationException 导致的客户端断开连接问题。该模组最初是为解决原版 Weather, Storms & Tornadoes (Weather2) 模组中由来已久的问题而开发的,但它会在全局引擎层面应用修复,为整个整合包提供保护。

🔍 问题所在

bug-report

当模组尝试从异步网络线程(例如 Netty I/O)编码 CompoundTag(NBT),而主游戏线程同时修改同一个标签时,Minecraft 经常会断开客户端连接。由于 Java 标准的 HashMap 本身并非线程安全,这种并发访问会立即触发 ConcurrentModificationException。Minecraft 会通过立即断开客户端连接来处理此错误,从而影响游戏体验。

🛠️ 解决方案

此补丁无需逐一等待各个模组更新,而是直接注入原版 Minecraft 的 net.minecraft.nbt.CompoundTag.write() 方法。它会拦截序列化过程,并实现优化的“安全快照”机制:

  • 无锁重试:动态捕获内部映射状态,不会造成线程死锁。
  • 安全上限:严格限制为最多重试 100 次。若超过上限,便安全地写入空标签,以保持连接稳定。
  • 快速执行:在实际环境中,通常只需尝试 1–3 次即可成功获取安全快照。

✨ 主要特性

  • 通用保护:自动保护任何在多个线程之间错误处理 NBT 数据的模组。
  • 零配置:真正即装即用,无需配置文件或调整设置。
  • 非侵入式架构:不修改各个模组的源代码,大幅降低冲突风险。
  • 压力测试验证:经加速至 1000 TPS 的测试验证,处理开销可忽略不计。
  • 面向未来的设计:作为被动式安全措施运行。如果某个模组在上游修复了线程问题,此补丁会自然变为“空操作”(不执行任何操作),维持原版行为。

⚙️ 支持的版本与加载器

此模组适用于多种现代模组生态:

  • 模组加载器:Minecraft Forge 和 NeoForge
  • 游戏版本:Minecraft 1.20.x、1.21.x,以及其他存在 NBT 导致网络断开问题的相近版本(忽略兼容性警告即可)。

💬 常见问题

问:这个补丁只对 Weather2 有效吗?
答:不是。开发工作由 Weather2 引发,但修复作用于原版引擎层面。任何执行异步 NBT 修改的模组都能受益。

问:这会影响服务器或客户端的性能吗?
答:不会。执行开销完全可以忽略不计。在极端模拟刻环境下进行的测试显示,帧率和刻时间均未出现下降。

问:我需要进行任何配置吗?
答:不需要。补丁会在初始化时自动启用。你可以查看控制台,确认是否出现以下信息:[weather2patch] CompoundTag thread-safety patch is active。

问:如果上游模组更新并修复了这个 bug 会怎样?
答:不会出问题。因为这个模组针对的是原版层,它只会发现线程状态已经是干净的,完全跳过重试,并让原版代码接管。

[描述在 Gemini 3.1 Flash 的帮助下更新]

常见问题

Weather, Storms & Tornadoes – Concurrent Packet Fix 支持哪些 Minecraft 版本?

Weather, Storms & Tornadoes – Concurrent Packet Fix 支持 Minecraft Java 版 1.20.1–1.21.1,共 3 个版本,可用的加载器:Forge / NeoForge。下载时注意选择和你游戏版本一致的文件。

Weather, Storms & Tornadoes – Concurrent Packet Fix 怎么安装?

先用 PCL2 或 HMCL 启动器安装对应版本的 Forge / NeoForge,再把下载的 .jar 文件放进游戏目录的 mods 文件夹,重新启动游戏即可。开启了版本隔离的,mods 文件夹在 versions/版本名 下面。

评论

登录后评论和评分