Crafttweaker(1.12.2)基础2:事件(上)

事件(Event)就像一只看不见的耳朵贴在游戏的任何一处可能的地方,一但发生了某些这只“耳朵”想要监听到的事情就会使zs脚本编写者写的某些东西被触发(Fired)。可以说,zs脚本中最好玩的基础部分就在于事件的编写了,在这里编写者可以尽情挥洒想象力。
在入门1中就已经提过了全局关键字并给出了其wiki页面,但是入门2给出的诸多ZenMethod中涉及到的全局关键字对象也不过recipes(工作台配方包)与furnace(熔炉配方包),现在随着事件的引入,又一全局关键字events将要成为脚本常客。至于其他的众多关键词(如game、itemUtils、loadedMods等)中也有不少具有重要的作用,请自行在入门1中找到全局关键字的wiki网址前往了解。
考虑到后续将出现越来越长的代码实例,为防止有人肆无忌惮的复制粘贴,代码以图片形式呈现的比例将会提高(其实也就是稍微增加了一点copy的时间成本而已)。
与入门1介绍有序配方的添加时先给出一段代码实例再慢慢解析的流程一样,我们在介绍事件时也会采用类似的模式,下面是一段事件:
这段代码的效果是每当有玩家登入世界时,在聊天栏会收到一条欢迎信息“Welcome!”。
我们一步一步来看:
一、events
这是一个全局关键字“事件管理器”,可以对其使用一系列与事件有关的ZenMethod,详见
https://docs.blamejared.com/1.12/en/Vanilla/Events/IEventManager#what-events-are-available
二、
由于我们要监听“玩家登入”这一事件,因此要选择onPlayerLoggedIn()这一ZenMethod。
三、
无论选择了哪个ZenMethod,里面都需要传入一个匿名函数作为参数,onPlayerLoggedIn()也不例外。
四、
匿名函数的参数和返回值不可乱填,其类型与意义取决于ZenMethod的函数式接口——在对events使用的ZenMethod中,匿名函数所填参数的数量为1,类型取决于该ZenMethod;返回值为空,毕竟此处的意义是供编写的脚本在游戏中被“触发”的,譬如给玩家发送“Welcome!”的信息等,不一而足。
先讲参数,这个“类型取决于ZenMethod”究竟是个什么取决法。其实上文给的网址中已经用表格的形式呈现得很明白了:表格的左半边是events能用的ZenMethod,右半边就对应了左边ZenMethod所需匿名函数的参数类型了,而且wiki还贴心地把这些类型用链接关联到各自对应的事件页面了——以咱们的onPlayerLoggedIn()为例,右边的链接是:
https://docs.blamejared.com/1.12/en/Vanilla/Events/Events/PlayerLoggedIn
只不过最上面的事件代码用导包的形式稍微缩短了一些单行代码的长度,显得美观一些罢了:
此处的参数event是习惯命名,实际写的时候随便命名(不过不推荐这样)。
五、
因为返回值为空,所以如果没有什么意外情况需要中断自己写的代码就不需要特地写return;
通过参数event,我们能在对应的参数类型的页面中找到其能用的ZenGetter、ZenSetter和ZenMethod。以本文所给代码为例,不难发现PlayerLoggedInEvent有player这一ZenGetter,返回类型是IPlayer,显然是对应于登入的玩家本身了。根据
https://docs.blamejared.com/1.12/en/Vanilla/Players/IPlayer#zenmethods
不难在IPlayer的页面下找到sendChat()这一ZenMethod,顾名思义是用来给玩家发送消息的,于是便有了上面的实例。
想想看,events有如此之多的ZenMethod,各自的匿名函数里又有无数的写法,可想而知事件的玩法是极其丰富、需要脚本编写者有极大的想象力与创造力的。