L L4D2node

CCvarUtilities::CvarList

0x001298a0 · 2352 bytes · __thiscall

_ZN14CCvarUtilities8CvarListERK8CCommand

Decompiled

undefined (2 params)

/* CCvarUtilities::CvarList(CCommand const&) */

void __thiscall CCvarUtilities::CvarList(CCvarUtilities *this,CCommand *param_1)

{
  ushort *puVar1;
  float fVar2;
  int *piVar3;
  code *pcVar4;
  bool bVar5;
  char cVar6;
  ushort uVar7;
  int iVar8;
  undefined1 *puVar9;
  int *piVar10;
  ConCommandBase *pCVar11;
  undefined4 uVar12;
  undefined4 uVar13;
  int extraout_ECX;
  int extraout_ECX_00;
  int extraout_ECX_01;
  int extraout_ECX_02;
  char *pcVar14;
  undefined **ppuVar15;
  ushort uVar16;
  int iVar17;
  int in_GS_OFFSET;
  int local_d64;
  char *local_d60;
  ConCommandBase *local_d40;
  code *local_d3c;
  int local_d38;
  int local_d34;
  undefined4 local_d30;
  undefined2 local_d2c;
  ushort local_d2a;
  ushort local_d28;
  ushort local_d26;
  undefined4 local_d24;
  char local_d20 [32];
  char local_d00 [32];
  char local_ce0 [64];
  char local_ca0 [64];
  char local_c60 [64];
  char local_c20 [128];
  char local_ba0 [128];
  char local_b20 [128];
  char local_aa0 [128];
  char local_a20 [256];
  char local_920 [256];
  char local_820 [1024];
  char local_420 [1024];
  int local_20;
  
  local_20 = *(int *)(in_GS_OFFSET + 0x14);
  iVar17 = *(int *)param_1;
  iVar8 = iVar17;
  if (iVar17 == 2) {
    iVar8 = V_strcasecmp(*(char **)(param_1 + 0x40c),"?");
    if (iVar8 == 0) {
      ConMsg("cvarlist:  [log logfile] [ partial ]\n");
      goto LAB_00129e43;
    }
    iVar8 = *(int *)param_1;
  }
  pcVar14 = "";
  if (1 < iVar8) {
    pcVar14 = *(char **)(param_1 + 0x40c);
  }
  iVar8 = V_strcasecmp(pcVar14,"log");
  if ((iVar8 == 0) && (2 < iVar17)) {
    puVar9 = &DAT_002c79d4;
    if (2 < *(int *)param_1) {
      puVar9 = *(undefined1 **)(param_1 + 0x410);
    }
    V_snprintf(local_420,0x100,"%s",puVar9);
    local_d64 = (**(code **)(g_pFileSystem[1] + 8))(g_pFileSystem + 1,local_420,&DAT_002a5c80,0);
    if (local_d64 == 0) {
      ConMsg("Couldn\'t open \'%s\' for writing!\n",local_420);
      goto LAB_00129e43;
    }
    if (iVar17 == 4) {
      local_d60 = "";
      if (3 < *(int *)param_1) {
        local_d60 = *(char **)(param_1 + 0x414);
      }
      iVar17 = _V_strlen(local_d60);
    }
    else {
      local_d60 = (char *)0x0;
      iVar17 = 0;
    }
    bVar5 = true;
  }
  else {
    local_d60 = "";
    if (1 < *(int *)param_1) {
      local_d60 = *(char **)(param_1 + 0x40c);
    }
    iVar17 = _V_strlen(local_d60);
    bVar5 = false;
    local_d64 = 0;
  }
  ConMsg("cvar list\n--------------\n");
  local_d3c = ConCommandBaseLessFunc;
  local_d28 = 0xffff;
  local_d26 = 0xffff;
  local_d38 = 0;
  local_d34 = 0;
  local_d30 = 0;
  local_d2c = 0xffff;
  local_d2a = 0;
  local_d24 = 0;
                    /* try { // try from 00129a2a to 00129a2f has its CatchHandler @ 0012a1f2 */
  piVar10 = (int *)(**(code **)(*g_pCVar + 0x98))(g_pCVar);
                    /* try { // try from 00129a49 to 0012a145 has its CatchHandler @ 0012a216 */
  (**(code **)(*piVar10 + 8))(piVar10);
  while (cVar6 = (**(code **)(*piVar10 + 0x10))(piVar10), cVar6 != '\0') {
    pCVar11 = (ConCommandBase *)(**(code **)(*piVar10 + 0x14))(piVar10);
    cVar6 = (**(code **)(*(int *)pCVar11 + 0xc))(pCVar11,2);
    if ((cVar6 == '\0') &&
       (cVar6 = (**(code **)(*(int *)pCVar11 + 0xc))(pCVar11,0x10), cVar6 == '\0')) {
      if (local_d60 != (char *)0x0) {
        pcVar14 = (char *)(**(code **)(*(int *)pCVar11 + 0x1c))(pCVar11);
        iVar8 = V_strncasecmp(pcVar14,local_d60,iVar17);
        if (iVar8 != 0) goto LAB_00129a68;
      }
      local_d40 = pCVar11;
      CUtlRBTree<ConCommandBase_const*,unsigned_short,bool(*)(ConCommandBase_const*const&,ConCommandBase_const*const&),CUtlMemory<UtlRBTreeNode_t<ConCommandBase_const*,unsigned_short>,unsigned_short>>
      ::Insert((CUtlRBTree<ConCommandBase_const*,unsigned_short,bool(*)(ConCommandBase_const*const&,ConCommandBase_const*const&),CUtlMemory<UtlRBTreeNode_t<ConCommandBase_const*,unsigned_short>,unsigned_short>>
                *)&local_d3c,&local_d40);
    }
LAB_00129a68:
    (**(code **)(*piVar10 + 0xc))(piVar10);
  }
  if (bVar5) {
    local_820[0] = '\0';
    ppuVar15 = &PTR_s_ARCHIVE_00340cc4;
    do {
      V_snprintf(local_ce0,0x40,"\"%s\",",*ppuVar15);
      V_strncat(local_820,local_ce0,0x400,-1);
      ppuVar15 = ppuVar15 + 3;
    } while (ppuVar15 !=
             (undefined **)
             &CUtlRBTree<ConCommandBase_const*,unsigned_short,bool(*)(ConCommandBase_const*const&,ConCommandBase_const*const&),CUtlMemory<UtlRBTreeNode_t<ConCommandBase_const*,unsigned_short>,unsigned_short>>
              ::Links(unsigned_short)::s_Sentinel);
    (**(code **)(*g_pFileSystem + 100))
              (g_pFileSystem,local_d64,"\"%s\",\"%s\",%s,\"%s\"\n","Name","Value",local_820,
               "Help Text");
  }
  for (uVar7 = CUtlRBTree<ConCommandBase_const*,unsigned_short,bool(*)(ConCommandBase_const*const&,ConCommandBase_const*const&),CUtlMemory<UtlRBTreeNode_t<ConCommandBase_const*,unsigned_short>,unsigned_short>>
               ::FirstInorder((CUtlRBTree<ConCommandBase_const*,unsigned_short,bool(*)(ConCommandBase_const*const&,ConCommandBase_const*const&),CUtlMemory<UtlRBTreeNode_t<ConCommandBase_const*,unsigned_short>,unsigned_short>>
                               *)&local_d3c); uVar7 != 0xffff;
      uVar7 = CUtlRBTree<ConCommandBase_const*,unsigned_short,bool(*)(ConCommandBase_const*const&,ConCommandBase_const*const&),CUtlMemory<UtlRBTreeNode_t<ConCommandBase_const*,unsigned_short>,unsigned_short>>
              ::NextInorder((CUtlRBTree<ConCommandBase_const*,unsigned_short,bool(*)(ConCommandBase_const*const&,ConCommandBase_const*const&),CUtlMemory<UtlRBTreeNode_t<ConCommandBase_const*,unsigned_short>,unsigned_short>>
                             *)&local_d3c,uVar7)) {
    piVar3 = *(int **)(local_d38 + (uint)uVar7 * 0xc + 8);
    cVar6 = (**(code **)(*piVar3 + 8))(piVar3);
    if (cVar6 == '\0') {
      local_b20[0] = '\0';
      ppuVar15 = (undefined **)&g_ConVarFlags;
      local_420[0] = '\0';
      do {
        cVar6 = (**(code **)(*piVar3 + 0xc))(piVar3,*ppuVar15);
        if (cVar6 == '\0') {
          V_snprintf(local_c60,0x40,",");
        }
        else {
          V_snprintf(local_d00,0x20,", %s",ppuVar15[2]);
          V_strncat(local_b20,local_d00,0x80,-1);
          V_snprintf(local_c60,0x40,"\"%s\",",ppuVar15[1]);
        }
        V_strncat(local_420,local_c60,0x400,-1);
        ppuVar15 = ppuVar15 + 3;
      } while (ppuVar15 != &cv);
      fVar2 = *(float *)(piVar3[7] + 0x2c);
      iVar17 = *(int *)(piVar3[7] + 0x30);
      if (iVar17 == (int)fVar2) {
        V_snprintf(local_d20,0x20,"%-8i",iVar17);
      }
      else {
        V_snprintf(local_d20,0x20,"%-8.3f",(double)fVar2);
      }
      pcVar14 = (char *)(**(code **)(*piVar3 + 0x20))(piVar3);
      StripTabsAndReturns(pcVar14,local_aa0,extraout_ECX_01);
      uVar12 = (**(code **)(*piVar3 + 0x1c))(piVar3);
      ConMsg("%-40s : %-8s : %-16s : %s\n",uVar12,local_d20,local_b20);
      if (bVar5) {
        pcVar4 = *(code **)(*g_pFileSystem + 100);
        pcVar14 = (char *)(**(code **)(*piVar3 + 0x20))(piVar3);
        uVar12 = StripQuotes(pcVar14,local_aa0,extraout_ECX_02);
        uVar13 = (**(code **)(*piVar3 + 0x1c))(piVar3);
        (*pcVar4)(g_pFileSystem,local_d64,"\"%s\",\"%s\",%s,\"%s\"\n",uVar13,local_d20,local_420,
                  uVar12);
      }
    }
    else {
      pcVar14 = (char *)(**(code **)(*piVar3 + 0x20))(piVar3);
      StripTabsAndReturns(pcVar14,local_c20,extraout_ECX);
      uVar12 = (**(code **)(*piVar3 + 0x1c))(piVar3);
      ConMsg("%-40s : %-8s : %-16s : %s\n",uVar12,"cmd",&DAT_002c79d4);
      if (bVar5) {
        local_a20[0] = '\0';
        iVar17 = 0x12;
        do {
          V_snprintf(local_ca0,0x40,",");
          V_strncat(local_a20,local_ca0,0x100,-1);
          iVar17 = iVar17 + -1;
        } while (iVar17 != 0);
        uVar12 = (**(code **)(*piVar3 + 0x1c))(piVar3);
        V_snprintf(local_920,0x100,"%s",uVar12);
        if ((local_920[0] == '-') || (local_920[0] == '+')) {
          uVar12 = (**(code **)(*piVar3 + 0x1c))(piVar3);
          V_snprintf(local_920,0x100,"\'%s\'",uVar12);
        }
        pcVar4 = *(code **)(*g_pFileSystem + 100);
        pcVar14 = (char *)(**(code **)(*piVar3 + 0x20))(piVar3);
        uVar12 = StripQuotes(pcVar14,local_ba0,extraout_ECX_00);
        (*pcVar4)(g_pFileSystem,local_d64,"\"%s\",\"%s\",%s,\"%s\"\n",local_920,"cmd",local_a20,
                  uVar12);
      }
    }
  }
  if ((local_d60 == (char *)0x0) || (*local_d60 == '\0')) {
    ConMsg("--------------\n%3i total convars/concommands\n",(uint)local_d2a);
  }
  else {
                    /* try { // try from 0012a18c to 0012a190 has its CatchHandler @ 0012a216 */
    ConMsg("--------------\n%3i convars/concommands for [%s]\n",(uint)local_d2a,local_d60);
  }
  if (bVar5) {
    (**(code **)(g_pFileSystem[1] + 0xc))(g_pFileSystem + 1,local_d64);
  }
  (**(code **)(*piVar10 + 4))(piVar10);
  if (local_d26 != 0xffff) {
    iVar17 = 0;
    uVar7 = local_d26;
    if (0 < local_d34) {
      do {
        uVar16 = (ushort)iVar17;
        if ((iVar17 < local_d34) && (uVar16 <= uVar7)) {
          if ((CUtlRBTree<ConCommandBase_const*,unsigned_short,bool(*)(ConCommandBase_const*const&,ConCommandBase_const*const&),CUtlMemory<UtlRBTreeNode_t<ConCommandBase_const*,unsigned_short>,unsigned_short>>
               ::Links(unsigned_short)::s_Sentinel == '\0') &&
             (iVar8 = __cxa_guard_acquire(&CUtlRBTree<ConCommandBase_const*,unsigned_short,bool(*)(ConCommandBase_const*const&,ConCommandBase_const*const&),CUtlMemory<UtlRBTreeNode_t<ConCommandBase_const*,unsigned_short>,unsigned_short>>
                                           ::Links(unsigned_short)::s_Sentinel), iVar8 != 0)) {
            DAT_00340d9e = 0xffff;
            CUtlRBTree<ConCommandBase_const*,unsigned_short,bool(*)(ConCommandBase_const*const&,ConCommandBase_const*const&),CUtlMemory<UtlRBTreeNode_t<ConCommandBase_const*,unsigned_short>,unsigned_short>>
            ::Links(unsigned_short)::s_Sentinel = 0xffff;
            DAT_00340da0 = 0xffff;
            __cxa_guard_release(&CUtlRBTree<ConCommandBase_const*,unsigned_short,bool(*)(ConCommandBase_const*const&,ConCommandBase_const*const&),CUtlMemory<UtlRBTreeNode_t<ConCommandBase_const*,unsigned_short>,unsigned_short>>
                                 ::Links(unsigned_short)::s_Sentinel);
          }
          puVar1 = (ushort *)(local_d38 + iVar17 * 0xc);
          uVar7 = local_d26;
          if (*puVar1 != uVar16) {
            puVar1[1] = local_d28;
            *(ushort *)(local_d38 + iVar17 * 0xc) = uVar16;
            local_d28 = uVar16;
          }
        }
      } while (((uVar7 != uVar16) && ((int)(iVar17 + 1U & 0xffff) < local_d34)) &&
              (iVar17 = iVar17 + 1, iVar17 != 0xffff));
    }
    local_d2c = 0xffff;
    local_d2a = 0;
  }
  local_d28 = 0xffff;
  CUtlMemory<UtlRBTreeNode_t<ConCommandBase_const*,unsigned_short>,unsigned_short>::Purge
            ((CUtlMemory<UtlRBTreeNode_t<ConCommandBase_const*,unsigned_short>,unsigned_short> *)
             &local_d38);
  local_d26 = 0xffff;
  CUtlMemory<UtlRBTreeNode_t<ConCommandBase_const*,unsigned_short>,unsigned_short>::Purge
            ((CUtlMemory<UtlRBTreeNode_t<ConCommandBase_const*,unsigned_short>,unsigned_short> *)
             &local_d38);
LAB_00129e43:
  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)