L L4D2node

NET_SendPacket

0x001c8200 · 3209 bytes · __cdecl

_Z14NET_SendPacketP11INetChanneliRK8netadr_sPKhiP8bf_writebj

Decompiled

undefined (8 params)

/* NET_SendPacket(INetChannel*, int, netadr_s const&, unsigned char const*, int, bf_write*, bool,
   unsigned int) */

int NET_SendPacket(INetChannel *param_1,int param_2,netadr_s *param_3,uchar *param_4,int param_5,
                  bf_write *param_6,bool param_7,uint param_8)

{
  int *piVar1;
  bool bVar2;
  char cVar3;
  int iVar4;
  uint uVar5;
  int iVar6;
  size_t sVar7;
  int iVar8;
  uchar *puVar9;
  void *__dest;
  undefined2 *__src;
  undefined4 uVar10;
  undefined4 uVar11;
  undefined *puVar12;
  bool bVar13;
  size_t sVar14;
  undefined4 *puVar15;
  int iVar16;
  int iVar17;
  int in_GS_OFFSET;
  float fVar18;
  uchar *in_stack_ffffda90;
  uint *in_stack_ffffda94;
  uint *local_254c;
  int local_253c;
  int local_2538;
  int local_2530;
  uchar *local_252c;
  int local_2528;
  CNetChan *local_2524;
  uint local_251c;
  CLZSS local_2518 [8];
  undefined4 local_2510;
  netadr_s local_250c [12];
  sockaddr local_2500;
  undefined4 local_24f0;
  uint *local_24ec;
  short local_24e8;
  short local_24e6;
  undefined1 local_24e4 [1188];
  uchar *local_2040;
  size_t local_203c;
  int local_2038;
  int local_2034;
  uchar local_2030 [4096];
  undefined2 *local_1030;
  size_t local_102c;
  undefined4 local_1028;
  undefined4 local_1024;
  undefined2 local_1020;
  uchar local_101e [4094];
  int local_20;
  
  local_20 = *(int *)(in_GS_OFFSET + 0x14);
  if (((*(int *)(net_showudp._28_4_ + 0x30) != 0) && (*(int *)param_4 == -1)) &&
     ((*(int *)(net_showudp_remoteonly._28_4_ + 0x30) == 0 ||
      ((cVar3 = netadr_s::IsLocalhost(param_3), cVar3 == '\0' &&
       (cVar3 = netadr_s::IsLoopback(param_3), cVar3 == '\0')))))) {
    in_stack_ffffda90 = (uchar *)(uint)param_4[4];
    uVar10 = netadr_s::ToString(param_3,false);
    Msg("UDP -> %s: sz=%i OOB \'%c\'\n",uVar10,param_5);
  }
  if (((net_multiplayer == '\0') || (*(int *)param_3 == 1)) ||
     ((cVar3 = netadr_s::IsLocalhost(param_3), cVar3 != '\0' &&
      (*(int *)(net_usesocketsforloopback._28_4_ + 0x30) == 0)))) {
    NET_SendLoopPacket(param_2,param_5,param_4,param_3);
    goto LAB_001c85c3;
  }
  iVar8 = *(int *)param_3;
  if ((iVar8 != 2) && (iVar8 != 3)) {
    DevMsg("NET_SendPacket: bad address type (%i)\n",iVar8);
    goto LAB_001c85c3;
  }
  iVar8 = *(int *)(param_2 * 0x10 + net_sockets + 8);
  if (iVar8 == 0) goto LAB_001c85c3;
  if ((*(int *)(droppackets._28_4_ + 0x30) < 0) && (param_2 == 0)) {
    ConVar::SetValue(0x3ac680);
    goto LAB_001c85c3;
  }
  if ((0.0 < *(float *)(fakeloss._28_4_ + 0x2c)) &&
     (iVar4 = RandomInt(0,100), iVar4 <= (int)*(float *)(fakeloss._28_4_ + 0x2c)))
  goto LAB_001c85c3;
  netadr_s::ToSockadr(param_3,&local_2500);
  local_2040 = local_2030;
  __src = &local_1020;
  local_203c = 0x1000;
  local_2038 = -1;
  local_2034 = 0x1000;
  local_102c = 0x1000;
  local_1028 = 0xffffffff;
  local_1024 = 0x1000;
  local_1030 = __src;
  if (param_6 == (bf_write *)0x0) {
    local_252c = (uchar *)0xffffffff;
    local_2528 = 0;
  }
  else {
    iVar4 = *(int *)(param_6 + 0xc);
    sVar14 = (iVar4 + 7 >> 3) + 2;
    local_252c = local_101e;
    if (0x1000 < (int)sVar14) {
      local_1028 = 0x1000;
      __dest = malloc(0x1000);
      memcpy(__dest,__src,0x1000);
      local_1030 = __dest;
      local_102c = sVar14;
      __src = realloc(__dest,sVar14);
      iVar4 = *(int *)(param_6 + 0xc);
      local_252c = (uchar *)(__src + 1);
    }
    *__src = (short)iVar4;
    uVar5 = *(int *)(param_6 + 0xc) + 7 >> 3;
    local_251c = uVar5;
    local_1030 = __src;
    if (*(int *)(net_compressvoice._28_4_ + 0x30) == 0) {
LAB_001c83b4:
                    /* try { // try from 001c83c7 to 001c8554 has its CatchHandler @ 001c8ef3 */
      _V_memcpy(local_252c,*(void **)param_6,uVar5);
    }
    else {
      in_stack_ffffda94 = &local_251c;
      local_2510 = 0x1000;
      in_stack_ffffda90 = local_252c;
      iVar4 = CLZSS::CompressNoAlloc
                        (local_2518,*(uchar **)param_6,uVar5,local_252c,in_stack_ffffda94);
      if (iVar4 == 0) {
        uVar5 = *(int *)(param_6 + 0xc) + 7 >> 3;
        goto LAB_001c83b4;
      }
    }
    local_2528 = local_251c + 2;
    if ((*(int *)(voice_xsend_debug._28_4_ + 0x30) != 0) && (local_2528 != 0)) {
                    /* try { // try from 001c8663 to 001c8667 has its CatchHandler @ 001c8ef3 */
      DevMsg("XVoice: voice data payload for %p: %d bytes\n",param_1,local_2528);
    }
    local_252c = (uchar *)param_5;
  }
  iVar4 = local_2034;
  sVar14 = local_203c;
  if (param_7) {
    local_2510 = 0x1000;
    local_251c = param_5;
    sVar7 = local_2528 + 4 + param_5;
    if ((int)local_203c < (int)sVar7) {
      if (local_2038 < 0) {
        local_2038 = local_2034;
        if (local_203c == 0) {
          local_2040 = (uchar *)0x0;
        }
        else {
          puVar9 = malloc(local_203c);
          memcpy(puVar9,local_2040,sVar14);
          local_2040 = puVar9;
        }
        if (iVar4 < 0) goto LAB_001c8439;
      }
      local_203c = sVar7;
      if (local_2040 == (uchar *)0x0) {
        local_2040 = malloc(sVar7);
      }
      else {
        local_2040 = realloc(local_2040,sVar7);
      }
    }
LAB_001c8439:
    local_2040[0] = 0xfd;
    local_2040[1] = 0xff;
    local_2040[2] = 0xff;
    local_2040[3] = 0xff;
    in_stack_ffffda94 = &local_251c;
    in_stack_ffffda90 = local_2040 + 4;
    iVar4 = CLZSS::CompressNoAlloc(local_2518,param_4,param_5,in_stack_ffffda90,in_stack_ffffda94);
    puVar9 = local_2040;
    if (iVar4 == 0) goto LAB_001c86c8;
    local_252c = (uchar *)(local_251c + 4);
    if ((param_6 != (bf_write *)0x0) && (0 < *(int *)(param_6 + 0xc))) {
      _V_memcpy(local_2040 + (int)local_252c,local_1030,local_2528);
    }
    param_4 = puVar9;
    param_5 = local_2528 + (int)local_252c;
  }
  else {
LAB_001c86c8:
    iVar4 = local_2034;
    sVar14 = local_203c;
    if ((param_6 != (bf_write *)0x0) && (0 < *(int *)(param_6 + 0xc))) {
      sVar7 = local_2528 + param_5;
      if ((int)local_203c < (int)sVar7) {
        if (local_2038 < 0) {
          local_2038 = local_2034;
          if (local_203c == 0) {
            local_2040 = (uchar *)0x0;
          }
          else {
            puVar9 = malloc(local_203c);
            memcpy(puVar9,local_2040,sVar14);
            local_2040 = puVar9;
          }
          if (iVar4 < 0) goto LAB_001c8703;
        }
        local_203c = sVar7;
        if (local_2040 == (uchar *)0x0) {
          local_2040 = malloc(sVar7);
        }
        else {
          local_2040 = realloc(local_2040,sVar7);
        }
      }
LAB_001c8703:
      puVar9 = local_2040;
                    /* try { // try from 001c8711 to 001c8734 has its CatchHandler @ 001c8ef3 */
      _V_memcpy(local_2040,param_4,param_5);
      _V_memcpy(puVar9 + param_5,local_1030,local_2528);
      param_4 = local_2040;
      param_5 = sVar7;
    }
  }
  if (param_1 == (INetChannel *)0x0) {
LAB_001c8b40:
    local_253c = 0x4b0;
  }
  else {
    iVar4 = (**(code **)(*(int *)param_1 + 0x11c))(param_1);
    local_253c = *(int *)(sv_maxroutable._28_4_ + 0x30);
    if (local_253c < 0x4b0) {
      if (local_253c < iVar4) goto LAB_001c8510;
    }
    else if (0x4b0 < iVar4) goto LAB_001c8b40;
    iVar4 = (**(code **)(*(int *)param_1 + 0x11c))(param_1);
    local_253c = 0x240;
    if (0x23f < iVar4) {
      local_253c = (**(code **)(*(int *)param_1 + 0x11c))(param_1);
    }
  }
LAB_001c8510:
  bVar13 = SUB41(iVar8,0);
  if (local_253c < param_5) {
    if (param_8 == 0) goto LAB_001c8784;
    Warning("Can\'t delay send a packet larger than maxroutable size %d/%d\n",param_5,local_253c);
LAB_001c87e8:
    if (param_1 == (INetChannel *)0x0) {
LAB_001c8d7f:
      LOCK();
      piVar1 = (int *)(s_SplitPacketSequenceNumber + param_2 * 4);
      iVar8 = *piVar1;
      *piVar1 = *piVar1 + 1;
      UNLOCK();
      local_2524 = (CNetChan *)0x0;
      local_254c = (uint *)(iVar8 + 1);
    }
    else {
LAB_001c87f0:
      in_stack_ffffda90 = (uchar *)0x0;
      local_2524 = (CNetChan *)__dynamic_cast(param_1,&INetChannel::typeinfo,&CNetChan::typeinfo);
      if (local_2524 == (CNetChan *)0x0) goto LAB_001c8d7f;
      local_254c = (uint *)CNetChan::IncrementSplitPacketSequence(local_2524);
    }
    local_24e6 = (short)local_253c + -0xc;
    local_24f0 = 0xfffffffe;
    local_24ec = local_254c;
    iVar8 = (int)local_24e6;
    puVar9 = (uchar *)((iVar8 + -1 + param_5) / iVar8);
    if (0 < param_5) {
      iVar17 = 0;
      local_2538 = 0;
      local_2530 = 0;
      iVar4 = param_5;
      local_252c = param_4;
      do {
        iVar16 = iVar8;
        if (iVar4 <= iVar8) {
          iVar16 = iVar4;
        }
        local_24e8 = (short)(iVar17 << 8) + (short)puVar9;
        _V_memcpy(local_24e4,local_252c,iVar16);
        if ((local_2524 == (CNetChan *)0x0) ||
           ((iVar17 < *(int *)(net_splitrate._28_4_ + 0x30) &&
            (*(int *)(net_queued_packet_thread._28_4_ + 0x30) != 0x8deb8)))) {
          iVar6 = NET_SendTo(bVar13,(int)&local_24f0,(char *)(iVar16 + 0xc),(int)&local_2500,
                             (sockaddr *)0x10,-1,(int)in_stack_ffffda90);
        }
        else {
          iVar6 = (**(code **)(*(int *)local_2524 + 0x14))(local_2524);
          fVar18 = (float)*(int *)(net_splitpacket_maxrate._28_4_ + 0x30);
          if ((float)iVar6 < fVar18) {
            iVar6 = (**(code **)(*(int *)local_2524 + 0x14))(local_2524);
            fVar18 = (float)iVar6;
          }
          iVar6 = NET_QueuePacketForSend
                            (local_2524,bVar13,(int)&local_24f0,(char *)(iVar16 + 0xc),
                             (int)&local_2500,
                             (sockaddr *)(int)(((float)local_2538 / fVar18) * 1000.0 + 0.5),
                             (int)in_stack_ffffda90,(uint)in_stack_ffffda94);
        }
        iVar17 = iVar17 + 1;
        if (iVar6 < 0) break;
        bVar2 = iVar6 < iVar16;
        iVar6 = local_2530 + iVar16;
        if (bVar2) {
          iVar6 = local_2530;
        }
        iVar4 = iVar4 - iVar16;
        if ((*(uint *)(net_showsplits._28_4_ + 0x30) & 0xfffffffd) != 0) {
          netadr_s::SetIP(local_250c,0);
          netadr_s::SetPort(local_250c,0);
          netadr_s::SetType(local_250c,3);
          netadr_s::SetFromSockadr(local_250c,&local_2500);
          uVar10 = netadr_s::ToString(local_250c,false);
          if (param_2 == 0) {
            puVar12 = &DAT_002bbe1c;
          }
          else {
            puVar15 = (undefined4 *)s_SocketDescMap;
            do {
              puVar12 = (undefined *)puVar15[2];
              if (puVar12 == (undefined *)0x0) {
                puVar12 = &DAT_002b558d;
                break;
              }
              piVar1 = puVar15 + 3;
              puVar15 = puVar15 + 2;
            } while (param_2 != *piVar1);
          }
          in_stack_ffffda90 = puVar9;
          in_stack_ffffda94 = local_254c;
          Msg("--> [%s] Split packet %4i/%4i seq %5i size %4i mtu %4i to %s [ total %4i ]\n",puVar12
              ,iVar17,puVar9,local_254c,iVar16,local_253c,uVar10,param_5);
        }
        local_252c = local_252c + iVar8;
        local_2538 = local_2538 + local_253c + 0x1c;
        local_2530 = iVar6;
      } while (0 < iVar4);
      goto LAB_001c8555;
    }
LAB_001c8d6a:
    iVar6 = 0;
  }
  else {
    if (param_8 == 0) {
LAB_001c8784:
      if (local_253c < param_5) goto LAB_001c87e8;
      if ((*(int *)(net_queued_packet_thread._28_4_ + 0x30) != 0x8deb8) ||
         (param_1 == (INetChannel *)0x0)) {
                    /* try { // try from 001c87c7 to 001c8d54 has its CatchHandler @ 001c8ef3 */
        iVar6 = NET_SendTo(bVar13,(int)param_4,(char *)param_5,(int)&local_2500,(sockaddr *)0x10,
                           (int)local_252c,(int)in_stack_ffffda90);
        goto LAB_001c8555;
      }
      goto LAB_001c87f0;
    }
    iVar6 = NET_QueuePacketForSend
                      ((CNetChan *)param_1,bVar13,(int)param_4,(char *)param_5,(int)&local_2500,
                       (sockaddr *)param_8,(int)in_stack_ffffda90,(uint)in_stack_ffffda94);
LAB_001c8555:
    if (iVar6 == -1) {
      NET_GetLastError();
      if (((net_error == 0xb) || (net_error == 0x68)) ||
         ((net_error == 99 && (*(int *)param_3 == 2)))) goto LAB_001c8d6a;
      uVar10 = netadr_s::ToString(param_3,false);
      uVar11 = NET_ErrorString(net_error);
      ConDMsg("NET_SendPacket Warning: %s : %s\n",uVar11,uVar10);
      iVar6 = param_5;
    }
  }
  CUtlMemory<unsigned_char,int>::Purge((CUtlMemory<unsigned_char,int> *)&local_1030);
  CUtlMemory<unsigned_char,int>::Purge((CUtlMemory<unsigned_char,int> *)&local_2040);
  param_5 = iVar6;
LAB_001c85c3:
  if (local_20 != *(int *)(in_GS_OFFSET + 0x14)) {
                    /* WARNING: Subroutine does not return */
    __stack_chk_fail();
  }
  return param_5;
}

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)