
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。
正在加载版本记录…
正在加载评论…
评论在新手盒子客户端中发表,这里同步展示。