[SBW] 抛射体区块加载

[SBW] 抛射体区块加载

服务端修复,使Superb Warfare和PointBlank的火箭、炮弹及子弹在未加载区块中飞行时不会卡顿。

[SBW] 弹射物区块加载

Superb Warfare + PointBlank (FCL) 的服务器端附加组件:让火箭弹、炮弹、子弹和无人机在飞越未加载区块时不会冻结。

问题

Superb Warfare 和 PointBlank (FCL) 中的远程武器发射的弹射物会远远飞过已加载区域:

  • SBW 仅原生强制加载 4 类弹射物(制导导弹、中型火箭、加农炮和迫击炮弹)的区块。其他所有类型——NURS 火箭弹、机炮炮弹、炸弹、RPG 火箭弹、7.62/12.7 子弹——在到达已加载地形边缘时会冻结,并且永远不会再飞回来。
  • PointBlank/FCL 发射器火箭弹(RPG-7V2、RPG-26、M72、AT4、SMAW、卡尔·古斯塔夫)存在同样的问题。
  • FPV/Mavic 无人机(uncomplicated-fpv)在飞出已加载区域时,会悄无声息地失去信号链路。

同时,SBW/pointblank 弹射物只会在 distance <= simulation-distance 的区块中 tick。原版区块加载由玩家驱动——炮弹将要落下的地方,没有人站在那里。

此模组的作用

在原版 ServerLevel.addFreshEntity 上挂载一个钩子,将每个新弹射物送入公开追踪器 API。对于每个被追踪的弹射物,该模组会:

  1. 按速度分类(子弹 / 火箭弹 / 重型炮弹 / 炸弹)——仅一次,按类别缓存。
  2. 沿其弹道栅格化一片区块走廊(DDA,宽度可配置),并带有自适应前瞻(速度 × 间隔 × 倍率),确保弹射物永远不会飞出已加载的路径。
  3. 通过原版区域票证(region tickets)在正确的等级(min(3, simulation-distance))上保持这些区块的实体 tick,使弹射物能真正穿过它们。
  4. 自动释放一切:带引用计数的共享票证(同一区块中的 100 颗子弹 = 1 张票证)、TTL 过期(最后一次刷新后约 5 秒)、智能更新(仅在航向/速度实际改变时重新计算走廊)。

特性

  • 即插即用:将 jar 放入服务器的 mods/ 文件夹即可。无需集成,无需配置。
  • 覆盖所有继承基础类的实体:SBW 弹射物 + FCP、VVP 和 DragonRise 载具、pointblank ProjectileLike 实体、uncomplicated-fpv FPV/Mavic 无人机——未来的附加组件会自动覆盖,无需新增 mixin。
  • 公开 API(ProjectileTracker.register(entity[, profile])):任何模组都可以注册自己的弹射物,无需 mixin。
  • 开销极低:时间轮(timing wheel)每 tick 处理一个桶——无需每 tick 扫描所有弹射物;当没有变化时跳过走廊重新计算。
  • 默认安全:
    • 仅在区块确实未进行实体 tick 时放置票证(smartChunkLoading),
    • 世界边界保护(不会在边界外生成区块),
    • 所有硬性限制均可通过 <world>/serverconfig/sbwchunkload-server.toml 配置:最大追踪弹射物数量(300)、最大活动票证数(512)、最大追踪距离(2000 格)、最大追踪寿命(1200 tick)、静止物移除(落地的手雷/卡住的火箭弹会释放其票证),
    • 无人机仅在空时被追踪。
  • 调试命令:/sbwchunkload status(权限 2)显示追踪数量和移除原因;/sbwchunkload config 打印当前生效的设置。

为 PWP 打造

此模组专为 PWP 打造——一个战术小队射击 Minecraft 服务器:类似 Squad 的玩法,包含票数、占领点、小队、前哨基地、补给后勤、全套载具和无人机作战。当火炮、载具机炮和 FPV 无人机成为游戏核心时,弹射物在区块边界冻结并非边缘情况——而是整场比赛的关键。PWP 由 Superb Warfare、PointBlank、uncomplicated-fpv 和其他战斗模组驱动,而这个附加组件正是让远程战斗在那里真正可行的关键。

加入 PWP 社区 Discord:https://discord.gg/4SMwkQMEAP

需求

  • Minecraft Forge 1.20.1
  • Superb Warfare 0.8.9+(必需)
  • PointBlank 1.11+(必需)
  • 无人机支持:uncomplicated-fpv(自带 GeckoLib 依赖)

安装

将 jar 放入服务器的 mods/ 文件夹即可。客户端不需要此模组(仅限服务器端;在客户端安装无害但无意义)。

配置

所有内容均可通过 <world>/serverconfig/sbwchunkload-server.toml 配置(首次启动服务器时创建):

  • enabled、trackSbwProjectiles、trackPointblankProjectiles、trackDrones
  • smartChunkLoading、adaptiveLookahead、predictionMultiplier、corridorWidth、ticketIntervalTicks、ticketTTLTicks
  • 各配置文件间隔和前瞻:bullet.*、rocket.*、heavy.*、ballistic.*、drone.*
  • 硬性限制:maxTrackedProjectiles、maxActiveTickets、maxTrackDistanceBlocks、maxTrackAgeTicks、stationaryThresholdUpdates
  • debug(周期性统计日志)

大多数值可由 Forge(serverconfig 重新加载)热更新——无需重启。

常见问题

我的炮弹仍然冻结。 检查服务器的 simulation-distance(server.properties)。票证放置在 min(3, simulationDistance) 级别——实体只在 distance <= simulationDistance 的区块中 tick,因此 simulation-distance 为 2 的服务器上,效果会在距离任何玩家 32 格之外失效。将其提高到 4 以上可实现有效的远程射击。

对 TPS 的影响? 极小:每 tick 一桶工作量,仅在航向/速度变化时重新计算走廊,每个区块共享票证,所有内容在弹射物消失后约 5 秒释放。

无人机仍然失去连接? 该模组在无人机飞行时保持其区块 tick;降落的无人机会按设计释放其票证(地面无人机不能作为区块加载器)。

在单人游戏中有效吗? 有效——内置服务器也是服务器。

许可证

保留所有权利。非开源。