永久白昼或永久黑夜

永久白昼或永久黑夜

一个Minecraft模组,通过命令在永久白天/永久夜晚/正常循环模式之间切换,引入了温度、口渴、水净化和实体增强等硬核生存机制。

创建

永昼或永夜

License: MIT GitHub Platform Version Java

一个 Minecraft 模组,可通过命令在永昼/永夜/正常循环模式之间切换,并引入温度、口渴、水净化、实体增强等硬核生存机制。 跳转到中文介绍: README.md


平台支持

加载器 Minecraft 版本 模组版本 状态
Fabric 1.20.1 1.0.0 Fabric ✅ 功能完整

需要 Fabric Loader 0.19.3+ 和 Fabric API 0.92.11+1.20.1。


特性

  • 三模式切换:永昼(锁定在正午)、永夜(锁定在午夜)、正常循环 —— 无需任何按键即可在三种模式间自由切换
  • 温度系统:体温受生物群系/维度/时间/天气/海拔/附近方块/手持物品/盔甲保温影响;极热会燃烧,极冷会冻僵
  • 漂移累积:在永昼/永夜模式下,温度漂移每天按 dailyDriftAmount(默认 1°C)累积且不衰减;永续模式越久越极端;在昼↔夜之间切换会直接反转漂移方向
  • 正常模式安全:纯环境温度被限制在 ±normalSafeRange(默认 ±60°C)以内,防止死亡;方块与手持物品效果不受限制,仍可致命
  • 口渴系统:玩家拥有一个水分值(默认初始 100),会随时间流逝;不同水源有不同的效果(淡水湖安全,海洋/盐湖/普通水有 75% 的脱水几率)
  • 水净化:脏水瓶/脏水桶必须先在熔炉/高炉/烟熏炉中熔炼后才能饮用
  • 直接饮用:空手右键水面即可饮水;淡水湖 100% 安全,其他水源有 75% 脱水几率
  • 实体增强:在永昼/永夜模式下,敌对实体获得增强的属性与 AI(速度/攻击/生命值提升;中立生物会主动追踪玩家)
  • HUD 显示:体温与水分合并显示在动作栏,不污染聊天框
  • 数据持久化:玩家温度/口渴数据 + 全局漂移值跨会话持久保存;服务器重启不丢失数据

模式详情

模式 时间锁定 温度漂移 实体增强
正常循环(/pdopn cycle) 跟随原版昼夜循环 无漂移(衰减至 0) 无
永昼(/pdopn day) 正午 6000 tick 每天 +1°C,越来越热 亡灵燃烧,其他增强
永夜(/pdopn night) 午夜 18000 tick 每天 -1°C,越来越冷 所有敌对生物增强

漂移转换规则

切换场景 漂移处理
永昼 → 永夜 +N°C → -N°C,继续向寒冷方向累积
永夜 → 永昼 -N°C → +N°C,继续向炎热方向累积
永昼/永夜 → 正常 不反转,按 driftDecayRate 衰减至 0
正常 → 永昼/永夜 从 0 开始,正向/负向累积

命令

所有命令均需要 OP 权限(默认等级 2)。

命令 描述
/pdopn day 切换到永昼模式
/pdopn night 切换到永夜模式
/pdopn cycle 恢复正常昼夜循环
/pdopn status 显示当前模式
/pdopn temp 显示你的体温
/pdopn temp set <value> 设置你的体温(-100 到 100)
/pdopn temp maxdays <days> 设置最大生存天数(仅供参考)
/pdopn temp hud 切换温度 HUD 显示
/pdopn thirst 显示你的水分值
/pdopn thirst set <value> 设置你的水分值(0 到 100)
/pdopn drift 显示当前累积温度漂移(可在控制台使用)
/pdopn drift reset 清除累积漂移与天数计数器,无需重启服务器(可在控制台使用)
/pdopn reload 重新加载 pdopn.json(可在控制台使用)

temp maxdays 目前仅在达到该永续天数后作为一次性警告(HUD/ActionBar)的阈值。它不会结束游戏,也不会改变温度计算。


