L L4D2node

CBaseClientState::SendConnectPacket

0x001062b0 · 1179 bytes · __cdecl

_ZN16CBaseClientState17SendConnectPacketERK8netadr_siiyb

Decompiled

undefined (5 params)

/* CBaseClientState::SendConnectPacket(netadr_s const&, int, int, unsigned long long, bool) */

void CBaseClientState::SendConnectPacket
               (netadr_s *param_1,int param_2,int param_3,ulonglong param_4,bool param_5)

{
  char cVar1;
  long lVar2;
  char *pcVar3;
  undefined4 uVar4;
  int iVar5;
  int in_GS_OFFSET;
  uint in_stack_0000001c;
  undefined4 uVar6;
  uchar *local_548 [2];
  int local_540;
  int local_53c;
  char local_538;
  undefined **local_530;
  undefined1 local_52c;
  undefined4 local_528;
  undefined4 local_524;
  undefined4 local_520;
  undefined4 local_51c;
  undefined4 local_518;
  undefined4 local_514;
  undefined4 local_510;
  undefined4 local_50c;
  undefined4 local_508;
  undefined4 local_504;
  undefined4 local_500;
  undefined1 local_4fc;
  undefined4 local_4f8;
  undefined4 local_4f4;
  undefined4 local_4f0;
  undefined4 local_4ec;
  undefined4 local_4e4;
  undefined4 local_4e0;
  undefined4 local_4dc;
  undefined4 local_4d8;
  undefined4 local_4d4;
  undefined1 local_4d0 [1200];
  int local_20;
  
  local_20 = *(int *)(in_GS_OFFSET + 0x14);
  COM_TimestampedLog("SendConnectPacket");
  cVar1 = netadr_s::IsLoopback((netadr_s *)param_2);
  if (cVar1 == '\0') {
    cVar1 = CAddressList::IsAddressInList((CAddressList *)(param_1 + 0x2c),(netadr_s *)param_2);
    if (cVar1 == '\0') {
      uVar4 = netadr_s::ToString((netadr_s *)param_2,false);
      Warning("Sending connect packet to unexpected address %s\n",uVar4);
    }
  }
  bf_write::bf_write((bf_write *)local_548,local_4d0,0x4b0,-1);
  bf_write::WriteLong((bf_write *)local_548,-1);
  bf_write::WriteByte((bf_write *)local_548,0x6b);
  lVar2 = GetHostVersion();
  bf_write::WriteLong((bf_write *)local_548,lVar2);
  bf_write::WriteLong((bf_write *)local_548,(long)param_4);
  bf_write::WriteLong((bf_write *)local_548,param_3);
  pcVar3 = (char *)(**(code **)(*(int *)param_1 + 0xc0))(param_1);
  bf_write::WriteString((bf_write *)local_548,pcVar3);
  pcVar3 = "FCVAR_NEVER_AS_STRING";
  if ((password[0x15] & 0x10) == 0) {
    pcVar3 = "";
    if (*(char **)(password._28_4_ + 0x24) != (char *)0x0) {
      pcVar3 = *(char **)(password._28_4_ + 0x24);
    }
  }
  iVar5 = 0;
  bf_write::WriteString((bf_write *)local_548,pcVar3);
  bf_write::WriteByte((bf_write *)local_548,*(uint *)(param_1 + 0x150));
  if (0 < *(int *)(param_1 + 0x150)) {
    do {
      local_524 = 0;
      local_520 = 0;
      local_51c = 0;
      local_518 = 0;
      local_514 = 0;
      local_510 = 0;
      local_50c = 0;
      local_508 = 0;
      local_504 = 0;
      local_500 = 0;
      local_4fc = 0;
      local_4f8 = 0;
      local_4f4 = 0;
      local_4f0 = 0;
      local_4ec = 0;
      local_52c = 1;
      local_528 = 0;
      local_530 = &PTR__CLC_SplitPlayerConnect_002a15e8;
      local_4e4 = 0;
      local_4e0 = 0;
      local_4dc = 0;
      local_4d8 = 0;
      local_4d4 = 0;
                    /* try { // try from 0010650f to 0010652b has its CatchHandler @ 00106761 */
      Host_BuildUserInfoUpdateMessage(iVar5,(CUtlVector *)&local_4e4,false);
      CLC_SplitPlayerConnect::WriteToBuffer
                ((CLC_SplitPlayerConnect *)&local_530,(bf_write *)local_548);
      iVar5 = iVar5 + 1;
      local_530 = &PTR__CLC_SplitPlayerConnect_002a15e8;
      local_4d8 = 0;
      CUtlMemory<NetMessageCvar_t,int>::Purge((CUtlMemory<NetMessageCvar_t,int> *)&local_4e4);
      local_4d4 = local_4e4;
      CUtlMemory<NetMessageCvar_t,int>::Purge((CUtlMemory<NetMessageCvar_t,int> *)&local_4e4);
    } while (iVar5 < *(int *)(param_1 + 0x150));
  }
  if (local_53c < local_540) {
    if (local_538 == '\0') {
      if (g_bLowViolence == '\0') {
        local_548[0][local_53c >> 3] =
             local_548[0][local_53c >> 3] & ~(byte)(1 << ((byte)local_53c & 7));
      }
      else {
        local_548[0][local_53c >> 3] =
             local_548[0][local_53c >> 3] | (byte)(1 << ((byte)local_53c & 7));
      }
      local_53c = local_53c + 1;
    }
  }
  else {
    local_538 = '\x01';
  }
  uVar4 = *(undefined4 *)(param_1 + 0x15c);
  uVar6 = *(undefined4 *)(param_1 + 0x160);
  bf_write::WriteLongLong(CONCAT44(uVar4,local_548));
  if ((long)param_4 == 2) {
    pcVar3 = (char *)(**(code **)(*(int *)param_1 + 0x9c))(param_1,uVar4,uVar6);
    bf_write::WriteString((bf_write *)local_548,pcVar3);
  }
  else {
    if ((long)param_4 != 3) {
      Host_Error("Unexepected authentication protocol %i!\n",(long)param_4);
      goto LAB_001065cc;
    }
    cVar1 = PrepareSteamConnectResponse
                      (CONCAT44(param_4._4_4_,param_1),param_5,
                       (netadr_s *)(in_stack_0000001c & 0xff),(bf_write *)param_2);
    if (cVar1 == '\0') goto LAB_001065cc;
  }
  *(undefined8 *)(param_1 + 0x1c) = net_time;
  *(int *)(param_1 + 0x18) = param_3;
  NET_SendPacket((INetChannel *)0x0,*(int *)(param_1 + 0xc),(netadr_s *)param_2,local_548[0],
                 local_53c + 7 >> 3,(bf_write *)0x0,false,0);
LAB_001065cc:
  if (local_20 == *(int *)(in_GS_OFFSET + 0x14)) {
    return;
  }
                    /* 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)