L L4D2node

CBaseClientState::ProcessCreateStringTable

0x000ff450 · 1857 bytes · __thiscall

_ZN16CBaseClientState24ProcessCreateStringTableEP21SVC_CreateStringTable

Decompiled

undefined (2 params)

/* WARNING: Globals starting with '_' overlap smaller symbols at the same address */
/* CBaseClientState::ProcessCreateStringTable(SVC_CreateStringTable*) */

bool __thiscall
CBaseClientState::ProcessCreateStringTable(CBaseClientState *this,SVC_CreateStringTable *param_1)

{
  SVC_CreateStringTable SVar1;
  uint uVar2;
  undefined4 uVar3;
  int iVar4;
  byte bVar5;
  char cVar6;
  CNetworkStringTable *this_00;
  uint *puVar7;
  char *pcVar8;
  char *pcVar9;
  int iVar10;
  uint *puVar11;
  int iVar12;
  uint uVar13;
  int iVar14;
  uint *puVar15;
  uint local_74;
  int local_68;
  uint local_64;
  uint local_60;
  uint local_58;
  undefined4 local_54;
  undefined4 local_50;
  undefined4 local_4c;
  undefined4 local_48;
  int local_44;
  undefined4 local_40;
  undefined1 local_3c;
  undefined4 local_38;
  undefined4 local_34;
  
  local_54 = 0;
  local_50 = 0;
  if (_exit == 0) {
    local_44 = 0;
  }
  else {
    (**(code **)(_exit + 0x50))
              (_exit,&local_54,0,0,0,0,"/data/src/engine/./baseclientstate.cpp",0x75a,
               &ProcessCreateStringTable(SVC_CreateStringTable*)::tm_fmt,"(%s)%s","Unaccounted",
               "ProcessCreateStringTable");
    local_44 = _exit;
  }
  iVar14 = _DAT_0040b9d4;
  local_4c = local_54;
  local_48 = local_50;
                    /* try { // try from 000ff736 to 000ff784 has its CatchHandler @ 000ffbd6 */
  if (((_DAT_0040b028 != 0) || (DAT_0040b02c == '\0')) &&
     (iVar10 = ThreadGetCurrentId(), iVar14 == iVar10)) {
    if ((char *)*_DAT_0040b030 != "ProcessCreateStringTable") {
      _DAT_0040b030 =
           (int *)CVProfNode::GetSubNode((char *)_DAT_0040b030,0x2a6d7b,&DAT_00000001,0x2a054b);
    }
    CVProfNode::EnterScope();
    DAT_0040b02c = '\0';
  }
                    /* try { // try from 000ff518 to 000ff6ee has its CatchHandler @ 000ffbeb */
  COM_TimestampedLog(" CBaseClient::ProcessCreateStringTable(%s)",*(undefined4 *)(param_1 + 0x4c));
  CNetworkStringTableContainer::AllowCreation
            (*(CNetworkStringTableContainer **)(this + 0x49d4),true);
  if (*(int *)(param_1 + 0x8c) == 0) {
    local_68 = 0;
  }
  else {
    iVar14 = (((uint)(*(int *)(param_1 + 0x84) - *(int *)(param_1 + 0x8c)) >> 2) * 0x20 -
             *(int *)(param_1 + 0x80)) + (*(uint *)(param_1 + 0x78) & 3) * 8;
    local_68 = *(int *)(param_1 + 0x74);
    if (iVar14 <= *(int *)(param_1 + 0x74)) {
      local_68 = iVar14;
    }
  }
  this_00 = (CNetworkStringTable *)
            (**(code **)(**(int **)(this + 0x49d4) + 8))
                      (*(int **)(this + 0x49d4),*(undefined4 *)(param_1 + 0x4c),
                       *(undefined4 *)(param_1 + 0x50),*(undefined4 *)(param_1 + 0x5c),
                       *(undefined4 *)(param_1 + 0x60),*(undefined4 *)(param_1 + 100));
  (**(code **)(*(int *)this_00 + 0x1c))(this_00,*(undefined4 *)(this + 0xb8));
  (**(code **)(*(int *)this + 0xb4))(this,*(undefined4 *)(param_1 + 0x4c));
  SVar1 = param_1[0xa8];
  if (SVar1 == (SVC_CreateStringTable)0x0) {
    CNetworkStringTable::ParseUpdate(this_00,(bf_read *)(param_1 + 0x6c),*(int *)(param_1 + 0x54));
    goto LAB_000ff869;
  }
  iVar14 = *(int *)(param_1 + 0x80);
  if (iVar14 < 0x20) {
    uVar2 = *(uint *)(param_1 + 0x7c);
    puVar15 = *(uint **)(param_1 + 0x88);
    puVar11 = *(uint **)(param_1 + 0x84);
    if (puVar11 == puVar15) {
      puVar7 = puVar11 + 1;
      *(undefined4 *)(param_1 + 0x7c) = 0;
      *(undefined4 *)(param_1 + 0x80) = 1;
      *(uint **)(param_1 + 0x84) = puVar7;
      param_1[0x70] = (SVC_CreateStringTable)0x1;
      local_64 = 1;
    }
    else {
      local_64 = iVar14;
      if (puVar11 < puVar15) {
        puVar7 = puVar11 + 1;
        *(uint **)(param_1 + 0x84) = puVar7;
        local_74 = *puVar11;
        *(uint *)(param_1 + 0x7c) = local_74;
        if (param_1[0x70] == (SVC_CreateStringTable)0x0) {
          uVar13 = (&CBitBuffer::s_nMaskTable)[0x20 - iVar14] & local_74;
          local_64._0_1_ = (byte)iVar14;
          bVar5 = (byte)local_64 & 0x1f;
          *(int *)(param_1 + 0x80) = iVar14;
          local_74 = local_74 >> ((byte)(0x20 - iVar14) & 0x1f);
          *(uint *)(param_1 + 0x7c) = local_74;
          local_60 = uVar13 << bVar5 | uVar2;
        }
        else {
          local_60 = 0;
        }
        goto LAB_000ff659;
      }
      param_1[0x70] = (SVC_CreateStringTable)0x1;
      *(undefined4 *)(param_1 + 0x7c) = 0;
      puVar7 = puVar11;
    }
    local_74 = 0;
    local_60 = 0;
LAB_000ff659:
    if (puVar7 == puVar15) {
      *(undefined4 *)(param_1 + 0x7c) = 0;
      *(undefined4 *)(param_1 + 0x80) = 1;
      *(uint **)(param_1 + 0x84) = puVar7 + 1;
      param_1[0x70] = (SVC_CreateStringTable)0x1;
    }
    else if (puVar15 < puVar7) {
      param_1[0x70] = (SVC_CreateStringTable)0x1;
      *(undefined4 *)(param_1 + 0x7c) = 0;
    }
    else {
      *(uint **)(param_1 + 0x84) = puVar7 + 1;
      uVar2 = *puVar7;
      *(uint *)(param_1 + 0x7c) = uVar2;
      if (param_1[0x70] == (SVC_CreateStringTable)0x0) {
        uVar3 = *(undefined4 *)(param_1 + 0x80);
        uVar13 = (&CBitBuffer::s_nMaskTable)[0x20 - local_64];
        *(uint *)(param_1 + 0x80) = local_64;
        *(uint *)(param_1 + 0x7c) = uVar2 >> ((byte)(0x20 - local_64) & 0x1f);
        local_64 = (uVar13 & uVar2) << ((byte)uVar3 & 0x1f) | local_74;
        goto LAB_000ff81d;
      }
    }
    local_64 = 0;
    local_58 = local_60;
LAB_000ff67a:
    uVar2 = local_58;
    if ((SVar1 != (SVC_CreateStringTable)0x0) && (local_58 < 0x7fffffff)) {
      pcVar8 = operator_new__(local_58 + 3 & 0xfffffffc);
      pcVar9 = operator_new__(local_64 + 3 & 0xfffffffc);
      CBitRead::ReadBits((CBitRead *)(param_1 + 0x6c),pcVar9,local_64 * 8);
      bVar5 = NET_BufferToBufferDecompress(pcVar8,&local_58,pcVar9,local_64);
      bVar5 = bVar5 & local_58 == uVar2;
      if (bVar5 != 0) {
        local_3c = 0;
        local_40 = 0;
        local_38 = 0xffffffff;
        local_34 = 0;
                    /* try { // try from 000ffaca to 000ffae4 has its CatchHandler @ 000ffbeb */
        CBitRead::StartReading((CBitRead *)&local_40,pcVar8,local_58,0,-1);
        CNetworkStringTable::ParseUpdate(this_00,(bf_read *)&local_40,*(int *)(param_1 + 0x54));
      }
      if (pcVar8 != (char *)0x0) {
        operator_delete__(pcVar8);
      }
      if (pcVar9 != (char *)0x0) {
        operator_delete__(pcVar9);
      }
      if (bVar5 != 0) goto LAB_000ff869;
    }
  }
  else {
    local_64 = iVar14 + -0x20;
    *(uint *)(param_1 + 0x80) = local_64;
    uVar2 = *(uint *)(param_1 + 0x7c);
    local_60 = uVar2;
    if (local_64 != 0) {
      *(undefined4 *)(param_1 + 0x7c) = 0;
      if ((int)local_64 < 0x20) {
        puVar15 = *(uint **)(param_1 + 0x88);
        puVar7 = *(uint **)(param_1 + 0x84);
        local_74 = 0;
        goto LAB_000ff659;
      }
      *(int *)(param_1 + 0x80) = iVar14 + -0x40;
      if (iVar14 + -0x40 == 0) {
        local_64 = 0;
        puVar11 = *(uint **)(param_1 + 0x84);
        puVar15 = *(uint **)(param_1 + 0x88);
        goto LAB_000ff7f4;
      }
      local_64 = 0;
      *(undefined4 *)(param_1 + 0x7c) = 0;
LAB_000ff97f:
      SVar1 = (SVC_CreateStringTable)(local_64 < 0x7fffffff);
      local_58 = local_60;
      goto LAB_000ff67a;
    }
    *(undefined4 *)(param_1 + 0x80) = 0x20;
    puVar7 = *(uint **)(param_1 + 0x84);
    puVar15 = *(uint **)(param_1 + 0x88);
    if (puVar7 == puVar15) {
      puVar7 = puVar7 + 1;
      *(undefined4 *)(param_1 + 0x7c) = 0;
      *(undefined4 *)(param_1 + 0x80) = 1;
      *(uint **)(param_1 + 0x84) = puVar7;
      local_74 = 0;
      local_64 = 1;
      goto LAB_000ff659;
    }
    if (puVar15 < puVar7) {
      param_1[0x70] = (SVC_CreateStringTable)0x1;
      *(undefined4 *)(param_1 + 0x7c) = 0;
      local_60 = 0;
      puVar11 = puVar7;
    }
    else {
      puVar11 = puVar7 + 1;
      *(uint **)(param_1 + 0x84) = puVar11;
      local_60 = *puVar7;
      *(uint *)(param_1 + 0x7c) = local_60;
    }
    local_64 = local_60;
LAB_000ff7f4:
    *(undefined4 *)(param_1 + 0x80) = 0x20;
    if (puVar11 == puVar15) {
      *(undefined4 *)(param_1 + 0x7c) = 0;
      *(undefined4 *)(param_1 + 0x80) = 1;
      *(uint **)(param_1 + 0x84) = puVar11 + 1;
      local_60 = uVar2;
    }
    else if (puVar15 < puVar11) {
      param_1[0x70] = (SVC_CreateStringTable)0x1;
      *(undefined4 *)(param_1 + 0x7c) = 0;
      local_60 = uVar2;
    }
    else {
      *(uint **)(param_1 + 0x84) = puVar11 + 1;
      *(uint *)(param_1 + 0x7c) = *puVar11;
      local_60 = uVar2;
    }
LAB_000ff81d:
    local_58 = local_60;
    if (local_64 <= *(uint *)(param_1 + 0x78)) goto LAB_000ff97f;
  }
                    /* try { // try from 000ff833 to 000ff8c6 has its CatchHandler @ 000ffbeb */
  Warning("Malformed message in CBaseClientState::ProcessCreateStringTable\n");
LAB_000ff869:
  CNetworkStringTableContainer::AllowCreation
            (*(CNetworkStringTableContainer **)(this + 0x49d4),false);
  if (*(int *)(param_1 + 0x8c) == 0) {
    iVar14 = 0;
  }
  else {
    iVar10 = (((uint)(*(int *)(param_1 + 0x84) - *(int *)(param_1 + 0x8c)) >> 2) * 0x20 -
             *(int *)(param_1 + 0x80)) + (*(uint *)(param_1 + 0x78) & 3) * 8;
    iVar14 = *(int *)(param_1 + 0x74);
    if (iVar10 <= *(int *)(param_1 + 0x74)) {
      iVar14 = iVar10;
    }
  }
  COM_TimestampedLog(" CBaseClient::ProcessCreateStringTable(%s)-done",
                     *(undefined4 *)(param_1 + 0x4c));
  iVar4 = _DAT_0040b9d4;
  iVar10 = *(int *)(param_1 + 0x68);
  if (((DAT_0040b02c == '\0') || (_DAT_0040b028 != 0)) &&
     (iVar12 = ThreadGetCurrentId(), iVar4 == iVar12)) {
    cVar6 = CVProfNode::ExitScope();
    if (cVar6 != '\0') {
      _DAT_0040b030 = (int *)_DAT_0040b030[0x19];
    }
    DAT_0040b02c = _DAT_0040b030 == (int *)0x40b034;
  }
  if (local_44 != 0) {
    (**(code **)(local_44 + 0x54))(local_44,local_4c,local_48,0,0,0);
  }
  return iVar14 - local_68 == iVar10;
}

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)