CMapReslistGenerator::WriteMapLog
0x0018baa0 · 675 bytes · __thiscall
_ZN20CMapReslistGenerator11WriteMapLogEv
Decompiled
undefined (1 param)
/* CMapReslistGenerator::WriteMapLog() */
void __thiscall CMapReslistGenerator::WriteMapLog(CMapReslistGenerator *this)
{
code *pcVar1;
undefined4 uVar2;
int iVar3;
int iVar4;
char *pcVar5;
int iVar6;
int in_GS_OFFSET;
char local_1020 [4096];
int local_20;
local_20 = *(int *)(in_GS_OFFSET + 0x14);
if (this[0xa8] != (CMapReslistGenerator)0x0) {
uVar2 = CUtlString::Get((CUtlString *)(this + 0x1bc));
V_snprintf(local_1020,0x1000,"%s\\%s.lst",uVar2,this + 0xa8);
iVar3 = (**(code **)(*(int *)(g_pFileSystem + 4) + 8))
(g_pFileSystem + 4,local_1020,&DAT_002a5dab,"DEFAULT_WRITE_PATH");
if (iVar3 != 0) {
iVar6 = *(int *)(this + 0x184);
if (CUtlRBTree<CUtlString,int,bool(*)(CUtlString_const&,CUtlString_const&),CUtlMemory<UtlRBTreeNode_t<CUtlString,int>,int>>
::Links(int)::s_Sentinel == '\0') goto LAB_0018bbac;
LAB_0018bb70:
if (iVar6 == -1) goto LAB_0018bbf0;
while (iVar4 = iVar6, *(int *)(iVar6 * 0x20 + *(int *)(this + 0x178)) != -1) {
while( true ) {
if ((CUtlRBTree<CUtlString,int,bool(*)(CUtlString_const&,CUtlString_const&),CUtlMemory<UtlRBTreeNode_t<CUtlString,int>,int>>
::Links(int)::s_Sentinel == '\0') &&
(iVar6 = __cxa_guard_acquire(&CUtlRBTree<CUtlString,int,bool(*)(CUtlString_const&,CUtlString_const&),CUtlMemory<UtlRBTreeNode_t<CUtlString,int>,int>>
::Links(int)::s_Sentinel), iVar6 != 0)) {
CUtlRBTree<CUtlString,int,bool(*)(CUtlString_const&,CUtlString_const&),CUtlMemory<UtlRBTreeNode_t<CUtlString,int>,int>>
::Links(int)::s_Sentinel = -1;
DAT_003412d0 = 0xffffffff;
DAT_003412d4 = 0xffffffff;
__cxa_guard_release(&CUtlRBTree<CUtlString,int,bool(*)(CUtlString_const&,CUtlString_const&),CUtlMemory<UtlRBTreeNode_t<CUtlString,int>,int>>
::Links(int)::s_Sentinel);
}
iVar6 = CUtlRBTree<CUtlString,int,bool(*)(CUtlString_const&,CUtlString_const&),CUtlMemory<UtlRBTreeNode_t<CUtlString,int>,int>>
::Links(int)::s_Sentinel;
if (iVar4 != -1) {
iVar6 = *(int *)(iVar4 * 0x20 + *(int *)(this + 0x178));
}
if (CUtlRBTree<CUtlString,int,bool(*)(CUtlString_const&,CUtlString_const&),CUtlMemory<UtlRBTreeNode_t<CUtlString,int>,int>>
::Links(int)::s_Sentinel != '\0') goto LAB_0018bb70;
LAB_0018bbac:
iVar4 = __cxa_guard_acquire(&CUtlRBTree<CUtlString,int,bool(*)(CUtlString_const&,CUtlString_const&),CUtlMemory<UtlRBTreeNode_t<CUtlString,int>,int>>
::Links(int)::s_Sentinel);
if (iVar4 == 0) goto LAB_0018bb70;
CUtlRBTree<CUtlString,int,bool(*)(CUtlString_const&,CUtlString_const&),CUtlMemory<UtlRBTreeNode_t<CUtlString,int>,int>>
::Links(int)::s_Sentinel = -1;
DAT_003412d0 = 0xffffffff;
DAT_003412d4 = 0xffffffff;
__cxa_guard_release(&CUtlRBTree<CUtlString,int,bool(*)(CUtlString_const&,CUtlString_const&),CUtlMemory<UtlRBTreeNode_t<CUtlString,int>,int>>
::Links(int)::s_Sentinel);
if (iVar6 != -1) break;
LAB_0018bbf0:
iVar4 = iVar6;
if (CUtlRBTree<CUtlString,int,bool(*)(CUtlString_const&,CUtlString_const&),CUtlMemory<UtlRBTreeNode_t<CUtlString,int>,int>>
::Links(int)::s_Sentinel == -1) goto joined_r0x0018bc03;
}
}
joined_r0x0018bc03:
for (; iVar6 != -1;
iVar6 = CUtlRBTree<CUtlString,int,bool(*)(CUtlString_const&,CUtlString_const&),CUtlMemory<UtlRBTreeNode_t<CUtlString,int>,int>>
::NextInorder((CUtlRBTree<CUtlString,int,bool(*)(CUtlString_const&,CUtlString_const&),CUtlMemory<UtlRBTreeNode_t<CUtlString,int>,int>>
*)(this + 0x174),iVar6)) {
pcVar5 = (char *)CUtlString::Get((CUtlString *)
(iVar6 * 0x20 + *(int *)(this + 0x178) + 0x10));
(**(code **)(*(int *)(g_pFileSystem + 4) + 4))(g_pFileSystem + 4,&DAT_002cc2b5,1,iVar3);
pcVar1 = *(code **)(*(int *)(g_pFileSystem + 4) + 4);
uVar2 = _V_strlen(pcVar5);
(*pcVar1)(g_pFileSystem + 4,pcVar5,uVar2,iVar3);
(**(code **)(*(int *)(g_pFileSystem + 4) + 4))(g_pFileSystem + 4,&DAT_002af868,2,iVar3);
}
(**(code **)(*(int *)(g_pFileSystem + 4) + 0xc))(g_pFileSystem + 4,iVar3);
}
}
if (local_20 == *(int *)(in_GS_OFFSET + 0x14)) {
return;
}
/* WARNING: Subroutine does not return */
__stack_chk_fail();
}
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.