【CS2】soundevent的参数控制机制

samyyc 一级用户组 1天前 87

本贴主要解析一下CS2的soundevents参数(音量等等)是如何控制的

首先soundevents通过netmessage进行发送,主要通过以下几个包(在 gameevents.proto 内定义)

首先 soundevent_hash 是 soundevent 名经过hash过后的数值,似乎是一个哈希表的索引,但是我没有找到这个哈希表,具体计算方式是种子为 0x53524332 的murmurhash2算法。

其中 packed_params 字段是存储编码后参数的地方,可以看到是bytes数据类型,经过我一段时间的逆向之后进行得到了一个大致的编码结构。

packed_params是可以同时编码多个参数的,这里对单个参数进行分析。

这是一段真实的编码字节样例,这里按颜色进行分类,逐一解析。

红色的 E9 54 60 BD :将其倒转后为BD6054E9,是参数名通过种子为0x31415926的murmurhash2编码后的结果,这里的参数名是public.volume(音量),与之类似的还有public.pitch,public.position,这些可以在vsndevts文件中找到

 

蓝色的 08 :数据类型,08似乎代表单float,根据github上残存的逆向strings可以找到以下几种数据类型:

void CSosFieldDataBool::Init()
void CSosFieldDataFloat2::Init()
void CSosFieldDataFloat3::Init()
void CSosFieldDataFloat4::Init()
void CSosFieldDataFloat6::Init()
void CSosFieldDataFloat::Init()
void CSosFieldDataFloatMaxSpeakers::Init()
void CSosFieldDataInt::Init()
void CSosFieldDataString::Init()
void CSosFieldDataToken::Init()
void CSosFieldDataUInt64::Init()
void CSosFieldDataVsnd::Init()

但是这个结构体在现在的cs2中已经被内联,只能在某些函数内找到残存的构造方式,无法精确的获得数据类型与编码数字的对应关系

 

黄色的 04 :代表数据区的长度(后面的绿色部分),一个float四个字节所以是04

灰色的 00 :填充,无实义

绿色的 00 00 00 3F :数据区,这里是float类型,倒转后3F000000代表0.5f

 

再看一个例子:

这个packed_params编码了两个参数,这里的第一个参数是public.position,数据类型变成了0A,代表三个float(一个三维坐标),对应的数据区长度变成了0C(12个字节)

 

了解以上内容可以帮助你对插件或者原版的soundevents进行修改。


CSGO插件分享-申明 1、本网站名称:CSGO插件分享-中文站  网址:https://bbs.csgocn.net
2、本站的宗旨在于为CSGO玩家提供一个插件分享的中文资源平台,多数插件来源于SourceMod论坛,并配以中文介绍和安装教程。
3、欢迎有能力的朋友共享有趣的CSGO插件资源。
4、本站资源大多为百度网盘,如发现链接失效,可以点: 这里进行反馈,我们会第一时间更新。
最新回复 (3)
  • 我不当学长 管理员组@Ta 1天前 0
    引用 2
    花神贴需要拜读一下
  • 我不当学长 管理员组@Ta 1天前 0
    引用 3

    用addr2line,不知道是否可以定位inline的函数内容

    addr2line -fpiC <.so> <address>

    addr2line 用法

    -a --addresses:在函数名、文件和行号信息之前,显示地址,以十六进制形式。

    -b --target=:指定目标文件的格式为bfdname。

    -e --exe=:指定需要转换地址的可执行文件名。

    -i --inlines : 如果需要转换的地址是一个内联函数,则输出的信息包括其最近范围内的一个非内联函数的信息。

    -j --section=:给出的地址代表指定section的偏移,而非绝对地址。

    -p --pretty-print:使得该函数的输出信息更加人性化:每一个地址的信息占一行。

    -s --basenames:仅仅显示每个文件名的基址(即不显示文件的具体路径,只显示文件名)。

    -f --functions:在显示文件名、行号输出信息的同时显示函数名信息。

    -C --demangle[=style]:将低级别的符号名解码为用户级别的名字。

    -h --help:输出帮助信息。

    -v --version:输出版本号。

    不过v社已经strip了so的symbol了,估计悬

  • KodPlay 赞助用户组@Ta 1天前 0
    引用 4
    学习一下
返回