【收获日2】如何撰写脚本型MOD (WIP)

0、前言
希望能让你对收获日2的LUA-MOD有初步认识。
由于我非专业,建议你把脑袋放空,按我的逻辑走。......................

1、脚本型MOD?
长这样子

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

2、如何開始
(1) 如果你属于『茶来伸手,饭来张口』,那你还是别搞吧。
(2) 大单字、基本文法要看的懂。你可以试试这个例子:
Download the Latest Release DLL, and place it in your PAYDAY 2 folder.
(3) 你需要BLT:https://superblt.znix.xyz ;(PS:现在没有理由不使用SuperBLT)
(4) 你或许也需要Beardlib:http://modwork.shop/14924
(5) Notepad++ \ Visual Studio Code 都会方便你进行撰写。
(6) 你会需要源代码参考:https://github.com/Nepgearsy/payday2-luajit



3、定义你的MOD
(1) 怎么被执行?是要在某个特定功能前执行吗?之后?用按键触发?
(2) 需要什么?你这MOD会动用到什么?特定功能?参数?资料表?
(3) 要修改什么?要覆盖什么?要显示什么?

4、实作101-' Hello World ' (按键触发)
按键触发就是当你按下特定按键,他就会执行特定脚本。
(1) 先创一个文件夹并给予以下档案(mod.txt、YEAH.lua)
(2) mod.txt:https://pastebin.com/raw/mUBZets8
(3) YEAH.lua:https://pastebin.com/raw/ZSJAfQPu
(4) 如果一切正确,那你应当可以完成。






5、实作101-解释
你通过[mod.txt]定义了一个按键脚本,并且这按键执行的是[YEAH.lua],所以當你按下這按鍵時,它就跑一次[YEAH.lua]。


6、实作101-应用
假设,我今天想要在游戏内帮开启无敌模式,且一样是按键触发
managers.player:player_unit():character_damage():set_god_mode(true)
managers.player:player_unit():character_damage():set_invulnerable(true)

7、实作101-为什么你知道是这段代码?
经验和实例。经验告诉我,游戏内的「我」可以靠
managers.player:player_unit()
取得,且伤害控制相关的属于
PlayerDamage
而它的指向是靠
character_damage()
最后,开启无敌的功能有
set_god_mode ( https://git.io/JeljN )
set_invulnerable ( https://git.io/JeljA )
所以就完成这代码。



8、实作102-覆盖
以[Lobby Tag]( http://modwork.shop/13400 )这MOD来举例
[mod.txt]

其中

顺着
lib/network/matchmaking/networkaccountsteam
去源代码找

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

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



9、实作102-解释
今天游戏启动后,程序跑啊跑,跑到
lib/network/matchmaking/networkaccountsteam
就会因为我有[Hook]而去执行那脚本
"script_path" : "LobbyTag.lua"
而由于我是整个[覆盖]新的功能给它,所以不管原有是什么样,尔后就是长这样。
這觀念相當重要,因為還有其他的修改方式
[PreHook]、[PostHook]、[Add]...

10、[PreHook]、[PostHook]...
假想,一整个[Function]是一个大框框,而它具有的运作是放在其中的小框框,那在它的运作执行前的,[PreHook],之后,[PostHook],同时,[Add],而不管哪个都是跟这大框框[Function]有关。
常見的作法是把原來的大框框全部存起來,放回去,並按照需要做各種Hook或修改答案。
用下圖說明:

我把[skill_dodge_chance]整个存到[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、总结
剩下就是编码除错、创意发想、复合混用、逻辑推展等。