1. 程式人生 > >【HLSDK系列】服務端 UpdateClientData 函數

【HLSDK系列】服務端 UpdateClientData 函數

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 函數