L L4D2node

KeyValues::ReadAsBinary

0x0024fd00 · 2665 bytes · __thiscall

_ZN9KeyValues12ReadAsBinaryER10CUtlBuffer

Decompiled

undefined (2 params)

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

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

{
  short sVar1;
  undefined2 uVar2;
  char cVar3;
  KeyValues *pKVar4;
  uint *puVar5;
  void *pvVar6;
  int iVar7;
  int iVar8;
  KeyValues KVar9;
  int iVar10;
  int iVar11;
  uint uVar12;
  undefined4 *puVar13;
  uint uVar14;
  int in_GS_OFFSET;
  bool bVar15;
  char *pcVar16;
  undefined *puVar17;
  short local_44a;
  int local_448;
  KeyValues *local_440;
  undefined4 local_434;
  uint local_430;
  undefined4 local_42c;
  uint local_428;
  char local_420 [1023];
  undefined1 local_21;
  int local_20;
  
  local_20 = *(int *)(in_GS_OFFSET + 0x14);
  if ((((byte)param_1[0x15] & 1) == 0) && (param_1[0x14] == (CUtlBuffer)0x0)) {
    RemoveEverything(this);
    Init(this,*(IKeyValuesSystem **)(this + 0x14),(bool)this[0x18]);
    if (((byte)param_1[0x15] & 1) == 0) {
      KVar9 = (KeyValues)0x0;
      cVar3 = CUtlBuffer::CheckGet(param_1,1);
      if (cVar3 == '\0') goto LAB_0024fdb3;
      KVar9 = *(KeyValues *)(*(int *)param_1 + (*(int *)(param_1 + 0xc) - *(int *)(param_1 + 0x20)))
      ;
      *(int *)(param_1 + 0xc) = *(int *)(param_1 + 0xc) + 1;
    }
    else {
      local_42c = local_42c & 0xffffff00;
      CUtlBuffer::Scanf(param_1,"%u",&local_42c);
      KVar9 = local_42c._0_1_;
    }
    if (KVar9 != (KeyValues)0xb) {
LAB_0024fdb3:
      local_440 = this;
      do {
        local_440[0x10] = KVar9;
        CUtlBuffer::GetString(param_1,local_420,0x400);
        pcVar16 = local_420;
        local_21 = 0;
        SetName(local_440,pcVar16);
        switch(KVar9) {
        case (KeyValues)0x0:
          pKVar4 = operator_new((KeyValues *)0x2c,(uint)pcVar16);
          Init(pKVar4,*(IKeyValuesSystem **)(this + 0x14),false);
                    /* try { // try from 00250066 to 0025006a has its CatchHandler @ 002507d7 */
          SetName(pKVar4,"");
          *(KeyValues **)(local_440 + 0x20) = pKVar4;
          cVar3 = ReadAsBinary(pKVar4,param_1);
          if (cVar3 == '\0') goto LAB_0024fd2f;
          break;
        case (KeyValues)0x1:
          CUtlBuffer::GetString(param_1,local_420,0x400);
          local_21 = 0;
          iVar11 = _V_strlen(local_420);
          pvVar6 = operator_new__(iVar11 + 1U);
          *(void **)(local_440 + 4) = pvVar6;
          _V_memcpy(pvVar6,local_420,iVar11 + 1U);
          break;
        case (KeyValues)0x2:
          if (((byte)param_1[0x15] & 1) == 0) {
LAB_002503b0:
            cVar3 = CUtlBuffer::CheckGet(param_1,4);
            uVar12 = 0;
            if (cVar3 != '\0') {
              if (((byte)param_1[0x34] & 1) == 0) {
                iVar11 = *(int *)(param_1 + 0xc);
                uVar12 = *(uint *)(*(int *)param_1 + (iVar11 - *(int *)(param_1 + 0x20)));
              }
              else {
                puVar13 = (undefined4 *)
                          ((*(int *)(param_1 + 0xc) - *(int *)(param_1 + 0x20)) + *(int *)param_1);
                if (puVar13 == (undefined4 *)0x0) {
                  puVar13 = &local_434;
                }
                local_42c = local_434;
                local_42c._1_3_ = (undefined3)(local_434 >> 8);
                local_42c = CONCAT31(local_42c._1_3_,*(undefined1 *)((int)puVar13 + 3));
                local_42c._2_2_ = (undefined2)(local_434 >> 0x10);
                local_42c._0_2_ =
                     CONCAT11(*(undefined1 *)((int)puVar13 + 2),*(undefined1 *)((int)puVar13 + 3));
                local_42c._3_1_ = (undefined1)(local_434 >> 0x18);
                local_42c._0_3_ = CONCAT12(*(undefined1 *)((int)puVar13 + 1),(undefined2)local_42c);
                local_42c = CONCAT13(*(undefined1 *)puVar13,(undefined3)local_42c);
                _V_memcpy(&local_434,&local_42c,4);
                iVar11 = *(int *)(param_1 + 0xc);
                uVar12 = local_434;
              }
              *(int *)(param_1 + 0xc) = iVar11 + 4;
            }
          }
          else {
            local_434 = 0;
            CUtlBuffer::Scanf(param_1,"%d",&local_434);
            uVar12 = local_434;
          }
          goto LAB_0024ffe4;
        case (KeyValues)0x3:
          if (((byte)param_1[0x15] & 1) == 0) {
            cVar3 = CUtlBuffer::CheckGet(param_1,4);
            uVar12 = 0;
            if (cVar3 != '\0') {
              iVar11 = *(int *)(param_1 + 0xc);
              uVar12 = *(uint *)(*(int *)param_1 + (iVar11 - *(int *)(param_1 + 0x20)));
              local_434 = uVar12;
              if (((byte)param_1[0x34] & 1) != 0) {
                local_434._3_1_ = (undefined1)(uVar12 >> 0x18);
                local_434._2_1_ = (undefined1)(uVar12 >> 0x10);
                local_42c._0_2_ = CONCAT11(local_434._2_1_,local_434._3_1_);
                local_434._1_1_ = (undefined1)(uVar12 >> 8);
                local_42c._0_3_ = CONCAT12(local_434._1_1_,(undefined2)local_42c);
                local_434._0_1_ = (undefined1)uVar12;
                local_42c = CONCAT13((undefined1)local_434,(undefined3)local_42c);
                _V_memcpy(&local_434,&local_42c,4);
                iVar11 = *(int *)(param_1 + 0xc);
              }
              *(int *)(param_1 + 0xc) = iVar11 + 4;
              uVar12 = local_434;
            }
          }
          else {
            local_434 = 0;
            CUtlBuffer::Scanf(param_1,"%f",&local_434);
            uVar12 = local_434;
          }
          *(uint *)(local_440 + 0xc) = uVar12;
          break;
        case (KeyValues)0x4:
          if (((byte)param_1[0x15] & 1) == 0) goto LAB_002503b0;
          local_434 = 0;
          CUtlBuffer::Scanf(param_1,"%u",&local_434);
          uVar12 = local_434;
LAB_0024ffe4:
          *(uint *)(local_440 + 0xc) = uVar12;
          break;
        case (KeyValues)0x5:
          if (((byte)param_1[0x15] & 1) == 0) {
            cVar3 = CUtlBuffer::CheckGet(param_1,2);
            if (cVar3 != '\0') {
              if (((byte)param_1[0x34] & 1) == 0) {
                iVar11 = *(int *)(param_1 + 0xc);
                local_44a = *(short *)(*(int *)param_1 + (iVar11 - *(int *)(param_1 + 0x20)));
              }
              else {
                puVar13 = (undefined4 *)
                          ((*(int *)(param_1 + 0xc) - *(int *)(param_1 + 0x20)) + *(int *)param_1);
                if (puVar13 == (undefined4 *)0x0) {
                  puVar13 = &local_434;
                }
                uVar2 = local_42c._2_2_;
                local_42c = CONCAT22(local_42c._2_2_,(short)local_434);
                local_42c = CONCAT31(local_42c._1_3_,*(undefined1 *)((int)puVar13 + 1));
                local_42c._0_2_ = CONCAT11(*(undefined1 *)puVar13,*(undefined1 *)((int)puVar13 + 1))
                ;
                local_42c = CONCAT22(uVar2,(undefined2)local_42c);
                _V_memcpy(&local_434,&local_42c,2);
                iVar11 = *(int *)(param_1 + 0xc);
                local_44a = (short)local_434;
              }
              *(int *)(param_1 + 0xc) = iVar11 + 2;
              goto LAB_0025019b;
            }
            local_448 = 0;
            iVar11 = 0;
            local_44a = 0;
          }
          else {
            local_434 = local_434 & 0xffff0000;
            CUtlBuffer::Scanf(param_1,"%d",&local_434);
            local_44a = (short)local_434;
LAB_0025019b:
            local_448 = (int)local_44a;
            if (local_448 < 0) goto LAB_0024fd2f;
            iVar11 = local_448 * 2;
          }
          if (*(int *)(param_1 + 0x1c) - *(int *)(param_1 + 0xc) < iVar11) goto LAB_0024fd2f;
          iVar11 = 0;
          pvVar6 = operator_new__(local_448 * 4 + 4);
          *(void **)(local_440 + 8) = pvVar6;
          if (local_448 != 0) {
            while( true ) {
              iVar8 = iVar11 * 4;
              if (((byte)param_1[0x15] & 1) == 0) {
                cVar3 = CUtlBuffer::CheckGet(param_1,2);
                iVar10 = 0;
                if (cVar3 != '\0') {
                  if (((byte)param_1[0x34] & 1) == 0) {
                    iVar7 = *(int *)(param_1 + 0xc);
                    sVar1 = *(short *)(*(int *)param_1 + (iVar7 - *(int *)(param_1 + 0x20)));
                  }
                  else {
                    puVar13 = (undefined4 *)
                              ((*(int *)(param_1 + 0xc) - *(int *)(param_1 + 0x20)) +
                              *(int *)param_1);
                    if (puVar13 == (undefined4 *)0x0) {
                      puVar13 = &local_434;
                    }
                    uVar2 = local_42c._2_2_;
                    local_42c = CONCAT22(local_42c._2_2_,(short)local_434);
                    local_42c = CONCAT31(local_42c._1_3_,*(undefined1 *)((int)puVar13 + 1));
                    local_42c._0_2_ =
                         CONCAT11(*(undefined1 *)puVar13,*(undefined1 *)((int)puVar13 + 1));
                    local_42c = CONCAT22(uVar2,(undefined2)local_42c);
                    _V_memcpy(&local_434,&local_42c,2);
                    iVar7 = *(int *)(param_1 + 0xc);
                    sVar1 = (short)local_434;
                  }
                  iVar10 = (int)sVar1;
                  *(int *)(param_1 + 0xc) = iVar7 + 2;
                }
              }
              else {
                local_434 = local_434 & 0xffff0000;
                CUtlBuffer::Scanf(param_1,"%d",&local_434);
                iVar10 = (int)(short)local_434;
              }
              iVar11 = iVar11 + 1;
              *(int *)((int)pvVar6 + iVar8) = iVar10;
              if (iVar11 == local_448) break;
              pvVar6 = *(void **)(local_440 + 8);
            }
            pvVar6 = *(void **)(local_440 + 8);
          }
          *(undefined4 *)((int)pvVar6 + local_44a * 4) = 0;
          break;
        case (KeyValues)0x6:
          KVar9 = (KeyValues)((byte)param_1[0x15] & 1);
          if (((byte)param_1[0x15] & 1) == 0) {
            cVar3 = CUtlBuffer::CheckGet(param_1,1);
            if (cVar3 != '\0') {
              KVar9 = *(KeyValues *)
                       (*(int *)param_1 + (*(int *)(param_1 + 0xc) - *(int *)(param_1 + 0x20)));
              *(int *)(param_1 + 0xc) = *(int *)(param_1 + 0xc) + 1;
            }
          }
          else {
            local_42c = local_42c & 0xffffff00;
            CUtlBuffer::Scanf(param_1,"%u",&local_42c);
            KVar9 = local_42c._0_1_;
          }
          local_440[0xc] = KVar9;
          KVar9 = (KeyValues)((byte)param_1[0x15] & 1);
          if (((byte)param_1[0x15] & 1) == 0) {
            cVar3 = CUtlBuffer::CheckGet(param_1,1);
            if (cVar3 != '\0') {
              KVar9 = *(KeyValues *)
                       (*(int *)param_1 + (*(int *)(param_1 + 0xc) - *(int *)(param_1 + 0x20)));
              *(int *)(param_1 + 0xc) = *(int *)(param_1 + 0xc) + 1;
            }
          }
          else {
            local_42c = local_42c & 0xffffff00;
            CUtlBuffer::Scanf(param_1,"%u",&local_42c);
            KVar9 = local_42c._0_1_;
          }
          local_440[0xd] = KVar9;
          KVar9 = (KeyValues)((byte)param_1[0x15] & 1);
          if (((byte)param_1[0x15] & 1) == 0) {
            cVar3 = CUtlBuffer::CheckGet(param_1,1);
            if (cVar3 != '\0') {
              KVar9 = *(KeyValues *)
                       (*(int *)param_1 + (*(int *)(param_1 + 0xc) - *(int *)(param_1 + 0x20)));
              *(int *)(param_1 + 0xc) = *(int *)(param_1 + 0xc) + 1;
            }
          }
          else {
            local_42c = local_42c & 0xffffff00;
            CUtlBuffer::Scanf(param_1,"%u",&local_42c);
            KVar9 = local_42c._0_1_;
          }
          local_440[0xe] = KVar9;
          KVar9 = (KeyValues)((byte)param_1[0x15] & 1);
          if (((byte)param_1[0x15] & 1) == 0) {
            cVar3 = CUtlBuffer::CheckGet(param_1,1);
            if (cVar3 != '\0') {
              KVar9 = *(KeyValues *)
                       (*(int *)param_1 + (*(int *)(param_1 + 0xc) - *(int *)(param_1 + 0x20)));
              *(int *)(param_1 + 0xc) = *(int *)(param_1 + 0xc) + 1;
            }
          }
          else {
            local_42c = local_42c & 0xffffff00;
            CUtlBuffer::Scanf(param_1,"%u",&local_42c);
            KVar9 = local_42c._0_1_;
          }
          local_440[0xf] = KVar9;
          break;
        case (KeyValues)0x7:
          puVar5 = operator_new__(8);
          *(uint **)(local_440 + 4) = puVar5;
          if (((byte)param_1[0x15] & 1) == 0) {
            uVar12 = 0;
            uVar14 = 0;
            cVar3 = CUtlBuffer::CheckGet(param_1,8);
            if (cVar3 != '\0') {
              if (((byte)param_1[0x34] & 1) == 0) {
                iVar11 = *(int *)(param_1 + 0xc);
                uVar12 = *(uint *)(*(int *)param_1 + (iVar11 - *(int *)(param_1 + 0x20)));
                uVar14 = *(uint *)(*(int *)param_1 + 4 + (iVar11 - *(int *)(param_1 + 0x20)));
              }
              else {
                puVar13 = (undefined4 *)
                          ((*(int *)(param_1 + 0xc) - *(int *)(param_1 + 0x20)) + *(int *)param_1);
                if (puVar13 == (undefined4 *)0x0) {
                  puVar13 = &local_434;
                }
                local_42c = local_434;
                local_428 = local_430;
                iVar11 = 0;
                do {
                  iVar8 = iVar11 + 1;
                  *(undefined1 *)((int)&local_42c + iVar11) =
                       *(undefined1 *)((int)puVar13 + (7 - iVar11));
                  iVar11 = iVar8;
                } while (iVar8 != 8);
                _V_memcpy(&local_434,&local_42c,8);
                iVar11 = *(int *)(param_1 + 0xc);
                uVar12 = local_434;
                uVar14 = local_430;
              }
              *(int *)(param_1 + 0xc) = iVar11 + 8;
            }
          }
          else {
            local_434 = 0;
            local_430 = 0;
            CUtlBuffer::Scanf(param_1,"%I64d",&local_434);
            uVar12 = local_434;
            uVar14 = local_430;
          }
          *puVar5 = uVar12;
          puVar5[1] = uVar14;
        }
        if (param_1[0x14] != (CUtlBuffer)0x0) goto LAB_0024fd2f;
        if (((byte)param_1[0x15] & 1) == 0) {
          puVar17 = (undefined *)0x1;
          KVar9 = (KeyValues)0x0;
          cVar3 = CUtlBuffer::CheckGet(param_1,1);
          if (cVar3 != '\0') {
            KVar9 = *(KeyValues *)
                     (*(int *)param_1 + (*(int *)(param_1 + 0xc) - *(int *)(param_1 + 0x20)));
            *(int *)(param_1 + 0xc) = *(int *)(param_1 + 0xc) + 1;
            goto LAB_0024ff4c;
          }
        }
        else {
          puVar17 = &DAT_002b1114;
          local_42c = local_42c & 0xffffff00;
          CUtlBuffer::Scanf(param_1,"%u",&local_42c);
          KVar9 = local_42c._0_1_;
LAB_0024ff4c:
          if (KVar9 == (KeyValues)0xb) break;
        }
        pKVar4 = operator_new((KeyValues *)0x2c,(uint)puVar17);
        Init(pKVar4,*(IKeyValuesSystem **)(this + 0x14),false);
                    /* try { // try from 0024ff8e to 0024ff92 has its CatchHandler @ 002507e9 */
        SetName(pKVar4,"");
        *(KeyValues **)(local_440 + 0x1c) = pKVar4;
        local_440 = pKVar4;
      } while( true );
    }
    bVar15 = param_1[0x14] == (CUtlBuffer)0x0;
  }
  else {
LAB_0024fd2f:
    bVar15 = false;
  }
  if (local_20 != *(int *)(in_GS_OFFSET + 0x14)) {
                    /* WARNING: Subroutine does not return */
    __stack_chk_fail();
  }
  return bVar15;
}

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)