淺談CNPC腳本1.7與1.8+腳本的區(qū)別
底層實(shí)現(xiàn)
在談論它們的區(qū)別之前,我們首先要知道腳本是如何實(shí)現(xiàn)的
CNPCmod在Forge訂閱了一些事件,或者是通過(guò)覆寫方法之類的手段,總之使得它可以在需要的時(shí)候運(yùn)行自己自定義的代碼,但這些代碼大多數(shù)與腳本無(wú)關(guān),CNPCmod在自己內(nèi)部已經(jīng)處理完了東西,不給你的機(jī)會(huì)。
但是,有一部分情況例外,那便是CNPCmod手動(dòng)向你發(fā)來(lái)了事件,這便是觸發(fā)腳本的時(shí)候。
CNPC用容器,儲(chǔ)存你寫的腳本的文本信息,然后在關(guān)鍵時(shí)候調(diào)用腳本,我描述一下大致發(fā)生了什么:
CNPC覺(jué)得應(yīng)該發(fā)生什么->CNPC訪問(wèn)了容器->CNPC用腳本引擎調(diào)用了腳本
雖然好似容器并沒(méi)有提及的必要,但這對(duì)于1.8+和1.7有很大區(qū)別。
容器
總所周知的是,1.7只能依賴實(shí)體NPC寫腳本,1.12有player和forge框的同時(shí)在NPC上寫腳本,這是容器的區(qū)別。
對(duì)于1.12,player框,forge框,NPC框,它們各自有自己的容器,事實(shí)上,它們底層的結(jié)構(gòu)是這樣的:
單個(gè)玩家-腳本控制器-復(fù)數(shù)的腳本容器(每一個(gè)意味著一個(gè)框)
單個(gè)NPC-腳本控制器-復(fù)數(shù)的腳本容器
單個(gè)存檔(服務(wù)端)-腳本控制器-復(fù)數(shù)的腳本容器
而1.7,我沒(méi)有具體看源碼,但你可以以此想象它是怎么樣的結(jié)構(gòu)。
函數(shù)與鉤子
在大多數(shù)人的感受中,1.8+與1.7最大的變化就是鉤子函數(shù)化了,我大概講一下到底發(fā)生了什么。
對(duì)于1.7而言,一個(gè)腳本框其實(shí)就相當(dāng)于一個(gè)大的函數(shù),當(dāng)你寫下npc,player,event,這些你不用任何額外操作就可以直接調(diào)用的變量時(shí),就相當(dāng)于調(diào)用了一個(gè)函數(shù)的參數(shù)。
我寫一段并不能執(zhí)行,但是可以反應(yīng)1.7與1.12區(qū)別的代碼:

理解了1.7的實(shí)質(zhì),你就大概可以理解1.12了
不過(guò)與1.7還有一點(diǎn)不同的是:
對(duì)于1.7而言,event是一個(gè)額外參數(shù),負(fù)責(zé)提供某個(gè)事件才能發(fā)生的特殊功能,或者取消這個(gè)發(fā)生的事件。
對(duì)于1.12而言,event是所有參數(shù)的“包裝盒”,像是1.7直接調(diào)用的npc和player,你都要通過(guò)調(diào)用event字段獲取。
另外,1.7的“函數(shù)參數(shù)”是硬命名,event你必須寫全event,player你必須寫全player,但是1.12的真函數(shù)中,參數(shù)名你是可以自己定義的,參數(shù)名沒(méi)有任何意義,它相當(dāng)于一個(gè)變量,只是指向了傳入函數(shù)的事件對(duì)象。

不過(guò)函數(shù)名必須正確,因?yàn)镃NPCmod層是根據(jù)函數(shù)名調(diào)用函數(shù),而不是其他任何東西。