跳到正文

IOB Deadlock Fixes

作者:VonixNetwork

用于防止 Isle of Berk 模组中出现导致死锁崩溃的问题。

收藏

介绍

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

IsleOfBerk DeadlockFix

一款适用于 Forge 1.18.2 的小型兼容性模组,可修复 IsleOfBerk 这款《驯龙高手》(HTTYD)龙类模组中的服务器崩溃问题:区块生成死锁。该模组由 GACMD 团队(Ghanou Craft、Apprentice Necromancer、TooTHleZZ 和 Arsian)制作,详见 Isle of Berk。

ℹ️ Isle of Berk 本身已正式停止更新——此修复适用于仍在 1.18.2 整合包中使用最终版 isleofberk-1.2.0 jar 的服务器,例如由 kesselot 制作的 Isle of Berk (Claws of Berk)。

如果安装了 IsleOfBerk 后,你的服务器因 ServerHangWatchdog 报出 “A single server tick took 60.00 seconds” 而崩溃——这款模组就能解决问题。


🐉 问题

在世界生成期间,SpeedStinger.checkSpawnRules 会调用 ADragonBase.isWaterBelow(),后者会通过 Level.getBlockState(BlockPos) 读取完整的 ServerLevel。如果读取目标是尚未完成生成的相邻区块中的方块,世界生成工作线程就会阻塞在 ServerChunkCache.getChunk(...).join() 中,等待一个也在等待它的区块——这会导致 Worker-Main-N 线程之间发生循环死锁。

60 秒后,服务器看门狗触发,导致整个服务器崩溃。

日志中的典型症状:

[Server Watchdog/FATAL]: A single server tick took 60.00 seconds (should be max 0.05) …堆栈信息指向 ServerChunkCache.getChunk,调用链为 SpeedStinger.checkSpawnRules → ADragonBase.isWaterBelow。


🔧 修复方式

通过精确的 Mixin(在 isWaterBelow() 的 HEAD 处执行 @Inject):

  • 如果调用线程名称以 Worker-Main 开头(即世界生成线程),则直接返回 false——不执行线程外方块读取,也就不会发生死锁。
  • 世界生成期间的生成检查是唯一会从主线程之外调用此方法的情况,因此提前返回只会影响区块生成期间的生成位置判断(SpeedStinger 仍可正常生成,只是在世界生成时跳过水域检查)。
  • 所有实时 AI 调用(DragonSleepGoal、AIDragonLand 等)都在主 Server thread 上运行,完全不受影响——龙的行为保持不变。
  • 使用 @Pseudo,即使缺少 IsleOfBerk,或 refmap 生成时无法识别目标类,也能正常加载。

✅ 兼容性

项目 版本/说明
Minecraft 1.18.2
Forge 40.x+
加载器 Forge (FML)
运行端 服务端与客户端(修复针对服务端;客户端安装副本不会造成影响)
必需模组 isleofberk ≥ 1.2.0

此模组只修补 IsleOfBerk——不会与其他模组交互,可安全安装到任何包含 IsleOfBerk 的 1.18.2 整合包中(例如 Claws of Berk)。


📦 安装

  1. 将 isleofberk-deadlockfix-1.0.0.jar 放入 mods/,与 isleofberk-1.2.0.jar 放在一起。

  2. 启动服务器。在日志中确认出现:[IoB-DeadlockFix] Loaded。Mixin 会在非主线程生成世界时短路调用 ADragonBase.isWaterBelow()。

  3. 现在可以安心游玩,服务器在生成区块时不会再崩溃了。🎉


📜 许可协议与源代码

TheGameHosting

常见问题

IOB Deadlock Fixes 支持哪些 Minecraft 版本?

IOB Deadlock Fixes 支持 Minecraft Java 版 1.18.2,可用的加载器:Forge。下载时注意选择和你游戏版本一致的文件。

IOB Deadlock Fixes 怎么安装?

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

评论

登录后评论和评分

VonixNetwork 的其他作品

查看全部 →