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 intoaddons/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.
Signatures + Functions block. The plugin uses
DHookCreateFromConf - DHooks reads return type, this-type,
calling convention, and argument types straight from the gamedata. Less
boilerplate in the plugin, types travel with the gamedata.
Gamedata KeyValues
DHooks plugin example
Type inference is best-effort from the C signature - sanity-check the DHooks types before shipping.