L L4D2node

Unserialize

0x00bf46a0 · 1130 bytes · __cdecl

_Z11UnserializeR10CUtlBufferR15CUtlBinaryBlock

Decompiled

undefined (2 params)

/* Unserialize(CUtlBuffer&, CUtlBinaryBlock&) */

undefined4 Unserialize(CUtlBuffer *param_1,CUtlBinaryBlock *param_2)

{
  undefined4 uVar1;
  char cVar2;
  byte bVar3;
  int *piVar4;
  int iVar5;
  uint uVar6;
  byte bVar7;
  bool bVar8;
  char cVar9;
  int iVar10;
  uint uVar11;
  char local_35;
  int local_34;
  int local_30;
  int local_24;
  undefined4 local_20;
  
  if (((byte)param_1[0x15] & 1) != 0) {
    uVar1 = *(undefined4 *)(param_1 + 0xc);
    iVar10 = 0;
    CUtlBuffer::EatWhiteSpace(param_1);
    local_30 = *(int *)(param_1 + 0xc);
    if (param_1[0x14] == (CUtlBuffer)0x0) {
      do {
        if (((byte)param_1[0x15] & 1) == 0) {
          bVar8 = true;
          cVar2 = CUtlBuffer::CheckGet(param_1,1);
          if (cVar2 != '\0') {
            bVar3 = *(byte *)(*(int *)param_1 + (*(int *)(param_1 + 0xc) - *(int *)(param_1 + 0x20))
                             );
            *(int *)(param_1 + 0xc) = *(int *)(param_1 + 0xc) + 1;
            goto LAB_00bf4817;
          }
        }
        else {
          local_20 = local_20 & 0xffffff00;
          CUtlBuffer::Scanf(param_1,"%c",&local_20);
          bVar3 = (byte)local_20;
LAB_00bf4817:
          bVar8 = 5 < (byte)((bVar3 & 0xdf) + 0xbf) && 9 < (byte)(bVar3 - 0x30);
        }
        if (((byte)param_1[0x15] & 1) == 0) {
          cVar2 = CUtlBuffer::CheckGet(param_1,1);
          bVar7 = 0xbf;
          bVar3 = 0xd0;
          if (cVar2 != '\0') {
            bVar7 = *(byte *)(*(int *)param_1 + (*(int *)(param_1 + 0xc) - *(int *)(param_1 + 0x20))
                             );
            *(int *)(param_1 + 0xc) = *(int *)(param_1 + 0xc) + 1;
            bVar3 = bVar7 - 0x30;
            bVar7 = (bVar7 & 0xdf) + 0xbf;
          }
        }
        else {
          local_20 = local_20 & 0xffffff00;
          CUtlBuffer::Scanf(param_1,"%c",&local_20);
          bVar3 = (byte)local_20 - 0x30;
          bVar7 = ((byte)local_20 & 0xdf) + 0xbf;
        }
        if ((bVar8) || ((5 < bVar7 && (9 < bVar3)))) break;
        iVar10 = iVar10 + 1;
        CUtlBuffer::EatWhiteSpace(param_1);
        local_30 = *(int *)(param_1 + 0xc);
      } while (param_1[0x14] == (CUtlBuffer)0x0);
    }
    else {
      iVar10 = 0;
    }
    CUtlBuffer::SeekGet(param_1,0,uVar1);
    CUtlBuffer::EatWhiteSpace(param_1);
    CUtlBinaryBlock::SetLength(param_2,iVar10);
    local_34 = 0;
    iVar10 = *(int *)(param_1 + 0xc);
    do {
      if (local_30 <= iVar10) {
        return 1;
      }
      if (((byte)param_1[0x15] & 1) == 0) {
        cVar2 = CUtlBuffer::CheckGet(param_1,1);
        if (cVar2 == '\0') {
          uVar11 = 0xffffffd0;
          iVar10 = 0;
          local_35 = '\0';
        }
        else {
          local_35 = *(char *)(*(int *)param_1 +
                              (*(int *)(param_1 + 0xc) - *(int *)(param_1 + 0x20)));
          *(int *)(param_1 + 0xc) = *(int *)(param_1 + 0xc) + 1;
          iVar10 = (int)local_35;
          uVar11 = iVar10 - 0x30;
        }
      }
      else {
        local_20 = local_20 & 0xffffff00;
        CUtlBuffer::Scanf(param_1,"%c",&local_20);
        iVar10 = (int)(char)(byte)local_20;
        local_35 = (byte)local_20;
        uVar11 = iVar10 - 0x30;
      }
      if (((byte)param_1[0x15] & 1) == 0) {
        cVar2 = CUtlBuffer::CheckGet(param_1,1);
        if (cVar2 == '\0') {
          uVar6 = 0xffffffd0;
          iVar5 = 0;
          cVar2 = '\0';
        }
        else {
          cVar2 = *(char *)(*(int *)param_1 + (*(int *)(param_1 + 0xc) - *(int *)(param_1 + 0x20)));
          *(int *)(param_1 + 0xc) = *(int *)(param_1 + 0xc) + 1;
          iVar5 = (int)cVar2;
          uVar6 = iVar5 - 0x30;
        }
      }
      else {
        local_20 = local_20 & 0xffffff00;
        CUtlBuffer::Scanf(param_1,"%c",&local_20);
        iVar5 = (int)(char)(byte)local_20;
        uVar6 = iVar5 - 0x30;
        cVar2 = (byte)local_20;
      }
      if (uVar11 < 10) {
        cVar9 = local_35 + -0x30;
LAB_00bf48d7:
        if (9 < uVar6) goto LAB_00bf49a2;
LAB_00bf48e0:
        bVar3 = cVar2 - 0x30;
      }
      else {
        if (5 < iVar10 - 0x41U) {
          cVar9 = -1;
          if (iVar10 - 0x61U < 6) {
            cVar9 = local_35 + -0x57;
          }
          goto LAB_00bf48d7;
        }
        cVar9 = local_35 + -0x37;
        if (uVar6 < 10) goto LAB_00bf48e0;
LAB_00bf49a2:
        if (iVar5 - 0x41U < 6) {
          bVar3 = cVar2 - 0x37;
        }
        else {
          if (5 < iVar5 - 0x61U) {
            return 0;
          }
          bVar3 = cVar2 + 0xa9;
        }
      }
      if ((bVar3 == 0xff) || (cVar9 == -1)) {
        return 0;
      }
      *(byte *)(*(int *)param_2 + local_34) = cVar9 << 4 | bVar3;
      CUtlBuffer::EatWhiteSpace(param_1);
      local_34 = local_34 + 1;
      iVar10 = *(int *)(param_1 + 0xc);
    } while( true );
  }
  cVar2 = CUtlBuffer::CheckGet(param_1,4);
  iVar10 = 0;
  if (cVar2 != '\0') {
    if (((byte)param_1[0x34] & 1) == 0) {
      iVar10 = *(int *)(param_1 + 0xc);
      local_24 = *(int *)(*(int *)param_1 + (iVar10 - *(int *)(param_1 + 0x20)));
    }
    else {
      piVar4 = (int *)((*(int *)(param_1 + 0xc) - *(int *)(param_1 + 0x20)) + *(int *)param_1);
      if (piVar4 == (int *)0x0) {
        piVar4 = &local_24;
      }
      local_20 = local_24;
      local_20 = CONCAT31((int3)((uint)local_24 >> 8),*(undefined1 *)((int)piVar4 + 3));
      local_20._2_2_ = (undefined2)((uint)local_24 >> 0x10);
      local_20._0_2_ = CONCAT11(*(undefined1 *)((int)piVar4 + 2),*(undefined1 *)((int)piVar4 + 3));
      local_20._3_1_ = (undefined1)((uint)local_24 >> 0x18);
      local_20._0_3_ = CONCAT12(*(undefined1 *)((int)piVar4 + 1),(undefined2)local_20);
      local_20 = CONCAT13((char)*piVar4,(undefined3)local_20);
      _V_memcpy(&local_24,&local_20,4);
      iVar10 = *(int *)(param_1 + 0xc);
    }
    *(int *)(param_1 + 0xc) = iVar10 + 4;
    iVar10 = local_24;
  }
  CUtlBinaryBlock::SetLength(param_2,iVar10);
  iVar5 = 0;
  if (*(int *)(param_2 + 0xc) == 0) {
    if (iVar10 == 0) {
LAB_00bf4b00:
      return CONCAT31((int3)((uint)iVar5 >> 8),param_1[0x14] == (CUtlBuffer)0x0);
    }
  }
  else {
    CUtlBuffer::Get(param_1,*(void **)param_2,*(int *)(param_2 + 0xc));
    iVar5 = *(int *)(param_2 + 0xc);
    if (iVar10 == iVar5) goto LAB_00bf4b00;
  }
  CUtlBuffer::SeekGet(param_1,1,iVar10 - iVar5);
  return 0;
}

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)