温度系统

温度因素

因素 描述
生物群系 沙漠 +45°C,冰刺 -25°C,下界荒地 +42°C,末地 -20°C 等
维度 下界基础 +40°C,末地基础 -20°C(覆盖生物群系温度)
时间 白天 +5°C,夜晚 -5°C,黄昏 +2°C,黎明 -2°C
天气 降雨 -3°C,雷暴 -5°C(户外全效果,室内 30%)
海拔 Y > 120:每格 -0.05°C,Y < 0:每格 -0.03°C
附近方块 岩浆 +15(半径 5),火 +10(半径 3),冰 -5(半径 3)等
手持物品 岩浆桶 +0.03/tick,冰 -0.005/tick 等(每 20 tick 应用一次)
盔甲保温 皮革套装 0.150.20,下界合金套装 0.130.18,降低环境温度影响速率

降温方式

炎热环境现在有两条可用的降温途径 (此前水对体温没有效果,导致永昼 + 沙漠无法生存):

方式 效果
站在水中 体温向水温靠拢。冻洋 -25°C,冻河 -20°C,寒冷海洋 +2°C,普通河流/湖泊 +12°C,温暖海洋 +22°C,丛林 +20°C
饮用纯净水 每瓶 -6°C(每桶 -20°C),在 10 秒内生效;直接饮用淡水 -3°C,不安全水 -2°C

水温由生物群系决定;只有当水温低于你的体温时才会降温, 因此站在温水中永远不会让你升温。 盔甲保温也会减缓冷却(厚甲保温)。 当体温低于 0°C 时,冷饮停止降温,因此你不会把自己冻僵。

温度效果

体温范围 效果
≥ 100°C 烧死(火焰伤害,每次命中扣除 25% 最大生命值)
≥ 70°C 着火 + 反胃 III
≥ 45°C 缓慢 II + 虚弱 II
≥ 25°C 缓慢 I
≤ -100°C 冻死(冰冻伤害,每次命中扣除 25% 最大生命值)
≤ -70°C 凋零 II + 失明
≤ -45°C 缓慢 II + 挖掘疲劳 II
≤ -25°C 缓慢 I

致命温度伤害类型

温度极值处的致命伤害使用自定义伤害类型, 因此死亡消息是模组专属的,而非原版通用文本:

情况 伤害类型 死亡消息
≥ 100°C pdopn:heat %s's body temperature ran away and was consumed by extreme heat
≤ -100°C pdopn:cold %s's body temperature ran away and froze to death

定义于 data/pdopn/damage_type/heat.json 和 cold.json。 翻译键为 "death.attack." + message_id,即 death.attack.pdopn.heat / death.attack.pdopn.cold (以及存在击杀者时使用的 .player 变体)。


口渴系统

口渴阶段

水分范围 效果
≥ 60 舒适(无效果)
40 ~ 60 轻度口渴(缓慢 I)
25 ~ 40 中度脱水(缓慢 II + 虚弱 I)
10 ~ 25 重度脱水(缓慢 III + 虚弱 II + 反胃 I)
< 10 极度脱水(缓慢 IV + 虚弱 III + 反胃 II + 逐渐失去生命值)

水源饮用效果

水源 饮用结果
淡水湖(河流/沼泽/红树林沼泽/沙滩生物群系,非盐湖) 100% 恢复 15 水分
海洋 75% 几率脱水 15,25% 几率恢复 2.5
盐湖(哈希匹配的候选生物群系) 75% 几率脱水 10,25% 几率恢复 2.5
普通水(其他生物群系的水) 75% 几率脱水 5,25% 几率恢复 2.5

水净化配方

输入 设备 输出 时间
水瓶(脏) 熔炉/高炉/烟熏炉 纯净水瓶 200 / 100 / 100 tick
水桶(脏) 熔炉/高炉/烟熏炉 纯净水桶 200 / 100 / 100 tick

这些配方使用原版配方类型(minecraft:smelting / blasting / smoking), 输入为原版水瓶或水桶。

