首先说明下,这个函数是写在 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 函数的更多相关文章

  1. 2.live555源码分析----服务端doEventLoop()函数分析

    上一篇博客说道,live555服务端main函数做的最后一件事就是调用如下代码陷入死循环: env->taskScheduler().doEventLoop(); // does not ret ...

  2. 前端学习 node 快速入门 系列 —— 服务端渲染

    其他章节请看: 前端学习 node 快速入门 系列 服务端渲染 在简易版 Apache一文中,我们用 node 做了一个简单的服务器,能提供静态资源访问的能力. 对于真正的网站,页面中的数据应该来自服 ...

  3. 【HLSDK系列】服务端 AddToFullPack 函数

    服务端会给客户端发送一些数据,其中两大种类数据是 clientdata_t 和 entity_state_t 这里我们说说 entity_state_t 这个结构体. 你在丢在地上的枪.C4等等是服务 ...

  4. Nacos源码系列—服务端那些事儿

    点赞再看,养成习惯,微信搜索[牧小农]关注我获取更多资讯,风里雨里,小农等你,很高兴能够成为你的朋友. 项目源码地址:公众号回复 nacos,即可免费获取源码 前言 在上节课中,我们讲解了客户端注册服 ...

  5. TCP连接建立系列 — 服务端接收ACK段(一)

      http://blog.csdn.net/zhangskd/article/details/17923917 分类: Linux TCP/IP Linux Kernel 2014-01-07 09 ...

  6. TCP连接建立系列 — 服务端接收SYN段

    本文主要分析:服务器端接收到SYN包时的处理路径. 内核版本:3.6 Author:zhangskd @ csdn blog 接收入口 1. 状态为ESTABLISHED时,用tcp_rcv_esta ...

  7. TCP连接建立系列 — 服务端接收ACK段(二)

    本文主要分析:三次握手中最后一个ACK段到达时,服务器端的处理路径. 内核版本:3.6 Author:zhangskd @ csdn blog 创建新sock 协议族相关的操作函数,我们要看的是TCP ...

  8. TCP连接建立系列 — 服务端发送SYNACK段

    本文主要分析:服务器端如何构造和发送SYNACK段. 内核版本:3.6 Author:zhangskd @ csdn blog 发送入口 tcp_v4_send_synack()用于发送SYNACK段 ...

  9. 解决有关flask-socketio中服务端和客户端回调函数callback参数的问题(全网最全)

    由于工作当中需要用的flask_socketio,所以自己学习了一下如何使用,查阅了有关文档,当看到回调函数callback的时候,发现文档里都描述的不太清楚,最后终于琢磨出来了,分享给有需要的朋友 ...

随机推荐

  1. c#获取已安装的所有NET版本

    /// <summary> /// 获取已安装的所有NET版本 /// </summary> /// <returns></returns> publi ...

  2. SPOJ 694&&SPOJ705: Distinct Substrings

    DISUBSTR - Distinct Substrings 链接 题意: 询问有多少不同的子串. 思路: 后缀数组或者SAM. 首先求出后缀数组,然后从对于一个后缀,它有n-sa[i]-1个前缀,其 ...

  3. 每日 mark

    SIGNAL=${SIGNAL:-TERM} PIDS=$(jps -lm | grep -i 'kafka\.Kafka' | awk '{print $1}')if [ -z "$PID ...

  4. [转]资深CTO:关于技术团队打造与管理的10问10答

    一.你如何衡量软件工程师个人的工作表现?如何衡量整个工程师团队的工作表现? 主要从两方面: 这个员工做的工作是不是他同意做的或者应该做的?(What) 他们是如何完成自己的工作的?(How) 任何绩效 ...

  5. 二叉树的深度<java版>

    二叉树的结构 二叉树是比较常见的一种的一种数据结构. 首先看看二叉树的数据结构: //由左节点和右节点以及一个节点值构成 public class TreeNode{ TreeNode leftNod ...

  6. POJ 1417 并查集 dp

    After having drifted about in a small boat for a couple of days, Akira Crusoe Maeda was finally cast ...

  7. oracle查询数据库所有用户信息

    看到网上说的查询用户的语句: SELECT * FROM dba_users;这句好像只能系统管理员才能成功执行,普通用户无法执行 SELECT count(*) FROM all_users; , ...

  8. Tim Cook在电话会议上宣布,Burberry前CEO Angela Ahrendts将在下周加入苹果

    在今天的第二季度财报电话会议上,苹果公司的 CEO Tim Cook 宣布 Burberry 的前 CEO Angela Ahrendts 将在下周入职苹果,出任苹果负责零售和网上商店的高级副总裁. ...

  9. 大前端-全栈-node+easyui+express+vue+es6+webpack+react

    作者声明:本博客中所写的文章,都是博主自学过程的笔记,参考了很多的学习资料,学习资料和笔记会注明出处,所有的内容都以交流学习为主.有不正确的地方,欢迎批评指正 视频来源:https://www.bil ...

  10. 第二篇-bmob云端服务器的发现

    最近认识了一个Bmob云端服务器,使用它提供的API可以轻松地完成与数据库(bmob)的交互,使开发更加专注于功能的实现. 这很方便对js的学习,完全可以利用前端三板斧来搭建一个网站,并且初步实现简单 ...