L L4D2node

CLagCompensationManager::RecordDataIntoTrack

0x007cbc80 · 1065 bytes · __thiscall

_ZN23CLagCompensationManager19RecordDataIntoTrackEP11CBaseEntityP19CUtlFixedLinkedListI9LagRecordEb

Decompiled

undefined (4 params)

/* CLagCompensationManager::RecordDataIntoTrack(CBaseEntity*, CUtlFixedLinkedList<LagRecord>*, bool)
    */

void __thiscall
CLagCompensationManager::RecordDataIntoTrack
          (CLagCompensationManager *this,CBaseEntity *param_1,CUtlFixedLinkedList *param_2,
          bool param_3)

{
  int iVar1;
  char cVar2;
  uint *puVar3;
  int iVar4;
  CBaseAnimatingOverlay *this_00;
  int iVar5;
  uint *puVar6;
  uint *puVar7;
  uint *puVar8;
  int *piVar9;
  int iVar10;
  float fVar11;
  
  iVar4 = *(int *)(param_2 + 0x10);
  if (iVar4 != 0) {
    fVar11 = (float)(int)(*(float *)(gpGlobals + 0xc) - *(float *)(sv_maxunlag._28_4_ + 0x2c));
    do {
      if (((iVar4 == *(int *)(iVar4 + 0x130)) && (*(int *)(iVar4 + 0x134) != iVar4)) ||
         (fVar11 < *(float *)(iVar4 + 0x34) || fVar11 == *(float *)(iVar4 + 0x34))) break;
      CUtlLinkedList<LagRecord,int,true,int,CUtlFixedMemory<UtlLinkedListElem_t<LagRecord,int>>>::
      Unlink((CUtlLinkedList<LagRecord,int,true,int,CUtlFixedMemory<UtlLinkedListElem_t<LagRecord,int>>>
              *)param_2,iVar4);
      *(undefined4 *)(iVar4 + 0x134) = *(undefined4 *)(param_2 + 0x14);
      *(int *)(param_2 + 0x14) = iVar4;
      iVar4 = *(int *)(param_2 + 0x10);
    } while (iVar4 != 0);
  }
  if ((0 < *(int *)(param_2 + 0x18)) &&
     (*(float *)(param_1 + 0x94) <= *(float *)(*(int *)(param_2 + 0xc) + 0x34))) {
    return;
  }
  puVar3 = (uint *)CUtlLinkedList<LagRecord,int,true,int,CUtlFixedMemory<UtlLinkedListElem_t<LagRecord,int>>>
                   ::AllocInternal((CUtlLinkedList<LagRecord,int,true,int,CUtlFixedMemory<UtlLinkedListElem_t<LagRecord,int>>>
                                    *)param_2,false);
  puVar8 = (uint *)0x0;
  if (puVar3 == (uint *)0x0) goto LAB_007cbd36;
  piVar9 = *(int **)(param_2 + 0x20);
  if (((piVar9 == (int *)0x0) || (iVar4 = *(int *)(param_2 + 0x24), iVar4 < 0)) ||
     (piVar9[1] <= iVar4)) {
LAB_007cbf65:
    if (puVar3 != (uint *)puVar3[0x4c]) {
      CUtlLinkedList<LagRecord,int,true,int,CUtlFixedMemory<UtlLinkedListElem_t<LagRecord,int>>>::
      Unlink((CUtlLinkedList<LagRecord,int,true,int,CUtlFixedMemory<UtlLinkedListElem_t<LagRecord,int>>>
              *)param_2,(int)puVar3);
    }
  }
  else {
    puVar8 = (uint *)(piVar9 + 2);
    if ((puVar3 < puVar8) || (puVar8 + piVar9[1] * 0x4e <= puVar3)) {
      do {
        piVar9 = (int *)*piVar9;
        if (piVar9 == (int *)0x0) goto LAB_007cbf65;
      } while ((puVar3 < piVar9 + 2) || (piVar9 + 2 + piVar9[1] * 0x4e <= puVar3));
    }
    else if ((int)puVar3 <= (int)(puVar8 + iVar4 * 0x4e)) goto LAB_007cbf65;
  }
  puVar3[0x4c] = 0;
  puVar3[0x4d] = *(uint *)(param_2 + 0xc);
  *(uint **)(param_2 + 0xc) = puVar3;
  if (puVar3[0x4d] == 0) {
    *(uint **)(param_2 + 0x10) = puVar3;
  }
  else {
    *(uint **)(puVar3[0x4d] + 0x130) = puVar3;
  }
  *(int *)(param_2 + 0x18) = *(int *)(param_2 + 0x18) + 1;
  puVar8 = puVar3 + 0xe;
  puVar6 = puVar8;
  do {
    *puVar6 = 0;
    puVar7 = puVar6 + 4;
    puVar6[1] = 0;
    puVar6[2] = 0;
    puVar6[3] = 0;
    puVar6 = puVar7;
  } while (puVar7 != puVar3 + 0x4a);
  *puVar3 = 0;
  puVar3[1] = 0;
  puVar3[2] = 0;
  puVar3[3] = 0;
  puVar3[4] = 0;
  puVar3[5] = 0;
  puVar3[6] = 0;
  puVar3[7] = 0;
  puVar3[8] = 0;
  puVar3[9] = 0;
  puVar3[10] = 0;
  puVar3[0xb] = 0;
  puVar3[0xc] = 0;
  puVar3[0xd] = 0xbf800000;
  puVar3[0x4a] = 0;
  puVar3[0x4b] = 0;
  iVar4 = 0;
  while( true ) {
    *puVar8 = 0;
    puVar8[1] = 0;
    puVar8[2] = 0;
    puVar8[3] = 0;
    puVar8 = puVar3;
    if (iVar4 + 0x10 == 0xf0) break;
    puVar8 = (uint *)((int)puVar3 + iVar4 + 0x48);
    iVar4 = iVar4 + 0x10;
  }
LAB_007cbd36:
  *puVar8 = 0;
  cVar2 = (**(code **)(*(int *)param_1 + 300))(param_1);
  if (cVar2 != '\0') {
    *puVar8 = *puVar8 | 1;
  }
  puVar8[0xd] = *(uint *)(param_1 + 0x94);
  if (((byte)param_1[0x14d] & 8) != 0) {
    CBaseEntity::CalcAbsolutePosition(param_1);
  }
  puVar8[4] = *(uint *)(param_1 + 0x37c);
  puVar8[5] = *(uint *)(param_1 + 0x380);
  puVar8[6] = *(uint *)(param_1 + 900);
  if (((byte)param_1[0x14d] & 8) != 0) {
    CBaseEntity::CalcAbsolutePosition(param_1);
  }
  puVar8[1] = *(uint *)(param_1 + 0x2e0);
  puVar8[2] = *(uint *)(param_1 + 0x2e4);
  puVar8[3] = *(uint *)(param_1 + 0x2e8);
  puVar3 = (uint *)(**(code **)(*(int *)(param_1 + 0x194) + 4))(param_1 + 0x194);
  puVar8[7] = *puVar3;
  puVar8[8] = puVar3[1];
  puVar8[9] = puVar3[2];
  puVar3 = (uint *)(**(code **)(*(int *)(param_1 + 0x194) + 8))(param_1 + 0x194);
  puVar8[10] = *puVar3;
  puVar8[0xb] = puVar3[1];
  puVar8[0xc] = puVar3[2];
  iVar4 = (**(code **)(*(int *)param_1 + 0xf0))(param_1);
  if ((iVar4 != 0) && (param_3)) {
    this_00 = (CBaseAnimatingOverlay *)(**(code **)(*(int *)param_1 + 0xf4))(param_1);
    if ((this_00 != (CBaseAnimatingOverlay *)0x0) && (iVar1 = *(int *)(this_00 + 0x1400), 0 < iVar1)
       ) {
      iVar10 = 0;
      puVar3 = puVar8;
      do {
        iVar5 = CBaseAnimatingOverlay::GetAnimOverlay(this_00,iVar10);
        if (iVar5 != 0) {
          puVar3[0xf] = *(uint *)(iVar5 + 0xc);
          puVar3[0x11] = *(uint *)(iVar5 + 0x3c);
          puVar3[0xe] = *(uint *)(iVar5 + 8);
          puVar3[0x10] = *(uint *)(iVar5 + 0x14);
        }
        iVar10 = iVar10 + 1;
        puVar3 = puVar3 + 4;
      } while (iVar10 != iVar1);
    }
    puVar8[0x4a] = *(uint *)(iVar4 + 0x494);
    puVar8[0x4b] = *(uint *)(iVar4 + 0x490);
    return;
  }
  return;
}

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)