跳到正文

Realistic Smoke

作者:Dizabanik

受《Valheim》启发的服务端烟雾与通风机制。熔炉和营火会让封闭空间充满危险烟雾,因此烟囱、敞开的屋顶、门和良好的通风设施都是安全建造与生存的关键。

收藏

介绍

介绍由机器翻译自 Modrinth 原页面,仅供参考。

Realistic Smoke

一款受《Valheim》建造限制启发的服务端烟雾与通风模组。模组完全在服务端运行,玩家无需在客户端安装模组。

玩法

  • 点燃的熔炉、烟熏炉、高炉、营火和灵魂营火会产生烟雾。
  • 烟雾会向上飘,在天花板下聚集,并充满通风不良的房间。
  • 烟囱和敞开的屋顶可以将烟雾排到室外。玻璃屋顶虽然能透过天光,但仍会封住烟雾。
  • 打开的门、活板门和栅栏门都能通风。不过,液体会阻挡烟雾。
  • 吸入浓烟会根据玩家眼部高度的烟雾浓度累积暴露值。暴露值过高会导致反胃、失明,甚至受到致命伤害。
  • 创造模式、旁观者模式和已死亡的玩家不会累积暴露值。
  • 暴露值会跨维度记录,并在洁净空气中逐渐消散。重生、死亡、断开连接或关闭服务器都会重置已记录的暴露值。
  • 可选的原版粒子效果可以显示烟柱、排烟和天花板下的烟雾。无论是否启用粒子效果,底层的物理模拟和暴露值检测都会照常运行。

模拟限制

本模拟着重呈现生存建造机制,并采用离散近似:

  • 同一两格单元内相连空间中的空气会立即混合。浮力和单元间扩散则按离散的刻间隔更新。
  • 方块是否可通行取决于其碰撞箱状态。非空形状会阻挡烟雾,除非方块公开了有效的 OPEN 属性(例如已打开的门或活板门)。楼梯、台阶、栅栏空隙和打开的门扇等部分形状会按整个方块的粒度进行判断。
  • 模拟不包含环境风向量、动态温度分层、氧气消耗和火焰窒息效果。
  • 自然消散、向室外排气、密度上限、空间清理和区块卸载都会有意丢弃烟雾。单元间传输遵循质量守恒,而排气和自然消散等汇则会有意丢弃烟雾。
  • 区块卸载或服务器重启后,活跃烟雾场不会保留。

性能与安全

烟雾在数值网格中模拟,不会生成实体或自定义方块。模拟默认每10刻运行一次(标准20 TPS下每秒两次)。

  • 烟雾源通过 Fabric 方块实体生命周期回调进行注册。区块加载时,备用扫描会检查已存储的方块实体坐标,而不是扫描整个区块体积。
  • 区块到烟雾源的索引可避免区块卸载时遍历整个维度注册表。
  • 区块卸载和缓存清理会在每个世界刻中批量处理。每次模拟步骤结束后都会清空中间计算缓冲区。
  • 模拟例程、暴露值查询、屋顶检测和粒子派发均使用不会加载区块的查询方式,以避免触发不必要的区块加载。
  • 方块几何信息缓存在有容量上限的原始类型 LRU 表中(默认每个维度最多缓存24,000个单元)。排烟列结果使用独立缓存,容量为该上限的四倍。
  • 服务端 WorldChunk mixin 会在方块变化时使缓存的几何信息和屋顶轮廓失效。基于时间的过期机制和定期清理会移除残留缓存条目。
  • 高频循环使用 fastutil 原始类型迭代器,避免为每个条目分配堆内存。
  • 每个维度的活跃烟雾场默认最多可容纳12,000个空间(通过 maxActiveCellsPerWorld 配置)。
  • 单次模拟步骤中,临时工作缓冲区最多容纳活跃上限5倍的临时空间,以及活跃上限25倍的候选传输量。
  • 暴露值每秒检测一次眼部高度的烟雾浓度(每20刻一次)。烟雾伤害独立累积,且最多每20刻结算一次,以匹配原版伤害免疫冷却时间。

粒子效果

粒子引擎会读取模拟步骤中预先计算的天花板和排烟轮廓,并在生成粒子前检查区块状态与方块是否可通行。它还会验证方块类型和燃烧状态,因此火源熄灭或被破坏后会立即停止产生烟雾效果。

  • 默认预算为每次视觉更新最多64次生成事件,每10刻运行一次(标准20 TPS下每秒最多128次)。
  • 每次更新最多预留16个事件给烟雾源、最多预留12个给排气口,其余名额分配给天花板下的烟雾。
  • 烟柱和排气口的选择会根据轮次计数器轮换,避免偏向特定的哈希表条目。当烟雾源或排气口的配额用满时,各类别的优先级会调整。
  • 天花板烟雾优先选择靠近玩家的高密度空间,并加入轻微的时间抖动以避免粒子效果过于重复。玩家空间索引可避免逐一计算每个候选位置与所有在线玩家的距离。
  • 粒子上限针对服务端的生成事件,而非单个网络数据包;一个事件会发送给范围内所有符合条件的玩家。针对单个玩家的检测同时遵循已配置的视距和原版客户端32格的粒子显示距离。
  • 排烟计算在 Y 坐标为负的高度也能正常运行。

