滋养

滋养

Nourished 是一款为 NeoForge 1.21.1 设计的营养模组,追踪六种食物类别,奖励多样化饮食,并应用平衡增益和忽视惩罚。包含屏幕 HUD、饮食界面以及适用于服务器和整合包的可配置模块。

食物

Banner

我厌倦了 Minecraft 的食物系统,因此制作了 Nourished,一个为 NeoForge 1.21.1 设计的营养模组。它追踪五大食物类别,奖励多样化的饮食,并在你忽视某些类别时施加减益效果。

保持均衡饮食,在 HUD 上观察你的营养条,打开饮食界面查看全貌,并为你的服务器或整合包调整每一个模块。

📦 本次版本新增:Nourished 现在需要 MariesLib,一个包含共享基础设施(扫描器、注册表、兼容框架、KubeJS 绑定)的伴生模组。这种拆分使得该基础设施可以在我的其他模组中重复使用,并让 Nourished 自身专注于营养玩法。请同时安装这两个模组,升级说明请参见更新日志。


❤️ 你的收益

当所有五大食物类别均高于 75% 时,你将获得:

  • 生命提升 I:在均衡状态下被动生效
  • 生命恢复 I:在均衡状态下被动生效

任何单个类别降至 25% 以下时,将触发一个减益效果:

类别 忽视惩罚
🌾 谷物 虚弱 I
🥦 蔬菜 缓慢 I
🥩 蛋白质 挖掘疲劳 I
🍎 水果 霉运 I
🥛 乳制品 —

乳制品默认没有惩罚效果——它被追踪并影响你的均衡分数,但不会在耗尽时施加减益效果。这是可配置的,并且计划在未来的更新中添加糖类类别。


🏆 里程碑与成就

持续饮食会随着时间的推移带来回报。Nourished 会追踪每个食物类别的累计摄入量,并随着你养成健康习惯而授予里程碑奖励。

里程碑树

每个食物类别都有自己的三级进程:新手、熟练者、大师,以及一个隐藏的“完美均衡”里程碑,用于同时维持所有五大类别。里程碑会授予一个临时增益效果,并在你的进度标签中解锁一个条目。

里程碑目标、奖励效果和持续时间完全可配置,整合包作者可以通过数据包注册完全自定义的里程碑。


🍽️ 在饱腹时进食

原版饥饿机制阻止你在饱腹时进食。Nourished 允许你在饥饿值满时仍可进食并获得营养。浆果和零食等轻量食物可以只获取营养而不恢复饥饿值,而正餐则默认遵循原版规则。

两种行为均可配置:enableBlockHeavySources 和 enableBlockLightSource 为服务器管理员提供了完全控制权。


🥩 生食与肠道健康

食用生食或未煮熟的食物会有后果。Nourished 会追踪每个玩家的肠道健康值,该值在食用生食时下降,并在食用熟食和多样化饮食后随时间恢复。

生食分为四个等级:

等级 效果
轻微 无惩罚
轻度 微弱减益,短持续时间
中度 中等减益,较长持续时间
严重 强烈减益,延长持续时间

在记忆窗口期内重复食用同一种生食会增加敏感性——你吃得越多,惩罚就越严重。肠道健康会在食用熟食和保持饮食多样性时被动且更快地恢复。

可以随时间建立抵抗力,从而降低惩罚幅度。所有内容(等级、持续时间、营养惩罚、恢复速度)均可通过 config/nourished/raw_food.json 和服务器模块开关进行配置。


📺 HUD

游戏内 HUD

在游戏中按 H 键进入编辑模式。可将其拖到任何位置、调整大小、锚定到任意角落。为零的条会自动隐藏,因此永远不会显得杂乱。

五条颜色编码的条在游戏时显示在屏幕上。无需打开任何界面,你总能清楚自己的状况。


📋 饮食界面

打开你的背包,点击 Nourished 图标,即可查看完整的营养概览。

主 GUI

📸 使用 PureBDCraft 资源包截图。UI 在原版纹理下也能工作,但会显示为默认的 Minecraft 风格。

你看到的內容
趋势箭头 每个类别是在上升还是下降
均衡分数 你的营养分布有多均匀
生效效果 你当前饮食正在对你产生什么影响
卡路里追踪 一目了然地查看每日摄入量
最近食用 你最近吃了什么
被忽视的类别 你可能接下来应该吃什么

🍽️ 多样化总是有回报的

重复食用同一种食物会随着时间的推移效果递减,因此轮换食用食物总是有益的。记忆会自然消退,因此你避免食用的食物会自行恢复其全部价值。


🤝 模组兼容性

Nourished 与使用原版 FoodProperties 的模组食物兼容。你无需编写集成代码即可实现基础营养追踪。

内置的兼容性数据有助于来自流行厨房和农业模组的食物直接显示在你的营养条上。对于边缘情况,服务器所有者可以通过配置文件和标签调整行为。

模组 状态
Farmer's Delight ✅ 已支持
Pam's HarvestCraft 2 ✅ 已支持
Create: Food ✅ 已支持
Croptopia ✅ 已支持
Farmer's Croptopia ✅ 已支持
Croptopia Delight ✅ 已支持
Farm & Charm ✅ 已支持
Ender's Delight ✅ 已支持
L_Ender's Delight ✅ 已支持
Ars Delight ✅ 已支持
Autochef's Delight ✅ 已支持
Spice of Life: Onion ✅ 集成
KubeJS ✅ 脚本钩子
Peak Stamina ✅ 营养影响耐力
JEI / REI / EMI ✅ 配方查看器中的提示
Legendary Survival Overhaul ⚠️ 效果被禁用(LSO 优先)
其他含有可食用物品的模组 ✅ 适用于标准食物物品

