L L4D2node

CNetworkStringTable::WriteUpdate

0x001a6ca0 · 2781 bytes · __thiscall

_ZNK19CNetworkStringTable11WriteUpdateEP11CBaseClientR8bf_writei

Decompiled

undefined (4 params)

/* CNetworkStringTable::WriteUpdate(CBaseClient*, bf_write&, int) const */

int __thiscall
CNetworkStringTable::WriteUpdate
          (CNetworkStringTable *this,CBaseClient *param_1,bf_write *param_2,int param_3)

{
  uint uVar1;
  bool bVar2;
  int iVar3;
  char cVar4;
  byte bVar5;
  uint uVar6;
  int iVar7;
  byte *pbVar8;
  int iVar9;
  char *pcVar10;
  uint uVar11;
  void *pvVar12;
  undefined4 uVar13;
  undefined4 uVar14;
  int iVar15;
  int iVar16;
  uint uVar17;
  uint *puVar18;
  char *pcVar19;
  int in_GS_OFFSET;
  int local_9c;
  uint local_98;
  int local_8c;
  uint local_88;
  uint local_80;
  CUtlMemory<StringHistoryEntry,int> *local_7c;
  uint local_78;
  uint local_6c;
  uint local_60;
  uint local_58;
  char *local_54;
  undefined4 local_50;
  undefined4 local_4c;
  uint local_48;
  char *local_44;
  StringHistoryEntry local_40 [32];
  int local_20;
  
  iVar3 = DAT_003ab3a8;
  local_54 = (char *)0x0;
  local_20 = *(int *)(in_GS_OFFSET + 0x14);
  local_50 = 0;
  local_4c = 0;
  local_48 = 0;
  local_44 = (char *)0x0;
  bVar2 = false;
  if ((((byte)this[0x20] & 1) != 0) && (*(int *)(stringtable_usedictionaries._28_4_ + 0x30) != 0)) {
    bVar2 = 0 < DAT_003ab380;
  }
                    /* try { // try from 001a6d24 to 001a776a has its CatchHandler @ 001a7799 */
  uVar6 = (**(code **)(**(int **)(this + 0x38) + 8))(*(int **)(this + 0x38));
  iVar7 = *(int *)(param_2 + 0xc);
  if (iVar7 < *(int *)(param_2 + 8)) {
    if (param_2[0x10] == (bf_write)0x0) {
      bVar5 = (byte)(1 << ((byte)iVar7 & 7));
      if (bVar2) {
        pbVar8 = (byte *)(*(int *)param_2 + (iVar7 >> 3));
        *pbVar8 = *pbVar8 | bVar5;
      }
      else {
        pbVar8 = (byte *)(*(int *)param_2 + (iVar7 >> 3));
        *pbVar8 = *pbVar8 & ~bVar5;
      }
      *(int *)(param_2 + 0xc) = *(int *)(param_2 + 0xc) + 1;
    }
  }
  else {
    param_2[0x10] = (bf_write)0x1;
  }
  if ((int)uVar6 < 1) {
    local_9c = 0;
    local_8c = 0;
  }
  else {
    local_60 = 0;
    uVar17 = 0xffffffff;
    local_9c = 0;
    local_98 = 0xffffffff;
    local_8c = 0;
    do {
      iVar7 = (**(code **)(**(int **)(this + 0x38) + 0x28))(*(int **)(this + 0x38),local_60);
      if (param_3 < *(int *)(iVar7 + 8)) {
        uVar1 = *(uint *)(param_2 + 0xc);
        if (uVar17 + 1 == local_60) {
          if ((int)uVar1 < *(int *)(param_2 + 8)) {
            if (param_2[0x10] == (bf_write)0x0) {
              pbVar8 = (byte *)(((int)uVar1 >> 3) + *(int *)param_2);
              *pbVar8 = *pbVar8 | (byte)(1 << ((byte)uVar1 & 7));
              *(int *)(param_2 + 0xc) = *(int *)(param_2 + 0xc) + 1;
            }
          }
          else {
LAB_001a7343:
            param_2[0x10] = (bf_write)0x1;
          }
        }
        else {
          iVar15 = *(int *)(param_2 + 8);
          uVar17 = uVar1;
          if ((int)uVar1 < iVar15) {
            if (param_2[0x10] == (bf_write)0x0) {
              pbVar8 = (byte *)(((int)uVar1 >> 3) + *(int *)param_2);
              *pbVar8 = *pbVar8 & ~(byte)(1 << ((byte)uVar1 & 7));
              iVar15 = *(int *)(param_2 + 8);
              uVar17 = *(int *)(param_2 + 0xc) + 1;
              *(uint *)(param_2 + 0xc) = uVar17;
            }
            iVar9 = *(int *)(this + 0x10);
            if (iVar15 < (int)(iVar9 + uVar17)) {
LAB_001a7340:
              *(int *)(param_2 + 0xc) = iVar15;
              goto LAB_001a7343;
            }
          }
          else {
            param_2[0x10] = (bf_write)0x1;
            iVar9 = *(int *)(this + 0x10);
            if (iVar15 < (int)(iVar9 + uVar1)) goto LAB_001a7340;
          }
          iVar15 = ((int)uVar17 >> 5) * 4;
          uVar17 = uVar17 & 0x1f;
          puVar18 = (uint *)(iVar15 + *(int *)param_2);
          *puVar18 = *puVar18 & (&g_BitWriteMasks)[uVar17 * 0x21 + iVar9] |
                     local_60 << (sbyte)uVar17;
          iVar16 = 0x20 - uVar17;
          if (iVar16 < iVar9) {
            puVar18 = (uint *)(*(int *)param_2 + 4 + iVar15);
            *puVar18 = (&g_BitWriteMasks)[iVar9 - iVar16] & *puVar18 |
                       local_60 >> ((byte)iVar16 & 0x1f);
          }
          *(int *)(param_2 + 0xc) = *(int *)(param_2 + 0xc) + iVar9;
        }
        pcVar10 = (char *)(**(code **)(**(int **)(this + 0x38) + 0x10))
                                    (*(int **)(this + 0x38),local_60);
        iVar15 = *(int *)(param_2 + 0xc);
        if (param_3 < *(int *)(iVar7 + 0xc)) {
          if (iVar15 < *(int *)(param_2 + 8)) {
            if (param_2[0x10] == (bf_write)0x0) {
              pbVar8 = (byte *)((iVar15 >> 3) + *(int *)param_2);
              *pbVar8 = *pbVar8 | (byte)(1 << ((byte)iVar15 & 7));
              *(int *)(param_2 + 0xc) = *(int *)(param_2 + 0xc) + 1;
            }
          }
          else {
            param_2[0x10] = (bf_write)0x1;
          }
          uVar17 = (**(code **)(**(int **)(this + 0x38) + 0x24))(*(int **)(this + 0x38),local_60);
          if (uVar17 == 0xffffffff) {
            if (bVar2) {
              local_88 = *(uint *)(param_2 + 0xc);
              local_80 = *(uint *)(param_2 + 8);
              if ((int)local_88 < (int)local_80) {
                if (param_2[0x10] == (bf_write)0x0) {
                  pbVar8 = (byte *)(((int)local_88 >> 3) + *(int *)param_2);
                  *pbVar8 = *pbVar8 & ~(byte)(1 << ((byte)local_88 & 7));
                  local_88 = *(int *)(param_2 + 0xc) + 1;
                  *(uint *)(param_2 + 0xc) = local_88;
                  local_80 = *(uint *)(param_2 + 8);
                }
              }
              else {
                param_2[0x10] = (bf_write)0x1;
              }
            }
            else {
LAB_001a6eea:
              local_80 = *(uint *)(param_2 + 8);
              local_88 = *(uint *)(param_2 + 0xc);
            }
            if (0 < (int)local_48) {
              local_78 = 0xffffffff;
              uVar17 = 0;
              local_6c = 0;
              pcVar19 = local_54;
              do {
                if (((*pcVar19 != '\0') && (*pcVar10 != '\0')) && (*pcVar19 == *pcVar10)) {
                  uVar11 = 0;
                  do {
                    uVar11 = uVar11 + 1;
                    if (((pcVar19[uVar11] == '\0') || (pcVar10[uVar11] == '\0')) ||
                       (pcVar19[uVar11] != pcVar10[uVar11])) {
                      if ((int)uVar11 < 3) goto LAB_001a6f73;
                      break;
                    }
                  } while (uVar11 != 0x1f);
                  if ((int)local_6c < (int)uVar11) {
                    local_78 = uVar17;
                    local_6c = uVar11;
                  }
                }
LAB_001a6f73:
                uVar17 = uVar17 + 1;
                pcVar19 = pcVar19 + 0x20;
              } while (uVar17 != local_48);
              if (local_78 != 0xffffffff) {
                if ((int)local_88 < (int)local_80) {
                  if (param_2[0x10] == (bf_write)0x0) {
                    pbVar8 = (byte *)(((int)local_88 >> 3) + *(int *)param_2);
                    *pbVar8 = *pbVar8 | (byte)(1 << ((byte)local_88 & 7));
                    local_88 = *(int *)(param_2 + 0xc) + 1;
                    *(uint *)(param_2 + 0xc) = local_88;
                    local_80 = *(uint *)(param_2 + 8);
                  }
                  if ((int)(local_88 + 5) <= (int)local_80) goto LAB_001a6fe3;
LAB_001a7594:
                  param_2[0x10] = (bf_write)0x1;
                  *(uint *)(param_2 + 0xc) = local_80;
                  uVar17 = local_80;
                  if ((int)local_80 < (int)(local_80 + 5)) goto LAB_001a75ac;
LAB_001a7063:
                  uVar17 = local_80 & 0x1f;
                  iVar7 = ((int)local_80 >> 5) * 4;
                  puVar18 = (uint *)(*(int *)param_2 + iVar7);
                  iVar15 = 0x20 - uVar17;
                  *puVar18 = *puVar18 & *(uint *)(&DAT_003f2db4 + uVar17 * 0x84) |
                             local_6c << (sbyte)uVar17;
                  if (iVar15 < 5) {
                    puVar18 = (uint *)(*(int *)param_2 + 4 + iVar7);
                    *puVar18 = (&g_BitWriteMasks)[5 - iVar15] & *puVar18 |
                               local_6c >> ((byte)iVar15 & 0x1f);
                  }
                  *(int *)(param_2 + 0xc) = *(int *)(param_2 + 0xc) + 5;
                }
                else {
                  param_2[0x10] = (bf_write)0x1;
                  if ((int)local_80 < (int)(local_88 + 5)) goto LAB_001a7594;
LAB_001a6fe3:
                  iVar7 = ((int)local_88 >> 5) * 4;
                  local_88 = local_88 & 0x1f;
                  puVar18 = (uint *)(*(int *)param_2 + iVar7);
                  iVar15 = 0x20 - local_88;
                  *puVar18 = *puVar18 & *(uint *)(&DAT_003f2db4 + local_88 * 0x84) |
                             local_78 << (sbyte)local_88;
                  if (iVar15 < 5) {
                    puVar18 = (uint *)(*(int *)param_2 + 4 + iVar7);
                    *puVar18 = (&g_BitWriteMasks)[5 - iVar15] & *puVar18 |
                               local_78 >> ((byte)iVar15 & 0x1f);
                  }
                  iVar7 = *(int *)(param_2 + 0xc);
                  local_80 = iVar7 + 5;
                  *(uint *)(param_2 + 0xc) = local_80;
                  uVar17 = *(uint *)(param_2 + 8);
                  if (iVar7 + 10 <= (int)*(uint *)(param_2 + 8)) goto LAB_001a7063;
LAB_001a75ac:
                  local_80 = uVar17;
                  param_2[0x10] = (bf_write)0x1;
                  *(uint *)(param_2 + 0xc) = local_80;
                }
                bf_write::WriteString(param_2,pcVar10 + local_6c);
                goto LAB_001a70d9;
              }
            }
            if ((int)local_88 < (int)local_80) {
              if (param_2[0x10] == (bf_write)0x0) {
                pbVar8 = (byte *)(((int)local_88 >> 3) + *(int *)param_2);
                *pbVar8 = *pbVar8 & ~(byte)(1 << ((byte)local_88 & 7));
                *(int *)(param_2 + 0xc) = *(int *)(param_2 + 0xc) + 1;
              }
            }
            else {
              param_2[0x10] = (bf_write)0x1;
            }
            bf_write::WriteString(param_2,pcVar10);
          }
          else {
            if (!bVar2) goto LAB_001a6eea;
            uVar11 = *(uint *)(param_2 + 0xc);
            iVar7 = *(int *)(param_2 + 8);
            local_9c = local_9c + 1;
            if ((int)uVar11 < iVar7) {
              if (param_2[0x10] == (bf_write)0x0) {
                pbVar8 = (byte *)(((int)uVar11 >> 3) + *(int *)param_2);
                *pbVar8 = *pbVar8 | (byte)(1 << ((byte)uVar11 & 7));
                iVar7 = *(int *)(param_2 + 8);
                uVar11 = *(int *)(param_2 + 0xc) + 1;
                *(uint *)(param_2 + 0xc) = uVar11;
                if (uVar17 != local_98 + 1) {
                  if (iVar7 <= (int)uVar11) goto LAB_001a767f;
LAB_001a74b0:
                  if (param_2[0x10] == (bf_write)0x0) {
                    pbVar8 = (byte *)(((int)uVar11 >> 3) + *(int *)param_2);
                    *pbVar8 = *pbVar8 & ~(byte)(1 << ((byte)uVar11 & 7));
                    iVar7 = *(int *)(param_2 + 8);
                    uVar11 = *(int *)(param_2 + 0xc) + 1;
                    *(uint *)(param_2 + 0xc) = uVar11;
                  }
                  if ((int)(iVar3 + uVar11) <= iVar7) goto LAB_001a74f2;
                  goto LAB_001a7693;
                }
              }
              else if (uVar17 != local_98 + 1) goto LAB_001a74b0;
LAB_001a76c5:
              if ((int)uVar11 < iVar7) {
                local_98 = uVar17;
                if (param_2[0x10] == (bf_write)0x0) {
                  pbVar8 = (byte *)(((int)uVar11 >> 3) + *(int *)param_2);
                  *pbVar8 = *pbVar8 | (byte)(1 << ((byte)uVar11 & 7));
                  *(int *)(param_2 + 0xc) = *(int *)(param_2 + 0xc) + 1;
                }
                goto LAB_001a70d9;
              }
            }
            else {
              param_2[0x10] = (bf_write)0x1;
              if (uVar17 == local_98 + 1) goto LAB_001a76c5;
LAB_001a767f:
              param_2[0x10] = (bf_write)0x1;
              if ((int)(iVar3 + uVar11) <= iVar7) {
LAB_001a74f2:
                iVar7 = ((int)uVar11 >> 5) * 4;
                uVar11 = uVar11 & 0x1f;
                puVar18 = (uint *)(iVar7 + *(int *)param_2);
                *puVar18 = *puVar18 & (&g_BitWriteMasks)[uVar11 * 0x21 + iVar3] |
                           uVar17 << (sbyte)uVar11;
                iVar15 = 0x20 - uVar11;
                if (iVar15 < iVar3) {
                  puVar18 = (uint *)(*(int *)param_2 + 4 + iVar7);
                  *puVar18 = (&g_BitWriteMasks)[iVar3 - iVar15] & *puVar18 |
                             uVar17 >> ((byte)iVar15 & 0x1f);
                }
                *(int *)(param_2 + 0xc) = *(int *)(param_2 + 0xc) + iVar3;
                local_98 = uVar17;
                goto LAB_001a70d9;
              }
LAB_001a7693:
              *(int *)(param_2 + 0xc) = iVar7;
            }
            param_2[0x10] = (bf_write)0x1;
            local_98 = uVar17;
          }
        }
        else if (iVar15 < *(int *)(param_2 + 8)) {
          if (param_2[0x10] == (bf_write)0x0) {
            pbVar8 = (byte *)((iVar15 >> 3) + *(int *)param_2);
            *pbVar8 = *pbVar8 & ~(byte)(1 << ((byte)iVar15 & 7));
            *(int *)(param_2 + 0xc) = *(int *)(param_2 + 0xc) + 1;
          }
        }
        else {
          param_2[0x10] = (bf_write)0x1;
        }
LAB_001a70d9:
        pvVar12 = (void *)(**(code **)(*(int *)this + 0x30))(this,local_60,&local_58);
        if ((pvVar12 == (void *)0x0) || ((int)local_58 < 1)) {
          iVar7 = *(int *)(param_2 + 0xc);
          if (iVar7 < *(int *)(param_2 + 8)) {
            if (param_2[0x10] == (bf_write)0x0) {
              pbVar8 = (byte *)((iVar7 >> 3) + *(int *)param_2);
              *pbVar8 = *pbVar8 & ~(byte)(1 << ((byte)iVar7 & 7));
              *(int *)(param_2 + 0xc) = *(int *)(param_2 + 0xc) + 1;
            }
          }
          else {
            param_2[0x10] = (bf_write)0x1;
          }
        }
        else {
          iVar7 = *(int *)(param_2 + 0xc);
          if (iVar7 < *(int *)(param_2 + 8)) {
            if (param_2[0x10] == (bf_write)0x0) {
              pbVar8 = (byte *)((iVar7 >> 3) + *(int *)param_2);
              *pbVar8 = *pbVar8 | (byte)(1 << ((byte)iVar7 & 7));
              *(int *)(param_2 + 0xc) = *(int *)(param_2 + 0xc) + 1;
            }
          }
          else {
            param_2[0x10] = (bf_write)0x1;
          }
          if (((byte)this[0x1c] & 8) == 0) {
            uVar17 = *(uint *)(param_2 + 0xc);
            if (*(int *)(param_2 + 8) < (int)(uVar17 + 0xe)) {
              *(int *)(param_2 + 0xc) = *(int *)(param_2 + 8);
              param_2[0x10] = (bf_write)0x1;
            }
            else {
              iVar7 = ((int)uVar17 >> 5) * 4;
              uVar17 = uVar17 & 0x1f;
              puVar18 = (uint *)(iVar7 + *(int *)param_2);
              *puVar18 = *puVar18 & *(uint *)(&DAT_003f2dd8 + uVar17 * 0x84) |
                         local_58 << (sbyte)uVar17;
              iVar15 = 0x20 - uVar17;
              if (iVar15 < 0xe) {
                puVar18 = (uint *)(*(int *)param_2 + 4 + iVar7);
                *puVar18 = (&g_BitWriteMasks)[0xe - iVar15] & *puVar18 |
                           local_58 >> ((byte)iVar15 & 0x1f);
              }
              *(int *)(param_2 + 0xc) = *(int *)(param_2 + 0xc) + 0xe;
            }
            bf_write::WriteBits(param_2,pvVar12,local_58 << 3);
          }
          else {
            bf_write::WriteBits(param_2,pvVar12,*(int *)(this + 0x28));
          }
        }
        if (0x1f < (int)local_48) {
          CUtlVector<StringHistoryEntry,CUtlMemory<StringHistoryEntry,int>>::ShiftElementsLeft
                    ((CUtlVector<StringHistoryEntry,CUtlMemory<StringHistoryEntry,int>> *)&local_54,
                     0,1);
          local_48 = local_48 - 1;
        }
        V_strncpy((char *)local_40,pcVar10,0x20);
        CUtlVector<StringHistoryEntry,CUtlMemory<StringHistoryEntry,int>>::InsertBefore
                  ((CUtlVector<StringHistoryEntry,CUtlMemory<StringHistoryEntry,int>> *)&local_54,
                   local_48,local_40);
        local_8c = local_8c + 1;
        uVar17 = local_60;
        if ((param_1 != (CBaseClient *)0x0) &&
           (cVar4 = CBaseClient::IsTracing(param_1), cVar4 != '\0')) {
          iVar7 = *(int *)(param_2 + 0xc);
          uVar13 = (**(code **)(*(int *)this + 0x28))(this,local_60);
          uVar14 = (**(code **)(*(int *)this + 8))(this);
          CBaseClient::TraceNetworkMsg(param_1,iVar7 - uVar1," [%s] %d:%s ",uVar14,local_60,uVar13);
        }
      }
      local_60 = local_60 + 1;
    } while (uVar6 != local_60);
  }
  local_7c = (CUtlMemory<StringHistoryEntry,int> *)&local_54;
  if ((((param_3 == -1) && (0x14 < (int)uVar6)) && (bVar2)) &&
     ((float)local_9c < (float)(int)uVar6 * 0.9)) {
    uVar13 = (**(code **)(*(int *)this + 8))(this);
    Warning("String Table dictionary for %s should be rebuilt, only found %d of %d strings in dictionary\n"
            ,uVar13,local_9c,uVar6);
  }
  local_48 = 0;
  CUtlMemory<StringHistoryEntry,int>::Purge(local_7c);
  local_44 = local_54;
  CUtlMemory<StringHistoryEntry,int>::Purge(local_7c);
  if (local_20 == *(int *)(in_GS_OFFSET + 0x14)) {
    return local_8c;
  }
                    /* 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)