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

前情提要

本教程默认读者已经懂得如何用FTB任务添加/编辑任务,以及基本的KubeJS应用。

在1.16+等版本,FTB任务并没有“可重复”这个选项,但如果玩过《机械动力:永无止境》,可能会记得其中的任务市场可以重复购买东西。

基于对《机械动力:永无止境》脚本和WIKI的研究,本教程将争取以浅显的方式教学“如何用KubeJS使FTB任务可重复”,并让读者理解其中的原理。

正文

下面是一个例子,首先创建一个名为“ee”(名字随意取的)的任务章节。

并添加一个“腐肉换铁”的任务。

KubeJS如何使FTB任务可重复-第1张图片

我们希望这是个可重复的任务。

要解决这个问题,首先需要对FTB任务的任务文件有基本的了解。

打开版本目录下config/ftbquests/quests/chapters内,找到ee.snbt。

ftbquests:FTB任务的配置。

quests:任务。

chapters:任务章节。

ee.snbt:“ee”这一章。(如果用中文名可能是别的名称,打开确认一下就行)

用vsc、记事本或npp等软件打开。

可以看到“ee”该章节的任务就保存在其中。

由于我们只添加了一个任务,所以很容易找到刚才添加的腐肉换铁锭任务。

KubeJS如何使FTB任务可重复-第2张图片

第2行:该章节的id。

第12行:腐肉换铁锭的任务的id。

或者可以右键任务/目标/奖励,直接复制它们的id:

KubeJS如何使FTB任务可重复-第3张图片

这时可能有读者会想到,只需要在完成任务时重置该任务的进度即可让这个任务“可重复”。

FTB任务可以用

/ftbquests change_progress @p reset <任务id>

于是在奖励内添加一个执行命令:

KubeJS如何使FTB任务可重复-第4张图片

接下来提交目标物品,并领取奖励。

KubeJS如何使FTB任务可重复-第5张图片

确实可以再次提交腐肉以换得铁锭,但是奖励的命令上的“√”却保留下来无法再次点击。如此,这个腐肉换铁锭任务只能做两次,不能满足我们的要求,而且如果要设置多个可重置任务那么要不断地查id复制命令,实在过于繁琐。

 接下来,切入正题。

有的玩家可能在编辑FTB任务时就发现过有“Tags”这一项。

KubeJS如何使FTB任务可重复-第6张图片

是的,FTB任务和KubeJS关系匪浅,KubeJS本身就自带与FTB任务的联动,可以监听FTB任务事件。

官方Wiki上已经给出了所能监听的三大类事件。

自定义任务目标:ftbquests.custom_task

自定义任务奖励:ftbquests.custom_reward

任务完成:ftbquests.completed

在事件后面添加id,如ftbquests.custom_task.75381f79,可监听指定自定义任务的完成情况,从而实现多样化的任务目标。只是KubeJS的WIKI内容尚不全,需要翻找Github,此处不谈。

回到正题,这里就需要之前提到的Tag功能。

添加自定义任务奖励:

KubeJS如何使FTB任务可重复-第7张图片

并编辑它,添加一个标签,此处取“reset”。

KubeJS如何使FTB任务可重复-第8张图片

然后在kubejs\server_scripts文件内添加的脚本文件写入以下内容。

//监听玩家获取自定义奖励事件

//定义延迟执行
    let runCommand = (cmd) => {
        event.server.schedule(10, event.server, function (callback) {
            callback.data.runCommandSilent(cmd)
        })
    }

onEvent('ftbquests.custom_reward', event => {
       var id =event.reward.quest.getCodeString()
       //获取任务id,方便起见,用id代替这一长串
       //var也可换成let
    if (event.reward.hasTag('reset'))//如果该自定义奖励有tag为“reset”
        runCommand('/ftbquests change_progress ' + event.player.name + ' reset ' + id)
    //静默执行命令,重置该任务进度
})

这时我们在领取这个自定义奖励时即可重置任务,使其可重复完成。