本篇教程由作者设定未经允许禁止转载。
前情提要
本教程默认读者已经懂得如何用FTB任务添加/编辑任务,以及基本的KubeJS应用。
在1.16+等版本,FTB任务并没有“可重复”这个选项,但如果玩过《机械动力:永无止境》,可能会记得其中的任务市场可以重复购买东西。
基于对《机械动力:永无止境》脚本和WIKI的研究,本教程将争取以浅显的方式教学“如何用KubeJS使FTB任务可重复”,并让读者理解其中的原理。
正文
下面是一个例子,首先创建一个名为“ee”(名字随意取的)的任务章节。
并添加一个“腐肉换铁”的任务。
我们希望这是个可重复的任务。
要解决这个问题,首先需要对FTB任务的任务文件有基本的了解。
打开版本目录下config/ftbquests/quests/chapters内,找到ee.snbt。
ftbquests:FTB任务的配置。
quests:任务。
chapters:任务章节。
ee.snbt:“ee”这一章。(如果用中文名可能是别的名称,打开确认一下就行)
用vsc、记事本或npp等软件打开。
可以看到“ee”该章节的任务就保存在其中。
由于我们只添加了一个任务,所以很容易找到刚才添加的腐肉换铁锭任务。
第2行:该章节的id。
第12行:腐肉换铁锭的任务的id。
或者可以右键任务/目标/奖励,直接复制它们的id:
这时可能有读者会想到,只需要在完成任务时重置该任务的进度即可让这个任务“可重复”。
FTB任务可以用
/ftbquests change_progress @p reset <任务id>
于是在奖励内添加一个执行命令:
接下来提交目标物品,并领取奖励。
确实可以再次提交腐肉以换得铁锭,但是奖励的命令上的“√”却保留下来无法再次点击。如此,这个腐肉换铁锭任务只能做两次,不能满足我们的要求,而且如果要设置多个可重置任务那么要不断地查id复制命令,实在过于繁琐。
接下来,切入正题。
有的玩家可能在编辑FTB任务时就发现过有“Tags”这一项。
是的,FTB任务和KubeJS关系匪浅,KubeJS本身就自带与FTB任务的联动,可以监听FTB任务事件。
官方Wiki上已经给出了所能监听的三大类事件。
自定义任务目标:ftbquests.custom_task
自定义任务奖励:ftbquests.custom_reward
任务完成:ftbquests.completed
在事件后面添加id,如ftbquests.custom_task.75381f79,可监听指定自定义任务的完成情况,从而实现多样化的任务目标。只是KubeJS的WIKI内容尚不全,需要翻找Github,此处不谈。
回到正题,这里就需要之前提到的Tag功能。
添加自定义任务奖励:
并编辑它,添加一个标签,此处取“reset”。
然后在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)
//静默执行命令,重置该任务进度
})
这时我们在领取这个自定义奖励时即可重置任务,使其可重复完成。