VOX_TouchSounds
0x000f3410 · 567 bytes · __cdecl
_Z15VOX_TouchSoundsR8CUtlDictIiiER10CUtlRBTreeI6ccpairiPFbRKS3_S5_E10CUtlMemoryI15UtlRBTreeNode_tIS3_iEiEEb
Decompiled
undefined (3 params)
/* VOX_TouchSounds(CUtlDict<int, int>&, CUtlRBTree<ccpair, int, bool (*)(ccpair const&, ccpair
const&), CUtlMemory<UtlRBTreeNode_t<ccpair, int>, int> >&, bool) */
void VOX_TouchSounds(CUtlDict *param_1,CUtlRBTree *param_2,bool param_3)
{
code *pcVar1;
int iVar2;
int iVar3;
undefined4 uVar4;
int in_GS_OFFSET;
char local_220 [512];
int local_20;
local_20 = *(int *)(in_GS_OFFSET + 0x14);
for (iVar2 = CUtlRBTree<CUtlMap<char_const*,int,int>::Node_t,int,CUtlMap<char_const*,int,int>::CKeyLess,CUtlMemory<UtlRBTreeNode_t<CUtlMap<char_const*,int,int>::Node_t,int>,int>>
::FirstInorder((CUtlRBTree<CUtlMap<char_const*,int,int>::Node_t,int,CUtlMap<char_const*,int,int>::CKeyLess,CUtlMemory<UtlRBTreeNode_t<CUtlMap<char_const*,int,int>::Node_t,int>,int>>
*)param_1); iVar2 != -1;
iVar2 = CUtlRBTree<CUtlMap<char_const*,int,int>::Node_t,int,CUtlMap<char_const*,int,int>::CKeyLess,CUtlMemory<UtlRBTreeNode_t<CUtlMap<char_const*,int,int>::Node_t,int>,int>>
::NextInorder((CUtlRBTree<CUtlMap<char_const*,int,int>::Node_t,int,CUtlMap<char_const*,int,int>::CKeyLess,CUtlMemory<UtlRBTreeNode_t<CUtlMap<char_const*,int,int>::Node_t,int>,int>>
*)param_1,iVar2)) {
V_snprintf(local_220,0x200,"sound/%s",
*(undefined4 *)(*(int *)(param_1 + 4) + iVar2 * 0x18 + 0x10));
iVar3 = (**(code **)(*(int *)(g_pFileSystem + 4) + 8))
(g_pFileSystem + 4,local_220,&DAT_002a3e98,0);
if (iVar3 != 0) {
(**(code **)(*(int *)(g_pFileSystem + 4) + 0xc))(g_pFileSystem + 4,iVar3);
}
}
if (param_3) {
for (iVar2 = CUtlRBTree<ccpair,int,bool(*)(ccpair_const&,ccpair_const&),CUtlMemory<UtlRBTreeNode_t<ccpair,int>,int>>
::FirstInorder((CUtlRBTree<ccpair,int,bool(*)(ccpair_const&,ccpair_const&),CUtlMemory<UtlRBTreeNode_t<ccpair,int>,int>>
*)param_2); iVar2 != -1;
iVar2 = CUtlRBTree<ccpair,int,bool(*)(ccpair_const&,ccpair_const&),CUtlMemory<UtlRBTreeNode_t<ccpair,int>,int>>
::NextInorder((CUtlRBTree<ccpair,int,bool(*)(ccpair_const&,ccpair_const&),CUtlMemory<UtlRBTreeNode_t<ccpair,int>,int>>
*)param_2,iVar2)) {
iVar3 = iVar2 * 0x310 + *(int *)(param_2 + 4);
Msg(&DAT_002a5dbc,iVar3 + 0x10,iVar3 + 0x110);
}
iVar2 = (**(code **)(*(int *)(g_pFileSystem + 4) + 8))
(g_pFileSystem + 4,"sentences.m3u",&DAT_002a5dab,&DAT_002a076d);
if (iVar2 != 0) {
for (iVar3 = CUtlRBTree<ccpair,int,bool(*)(ccpair_const&,ccpair_const&),CUtlMemory<UtlRBTreeNode_t<ccpair,int>,int>>
::FirstInorder((CUtlRBTree<ccpair,int,bool(*)(ccpair_const&,ccpair_const&),CUtlMemory<UtlRBTreeNode_t<ccpair,int>,int>>
*)param_2); iVar3 != -1;
iVar3 = CUtlRBTree<ccpair,int,bool(*)(ccpair_const&,ccpair_const&),CUtlMemory<UtlRBTreeNode_t<ccpair,int>,int>>
::NextInorder((CUtlRBTree<ccpair,int,bool(*)(ccpair_const&,ccpair_const&),CUtlMemory<UtlRBTreeNode_t<ccpair,int>,int>>
*)param_2,iVar3)) {
V_snprintf(local_220,0x200,"%s\n",iVar3 * 0x310 + *(int *)(param_2 + 4) + 0x210);
pcVar1 = *(code **)(*(int *)(g_pFileSystem + 4) + 4);
uVar4 = _V_strlen(local_220);
(*pcVar1)(g_pFileSystem + 4,local_220,uVar4,iVar2);
}
(**(code **)(*(int *)(g_pFileSystem + 4) + 0xc))(g_pFileSystem + 4,iVar2);
}
}
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
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.