🔧 为你的服务器可配置

所有内容都附带合理的默认设置。服务器所有者和整合包作者无需接触 Java 即可调整行为:

  • 打开或关闭单个模块(HUD、衰减、效果、肠道健康等)
  • 调整每种营养素的衰减率和阈值
  • 通过 config/nourished/effects.json 添加、移除或替换效果
  • 使用 enableBlockHeavySources 和 enableBlockLightSource 调整进食规则
  • 编辑 config/nourished/ 下的食物值、覆盖项、颜色、扫描器规格和兼容设置
  • 使用单个共享代码保存和分享完整的配置快照

🔍 食物扫描器

  • 在游戏中运行 /nourished scan_analysis 以分析所有加载的食物物品,并在 config/nourished/scanner_analysis/ 下生成分类报告。

扫描器会生成:

  • multi_value_recommendations.json — 已被可靠分配到一个或多个营养类别的食物

  • unassigned_sources.txt — 无法自动分类、需要手动检查的食物

  • scanner_metrics.txt — 完整物品注册表摘要统计

  • 将推荐的标签条目复制到你的数据包中,使分类永久生效。

  • 未分配的物品可以使用上面的示例手动添加标签。


📁 数据与覆盖

大多数自定义操作在首次启动后位于 config/nourished/ 中:效果、食物值、覆盖项、颜色、预设和模块锁定。

Nourished 还在 data/nourished/ 下带有内置默认值(营养标签、兼容条目、预设)。高级整合包作者可以在支持的地方通过数据包覆盖一些 JSON;配置文件仍然是服务器调整的主要途径。

游戏内的食物扫描器(配置界面)可以帮助在单人游戏中检查并分配食物,并将生成的标签文件写入世界的数据包文件夹中供手动检查。

示例——将食物添加到营养标签

在你的数据包中创建以下文件:

your_datapack/
  data/
    nourished/
      tags/
        item/
          nutrients/
            vegetables.json
{
  "replace": false,
  "values": [
    {
      "id": "pamhc2foodextended:honeyglazedcarrotsitem",
      "required": false
    }
  ]
}

"replace": false 意味着你的条目会与 Nourished 的默认值合并,不会覆盖任何内容。


🟨 KubeJS 支持

为整合包作者提供的可选 KubeJS 集成。需要在整合包中安装 KubeJS。脚本放置在 kubejs/server_scripts/ 和 kubejs/startup_scripts/ 中。

KubeJS 支持分为两层:

  • MarieLib 提供通用的值追踪事件(MarieEvents.*),可供任何基于 MarieLib 的模组使用
  • Nourished 在此基础上提供营养专用的别名(NourishedEvents.*)

服务端脚本——营养事件:

NourishedEvents.nutrientChanged(event => {
    if (event.nutrientKey === 'proteins' && event.newValue < 0.25) {
        event.player.tell('吃点蛋白质!')
    }
})
NourishedEvents.nutrientModifier(event => {
    if (event.nutrientKey === 'vegetables') {
        event.amount *= 2
    }
})
NourishedEvents.foodEaten(event => {
    event.nutrientDeltas.forEach((value, key) => {
        console.log(key + ': ' + value)
    })
})

也可用:nutrientCritical、nutrientExcess、rawFoodPenalty、gutHealthChanged。

sourceConsumed 是一个通用的 MarieLib 事件,不暴露 nutrientKey 或 newValue——请用 nutrientChanged 代替。

服务端脚本——通用 MarieLib 事件:

MarieEvents.valueChanged(event => {
    console.log(event.playerId + ' ' + event.valueKey + ': ' + event.newValue)
})
MarieEvents.valueDeltaModifier(event => {
    if (event.valueKey === 'proteins') {
        event.amount *= 1.5
    }
})

也可用:valueCritical、valueExcess、sourceConsumed、decayTick、playerSynced。

启动脚本——注册自定义营养素:

NourishedAPI.registerNutrient({
    id: 'omega3',
    displayName: 'Omega-3',
    color: 0x4AA3FF,
    decayRate: 0.0012,
    critical: 0.12,
    low: 0.30,
    excess: 0.90
})

完整的 API 文档请参阅 GitHub 上的 API.md。


⚙️ 需求

Minecraft 1.21.1
NeoForge 21.1.x
MariesLib v0.1.0-beta.4+(新依赖——见上方说明)
Cloth Config 运行时必需
Patchouli 可选(游戏内指南)
Java 21

支持与反馈

发现 Bug、有建议或需要帮助?

报告问题时请包含日志、截图或重现步骤。


路线图

Nourished 专注于营养玩法:均衡、效果、肠道健康、HUD/UX、多人同步以及模组包友好的配置。

计划中(Nourished)

  • Spice of Life (Onion) 集成
  • 扩展的 Farmer's Delight 钩子
  • 任务与进度集成
  • Curios / 饰品集成
  • 更多适用于休闲与硬核服务器的预设配置

MIT 许可证——可自由用于模组包、分支和附加组件。