本地化天气

本地化天气

一个Fabric模组,用局部天气区域取代Minecraft的全球天气。每个256×256方块区域拥有自己的天气,降雨、降雪和雷暴在世界各地独立发生,并具有生物群系感知规则、平滑过渡以及块状

管理

Localized Weather

Localized Weather

天气不再是一个开关,而是真实存在于某处。

雨、雪、冰雹和雷暴独立地发生在世界各地——你可以站在阳光下,看着一场风暴越过山丘袭来。

Build Minecraft Loader Java License


功能简介

原版 Minecraft 整个世界只有一种天气状态。Localized Weather 将其替换为 256×256 方块区域的网格,每个区域按照各自的节奏独立演化天气——然后对交界处进行混合,让你永远看不到生硬的边界。

其结果是带有地理特征的天气。风暴有它所在的位置、它来自的方向,以及它将要前往的方向。

特性

特性 你实际看到的效果
🗺️ 局部区域 每个 256×256 方块区域独立运行各自的天气
⛈️ 移动的雷暴单体 单体风暴随风漂移,逐渐增强,并在自己的生命周期结束时消散
🌧️ 雨墙与雨带 每个风暴核心下方垂挂着一道倾斜的雨幕,后方拖曳着弧形雨带——即使风暴远在天边,它依然会被绘制出来
🌾 生物群系感知规则 无降水的生物群系保持干燥,寒冷的生物群系将雨变为雪,每个区域根据 5×5 的地表采样决定,因此一小片沙漠不会让整个区域变干
🧊 冰雹风暴 偶发的冰冷狂风,带有自定义的下落冰雹粒子
🌬️ 风驱动的锋面 全局风向缓慢旋转;天气从上风向的邻近区域传播而来
🎚️ 无缝过渡 雨、雾和天空颜色在 20 秒内沿区域边界双线性混合
☁️ 风暴云 风暴区域上方有方块风格的 Minecraft 云层,远处也能看见
🌑 方向性变暗 天空、雾和云会朝逼近的风暴方向变暗,而非均匀变暗
🔊 方向性雷声 雷声从风暴的方位传来,音量根据距离变化
🧩 渲染器友好 驱动 Minecraft 自身的云渲染器而非替换它,因此 VulkanMod 等模组仍可正常工作

工作原理

天气自动发生。无需配置,也无需学习任何命令。

阶段 持续时间 备注
晴朗天空 10 分钟 – 2.5 小时 之后进行天气判定
雨 / 冰雹 / 风暴 10 – 20 分钟 之后区域再次放晴
区域过渡 20 秒 沿边界混合,绝不生硬切换
风向变化 每 2.5 – 10 分钟 缓慢旋转;锋面随之移动

一个转为雷暴的区域会生成一个 风暴单体——一个直径 70–130 方块的移动核心,存活 4–10 分钟,以约每秒 3–6 方块的速度移动,并携带其雨墙和雨带。当核心经过你上方时,雨随雨墙到来,并在核心经过后离去。

距离超过雾视界的风暴不会被剔除。它们的几何体被投影到视界上,外观尺寸保持不变,因此数个区域之外的雷暴仍然可以在天际线上看到为一道雨墙。

环境要求

  • Minecraft 1.21.9 – 1.21.11,或 26.1 – 26.2(参见下方版本表)
  • 在 1.21.x 上需要 Fabric Loader 0.19.2+,在 26.x 上需要 0.19.5+
  • Fabric API
  • 1.21.x 上使用 Java 21,26.x 上使用 Java 25

安装

  1. 安装 Fabric Loader 和 Fabric API——或使用 NeoForge,后者两者都不需要
  2. 将与你的 Minecraft 版本和加载器匹配的 jar 文件放入 mods 文件夹
  3. 启动游戏——天气会自行处理后续事宜

Jar 文件的命名格式为 localweather-<模组版本>+<Minecraft 版本>[-加载器].jar。 不带后缀的名称是 Fabric 构建;-quilt 和 -neoforge 是其他版本。 例如,在 Minecraft 26.1.2 上:Fabric 使用 localweather-1.4.0+26.1.2.jar, NeoForge 使用 localweather-1.4.0+26.1.2-neoforge.jar。

可选: Mod Menu,用于游戏内模组信息。

版本与加载器

Minecraft 构建目标 Fabric API Java
1.21.9 -Pmc=1.21.9 0.134.1+1.21.9 21
1.21.10 -Pmc=1.21.10 0.138.4+1.21.10 21
1.21.11 -Pmc=1.21.11 0.141.6+1.21.11 21
26.1, 26.1.1, 26.1.2 -Pmc=26.1.2(默认) 0.155.3+26.1.2 25
26.2 -Pmc=26.2 0.159.0+26.2 25

一个仓库构建所有目标;每个目标都是 versions/ 中的一个文件。 1.21.x 和 26.x 系列保持各自的源码目录,因为 Minecraft 在两者之间的命名方式不同——参见 docs/loader-support.md。

加载器 状态
Fabric ✅ 主要支持的加载器
Quilt ✅ 仅 1.21.x——Quilt 未发布 26.x 的中间命名空间,因此那里不构建 Quilt jar
NeoForge ✅ 26.1.x 上的 neoforge/——模拟、完整的客户端呈现和服务端 mixin,全部来自与 Fabric 相同的共享代码
Forge 🚧 26.1.x 上的 forge/,与 NeoForge 处于同一层级——来自相同共享代码的服务端模拟,无客户端同步,非发布产物

完整详情参见 docs/loader-support.md。

致模组开发者

LocalWeatherAPI 允许其他模组查询任意位置的局部天气。

import net.fentbusgaming.localweather.api.LocalWeatherAPI;

// 这里的天气是什么?
WeatherZone.WeatherType weather = LocalWeatherAPI.getWeatherAt(world, pos);

if (LocalWeatherAPI.isThunderingAt(world, pos)) {
    // 避雷针逻辑、生物生成、作物生长……
}

// 这个位置是否处于移动风暴核心之下?
if (LocalWeatherAPI.isInStormCell(world, pos)) {
    // 大雨、能见度降低……
}

// 天气从哪里来?
double windX = LocalWeatherAPI.getWindDirectionX();
double windZ = LocalWeatherAPI.getWindDirectionZ();

其他可用方法:getWeatherInZone、getTargetWeatherInZone、getTransitionProgress、isRainingAt、isHailingAt、getStormCells、getStormCellAt、toZoneCoords 和 getZoneSizeBlocks。

从源码构建

git clone https://github.com/rustybusgaming/LocalizedWeather.git
cd LocalizedWeather
./gradlew build            # 默认目标 (26.1.2)
./gradlew build -Pmc=26.2  # versions/ 中的任意目标
./gradlew printTarget      # 显示解析后的目标

1.21.x 目标需要 JDK 21,26.x 需要 JDK 25。你不必安装它们:如果你的机器上没有,Gradle 会在首次构建时获取匹配的 JDK。Jar 文件会以 localweather-<模组版本>+<minecraft 版本>.jar 的形式生成到 build/libs/ 中。

在 1.21.9 上,风暴云、冰雹粒子和雨墙不可用——该版本的 Fabric API 未暴露世界渲染钩子。其他一切功能均正常工作。

致谢

创意来自 Discord 上的 Mr. Random。

许可证

MIT