【HLSDK系列】服務端 UpdateClientData 函數
阿新 • • 發佈:2017-05-20
del 完全 dll viewmodel 代碼 lag ase mod water
首先說明下,這個函數是寫在 mp.dll 裏的。
服務器會給每個客戶端發送一些數據,其中兩大數據種類就是 clientdata_t 和 entity_state_t 這裏要說的是 clientdata_t 這個結構。
結構體 clientdata_t 是服務器發送給玩家的客戶端的一組數據,每個玩家的狀態不同,所以發送給不同玩家的客戶端的 clientdata_t 自然也不同。
我們知道玩家就是一個實體(edict_t),我們在實體的 pev 或者 CBasePlayer 裏保存了許多必要的數據,有些數據需要發送到客戶端,讓客戶端來完成某些功能。
引擎提供一個 UpdateClientData 函數讓我們可以自己生成 clientdata_t ,之後引擎就會自動把它發送到對應的客戶端。(這真是太酷了!我完全可以自己決定要發送哪些數據!)
我們可以在 mp.dll 的源碼裏找到這個函數,可以看到這樣的代碼:
void UpdateClientData(const struct edict_s *ent, int sendweapons, struct clientdata_s *cd) { entvars_t *pev = (entvars_t *)&ent->v; // ... cd->flags = pev->flags; cd->health = pev->health; cd->viewmodel = MODEL_INDEX(STRING(pev->viewmodel)); cd->waterlevel = pev->waterlevel; cd->watertype = pev->watertype; cd->weapons = pev->weapons; cd->origin = pev->origin; cd->velocity = pev->velocity; // ... }
參數 ent 是當前正在處理的玩家,參數 cd 是將要發送的 clientdata_t。我們看到他在為 clientdata_t 填充數據,之後 clientdata_t 將會被發送到這個玩家的客戶端。
說完了發送的事,我們再來看看客戶端是如何接收來自服務器的 clientdata_t 的。
你可以在 client.dll 的源碼裏找到 HUD_TxferPredictionData 這個函數,它有一個 ppcd 參數,就是來自服務器的 clientdata_t !
void DLLEXPORT HUD_TxferPredictionData ( struct entity_state_s *ps, const struct entity_state_s *pps, struct clientdata_s *pcd, const struct clientdata_s *ppcd, ... ) { // ... pcd->viewmodel = ppcd->viewmodel; // ... }
我們可以在這個函數裏取出想要的數據!
當然你也可以在 HUD_PostRunCmd 的 to 參數裏獲得它們,實際上我也推薦在這個函數裏去獲取。
【HLSDK系列】服務端 UpdateClientData 函數