本篇教程由作者设定未经允许禁止转载。

项目目标

实现在玩家起床后在聊天栏内输出下一次月亮事件的类型和距离下一次月亮事件发生的时间。


正文

LevelEvents.tick(event => {
        //  在此处写入代码
    })

关键代码

1. 获取月亮事件列表,并取第一个值:别问我为什么是取0,问就是因为列表下标是从0开始的

var moon = event.level.getLunarContext().lunarForecast.forecast[0]

2. 获取月亮事件类型:

let moon_type = moon.getLunarEventKey().path

3. 获取月亮事件的计划日期:

let scheduledDay = moon.scheduledDay()

完整代码

LevelEvents.tick(event => {
    var moon = event.level.getLunarContext().lunarForecast.forecast[0]
    let moon_type = moon.getLunarEventKey().path
    // 获取当前游戏天数(游戏日)
    let today = Math.trunc(event.level.dayTime()/24000)
    // 获取最近月亮事件的计划日
    let scheduledDay = moon.scheduledDay()
    // 获取间隔
    let interval = (scheduledDay) - (today)
    // 获取当前游戏时间(用于计划任务)
    if (event.level.getDayTime()%24000 == 10){
                event.server.runCommandSilent(`say ${`距离 ${moon_type} 还有 ${interval.toString()} 天`}`)
        }
    })


代码优化

然而,在上述代码运行时会在日志中输出大量报错信息,这是因为在Kubejs6中会存在event为null的情况。(如图)

KubeJS【月相预报】-第1张图片

解决方法:

将关键代码的的第一步分成两步处理,先获取并判断  event.level.getLunarContext() 的值是否为 null,若为null则结束,

否则就 获取月亮事件列表,并取第一个值。

var moon_context = event.level.getLunarContext()
var moon
if (moon_context == null){
        return;
    }else{
        moon = moon_context.lunarForecast.forecast[0]
    }


优化后的完整代码

LevelEvents.tick(event => {
    var moon_context = event.level.getLunarContext()
    var moon
    if (moon_context == null){
        return;
    }else{
        moon = moon_context.lunarForecast.forecast[0]
    }
    let moon_type = moon.getLunarEventKey().path
    // 获取当前游戏天数(游戏日)
    let today = Math.trunc(event.level.dayTime()/24000)
    // 获取最近事件月的计划日
    let scheduledDay = moon.scheduledDay()
    // 获取间隔
    let interval = (scheduledDay) - (today)
    // 获取当前游戏时间(用于计划任务)
    if (event.level.getDayTime()%24000 == 10){
            event.server.runCommandSilent(`say ${`距离 ${moon_type} 还有 ${interval.toString()} 天`}`)
        }
    })


模组版本

Kubejs:  1902.6.2-build.45

月亮事件: 2.1.0.6

Minecraft : 1.19.2


效果展示

KubeJS【月相预报】-第2张图片