SV_StartSound
0x001ff500 · 884 bytes · __cdecl
_Z13SV_StartSoundR16IRecipientFilterP7edict_tiPKcf12soundlevel_tiiPK6VectorfiP10CUtlVectorIS6_10CUtlMemoryIS6_iEE
Decompiled
undefined (12 params)
/* WARNING: Globals starting with '_' overlap smaller symbols at the same address */
/* SV_StartSound(IRecipientFilter&, edict_t*, int, char const*, float, soundlevel_t, int, int,
Vector const*, float, int, CUtlVector<Vector, CUtlMemory<Vector, int> >*) */
void SV_StartSound(IRecipientFilter *param_1,edict_t *param_2,undefined4 param_3,byte *param_4,
undefined4 param_5,undefined4 param_6,uint param_7,undefined4 param_8,
undefined4 *param_9,float param_10,undefined4 param_11,
CUtlVector<Vector,CUtlMemory<Vector,int>> *param_12)
{
byte bVar1;
int *piVar2;
int iVar3;
int iVar4;
ICollideable *pIVar5;
byte *pbVar6;
longdouble lVar7;
undefined4 local_74;
undefined4 local_70;
undefined4 local_6c;
undefined4 local_68;
undefined4 local_64;
undefined4 local_60;
undefined4 local_5c;
undefined4 local_58;
undefined4 local_54;
undefined4 local_50;
undefined4 local_4c;
float local_48;
float local_44;
undefined4 local_40;
undefined4 local_3c;
undefined4 local_38;
undefined4 local_34;
uint local_30;
int local_2c;
undefined4 local_28;
undefined4 local_24;
undefined1 local_20;
undefined1 local_1f;
undefined1 local_1e;
local_48 = 0.0;
local_44 = 0.0;
local_4c = 0x3f800000;
local_24 = 0x4b;
local_34 = 100;
local_3c = 0;
local_28 = 0xffffffff;
local_38 = 6;
local_2c = 0;
local_30 = 0;
local_40 = 0;
local_50 = 0;
local_1e = 0;
local_20 = 0;
local_1f = 0;
local_74 = 0;
local_70 = 0;
local_6c = 0;
local_68 = 0;
local_64 = 0;
local_60 = 0;
local_5c = 0;
local_58 = 0;
local_54 = 0;
if (param_2 == (edict_t *)0x0) {
local_38 = param_3;
local_4c = param_5;
local_24 = param_6;
local_30 = param_7;
local_34 = param_8;
local_28 = param_11;
if (param_9 == (undefined4 *)0x0) goto LAB_001ff617;
}
else {
local_3c = NUM_FOR_EDICT(param_2);
local_4c = param_5;
local_38 = param_3;
local_24 = param_6;
local_30 = param_7;
local_34 = param_8;
local_28 = param_11;
if (param_9 == (undefined4 *)0x0) {
if ((((byte)*param_2 & 4) != 0) && (piVar2 = *(int **)(param_2 + 0xc), piVar2 != (int *)0x0))
{
pIVar5 = (ICollideable *)(**(code **)(*piVar2 + 0x10))(piVar2);
CM_WorldSpaceCenter(pIVar5,(Vector *)&local_74);
}
goto LAB_001ff617;
}
}
local_24 = param_6;
local_28 = param_11;
local_30 = param_7;
local_34 = param_8;
local_38 = param_3;
local_4c = param_5;
local_74 = *param_9;
local_70 = param_9[1];
local_6c = param_9[2];
LAB_001ff617:
if (param_12 != (CUtlVector<Vector,CUtlMemory<Vector,int>> *)0x0) {
CUtlVector<Vector,CUtlMemory<Vector,int>>::InsertBefore
(param_12,*(int *)(param_12 + 0xc),(Vector *)&local_74);
}
if (param_10 != 0.0) {
param_10 = _DAT_003b806c + param_10;
lVar7 = (longdouble)CBaseServer::GetFinalTickTime((CBaseServer *)&sv);
local_44 = (float)lVar7;
lVar7 = (longdouble)CBaseServer::GetFinalTickTime((CBaseServer *)&sv);
local_30 = local_30 | 0x10;
local_48 = param_10 - (float)lVar7;
}
pbVar6 = param_4;
if (param_4 == (byte *)0x0) {
LAB_001ff688:
local_20 = 0;
local_2c = CGameServer::LookupSoundIndex((CGameServer *)&sv,(char *)param_4);
if ((local_2c == 0) || (iVar4 = CGameServer::GetSound((CGameServer *)&sv,local_2c), iVar4 == 0))
{
ConMsg("SV_StartSound: %s not precached (%d)\n",param_4,local_2c);
return;
}
LAB_001ff7a0:
CGameServer::BroadcastSound((CGameServer *)&sv,(SoundInfo_t *)&local_74,param_1);
return;
}
do {
bVar1 = *pbVar6;
if ((bVar1 & 0xfd) == 0x21) {
LAB_001ff6c8:
if (bVar1 == 0x21) {
local_20 = 1;
for (pbVar6 = param_4;
((((bVar1 = *pbVar6, bVar1 == 0x21 || ((byte)(bVar1 - 0x23) < 2)) ||
((byte)(bVar1 - 0x28) < 3)) || (((byte)(bVar1 - 0x3e) < 3 || (bVar1 == 0x3c)))) ||
((bVar1 == 0x5e || (bVar1 == 0x7d)))); pbVar6 = pbVar6 + 1) {
}
iVar4 = V_atoi((char *)pbVar6);
local_2c = iVar4;
iVar3 = VOX_SentenceCount();
if (iVar3 <= iVar4) {
for (; (((bVar1 = *param_4, bVar1 == 0x21 || ((byte)(bVar1 - 0x23) < 2)) ||
(((byte)(bVar1 - 0x28) < 3 ||
((((byte)(bVar1 - 0x3e) < 3 || (bVar1 == 0x3c)) || (bVar1 == 0x5e)))))) ||
(bVar1 == 0x7d)); param_4 = param_4 + 1) {
}
ConMsg("SV_StartSound: invalid sentence number: %s",param_4);
return;
}
goto LAB_001ff7a0;
}
}
else if (2 < (byte)(bVar1 - 0x28)) {
if (((byte)(bVar1 - 0x3e) < 3) || (bVar1 == 0x3c)) goto LAB_001ff6c8;
if (((bVar1 != 0x5e) && (bVar1 != 0x7d)) && (bVar1 != 0x24)) goto LAB_001ff688;
}
pbVar6 = pbVar6 + 1;
} while( true );
}
SourceMod gamedata
paste intoaddons/sourcemod/gamedata/<your_plugin>.txt
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.
Type inference is best-effort from the C signature - sanity-check the DHooks types before shipping.