季节缓存

季节缓存

使雪和冰块与Serene Seasons保持同步。同时构建服务器端覆盖地图,与Nova Reimagined Snow配合,通过Nova Reimagined shaderpack在Distant Horizons中驱动精确的着色器雪效果。

工具

Season Cache

Minecraft 1.21 - 1.21.?(1.21.1 之后版本未经测试) | Fabric | 需要 Serene Seasons

Season Cache 让雪和冰方块与你的 Serene Seasons 配置保持同步。冬季到来时,地形上会出现雪和冰;春季来临时,它们会消失。它还构建并维护一个服务器权威的逐区块积雪覆盖图,供 Nova Reimagined Snow 等配套模组使用,以在 Distant Horizons LOD 地形中驱动精确的着色器积雪效果。


功能说明

如果没有这个模组,Serene Seasons 只会改变季节,而世界只能通过 Minecraft 缓慢的随机刻系统来增加或减少积雪。这个过程需要数游戏日才能让大片区域发生可见变化。Season Cache 会在季节转换发生时立即协调整个已加载的世界。

它还解决了 LOD 积雪问题。Distant Horizons 使用自己的几何体渲染远超原版渲染距离的地形。如果没有精确的逐区块积雪数据,着色器就无法知道哪些远处的区块应该显示积雪。Season Cache 会为整个已探索的世界构建完整的覆盖图,并将其流式传输给连接的客户端,以便着色器包使用。


前置要求

  • Minecraft 1.21 - 1.21.?(1.21.1 之后版本未经测试)(Java 版)
  • Fabric Loader 0.16.0 或更高版本
  • Fabric API
  • Serene Seasons 10.x for 1.21.x

可选但推荐:

  • Serene Seasons X Distant Horizons,用于完整的季节性 LOD 覆盖
  • Nova Reimagined Shader Pack
  • Nova Reimagined Snow(用于着色器积雪覆盖的配套模组)
  • Distant Horizons(LOD 渲染)

安装

  1. 安装 Fabric Loader 和 Fabric API
  2. 安装 Serene Seasons
  3. 将 seasoncache-<version>.jar 放入你的 mods 文件夹
  4. 启动服务器或单人世界

Season Cache 可在专用服务器和单人游戏中运行。在专用服务器上,只需在服务端安装。当客户端也安装了 Nova Reimagined Snow 时,客户端组件会处理着色器集成。


配置

首次启动时会创建配置文件 config/seasoncache.json。

Cleanup mode(清理模式)

控制协调器是只移除雪和冰,还是也放置它们。

  • AGGRESSIVE(默认):在温暖季节移除积雪,在冬季放置积雪。世界在两个方向上都会与季节匹配。
  • CONSERVATIVE:当季节不再支持雪和冰时将其移除,但从不放置新的积雪。如果你只想要单向清理,请使用此模式。

Budget(预算)

控制每个服务器刻协调多少区块。更高的值能更快地清理地形,但会消耗更多的刻时间。

  • HIGH(默认):每刻 8 个区块,每刻最多 10 毫秒
  • MEDIUM:每刻 3 个区块,每刻最多 3 毫秒
  • LOW:每刻 1 个区块,每刻最多 1 毫秒

其他设置

  • trackSnow:启用或禁用雪方块协调(默认:true)
  • trackIce:启用或禁用冰方块协调(默认:true)
  • neverTouchPerennialColumns:跳过永久寒冷生物群系,如冰封山峰和冰刺之地(默认:true)
  • hysteresisBandWidth:软化生物群系边界处的温度阈值,以避免出现锐利的积雪线(默认:0.06)
  • proximityGateChunks:协调优先处理玩家附近的区块(默认:8)
  • maxChunkDeferMs:一个区块在被邻近门控延迟后,最多可被延迟多久才无条件处理,从而防止没有附近玩家的区域出现饥饿(默认:30000 毫秒)

命令

所有命令都需要管理员权限等级 2。

/seasoncache status - 显示当前季节、清理模式、待处理推导、覆盖构建进度、缓存统计信息,以及相关时的失效进度。

/seasoncache mode aggressive - 在运行时切换到激进模式。

/seasoncache mode conservative -” 在运行时切换到保守模式。

