rimworld的mod制作——反編譯與瘟疫槍

今天原本想講一下反編譯的。但是看到了wiki上瘟疫槍的教程,他寫(xiě)的很詳細(xì)和全面,我打算簡(jiǎn)單介紹一下他的內(nèi)容,水一篇。
github網(wǎng)址我貼不上來(lái)。大家可以在github上搜索PlagueGun。會(huì)有好多個(gè)版本。。。我也不知道哪個(gè)是正版。。。wiki上說(shuō)是名叫Jecrell編寫(xiě)的,鏈接給的是dninemfive。
dninemfive/PlagueGun: The completed mod from the tutorial (github.com)
瘟疫槍作者打算在游戲中添加一把槍?zhuān)δ苁沁@把槍射出的子彈,有概率會(huì)給目標(biāo)添加一個(gè)“瘟疫”debuff。
about目錄與def目錄的內(nèi)容我就不重復(fù)了。之前我都介紹過(guò)該怎么寫(xiě)了。有興趣大家可以自己去作者github下載。
重點(diǎn)說(shuō)一下CS,我注釋了他的代碼。代碼還是很簡(jiǎn)單的。
編譯時(shí)注意要添加對(duì)Assembly-CSharp.dll、UnityEngine.dll和UnityEngine.CoreModule.dll的引用。注意引用不要選復(fù)制本地。
下面介紹一下反編譯工具。我用的是dnSpy。
先用編輯器打開(kāi)Assembly-CSharp.dll。然后就看到了左方紅框中的內(nèi)容。然后看下方紅箭頭的地方搜索你想要的內(nèi)容,比如我這里就查找Bullet這個(gè)原始代碼類(lèi)。想看一下它干了什么。
搜索到后,在上方代碼就顯示出了impact類(lèi)。就是作者繼承改寫(xiě)的類(lèi)。

這段代碼實(shí)現(xiàn)了在 RimWorld 游戲中,彈藥撞擊一個(gè)目標(biāo)時(shí)的具體邏輯與效果。
首先,保存當(dāng)前所在地圖和位置信息。接下來(lái),調(diào)用基類(lèi)(base)的 Impact 方法,處理當(dāng)前物體與目標(biāo)之間的撞擊情況,并記錄戰(zhàn)斗日志(battleLogEntry_RangedImpact)。然后,調(diào)用 NotifyImpact 來(lái)通知游戲系統(tǒng)有一個(gè)物體發(fā)生了撞擊。
如果當(dāng)前物體撞擊到了一個(gè)有效的目標(biāo)(即非 null),則構(gòu)造傷害信息 dinfo,并將傷害應(yīng)用于目標(biāo) hitThing,在戰(zhàn)斗日志中記錄該次傷害(AssociateWithLog)。如果目標(biāo)是角色(pawn2),通知其進(jìn)入受挫狀態(tài)(stagger)。特別地,如果當(dāng)前物體存在額外傷害(extraDamages),則遍歷每個(gè)額外傷害形成的 DamageInfo 并隨機(jī)使用其中的一部分應(yīng)用于目標(biāo) hitThing。
最后,如果目標(biāo) hitThing 是角色并且滿(mǎn)足觸發(fā)條件(bulletChanceToStartFire),則可能引起角色著火。否則,如果當(dāng)前物體未被護(hù)盾攔截,則根據(jù)撞擊地面的位置、所在地圖等信息確定造成撞擊的效果和聲音,同時(shí)也可能引發(fā)地面著火。
……
……
無(wú)聊且痛苦的內(nèi)容。