⚠️ 已知限制:原版 Ingredient JSON 仅支持 item / tag,而其匹配 逻辑(isItemEqual → isOf(Item))不会比较 NBT,因此无法专门匹配“一个水瓶”。 结果是,任何药水(治疗/力量/抗火等)在熔炉中熔炼 都会变成纯净水瓶。不要把贵重药水放进熔炉。

历史记录:曾尝试用自定义 RecipeSerializer + 自定义 RecipeType 来过滤输入,但方块 按类型索引配方并通过 RecipeManager#getAllOfType 查找它们 (recipes.getOrDefault(type, ...)),因此自定义类型会使配方落入一个永远不会被查询的桶中—— 表现为“配方存在但熔炉忽略它”。为保持配方正常工作, 它们被回退为原版配方类型。

饮用冷却

直接饮用(空手右键水面)有 40 tick(2 秒)冷却,以防止快速连点。

实体增强

永昼模式

实体类型 生命值 速度 攻击
普通敌对生物 ×10 ×1.5 ×1.5
Boss(末影龙/凋灵) ×2.5 ×1.5 ×0.7
亡灵 不处理(阳光下燃烧) — —

生命值以相对于基础值的倍数进行缩放(原版 20 血僵尸 → 200)。 旧版本使用固定的 200,实际上削弱了高血量生物如监守者;现在改为真正的倍数。 属性修饰符使用 MULTIPLY_TOTAL,因此 ×1.5 / ×0.7 等比例对任何实体都精确成立。

永夜模式

实体类型 生命值 速度 攻击
普通敌对生物 ×50 ×0.7 ×5.0
Boss(末影龙/凋灵) ×10 ×0.7 ×3.0

生命值被限制在 1024,因此某些实体在高倍数下无法达到标称值。 中立敌对生物(末影人、蜘蛛、僵尸猪灵等)在永昼/永夜模式下会主动追踪玩家(通过注入的 ActiveTargetGoal)。


游戏规则

模组注册了一组按世界生效的游戏规则,可在运行时用原版 /gamerule 修改(需要 OP)。它们也会出现在“创建世界 → 游戏规则”界面中。

游戏规则 默认值 描述
pdopnTemperature true 温度系统的总开关
pdopnThirst true 口渴系统的总开关
pdopnDrift true 漂移累积。关闭时,昼夜时间锁定仍然生效 —— 漂移只是停止累积
pdopnMaxDrift 100 漂移绝对上限(°C)。0 = 无限制;默认 ±100 与致命阈值一致,约在第 100 天封顶
pdopnBlockTemp true 附近危险方块(岩浆/火/冰等)的温度影响
pdopnLethalDamage true 致命温度与脱水伤害。关闭时你仍会过热/冻僵/脱水,但不会死亡
pdopnMobBoost true 敌对生物属性增强
pdopnNeutralAggro true 中立生物(末影人/蜘蛛等)主动追踪玩家
pdopnHudDefault true 新玩家的默认 HUD 状态(已关闭的玩家保留其选择)
pdopnMaxDaysEnforce false 将 maxDays 从“仅警告”升级为强制执行:到期时自动恢复为正常循环

为什么使用游戏规则而不是配置选项

pdopn.json 位于 .minecraft/config/,适用于服务器上的每个世界, 而模式和漂移是按世界的状态,温度是按玩家的状态。 游戏规则自带 /gamerule、OP 权限检查、世界存档持久化和 客户端同步——这些都不需要重新实现。 分工:配置提供全局默认值,游戏规则提供按世界的覆盖。 规则严格采用“开关/上限”语义;具体数值保留在配置中,因此两个 来源永远不会相互冲突。

典型用法:/gamerule pdopnDrift false —— 保留永昼风景而不必承受 不断上升的温度压力。 或 /gamerule pdopnMaxDrift 60 —— 将漂移上限设为 ±60°C,使其保持在极端但可生存的范围内。


配置

配置文件位于 .minecraft/config/pdopn/pdopn.json; 使用 /pdopn reload 或重启服务器来应用更改。 所有具体的温度/口渴数值都在这里。

