L L4D2node

CTerrorGameMovement::CheckForLedge

0x008e4bd0 · 6306 bytes · __thiscall

_ZN19CTerrorGameMovement13CheckForLedgeERK6Vectorff

Decompiled

undefined (4 params)

/* CTerrorGameMovement::CheckForLedge(Vector const&, float, float) */

undefined4 __thiscall
CTerrorGameMovement::CheckForLedge
          (CTerrorGameMovement *this,Vector *param_1,float param_2,float param_3)

{
  int *piVar1;
  CBaseEntity *pCVar2;
  char cVar3;
  int iVar4;
  int iVar5;
  int iVar6;
  undefined4 uVar7;
  int iVar8;
  Vector *pVVar9;
  Vector *pVVar10;
  uint uVar11;
  TerrorNavArea *pTVar12;
  float *pfVar13;
  byte bVar14;
  float fVar15;
  int local_16c;
  QAngle *local_168;
  float local_164;
  float local_160 [3];
  float local_154;
  float local_150;
  float local_14c;
  float local_148;
  float local_144;
  float local_140;
  float local_13c;
  float local_138;
  float local_134;
  float local_130;
  float local_12c;
  float local_128;
  undefined4 local_124;
  undefined4 local_120;
  float local_11c;
  float local_118;
  float local_114;
  float local_110;
  float local_10c;
  float local_108;
  float local_104;
  undefined4 local_100;
  undefined4 local_fc;
  undefined4 local_f8;
  undefined4 local_f4;
  undefined4 local_f0;
  undefined4 local_ec;
  Vector local_e8 [12];
  undefined **local_dc [4];
  float local_cc;
  float local_c8;
  float local_c4;
  float local_bc;
  float local_b8;
  float local_b4;
  float local_ac;
  float local_a8;
  float local_a4;
  float local_9c;
  float local_98;
  float local_94;
  undefined4 local_8c;
  undefined1 local_88;
  undefined1 local_87;
  float local_70;
  float local_6c;
  float local_68;
  float local_64;
  float local_60;
  float local_5c;
  undefined4 local_58;
  undefined4 local_54;
  float local_50;
  float local_44;
  char local_39;
  CBaseEntity *local_24;
  
  bVar14 = 0;
  iVar4 = CBaseEntity::GetTeamNumber(*(CBaseEntity **)(this + 0x810));
  cVar3 = IsASurvivorTeam(iVar4);
  if (cVar3 == '\0') {
    pCVar2 = *(CBaseEntity **)(this + 0x810);
    iVar4 = CBaseEntity::GetTeamNumber(pCVar2);
    if (iVar4 != 3) {
      return 0;
    }
    iVar4 = (**(code **)(*(int *)pCVar2 + 0x544))(pCVar2);
    if (iVar4 != 2) {
      return 0;
    }
  }
  if (*(float *)(param_1 + 8) <= -400.0 && *(float *)(param_1 + 8) != -400.0) {
    return 0;
  }
  local_14c = 0.0;
  local_154 = *(float *)param_1;
  local_150 = *(float *)(param_1 + 4);
  if ((((-0.01 < local_154) && (local_154 < 0.01)) && (-0.01 < local_150)) && (local_150 < 0.01)) {
    return 0;
  }
  VectorNormalize((Vector *)&local_154);
  if (*(int *)(ZombieDebugLedges._28_4_ + 0x30) != 0) {
    iVar4 = *(int *)(this + 8);
    local_70 = local_154 * 100.0 + *(float *)(iVar4 + 0x9c);
    local_6c = local_150 * 100.0 + *(float *)(iVar4 + 0xa0);
    local_68 = local_14c * 100.0 + *(float *)(iVar4 + 0xa4);
    NDebugOverlay::HorzArrow
              ((Vector *)(iVar4 + 0x9c),(Vector *)&local_70,1.0,0,0,0xff,0xff,true,1000.0);
  }
  iVar5 = (**(code **)(*g_pGameRules + 0x7c))(g_pGameRules);
  iVar6 = (**(code **)(*g_pGameRules + 0x7c))(g_pGameRules);
  CTraceFilterSimple::CTraceFilterSimple
            ((CTraceFilterSimple *)local_dc,*(IHandleEntity **)(this + 4),8,
             (_func_bool_IHandleEntity_ptr_int *)0x0);
  iVar4 = *(int *)(this + 8);
  local_dc[0] = &PTR_ShouldHitEntity_00c54558;
  local_144 = *(float *)(iVar4 + 0xa0);
  local_140 = *(float *)(iVar4 + 0xa4);
  local_148 = *(float *)(iVar4 + 0x9c);
  local_138 = local_144 - param_3 * local_150;
  local_134 = local_140 - param_3 * local_14c;
  local_13c = local_148 - param_3 * local_154;
  uVar7 = (**(code **)(*(int *)this + 0x40))(this,0,0);
  iVar4 = (**(code **)(*g_pGameRules + 0x7c))(g_pGameRules);
  iVar8 = (**(code **)(*g_pGameRules + 0x7c))(g_pGameRules);
  local_8c = 0;
  local_bc = local_13c - local_148;
  local_b4 = local_134 - local_140;
  *(int *)(this + 2000) = *(int *)(this + 2000) + 1;
  local_b8 = local_138 - local_144;
  local_87 = local_b4 * local_b4 + local_bc * local_bc + local_b8 * local_b8 != 0.0;
  local_9c = (*(float *)(iVar4 + 0x18) - *(float *)(iVar8 + 0xc)) * 0.5;
  local_98 = (*(float *)(iVar4 + 0x1c) - *(float *)(iVar8 + 0x10)) * 0.5;
  local_94 = (*(float *)(iVar4 + 0x20) - *(float *)(iVar8 + 0x14)) * 0.5;
  local_88 = local_98 * local_98 + local_9c * local_9c + local_94 * local_94 < 1e-06;
  local_ac = (*(float *)(iVar4 + 0x18) + *(float *)(iVar8 + 0xc)) * 0.5;
  local_cc = local_148 + local_ac;
  local_a8 = (*(float *)(iVar4 + 0x1c) + *(float *)(iVar8 + 0x10)) * 0.5;
  local_ac = -local_ac;
  piVar1 = *(int **)(this + 0x7cc);
  local_a4 = (*(float *)(iVar4 + 0x20) + *(float *)(iVar8 + 0x14)) * 0.5;
  local_c8 = local_144 + local_a8;
  local_a8 = -local_a8;
  local_c4 = local_140 + local_a4;
  local_a4 = -local_a4;
  if (piVar1 != (int *)0x0) {
    cVar3 = (**(code **)(*piVar1 + 0x10))(piVar1,&local_cc);
    if (cVar3 != '\0') {
      (**(code **)(*enginetrace + 0x20))
                (enginetrace,&local_cc,*(undefined4 *)(this + 0x7cc),uVar7,
                 (CTraceFilterSimple *)local_dc,(Vector *)&local_70);
      goto LAB_008e4fb2;
    }
  }
  local_168 = (QAngle *)&local_cc;
  (**(code **)(*enginetrace + 0x14))
            (enginetrace,local_168,uVar7,(CTraceFilterSimple *)local_dc,(Vector *)&local_70);
LAB_008e4fb2:
  local_168 = (QAngle *)&local_cc;
  if ((local_39 == '\0') && (local_44 != 1.0)) {
    iVar4 = *(int *)(this + 8);
    local_140 = *(float *)(iVar4 + 0xa4);
    local_148 = *(float *)(iVar4 + 0x9c);
    local_144 = *(float *)(iVar4 + 0xa0);
    local_134 = local_140 - param_2;
    local_13c = local_148;
    local_138 = local_144;
    uVar7 = (**(code **)(*(int *)this + 0x40))(this,0,0);
    iVar4 = (**(code **)(*g_pGameRules + 0x7c))(g_pGameRules);
    iVar8 = (**(code **)(*g_pGameRules + 0x7c))(g_pGameRules);
    local_8c = 0;
    local_bc = local_13c - local_148;
    local_b8 = local_138 - local_144;
    *(int *)(this + 2000) = *(int *)(this + 2000) + 1;
    local_b4 = local_134 - local_140;
    local_87 = local_b8 * local_b8 + local_bc * local_bc + local_b4 * local_b4 != 0.0;
    local_9c = (*(float *)(iVar4 + 0x18) - *(float *)(iVar8 + 0xc)) * 0.5;
    local_98 = (*(float *)(iVar4 + 0x1c) - *(float *)(iVar8 + 0x10)) * 0.5;
    local_94 = (*(float *)(iVar4 + 0x20) - *(float *)(iVar8 + 0x14)) * 0.5;
    local_88 = local_98 * local_98 + local_9c * local_9c + local_94 * local_94 < 1e-06;
    local_ac = (*(float *)(iVar4 + 0x18) + *(float *)(iVar8 + 0xc)) * 0.5;
    local_cc = local_148 + local_ac;
    local_a8 = (*(float *)(iVar4 + 0x1c) + *(float *)(iVar8 + 0x10)) * 0.5;
    local_ac = -local_ac;
    piVar1 = *(int **)(this + 0x7cc);
    local_a4 = (*(float *)(iVar4 + 0x20) + *(float *)(iVar8 + 0x14)) * 0.5;
    local_c8 = local_144 + local_a8;
    local_a8 = -local_a8;
    local_c4 = local_140 + local_a4;
    local_a4 = -local_a4;
    if ((piVar1 == (int *)0x0) ||
       (cVar3 = (**(code **)(*piVar1 + 0x10))(piVar1,local_168), cVar3 == '\0')) {
      (**(code **)(*enginetrace + 0x14))
                (enginetrace,local_168,uVar7,(CTraceFilterSimple *)local_dc,(Vector *)&local_70);
    }
    else {
      (**(code **)(*enginetrace + 0x20))
                (enginetrace,local_168,*(undefined4 *)(this + 0x7cc),uVar7,
                 (CTraceFilterSimple *)local_dc,(Vector *)&local_70);
    }
    if ((local_39 == '\0') && (1.0 <= local_44)) {
      local_16c = 0;
      local_130 = local_64;
      local_12c = local_60;
      local_128 = local_5c;
      do {
        iVar4 = *(int *)(this + 8);
        local_144 = *(float *)(iVar4 + 0xa0);
        local_140 = *(float *)(iVar4 + 0xa4);
        local_148 = *(float *)(iVar4 + 0x9c);
        local_138 = local_144 - param_3 * local_150;
        local_13c = local_148 - param_3 * local_154;
        local_134 = (local_140 - param_3 * local_14c) - (float)local_16c * param_2;
        uVar7 = (**(code **)(*(int *)this + 0x40))(this,0,0);
        iVar4 = (**(code **)(*g_pGameRules + 0x7c))(g_pGameRules);
        iVar8 = (**(code **)(*g_pGameRules + 0x7c))(g_pGameRules);
        local_8c = 0;
        local_bc = local_13c - local_148;
        local_b8 = local_138 - local_144;
        *(int *)(this + 2000) = *(int *)(this + 2000) + 1;
        local_b4 = local_134 - local_140;
        local_87 = local_b8 * local_b8 + local_bc * local_bc + local_b4 * local_b4 != 0.0;
        local_9c = (*(float *)(iVar4 + 0x18) - *(float *)(iVar8 + 0xc)) * 0.5;
        local_98 = (*(float *)(iVar4 + 0x1c) - *(float *)(iVar8 + 0x10)) * 0.5;
        local_94 = (*(float *)(iVar4 + 0x20) - *(float *)(iVar8 + 0x14)) * 0.5;
        local_88 = local_9c * local_9c + local_98 * local_98 + local_94 * local_94 < 1e-06;
        local_ac = (*(float *)(iVar4 + 0x18) + *(float *)(iVar8 + 0xc)) * 0.5;
        local_cc = local_148 + local_ac;
        local_a8 = (*(float *)(iVar4 + 0x1c) + *(float *)(iVar8 + 0x10)) * 0.5;
        local_ac = -local_ac;
        piVar1 = *(int **)(this + 0x7cc);
        local_c8 = local_144 + local_a8;
        local_a8 = -local_a8;
        local_a4 = (*(float *)(iVar4 + 0x20) + *(float *)(iVar8 + 0x14)) * 0.5;
        local_c4 = local_140 + local_a4;
        local_a4 = -local_a4;
        if ((piVar1 == (int *)0x0) ||
           (cVar3 = (**(code **)(*piVar1 + 0x10))(piVar1,local_168), cVar3 == '\0')) {
          (**(code **)(*enginetrace + 0x14))
                    (enginetrace,local_168,uVar7,(CTraceFilterSimple *)local_dc,(Vector *)&local_70)
          ;
        }
        else {
          (**(code **)(*enginetrace + 0x20))
                    (enginetrace,local_168,*(undefined4 *)(this + 0x7cc),uVar7,
                     (CTraceFilterSimple *)local_dc,(Vector *)&local_70);
        }
        if ((local_39 == '\0') && (local_44 < 1.0)) goto LAB_008e57a6;
        if (*(int *)(ZombieDebugLedges._28_4_ + 0x30) != 0) {
          iVar4 = (**(code **)(*g_pGameRules + 0x7c))(g_pGameRules);
          iVar8 = (**(code **)(*g_pGameRules + 0x7c))(g_pGameRules);
          NDebugOverlay::SweptBox
                    ((Vector *)&local_70,(Vector *)&local_64,(Vector *)(iVar8 + 0xc),
                     (Vector *)(iVar4 + 0x18),(QAngle *)&vec3_angle,0xff,0,0x80,100,1000.0);
        }
        local_16c = local_16c + 1;
      } while (local_16c != 3);
      if (local_39 == '\0') {
LAB_008e57a6:
        if ((local_44 != 1.0) &&
           (cVar3 = IsAbleToGrabEntity(local_24), pCVar2 = local_24, cVar3 != '\0')) {
          local_124 = local_58;
          local_120 = local_54;
          local_11c = local_50;
          local_118 = local_64;
          local_114 = local_60;
          local_110 = local_5c;
          if (local_24 != (CBaseEntity *)0x0) {
            if (*(int *)(ZombieDebugLedges._28_4_ + 0x30) != 0) {
              NDebugOverlay::Cross3D
                        ((Vector *)(*(int *)(this + 0x810) + 0x289c),10.0,0,0xff,0,true,1000.0);
              NDebugOverlay::Cross3D((Vector *)&local_64,16.0,0xff,0,0,true,1000.0);
            }
            local_140 = local_110;
            local_134 = local_110 + 64.0;
            pVVar9 = (Vector *)(iVar5 + 0x24);
            local_13c = local_118;
            local_138 = local_114;
            local_148 = local_118;
            local_144 = local_114;
            pVVar10 = (Vector *)(iVar6 + 0x30);
            uVar11 = (**(code **)(*(int *)this + 0x40))(this,0,0);
            iVar4 = (**(code **)(*g_pGameRules + 0x7c))(g_pGameRules);
            iVar5 = (**(code **)(*g_pGameRules + 0x7c))(g_pGameRules);
            CGameMovement::GameMovementTraceHull
                      ((CGameMovement *)this,(Vector *)&local_148,(Vector *)&local_13c,
                       (Vector *)(iVar5 + 0x24),(Vector *)(iVar4 + 0x30),uVar11,
                       (ITraceFilter *)local_dc,(CGameTrace *)&local_70);
            if (*(int *)(ZombieDebugLedges._28_4_ + 0x30) != 0) {
              NDebugOverlay::SweptBox
                        ((Vector *)&local_70,(Vector *)&local_64,pVVar9,pVVar10,
                         (QAngle *)&vec3_angle,0xff,0,0,100,1000.0);
            }
            if (local_44 != 1.0) {
              local_148 = *(float *)(*(int *)(this + 8) + 0x9c);
              local_144 = *(float *)(*(int *)(this + 8) + 0xa0);
              local_13c = local_148;
              local_138 = local_144;
              uVar11 = (**(code **)(*(int *)this + 0x40))(this,0,0);
              iVar4 = (**(code **)(*g_pGameRules + 0x7c))(g_pGameRules);
              iVar5 = (**(code **)(*g_pGameRules + 0x7c))(g_pGameRules);
              CGameMovement::GameMovementTraceHull
                        ((CGameMovement *)this,(Vector *)&local_148,(Vector *)&local_13c,
                         (Vector *)(iVar5 + 0x24),(Vector *)(iVar4 + 0x30),uVar11,
                         (ITraceFilter *)local_dc,(CGameTrace *)&local_70);
              if ((local_39 != '\0') || (local_44 != 1.0)) {
                if (*(int *)(ZombieDebugLedges._28_4_ + 0x30) == 0) {
                  return 0;
                }
                NDebugOverlay::SweptBox
                          ((Vector *)&local_70,(Vector *)&local_64,pVVar9,pVVar10,
                           (QAngle *)&vec3_angle,0xff,0,0,100,1000.0);
                return 0;
              }
            }
            local_144 = local_60;
            local_148 = local_64;
            local_140 = local_5c;
            local_138 = local_60 - local_150 * 32.0;
            local_134 = local_5c - local_14c * 32.0;
            local_13c = local_64 - local_154 * 32.0;
            uVar11 = (**(code **)(*(int *)this + 0x40))(this,0,0);
            iVar4 = (**(code **)(*g_pGameRules + 0x7c))(g_pGameRules);
            iVar5 = (**(code **)(*g_pGameRules + 0x7c))(g_pGameRules);
            CGameMovement::GameMovementTraceHull
                      ((CGameMovement *)this,(Vector *)&local_148,(Vector *)&local_13c,
                       (Vector *)(iVar5 + 0x24),(Vector *)(iVar4 + 0x30),uVar11,
                       (ITraceFilter *)local_dc,(CGameTrace *)&local_70);
            if (*(int *)(ZombieDebugLedges._28_4_ + 0x30) != 0) {
              NDebugOverlay::SweptBox
                        ((Vector *)&local_70,(Vector *)&local_64,pVVar9,pVVar10,
                         (QAngle *)&vec3_angle,0,0xff,0x80,100,1000.0);
              NDebugOverlay::SweptBox
                        ((Vector *)&local_148,(Vector *)&local_13c,pVVar9,pVVar10,
                         (QAngle *)&vec3_angle,0xff,0x7f,0,0,100.0);
            }
            if ((local_39 == '\0') && (0.1 <= local_44)) {
              local_140 = local_5c;
              local_134 = local_5c - 65.0;
              local_13c = local_64;
              local_138 = local_60;
              local_148 = local_64;
              local_144 = local_60;
              uVar11 = (**(code **)(*(int *)this + 0x40))(this,0,0);
              iVar4 = (**(code **)(*g_pGameRules + 0x7c))(g_pGameRules);
              iVar5 = (**(code **)(*g_pGameRules + 0x7c))(g_pGameRules);
              CGameMovement::GameMovementTraceHull
                        ((CGameMovement *)this,(Vector *)&local_148,(Vector *)&local_13c,
                         (Vector *)(iVar5 + 0x24),(Vector *)(iVar4 + 0x30),uVar11,
                         (ITraceFilter *)local_dc,(CGameTrace *)&local_70);
              if ((local_39 == '\0') &&
                 (((local_44 != 1.0 && (0.7 <= local_50)) &&
                  (cVar3 = IsAbleToGrabEntity(local_24), cVar3 != '\0')))) {
                local_10c = local_64;
                local_108 = local_60;
                local_104 = local_5c;
                iVar4 = (**(code **)(*g_pGameRules + 0x7c))(g_pGameRules);
                local_100 = 0xc1000000;
                local_fc = 0xc1000000;
                local_f8 = 0;
                local_110 = local_5c - *(float *)(iVar4 + 0x20);
                local_148 = local_118;
                local_144 = local_114;
                local_140 = local_104;
                local_134 = local_104 - 60.0;
                local_13c = local_118;
                local_138 = local_114;
                local_f4 = 0x41000000;
                local_f0 = 0x41000000;
                local_ec = 0x3f800000;
                uVar11 = (**(code **)(*(int *)this + 0x40))(this,0,0);
                CGameMovement::GameMovementTraceHull
                          ((CGameMovement *)this,(Vector *)&local_148,(Vector *)&local_13c,
                           (Vector *)&local_100,(Vector *)&local_f4,uVar11,(ITraceFilter *)local_dc,
                           (CGameTrace *)&local_70);
                if (local_39 == '\0') {
                  if ((1.0 <= local_44) || (local_50 < 0.7)) {
                    if (*(int *)(ZombieDebugLedges._28_4_ + 0x30) != 0) {
                      NDebugOverlay::SweptBox
                                ((Vector *)&local_148,(Vector *)&local_13c,(Vector *)&local_100,
                                 (Vector *)&local_f4,(QAngle *)&vec3_angle,0,0xff,0,10,1000.0);
                    }
                    pTVar12 = (TerrorNavArea *)
                              CNavMesh::GetNearestNavArea
                                        (TheNavMesh,(Vector *)&local_118,true,120.0,false,false,
                                         false);
                    if ((pTVar12 != (TerrorNavArea *)0x0) &&
                       (0.0 < *(float *)(pTVar12 + 0x158) || *(float *)(pTVar12 + 0x158) == 0.0)) {
                      if (*(int *)(ZombieDebugLedges._28_4_ + 0x30) != 0) {
                        NDebugOverlay::HorzArrow
                                  ((Vector *)&local_118,(Vector *)(pTVar12 + 0x2c),5.0,0xff,0,0,0xff
                                   ,true,30.0);
                        DevMsg("nearby area is %d\n",*(undefined4 *)(pTVar12 + 0x8c));
                      }
                      pfVar13 = &local_118;
                      pVVar9 = local_e8;
                      for (iVar4 = 3; iVar4 != 0; iVar4 = iVar4 + -1) {
                        *(float *)pVVar9 = *pfVar13;
                        pfVar13 = pfVar13 + (uint)bVar14 * -2 + 1;
                        pVVar9 = pVVar9 + ((uint)bVar14 * -2 + 1) * 4;
                      }
                      VectorAngles((Vector *)&local_124,local_168);
                      for (; 90.0 < local_c8; local_c8 = local_c8 - 90.0) {
                      }
                      sincosf(local_c8 * 0.017453292,local_160,&local_164);
                      fVar15 = (float)(~-(uint)(local_160[0] < local_164) &
                                       (uint)(1.0 - local_160[0]) |
                                      (uint)(1.0 - local_164) & -(uint)(local_160[0] < local_164));
                      iVar4 = *(int *)(*(CTerrorPlayer **)(this + 0x810) + 0x2ba0);
                      local_118 = (local_10c - local_118) * fVar15 + local_118;
                      local_114 = (local_108 - local_114) * fVar15 + local_114;
                      if (iVar4 == 1) {
                        local_110 = local_110 + 8.0;
                      }
                      else if (iVar4 == 3) {
                        local_110 = local_110 + 3.0;
                      }
                      CTerrorPlayer::SetGrabTarget
                                (*(CTerrorPlayer **)(this + 0x810),(Vector *)&local_118,
                                 (Vector *)&local_10c,local_e8,(Vector *)&local_124,
                                 (Vector *)&local_130,pCVar2,pTVar12);
                      return 2;
                    }
                    if (*(int *)(ZombieDebugLedges._28_4_ + 0x30) != 0) {
                      NDebugOverlay::Sphere((Vector *)&local_118,120.0,0xff,0,0,true,1000.0);
                      NDebugOverlay::Cross((Vector *)&local_118,120.0,0xff,0,0x80,true,1000.0);
                    }
                  }
                  else if (*(int *)(ZombieDebugLedges._28_4_ + 0x30) != 0) {
                    NDebugOverlay::SweptBox
                              ((Vector *)&local_148,(Vector *)&local_13c,(Vector *)&local_100,
                               (Vector *)&local_f4,(QAngle *)&vec3_angle,0xff,0,0,10,1000.0);
                    return 0;
                  }
                }
                else if (*(int *)(ZombieDebugLedges._28_4_ + 0x30) != 0) {
                  NDebugOverlay::Box((Vector *)&local_148,(Vector *)&local_100,(Vector *)&local_f4,
                                     0xff,0,0,10,1000.0);
                  return 0;
                }
              }
            }
          }
        }
      }
    }
  }
  else if (*(int *)(ZombieDebugLedges._28_4_ + 0x30) != 0) {
    NDebugOverlay::HorzArrow
              ((Vector *)&local_148,(Vector *)&local_13c,2.0,0xff,0,0,0x14,true,1000.0);
    return 0;
  }
  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)