首先说明下,这个函数是写在 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. iOS 的音频播放

    一.Audio Toolbox 1.使用代码 #import <AudioToolbox/AudioToolbox.h> AudioServicesPlaySystemSound(1106 ...

  2. cogs1439 货车运输

    cogs1439 货车运输 一道傻逼板子题. 边一定在最大生成树上,这个可以用消圈证明 然后kruskal跑一遍再搜一遍再建ST表再跑LCA这题就做完了. RT PS.交上去的代码把Kruskal打成 ...

  3. autoreleasepool 自动释放池的理解

    常见的面试题:以下代码存在什么样的问题?应该如何改进? for (int i = 0; i < 100000; i++) { NSString *str = @"abc"; ...

  4. Java 注解 初探 (一)

    自JDK1.5之后,就开始出现注解.想要了解注解的来源和注解的用法,通过搜索引擎大都是针对某一个注解的解释,很难找到关于注解系列的文章,便自己看下. 基于Annotation的注释,说明Annotai ...

  5. 英特尔® 实感™ 摄像头 (F200) 应用如何实现最佳用户体验

    英特尔开发人员专区原文 由于视频不能直接嵌入, 请点击视频标题观看.谢谢. 英特尔® 实感™ 技术支持我们重新定义如何与计算设备交互,包括允许用户通过手势自然交互. 为了帮助大家了解使用英特尔® 实感 ...

  6. mybatis 加载配置文件的方法

    一.  使用sqlSessionFactory 的 mapperLocations 进行加载 <!-- SessionFactory --> <bean id="sqlSe ...

  7. XSS留言板实现

    XSS 留言板实现-笔记 预备知识 XSS漏洞 XSS攻击全称跨站脚本攻击,是为不和层叠样式表(Cascading Style Sheets, CSS)的缩写混淆,故将跨站脚本攻击缩写为XSS,XSS ...

  8. python常用快捷键

    最重要的快捷键1. ctrl+shift+A:万能命令行2. shift两次:查看资源文件 新建工程第一步操作1. module设置把空包分层去掉,compact empty middle packa ...

  9. JPA error org.hibernate.AnnotationException: No identifier specified for entity

    错误:org.hibernate.AnnotationException: No identifier specified for entity 原因:JPA所使用的Entity需要标注@Id,在引用 ...

  10. 17 Tips For Writing An Excellent Email Subject Line

    Out of the billions of emails that are sent every day, how can you make sure that yours stands out? ...