创造航空学:冰冻法杖

创造航空学:冰冻法杖

创建航空冻结权杖,为取出模拟装置逻辑添加单一工具——在拥有大量装置的世界中恢复TPS。

创建

问题

每一个已加载的模拟装置,无论是否在运行,都会消耗服务器的 tick 时间。

一个子关卡在每一个游戏 tick 中会被物理管线多次驱动,其 actor 会在每个子步骤中被推进,其中的每一个方块实体都会像真实世界的一部分一样被服务器每个 tick 调用——因为它就是。一艘停泊的飞艇、一艘靠岸的驳船、一堆货箱、基地角落里一个建到一半的建筑,都会永远以全速持续支付这笔开销。

这个开销是线性增长的。十个装置的开销是单个装置的十倍。在一个围绕机械动力:航空学建造的世界中,实际在使用的装置通常只占已存在装置的一小部分,其余的则在默默地消耗 tick 预算,直到 TPS 开始下降。

本模组的功能

机械动力:航空学冻结杖(Create Aeronautics Freeze Staff)添加了一种工具,可以将装置完全从模拟中移除,同时使其原地保持不变。

被冻结的装置会保留其方块、位置和外观。它失去的只是每个 tick 的开销。

冻结移除了什么

对于被冻结的装置,以下工作会在其源头被抑制:

被移除的工作 速率,每个装置
物理施力——马达、螺旋桨、推进器 80 / 秒
每个子步骤的 actor 逻辑——螺旋桨、反作用轮、提供 RPM 的机械动力马达 80 / 秒
子关卡 actor tick 20 / 秒
结构拆分泛洪填充 20 / 秒
原版方块实体 tick 20 / 秒,每个方块实体
机械动力SmartBlockEntity tick 20 / 秒,每个方块实体
随机区块 tick——生长、蔓延、衰变 每个区块
计划刻方块与流体 tick——中继器、比较器、观察者 按计划执行

速率基于每个游戏 tick 默认的四次物理子步骤。

刚体本身通过固定约束被钉住并允许休眠,因此它不再参与解算或移动。其网络位置保持完整,客户端仍能正确显示它。

方块实体的 tick 在三条独立的路径上被拦截,因为 Sable 子关卡区块存在于父世界中,既会被原版区块迭代访问,也会被子关卡管线访问。如果只抑制物理阶段,大部分开销仍然会存在。

冻结不会造成破坏

被冻结的装置是暂停,而不是被拆解或卸载。

在冻结期间被抑制的计划刻方块与流体 tick 会在释放时被记录并重放:受影响的方块会被重新安排计划,其邻居会被强制重新评估,这样红石信号强度和流体流动就能保持一致地恢复,而不是锁定在过时状态。

冻结状态记录在装置自身的身份上,而非其位置上,因此它能在区块卸载、世界重载和服务器重启后保留。重载后,被冻结的装置会恢复到完全冻结时的姿态——不会在无人关注时漂移、沉降或错位。

在冻结状态下,其方块无法被破坏、放置或互动。被阻止的操作会在操作栏显示原因,而不是默默失败。

使用方法

输入 结果
右键点击一个装置 冻结它及其所有连接的部分
右键点击一个已冻结的装置 释放它及其冻结组中的其余部分
潜行 + 右键点击一个装置 仅影响目标装置
潜行 + 右键点击其他任何东西 在 3 秒内显示透过地形的已冻结装置

关联冻结

冻结会沿两条相互独立的关系传播,两者默认启用且均可配置:

  • 接触——边界与已冻结装置接触的装置,在可配置的容差范围内。
  • 绳索——连接到同一条绳索上的装置。

传播是传递性的。冻结一堆货箱中最底部的箱子会冻结整堆;冻结一条绳索链的一端会冻结整条链。这对性能和物理同样重要:一个停靠的组件通常是你想要停放的单元,如果一次只冻结一部分,大部分开销仍然会保留。

释放的工作方式相同,且仅限于实际已冻结的装置,因此它无法越过组去影响无关的结构。潜行可以抑制单次交互的双向传播。

配置

config/freeze_staff-common.toml

选项 类型 默认值 描述
freezeNearbySubmodules 布尔值 true 将冻结传播到与目标接触的装置
nearbyFreezeMargin 双精度浮点数 0.05 超出装置自身边界的接触容差(以方块为单位)
freezeRopeConnectedSubmodules 布尔值 true 沿绳索连接传播冻结

命令

两者都需要权限级别 2。

命令 描述
/freezestaff status 总数:已冻结、当前已加载、当前已钉住
/freezestaff list 每个已冻结装置一行,包含维度和姿态