L L4D2node

CDmxSerializerKeyValues2::SerializeAttributes

0x00bec1b0 · 1115 bytes · __thiscall

_ZN24CDmxSerializerKeyValues219SerializeAttributesER10CUtlBufferR27CDmxSerializationDictionaryP11CDmxElement

Decompiled

undefined (4 params)

/* CDmxSerializerKeyValues2::SerializeAttributes(CUtlBuffer&, CDmxSerializationDictionary&,
   CDmxElement*) */

undefined4 __thiscall
CDmxSerializerKeyValues2::SerializeAttributes
          (CDmxSerializerKeyValues2 *this,CUtlBuffer *param_1,CDmxSerializationDictionary *param_2,
          CDmxElement *param_3)

{
  int *piVar1;
  undefined *puVar2;
  int iVar3;
  CDmxSerializationDictionary *pCVar4;
  CDmxSerializerKeyValues2 *pCVar5;
  int iVar6;
  CUtlBuffer *pCVar7;
  char cVar8;
  int iVar9;
  undefined4 uVar10;
  int in_GS_OFFSET;
  size_t sStack_60;
  CDmxSerializationDictionary *local_40;
  CDmxSerializerKeyValues2 *local_3c;
  int local_38;
  int local_34;
  CUtlBuffer *local_30;
  int local_20;
  
  local_3c = this;
  local_40 = param_2;
  local_20 = *(int *)(in_GS_OFFSET + 0x14);
  sStack_60 = 0xbec1de;
  iVar9 = CDmxElement::AttributeCount(param_3);
  local_34 = iVar9;
  iVar3 = -((iVar9 * 4 + 0xfU & 0xfffffff0) + 0x10);
  local_38 = (int)&local_40 + iVar3;
  if (iVar9 < 1) {
    *(code **)(&stack0xffffffb0 + iVar3) = SortAttributeByName;
    *(undefined4 *)(&stack0xffffffac + iVar3) = 4;
    *(int *)(&stack0xffffffa8 + iVar3) = iVar9;
    *(int *)(&stack0xffffffa4 + iVar3) = local_38;
    *(undefined4 *)((int)&sStack_60 + iVar3) = 0xbec617;
    qsort(*(void **)(&stack0xffffffa4 + iVar3),*(size_t *)(&stack0xffffffa8 + iVar3),
          *(size_t *)(&stack0xffffffac + iVar3),*(__compar_fn_t *)(&stack0xffffffb0 + iVar3));
  }
  else {
    local_30 = param_1;
    iVar9 = 0;
    do {
      *(int *)(&stack0xffffffa8 + iVar3) = iVar9;
      *(CDmxElement **)(&stack0xffffffa4 + iVar3) = param_3;
      *(undefined4 *)((int)&sStack_60 + iVar3) = 0xbec21c;
      uVar10 = CDmxElement::GetAttribute
                         (*(CDmxElement **)(&stack0xffffffa4 + iVar3),
                          *(int *)(&stack0xffffffa8 + iVar3));
      iVar6 = local_34;
      *(undefined4 *)((int)&local_40 + iVar3 + iVar9 * 4) = uVar10;
      iVar9 = iVar9 + 1;
    } while (iVar9 != local_34);
    *(code **)(&stack0xffffffb0 + iVar3) = SortAttributeByName;
    pCVar7 = local_30;
    *(undefined4 *)(&stack0xffffffac + iVar3) = 4;
    *(int *)(&stack0xffffffa8 + iVar3) = iVar6;
    *(int *)(&stack0xffffffa4 + iVar3) = local_38;
    *(undefined4 *)((int)&sStack_60 + iVar3) = 0xbec24e;
    qsort(*(void **)(&stack0xffffffa4 + iVar3),*(size_t *)(&stack0xffffffa8 + iVar3),
          *(size_t *)(&stack0xffffffac + iVar3),*(__compar_fn_t *)(&stack0xffffffb0 + iVar3));
    local_30 = (CUtlBuffer *)0x0;
    do {
      piVar1 = *(int **)(local_38 + (int)local_30 * 4);
      *(int **)(&stack0xffffffa4 + iVar3) = piVar1;
      *(undefined4 *)((int)&sStack_60 + iVar3) = 0xbec269;
      uVar10 = CDmxAttribute::GetName(*(CDmxAttribute **)(&stack0xffffffa4 + iVar3));
      iVar9 = *piVar1;
      if (iVar9 == 1) {
        *(undefined4 *)(&stack0xffffffac + iVar3) = uVar10;
        *(char **)(&stack0xffffffa8 + iVar3) = "\"%s\" ";
        *(CUtlBuffer **)(&stack0xffffffa4 + iVar3) = pCVar7;
        *(undefined4 *)((int)&sStack_60 + iVar3) = 0xbec394;
        CUtlBuffer::Printf(*(CUtlBuffer **)(&stack0xffffffa4 + iVar3),
                           *(char **)(&stack0xffffffa8 + iVar3));
        pCVar4 = local_40;
        *(int **)(&stack0xffffffb0 + iVar3) = piVar1;
        *(CUtlBuffer **)(&stack0xffffffa8 + iVar3) = pCVar7;
        *(CDmxSerializationDictionary **)(&stack0xffffffac + iVar3) = pCVar4;
        *(CDmxSerializerKeyValues2 **)(&stack0xffffffa4 + iVar3) = local_3c;
        *(undefined4 *)((int)&sStack_60 + iVar3) = 0xbec3ae;
        SerializeElementAttribute
                  (*(CDmxSerializerKeyValues2 **)(&stack0xffffffa4 + iVar3),
                   *(CUtlBuffer **)(&stack0xffffffa8 + iVar3),
                   *(CDmxSerializationDictionary **)(&stack0xffffffac + iVar3),
                   *(CDmxAttribute **)(&stack0xffffffb0 + iVar3));
      }
      else {
        puVar2 = (&g_pAttributeTypeName)[iVar9];
        *(undefined4 *)(&stack0xffffffac + iVar3) = uVar10;
        *(undefined **)(&stack0xffffffa8 + iVar3) = &DAT_00d57980;
        *(CUtlBuffer **)(&stack0xffffffa4 + iVar3) = pCVar7;
        *(undefined **)(&stack0xffffffb0 + iVar3) = puVar2;
        *(undefined4 *)((int)&sStack_60 + iVar3) = 0xbec293;
        CUtlBuffer::Printf(*(CUtlBuffer **)(&stack0xffffffa4 + iVar3),
                           *(char **)(&stack0xffffffa8 + iVar3));
        pCVar5 = local_3c;
        pCVar4 = local_40;
        if (iVar9 == 5) {
          *(CUtlBuffer **)(&stack0xffffffa8 + iVar3) = pCVar7;
          *(int **)(&stack0xffffffa4 + iVar3) = piVar1;
          *(undefined4 *)((int)&sStack_60 + iVar3) = 0xbec3e4;
          CDmxAttribute::Serialize
                    (*(CDmxAttribute **)(&stack0xffffffa4 + iVar3),
                     *(CUtlBuffer **)(&stack0xffffffa8 + iVar3));
        }
        else if (iVar9 == 0xf) {
          *(int **)(&stack0xffffffb0 + iVar3) = piVar1;
          *(CUtlBuffer **)(&stack0xffffffa8 + iVar3) = pCVar7;
          *(CDmxSerializationDictionary **)(&stack0xffffffac + iVar3) = pCVar4;
          *(CDmxSerializerKeyValues2 **)(&stack0xffffffa4 + iVar3) = local_3c;
          *(undefined4 *)((int)&sStack_60 + iVar3) = 0xbec2bf;
          SerializeElementArrayAttribute
                    (*(CDmxSerializerKeyValues2 **)(&stack0xffffffa4 + iVar3),
                     *(CUtlBuffer **)(&stack0xffffffa8 + iVar3),
                     *(CDmxSerializationDictionary **)(&stack0xffffffac + iVar3),
                     *(CDmxAttribute **)(&stack0xffffffb0 + iVar3));
        }
        else if (iVar9 < 0xf) {
          *(int **)(&stack0xffffffa4 + iVar3) = piVar1;
          *(undefined4 *)((int)&sStack_60 + iVar3) = 0xbec3f8;
          cVar8 = CDmxAttribute::SerializesOnMultipleLines
                            (*(CDmxAttribute **)(&stack0xffffffa4 + iVar3));
          if (cVar8 != '\0') {
            if (((((byte)pCVar7[0x15] & 1) != 0) && (*(int *)(pCVar7 + 0x10) != 0)) &&
               (*(char *)(*(int *)pCVar7 +
                         ((*(int *)(pCVar7 + 0x10) + -1) - *(int *)(pCVar7 + 0x20))) == '\n')) {
              iVar9 = 0;
              if (((byte)pCVar7[0x15] & 0x10) == 0) {
                iVar9 = *(int *)(pCVar7 + 0x18);
              }
              while (iVar9 = iVar9 + -1, -1 < iVar9) {
                while( true ) {
                  *(undefined4 *)(&stack0xffffffa8 + iVar3) = 1;
                  *(CUtlBuffer **)(&stack0xffffffa4 + iVar3) = pCVar7;
                  *(undefined4 *)((int)&sStack_60 + iVar3) = 0xbec595;
                  cVar8 = CUtlBuffer::CheckPut
                                    (*(CUtlBuffer **)(&stack0xffffffa4 + iVar3),
                                     *(int *)(&stack0xffffffa8 + iVar3));
                  if (cVar8 == '\0') break;
                  *(undefined1 *)
                   (*(int *)pCVar7 + (*(int *)(pCVar7 + 0x10) - *(int *)(pCVar7 + 0x20))) = 9;
                  *(int *)(pCVar7 + 0x10) = *(int *)(pCVar7 + 0x10) + 1;
                  *(CUtlBuffer **)(&stack0xffffffa4 + iVar3) = pCVar7;
                  *(undefined4 *)((int)&sStack_60 + iVar3) = 0xbec5b1;
                  CUtlBuffer::AddNullTermination(*(CUtlBuffer **)(&stack0xffffffa4 + iVar3));
                  iVar9 = iVar9 + -1;
                  if (iVar9 < 0) goto LAB_00bec5c0;
                }
              }
            }
LAB_00bec5c0:
            *(undefined4 *)(&stack0xffffffa8 + iVar3) = 1;
            *(CUtlBuffer **)(&stack0xffffffa4 + iVar3) = pCVar7;
            *(undefined4 *)((int)&sStack_60 + iVar3) = 0xbec5d0;
            cVar8 = CUtlBuffer::CheckPut
                              (*(CUtlBuffer **)(&stack0xffffffa4 + iVar3),
                               *(int *)(&stack0xffffffa8 + iVar3));
            if (cVar8 != '\0') {
              *(undefined1 *)(*(int *)pCVar7 + (*(int *)(pCVar7 + 0x10) - *(int *)(pCVar7 + 0x20)))
                   = 10;
              *(int *)(pCVar7 + 0x10) = *(int *)(pCVar7 + 0x10) + 1;
              *(CUtlBuffer **)(&stack0xffffffa4 + iVar3) = pCVar7;
              *(undefined4 *)((int)&sStack_60 + iVar3) = 0xbec5f0;
              CUtlBuffer::AddNullTermination(*(CUtlBuffer **)(&stack0xffffffa4 + iVar3));
            }
          }
          if (((((byte)pCVar7[0x15] & 1) != 0) && (*(int *)(pCVar7 + 0x10) != 0)) &&
             (*(char *)(*(int *)pCVar7 + ((*(int *)(pCVar7 + 0x10) + -1) - *(int *)(pCVar7 + 0x20)))
              == '\n')) {
            iVar9 = 0;
            if (((byte)pCVar7[0x15] & 0x10) == 0) {
              iVar9 = *(int *)(pCVar7 + 0x18);
            }
            while (iVar9 = iVar9 + -1, -1 < iVar9) {
              while( true ) {
                *(undefined4 *)(&stack0xffffffa8 + iVar3) = 1;
                *(CUtlBuffer **)(&stack0xffffffa4 + iVar3) = pCVar7;
                *(undefined4 *)((int)&sStack_60 + iVar3) = 0xbec445;
                cVar8 = CUtlBuffer::CheckPut
                                  (*(CUtlBuffer **)(&stack0xffffffa4 + iVar3),
                                   *(int *)(&stack0xffffffa8 + iVar3));
                if (cVar8 == '\0') break;
                *(undefined1 *)
                 (*(int *)pCVar7 + (*(int *)(pCVar7 + 0x10) - *(int *)(pCVar7 + 0x20))) = 9;
                *(int *)(pCVar7 + 0x10) = *(int *)(pCVar7 + 0x10) + 1;
                *(CUtlBuffer **)(&stack0xffffffa4 + iVar3) = pCVar7;
                *(undefined4 *)((int)&sStack_60 + iVar3) = 0xbec461;
                CUtlBuffer::AddNullTermination(*(CUtlBuffer **)(&stack0xffffffa4 + iVar3));
                iVar9 = iVar9 + -1;
                if (iVar9 < 0) goto LAB_00bec470;
              }
            }
          }
LAB_00bec470:
          *(undefined4 *)(&stack0xffffffa8 + iVar3) = 1;
          *(CUtlBuffer **)(&stack0xffffffa4 + iVar3) = pCVar7;
          *(undefined4 *)((int)&sStack_60 + iVar3) = 0xbec480;
          cVar8 = CUtlBuffer::CheckPut
                            (*(CUtlBuffer **)(&stack0xffffffa4 + iVar3),
                             *(int *)(&stack0xffffffa8 + iVar3));
          if (cVar8 != '\0') {
            *(undefined1 *)(*(int *)pCVar7 + (*(int *)(pCVar7 + 0x10) - *(int *)(pCVar7 + 0x20))) =
                 0x22;
            *(int *)(pCVar7 + 0x10) = *(int *)(pCVar7 + 0x10) + 1;
            *(CUtlBuffer **)(&stack0xffffffa4 + iVar3) = pCVar7;
            *(undefined4 *)((int)&sStack_60 + iVar3) = 0xbec49c;
            CUtlBuffer::AddNullTermination(*(CUtlBuffer **)(&stack0xffffffa4 + iVar3));
          }
          *(int *)(pCVar7 + 0x18) = *(int *)(pCVar7 + 0x18) + 1;
          *(CUtlBuffer **)(&stack0xffffffa8 + iVar3) = pCVar7;
          *(int **)(&stack0xffffffa4 + iVar3) = piVar1;
          *(undefined4 *)((int)&sStack_60 + iVar3) = 0xbec4ac;
          CDmxAttribute::Serialize
                    (*(CDmxAttribute **)(&stack0xffffffa4 + iVar3),
                     *(CUtlBuffer **)(&stack0xffffffa8 + iVar3));
          iVar9 = *(int *)(pCVar7 + 0x18) + -1;
          if (iVar9 < 0) {
            iVar9 = 0;
          }
          *(int *)(pCVar7 + 0x18) = iVar9;
          if (((((byte)pCVar7[0x15] & 1) != 0) && (*(int *)(pCVar7 + 0x10) != 0)) &&
             (*(char *)(*(int *)pCVar7 + ((*(int *)(pCVar7 + 0x10) + -1) - *(int *)(pCVar7 + 0x20)))
              == '\n')) {
            if (((byte)pCVar7[0x15] & 0x10) != 0) {
              iVar9 = 0;
            }
            while (iVar9 = iVar9 + -1, -1 < iVar9) {
              while( true ) {
                *(undefined4 *)(&stack0xffffffa8 + iVar3) = 1;
                *(CUtlBuffer **)(&stack0xffffffa4 + iVar3) = pCVar7;
                *(undefined4 *)((int)&sStack_60 + iVar3) = 0xbec4f5;
                cVar8 = CUtlBuffer::CheckPut
                                  (*(CUtlBuffer **)(&stack0xffffffa4 + iVar3),
                                   *(int *)(&stack0xffffffa8 + iVar3));
                if (cVar8 == '\0') break;
                *(undefined1 *)
                 (*(int *)pCVar7 + (*(int *)(pCVar7 + 0x10) - *(int *)(pCVar7 + 0x20))) = 9;
                *(int *)(pCVar7 + 0x10) = *(int *)(pCVar7 + 0x10) + 1;
                *(CUtlBuffer **)(&stack0xffffffa4 + iVar3) = pCVar7;
                *(undefined4 *)((int)&sStack_60 + iVar3) = 0xbec511;
                CUtlBuffer::AddNullTermination(*(CUtlBuffer **)(&stack0xffffffa4 + iVar3));
                iVar9 = iVar9 + -1;
                if (iVar9 < 0) goto LAB_00bec520;
              }
            }
          }
LAB_00bec520:
          *(undefined4 *)(&stack0xffffffa8 + iVar3) = 1;
          *(CUtlBuffer **)(&stack0xffffffa4 + iVar3) = pCVar7;
          *(undefined4 *)((int)&sStack_60 + iVar3) = 0xbec530;
          cVar8 = CUtlBuffer::CheckPut
                            (*(CUtlBuffer **)(&stack0xffffffa4 + iVar3),
                             *(int *)(&stack0xffffffa8 + iVar3));
          if (cVar8 != '\0') {
            *(undefined1 *)(*(int *)pCVar7 + (*(int *)(pCVar7 + 0x10) - *(int *)(pCVar7 + 0x20))) =
                 0x22;
            *(int *)(pCVar7 + 0x10) = *(int *)(pCVar7 + 0x10) + 1;
            *(CUtlBuffer **)(&stack0xffffffa4 + iVar3) = pCVar7;
            *(undefined4 *)((int)&sStack_60 + iVar3) = 0xbec550;
            CUtlBuffer::AddNullTermination(*(CUtlBuffer **)(&stack0xffffffa4 + iVar3));
          }
        }
        else {
          *(int **)(&stack0xffffffac + iVar3) = piVar1;
          *(CUtlBuffer **)(&stack0xffffffa8 + iVar3) = pCVar7;
          *(CDmxSerializerKeyValues2 **)(&stack0xffffffa4 + iVar3) = pCVar5;
          *(undefined4 *)((int)&sStack_60 + iVar3) = 0xbec3d0;
          SerializeArrayAttribute
                    (*(CDmxSerializerKeyValues2 **)(&stack0xffffffa4 + iVar3),
                     *(CUtlBuffer **)(&stack0xffffffa8 + iVar3),
                     *(CDmxAttribute **)(&stack0xffffffac + iVar3));
        }
      }
      if (((((byte)pCVar7[0x15] & 1) != 0) && (*(int *)(pCVar7 + 0x10) != 0)) &&
         (*(char *)(*(int *)pCVar7 + ((*(int *)(pCVar7 + 0x10) + -1) - *(int *)(pCVar7 + 0x20))) ==
          '\n')) {
        iVar9 = 0;
        if (((byte)pCVar7[0x15] & 0x10) == 0) {
          iVar9 = *(int *)(pCVar7 + 0x18);
        }
        while (iVar9 = iVar9 + -1, -1 < iVar9) {
          while( true ) {
            *(undefined4 *)(&stack0xffffffa8 + iVar3) = 1;
            *(CUtlBuffer **)(&stack0xffffffa4 + iVar3) = pCVar7;
            *(undefined4 *)((int)&sStack_60 + iVar3) = 0xbec2fd;
            cVar8 = CUtlBuffer::CheckPut
                              (*(CUtlBuffer **)(&stack0xffffffa4 + iVar3),
                               *(int *)(&stack0xffffffa8 + iVar3));
            if (cVar8 == '\0') break;
            *(undefined1 *)(*(int *)pCVar7 + (*(int *)(pCVar7 + 0x10) - *(int *)(pCVar7 + 0x20))) =
                 9;
            *(int *)(pCVar7 + 0x10) = *(int *)(pCVar7 + 0x10) + 1;
            *(CUtlBuffer **)(&stack0xffffffa4 + iVar3) = pCVar7;
            *(undefined4 *)((int)&sStack_60 + iVar3) = 0xbec319;
            CUtlBuffer::AddNullTermination(*(CUtlBuffer **)(&stack0xffffffa4 + iVar3));
            iVar9 = iVar9 + -1;
            if (iVar9 < 0) goto LAB_00bec320;
          }
        }
      }
LAB_00bec320:
      *(undefined4 *)(&stack0xffffffa8 + iVar3) = 1;
      *(CUtlBuffer **)(&stack0xffffffa4 + iVar3) = pCVar7;
      *(undefined4 *)((int)&sStack_60 + iVar3) = 0xbec330;
      cVar8 = CUtlBuffer::CheckPut
                        (*(CUtlBuffer **)(&stack0xffffffa4 + iVar3),
                         *(int *)(&stack0xffffffa8 + iVar3));
      if (cVar8 != '\0') {
        *(undefined1 *)(*(int *)pCVar7 + (*(int *)(pCVar7 + 0x10) - *(int *)(pCVar7 + 0x20))) = 10;
        *(int *)(pCVar7 + 0x10) = *(int *)(pCVar7 + 0x10) + 1;
        *(CUtlBuffer **)(&stack0xffffffa4 + iVar3) = pCVar7;
        *(undefined4 *)((int)&sStack_60 + iVar3) = 0xbec34c;
        CUtlBuffer::AddNullTermination(*(CUtlBuffer **)(&stack0xffffffa4 + iVar3));
      }
      local_30 = (CUtlBuffer *)((int)local_30 + 1);
    } while (local_30 != (CUtlBuffer *)local_34);
  }
  if (local_20 != *(int *)(in_GS_OFFSET + 0x14)) {
                    /* WARNING: Subroutine does not return */
    *(undefined **)((int)&sStack_60 + iVar3) = &UNK_00bec621;
    __stack_chk_fail();
  }
  return 1;
}

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)