L L4D2node

CDmxSerializer::SaveElement

0x00be88b0 · 1144 bytes · __thiscall

_ZN14CDmxSerializer11SaveElementER10CUtlBufferR27CDmxSerializationDictionaryP15CUtlSymbolTableP11CDmxElement

Decompiled

undefined (5 params)

/* CDmxSerializer::SaveElement(CUtlBuffer&, CDmxSerializationDictionary&, CUtlSymbolTable*,
   CDmxElement*) */

bool __thiscall
CDmxSerializer::SaveElement
          (CDmxSerializer *this,CUtlBuffer *param_1,CDmxSerializationDictionary *param_2,
          CUtlSymbolTable *param_3,CDmxElement *param_4)

{
  undefined4 uVar1;
  short sVar2;
  char cVar3;
  int iVar4;
  CDmxAttribute *pCVar5;
  char *pcVar6;
  int iVar7;
  void *pvVar8;
  int iVar9;
  int iVar10;
  undefined1 local_38;
  int local_30;
  undefined1 local_28;
  undefined1 uStack_27;
  undefined1 local_26;
  undefined1 uStack_25;
  undefined1 local_24;
  undefined1 uStack_23;
  undefined1 uStack_22;
  undefined1 uStack_21;
  undefined2 local_20;
  undefined1 local_1e;
  undefined1 local_1d;
  
  iVar4 = CDmxElement::AttributeCount(param_4);
  if (iVar4 < 1) {
    iVar10 = 0;
  }
  else {
    iVar9 = 0;
    iVar10 = 0;
    do {
      pCVar5 = (CDmxAttribute *)CDmxElement::GetAttribute(param_4,iVar9);
      pcVar6 = (char *)CDmxAttribute::GetName(pCVar5);
      if (pCVar5 != (CDmxAttribute *)0x0) {
        iVar7 = _V_stricmp(pcVar6,"name");
        iVar10 = (iVar10 + 1) - (uint)(iVar7 == 0);
      }
      iVar9 = iVar9 + 1;
    } while (iVar9 != iVar4);
  }
  if (((byte)param_1[0x15] & 1) == 0) {
    cVar3 = CUtlBuffer::CheckPut(param_1,4);
    if (cVar3 != '\0') {
      if (((byte)param_1[0x34] & 1) == 0) {
        *(int *)(*(int *)param_1 + (*(int *)(param_1 + 0x10) - *(int *)(param_1 + 0x20))) = iVar10;
        iVar9 = *(int *)(param_1 + 0x10);
      }
      else {
        iVar9 = *(int *)(param_1 + 0x10);
        pvVar8 = (void *)((iVar9 - *(int *)(param_1 + 0x20)) + *(int *)param_1);
        if (pvVar8 != (void *)0x0) {
          uStack_21 = (undefined1)((uint)iVar10 >> 0x18);
          uStack_22 = (undefined1)((uint)iVar10 >> 0x10);
          local_20 = CONCAT11(uStack_22,uStack_21);
          uStack_23 = (undefined1)((uint)iVar10 >> 8);
          local_1e = uStack_23;
          local_24 = (undefined1)iVar10;
          local_1d = local_24;
          _V_memcpy(pvVar8,&local_20,4);
          iVar9 = *(int *)(param_1 + 0x10);
        }
      }
      *(int *)(param_1 + 0x10) = iVar9 + 4;
      CUtlBuffer::AddNullTermination(param_1);
    }
  }
  else {
    CUtlBuffer::Printf(param_1,"%d",iVar10);
  }
  local_30 = 0;
  if (0 < iVar4) {
LAB_00be8950:
    do {
      pCVar5 = (CDmxAttribute *)CDmxElement::GetAttribute(param_4,local_30);
      pcVar6 = (char *)CDmxAttribute::GetName(pCVar5);
      if ((pCVar5 != (CDmxAttribute *)0x0) && (iVar10 = _V_stricmp(pcVar6,"name"), iVar10 != 0)) {
        CUtlSymbolTable::Find((char *)&local_20);
        sVar2 = local_20;
        if (local_20 == -1) {
          return false;
        }
        if (((byte)param_1[0x15] & 1) == 0) {
          cVar3 = CUtlBuffer::CheckPut(param_1,2);
          if (cVar3 != '\0') {
            if (((byte)param_1[0x34] & 1) == 0) {
              *(short *)(*(int *)param_1 + (*(int *)(param_1 + 0x10) - *(int *)(param_1 + 0x20))) =
                   sVar2;
              iVar10 = *(int *)(param_1 + 0x10);
            }
            else {
              iVar10 = *(int *)(param_1 + 0x10);
              pvVar8 = (void *)((iVar10 - *(int *)(param_1 + 0x20)) + *(int *)param_1);
              if (pvVar8 != (void *)0x0) {
                uStack_27 = (undefined1)((ushort)sVar2 >> 8);
                local_28 = (undefined1)sVar2;
                local_20 = CONCAT11(local_28,uStack_27);
                _V_memcpy(pvVar8,&local_20,2);
                iVar10 = *(int *)(param_1 + 0x10);
              }
            }
            *(int *)(param_1 + 0x10) = iVar10 + 2;
            CUtlBuffer::AddNullTermination(param_1);
          }
        }
        else {
          CUtlBuffer::Printf(param_1,"%d",(int)local_20);
        }
        uVar1 = *(undefined4 *)pCVar5;
        if (((((byte)param_1[0x15] & 1) != 0) && (*(int *)(param_1 + 0x10) != 0)) &&
           (*(char *)(*(int *)param_1 + ((*(int *)(param_1 + 0x10) + -1) - *(int *)(param_1 + 0x20))
                     ) == '\n')) {
          iVar10 = 0;
          if (((byte)param_1[0x15] & 0x10) == 0) {
            iVar10 = *(int *)(param_1 + 0x18);
          }
          while (iVar10 = iVar10 + -1, -1 < iVar10) {
            while (cVar3 = CUtlBuffer::CheckPut(param_1,1), cVar3 != '\0') {
              *(undefined1 *)
               (*(int *)param_1 + (*(int *)(param_1 + 0x10) - *(int *)(param_1 + 0x20))) = 9;
              *(int *)(param_1 + 0x10) = *(int *)(param_1 + 0x10) + 1;
              CUtlBuffer::AddNullTermination(param_1);
              iVar10 = iVar10 + -1;
              if (iVar10 < 0) goto LAB_00be8a40;
            }
          }
        }
LAB_00be8a40:
        cVar3 = CUtlBuffer::CheckPut(param_1,1);
        if (cVar3 != '\0') {
          local_38 = (undefined1)uVar1;
          *(undefined1 *)(*(int *)param_1 + (*(int *)(param_1 + 0x10) - *(int *)(param_1 + 0x20))) =
               local_38;
          *(int *)(param_1 + 0x10) = *(int *)(param_1 + 0x10) + 1;
          CUtlBuffer::AddNullTermination(param_1);
        }
        iVar10 = *(int *)pCVar5;
        if (iVar10 == 5) {
          CUtlString::operator_cast_to_char_(*(CUtlString **)(pCVar5 + 8));
          CUtlSymbolTable::Find((char *)&local_20);
          sVar2 = local_20;
          if (local_20 == -1) {
            return false;
          }
          if (((byte)param_1[0x15] & 1) == 0) {
            cVar3 = CUtlBuffer::CheckPut(param_1,2);
            if (cVar3 != '\0') {
              if (((byte)param_1[0x34] & 1) == 0) {
                *(short *)(*(int *)param_1 + (*(int *)(param_1 + 0x10) - *(int *)(param_1 + 0x20)))
                     = sVar2;
                iVar10 = *(int *)(param_1 + 0x10);
              }
              else {
                iVar10 = *(int *)(param_1 + 0x10);
                pvVar8 = (void *)((iVar10 - *(int *)(param_1 + 0x20)) + *(int *)param_1);
                if (pvVar8 != (void *)0x0) {
                  uStack_25 = (undefined1)((ushort)sVar2 >> 8);
                  local_26 = (undefined1)sVar2;
                  local_20 = CONCAT11(local_26,uStack_25);
                  _V_memcpy(pvVar8,&local_20,2);
                  iVar10 = *(int *)(param_1 + 0x10);
                }
              }
              *(int *)(param_1 + 0x10) = iVar10 + 2;
              CUtlBuffer::AddNullTermination(param_1);
            }
          }
          else {
            CUtlBuffer::Printf(param_1,"%d",(int)local_20);
          }
        }
        else {
          if (iVar10 == 0xf) {
            SerializeElementArrayAttribute(this,param_1,param_2,pCVar5);
            local_30 = local_30 + 1;
            if (local_30 == iVar4) break;
            goto LAB_00be8950;
          }
          if (iVar10 == 1) {
            SerializeElementIndex(this,param_1,param_2,(CDmxElement *)**(undefined4 **)(pCVar5 + 8))
            ;
          }
          else {
            CDmxAttribute::Serialize(pCVar5,param_1);
          }
        }
      }
      local_30 = local_30 + 1;
    } while (local_30 != iVar4);
  }
  return param_1[0x14] == (CUtlBuffer)0x0;
}

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)