L L4D2node

CLagCompensationManager::BacktrackEntity

0x007ca420 · 6094 bytes · __thiscall

_ZN23CLagCompensationManager15BacktrackEntityEP11CBaseEntityfP19CUtlFixedLinkedListI9LagRecordEPS3_S6_b

Decompiled

undefined (7 params)

/* WARNING: Globals starting with '_' overlap smaller symbols at the same address */
/* CLagCompensationManager::BacktrackEntity(CBaseEntity*, float, CUtlFixedLinkedList<LagRecord>*,
   LagRecord*, LagRecord*, bool) */

undefined4 __thiscall
CLagCompensationManager::BacktrackEntity
          (CLagCompensationManager *this,CBaseEntity *param_1,float param_2,
          CUtlFixedLinkedList *param_3,LagRecord *param_4,LagRecord *param_5,bool param_6)

{
  float *pfVar1;
  float *pfVar2;
  byte *pbVar3;
  CCollisionProperty *this_00;
  uint *puVar4;
  float fVar5;
  float fVar6;
  float fVar7;
  int iVar8;
  CBaseEdict *pCVar9;
  char *pcVar10;
  short sVar11;
  bool bVar12;
  byte bVar13;
  char cVar14;
  ushort uVar15;
  float *pfVar16;
  int iVar17;
  CBaseAnimating *pCVar18;
  CBaseAnimatingOverlay *this_01;
  int iVar19;
  int iVar20;
  int iVar21;
  undefined4 *puVar22;
  LagRecord *pLVar23;
  undefined4 uVar24;
  byte *pbVar25;
  byte *pbVar26;
  longdouble lVar27;
  float fVar28;
  float fVar29;
  float fVar30;
  float fVar31;
  float fVar32;
  float fVar33;
  float local_120;
  uint local_11c;
  float local_118;
  float local_114;
  float local_110;
  byte *local_104;
  float local_100;
  undefined4 local_f4;
  undefined4 local_f0;
  undefined4 local_ec [2];
  float local_e4;
  float local_e0;
  float local_dc;
  float local_d8;
  float local_d4;
  float local_d0;
  float local_cc;
  float local_c8;
  float local_c4;
  float local_c0;
  float local_bc;
  float local_b8;
  undefined4 local_b4;
  undefined4 local_b0;
  int local_ac;
  float local_a8;
  float local_a4;
  float local_a0;
  float local_9c;
  float local_98;
  float local_94;
  Quaternion local_90 [16];
  Quaternion local_80 [16];
  float local_70;
  float local_6c;
  float local_68;
  float local_44;
  char local_3a;
  char local_39;
  CBaseEntity *local_24;
  
  local_f4 = 0;
  local_f0 = 0;
  if (_towlower == 0) {
    local_ac = 0;
  }
  else {
    (**(code **)(_towlower + 0x50))
              (_towlower,&local_f4,0,0,0,0,"/data/src/game/server/player_lagcompensation.cpp",0x18e,
               &BacktrackEntity(CBaseEntity*,float,CUtlFixedLinkedList<LagRecord>*,LagRecord*,LagRecord*,bool)
                ::tm_fmt,"(%s)%s","CLagCompensationManager","BacktrackEntity");
    local_ac = _towlower;
  }
  iVar17 = _DAT_0105db00;
  local_b4 = local_f4;
  local_b0 = local_f0;
                    /* try { // try from 007cacb6 to 007cad16 has its CatchHandler @ 007cbc71 */
  if (((_DAT_0105d154 != 0) || (DAT_0105d158 == '\0')) &&
     (iVar20 = ThreadGetCurrentId(), iVar17 == iVar20)) {
    if ((char *)*_DAT_0105d15c != "BacktrackEntity") {
      _DAT_0105d15c =
           (int *)CVProfNode::GetSubNode((char *)_DAT_0105d15c,0xcbc6c0,(char *)0x0,0xcbc670);
    }
    puVar4 = (uint *)(_DAT_0105d1e8 + 4 + _DAT_0105d15c[0x1c] * 8);
    *puVar4 = *puVar4 | 4;
    CVProfNode::EnterScope();
    DAT_0105d158 = '\0';
  }
  if (0 < *(int *)(param_3 + 0x18)) {
    pbVar25 = *(byte **)(param_3 + 0xc);
    if (((byte)param_1[0x14d] & 8) != 0) {
      CBaseEntity::CalcAbsolutePosition(param_1);
    }
    if (pbVar25 != (byte *)0x0) {
      local_104 = (byte *)0x0;
      pbVar26 = (byte *)0x0;
      fVar29 = *(float *)(param_1 + 0x2e8);
      fVar30 = *(float *)(param_1 + 0x2e4);
      fVar32 = *(float *)(param_1 + 0x2e0);
      while ((pbVar25 != *(byte **)(pbVar25 + 0x130) || (*(byte **)(pbVar25 + 0x134) == pbVar25))) {
        if ((*pbVar25 & 1) == 0) goto LAB_007cad60;
        pfVar16 = (float *)(pbVar25 + 8);
        pfVar1 = (float *)(pbVar25 + 4);
        fVar30 = *pfVar16 - fVar30;
        fVar32 = *pfVar1 - fVar32;
        pfVar2 = (float *)(pbVar25 + 0xc);
        fVar29 = *pfVar2 - fVar29;
        if (4096.0 < fVar29 * fVar29 + fVar32 * fVar32 + fVar30 * fVar30) goto LAB_007cad60;
        local_104 = pbVar26;
        pbVar26 = pbVar25;
        if ((*(float *)(pbVar25 + 0x34) <= param_2) ||
           (pbVar3 = pbVar25 + 0x134, pbVar25 = *(byte **)pbVar3, fVar29 = *pfVar2,
           fVar30 = *pfVar16, fVar32 = *pfVar1, *(byte **)pbVar3 == (byte *)0x0)) break;
      }
      if (pbVar26 != (byte *)0x0) {
        if (((local_104 == (byte *)0x0) || (fVar29 = *(float *)(pbVar26 + 0x34), param_2 <= fVar29))
           || (*(float *)(local_104 + 0x34) <= fVar29)) {
          local_c0 = *(float *)(pbVar26 + 0x10);
          local_120 = 0.0;
          local_bc = *(float *)(pbVar26 + 0x14);
          local_b8 = *(float *)(pbVar26 + 0x18);
          local_e4 = *(float *)(pbVar26 + 4);
          local_e0 = *(float *)(pbVar26 + 8);
          local_dc = *(float *)(pbVar26 + 0xc);
          local_d8 = *(float *)(pbVar26 + 0x1c);
          local_d4 = *(float *)(pbVar26 + 0x20);
          local_d0 = *(float *)(pbVar26 + 0x24);
          local_cc = *(float *)(pbVar26 + 0x28);
          local_c8 = *(float *)(pbVar26 + 0x2c);
          local_c4 = *(float *)(pbVar26 + 0x30);
        }
        else {
          local_c0 = *(float *)(local_104 + 0x10);
          local_120 = (param_2 - fVar29) / (*(float *)(local_104 + 0x34) - fVar29);
          if (((local_c0 != *(float *)(pbVar26 + 0x10)) ||
              (local_bc = *(float *)(local_104 + 0x14), local_bc != *(float *)(pbVar26 + 0x14))) ||
             (local_b8 = *(float *)(pbVar26 + 0x18), local_b8 != *(float *)(local_104 + 0x18))) {
            AngleQuaternion((QAngle *)(pbVar26 + 0x10),local_90);
            AngleQuaternion((QAngle *)(local_104 + 0x10),local_80);
            QuaternionSlerp(local_90,local_80,local_120,(Quaternion *)&local_70);
            QuaternionAngles((Quaternion *)&local_70,(QAngle *)&local_a8);
            local_c0 = local_a8;
            local_b8 = local_a0;
            local_bc = local_a4;
          }
          local_e0 = (*(float *)(local_104 + 8) - *(float *)(pbVar26 + 8)) * local_120 +
                     *(float *)(pbVar26 + 8);
          local_dc = (*(float *)(local_104 + 0xc) - *(float *)(pbVar26 + 0xc)) * local_120 +
                     *(float *)(pbVar26 + 0xc);
          local_e4 = (*(float *)(local_104 + 4) - *(float *)(pbVar26 + 4)) * local_120 +
                     *(float *)(pbVar26 + 4);
          local_d4 = (*(float *)(local_104 + 0x20) - *(float *)(pbVar26 + 0x20)) * local_120 +
                     *(float *)(pbVar26 + 0x20);
          local_d0 = (*(float *)(local_104 + 0x24) - *(float *)(pbVar26 + 0x24)) * local_120 +
                     *(float *)(pbVar26 + 0x24);
          local_d8 = (*(float *)(local_104 + 0x1c) - *(float *)(pbVar26 + 0x1c)) * local_120 +
                     *(float *)(pbVar26 + 0x1c);
          local_c8 = (*(float *)(local_104 + 0x2c) - *(float *)(pbVar26 + 0x2c)) * local_120 +
                     *(float *)(pbVar26 + 0x2c);
          local_c4 = (*(float *)(local_104 + 0x30) - *(float *)(pbVar26 + 0x30)) * local_120 +
                     *(float *)(pbVar26 + 0x30);
          local_cc = (*(float *)(local_104 + 0x28) - *(float *)(pbVar26 + 0x28)) * local_120 +
                     *(float *)(pbVar26 + 0x28);
        }
        if (*(int *)(sv_unlag_fixstuck._28_4_ + 0x30) != 0) {
          iVar17 = CBaseEntity::GetTeamNumber(param_1);
          cVar14 = IsASurvivorTeam(iVar17);
          UTIL_TraceEntity(param_1,(Vector *)&local_e4,(Vector *)&local_e4,
                           (-(uint)(cVar14 == '\0') & 0x10000) + 0x201420b,(CGameTrace *)&local_70);
          if ((local_39 != '\0') || (local_3a != '\0')) {
            if (*(int *)(sv_unlag_debug._28_4_ + 0x30) != 0) {
              if (*(int *)(param_1 + 0x30) == 0) {
                iVar17 = 0;
              }
              else {
                iVar17 = *(int *)(param_1 + 0x30) - *(int *)(gpGlobals + 0x58) >> 4;
              }
              DevMsg("WARNING: BackupPlayer trying to back player into a bad position - client %d\n"
                     ,iVar17);
            }
            if ((local_24 != (CBaseEntity *)0x0) && (*(CBaseEntity **)(this + 0x30) != local_24)) {
              puVar22 = (undefined4 *)(**(code **)(*(int *)local_24 + 0xc))(local_24);
              local_ec[0] = *puVar22;
              uVar15 = CUtlRBTree<CUtlMap<CHandle<CBaseEntity>,CLagCompensationManager::EntityLagData*,unsigned_short>::Node_t,unsigned_short,CUtlMap<CHandle<CBaseEntity>,CLagCompensationManager::EntityLagData*,unsigned_short>::CKeyLess,CUtlMemory<UtlRBTreeNode_t<CUtlMap<CHandle<CBaseEntity>,CLagCompensationManager::EntityLagData*,unsigned_short>::Node_t,unsigned_short>,unsigned_short>>
                       ::Find((CUtlRBTree<CUtlMap<CHandle<CBaseEntity>,CLagCompensationManager::EntityLagData*,unsigned_short>::Node_t,unsigned_short,CUtlMap<CHandle<CBaseEntity>,CLagCompensationManager::EntityLagData*,unsigned_short>::CKeyLess,CUtlMemory<UtlRBTreeNode_t<CUtlMap<CHandle<CBaseEntity>,CLagCompensationManager::EntityLagData*,unsigned_short>::Node_t,unsigned_short>,unsigned_short>>
                               *)(this + 0x10),(Node_t *)local_ec);
              if ((uVar15 != 0xffff) &&
                 (pcVar10 = *(char **)((uint)uVar15 * 0x10 + *(int *)(this + 0x14) + 0xc),
                 *pcVar10 == '\0')) {
                *pcVar10 = '\x01';
                BacktrackEntity(this,local_24,param_2,(CUtlFixedLinkedList *)(pcVar10 + 4),
                                (LagRecord *)(pcVar10 + 0x30),(LagRecord *)(pcVar10 + 0x160),true);
                *pcVar10 = '\0';
              }
            }
            iVar17 = CBaseEntity::GetTeamNumber(param_1);
            cVar14 = IsASurvivorTeam(iVar17);
            if (((byte)param_1[0x14d] & 8) != 0) {
              CBaseEntity::CalcAbsolutePosition(param_1);
            }
            UTIL_TraceEntity(param_1,(Vector *)(param_1 + 0x2e0),(Vector *)&local_e4,
                             (-(uint)(cVar14 == '\0') & 0x10000) + 0x201420b,(CGameTrace *)&local_70
                            );
            if ((local_39 == '\0') && (local_3a == '\0')) {
              fVar29 = g_flFractionScale * local_44;
              if (((byte)param_1[0x14d] & 8) != 0) {
                CBaseEntity::CalcAbsolutePosition(param_1);
              }
              local_e0 = (local_e0 - *(float *)(param_1 + 0x2e4)) * fVar29 +
                         *(float *)(param_1 + 0x2e4);
              local_dc = (local_dc - *(float *)(param_1 + 0x2e8)) * fVar29 +
                         *(float *)(param_1 + 0x2e8);
              local_e4 = (local_e4 - *(float *)(param_1 + 0x2e0)) * fVar29 +
                         *(float *)(param_1 + 0x2e0);
              if (*(int *)(sv_unlag_debug._28_4_ + 0x30) != 0) {
                DevMsg("Backtrack got most of the way\n");
              }
            }
            else if (*(int *)(sv_unlag_debug._28_4_ + 0x30) != 0) {
              DevMsg("Backtrack failed completely, bad starting position\n");
            }
          }
        }
        if (((byte)param_1[0x14d] & 8) == 0) {
          local_118 = *(float *)(param_1 + 0x37c) - local_c0;
          local_110 = *(float *)(param_1 + 0x380) - local_bc;
          local_114 = *(float *)(param_1 + 900) - local_b8;
        }
        else {
          CBaseEntity::CalcAbsolutePosition(param_1);
          local_118 = *(float *)(param_1 + 0x37c) - local_c0;
          local_110 = *(float *)(param_1 + 0x380) - local_bc;
          local_114 = *(float *)(param_1 + 900) - local_b8;
          if (((byte)param_1[0x14d] & 8) != 0) {
            CBaseEntity::CalcAbsolutePosition(param_1);
          }
        }
        fVar29 = *(float *)(param_1 + 0x2e0) - local_e4;
        fVar30 = *(float *)(param_1 + 0x2e8) - local_dc;
        fVar32 = *(float *)(param_1 + 0x2e4) - local_e0;
        *(undefined4 *)(param_4 + 0x34) = *(undefined4 *)(param_1 + 0x94);
        if (local_114 * local_114 + local_118 * local_118 + local_110 * local_110 <= 0.010000001) {
          local_11c = 0;
        }
        else {
          if (((byte)param_1[0x14d] & 8) != 0) {
            CBaseEntity::CalcAbsolutePosition(param_1);
          }
          *(undefined4 *)(param_4 + 0x10) = *(undefined4 *)(param_1 + 0x37c);
          *(undefined4 *)(param_4 + 0x14) = *(undefined4 *)(param_1 + 0x380);
          *(undefined4 *)(param_4 + 0x18) = *(undefined4 *)(param_1 + 900);
                    /* try { // try from 007ca807 to 007cac73 has its CatchHandler @ 007cbc4d */
          CBaseEntity::SetAbsAngles(param_1,(QAngle *)&local_c0);
          local_11c = 0x200;
          *(float *)(param_5 + 0x10) = local_c0;
          *(float *)(param_5 + 0x14) = local_bc;
          *(float *)(param_5 + 0x18) = local_b8;
        }
        this_00 = (CCollisionProperty *)(param_1 + 0x194);
        pfVar16 = (float *)(**(code **)(*(int *)(param_1 + 0x194) + 4))(this_00);
        if (((((*pfVar16 != local_d8) || (pfVar16[1] != local_d4)) || (pfVar16[2] != local_d0)) ||
            ((pfVar16 = (float *)(**(code **)(*(int *)(param_1 + 0x194) + 8))(this_00),
             *pfVar16 != local_cc || (pfVar16[1] != local_c8)))) || (pfVar16[2] != local_c4)) {
                    /* try { // try from 007cae0c to 007cbc3a has its CatchHandler @ 007cbc4d */
          puVar22 = (undefined4 *)(**(code **)(*(int *)(param_1 + 0x194) + 4))(this_00);
          *(undefined4 *)(param_4 + 0x1c) = *puVar22;
          *(undefined4 *)(param_4 + 0x20) = puVar22[1];
          *(undefined4 *)(param_4 + 0x24) = puVar22[2];
          puVar22 = (undefined4 *)(**(code **)(*(int *)(param_1 + 0x194) + 8))(this_00);
          *(undefined4 *)(param_4 + 0x28) = *puVar22;
          *(undefined4 *)(param_4 + 0x2c) = puVar22[1];
          *(undefined4 *)(param_4 + 0x30) = puVar22[2];
          CCollisionProperty::SetCollisionBounds(this_00,(Vector *)&local_d8,(Vector *)&local_cc);
          local_11c = local_11c | 0x400;
          *(float *)(param_5 + 0x1c) = local_d8;
          *(float *)(param_5 + 0x20) = local_d4;
          *(float *)(param_5 + 0x24) = local_d0;
          *(float *)(param_5 + 0x28) = local_cc;
          *(float *)(param_5 + 0x2c) = local_c8;
          *(float *)(param_5 + 0x30) = local_c4;
        }
        if (0.010000001 < fVar32 * fVar32 + fVar29 * fVar29 + fVar30 * fVar30) {
          local_11c = local_11c | 0x100;
          if (((byte)param_1[0x14d] & 8) != 0) {
            CBaseEntity::CalcAbsolutePosition(param_1);
          }
          *(undefined4 *)(param_4 + 4) = *(undefined4 *)(param_1 + 0x2e0);
          *(undefined4 *)(param_4 + 8) = *(undefined4 *)(param_1 + 0x2e4);
          *(undefined4 *)(param_4 + 0xc) = *(undefined4 *)(param_1 + 0x2e8);
          CBaseEntity::SetAbsOrigin(param_1,(Vector *)&local_e4);
          *(float *)(param_5 + 4) = local_e4;
          *(float *)(param_5 + 8) = local_e0;
          *(float *)(param_5 + 0xc) = local_dc;
        }
        if (*(int *)(this + 0x34) == 0) {
LAB_007caef0:
          if (local_11c == 0) goto LAB_007cad60;
        }
        else {
          if (*(int *)(this + 0x34) == 2) {
            AngleVectors((QAngle *)(this + 0x44),(Vector *)&local_70);
            fVar29 = *(float *)(this + 0x50);
            fVar33 = local_70 * fVar29 + *(float *)(this + 0x38);
            fVar31 = local_6c * fVar29 + *(float *)(this + 0x3c);
            fVar28 = fVar29 * local_68 + *(float *)(this + 0x40);
            pfVar16 = (float *)(**(code **)(*(int *)param_1 + 0x288))(param_1);
            fVar29 = pfVar16[2];
            fVar30 = *pfVar16;
            fVar32 = pfVar16[1];
            fVar5 = *(float *)(this + 0x40);
            fVar6 = *(float *)(this + 0x38);
            fVar7 = *(float *)(this + 0x3c);
            local_9c = fVar33 - fVar6;
            local_98 = fVar31 - fVar7;
            local_94 = fVar28 - fVar5;
            lVar27 = (longdouble)VectorNormalize((Vector *)&local_9c);
            fVar29 = (fVar32 - fVar7) * local_98 + (fVar30 - fVar6) * local_9c +
                     (fVar29 - fVar5) * local_94;
            if (fVar29 < 0.0) {
              fVar31 = *pfVar16 - *(float *)(this + 0x38);
              fVar33 = pfVar16[1] - *(float *)(this + 0x3c);
              fVar28 = pfVar16[2] - *(float *)(this + 0x40);
LAB_007cb2d9:
              fVar29 = -SQRT(fVar28 * fVar28 + fVar31 * fVar31 + fVar33 * fVar33);
            }
            else {
              if ((float)lVar27 < fVar29) {
                fVar33 = *pfVar16 - fVar33;
                fVar31 = pfVar16[1] - fVar31;
                fVar28 = pfVar16[2] - fVar28;
                goto LAB_007cb2d9;
              }
              fVar32 = (*pfVar16 - *(float *)(this + 0x38)) - local_9c * fVar29;
              fVar30 = (pfVar16[1] - *(float *)(this + 0x3c)) - local_98 * fVar29;
              fVar29 = (pfVar16[2] - *(float *)(this + 0x40)) - fVar29 * local_94;
              fVar29 = SQRT(fVar30 * fVar30 + fVar29 * fVar29 + fVar32 * fVar32);
            }
            bVar12 = fVar29 <= 100.0 && 0.0 <= fVar29;
          }
          else {
            bVar12 = true;
          }
          bVar13 = bVar12 & param_6;
          if ((bVar13 == 0) ||
             (iVar17 = (**(code **)(*(int *)param_1 + 0xf0))(param_1), iVar17 == 0))
          goto LAB_007caef0;
          pCVar18 = (CBaseAnimating *)(**(code **)(*(int *)param_1 + 0xf0))(param_1);
          local_11c = local_11c | 0x800;
          *(undefined4 *)(param_4 + 0x128) = *(undefined4 *)(pCVar18 + 0x494);
          *(undefined4 *)(param_4 + 300) = *(undefined4 *)(pCVar18 + 0x490);
          iVar17 = *(int *)(pbVar26 + 0x128);
          sVar11 = (short)pCVar18;
          if (((local_104 == (byte *)0x0) || (iVar17 != *(int *)(local_104 + 0x128))) ||
             (local_120 <= 0.0)) {
            CBaseAnimating::SetSequence(pCVar18,iVar17);
            fVar29 = *(float *)(pbVar26 + 300);
            if (fVar29 == *(float *)(pCVar18 + 0x490)) {
              bVar13 = 0;
            }
            else {
              CServerNetworkProperty::NetworkStateChanged(sVar11 + 0x24);
              bVar13 = 0;
              *(float *)(pCVar18 + 0x490) = fVar29;
            }
          }
          else {
            CBaseAnimating::SetSequence(pCVar18,(int)(float)iVar17);
            fVar29 = *(float *)(local_104 + 300);
            local_100 = *(float *)(pbVar26 + 300);
            fVar32 = (fVar29 - local_100) * local_120 + local_100;
            fVar30 = *(float *)(pCVar18 + 0x490);
            if (fVar32 != *(float *)(pCVar18 + 0x490)) {
              CServerNetworkProperty::NetworkStateChanged(sVar11 + 0x24);
              *(float *)(pCVar18 + 0x490) = fVar32;
              local_100 = *(float *)(pbVar26 + 300);
              fVar29 = *(float *)(local_104 + 300);
              fVar30 = fVar32;
            }
            if (local_100 <= fVar29) {
              local_100 = local_100 + (fVar29 - local_100) * local_120;
              if (local_100 != fVar30) {
                CServerNetworkProperty::NetworkStateChanged(sVar11 + 0x24);
                *(float *)(pCVar18 + 0x490) = local_100;
              }
            }
            else {
              local_100 = ((fVar29 + 1.0) - local_100) * local_120 + local_100;
              if (1.0 <= local_100) {
                local_100 = local_100 - 1.0;
              }
              if (local_100 != fVar30) {
                CServerNetworkProperty::NetworkStateChanged(sVar11 + 0x24);
                *(float *)(pCVar18 + 0x490) = local_100;
              }
            }
          }
          this_01 = (CBaseAnimatingOverlay *)(**(code **)(*(int *)param_1 + 0xf4))(param_1);
          if ((this_01 != (CBaseAnimatingOverlay *)0x0) &&
             (iVar17 = *(int *)(this_01 + 0x1400), 0 < iVar17)) {
            pbVar26 = pbVar26 + 0x38;
            local_100 = 0.0;
            pLVar23 = param_4;
            do {
              iVar20 = CBaseAnimatingOverlay::GetAnimOverlay(this_01,(int)local_100);
              if (iVar20 != 0) {
                *(undefined4 *)(pLVar23 + 0x3c) = *(undefined4 *)(iVar20 + 0xc);
                *(undefined4 *)(pLVar23 + 0x44) = *(undefined4 *)(iVar20 + 0x3c);
                *(undefined4 *)(pLVar23 + 0x38) = *(undefined4 *)(iVar20 + 8);
                *(undefined4 *)(pLVar23 + 0x40) = *(undefined4 *)(iVar20 + 0x14);
                if (((bVar13 == 0) ||
                    (fVar29 = *(float *)(pbVar26 + 0xc), fVar29 != (float)*(int *)(local_104 + 0x44)
                    )) || (*(int *)pbVar26 != *(int *)(local_104 + 0x38))) {
                  fVar29 = *(float *)(pbVar26 + 4);
                  if (fVar29 != *(float *)(iVar20 + 0xc)) {
                    iVar8 = *(int *)(iVar20 + 0x48);
                    if (iVar8 != 0) {
                      if (*(char *)(iVar8 + 0x6c) == '\0') {
                        pCVar9 = *(CBaseEdict **)(iVar8 + 0x30);
                        if (pCVar9 != (CBaseEdict *)0x0) {
                          *(uint *)pCVar9 = *(uint *)pCVar9 | 0x101;
                          iVar21 = CBaseEdict::GetChangeAccessor(pCVar9);
                          *(undefined2 *)(iVar21 + 2) = 0;
                        }
                      }
                      else {
                        *(byte *)(iVar8 + 0x70) = *(byte *)(iVar8 + 0x70) | 1;
                      }
                      *(undefined4 *)(iVar8 + 0x74) = *(undefined4 *)(gpGlobals + 0xc);
                      *(undefined4 *)(iVar8 + 0x78) = 0;
                    }
                    *(float *)(iVar20 + 0xc) = fVar29;
                  }
                  iVar8 = *(int *)(pbVar26 + 0xc);
                  if (iVar8 != *(int *)(iVar20 + 0x3c)) {
                    iVar21 = *(int *)(iVar20 + 0x48);
                    if (iVar21 != 0) {
                      if (*(char *)(iVar21 + 0x6c) == '\0') {
                        pCVar9 = *(CBaseEdict **)(iVar21 + 0x30);
                        if (pCVar9 != (CBaseEdict *)0x0) {
                          *(uint *)pCVar9 = *(uint *)pCVar9 | 0x101;
                          iVar19 = CBaseEdict::GetChangeAccessor(pCVar9);
                          *(undefined2 *)(iVar19 + 2) = 0;
                        }
                      }
                      else {
                        *(byte *)(iVar21 + 0x70) = *(byte *)(iVar21 + 0x70) | 1;
                      }
                      *(undefined4 *)(iVar21 + 0x74) = *(undefined4 *)(gpGlobals + 0xc);
                      *(undefined4 *)(iVar21 + 0x78) = 0;
                    }
                    *(int *)(iVar20 + 0x3c) = iVar8;
                  }
                  iVar8 = *(int *)pbVar26;
                  if (iVar8 != *(int *)(iVar20 + 8)) {
                    iVar21 = *(int *)(iVar20 + 0x48);
                    if (iVar21 != 0) {
                      if (*(char *)(iVar21 + 0x6c) == '\0') {
                        pCVar9 = *(CBaseEdict **)(iVar21 + 0x30);
                        if (pCVar9 != (CBaseEdict *)0x0) {
                          *(uint *)pCVar9 = *(uint *)pCVar9 | 0x101;
                          iVar19 = CBaseEdict::GetChangeAccessor(pCVar9);
                          *(undefined2 *)(iVar19 + 2) = 0;
                        }
                      }
                      else {
                        *(byte *)(iVar21 + 0x70) = *(byte *)(iVar21 + 0x70) | 1;
                      }
                      *(undefined4 *)(iVar21 + 0x74) = *(undefined4 *)(gpGlobals + 0xc);
                      *(undefined4 *)(iVar21 + 0x78) = 0;
                    }
                    *(int *)(iVar20 + 8) = iVar8;
                  }
                  fVar29 = *(float *)(pbVar26 + 8);
                  if (fVar29 != *(float *)(iVar20 + 0x14)) {
                    iVar8 = *(int *)(iVar20 + 0x48);
                    if (iVar8 != 0) {
                      if (*(char *)(iVar8 + 0x6c) == '\0') {
                        pCVar9 = *(CBaseEdict **)(iVar8 + 0x30);
                        if (pCVar9 != (CBaseEdict *)0x0) {
                          *(uint *)pCVar9 = *(uint *)pCVar9 | 0x101;
                          iVar21 = CBaseEdict::GetChangeAccessor(pCVar9);
                          *(undefined2 *)(iVar21 + 2) = 0;
                        }
                      }
                      else {
                        *(byte *)(iVar8 + 0x70) = *(byte *)(iVar8 + 0x70) | 1;
                      }
                      *(undefined4 *)(iVar8 + 0x74) = *(undefined4 *)(gpGlobals + 0xc);
                      *(undefined4 *)(iVar8 + 0x78) = 0;
                    }
                    *(float *)(iVar20 + 0x14) = fVar29;
                  }
                }
                else {
                  local_110 = *(float *)(pbVar26 + 4);
                  fVar30 = *(float *)(local_104 + 0x3c);
                  if (local_110 <= fVar30) {
                    local_110 = local_110 + (fVar30 - local_110) * local_120;
                    if (local_110 != *(float *)(iVar20 + 0xc)) {
                      iVar8 = *(int *)(iVar20 + 0x48);
                      if (iVar8 != 0) {
                        if (*(char *)(iVar8 + 0x6c) == '\0') {
                          pCVar9 = *(CBaseEdict **)(iVar8 + 0x30);
                          if (pCVar9 != (CBaseEdict *)0x0) {
                            *(uint *)pCVar9 = *(uint *)pCVar9 | 0x101;
                            iVar21 = CBaseEdict::GetChangeAccessor(pCVar9);
                            *(undefined2 *)(iVar21 + 2) = 0;
                          }
                        }
                        else {
                          *(byte *)(iVar8 + 0x70) = *(byte *)(iVar8 + 0x70) | 1;
                        }
                        *(undefined4 *)(iVar8 + 0x74) = *(undefined4 *)(gpGlobals + 0xc);
                        *(undefined4 *)(iVar8 + 0x78) = 0;
                      }
                      *(float *)(iVar20 + 0xc) = local_110;
                      fVar29 = (float)*(int *)(pbVar26 + 0xc);
                    }
                  }
                  else {
                    local_110 = ((fVar30 + 1.0) - local_110) * local_120 + local_110;
                    if (1.0 <= local_110) {
                      local_110 = local_110 - 1.0;
                    }
                    if (local_110 != *(float *)(iVar20 + 0xc)) {
                      iVar8 = *(int *)(iVar20 + 0x48);
                      if (iVar8 != 0) {
                        if (*(char *)(iVar8 + 0x6c) == '\0') {
                          pCVar9 = *(CBaseEdict **)(iVar8 + 0x30);
                          if (pCVar9 != (CBaseEdict *)0x0) {
                            *(uint *)pCVar9 = *(uint *)pCVar9 | 0x101;
                            iVar21 = CBaseEdict::GetChangeAccessor(pCVar9);
                            *(undefined2 *)(iVar21 + 2) = 0;
                          }
                        }
                        else {
                          *(byte *)(iVar8 + 0x70) = *(byte *)(iVar8 + 0x70) | 1;
                        }
                        *(undefined4 *)(iVar8 + 0x74) = *(undefined4 *)(gpGlobals + 0xc);
                        *(undefined4 *)(iVar8 + 0x78) = 0;
                      }
                      *(float *)(iVar20 + 0xc) = local_110;
                      fVar29 = (float)*(int *)(pbVar26 + 0xc);
                    }
                  }
                  local_110 = fVar29;
                  if ((float)*(int *)(iVar20 + 0x3c) != local_110) {
                    if (*(CBaseEntity **)(iVar20 + 0x48) != (CBaseEntity *)0x0) {
                      CBaseEntity::NetworkStateChanged(*(CBaseEntity **)(iVar20 + 0x48));
                    }
                    *(float *)(iVar20 + 0x3c) = local_110;
                  }
                  iVar8 = *(int *)pbVar26;
                  if (iVar8 != *(int *)(iVar20 + 8)) {
                    iVar21 = *(int *)(iVar20 + 0x48);
                    if (iVar21 != 0) {
                      if (*(char *)(iVar21 + 0x6c) == '\0') {
                        pCVar9 = *(CBaseEdict **)(iVar21 + 0x30);
                        if (pCVar9 != (CBaseEdict *)0x0) {
                          *(uint *)pCVar9 = *(uint *)pCVar9 | 0x101;
                          iVar19 = CBaseEdict::GetChangeAccessor(pCVar9);
                          *(undefined2 *)(iVar19 + 2) = 0;
                        }
                      }
                      else {
                        *(byte *)(iVar21 + 0x70) = *(byte *)(iVar21 + 0x70) | 1;
                      }
                      *(undefined4 *)(iVar21 + 0x74) = *(undefined4 *)(gpGlobals + 0xc);
                      *(undefined4 *)(iVar21 + 0x78) = 0;
                    }
                    *(int *)(iVar20 + 8) = iVar8;
                  }
                  fVar29 = *(float *)(pbVar26 + 8) +
                           (*(float *)(local_104 + 0x40) - *(float *)(pbVar26 + 8)) * local_120;
                  if (fVar29 != *(float *)(iVar20 + 0x14)) {
                    if (*(CBaseEntity **)(iVar20 + 0x48) != (CBaseEntity *)0x0) {
                      CBaseEntity::NetworkStateChanged(*(CBaseEntity **)(iVar20 + 0x48));
                    }
                    *(float *)(iVar20 + 0x14) = fVar29;
                  }
                }
              }
              local_100 = (float)((int)local_100 + 1);
              pbVar26 = pbVar26 + 0x10;
              pLVar23 = pLVar23 + 0x10;
              local_104 = local_104 + 0x10;
            } while (local_100 != (float)iVar17);
          }
        }
        if (((*(int *)(sv_lagflushbonecache._28_4_ + 0x30) != 0) && ((local_11c & 0x800) != 0)) &&
           (iVar17 = (**(code **)(*(int *)param_1 + 0xf0))(param_1), iVar17 != 0)) {
          pCVar18 = (CBaseAnimating *)(**(code **)(*(int *)param_1 + 0xf0))(param_1);
          CBaseAnimating::InvalidateBoneCache(pCVar18);
        }
        this[0x2c] = (CLagCompensationManager)0x1;
        *(uint *)param_4 = local_11c;
        *(uint *)param_5 = local_11c;
        if ((*(int *)(sv_showlagcompensation._28_4_ + 0x30) == 1) &&
           (iVar17 = (**(code **)(*(int *)param_1 + 0xf0))(param_1), iVar17 != 0)) {
          pCVar18 = (CBaseAnimating *)(**(code **)(*(int *)param_1 + 0xf0))(param_1);
          CBaseAnimating::DrawServerHitboxes(pCVar18,4.0,true);
        }
        uVar24 = 1;
        goto LAB_007cad62;
      }
    }
    if (*(int *)(sv_unlag_debug._28_4_ + 0x30) != 0) {
      if (*(int *)(param_1 + 0x30) == 0) {
        iVar17 = 0;
      }
      else {
        iVar17 = *(int *)(param_1 + 0x30) - *(int *)(gpGlobals + 0x58) >> 4;
      }
                    /* try { // try from 007cad54 to 007cad58 has its CatchHandler @ 007cbc4d */
      DevMsg("No valid positions in history for BacktrackPlayer client ( %d )\n",iVar17);
    }
  }
LAB_007cad60:
  uVar24 = 0;
LAB_007cad62:
  iVar17 = _DAT_0105db00;
  if (((DAT_0105d158 == '\0') || (_DAT_0105d154 != 0)) &&
     (iVar20 = ThreadGetCurrentId(), iVar17 == iVar20)) {
    cVar14 = CVProfNode::ExitScope();
    if (cVar14 != '\0') {
      _DAT_0105d15c = (int *)_DAT_0105d15c[0x19];
    }
    DAT_0105d158 = _DAT_0105d15c == (int *)0x105d160;
  }
  if (local_ac != 0) {
    (**(code **)(local_ac + 0x54))(local_ac,local_b4,local_b0,0,0,0);
  }
  return uVar24;
}

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)