【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 参数里获得它们,实际上我也推荐在这个函数里去获取。
【HLSDK系列】服务端 UpdateClientData 函数的更多相关文章
- 2.live555源码分析----服务端doEventLoop()函数分析
上一篇博客说道,live555服务端main函数做的最后一件事就是调用如下代码陷入死循环: env->taskScheduler().doEventLoop(); // does not ret ...
- 前端学习 node 快速入门 系列 —— 服务端渲染
其他章节请看: 前端学习 node 快速入门 系列 服务端渲染 在简易版 Apache一文中,我们用 node 做了一个简单的服务器,能提供静态资源访问的能力. 对于真正的网站,页面中的数据应该来自服 ...
- 【HLSDK系列】服务端 AddToFullPack 函数
服务端会给客户端发送一些数据,其中两大种类数据是 clientdata_t 和 entity_state_t 这里我们说说 entity_state_t 这个结构体. 你在丢在地上的枪.C4等等是服务 ...
- Nacos源码系列—服务端那些事儿
点赞再看,养成习惯,微信搜索[牧小农]关注我获取更多资讯,风里雨里,小农等你,很高兴能够成为你的朋友. 项目源码地址:公众号回复 nacos,即可免费获取源码 前言 在上节课中,我们讲解了客户端注册服 ...
- TCP连接建立系列 — 服务端接收ACK段(一)
http://blog.csdn.net/zhangskd/article/details/17923917 分类: Linux TCP/IP Linux Kernel 2014-01-07 09 ...
- TCP连接建立系列 — 服务端接收SYN段
本文主要分析:服务器端接收到SYN包时的处理路径. 内核版本:3.6 Author:zhangskd @ csdn blog 接收入口 1. 状态为ESTABLISHED时,用tcp_rcv_esta ...
- TCP连接建立系列 — 服务端接收ACK段(二)
本文主要分析:三次握手中最后一个ACK段到达时,服务器端的处理路径. 内核版本:3.6 Author:zhangskd @ csdn blog 创建新sock 协议族相关的操作函数,我们要看的是TCP ...
- TCP连接建立系列 — 服务端发送SYNACK段
本文主要分析:服务器端如何构造和发送SYNACK段. 内核版本:3.6 Author:zhangskd @ csdn blog 发送入口 tcp_v4_send_synack()用于发送SYNACK段 ...
- 解决有关flask-socketio中服务端和客户端回调函数callback参数的问题(全网最全)
由于工作当中需要用的flask_socketio,所以自己学习了一下如何使用,查阅了有关文档,当看到回调函数callback的时候,发现文档里都描述的不太清楚,最后终于琢磨出来了,分享给有需要的朋友 ...
随机推荐
- 考研编程练习---StringMatching(后缀表达式)
题目描述: Finding all occurrences of a pattern in a text is a problem that arises frequently in text-edi ...
- python 多线程笔记(6)-- 闭包
在类里弄一个闭包出来 很多资料上说,类内部的变量有两种. 按定义所在的位置,分__init__上方的和__init__下方的 按内存所在的位置,分类的和实例的,或者说公共的和私有的 现在,我想在类里定 ...
- 经典教程|10 分钟速成 Python3
Python 是由吉多·范罗苏姆(Guido Van Rossum)在 90 年代早期设计. 它是如今最常用的编程语言之一.它的语法简洁且优美,几乎就是可执行的伪代码. 注意:这篇教程是基于 Pyth ...
- 【MySQL解惑笔记】Mysql5.7.x无法开启二进制日志
一.开启二进制日志 1)未开启二进制日志之前: mysql> show variables like 'log_bin'; +---------------+-------+ | Variabl ...
- sql脚本创建用户角色权限表
/******************************************/ /* 名称:权限管理 */ /* 编写日期:2010.5.20 */ /* 开发者:dangqinghua * ...
- 每天一个linux命令集
linux命令汇总,装载来自: http://www.cnblogs.com/peida/category/309012.html
- python2/3 发送https请求时,告警关闭方法
问题: 使用Python3 requests发送HTTPS请求,已经关闭认证(verify=False)情况下,控制台会输出以下错误: InsecureRequestWarning: Unverifi ...
- BVT、EVT、DVT、PVT产品开发几个阶段
EVT EVT(Engineering Verification Test) 工程验证 产品开发初期的设计验证.设计者实现样品时做初期的测试验证,包括 功能和安规测试,一般由 RD(Researc ...
- 一个网页从输入URL到页面加载完的过程
过程概述 1.浏览器查找域名对应的IP地址 2.浏览器根据IP地址与服务器建立socket连接 3.浏览器与服务器通信:浏览器请求,服务器处理请求和响应 4.浏览器与服务器断开连接 具体过程 1.搜索 ...
- USACO 2.3.3 Zero Sum 和为零(深搜枚举)
Description 请考虑一个由1到N(N=3, 4, 5 ... 9)的数字组成的递增数列:1 2 3 ... N. 现在请在数列中插入“+”表示加,或者“-”表示减,抑或是“ ”表示空白,来将 ...