天花板效果会在阻挡烟雾的屋顶方块下方生成原版 LARGE_SMOKE 粒子,并使用较宽的水平扩散范围和较紧的垂直漂移,让未安装模组的客户端也能看到烟雾被困在屋顶下的效果。

配置

首次运行时会在 config/realistic-smoke.json 创建配置文件。缺失的配置项会自动填入默认值。

| 字段 | 默认值 | 说明 |

| ——————————- | ——: | —————————————————————————————————————————— |

| simulationIntervalTicks | 10 | 烟雾场更新间隔。数值越高,计算开销越低,但烟雾移动速度以及每秒的排放与消散量也会降低。 |

| exposureIntervalTicks | 20 | 眼部烟雾浓度采样间隔;暴露值会根据经过的服务器刻数累积。 |

| maxActiveCellsPerWorld | 12000 | 每个维度中已完成烟雾场的最大空间数。 |

| maxGeometryCacheCellsPerWorld | 24000 | 独立的几何缓存容量上限;列缓存容量上限为其4倍。 |

| minDensity | 0.035 | 累积后,清理浓度低于此值的空间。 |

| maxDensity | 12.0 | 已完成烟雾场的最大浓度。 |

| furnaceEmission | 0.55 | 熔炉和高炉每次更新排放的烟雾量。 |

| smokerEmission | 0.85 | 烟熏炉每次更新排放的烟雾量。 |

| campfireEmission | 1.0 | 任一种营火每次更新排放的烟雾量。 |

| baseDissipation | 0.018 | 每次更新时自然消散的烟雾质量占比。 |
| outdoorRetention | 0.10 | 四列空间完全暴露时的保留比例;部分暴露时,损失会按比例缩放。 |

| risingFraction | 0.56 | 请求的向上流动比例,并根据开口面积缩放。 |

| lateralFractionWhileRising | 0.10 | 存在向上开口时的横向总系数。 |

| lateralFractionWhenBlocked | 0.48 | 向上流动受阻时的横向总系数。 |

| pressureDownFraction | 0.04 | 超过压力阈值后的向下梯度系数。 |

| pressureDownThreshold | 4.0 | 开始向下输送的浓度阈值。 |

| passabilityCacheSteps | 4 | 几何信息的备用缓存时长,单位为模拟步;方块变化会立即使缓存失效。设为 0 时,同一步内仍可复用缓存。 |

| passabilityCacheClearSteps | 128 | 定期清理/修剪缓存的间隔。 |

| particles | true | 启用装饰性粒子效果。 |

| particleIntervalTicks | 10 | 视觉效果更新间隔。 |

| particleBudgetPerWorld | 64 | 每次视觉效果更新期间、每个维度共用的生成事件上限。 |

| sourceParticleBudget | 16 | 共用预算内的最大源头事件数。 |

| ventParticleBudget | 12 | 共用预算内的最大排气事件数。 |

| particleMinDensity | 0.20 | 天花板/排气候选点的最低浓度。 |

| particleViewDistance | 48.0 | 配置的距离筛选范围,同时也受原版常规传递距离限制。 |

| safeDensity | 0.75 | 浓度低于或等于此值时,眼部暴露度会恢复。 |

| exposureGainPerSecond | 0.48 | 浓度高于 safeDensity 时,每浓度单位每秒增加的暴露度。 |

| exposureRecoveryPerSecond | 0.90 | 安全空气中的每秒恢复量。 |

| nauseaExposure | 4.0 | 恶心阈值。 |

| severeExposure | 8.0 | 失明阈值。 |

| lethalExposure | 14.0 | 伤害阈值。 |
| baseDamagePerSecond | 1.0 | 达到致命阈值时的伤害速率,单位为每秒生命值。 |

| maxDamagePerSecond | 4.0 | 持续烟雾伤害速率上限。 |

模组会在启动时验证数值输入,并将非有限值替换为默认值。如果配置文件无法读取或格式错误,游戏会记录警告,并在内存中使用默认值,而不会覆盖磁盘上的损坏文件。写入配置时,会先序列化到临时文件,再通过文件系统原子移动替换目标文件。

状态效果持续时间会覆盖采样周期,并额外增加缓冲时间,以防在游戏刻之间出现视觉闪烁。未能应用的伤害会在短暂宽限期内重试;如果暴露度降至致命阈值以下,则重置重试。烟雾伤害使用原版魔法伤害机制,并遵循标准药水效果和保护附魔的规则。

常见问题

Realistic Smoke 支持哪些 Minecraft 版本?

Realistic Smoke 支持 Minecraft Java 版 1.21.11,可用的加载器:Fabric。下载时注意选择和你游戏版本一致的文件。

Realistic Smoke 怎么安装?

先用 PCL2 或 HMCL 启动器安装对应版本的 Fabric,再把下载的 .jar 文件放进游戏目录的 mods 文件夹,重新启动游戏即可。开启了版本隔离的,mods 文件夹在 versions/版本名 下面。运行环境:仅服务端。

评论

登录后评论和评分