L L4D2node

CNetChan::SendSubChannelData

0x001b1a70 · 2411 bytes · __thiscall

_ZN8CNetChan18SendSubChannelDataER8bf_write

Decompiled

undefined (2 params)

/* CNetChan::SendSubChannelData(bf_write&) */

undefined4 __thiscall CNetChan::SendSubChannelData(CNetChan *this,bf_write *param_1)

{
  CNetChan *pCVar1;
  CNetChan *pCVar2;
  int *piVar3;
  uint uVar4;
  byte *pbVar5;
  uint uVar6;
  void *pvVar7;
  uint uVar8;
  int iVar9;
  uint *puVar10;
  int iVar11;
  CNetChan *pCVar12;
  int iVar13;
  uint local_34;
  uint local_30;
  CNetChan *local_28;
  CNetChan *local_20;
  
  CompressFragments(this);
  SendTCPData(this);
  UpdateSubChannels(this);
  pCVar12 = this + 0x344;
  uVar4 = 0;
  while (*(int *)(pCVar12 + 0x14) != 1) {
    uVar4 = uVar4 + 1;
    pCVar12 = pCVar12 + 0x1c;
    if (uVar4 == 8) {
      return 0;
    }
  }
  uVar8 = *(uint *)(param_1 + 0xc);
  uVar6 = *(uint *)(param_1 + 8);
  if ((int)uVar6 < (int)(uVar8 + 3)) {
    *(uint *)(param_1 + 0xc) = uVar6;
    param_1[0x10] = (bf_write)0x1;
    uVar4 = uVar6;
  }
  else {
    iVar9 = ((int)uVar8 >> 5) * 4;
    uVar8 = uVar8 & 0x1f;
    puVar10 = (uint *)(iVar9 + *(int *)param_1);
    *puVar10 = uVar4 << (sbyte)uVar8 | *puVar10 & *(uint *)(&DAT_003f2dac + uVar8 * 0x84);
    iVar11 = 0x20 - uVar8;
    if (iVar11 < 3) {
      puVar10 = (uint *)(*(int *)param_1 + 4 + iVar9);
      *puVar10 = uVar4 >> ((byte)iVar11 & 0x1f) | (&g_BitWriteMasks)[3 - iVar11] & *puVar10;
    }
    iVar9 = *(int *)(param_1 + 0xc);
    uVar6 = *(uint *)(param_1 + 8);
    *(uint *)(param_1 + 0xc) = iVar9 + 3U;
    uVar4 = iVar9 + 3U;
  }
  local_28 = this + 0xbc;
  local_20 = pCVar12;
  if (*(int *)(pCVar12 + 8) != 0) goto LAB_001b1b9c;
  do {
    if ((int)uVar4 < (int)uVar6) {
      if (param_1[0x10] == (bf_write)0x0) {
        pbVar5 = (byte *)(((int)uVar4 >> 3) + *(int *)param_1);
        *pbVar5 = *pbVar5 & ~(byte)(1 << ((byte)uVar4 & 7));
        *(int *)(param_1 + 0xc) = *(int *)(param_1 + 0xc) + 1;
      }
    }
    else {
      param_1[0x10] = (bf_write)0x1;
    }
    while( true ) {
      pCVar2 = local_20 + 4;
      local_28 = local_28 + 0x14;
      if (pCVar2 == pCVar12 + 8) {
        return 1;
      }
      uVar6 = *(uint *)(param_1 + 8);
      uVar4 = *(uint *)(param_1 + 0xc);
      pCVar1 = local_20 + 0xc;
      local_20 = pCVar2;
      if (*(int *)pCVar1 == 0) break;
LAB_001b1b9c:
      piVar3 = (int *)**(int **)local_28;
      if ((int)uVar4 < (int)uVar6) {
        if (param_1[0x10] == (bf_write)0x0) {
          pbVar5 = (byte *)(((int)uVar4 >> 3) + *(int *)param_1);
          *pbVar5 = *pbVar5 | (byte)(1 << ((byte)uVar4 & 7));
          uVar6 = *(uint *)(param_1 + 8);
          uVar4 = *(int *)(param_1 + 0xc) + 1;
          *(uint *)(param_1 + 0xc) = uVar4;
        }
      }
      else {
        param_1[0x10] = (bf_write)0x1;
      }
      local_30 = *(uint *)local_20;
      iVar9 = *(int *)(local_20 + 8);
      iVar11 = local_30 * 0x100;
      local_34 = iVar9 * 0x100;
      if ((local_30 + iVar9 == piVar3[0x49]) && (0x100 - (uint)*(byte *)(piVar3 + 0x43) != 0x100)) {
        local_34 = local_34 - (0x100 - (uint)*(byte *)(piVar3 + 0x43));
      }
      if ((iVar9 == piVar3[0x49]) && (*piVar3 == 0)) {
        if ((int)uVar4 < (int)uVar6) {
          if (param_1[0x10] == (bf_write)0x0) {
            pbVar5 = (byte *)(((int)uVar4 >> 3) + *(int *)param_1);
            *pbVar5 = *pbVar5 & ~(byte)(1 << ((byte)uVar4 & 7));
            uVar6 = *(uint *)(param_1 + 8);
            uVar4 = *(int *)(param_1 + 0xc) + 1;
            *(uint *)(param_1 + 0xc) = uVar4;
            if ((char)piVar3[0x46] == '\0') {
              if ((int)uVar6 <= (int)uVar4) goto LAB_001b236a;
LAB_001b2324:
              if (param_1[0x10] == (bf_write)0x0) {
                pbVar5 = (byte *)(((int)uVar4 >> 3) + *(int *)param_1);
                *pbVar5 = *pbVar5 & ~(byte)(1 << ((byte)uVar4 & 7));
                uVar6 = *(uint *)(param_1 + 8);
                uVar4 = *(int *)(param_1 + 0xc) + 1;
                *(uint *)(param_1 + 0xc) = uVar4;
              }
              goto LAB_001b20dd;
            }
          }
          else if ((char)piVar3[0x46] == '\0') goto LAB_001b2324;
LAB_001b2033:
          if ((int)uVar4 < (int)uVar6) {
            if (param_1[0x10] == (bf_write)0x0) {
              pbVar5 = (byte *)(((int)uVar4 >> 3) + *(int *)param_1);
              *pbVar5 = *pbVar5 | (byte)(1 << ((byte)uVar4 & 7));
              uVar6 = *(uint *)(param_1 + 8);
              uVar4 = *(int *)(param_1 + 0xc) + 1;
              *(uint *)(param_1 + 0xc) = uVar4;
            }
          }
          else {
            param_1[0x10] = (bf_write)0x1;
          }
          uVar8 = piVar3[0x47];
          if ((int)uVar6 < (int)(uVar4 + 0x1a)) {
            *(uint *)(param_1 + 0xc) = uVar6;
            param_1[0x10] = (bf_write)0x1;
            uVar4 = uVar6;
          }
          else {
            iVar9 = ((int)uVar4 >> 5) * 4;
            uVar4 = uVar4 & 0x1f;
            puVar10 = (uint *)(*(int *)param_1 + iVar9);
            *puVar10 = *puVar10 & *(uint *)(&DAT_003f2e08 + uVar4 * 0x84) | uVar8 << (sbyte)uVar4;
            iVar13 = 0x20 - uVar4;
            if (iVar13 < 0x1a) {
              puVar10 = (uint *)(*(int *)param_1 + 4 + iVar9);
              *puVar10 = (&g_BitWriteMasks)[0x1a - iVar13] & *puVar10 |
                         uVar8 >> ((byte)iVar13 & 0x1f);
            }
            iVar9 = *(int *)(param_1 + 0xc);
            uVar6 = *(uint *)(param_1 + 8);
            *(uint *)(param_1 + 0xc) = iVar9 + 0x1aU;
            uVar4 = iVar9 + 0x1aU;
          }
        }
        else {
          param_1[0x10] = (bf_write)0x1;
          if ((char)piVar3[0x46] != '\0') goto LAB_001b2033;
LAB_001b236a:
          param_1[0x10] = (bf_write)0x1;
        }
LAB_001b20dd:
        uVar8 = piVar3[0x43];
        if ((int)uVar6 < (int)(uVar4 + 0x12)) {
          *(uint *)(param_1 + 0xc) = uVar6;
          param_1[0x10] = (bf_write)0x1;
        }
        else {
          iVar13 = ((int)uVar4 >> 5) * 4;
          uVar4 = uVar4 & 0x1f;
          puVar10 = (uint *)(*(int *)param_1 + iVar13);
          *puVar10 = *puVar10 & *(uint *)(&DAT_003f2de8 + uVar4 * 0x84) | uVar8 << (sbyte)uVar4;
          iVar9 = 0x20 - uVar4;
          if (iVar9 < 0x12) {
            puVar10 = (uint *)(*(int *)param_1 + 4 + iVar13);
            *puVar10 = (&g_BitWriteMasks)[0x12 - iVar9] & *puVar10 | uVar8 >> ((byte)iVar9 & 0x1f);
          }
          *(int *)(param_1 + 0xc) = *(int *)(param_1 + 0xc) + 0x12;
        }
      }
      else {
        if ((int)uVar4 < (int)uVar6) {
          if (param_1[0x10] != (bf_write)0x0) goto LAB_001b1c22;
          pbVar5 = (byte *)(((int)uVar4 >> 3) + *(int *)param_1);
          *pbVar5 = *pbVar5 | (byte)(1 << ((byte)uVar4 & 7));
          iVar9 = *(int *)(param_1 + 0xc);
          uVar6 = *(uint *)(param_1 + 8);
          uVar4 = iVar9 + 1;
          *(uint *)(param_1 + 0xc) = uVar4;
          local_30 = *(uint *)local_20;
          if ((int)uVar6 < iVar9 + 0x13) goto LAB_001b1f30;
LAB_001b1c2d:
          iVar13 = ((int)uVar4 >> 5) * 4;
          uVar4 = uVar4 & 0x1f;
          puVar10 = (uint *)(*(int *)param_1 + iVar13);
          *puVar10 = *puVar10 & *(uint *)(&DAT_003f2de8 + uVar4 * 0x84) | local_30 << (sbyte)uVar4;
          iVar9 = 0x20 - uVar4;
          if (iVar9 < 0x12) {
            puVar10 = (uint *)(*(int *)param_1 + 4 + iVar13);
            *puVar10 = (&g_BitWriteMasks)[0x12 - iVar9] & *puVar10 |
                       local_30 >> ((byte)iVar9 & 0x1f);
          }
          iVar9 = *(int *)(param_1 + 0xc);
          uVar4 = iVar9 + 0x12;
          uVar6 = *(uint *)(param_1 + 8);
          *(uint *)(param_1 + 0xc) = uVar4;
          uVar8 = *(uint *)(local_20 + 8);
          if (iVar9 + 0x15 <= (int)uVar6) goto LAB_001b1c9d;
LAB_001b1f4a:
          *(uint *)(param_1 + 0xc) = uVar6;
          param_1[0x10] = (bf_write)0x1;
        }
        else {
          param_1[0x10] = (bf_write)0x1;
          local_30 = *(uint *)local_20;
LAB_001b1c22:
          if ((int)(uVar4 + 0x12) <= (int)uVar6) goto LAB_001b1c2d;
LAB_001b1f30:
          *(uint *)(param_1 + 0xc) = uVar6;
          param_1[0x10] = (bf_write)0x1;
          uVar8 = *(uint *)(local_20 + 8);
          uVar4 = uVar6;
          if ((int)uVar6 < (int)(uVar6 + 3)) goto LAB_001b1f4a;
LAB_001b1c9d:
          iVar9 = ((int)uVar4 >> 5) * 4;
          uVar4 = uVar4 & 0x1f;
          puVar10 = (uint *)(*(int *)param_1 + iVar9);
          iVar13 = 0x20 - uVar4;
          *puVar10 = *puVar10 & *(uint *)(&DAT_003f2dac + uVar4 * 0x84) | uVar8 << (sbyte)uVar4;
          if (iVar13 < 3) {
            puVar10 = (uint *)(*(int *)param_1 + 4 + iVar9);
            *puVar10 = (&g_BitWriteMasks)[3 - iVar13] & *puVar10 | uVar8 >> ((byte)iVar13 & 0x1f);
          }
          *(int *)(param_1 + 0xc) = *(int *)(param_1 + 0xc) + 3;
        }
        if (iVar11 == 0) {
          uVar4 = *(uint *)(param_1 + 0xc);
          uVar8 = *(uint *)(param_1 + 8);
          if (*piVar3 == 0) {
            if ((int)uVar8 <= (int)uVar4) {
              param_1[0x10] = (bf_write)0x1;
              if ((char)piVar3[0x46] == '\0') goto LAB_001b230d;
              goto LAB_001b1dcd;
            }
            if (param_1[0x10] == (bf_write)0x0) {
              pbVar5 = (byte *)(((int)uVar4 >> 3) + *(int *)param_1);
              *pbVar5 = *pbVar5 & ~(byte)(1 << ((byte)uVar4 & 7));
              uVar4 = *(int *)(param_1 + 0xc) + 1;
              uVar8 = *(uint *)(param_1 + 8);
              *(uint *)(param_1 + 0xc) = uVar4;
              goto LAB_001b1dbd;
            }
            if ((char)piVar3[0x46] != '\0') goto LAB_001b1dcd;
LAB_001b2218:
            if (param_1[0x10] == (bf_write)0x0) {
              pbVar5 = (byte *)(((int)uVar4 >> 3) + *(int *)param_1);
              *pbVar5 = *pbVar5 & ~(byte)(1 << ((byte)uVar4 & 7));
              uVar4 = *(int *)(param_1 + 0xc) + 1;
              uVar8 = *(uint *)(param_1 + 8);
              *(uint *)(param_1 + 0xc) = uVar4;
            }
          }
          else {
            if ((int)uVar4 < (int)uVar8) {
              if (param_1[0x10] == (bf_write)0x0) {
                pbVar5 = (byte *)(((int)uVar4 >> 3) + *(int *)param_1);
                *pbVar5 = *pbVar5 | (byte)(1 << ((byte)uVar4 & 7));
                uVar4 = *(int *)(param_1 + 0xc) + 1;
                uVar8 = *(uint *)(param_1 + 8);
                *(uint *)(param_1 + 0xc) = uVar4;
              }
            }
            else {
              param_1[0x10] = (bf_write)0x1;
            }
            uVar6 = piVar3[0x45];
            if ((int)uVar8 < (int)(uVar4 + 0x20)) {
              *(uint *)(param_1 + 0xc) = uVar8;
              param_1[0x10] = (bf_write)0x1;
            }
            else {
              iVar9 = ((int)uVar4 >> 5) * 4;
              uVar4 = uVar4 & 0x1f;
              puVar10 = (uint *)(*(int *)param_1 + iVar9);
              *puVar10 = *puVar10 & *(uint *)(&DAT_003f2e20 + uVar4 * 0x84) | uVar6 << (sbyte)uVar4;
              iVar13 = 0x20 - uVar4;
              if (iVar13 != 0x20) {
                puVar10 = (uint *)(*(int *)param_1 + 4 + iVar9);
                *puVar10 = (&g_BitWriteMasks)[0x20 - iVar13] & *puVar10 |
                           uVar6 >> ((byte)iVar13 & 0x1f);
              }
              *(int *)(param_1 + 0xc) = *(int *)(param_1 + 0xc) + 0x20;
            }
            bf_write::WriteString(param_1,(char *)(piVar3 + 1));
            uVar8 = *(uint *)(param_1 + 8);
            uVar4 = *(uint *)(param_1 + 0xc);
LAB_001b1dbd:
            if ((char)piVar3[0x46] == '\0') {
              if ((int)uVar4 < (int)uVar8) goto LAB_001b2218;
LAB_001b230d:
              param_1[0x10] = (bf_write)0x1;
            }
            else {
LAB_001b1dcd:
              if ((int)uVar4 < (int)uVar8) {
                if (param_1[0x10] == (bf_write)0x0) {
                  pbVar5 = (byte *)(((int)uVar4 >> 3) + *(int *)param_1);
                  *pbVar5 = *pbVar5 | (byte)(1 << ((byte)uVar4 & 7));
                  uVar4 = *(int *)(param_1 + 0xc) + 1;
                  uVar8 = *(uint *)(param_1 + 8);
                  *(uint *)(param_1 + 0xc) = uVar4;
                }
              }
              else {
                param_1[0x10] = (bf_write)0x1;
              }
              uVar6 = piVar3[0x47];
              if ((int)uVar8 < (int)(uVar4 + 0x1a)) {
                *(uint *)(param_1 + 0xc) = uVar8;
                param_1[0x10] = (bf_write)0x1;
                uVar4 = uVar8;
              }
              else {
                iVar9 = ((int)uVar4 >> 5) * 4;
                uVar4 = uVar4 & 0x1f;
                puVar10 = (uint *)(*(int *)param_1 + iVar9);
                *puVar10 = *puVar10 & *(uint *)(&DAT_003f2e08 + uVar4 * 0x84) |
                           uVar6 << (sbyte)uVar4;
                iVar13 = 0x20 - uVar4;
                if (iVar13 < 0x1a) {
                  puVar10 = (uint *)(*(int *)param_1 + 4 + iVar9);
                  *puVar10 = (&g_BitWriteMasks)[0x1a - iVar13] & *puVar10 |
                             uVar6 >> ((byte)iVar13 & 0x1f);
                }
                iVar9 = *(int *)(param_1 + 0xc);
                uVar8 = *(uint *)(param_1 + 8);
                *(uint *)(param_1 + 0xc) = iVar9 + 0x1aU;
                uVar4 = iVar9 + 0x1aU;
              }
            }
          }
          uVar6 = piVar3[0x43];
          if ((int)uVar8 < (int)(uVar4 + 0x1a)) {
            *(uint *)(param_1 + 0xc) = uVar8;
            param_1[0x10] = (bf_write)0x1;
          }
          else {
            iVar9 = ((int)uVar4 >> 5) * 4;
            uVar4 = uVar4 & 0x1f;
            puVar10 = (uint *)(*(int *)param_1 + iVar9);
            *puVar10 = *puVar10 & *(uint *)(&DAT_003f2e08 + uVar4 * 0x84) | uVar6 << (sbyte)uVar4;
            iVar13 = 0x20 - uVar4;
            if (iVar13 < 0x1a) {
              puVar10 = (uint *)(*(int *)param_1 + 4 + iVar9);
              *puVar10 = (&g_BitWriteMasks)[0x1a - iVar13] & *puVar10 |
                         uVar6 >> ((byte)iVar13 & 0x1f);
            }
            *(int *)(param_1 + 0xc) = *(int *)(param_1 + 0xc) + 0x1a;
          }
        }
      }
      if (piVar3[0x42] == 0) {
        uVar4 = 1;
        if (local_34 != 0) {
          uVar4 = local_34;
        }
        pvVar7 = operator_new__(uVar4);
        (**(code **)(*(int *)(g_pFileSystem + 4) + 0x10))(g_pFileSystem + 4,*piVar3,iVar11,0);
        (*(code *)**(undefined4 **)(g_pFileSystem + 4))(g_pFileSystem + 4,pvVar7,local_34,*piVar3);
        bf_write::WriteBytes(param_1,pvVar7,local_34);
        if (pvVar7 != (void *)0x0) {
          operator_delete__(pvVar7);
        }
      }
      else {
        bf_write::WriteBytes(param_1,(void *)(piVar3[0x42] + iVar11),local_34);
      }
      if (*(int *)(net_showfragments._28_4_ + 0x30) != 0) {
        ConMsg("Sending subchan %i: start %i, num %i\n",*(int *)(pCVar12 + 0x18),*(int *)local_20,
               *(int *)(local_20 + 8));
      }
      iVar9 = *(int *)(this + 8);
      *(int *)(pCVar12 + 0x14) = 2;
      *(int *)(pCVar12 + 0x10) = iVar9;
    }
  } while( true );
}

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)