水族馆

水族馆

水、冰和雪,色彩缤纷。

hydrarium

有颜色的水,依然是水。

GitHub release Loaders Minecraft versions License

加载器: Fabric  •  Minecraft: 26.2  •  侧: 客户端与服务端


About

流体很昂贵。颜色是免费的。

一个流体是一个注册表条目、一个方块、一个桶、一个标签成员关系,以及与游戏中每个生物、船、海绵、钓鱼竿和含水楼梯的兼容面。而一个颜色只是三个整数,渲染器会把它们乘到它本来就要绘制的四边形上。

所以 hydrarium 注册零个流体、零个方块。 染色的水就是 minecraft:water; 染色的冰是 minecraft:ice;染色的雪是 minecraft:snow。同样的标签、同样的桶、同样的游泳、同样的海绵、同样的含水楼梯。颜色是渲染器读取的一条旁路通道,游戏中其他任何东西都不需要知道它。

它自带 十九种水:十六种染料颜色,加上 ash_slurry、irradiated 和 lumewater,它们不仅携带颜色,还携带行为。消费者模组只需提供一个 JSON 文件就能添加自己的水——无需 Java。


Features

  • 它们彻头彻尾就是水 —— 染色的水就是 minecraft:water。它会流动,会淹死你,海绵会吸干它,船会浮在它上面,楼梯会在它里面含水,钓鱼竿能在它里面钓鱼——因为那些没有一样是这个模组写的代码。

  • 它们会流动,并在途中混合 —— 红色倒入蓝色会变成紫色,由原版自己的染料配方决定。没有配方的两种水会混浊成灰色,而不是去猜一个。

  • 它们会冻结也会融化 —— 冰、浮冰、蓝冰、雪、雪层和细雪都会保留它们来源水的颜色,融化时会还回来。不用精准采集打破冰,它会变回它原本的水。

  • 它们能装进东西里 —— 桶、瓶子、炼药锅和细雪桶都携带颜色,桶的工具提示会显示它是什么水。把染料丢进炼药锅会给它上色;那个炼药锅随后可以灌满有颜色的瓶子和桶。

  • 未染色的世界不存储任何字节 —— 颜色存放在一个按位置稀疏的字段中,持久化在区块里,只同步给正在观察它的人。整个由同一种水构成的生物群系只花费一行目录,每个位置的花费为零。

  • 什么都不需要知道 —— 一个用消费者模组的水保存、但在没有那个模组的情况下加载的世界,会在那些位置显示普通的水——当模组回归时会重新取回颜色。


Commands

所有 /water 子命令都需要权限等级 2。

/water give <targets> <water> [<count>] 桶,已标记某种水
/water fill <from> <to> <water> 给已经存在的水重新上色;它不放置任何东西。包括冰和雪——这是给从未被染色的水冻结成的湖泊上色的唯一方法
/water clear <from> <to> 再次去掉油漆
/water at <pos> 这里是什么水、是哪一层说的,以及它在哪个方块里

给源头刷漆,而不是水流。 源方块持有你给它的颜色;一个流动格会从供给它的东西推导颜色,并在下次刻更新时重新推导。


Adding your own waters

消费者模组不写任何 Java。在你自己的 jar 里提供一个文件:

assets/<your mod id>/hydrarium/catalogue.json

路径以你的模组 id 为键,这正是把你的水 id 放进你的命名空间的方式。 hydrarium 自己的十九种也是通过这同一个扫描器、从 hydrarium 自己 jar 里的这同一个路径读取的——内置的没有私有路径。

{
  "waters": [
    { "id": "lumewater", "tint": 4251856, "effect": "glow", "biome_strength": 0.1 },
    { "id": "brine",     "tint": 7385292, "dye": "light_blue" }
  ],
  "biomes": [
    { "biome": "yourmod:glow_sea", "water": "yourmod:lumewater" }
  ]
}

waters 声明颜色:

字段
id 必需 仅路径;命名空间是你的模组 id
tint 必需 一个普通的 0xRRGGBB,以十进制整数书写
effect 可选 none、glow、ash、decay 之一。未知名称会让该水失去其行为,保留其颜色,并记录日志——它绝不会使目录加载失败
biome_strength 可选,默认 0.25 生物群系自身水色渗入的程度。0 表示各处都精确为这个颜色;1 是原版的直接相乘
dye 可选 这种水就是这种染料。命名十六种之一会把这种水加入染料混合,而不必以染料命名。没有 dye 的水与除自身以外的任何东西混合都会变混浊成灰色

biomes 说明哪个生物群系由哪种水构成,并且不存储任何东西——整个星球的绿色海洋在这里只是一行,在任何区块中都不占一个字节。一个生物群系行可以命名其他模组目录声明的某种水;整个扫描在任何东西被连接之前就已解析完毕。

