Gmod lua插件(Dishonored_Jump)解析
版本1.1
這個插件比較簡單,主要是如何利用gmod事件編寫。
首先是Gmod wiki連接:https://wiki.facepunch.com/gmod/
搜索hook就能找到這些事件。
第二,可以用vscode編輯gmod lua文件,vscode 有g(shù)mod lua插件,比較方便

二段跳:在地面上按住空格鍵0.3s觸發(fā)二段跳
玩家按鍵按下和彈起事件


利用hook.add(事件名,功能名,函數(shù))添加事件的功能,函數(shù)可以像是下面這樣的匿名函數(shù)

hook.Remove(事件名,功能名)可以移除添加的功能。
以上代碼就能獲取玩家的跳躍鍵狀態(tài),如果說起跳時在地上,那么創(chuàng)建一個0.3s的定時器,定時器到期后判斷跳躍鍵是否按下,如果滿足條件就給玩家加個向上的速度。
timer. Create(名字,時長?, 執(zhí)行次數(shù),?函數(shù))

這樣就實現(xiàn)了二段跳。
有些需要注意的:
1、某些函數(shù)只能在服務(wù)器端實現(xiàn)(也就是在lua/autorun/server/下或者用lua_openscript打開),比如設(shè)置速度。
2、設(shè)置速度與獲取速度似乎不對等,需要乘上一個系數(shù)
視角晃動功能:落地時視角晃動
在恥辱中,玩家掉到地上的話,視角會像果凍或者說彈簧那樣晃動。這里用帶阻尼的彈簧去模擬,視角的晃動量可以用數(shù)值法或符號法解

撞擊地面事件:

設(shè)置站立時視角偏移和設(shè)置當(dāng)前視角偏移:


這兩個比較奇怪,站立時,第一個似乎只對Z方向偏移啟作用,第二個只對XY方向啟作用,
蹲下時,第二個對XYZ都起作用,第一個可能對XY方向其作用,兩個可能需要結(jié)合著用。
再對晃動程度做個限制,直接限制初始條件的速度就行。

這樣就實現(xiàn)了視角晃動。
一些常數(shù):
?1、默認(rèn)站立視角偏移(0,0,64)
?2、默認(rèn)蹲下視角偏移(0,0,28)
攀爬功能:
這里用TraceLine來判斷,相當(dāng)于射出一條線,然后返回線碰到的位置和法向量。

那這任務(wù)相當(dāng)于做一個避障判斷,我不擅長這個,所以這插件BUG比較多。
這個事件每tick一次:

這里8個tick檢測一次。
檢測
首先是水平掃描,在玩家位置創(chuàng)建一組間隔均勻、長度50左右的探測器

蹲著能通過的最大高度為36,為了不錯過這個窗口,所以間隔為36的一半,當(dāng)有探測器碰到了并且法向量Z值小于cos(45°),45°是能站穩(wěn)的平面最小角度,這說明可能碰到障礙物,延長其他探測器以獲得更多信息。
根據(jù)探測器的結(jié)果來判斷哪個高度可能有可通行的路徑,這里這樣判斷,上個與下個水平距離至少拉開10且不能再同一平面,防止以下情況。


通過后,再檢測一下上面,由于沒有準(zhǔn)確的障礙物高度,所以大概判斷一下,縫隙別太小就行

通過后利用二分法來搜索落腳點,實際上游戲環(huán)境比較復(fù)雜,而寥寥幾次的Traceline信息量有限,所以必須做一些假設(shè)。
比較常見的障礙物形狀差不多這樣:

假設(shè)在障礙物上能找到個點將梯度符號給分割開來,然后類似找極值,對落腳點要求是能站住,并且高度也有一定要求,這樣就比較簡單了。


再列舉一些情況,減少BUG

找到落腳點后再大致判斷一下這個點會不會卡住。


落腳點判斷完成了,做個拋物線插值到落腳點就可以了。


如果說檢測是在客戶端跑的,那就需要與服務(wù)器通信,比如說客戶端發(fā)個定位,讓服務(wù)器將玩家移動到那:
客戶端:

服務(wù)器端:

類似用hook.add添加事件
創(chuàng)建菜單和控制臺變量:
CreateConVar:創(chuàng)建控制臺變量,如果已有就返回那個變量
第一個參數(shù)是名字,第二是默認(rèn)值
FCVAR那些是變量的特性,wiki中可以查到


Utilities是指添加到“設(shè)置”里

進度條、復(fù)選框之類得指定調(diào)節(jié)剛才創(chuàng)建的控制臺變量
