• 【HLSDK系列】服务端 UpdateClientData 函数


    首先说明下,这个函数是写在 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 参数里获得它们,实际上我也推荐在这个函数里去获取。

  • 相关阅读:
    Spark Streaming(一)
    ACID
    SparkSQL
    scala样例类
    centos7 防火墙有关命令
    HBase优化
    scp
    HBase与Hive
    HBase与MapReduce交互
    Hadoop安全模式
  • 原文地址:https://www.cnblogs.com/crsky/p/6881005.html
Copyright © 2020-2023  润新知