PatchLib - 修复补丁、崩溃修复与模组兼容

PatchLib - 修复补丁、崩溃修复与模组兼容

一个可配置的Bug修复、崩溃修复及兼容性补丁集合,适用于Tom's Simple Storage、Create、Vampirism、Toxony、Prickle和Arclight等模组。每个补丁在模组未安装时自动跳过。稳定你的整合包或服务器。

PatchLib 是一个包含多种模组错误修复、崩溃修复和兼容性补丁的随机集合 —— 涵盖 Farmer's Delight、Tom's Simple Storage、Vampirism、Toxony、Create、KubeJS、Arclight 等模组。

最初,我制作它只是为了阻止我所运行的服务器崩溃。随着时间的推移,它逐渐发展成一个像样的修复库,而到了某个阶段,再将它留给自己就没什么意义了——如果这些崩溃中的某一个曾让你在凌晨 2 点不得不重启服务器,那么这个模组就是为你准备的。

补丁仅在真正需要时运行

如果你维护整合包,这部分很重要。PatchLib 绝不会改动你未安装的模组。 在应用任何补丁之前,它会检查:

  • 目标模组是否已安装? 如果没有,则跳过该补丁——不会报错,也不会刷屏日志。
  • 模组版本是否确实受影响? 多项修复都绑定在带有该 Bug 的特定版本上。一旦模组更新越过该版本,补丁会悄悄退出,而不是与官方修复产生冲突。
  • 是否有其他模组已经修复了此问题? 已知冲突会自动禁用该补丁。
  • 是否是正确的运行环境? 仅客户端修复绝不会在专用服务器上加载。

每次启动时都会打印所有决策,因此你始终知道哪些补丁正在运行:

[PatchLib] --- 补丁状态报告(专用服务器)---
[PatchLib]  compat.create_contraption_collider [...] -> 已启用
[PatchLib]  farmersdelight.tag_load_order      [...] -> 已跳过(目标未安装)
[PatchLib]  patchouli.book_registry_lookup     [...] -> 仅客户端(不在专用服务器上加载)
[PatchLib] --- 18 个补丁中有 5 个已启用 ---

将其放入一个没有任何目标模组的整合包中,它不会做任何事情。

包含的修复

崩溃修复

模组 修复内容
Tom's Simple Storage InventoryConnectorBlockEntity 引起的 IllegalStateException: 不要在无效缓存上调用 getCapability 导致 tick 循环崩溃。现在会将已失效的能力缓存视为空库存。
Toxony 投掷油锅在区块重新加载或重启后因空 itemStack 崩溃——现在堆栈会保存到 NBT 中,并且 onHit 方法已加防护。
Prickle / PigPen 无法读取的配置导致整个数据包加载中止,使服务器在启动时挂起。现在会回退到默认值,保留损坏文件的副本,并让配置自我修复。
Prickle 配置格式在运行之间翻转,因为属性适配器通过线程上下文类加载器解析。现在改为确定性解析。
便携储罐 当储罐物品没有流体 NBT 时发生 NullPointerException
KubeJS 当整合包注册混合类型的构建器时,在能力注册和服务器脚本加载期间发生 ClassCastException
Vampirism 在混合服务器上,ActionHandler.deactivateAllActions 中发生 NullPointerException

Arclight / 混合服务器修复

  • 模组实体运行村民 AI 任务时发生 ClassCastException
  • Arclight 的村民职业重定向导致 Brain.tick 中出现 NullPointerException
  • 将 Friends & Foes 实体映射到 Bukkit 封装器时发生 ClassCastException

这些补丁仅在存在 Bukkit 类时加载,因此在纯 NeoForge 环境中是惰性的。

兼容性与行为修复

模组 修复内容
Create 当运动轴为 null 时,ContraptionCollider 中出现 NullPointerException
YUNG's 更好的末地岛屿 末影龙被生成两次
Farmer's Delight 模组加载顺序导致标签键保持为 null
Copper Age Backport 铜制盔甲注册时没有耐久度
Subtle Effects End Remastered 传送门框架的 ticker 从未触发
Just Enough Resources (客户端) 模组生物群系在 JER 标签页中缺失
Patchouli (客户端) 模组书封面物品无法解析

版本绑定补丁

部分修复仅适用于实际存在该 Bug 的模组版本。如果你的版本较新,PatchLib 会将该补丁报告为已跳过——这是预期行为,而非失败:

补丁 适用版本
Farmer's Delight — 标签加载顺序 1.3.1
KubeJS — 构建器转换 低于 2107.7.2(且当存在 KubeJS Tweaks 时禁用)
Copper Age Backport — 盔甲耐久度 0.1.4 及更旧版本
Subtle Effects — End Remastered ticker 1.11.0

其余补丁适用于其目标模组的任何版本。

配置

每个补丁在 config/patchlib-patches.properties 中都有独立的开关。该文件在首次启动时生成,每个补丁对应一条带注释的条目:

# --- toms_storage ---
# 将失效的 NeoForge BlockCapabilityCache 视为空库存,而不是从
# InventoryConnectorBlockEntity tick 中抛出 IllegalStateException
toms_storage.stale_capability_cache=true

如果某个修复产生了冲突,关闭那一行即可——无需移除整个模组。

运行环境

PatchLib 是一个服务端模组,客户端为可选。它不注册任何网络数据包或注册表条目,因此没有安装它的玩家也可以正常加入你的服务器。在客户端同样安装它,只是额外增加了两个客户端修复。

需求

  • Minecraft 1.21.1
  • NeoForge 21.1+
  • 无依赖

⚠ 报告前请阅读

这些补丁修复的是其他人的模组中的 Bug。随着那些模组更新,其中一些问题会在源头得到适当修复。在我了解受影响版本范围的情况下,一旦你更新越过了该版本,PatchLib 会自动禁用补丁——但我无法预测每一次未来发布。如果某个模组原生修复了问题而补丁造成了阻碍,只需在配置中将其设为 false

非常欢迎关于补丁本身的 Bug 报告。关于被修补模组的 Bug 报告则属于其作者。

致谢

多个补丁移植自 iamthemcmaster 的 Monkey Patches(LGPL 许可),并基于 PatchLib 的门控系统重建:Farmer's Delight、便携储罐、Copper Age Backport、Subtle Effects、KubeJS、Just Enough Resources 和 Patchouli。