Crafttweaker(1.12.2)基礎(chǔ)2:事件(上)

事件(Event)就像一只看不見的耳朵貼在游戲的任何一處可能的地方,一但發(fā)生了某些這只“耳朵”想要監(jiān)聽到的事情就會使zs腳本編寫者寫的某些東西被觸發(fā)(Fired)??梢哉f,zs腳本中最好玩的基礎(chǔ)部分就在于事件的編寫了,在這里編寫者可以盡情揮灑想象力。
在入門1中就已經(jīng)提過了全局關(guān)鍵字并給出了其wiki頁面,但是入門2給出的諸多ZenMethod中涉及到的全局關(guān)鍵字對象也不過recipes(工作臺配方包)與furnace(熔爐配方包),現(xiàn)在隨著事件的引入,又一全局關(guān)鍵字events將要成為腳本???。至于其他的眾多關(guān)鍵詞(如game、itemUtils、loadedMods等)中也有不少具有重要的作用,請自行在入門1中找到全局關(guān)鍵字的wiki網(wǎng)址前往了解。
考慮到后續(xù)將出現(xiàn)越來越長的代碼實例,為防止有人肆無忌憚的復制粘貼,代碼以圖片形式呈現(xiàn)的比例將會提高(其實也就是稍微增加了一點copy的時間成本而已)。
與入門1介紹有序配方的添加時先給出一段代碼實例再慢慢解析的流程一樣,我們在介紹事件時也會采用類似的模式,下面是一段事件:
這段代碼的效果是每當有玩家登入世界時,在聊天欄會收到一條歡迎信息“Welcome!”。
我們一步一步來看:
一、events
這是一個全局關(guān)鍵字“事件管理器”,可以對其使用一系列與事件有關(guān)的ZenMethod,詳見
https://docs.blamejared.com/1.12/en/Vanilla/Events/IEventManager#what-events-are-available
二、
由于我們要監(jiān)聽“玩家登入”這一事件,因此要選擇onPlayerLoggedIn()這一ZenMethod。
三、
無論選擇了哪個ZenMethod,里面都需要傳入一個匿名函數(shù)作為參數(shù),onPlayerLoggedIn()也不例外。
四、
匿名函數(shù)的參數(shù)和返回值不可亂填,其類型與意義取決于ZenMethod的函數(shù)式接口——在對events使用的ZenMethod中,匿名函數(shù)所填參數(shù)的數(shù)量為1,類型取決于該ZenMethod;返回值為空,畢竟此處的意義是供編寫的腳本在游戲中被“觸發(fā)”的,譬如給玩家發(fā)送“Welcome!”的信息等,不一而足。
先講參數(shù),這個“類型取決于ZenMethod”究竟是個什么取決法。其實上文給的網(wǎng)址中已經(jīng)用表格的形式呈現(xiàn)得很明白了:表格的左半邊是events能用的ZenMethod,右半邊就對應(yīng)了左邊ZenMethod所需匿名函數(shù)的參數(shù)類型了,而且wiki還貼心地把這些類型用鏈接關(guān)聯(lián)到各自對應(yīng)的事件頁面了——以咱們的onPlayerLoggedIn()為例,右邊的鏈接是:
https://docs.blamejared.com/1.12/en/Vanilla/Events/Events/PlayerLoggedIn
只不過最上面的事件代碼用導包的形式稍微縮短了一些單行代碼的長度,顯得美觀一些罷了:
此處的參數(shù)event是習慣命名,實際寫的時候隨便命名(不過不推薦這樣)。
五、
因為返回值為空,所以如果沒有什么意外情況需要中斷自己寫的代碼就不需要特地寫return;
通過參數(shù)event,我們能在對應(yīng)的參數(shù)類型的頁面中找到其能用的ZenGetter、ZenSetter和ZenMethod。以本文所給代碼為例,不難發(fā)現(xiàn)PlayerLoggedInEvent有player這一ZenGetter,返回類型是IPlayer,顯然是對應(yīng)于登入的玩家本身了。根據(jù)
https://docs.blamejared.com/1.12/en/Vanilla/Players/IPlayer#zenmethods
不難在IPlayer的頁面下找到sendChat()這一ZenMethod,顧名思義是用來給玩家發(fā)送消息的,于是便有了上面的實例。
想想看,events有如此之多的ZenMethod,各自的匿名函數(shù)里又有無數(shù)的寫法,可想而知事件的玩法是極其豐富、需要腳本編寫者有極大的想象力與創(chuàng)造力的。