NET_LagPacket
0x001c3670 · 671 bytes · __cdecl
_Z13NET_LagPacketbP11netpacket_s
Decompiled
undefined (2 params)
/* NET_LagPacket(bool, netpacket_s*) */
undefined4 NET_LagPacket(bool param_1,netpacket_s *param_2)
{
float fVar1;
undefined2 uVar2;
int iVar3;
undefined4 *puVar4;
int iVar5;
longdouble lVar6;
float fVar7;
float fVar8;
undefined3 in_stack_00000005;
iVar5 = *(int *)(param_2 + 0xc);
if (2 < iVar5) {
return _param_1;
}
if (*(int *)(droppackets._28_4_ + 0x30) < 1) {
fVar8 = *(float *)(fakeloss._28_4_ + 0x2c);
if (fVar8 == 0.0) {
if (s_FakeLag <= 0.0) goto LAB_001c36b0;
if (!param_1) goto LAB_001c3799;
goto LAB_001c3760;
}
if (param_1) goto LAB_001c36fa;
}
else if (param_1) {
if (iVar5 == 0) {
ConVar::SetValue(0x3ac680);
return 0;
}
fVar8 = *(float *)(fakeloss._28_4_ + 0x2c);
if (fVar8 == 0.0) {
if (s_FakeLag <= 0.0) goto LAB_001c36b0;
}
else {
LAB_001c36fa:
iVar3 = *(int *)(NET_LagPacket(bool,netpacket_s*)::losscount + iVar5 * 4);
*(int *)(NET_LagPacket(bool,netpacket_s*)::losscount + iVar5 * 4) = iVar3 + 1;
if (fVar8 <= 0.0) {
iVar5 = 2;
if (1 < (int)ABS(fVar8)) {
iVar5 = (int)ABS(fVar8);
}
if ((iVar3 + 1) % iVar5 == 0) {
return 0;
}
}
else {
iVar5 = RandomInt(0,100);
if (iVar5 <= (int)*(float *)(fakeloss._28_4_ + 0x2c)) {
return 0;
}
}
if (s_FakeLag <= 0.0) goto LAB_001c36b0;
iVar5 = *(int *)(param_2 + 0xc);
}
LAB_001c3760:
NET_AddToLagged((netpacket_s **)(&s_pLagData + iVar5),param_2);
iVar5 = *(int *)(param_2 + 0xc);
goto LAB_001c3799;
}
if (s_FakeLag <= 0.0) {
LAB_001c36b0:
NET_ClearLagData(0);
NET_ClearLagData(1);
NET_ClearLagData(2);
return _param_1;
}
LAB_001c3799:
fVar8 = s_FakeLag;
puVar4 = (undefined4 *)(&s_pLagData)[iVar5];
if (puVar4 != (undefined4 *)0x0) {
fVar1 = *(float *)(fakejitter._28_4_ + 0x2c);
if (0.0 < fVar1) {
fVar7 = s_FakeLag * 0.5;
if (fVar1 <= s_FakeLag * 0.5) {
fVar7 = fVar1;
}
lVar6 = (longdouble)RandomFloat(-fVar7,fVar7);
fVar8 = fVar8 + (float)lVar6;
}
if ((double)(fVar8 * 0.001) + *(double *)(puVar4 + 4) <= net_time) {
(&s_pLagData)[*(int *)(param_2 + 0xc)] = puVar4[0x13];
*(undefined4 *)(param_2 + 0xc) = puVar4[3];
*(undefined4 *)param_2 = *puVar4;
*(undefined4 *)(param_2 + 4) = puVar4[1];
uVar2 = *(undefined2 *)(puVar4 + 2);
*(undefined4 *)(param_2 + 0x4c) = 0;
*(double *)(param_2 + 0x10) = net_time;
*(undefined2 *)(param_2 + 8) = uVar2;
*(undefined4 *)(param_2 + 0x40) = puVar4[0x10];
*(undefined4 *)(param_2 + 0x44) = puVar4[0x11];
param_2[0x48] = *(netpacket_s *)(puVar4 + 0x12);
_V_memcpy(*(void **)(param_2 + 0x18),(void *)puVar4[6],puVar4[0x10]);
if ((void *)puVar4[6] != (void *)0x0) {
operator_delete__((void *)puVar4[6]);
}
operator_delete(puVar4);
return 1;
}
}
return 0;
}
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.