本贴主要解析一下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进行修改。