CVEngineServer::EmitAmbientSound
0x0022d730 · 1382 bytes · __thiscall
_ZN14CVEngineServer16EmitAmbientSoundEiRK6VectorPKcf12soundlevel_tiif
Decompiled
undefined (9 params)
/* CVEngineServer::EmitAmbientSound(int, Vector const&, char const*, float, soundlevel_t, int, int,
float) */
void __thiscall
CVEngineServer::EmitAmbientSound
(undefined4 this,undefined4 param_1,undefined4 *param_2,byte *param_3,undefined4 param_4,
undefined4 param_6,uint param_7,undefined4 param_8,float param_9)
{
byte bVar1;
char cVar2;
int iVar3;
int iVar4;
byte *pbVar5;
int in_GS_OFFSET;
longdouble lVar6;
undefined4 local_184;
undefined4 local_180;
undefined4 local_17c;
undefined4 local_178;
undefined4 local_174;
undefined4 local_170;
undefined4 local_16c;
undefined4 local_168;
undefined4 local_164;
undefined4 local_160;
undefined4 local_15c;
float local_158;
undefined4 local_154;
undefined4 local_150;
undefined4 local_14c;
undefined4 local_148;
undefined4 local_144;
uint local_140;
int local_13c;
undefined4 local_138;
undefined4 local_134;
undefined1 local_130;
undefined1 local_12f;
undefined1 local_12e;
undefined4 local_12c;
undefined4 local_128;
undefined4 local_124;
undefined4 local_120;
undefined4 local_11c;
undefined4 local_118;
undefined4 local_114;
undefined4 local_110;
undefined4 local_10c;
undefined4 local_108;
undefined4 local_104;
undefined4 local_100;
undefined4 local_fc;
undefined4 local_f8;
undefined4 local_f4;
undefined4 local_f0;
undefined4 local_ec;
undefined4 local_e8;
undefined4 local_e4;
undefined4 local_e0;
undefined4 local_dc;
undefined1 local_d8;
undefined1 local_d7;
undefined1 local_d6;
undefined **local_d4;
undefined1 local_d0;
undefined4 local_cc;
undefined4 local_c8;
undefined4 local_c4;
undefined8 local_c0;
undefined4 local_b8;
undefined4 local_b4;
undefined8 local_b0;
undefined4 local_a8;
undefined4 local_a4;
undefined1 local_a0;
undefined8 local_9c;
undefined4 local_94;
undefined4 local_90;
undefined1 local_88;
undefined4 local_84;
undefined4 local_7c;
undefined1 local_78;
undefined4 local_74;
undefined4 local_70;
bf_write local_58 [24];
undefined1 local_40 [32];
int local_20;
local_158 = 0.0;
local_154 = 0;
local_12e = 0;
local_130 = 0;
local_20 = *(int *)(in_GS_OFFSET + 0x14);
local_178 = 0;
local_14c = param_1;
local_15c = param_4;
local_140 = param_7;
local_138 = 0xffffffff;
local_134 = param_6;
local_148 = 6;
local_13c = 0;
local_150 = 0;
local_160 = 0;
local_174 = 0;
local_170 = 0;
local_16c = 0;
local_168 = 0;
local_164 = 0;
local_144 = param_8;
local_184 = *param_2;
local_12f = 1;
local_180 = param_2[1];
local_17c = param_2[2];
pbVar5 = param_3;
if (param_9 != 0.0) {
lVar6 = (longdouble)CBaseServer::GetTime((CBaseServer *)&sv);
local_140 = local_140 | 0x10;
local_158 = param_9 - (float)lVar6;
}
LAB_0022d840:
bVar1 = *pbVar5;
if ((bVar1 & 0xfd) == 0x21) {
LAB_0022d8a8:
if (bVar1 != 0x21) goto LAB_0022d8ac;
local_130 = 1;
for (pbVar5 = param_3;
(((bVar1 = *pbVar5, bVar1 == 0x21 || ((byte)(bVar1 - 0x23) < 2)) ||
((byte)(bVar1 - 0x28) < 3)) ||
((((byte)(bVar1 - 0x3e) < 3 || (bVar1 == 0x3c)) || ((bVar1 == 0x5e || (bVar1 == 0x7d))))));
pbVar5 = pbVar5 + 1) {
}
iVar3 = V_atoi((char *)pbVar5);
local_13c = iVar3;
iVar4 = VOX_SentenceCount();
if (iVar4 <= iVar3) {
for (; ((bVar1 = *param_3, bVar1 == 0x21 || ((byte)(bVar1 - 0x23) < 2)) ||
(((byte)(bVar1 - 0x28) < 3 ||
(((((byte)(bVar1 - 0x3e) < 3 || (bVar1 == 0x3c)) || (bVar1 == 0x5e)) ||
(bVar1 == 0x7d)))))); param_3 = param_3 + 1) {
}
ConMsg("EmitAmbientSound: invalid sentence number: %s",param_3);
goto LAB_0022d9e6;
}
goto LAB_0022d92c;
}
if ((byte)(bVar1 - 0x28) < 3) {
LAB_0022d8ac:
pbVar5 = pbVar5 + 1;
goto LAB_0022d840;
}
if (((byte)(bVar1 - 0x3e) < 3) || (bVar1 == 0x3c)) goto LAB_0022d8a8;
if (((bVar1 == 0x5e) || (bVar1 == 0x7d)) || (bVar1 == 0x24)) goto LAB_0022d8ac;
local_130 = 0;
local_13c = SV_SoundIndex((char *)param_3);
if (local_13c < 1) {
ConMsg("EmitAmbientSound: sound note precached: %s\n",param_3);
}
else {
LAB_0022d92c:
if ((param_7 & 8) != 0) {
if (DAT_003b8184 != '\0') {
local_c8 = 0;
local_c0 = 0;
local_b0 = 0;
local_9c = 0;
local_c4 = 0;
local_b8 = 0;
local_b4 = 0;
local_a8 = 0;
local_a4 = 0;
local_a0 = 0;
local_94 = 0;
local_90 = 0;
local_d0 = 1;
local_cc = 0;
local_d4 = &PTR__SVC_Sounds_002a1dc8;
local_78 = 0;
local_7c = 0;
local_74 = 0xffffffff;
local_70 = 0;
bf_write::bf_write(local_58);
bf_write::StartWriting(local_58,local_40,0x20,0,-1);
local_84 = 1;
local_88 = 1;
local_100 = 0;
local_fc = 0;
local_104 = 0x3f800000;
local_dc = 0x4b;
local_ec = 100;
local_f4 = 0;
local_e0 = 0xffffffff;
local_f0 = 6;
local_e4 = 0;
local_e8 = 0;
local_f8 = 0;
local_108 = 0;
local_d6 = 0;
local_d8 = 0;
local_d7 = 0;
local_12c = 0;
local_128 = 0;
local_124 = 0;
local_120 = 0;
local_11c = 0;
local_118 = 0;
local_114 = 0;
local_110 = 0;
local_10c = 0;
lVar6 = (longdouble)CBaseServer::GetFinalTickTime((CBaseServer *)&sv);
SoundInfo_t::WriteDelta
((SoundInfo_t *)&local_184,(SoundInfo_t *)&local_12c,local_58,(float)lVar6);
cVar2 = SVC_Sounds::WriteToBuffer((SVC_Sounds *)&local_d4,(bf_write *)&DAT_003b8034);
if (cVar2 == '\0') {
Sys_Error("EmitAmbientSound: Init message would overflow signon buffer!\n");
}
goto LAB_0022d9e6;
}
DevMsg("EmitAmbientSound: warning, broadcasting sound labled as SND_SPAWNING.\n");
}
CEngineRecipientFilter::CEngineRecipientFilter((CEngineRecipientFilter *)&local_d4);
/* try { // try from 0022d946 to 0022d96c has its CatchHandler @ 0022dcb6 */
CEngineRecipientFilter::AddAllPlayers((CEngineRecipientFilter *)&local_d4);
CEngineRecipientFilter::MakeReliable((CEngineRecipientFilter *)&local_d4);
CGameServer::BroadcastSound
((CGameServer *)&sv,(SoundInfo_t *)&local_184,(IRecipientFilter *)&local_d4);
local_d4 = &PTR__CEngineRecipientFilter_002ae5c8;
local_c0 = (ulonglong)local_c0._4_4_ << 0x20;
CUtlMemory<int,int>::Purge((CUtlMemory<int,int> *)&local_cc);
local_c0 = CONCAT44(local_cc,(undefined4)local_c0);
CUtlMemory<int,int>::Purge((CUtlMemory<int,int> *)&local_cc);
}
LAB_0022d9e6:
if (local_20 != *(int *)(in_GS_OFFSET + 0x14)) {
/* WARNING: Subroutine does not return */
__stack_chk_fail();
}
return;
}
SourceMod gamedata
paste intoaddons/sourcemod/gamedata/<your_plugin>.txt
used as the SourceMod key — change to fit your plugin's convention
SourceMod library name (server / engine / matchmaking)
Just a Signatures{} block, ready to drop into a gamedata
file. Wire it up in your plugin however you like - SDKCall, DHooks,
raw memory ops, or anything else.
Signatures + Functions block. The plugin uses
DHookCreateFromConf - DHooks reads return type, this-type,
calling convention, and argument types straight from the gamedata. Less
boilerplate in the plugin, types travel with the gamedata.
Gamedata KeyValues
DHooks plugin example
Type inference is best-effort from the C signature - sanity-check the DHooks types before shipping.