节日与季节效果

本 mod 的两双季节靴(四季靴、圣诞精神靴)会根据服务器操作系统的真实日期改变 vis 折扣、移速长跑系数与贴图。机制集中在 CalendarHelper。

日历判定

CalendarHelper(main/utils/CalendarHelper.java)在 preInit 时读取一次系统时间并缓存 4 个布尔值:

方法 触发条件 是否有物品使用
isChristmas() 月份 == 12 ✅ 四季靴、圣诞精神靴
isIrish() 月份 == 3 ❌ 无任何调用点
isEaster() 月份 == 3 或 4 ❌ 无任何调用点
isFree() 月份 == 7 ❌ 无任何调用点

判定用的是 Calendar.getInstance().get(Calendar.MONTH) + 1,即操作系统本地时区的月份,与游戏内世界时间、服务器 uptime、维度时间完全无关。GTNH 多人服务器上,所有玩家看到的 vis 折扣取决于服主的系统日期设置。

数值影响

靴子 字段 平月 12 月
四季靴 visDiscount 3 6
四季靴 modifier 1 12
四季靴 longrunningbonus 0.003F 0.036F
四季靴 图标 bootsArcanium bootsChristmas
四季靴 护甲贴图 boots_arcanium.png boots_christmas.png
圣诞精神靴 visDiscount 2 9
圣诞精神靴 modifier 1 25
圣诞精神靴 longrunningbonus 0.003F 0.075F
圣诞精神靴 图标 / 贴图 常量,不变 常量,不变

longrunningbonus 参与 ItemBoots.computeBonus(ItemBoots.java:133-136)的 speedBonus + (runTicks × 0.2F) × longrunningbonus,所以圣诞月的长跑收益是平月的 12 倍(四季靴)或 25 倍(圣诞精神靴)。

两双靴的贴图行为不一致:四季靴会换整套贴图,圣诞精神靴只有数值变、贴图恒定。

已知缺陷

  • CalendarHelper.calendar() 缺 break,月份 3 会同时点亮三面旗(CalendarHelper.java:14-26):

    switch (month) {
        case 3:
            isIrish = true;
        case 4:            // ← 缺 break,3 月会 fall through 进来
            isEaster = true;
            break;
        ...
    

    3 月时 isIrish 与 isEaster 均为 true。源码注释用大写 “AMERICA #1 BABY” 标注了 isFree,说明作者原本打算做「每月一个节日」的轮换,但只实现了 4 个节日中的 1 个(圣诞)接入物品系统,另外 3 个是死代码。

  • isIrish / isEaster / isFree 三个 getter 无任何调用点,属于预留 API。

  • 日期只在 preInit 缓存一次。服务器跨月不重启的话,靴子数值会停留在启动时的状态。CalendarHelper.calendar() 由 ThaumicBoots.preInit(ThaumicBoots.java:32)调用一次即固定。

相关条目