L L4D2node

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