【收獲日2】如何撰寫腳本型MOD (WIP)

0、前言
希望能讓你對(duì)收獲日2的LUA-MOD有初步認(rèn)識(shí)。
由于我非專業(yè),建議你把腦袋放空,按我的邏輯走。......................

1、腳本型MOD?
長(zhǎng)這樣子

https://github.com/segabl/pd2-third-person/blob/master/thirdperson.lua

2、如何開始
(1) 如果你屬于『茶來伸手,飯來張口』,那你還是別搞吧。
(2) 大單字、基本文法要看的懂。你可以試試這個(gè)例子:
Download the?Latest Release DLL, and place it in your PAYDAY 2 folder.
(3)?你需要BLT:https://superblt.znix.xyz ;(PS:現(xiàn)在沒有理由不使用SuperBLT)
(4)?你或許也需要Beardlib:http://modwork.shop/14924
(5)?Notepad++ \?Visual Studio Code?都會(huì)方便你進(jìn)行撰寫。
(6)?你會(huì)需要源代碼參考:https://github.com/Nepgearsy/payday2-luajit



3、定義你的MOD
(1)?怎么被執(zhí)行?是要在某個(gè)特定功能前執(zhí)行嗎?之后?用按鍵觸發(fā)?
(2)?需要什么?你這MOD會(huì)動(dòng)用到什么?特定功能?參數(shù)?資料表?
(3)?要修改什么?要覆蓋什么?要顯示什么?

4、實(shí)作101-' Hello World ' (按鍵觸發(fā))
按鍵觸發(fā)就是當(dāng)你按下特定按鍵,他就會(huì)執(zhí)行特定腳本。
(1) 先創(chuàng)一個(gè)文件夾并給予以下檔案(mod.txt、YEAH.lua)
(2) mod.txt:https://pastebin.com/raw/mUBZets8
(3) YEAH.lua:https://pastebin.com/raw/ZSJAfQPu
(4)?如果一切正確,那你應(yīng)當(dāng)可以完成。






5、實(shí)作101-解釋
你通過[mod.txt]定義了一個(gè)按鍵腳本,并且這按鍵執(zhí)行的是[YEAH.lua],所以當(dāng)你按下這按鍵時(shí),它就跑一次[YEAH.lua]。


6、實(shí)作101-應(yīng)用
假設(shè),我今天想要在游戲內(nèi)幫開啟無敵模式,且一樣是按鍵觸發(fā)
managers.player:player_unit():character_damage():set_god_mode(true)
managers.player:player_unit():character_damage():set_invulnerable(true)

7、實(shí)作101-為什么你知道是這段代碼?
經(jīng)驗(yàn)和實(shí)例。經(jīng)驗(yàn)告訴我,游戲內(nèi)的「我」可以靠
managers.player:player_unit()
取得,且傷害控制相關(guān)的屬于
PlayerDamage
而它的指向是靠
character_damage()
最后,開啟無敵的功能有
set_god_mode?。?https://git.io/JeljN )
set_invulnerable?。?https://git.io/JeljA )
所以就完成這代碼。



8、實(shí)作102-覆蓋
以[Lobby Tag]( http://modwork.shop/13400 )這MOD來舉例
[mod.txt]

其中

順著
lib/network/matchmaking/networkaccountsteam
去源代碼找

那MOD做了些什么?
[LobbyTag.lua]

總之,就是修改了返回的答案
return "[" .. lobbyTag .. "] " .. Steam:username()
那我們可不可以自己亂改



9、實(shí)作102-解釋
今天游戲啟動(dòng)后,程序跑啊跑,跑到
lib/network/matchmaking/networkaccountsteam
就會(huì)因?yàn)槲矣校跦ook]而去執(zhí)行那腳本
"script_path" : "LobbyTag.lua"
而由于我是整個(gè)[覆蓋]新的功能給它,所以不管原有是什么樣,爾后就是長(zhǎng)這樣。
這觀念相當(dāng)重要,因?yàn)檫€有其他的修改方式
[PreHook]、[PostHook]、[Add]...

10、[PreHook]、[PostHook]...
假想,一整個(gè)[Function]是一個(gè)大框框,而它具有的運(yùn)作是放在其中的小框框,那在它的運(yùn)作執(zhí)行前的,[PreHook],之后,[PostHook],同時(shí),[Add],而不管哪個(gè)都是跟這大框框[Function]有關(guān)。
常見的作法是把原來的大框框全部存起來,放回去,並按照需要做各種Hook或修改答案。
用下圖說明:

我把[skill_dodge_chance]整個(gè)存到[AABC],
所以[AABC]有[skill_dodge_chance]的功能
y = f(x) = x + 1
然后放回[skill_dodge_chance]或重新定義它
f(x) = y where y = x + 1
為什么要這么做?
[AABC]有[skill_dodge_chance]的功能





99、總結(jié)
剩下就是編碼除錯(cuò)、創(chuàng)意發(fā)想、復(fù)合混用、邏輯推展等。