温度配置

选项 默认值 描述
baseEnvRate 0.005 体温接近环境温度的速率
dailyDriftAmount 1.0 在永昼/永夜模式下每天累积的漂移值(°C)
driftDecayRate 0.02 正常模式下每 tick 的漂移衰减
normalSafeRange 60.0 正常模式下纯环境温度的安全范围(±°C)
netherBaseTemp 40.0 下界基础温度
endBaseTemp -20.0 末地基础温度
rainModifier -3.0 降雨温度修正
thunderModifier -5.0 雷暴温度修正

口渴配置

选项 默认值 描述
baseDrainRate 0.005 每 tick 的基础口渴流逝
maxValue 100.0 最大水分值
initialValue 100.0 初始水分值
pureWaterBottleRestore 15.0 纯净水瓶恢复量
pureWaterBucketRestore 25.0 纯净水桶恢复量
freshwaterDrinkRestore 15.0 淡水直接饮用恢复量
seawaterDrinkDrain -15.0 海水饮用脱水量
saltLakeDrinkDrain -10.0 盐湖饮用脱水量
unsafeDrinkChance 0.75 非淡水来源的脱水几率
drinkCooldownTicks 40 直接饮用冷却(tick)
saltLakeChance 0.25 盐湖生成几率
pureWaterBottleCooling 6.0 每瓶纯净水降温的体温(°C)
pureWaterBucketCooling 20.0 每桶纯净水降温的体温(°C)
freshwaterDrinkCooling 3.0 直接饮用淡水降温(°C)
unsafeDrinkCooling 2.0 饮用不安全水降温(°C)
coolantDurationTicks 200 降温效果持续时间(tick;200 = 10 秒)

实体增强选项

选项 默认值 描述
entity.whitelist [](空) 允许被增强的实体 ID。空表示“除黑名单外的一切”
entity.blacklist [](空) 永不增强的实体 ID;优先于白名单

目的:避免与同样重写生物属性的模组(精英怪物、史诗战斗等)冲突。 例如 "blacklist": ["modid:elite_zombie"],或 "whitelist": ["minecraft:zombie", "minecraft:skeleton"]。

配置版本

选项 默认值 描述
configVersion 2 配置模式版本,用于自动迁移

使用 /pdopn reload 应用配置更改而无需重启服务器。 如果文件中的 configVersion 低于当前版本,模组会填入新字段并将文件写回。


安装

  1. 安装 Minecraft 1.20.1
  2. 安装 Fabric Loader 0.19.3 或更高版本
  3. 下载 Fabric API 0.92.11+1.20.1
  4. 下载本模组的 jar 文件
  5. 将 Fabric API 与本模组的 jar 都放入 .minecraft/mods/ 目录
  6. 启动游戏

构建与开发

项目结构

Perpetual day or perpetual night/
├── src/main/java/yifei/pdopn/
│   ├── PerpetualDayOrPerpetualNight.java   # Main entry
│   ├── client/                             # Client entry
│   ├── command/                            # Command system
│   ├── config/                             # Config management
│   ├── entity/                             # Entity attribute modification
│   ├── hud/                                # HUD rendering
│   ├── items/                              # Pure water bottle / bucket
│   ├── mixin/                              # Mixin injections
│   ├── mode/                               # Mode enum
│   ├── temperature/                        # Temperature system
│   └── thirst/                             # Thirst system
├── src/main/resources/
│   ├── assets/pdopn/                      # Resources (lang/models/textures)
│   └── data/pdopn/                         # Data files (recipes)
├── gradle.properties
└── README.md

构建命令

./gradlew build            # Output → build/libs/pdopn-1.0.0 Fabric.jar

构建还会自动生成一个 -sources.jar 源码包。

技术栈

  • 加载器:Fabric Loader 0.19.3
  • API:Fabric API 0.92.11+1.20.1
  • 映射:Yarn 1.20.1+build.10
  • 构建工具:Fabric Loom 1.17-SNAPSHOT
  • Java:17

许可证

本项目采用 MIT 许可证,见 LICENSE。