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 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.