L L4D2node

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 into addons/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.



        

        

          

Type inference is best-effort from the C signature - sanity-check the DHooks types before shipping.

Return-type handling cheatsheet (DHookReturn)