效果在 Java 中是刻意封闭的集合。 一个颜色是一个数字,所以一种新颜色就是一行; 一个效果是代码。目录可以从集合中选择并参数化它,这正是让“消费者不写任何 Java”成为事实而非几乎成为事实的原因。

解析顺序

一个位置的颜色由三层决定,/water at 会报告是哪一层给出的答案:

  1. 字段 —— 一个按位置的条目,稀疏,持久化在区块中并同步给正在观察它的人。这是唯一花费字节的层。
  2. 生物群系 —— 一行目录。每个位置花费为零。
  3. 原版 —— 普通的水,以普通的方式。

Gallery

The nineteen built-in waters. Every one of them is `minecraft:water`.
<sub>十九种内置的水。它们每一个都是 `minecraft:water`。</sub>

A red stream and a blue stream meet, and everything downstream runs purple.
<sub>一条红色的溪流和一条蓝色的溪流相遇,下游的一切都变成紫色。</sub>

Ice, packed ice, blue ice, snow, snow layers and powder snow, each keeping the colour of the water it froze from.
<sub>冰、浮冰、蓝冰、雪、雪层和细雪,每一个都保留它冻结自的水的颜色。</sub>

A cauldron holds a colour, and fills bottles and buckets with it.
<sub>一个炼药锅持有一种颜色,并用它灌满瓶子和桶。</sub>

Under the surface the fog goes with it — a purple pool does not look blue from inside.
<sub>在水面之下雾也会随之改变——一个紫色的水池从内部看并不显蓝。</sub>

Buckets, bottles, ice, snow blocks and snowballs all carry their water's colour.
<sub>桶、瓶子、冰、雪块和雪球都携带它们水的颜色。</sub>


Dependencies

必需

模组 版本 备注
Fabric Loader >=0.19.3
Fabric API — 数据附件、流体渲染、方块颜色、区块生命周期
Java 25

Incompatibilities

模组 冲突 解决方法
重新贴图水桶的资源包 hydrarium 覆盖了 assets/minecraft/items/ 下的八个文件——桶和冰冻物品——以给它们的颜色一个落脚点。这是这个模组唯一在它自己命名空间之外写入的地方。
将 hydrarium 加载在资源包之上,或去掉资源包的桶物品模型。
替换水的流体模型的模组 颜色通过 FluidRenderingRegistry 到达。一个在 hydrarium 之后为 minecraft:water 注册自己模型的模组会胜出,染色的水会绘制成普通的样子。
目前没有。报告它,就可以查看。

Installation

  1. 在 Java 25 上安装 Fabric Loader 0.19.3 或更新版本。
  2. 将 hydrarium.jar 和 Fabric API 放入 mods/。
  3. 启动。没有任何需要配置的东西。

对于服务器,请在两侧都安装它:字段在服务端存储和混合,在客户端绘制,没有它的客户端只会看到普通的水。


Building

export JAVA_HOME=".../jdk-25"

./gradlew build # jar,在 build/libs/ 中 ./gradlew test # 40 项断言,无游戏引导 ./gradlew runClient # 游玩测试 ./gradlew runServer -Psmoke # 29 项世界内检查,然后它会停止

Minecraft、加载器和 Fabric API 的版本来自 com.mattmc.mcmod 约定插件, 而不是来自本仓库。CLAUDE.md 有构建面的其余内容,以及什么会静默失败。


FAQ

这会添加新的流体吗?

不会——而这正是整个设计。添加一个流体意味着添加一个方块、一个桶、标签成员关系,以及与游戏中每个生物、船和海绵的兼容面。染色的水是 minecraft:water 披上一种颜色,所以所有这些都免费继续工作。

我的水颜色不对。为什么?

运行 /water at <pos>。它会说出是哪一层给出的答案——按位置的字段、生物群系行,还是原版——以及它在哪个方块里,这很重要,因为从上方看红冰和红水几乎一样。

我给一条溪流刷了漆,它却恢复了正常。

给源头刷漆,而不是水流。源方块持有颜色;流动格从供给它的东西推导颜色,并在下次刻更新时重新推导。给源头刷漆,让波浪携带它。

如果我移除这个模组,世界会怎样?

什么都不会坏。那些位置就是普通的水、冰和雪,它们渲染为普通的水、冰和雪。把模组放回来,颜色仍然在那里。

两个红色和两个蓝色雪球做出了一个灰色雪块。是 bug 吗?

是一个决定,而且是一个被钉住的决定。合成网格没有等级,因此没有配方书可以询问染料混合,所以在网格中两个红色和两个蓝色会混浊成灰色,而在两个红色和两个蓝色源会变成紫色。


Credits

构建于 Fabric 和 Fabric API 之上。 十六种染料颜色是原版自己的 DyeColor 值,混合表是原版自己的染料配方——所以红色的水和红色的床是同一种红。


License

源码开放,不可再分发。 可以游玩、为自己使用而修改、发送补丁。重新上传它或将其捆绑进整合包需要书面许可。确切条款见 LICENSE。


欢迎提交问题和补丁。