PaperFixes

PaperFixes

来自CraftBukkit、Spigot和Paper的bug及性能修复集合,以Forge模组形式呈现。

管理

Discord

PaperFixes

将 CraftBukkit、Spigot 和 Paper 中的一系列漏洞与性能修复带到了 Forge 模组中。
这是一个性能模组,可能会出现漏洞和不兼容问题。如果发现任何问题,请在 GitHub 上提交 issue。

当前的修复与功能

漏洞修复
  • avoidItemMergeForFullStacks - 在边界框检查之前,跳过对已满物品堆叠的合并检查。
  • clearPacketQueue - 在玩家断开连接时清空数据包队列,以防止内存泄漏。
  • explosionsIgnoreDeadEntities - 将死亡实体和不可选中的玩家排除在爆炸影响之外。
  • fixMc54738 (MC-54738) - 限制生物群系权重变量,以修复地形尖刺问题。
  • fixMc80966 (MC-80966) - 确保空子区块向客户端发送数据。
  • fixMc98153 (MC-98153) - 防止在下界传送门中出现回弹和窒息。
  • fixMc133373 (MC-133373) - 重置 NaN 属性值。
  • fixShulkerDispenseCrash - 防止在高度限制处通过发射器放置非空潜影盒时崩溃。
  • fixShulkerDupe - 修复因未移除潜影盒方块实体而导致的复制漏洞。
  • fixWaterMobSpawnCheck - 确保水生生物生成在水中且有足够空间。
  • dontOffloadBeaconColorUpdate - 避免信标更新时不必要的线程切换。
  • handleNullTileCrashes - 记录空方块实体日志,而不是引发更多问题。
  • removeInvalidMobSpawners - 移除已不存在的问题生物生成器。
  • sortEnchantments - 按 ID 排序附魔,以确保相同的物品被视为相同。
客户端
  • cacheLastChunk - 由于 Minecraft 在一帧内会多次从区块提供器访问同一区块,我们可以缓存最后一次访问的区块。这在客户端上通常不会有太大影响,但在飞行并加载区块时,如果每个区块需要执行大量操作,速度会稍快一些。
  • fastWorldBorder - 默认在客户端(包括内部服务器)上禁用,因为边界移动动画无法正常工作,导致倒计时结束时边界会直接跳到最终位置。如果你不在意这一点,可以为客户端和内部服务器启用世界边界缓存。
功能
  • spawnChunkGamerule - 启用 spawnChunkRadius 游戏规则。 允许你为世界或服务器定义出生区块半径,类似于现代 Minecraft,但有一些差异。在 Minecraft 1.12 中不存在区块票据,因此出生区块是固定的 16×16 区域,始终加载并 tick。其中的实体仅在更小的 12×12 区域内处理,因为实体 AI 需要 5×5 的已加载区域。PaperFixes 使用一致的直径,以包含出生点的区块为中心,而原版如果出生点位于区块中心时可能会变成 17×17。 将此游戏规则设为 0 可完全禁用出生区块。
  • spawnChunkRadius - 为上述功能设置默认出生区块半径。仅适用于新世界或尚未使用 PaperFixes 2.0.0-beta.1 或更高版本运行过的世界。取值范围为 0 到 32,其中 0 完全禁用出生区块,32 则提供 64 区块的直径。
  • improvedTickLoop - 使用纳秒而非毫秒来测量时间以获得更好的精度,使用 LockSupport.parkNanos 进行精确休眠,并根据 tick 长度自适应调整休眠时间。当服务器落后超过 2.5 秒时,会尽可能快地运行 tick,在下一次 tick 开始附近进行自旋而不是休眠,以避免休眠过久。
  • tickLoopSpinTime - 控制服务器 tick 循环自旋而不是休眠的持续时间(以纳秒为单位)。还会影响循环在原本应为休眠时间时停止运行计划任务的时间点。
  • runTasksDuringSleep - 允许 tick 循环在休眠期间运行计划任务而不是空闲等待。
  • fastWorldBorder - 缓存世界边界的角点,以加快计算速度,而不是每次都重新计算。
性能
  • ioThreadSleep - 控制世界保存线程的休眠时间。在 PaperFixes 中默认完全不休眠,以避免罕见的内存和保存问题。如果启用,它会休眠 2 毫秒而不是通常的 10 毫秒。除非有特定原因,否则最好保持禁用。
  • cacheBlockDensities - 缓存方块密度值,这样爆炸就不需要重复检查相同的方块数据。
  • cacheLastChunk - 在一个 tick 内缓存从区块提供器最后访问的区块,避免重复查找。
  • compactLut - 使用更小、更快的查找表来计算正弦和余弦。感谢 jellysquid3 和 ruViolence。
  • fastChests - 仅在需要时运行箱子开/关动画,而不是每个 tick 都运行。
  • smartRegionRead - 一次性读取整个区域文件头,以加快世界加载并减少潜在问题。
  • fastEntityDataMap - 使用更快的哈希映射来存储和查找实体数据。
  • optimizePathfinding - 通过跳过重复或不可能的路径来改进寻路。
  • optimizedTaskQueue - 为计划任务使用更快的队列实现。
  • pathingChunkCache - 使用快速的一维缓存跟踪实体正在经过的区块。感谢 jellysquid3 和 ruViolence。
  • pathNodeCache - 保存寻路数据,以避免重复计算相同的方块。感谢 jellysquid3 和 ruViolence。
  • queueChunkSaving - 随时间逐步保存区块,而不是一次性全部保存,从而减少保存期间服务器停顿的时间。
  • trimRegionCache - 仅卸载使用最少的区域,而不是一次性全部卸载,防止活跃区域立即被重新加载。
  • sharedRandomForEntities - 为所有实体使用共享的随机数生成器,而不是为每个实体创建新的生成器。

已知不兼容项

  • 改进的 tick 循环与 VintageFix 中的 mixin.bugfix.slow_tps_catchup 选项不兼容(已在提交 ecbc3e1 中移除,且不再存在于最新版本中),也与 Forged Carpet 的 tick 循环改动不兼容,可能还与其他任何模组不兼容。
  • 劣质核心模组可能导致重入错误,并在游戏启动时立即崩溃。这不是 PaperFixes 的错,且无法避免,因为这些模组过早加载了游戏类。唯一的解决办法是用修复了这些问题的分支模组替换它们。
    有问题的核心模组及解决方案的不完整列表: