L L4D2node

DataTable_ParseClassInfosFromBuffer

0x00144a40 · 996 bytes · __cdecl

_Z35DataTable_ParseClassInfosFromBufferP12CClientStateP7bf_read

Decompiled

undefined (2 params)

/* DataTable_ParseClassInfosFromBuffer(CClientState*, bf_read*) */

undefined4 DataTable_ParseClassInfosFromBuffer(CClientState *param_1,bf_read *param_2)

{
  int iVar1;
  undefined4 *puVar2;
  uint uVar3;
  short sVar4;
  ushort uVar5;
  uint *puVar6;
  undefined4 uVar7;
  uint uVar8;
  int iVar9;
  C_ServerClassInfo *this;
  C_ServerClassInfo *pCVar10;
  byte local_28;
  uint local_24;
  C_ServerClassInfo *local_20;
  
  pCVar10 = *(C_ServerClassInfo **)(param_1 + 0x41c4);
  if (pCVar10 != (C_ServerClassInfo *)0x0) {
    this = pCVar10 + *(int *)(pCVar10 + -4) * 0x10;
    if (pCVar10 != this) {
      do {
        this = this + -0x10;
        C_ServerClassInfo::~C_ServerClassInfo(this);
        pCVar10 = *(C_ServerClassInfo **)(param_1 + 0x41c4);
      } while (pCVar10 != this);
    }
    operator_delete__(pCVar10 + -4);
  }
  iVar9 = *(int *)(param_2 + 0x14);
  if (iVar9 < 0x10) {
    puVar6 = *(uint **)(param_2 + 0x18);
    uVar7 = *(undefined4 *)(param_2 + 0x10);
    if (puVar6 == *(uint **)(param_2 + 0x1c)) {
      *(undefined4 *)(param_2 + 0x14) = 1;
      *(undefined4 *)(param_2 + 0x10) = 0;
      *(uint **)(param_2 + 0x18) = puVar6 + 1;
      param_2[4] = (bf_read)0x1;
    }
    else if (*(uint **)(param_2 + 0x1c) < puVar6) {
      param_2[4] = (bf_read)0x1;
      *(undefined4 *)(param_2 + 0x10) = 0;
    }
    else {
      *(uint **)(param_2 + 0x18) = puVar6 + 1;
      uVar8 = *puVar6;
      *(uint *)(param_2 + 0x10) = uVar8;
      if (param_2[4] == (bf_read)0x0) {
        uVar3 = (&CBitBuffer::s_nMaskTable)[0x10 - iVar9];
        *(int *)(param_2 + 0x14) = iVar9 + 0x10;
        uVar5 = (ushort)((uVar3 & uVar8) << ((byte)iVar9 & 0x1f)) | (ushort)uVar7;
        *(uint *)(param_2 + 0x10) = uVar8 >> ((byte)(0x10 - iVar9) & 0x1f);
        goto LAB_00144abb;
      }
    }
    iVar9 = -1;
    local_24 = 0;
    *(undefined4 *)(param_1 + 0x41c8) = 0;
    uVar8 = 4;
LAB_00144b36:
    puVar6 = operator_new__(uVar8);
    pCVar10 = (C_ServerClassInfo *)(puVar6 + 1);
    *puVar6 = local_24;
    local_20 = pCVar10;
    if (iVar9 == -1) goto LAB_00144b6b;
  }
  else {
    *(int *)(param_2 + 0x14) = iVar9 + -0x10;
    uVar5 = (ushort)*(uint *)(param_2 + 0x10);
    if (iVar9 + -0x10 == 0) {
      puVar2 = *(undefined4 **)(param_2 + 0x18);
      *(undefined4 *)(param_2 + 0x14) = 0x20;
      if (puVar2 == *(undefined4 **)(param_2 + 0x1c)) {
        *(undefined4 *)(param_2 + 0x14) = 1;
        *(undefined4 *)(param_2 + 0x10) = 0;
        *(undefined4 **)(param_2 + 0x18) = puVar2 + 1;
      }
      else if (*(undefined4 **)(param_2 + 0x1c) < puVar2) {
        param_2[4] = (bf_read)0x1;
        *(undefined4 *)(param_2 + 0x10) = 0;
      }
      else {
        *(undefined4 **)(param_2 + 0x18) = puVar2 + 1;
        *(undefined4 *)(param_2 + 0x10) = *puVar2;
      }
    }
    else {
      *(uint *)(param_2 + 0x10) = *(uint *)(param_2 + 0x10) >> 0x10;
    }
LAB_00144abb:
    local_24 = (uint)(short)uVar5;
    *(uint *)(param_1 + 0x41c8) = local_24;
    if (local_24 < 0x7f00001) {
      iVar9 = local_24 - 1;
      uVar8 = local_24 * 0x10 + 4;
      goto LAB_00144b36;
    }
    iVar9 = local_24 - 1;
    puVar6 = operator_new__(0xffffffff);
    pCVar10 = (C_ServerClassInfo *)(puVar6 + 1);
    *puVar6 = local_24;
    local_20 = pCVar10;
  }
  do {
                    /* try { // try from 00144b5b to 00144b5f has its CatchHandler @ 00144e61 */
    C_ServerClassInfo::C_ServerClassInfo(pCVar10);
    iVar9 = iVar9 + -1;
    pCVar10 = pCVar10 + 0x10;
  } while (iVar9 != -1);
LAB_00144b6b:
  *(C_ServerClassInfo **)(param_1 + 0x41c4) = local_20;
  if (local_20 == (C_ServerClassInfo *)0x0) {
    Host_EndGame(true,"CL_ParseClassInfo: can\'t allocate %d C_ServerClassInfos.\n",
                 *(undefined4 *)(param_1 + 0x41c8));
    uVar7 = 0;
  }
  else {
    if (0 < *(int *)(param_1 + 0x41c8)) {
      local_20 = (C_ServerClassInfo *)0x0;
      do {
        iVar9 = *(int *)(param_2 + 0x14);
        if (iVar9 < 0x10) {
          uVar7 = *(undefined4 *)(param_2 + 0x10);
          puVar6 = *(uint **)(param_2 + 0x18);
          if (puVar6 == *(uint **)(param_2 + 0x1c)) {
            *(undefined4 *)(param_2 + 0x14) = 1;
            *(uint **)(param_2 + 0x18) = puVar6 + 1;
            *(undefined4 *)(param_2 + 0x10) = 0;
            param_2[4] = (bf_read)0x1;
          }
          else if (*(uint **)(param_2 + 0x1c) < puVar6) {
            param_2[4] = (bf_read)0x1;
            *(undefined4 *)(param_2 + 0x10) = 0;
          }
          else {
            *(uint **)(param_2 + 0x18) = puVar6 + 1;
            uVar8 = *puVar6;
            *(uint *)(param_2 + 0x10) = uVar8;
            if (param_2[4] == (bf_read)0x0) {
              uVar3 = (&CBitBuffer::s_nMaskTable)[0x10 - iVar9];
              *(int *)(param_2 + 0x14) = iVar9 + 0x10;
              local_28 = (byte)(0x10 - iVar9);
              *(uint *)(param_2 + 0x10) = uVar8 >> (local_28 & 0x1f);
              iVar9 = (int)(short)((ushort)((uVar3 & uVar8) << ((byte)iVar9 & 0x1f)) | (ushort)uVar7
                                  );
              goto LAB_00144bbf;
            }
          }
          iVar9 = 0;
          if (*(int *)(param_1 + 0x41c8) < 1) {
LAB_00144c64:
            Host_EndGame(true,"DataTable_ParseClassInfosFromBuffer: invalid class index (%d).\n",
                         iVar9);
            return 0;
          }
        }
        else {
          *(int *)(param_2 + 0x14) = iVar9 + -0x10;
          sVar4 = (short)*(uint *)(param_2 + 0x10);
          if (iVar9 + -0x10 == 0) {
            puVar2 = *(undefined4 **)(param_2 + 0x18);
            *(undefined4 *)(param_2 + 0x14) = 0x20;
            if (puVar2 == *(undefined4 **)(param_2 + 0x1c)) {
              *(undefined4 *)(param_2 + 0x14) = 1;
              iVar9 = (int)sVar4;
              *(undefined4 *)(param_2 + 0x10) = 0;
              *(undefined4 **)(param_2 + 0x18) = puVar2 + 1;
            }
            else if (*(undefined4 **)(param_2 + 0x1c) < puVar2) {
              param_2[4] = (bf_read)0x1;
              iVar9 = (int)sVar4;
              *(undefined4 *)(param_2 + 0x10) = 0;
            }
            else {
              iVar9 = (int)sVar4;
              *(undefined4 **)(param_2 + 0x18) = puVar2 + 1;
              *(undefined4 *)(param_2 + 0x10) = *puVar2;
            }
          }
          else {
            iVar9 = (int)sVar4;
            *(uint *)(param_2 + 0x10) = *(uint *)(param_2 + 0x10) >> 0x10;
          }
LAB_00144bbf:
          if (*(int *)(param_1 + 0x41c8) <= iVar9) goto LAB_00144c64;
        }
        iVar1 = *(int *)(param_1 + 0x41c4);
        uVar7 = CBitRead::ReadAndAllocateString((CBitRead *)param_2,(bool *)0x0);
        *(undefined4 *)(iVar9 * 0x10 + iVar1 + 4) = uVar7;
        iVar1 = *(int *)(param_1 + 0x41c4);
        uVar7 = CBitRead::ReadAndAllocateString((CBitRead *)param_2,(bool *)0x0);
        local_20 = (C_ServerClassInfo *)((int)local_20 + 1);
        *(undefined4 *)(iVar9 * 0x10 + iVar1 + 8) = uVar7;
      } while ((int)local_20 < *(int *)(param_1 + 0x41c8));
    }
    uVar7 = 1;
  }
  return uVar7;
}

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)