Spawn C2ME Fix

Spawn C2ME Fix

修复了同时使用Spawn和C2ME时的区块死锁和游戏崩溃问题。

Bug修复

描述

此模组为 Spawn 模组中的 AnimalVariantManager.chooseWeightedVariant() 打补丁,使其使用实体自身线程安全的 RandomSource,而不是 Level.random.。

这可以防止 C2ME 在区块生成期间从工作线程调用 finalizeSpawn 时出现 ConcurrentModificationException,否则该异常会导致进一步的区块加载死锁。

此外,它还修复了一处线程冲突,该冲突可能在区块自动保存期间导致服务器死锁或崩溃。Spawn 的方块变体分配代码(Moray Crevice、海洋生物装饰、海胆)偶尔会执行不安全的世界查询,例如生物群系查找、相邻方块更新,而这些操作所处的上下文已无法保证 C2ME 的异步区块系统能够完成它们,从而导致服务器卡死。方块变体分配现在被推迟到正常的 tick 中执行,而不是在区块自动保存期间运行,并且其生物群系查找不再强制加载区块。

已知问题

最初的方法旨在使动物变体具有确定性,这意味着在相同种子下,你总会在世界中的相同位置遇到相同的变体。此修复破坏了这一行为,使变体完全随机。使用相同种子生成世界,每次都会得到不同的结果。

可能存在一种更优雅的解决方法,但这需要更深入的集成,而对我个人而言这超出了范围。