/seasoncache build low|high - 以指定预算启动覆盖构建,而不清除现有数据。当构建器提前停止或探索了新区域时使用。

/seasoncache rebuild low|high - 清除所有存储数据,然后以指定预算启动全新构建。在地形发生重大变化后,或覆盖数据看起来不正确时使用。

/seasoncache invalidate all - 立即清除所有内存状态。磁盘上的纪元清零会在后台以低优先级运行。使用 /seasoncache status 监控进度。如果需要完全一致性,请在重启服务器前等待 invalidation=complete。

/seasoncache debug - 显示以你所在位置为中心的 3×3 区块网格的温度数据。对每个区块报告最小/最大/平均 SS 调整后温度,以及寒冷区、滞回带和温暖区中的柱状数量。用于诊断意外的积雪或裸露斑块。

/seasoncache debugstate - 显示以你所在位置为中心的 3×3 区块网格的缓存存储状态。对每个区块显示静态气候样本(生物群系 ID + 地表 Y)、12 位季节规则掩码、多年生标志、该区块是否对当前纪元标记为干净,以及权威积雪状态。

/seasoncache sweep - 强制重新协调所有当前已加载的区块,无论其干净/已清扫状态如何。在修复了可能导致错误协调结果的错误后使用。


覆盖图如何工作

服务器启动时,Season Cache 会从 Anvil 区域文件中读取整个已探索世界的高度图数据,而不会调用区块生成器。它会在每个区块的地表采样生物群系和 Serene Seasons 温度,并将其分类为当前季节是否有积雪。这会生成一个完整的逐区块覆盖图,存储在与你世界数据并排的附属文件中。

当玩家连接时,服务器会发送完整覆盖图快照,按与玩家的距离排序。随着世界变化(季节转换、区块加载),增量更新会流式传输到客户端。Nova Reimagined Snow 接收这些更新,并将其写入 GPU 纹理,着色器在渲染原版和 LOD 地形时都会采样该纹理。

附属文件意味着后续服务器启动会很快。Season Cache 不会从头重新推导覆盖,而是会在几秒内从现有文件预热,并且只重新推导季节已发生变化的区块。


方块标签:snow_placement_blacklist

在激进模式下,雪会放置在天空可见且生物群系足够寒冷的任何完整立方体方块上。seasoncache:snow_placement_blacklist 标签排除了那些是完整立方体但不应积累季节性积雪的方块——工作站、存储以及类似的玩家制作物品。

默认条目包括:潜影盒、工作台、箱子变体、熔炉变体、附魔台、铁砧变体、书架变体、制图/制箭/锻造台、织布机、砂轮、唱片机、音符盒、发射器、投掷器、侦测器、信标和命令方块。

若要通过数据包添加条目,请创建 data/seasoncache/tags/blocks/snow_placement_blacklist.json:

{ "replace": false, "values": ["yourmod:your_block"] }

性能说明

全新安装或清除缓存后的初始覆盖构建会从磁盘读取区域文件,而不是运行世界生成器,因此对于完全探索过的世界,通常会在两分钟内完成。在此过程中,服务器刻线程不会被阻塞。

季节转换期间的雪和冰协调使用缓存的逐区块季节规则(每个冷缓存区块仅推导一次),因此正常游戏过程中不会触发逐柱 SS 温度查询。移除仅作用于地表,并会跳过不包含雪或冰方块的区块区段。


当前限制

在玩家原版渲染距离之外批量添加和移除雪层……很棘手。棘手的意思是,竞态条件很容易在区块实际被清理或积雪覆盖之前就将其标记为已完成,从而使它们处于不正确状态。我花了很多时间才让它达到目前的命中率,我对它足够满意,因此发布了这个模组。话虽如此,如果我最终找到进一步改进它的方法,我会的!


兼容性

环境 状态
单人游戏 是
专用服务器 是
Distant Horizons 是,通过 Nova Reimagined Snow
Nova Reimagined 着色器 是,通过 Nova Reimagined Snow
其他 Fabric 模组 通常是
Forge / NeoForge 否

许可证

MIT。完整条款见 LICENSE。


鸣谢

ItsThatNova - 模组作者
GitHub: https://github.com/ItsThatNova