L L4D2node

BasicGameStats_t::ParseFromBuffer

0x006cf260 · 1287 bytes · __thiscall

_ZN16BasicGameStats_t15ParseFromBufferER10CUtlBufferi

Decompiled

undefined (3 params)

/* BasicGameStats_t::ParseFromBuffer(CUtlBuffer&, int) */

bool __thiscall
BasicGameStats_t::ParseFromBuffer(BasicGameStats_t *this,CUtlBuffer *param_1,int param_2)

{
  short sVar1;
  undefined2 uVar2;
  char cVar3;
  BasicGameStatsRecord_t *this_00;
  uint *puVar4;
  int iVar5;
  uint uVar6;
  int iVar7;
  bool bVar8;
  int in_GS_OFFSET;
  BasicGameStats_t BVar9;
  uint local_138;
  uint local_128;
  undefined4 local_124;
  char local_120 [256];
  int local_20;
  
  local_20 = *(int *)(in_GS_OFFSET + 0x14);
  if (((byte)param_1[0x15] & 1) == 0) {
    cVar3 = CUtlBuffer::CheckGet(param_1,4);
    if (cVar3 == '\0') {
      bVar8 = true;
      uVar6 = 0;
    }
    else {
      if (((byte)param_1[0x34] & 1) == 0) {
        iVar7 = *(int *)(param_1 + 0xc);
        uVar6 = *(uint *)(*(int *)param_1 + (iVar7 - *(int *)(param_1 + 0x20)));
      }
      else {
        puVar4 = (uint *)((*(int *)(param_1 + 0xc) - *(int *)(param_1 + 0x20)) + *(int *)param_1);
        if (puVar4 == (uint *)0x0) {
          puVar4 = &local_128;
        }
        local_124 = local_128;
        local_124._1_3_ = (undefined3)(local_128 >> 8);
        local_124 = CONCAT31(local_124._1_3_,*(undefined1 *)((int)puVar4 + 3));
        local_124._2_2_ = (undefined2)(local_128 >> 0x10);
        local_124._0_2_ =
             CONCAT11(*(undefined1 *)((int)puVar4 + 2),*(undefined1 *)((int)puVar4 + 3));
        local_124._3_1_ = (undefined1)(local_128 >> 0x18);
        local_124._0_3_ = CONCAT12(*(undefined1 *)((int)puVar4 + 1),(undefined2)local_124);
        local_124 = CONCAT13((char)*puVar4,(undefined3)local_124);
        _V_memcpy(&local_128,&local_124,4);
        iVar7 = *(int *)(param_1 + 0xc);
        uVar6 = local_128;
      }
      *(int *)(param_1 + 0xc) = iVar7 + 4;
      bVar8 = uVar6 < 0x989681;
    }
  }
  else {
    local_128 = 0;
    CUtlBuffer::Scanf(param_1,"%d",&local_128);
    bVar8 = local_128 < 0x989681;
    uVar6 = local_128;
  }
  *(uint *)this = uVar6;
  BasicGameStatsRecord_t::ParseFromBuffer((BasicGameStatsRecord_t *)(this + 4),param_1,param_2);
  if (((byte)param_1[0x15] & 1) == 0) {
    cVar3 = CUtlBuffer::CheckGet(param_1,4);
    if (cVar3 == '\0') goto LAB_006cf39a;
    if (((byte)param_1[0x34] & 1) == 0) {
      iVar7 = *(int *)(param_1 + 0xc);
      local_138 = *(uint *)(*(int *)param_1 + (iVar7 - *(int *)(param_1 + 0x20)));
    }
    else {
      puVar4 = (uint *)((*(int *)(param_1 + 0xc) - *(int *)(param_1 + 0x20)) + *(int *)param_1);
      if (puVar4 == (uint *)0x0) {
        puVar4 = &local_128;
      }
      local_124 = local_128;
      local_124._1_3_ = (undefined3)(local_128 >> 8);
      local_124 = CONCAT31(local_124._1_3_,*(undefined1 *)((int)puVar4 + 3));
      local_124._2_2_ = (undefined2)(local_128 >> 0x10);
      local_124._0_2_ = CONCAT11(*(undefined1 *)((int)puVar4 + 2),*(undefined1 *)((int)puVar4 + 3));
      local_124._3_1_ = (undefined1)(local_128 >> 0x18);
      local_124._0_3_ = CONCAT12(*(undefined1 *)((int)puVar4 + 1),(undefined2)local_124);
      local_124 = CONCAT13((char)*puVar4,(undefined3)local_124);
      _V_memcpy(&local_128,&local_124,4);
      iVar7 = *(int *)(param_1 + 0xc);
      local_138 = local_128;
    }
    *(int *)(param_1 + 0xc) = iVar7 + 4;
  }
  else {
    local_128 = 0;
    CUtlBuffer::Scanf(param_1,"%d",&local_128);
    local_138 = local_128;
  }
  if (0x400 < local_138) {
    bVar8 = false;
  }
  if (0 < (int)local_138) {
    uVar6 = 0;
    do {
      CUtlBuffer::GetString(param_1,local_120,0x100);
      this_00 = (BasicGameStatsRecord_t *)FindOrAddRecordForMap(this,local_120);
      cVar3 = BasicGameStatsRecord_t::ParseFromBuffer(this_00,param_1,param_2);
      if (cVar3 == '\0') {
        bVar8 = false;
      }
      uVar6 = uVar6 + 1;
    } while (uVar6 != local_138);
  }
LAB_006cf39a:
  if (1 < param_2) {
    if (((byte)param_1[0x15] & 1) == 0) {
      cVar3 = CUtlBuffer::CheckGet(param_1,1);
      if (cVar3 != '\0') {
        *(int *)(param_1 + 0xc) = *(int *)(param_1 + 0xc) + 1;
      }
    }
    else {
      local_124 = local_124 & 0xffffff00;
      CUtlBuffer::Scanf(param_1,"%c",&local_124);
    }
    if (((byte)param_1[0x15] & 1) == 0) {
      cVar3 = CUtlBuffer::CheckGet(param_1,1);
      BVar9 = (BasicGameStats_t)0x0;
      if (cVar3 != '\0') {
        cVar3 = *(char *)(*(int *)param_1 + (*(int *)(param_1 + 0xc) - *(int *)(param_1 + 0x20)));
        *(int *)(param_1 + 0xc) = *(int *)(param_1 + 0xc) + 1;
        BVar9 = (BasicGameStats_t)(cVar3 != '\0');
      }
    }
    else {
      local_124 = local_124 & 0xffffff00;
      CUtlBuffer::Scanf(param_1,"%c",&local_124);
      BVar9 = (BasicGameStats_t)((char)local_124 != '\0');
    }
    this[0x48] = BVar9;
    if (param_2 != 2) {
      if (((byte)param_1[0x15] & 1) == 0) {
        cVar3 = CUtlBuffer::CheckGet(param_1,1);
        BVar9 = (BasicGameStats_t)0x0;
        if (cVar3 != '\0') {
          cVar3 = *(char *)(*(int *)param_1 + (*(int *)(param_1 + 0xc) - *(int *)(param_1 + 0x20)));
          *(int *)(param_1 + 0xc) = *(int *)(param_1 + 0xc) + 1;
          BVar9 = (BasicGameStats_t)(cVar3 != '\0');
        }
      }
      else {
        local_124 = local_124 & 0xffffff00;
        CUtlBuffer::Scanf(param_1,"%c",&local_124);
        BVar9 = (BasicGameStats_t)((char)local_124 != '\0');
      }
      this[0x49] = BVar9;
      if (param_2 != 3) {
        if (((byte)param_1[0x15] & 1) == 0) {
          cVar3 = CUtlBuffer::CheckGet(param_1,2);
          iVar7 = 0;
          if (cVar3 != '\0') {
            if (((byte)param_1[0x34] & 1) == 0) {
              iVar5 = *(int *)(param_1 + 0xc);
              sVar1 = *(short *)(*(int *)param_1 + (iVar5 - *(int *)(param_1 + 0x20)));
            }
            else {
              puVar4 = (uint *)((*(int *)(param_1 + 0xc) - *(int *)(param_1 + 0x20)) +
                               *(int *)param_1);
              if (puVar4 == (uint *)0x0) {
                puVar4 = &local_128;
              }
              uVar2 = local_124._2_2_;
              local_124 = CONCAT22(local_124._2_2_,(short)local_128);
              local_124 = CONCAT31(local_124._1_3_,*(undefined1 *)((int)puVar4 + 1));
              local_124._0_2_ = CONCAT11((char)*puVar4,*(undefined1 *)((int)puVar4 + 1));
              local_124 = CONCAT22(uVar2,(undefined2)local_124);
              _V_memcpy(&local_128,&local_124,2);
              iVar5 = *(int *)(param_1 + 0xc);
              sVar1 = (short)local_128;
            }
            iVar7 = (int)sVar1;
            *(int *)(param_1 + 0xc) = iVar5 + 2;
          }
        }
        else {
          local_128 = local_128 & 0xffff0000;
          CUtlBuffer::Scanf(param_1,"%d",&local_128);
          iVar7 = (int)(short)local_128;
        }
        *(int *)(this + 0x4c) = iVar7;
      }
    }
  }
  if (local_20 == *(int *)(in_GS_OFFSET + 0x14)) {
    return bVar8;
  }
                    /* 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)