L L4D2node

KeyValues::WriteAsBinary

0x00042180 · 1875 bytes · __thiscall

_ZN9KeyValues13WriteAsBinaryER10CUtlBuffer

Decompiled

undefined (2 params)

/* KeyValues::WriteAsBinary(CUtlBuffer&) */

bool __thiscall KeyValues::WriteAsBinary(KeyValues *this,CUtlBuffer *param_1)

{
  float fVar1;
  CUtlBuffer CVar2;
  undefined4 uVar3;
  int iVar4;
  char cVar5;
  char *pcVar6;
  void *pvVar7;
  undefined4 *puVar8;
  KeyValues KVar9;
  int iVar10;
  int iVar11;
  bool bVar12;
  int local_40;
  undefined1 local_3c;
  undefined1 uStack_3b;
  undefined1 local_3a;
  undefined1 uStack_39;
  undefined1 local_38;
  undefined1 uStack_37;
  undefined1 uStack_36;
  undefined1 uStack_35;
  undefined1 local_34;
  undefined1 uStack_33;
  undefined1 uStack_32;
  undefined1 uStack_31;
  undefined1 local_30;
  undefined1 uStack_2f;
  undefined1 uStack_2e;
  undefined1 uStack_2d;
  undefined1 local_2c [4];
  undefined4 local_28;
  undefined4 local_24;
  undefined4 local_20;
  
  CVar2 = param_1[0x15];
  bVar12 = false;
  if ((((byte)CVar2 & 1) == 0) &&
     (bVar12 = (bool)((byte)CVar2 & 1), param_1[0x14] == (CUtlBuffer)0x0)) {
    if (this != (KeyValues *)0x0) {
      KVar9 = this[0x10];
      if (((byte)CVar2 & 1) == 0) goto LAB_000422eb;
      do {
        CUtlBuffer::Printf(param_1,"%u",(uint)(byte)KVar9);
LAB_000421dc:
        pcVar6 = (char *)GetName(this);
        CUtlBuffer::PutString(param_1,pcVar6);
        switch(this[0x10]) {
        case (KeyValues)0x0:
          WriteAsBinary(*(KeyValues **)(this + 0x20),param_1);
          break;
        case (KeyValues)0x1:
          pcVar6 = *(char **)(this + 4);
          if ((pcVar6 == (char *)0x0) || (*pcVar6 == '\0')) {
            CUtlBuffer::PutString(param_1,"");
          }
          else {
            CUtlBuffer::PutString(param_1,pcVar6);
          }
          break;
        case (KeyValues)0x2:
          uVar3 = *(undefined4 *)(this + 0xc);
          if (((byte)param_1[0x15] & 1) == 0) {
            cVar5 = CUtlBuffer::CheckPut(param_1,4);
            if (cVar5 != '\0') {
              if (((byte)param_1[0x34] & 1) == 0) {
                *(undefined4 *)
                 (*(int *)param_1 + (*(int *)(param_1 + 0x10) - *(int *)(param_1 + 0x20))) = uVar3;
                iVar11 = *(int *)(param_1 + 0x10);
              }
              else {
                iVar11 = *(int *)(param_1 + 0x10);
                pvVar7 = (void *)((iVar11 - *(int *)(param_1 + 0x20)) + *(int *)param_1);
                if (pvVar7 != (void *)0x0) {
                  uStack_35 = (undefined1)((uint)uVar3 >> 0x18);
                  uStack_36 = (undefined1)((uint)uVar3 >> 0x10);
                  local_24._0_2_ = CONCAT11(uStack_36,uStack_35);
                  uStack_37 = (undefined1)((uint)uVar3 >> 8);
                  local_24._0_3_ = CONCAT12(uStack_37,(undefined2)local_24);
                  local_38 = (undefined1)uVar3;
                  local_30 = local_38;
LAB_00042831:
                  local_24 = CONCAT13(local_30,(undefined3)local_24);
                  _V_memcpy(pvVar7,&local_24,4);
                  iVar11 = *(int *)(param_1 + 0x10);
                }
              }
LAB_000425ac:
              *(int *)(param_1 + 0x10) = iVar11 + 4;
              CUtlBuffer::AddNullTermination(param_1);
            }
          }
          else {
            CUtlBuffer::Printf(param_1,"%d",uVar3);
          }
          break;
        case (KeyValues)0x3:
          fVar1 = *(float *)(this + 0xc);
          if (((byte)param_1[0x15] & 1) == 0) {
            cVar5 = CUtlBuffer::CheckPut(param_1,4);
            if (cVar5 != '\0') {
              if (((byte)param_1[0x34] & 1) == 0) {
                *(float *)(*(int *)param_1 + (*(int *)(param_1 + 0x10) - *(int *)(param_1 + 0x20)))
                     = fVar1;
                iVar11 = *(int *)(param_1 + 0x10);
              }
              else {
                iVar11 = *(int *)(param_1 + 0x10);
                pvVar7 = (void *)((iVar11 - *(int *)(param_1 + 0x20)) + *(int *)param_1);
                if (pvVar7 != (void *)0x0) {
                  uStack_31 = (undefined1)((uint)fVar1 >> 0x18);
                  uStack_32 = (undefined1)((uint)fVar1 >> 0x10);
                  local_24._0_2_ = CONCAT11(uStack_32,uStack_31);
                  uStack_33 = (undefined1)((uint)fVar1 >> 8);
                  local_24._0_3_ = CONCAT12(uStack_33,(undefined2)local_24);
                  local_34 = SUB41(fVar1,0);
                  local_30 = local_34;
                  goto LAB_00042831;
                }
              }
              goto LAB_000425ac;
            }
          }
          else {
            CUtlBuffer::Printf(param_1,"%f",(double)fVar1);
          }
          break;
        case (KeyValues)0x4:
          uVar3 = *(undefined4 *)(this + 0xc);
          if (((byte)param_1[0x15] & 1) == 0) {
            cVar5 = CUtlBuffer::CheckPut(param_1,4);
            if (cVar5 != '\0') {
              if (((byte)param_1[0x34] & 1) == 0) {
                *(undefined4 *)
                 (*(int *)param_1 + (*(int *)(param_1 + 0x10) - *(int *)(param_1 + 0x20))) = uVar3;
                iVar11 = *(int *)(param_1 + 0x10);
              }
              else {
                iVar11 = *(int *)(param_1 + 0x10);
                pvVar7 = (void *)((iVar11 - *(int *)(param_1 + 0x20)) + *(int *)param_1);
                if (pvVar7 != (void *)0x0) {
                  uStack_2d = (undefined1)((uint)uVar3 >> 0x18);
                  uStack_2e = (undefined1)((uint)uVar3 >> 0x10);
                  local_24._0_2_ = CONCAT11(uStack_2e,uStack_2d);
                  uStack_2f = (undefined1)((uint)uVar3 >> 8);
                  local_24._0_3_ = CONCAT12(uStack_2f,(undefined2)local_24);
                  local_30 = (undefined1)uVar3;
                  goto LAB_00042831;
                }
              }
              goto LAB_000425ac;
            }
          }
          else {
            CUtlBuffer::Printf(param_1,"%u",uVar3);
          }
          break;
        case (KeyValues)0x5:
          if (*(wchar_t **)(this + 8) == (wchar_t *)0x0) {
            local_40 = 0;
          }
          else {
            local_40 = _V_wcslen(*(wchar_t **)(this + 8));
          }
          if (((byte)param_1[0x15] & 1) == 0) {
            cVar5 = CUtlBuffer::CheckPut(param_1,2);
            if (cVar5 != '\0') {
              if (((byte)param_1[0x34] & 1) == 0) {
                *(short *)(*(int *)param_1 + (*(int *)(param_1 + 0x10) - *(int *)(param_1 + 0x20)))
                     = (short)local_40;
                iVar11 = *(int *)(param_1 + 0x10);
              }
              else {
                iVar11 = *(int *)(param_1 + 0x10);
                pvVar7 = (void *)((iVar11 - *(int *)(param_1 + 0x20)) + *(int *)param_1);
                if (pvVar7 != (void *)0x0) {
                  uStack_3b = (undefined1)((uint)local_40 >> 8);
                  local_3c = (undefined1)local_40;
                  local_24._0_2_ = CONCAT11(local_3c,uStack_3b);
                  _V_memcpy(pvVar7,&local_24,2);
                  iVar11 = *(int *)(param_1 + 0x10);
                }
              }
              *(int *)(param_1 + 0x10) = iVar11 + 2;
              CUtlBuffer::AddNullTermination(param_1);
            }
          }
          else {
            CUtlBuffer::Printf(param_1,"%d",(int)(short)local_40);
          }
          iVar11 = 0;
          if (0 < local_40) {
            do {
              uVar3 = *(undefined4 *)(*(int *)(this + 8) + iVar11 * 4);
              if (((byte)param_1[0x15] & 1) == 0) {
                cVar5 = CUtlBuffer::CheckPut(param_1,2);
                if (cVar5 != '\0') {
                  if (((byte)param_1[0x34] & 1) == 0) {
                    *(short *)(*(int *)param_1 +
                              (*(int *)(param_1 + 0x10) - *(int *)(param_1 + 0x20))) = (short)uVar3;
                    iVar10 = *(int *)(param_1 + 0x10);
                  }
                  else {
                    iVar10 = *(int *)(param_1 + 0x10);
                    pvVar7 = (void *)((iVar10 - *(int *)(param_1 + 0x20)) + *(int *)param_1);
                    if (pvVar7 != (void *)0x0) {
                      uStack_39 = (undefined1)((uint)uVar3 >> 8);
                      local_3a = (undefined1)uVar3;
                      local_24._0_2_ = CONCAT11(local_3a,uStack_39);
                      _V_memcpy(pvVar7,&local_24,2);
                      iVar10 = *(int *)(param_1 + 0x10);
                    }
                  }
                  *(int *)(param_1 + 0x10) = iVar10 + 2;
                  CUtlBuffer::AddNullTermination(param_1);
                }
              }
              else {
                CUtlBuffer::Printf(param_1,"%d",(int)(short)uVar3);
              }
              iVar11 = iVar11 + 1;
            } while (iVar11 != local_40);
          }
          break;
        case (KeyValues)0x6:
          KVar9 = this[0xc];
          if (((byte)param_1[0x15] & 1) == 0) {
            cVar5 = CUtlBuffer::CheckPut(param_1,1);
            if (cVar5 != '\0') {
              *(KeyValues *)
               (*(int *)param_1 + (*(int *)(param_1 + 0x10) - *(int *)(param_1 + 0x20))) = KVar9;
              *(int *)(param_1 + 0x10) = *(int *)(param_1 + 0x10) + 1;
              CUtlBuffer::AddNullTermination(param_1);
            }
          }
          else {
            CUtlBuffer::Printf(param_1,"%u",(uint)(byte)KVar9);
          }
          KVar9 = this[0xd];
          if (((byte)param_1[0x15] & 1) == 0) {
            cVar5 = CUtlBuffer::CheckPut(param_1,1);
            if (cVar5 != '\0') {
              *(KeyValues *)
               (*(int *)param_1 + (*(int *)(param_1 + 0x10) - *(int *)(param_1 + 0x20))) = KVar9;
              *(int *)(param_1 + 0x10) = *(int *)(param_1 + 0x10) + 1;
              CUtlBuffer::AddNullTermination(param_1);
            }
          }
          else {
            CUtlBuffer::Printf(param_1,"%u",(uint)(byte)KVar9);
          }
          KVar9 = this[0xe];
          if (((byte)param_1[0x15] & 1) == 0) {
            cVar5 = CUtlBuffer::CheckPut(param_1,1);
            if (cVar5 != '\0') {
              *(KeyValues *)
               (*(int *)param_1 + (*(int *)(param_1 + 0x10) - *(int *)(param_1 + 0x20))) = KVar9;
              *(int *)(param_1 + 0x10) = *(int *)(param_1 + 0x10) + 1;
              CUtlBuffer::AddNullTermination(param_1);
            }
          }
          else {
            CUtlBuffer::Printf(param_1,"%u",(uint)(byte)KVar9);
          }
          KVar9 = this[0xf];
          if (((byte)param_1[0x15] & 1) == 0) {
            cVar5 = CUtlBuffer::CheckPut(param_1,1);
            if (cVar5 != '\0') {
              *(KeyValues *)
               (*(int *)param_1 + (*(int *)(param_1 + 0x10) - *(int *)(param_1 + 0x20))) = KVar9;
              *(int *)(param_1 + 0x10) = *(int *)(param_1 + 0x10) + 1;
              CUtlBuffer::AddNullTermination(param_1);
            }
          }
          else {
            CUtlBuffer::Printf(param_1,"%u",(uint)(byte)KVar9);
          }
          break;
        case (KeyValues)0x7:
          uVar3 = **(undefined4 **)(this + 4);
          if (((byte)param_1[0x15] & 1) == 0) {
            local_28 = (*(undefined4 **)(this + 4))[1];
            cVar5 = CUtlBuffer::CheckPut(param_1,8);
            if (cVar5 != '\0') {
              if (((byte)param_1[0x34] & 1) == 0) {
                iVar11 = *(int *)(param_1 + 0x10);
                iVar10 = *(int *)param_1;
                iVar4 = *(int *)(param_1 + 0x20);
                *(undefined4 *)(iVar10 + (iVar11 - iVar4)) = uVar3;
                *(undefined4 *)(iVar10 + 4 + (iVar11 - iVar4)) = local_28;
                iVar11 = *(int *)(param_1 + 0x10);
              }
              else {
                iVar11 = *(int *)(param_1 + 0x10);
                puVar8 = (undefined4 *)((iVar11 - *(int *)(param_1 + 0x20)) + *(int *)param_1);
                if (puVar8 != (undefined4 *)0x0) {
                  local_20 = puVar8[1];
                  local_24 = *puVar8;
                  iVar11 = 0;
                  do {
                    iVar10 = iVar11 + 1;
                    *(undefined1 *)((int)&local_24 + iVar11) =
                         *(undefined1 *)((int)&local_28 + (3 - iVar11));
                    iVar11 = iVar10;
                  } while (iVar10 != 8);
                  _V_memcpy(puVar8,&local_24,8);
                  iVar11 = *(int *)(param_1 + 0x10);
                }
              }
              *(int *)(param_1 + 0x10) = iVar11 + 8;
              CUtlBuffer::AddNullTermination(param_1);
            }
          }
          else {
            CUtlBuffer::Printf(param_1,"%I64d",uVar3);
          }
        }
        this = *(KeyValues **)(this + 0x1c);
        if (this == (KeyValues *)0x0) {
          if (((byte)param_1[0x15] & 1) == 0) goto LAB_000427a8;
          CUtlBuffer::Printf(param_1,"%u",0xb);
          goto LAB_0004222a;
        }
        KVar9 = this[0x10];
      } while (((byte)param_1[0x15] & 1) != 0);
LAB_000422eb:
      cVar5 = CUtlBuffer::CheckPut(param_1,1);
      if (cVar5 != '\0') {
        *(KeyValues *)(*(int *)param_1 + (*(int *)(param_1 + 0x10) - *(int *)(param_1 + 0x20))) =
             KVar9;
        *(int *)(param_1 + 0x10) = *(int *)(param_1 + 0x10) + 1;
        CUtlBuffer::AddNullTermination(param_1);
      }
      goto LAB_000421dc;
    }
LAB_000427a8:
    cVar5 = CUtlBuffer::CheckPut(param_1,1);
    if (cVar5 != '\0') {
      *(undefined1 *)(*(int *)param_1 + (*(int *)(param_1 + 0x10) - *(int *)(param_1 + 0x20))) = 0xb
      ;
      *(int *)(param_1 + 0x10) = *(int *)(param_1 + 0x10) + 1;
      CUtlBuffer::AddNullTermination(param_1);
    }
LAB_0004222a:
    bVar12 = param_1[0x14] == (CUtlBuffer)0x0;
  }
  return bVar12;
}

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)