L L4D2node

FindNearbySpawnSpot

0x008f68b0 · 3384 bytes · __cdecl

_Z19FindNearbySpawnSpotP13CTerrorPlayerP6Vectoribf

Decompiled

undefined (5 params)

/* FindNearbySpawnSpot(CTerrorPlayer*, Vector*, int, bool, float) */

undefined4
FindNearbySpawnSpot(CTerrorPlayer *param_1,Vector *param_2,int param_3,bool param_4,float param_5)

{
  float *pfVar1;
  int *piVar2;
  float fVar3;
  CNavArea *this;
  CNavMesh *pCVar4;
  char cVar5;
  bool bVar6;
  CNavArea *pCVar7;
  int iVar8;
  float *pfVar9;
  char *pcVar10;
  int iVar11;
  int iVar12;
  undefined4 uVar13;
  float *pfVar14;
  int in_GS_OFFSET;
  float fVar15;
  float fVar16;
  float fVar17;
  float fVar18;
  float fVar19;
  float fVar20;
  CNavArea *pCVar21;
  int local_42c;
  int local_428;
  CUtlMemory<CNavArea*,int> *local_41c;
  int local_418;
  int local_410;
  int local_400;
  CNavArea *local_3ec;
  undefined4 local_3e8;
  undefined4 local_3e4;
  undefined4 local_3e0;
  CTraceFilterSimple local_3dc [16];
  CTraceFilterSimple local_3cc [16];
  int local_3bc;
  int local_3b8;
  undefined4 local_3b4;
  undefined4 local_3b0;
  int local_3ac;
  int local_3a8;
  float local_3a4;
  float local_3a0;
  float local_39c;
  float local_398;
  float local_394;
  float local_390;
  float local_38c;
  float local_388;
  float local_384;
  undefined4 local_37c;
  undefined4 local_378;
  undefined4 local_374;
  float local_36c;
  float local_368;
  float local_364;
  float local_35c;
  float local_358;
  float local_354;
  undefined4 local_34c;
  undefined1 local_348;
  undefined1 local_347;
  float local_33c;
  float local_338;
  float local_334;
  undefined4 local_32c;
  undefined4 local_328;
  undefined4 local_324;
  float local_31c;
  float local_318;
  float local_314;
  float local_30c;
  float local_308;
  float local_304;
  undefined4 local_2fc;
  undefined1 local_2f8;
  undefined1 local_2f7;
  Vector local_2e0 [12];
  Vector local_2d4 [32];
  float local_2b4;
  char local_2a9;
  Vector local_28c [12];
  Vector local_280 [32];
  float local_260;
  char local_255;
  CFmtStrN<256> local_238 [5];
  undefined1 local_233 [263];
  CFmtStrN<256> local_12c [5];
  undefined1 local_127 [263];
  int local_20;
  
  pCVar4 = TheNavMesh;
  local_3b8 = 0;
  local_3b4 = 0;
  local_3b0 = 0;
  local_3ac = 0;
  local_3a8 = 0;
  fVar20 = *(float *)param_2;
  fVar17 = *(float *)(param_2 + 4);
  fVar3 = *(float *)(param_2 + 8);
  local_20 = *(int *)(in_GS_OFFSET + 0x14);
  local_3bc = param_3;
  if (*(int *)(TheNavMesh + 0x18) != 0) {
    if ((CNavMesh::
         ForAllAreasOverlappingExtent<CollectRespawnAreas>(CollectRespawnAreas&,Extent_const&)::
         searchMarker == '\0') &&
       (iVar11 = __cxa_guard_acquire(&CNavMesh::
                                      ForAllAreasOverlappingExtent<CollectRespawnAreas>(CollectRespawnAreas&,Extent_const&)
                                      ::searchMarker), iVar11 != 0)) {
                    /* try { // try from 008f758c to 008f7590 has its CatchHandler @ 008f760b */
      CNavMesh::
      ForAllAreasOverlappingExtent<CollectRespawnAreas>(CollectRespawnAreas&,Extent_const&)::
      searchMarker = RandomInt(0,0x100000);
      __cxa_guard_release(&CNavMesh::
                           ForAllAreasOverlappingExtent<CollectRespawnAreas>(CollectRespawnAreas&,Extent_const&)
                           ::searchMarker);
    }
    iVar11 = CNavMesh::
             ForAllAreasOverlappingExtent<CollectRespawnAreas>(CollectRespawnAreas&,Extent_const&)::
             searchMarker + 1;
    if (CNavMesh::
        ForAllAreasOverlappingExtent<CollectRespawnAreas>(CollectRespawnAreas&,Extent_const&)::
        searchMarker + 1 == 0) {
      iVar11 = CNavMesh::
               ForAllAreasOverlappingExtent<CollectRespawnAreas>(CollectRespawnAreas&,Extent_const&)
               ::searchMarker + 2;
    }
    CNavMesh::ForAllAreasOverlappingExtent<CollectRespawnAreas>(CollectRespawnAreas&,Extent_const&)
    ::searchMarker = iVar11;
    fVar19 = fVar20 - param_5;
    fVar15 = 1.0 / *(float *)(pCVar4 + 0x20);
    iVar11 = (int)((fVar19 - *(float *)(pCVar4 + 0x2c)) * fVar15);
    if (iVar11 < 0) {
      local_410 = 0;
    }
    else {
      local_410 = *(int *)(pCVar4 + 0x24) + -1;
      if (iVar11 < *(int *)(pCVar4 + 0x24)) {
        local_410 = iVar11;
      }
    }
    fVar20 = fVar20 + param_5;
    iVar11 = (int)((fVar20 - *(float *)(pCVar4 + 0x2c)) * fVar15);
    if (iVar11 < 0) {
      local_428 = 0;
    }
    else {
      local_428 = *(int *)(pCVar4 + 0x24) + -1;
      if (iVar11 < *(int *)(pCVar4 + 0x24)) {
        local_428 = iVar11;
      }
    }
    fVar18 = fVar17 - param_5;
    iVar11 = (int)((fVar18 - *(float *)(pCVar4 + 0x30)) * fVar15);
    if (iVar11 < 0) {
      local_42c = 0;
    }
    else {
      local_42c = *(int *)(pCVar4 + 0x28) + -1;
      if (iVar11 < *(int *)(pCVar4 + 0x28)) {
        local_42c = iVar11;
      }
    }
    fVar17 = fVar17 + param_5;
    iVar11 = (int)((fVar17 - *(float *)(pCVar4 + 0x30)) * fVar15);
    if (iVar11 < 0) {
      local_418 = 0;
    }
    else {
      local_418 = *(int *)(pCVar4 + 0x28) + -1;
      if (iVar11 < *(int *)(pCVar4 + 0x28)) {
        local_418 = iVar11;
      }
    }
    if (local_410 <= local_428) {
      do {
        if (local_42c <= local_418) {
          iVar11 = local_42c * *(int *)(pCVar4 + 0x24) + local_410;
          if (*(int *)(pCVar4 + 0x18) <= iVar11) {
LAB_008f6be4:
            if (CNavMesh::
                ForAllAreasOverlappingExtent<CollectRespawnAreas>(CollectRespawnAreas&,Extent_const&)
                ::__executeCount < 10) {
              CNavMesh::
              ForAllAreasOverlappingExtent<CollectRespawnAreas>(CollectRespawnAreas&,Extent_const&)
              ::__executeCount =
                   CNavMesh::
                   ForAllAreasOverlappingExtent<CollectRespawnAreas>(CollectRespawnAreas&,Extent_const&)
                   ::__executeCount + 1;
              Warning("** Walked off of the CNavMesh::m_grid in ForAllAreasOverlappingExtent()\n");
            }
            break;
          }
          local_400 = local_42c;
          while( true ) {
            iVar12 = 0;
            piVar2 = (int *)(*(int *)(pCVar4 + 0xc) + iVar11 * 0x14);
            if (0 < piVar2[3]) {
              do {
                pCVar7 = *(CNavArea **)(*piVar2 + iVar12 * 4);
                if (*(int *)(pCVar7 + 0x74) !=
                    CNavMesh::
                    ForAllAreasOverlappingExtent<CollectRespawnAreas>(CollectRespawnAreas&,Extent_const&)
                    ::searchMarker) {
                  *(int *)(pCVar7 + 0x74) =
                       CNavMesh::
                       ForAllAreasOverlappingExtent<CollectRespawnAreas>(CollectRespawnAreas&,Extent_const&)
                       ::searchMarker;
                    /* try { // try from 008f6b33 to 008f7532 has its CatchHandler @ 008f765e */
                  CNavArea::GetExtent(pCVar7,(Extent *)&local_3a4);
                  if (((((fVar19 <= local_398) && (local_3a4 <= fVar20)) && (fVar18 <= local_394))
                      && ((local_3a0 <= fVar17 && (fVar3 - param_5 <= local_390)))) &&
                     (local_39c <= fVar3 + param_5)) {
                    if (((byte)pCVar7[300] & 4) != 0) goto LAB_008f6c23;
                    cVar5 = IsASurvivorTeam(local_3bc);
                    if (((cVar5 == '\0') || (((byte)pCVar7[0x12d] & 8) != 0)) &&
                       ((local_3bc != 3 || (((byte)pCVar7[0x12d] & 8) == 0)))) {
                      local_3ec = pCVar7;
                      CUtlVector<CNavArea*,CUtlMemory<CNavArea*,int>>::InsertBefore
                                ((CUtlVector<CNavArea*,CUtlMemory<CNavArea*,int>> *)&local_3b8,
                                 local_3ac,&local_3ec);
                    }
                  }
                }
                iVar12 = iVar12 + 1;
              } while (iVar12 < piVar2[3]);
            }
            local_400 = local_400 + 1;
            if (local_418 < local_400) break;
            iVar11 = local_400 * *(int *)(pCVar4 + 0x24) + local_410;
            if (*(int *)(pCVar4 + 0x18) <= iVar11) goto LAB_008f6be4;
          }
        }
        local_410 = local_410 + 1;
      } while (local_410 <= local_428);
    }
  }
LAB_008f6c23:
  local_41c = (CUtlMemory<CNavArea*,int> *)&local_3b8;
  pCVar7 = (CNavArea *)
           CNavMesh::GetNearestNavArea(TheNavMesh,param_2,false,10000.0,false,true,false);
  fVar20 = *(float *)param_2;
  fVar17 = *(float *)(param_2 + 4);
  fVar3 = *(float *)(param_2 + 8);
  if (local_3ac != 0) {
    iVar11 = 100;
    do {
      iVar12 = RandomInt(0,local_3ac + -1);
      this = *(CNavArea **)(local_3b8 + iVar12 * 4);
      if (((param_3 != 3) ||
          (((param_1 != (CTerrorPlayer *)0x0 &&
            (cVar5 = (**(code **)(*(int *)param_1 + 0x558))(param_1), cVar5 != '\0')) ||
           (this[0x7d] == (CNavArea)0x0)))) &&
         ((cVar5 = CNavArea::IsBlocked(this,param_3,false), cVar5 == '\0' &&
          (*(int *)(this + 0x70) < *(int *)(gpGlobals + 0x18))))) {
        if ((pCVar7 == (CNavArea *)0x0) || (pCVar7 == this)) {
LAB_008f6ef0:
          if (0.0 < param_5) goto LAB_008f6f01;
        }
        else {
          bVar6 = NavAreaBuildPath<ShortestPathCost>
                            (pCVar7,this,(Vector *)0x0,(Vector *)0x0,(ShortestPathCost *)&local_3a4,
                             (CNavArea **)0x0,0.0,-1,false);
          fVar15 = -1.0;
          if (bVar6) {
            iVar12 = *(int *)(this + 0x78);
            if (iVar12 == 0) goto LAB_008f6ef0;
            fVar15 = 0.0;
            fVar19 = *(float *)(this + 0x30);
            fVar18 = *(float *)(this + 0x2c);
            fVar16 = *(float *)(this + 0x34);
            do {
              pfVar14 = (float *)(iVar12 + 0x2c);
              pfVar9 = (float *)(iVar12 + 0x30);
              fVar18 = fVar18 - *pfVar14;
              pfVar1 = (float *)(iVar12 + 0x34);
              fVar19 = fVar19 - *pfVar9;
              iVar12 = *(int *)(iVar12 + 0x78);
              fVar16 = fVar16 - *pfVar1;
              fVar15 = fVar15 + SQRT(fVar19 * fVar19 + fVar18 * fVar18 + fVar16 * fVar16);
              fVar19 = *pfVar9;
              fVar18 = *pfVar14;
              fVar16 = *pfVar1;
            } while (iVar12 != 0);
          }
          if (fVar15 < param_5) {
LAB_008f6f01:
            pCVar21 = this;
            TerrorNavArea::FindRandomSpot();
            *(undefined4 *)param_2 = local_3e8;
            *(undefined4 *)(param_2 + 4) = local_3e4;
            *(undefined4 *)(param_2 + 8) = local_3e0;
            cVar5 = IsASurvivorTeam(param_3);
            iVar12 = (-(uint)(cVar5 == '\0') & 0x10000) + 0x201420b;
            if (param_4) {
              iVar8 = (**(code **)(*g_pGameRules + 0x7c))();
              pfVar14 = (float *)(iVar8 + 0x30);
              iVar8 = (**(code **)(*g_pGameRules + 0x7c))(g_pGameRules);
              pfVar9 = (float *)(iVar8 + 0x24);
            }
            else {
              iVar8 = (**(code **)(*g_pGameRules + 0x7c))(g_pGameRules,pCVar21);
              pfVar14 = (float *)(iVar8 + 0x18);
              iVar8 = (**(code **)(*g_pGameRules + 0x7c))(g_pGameRules);
              pfVar9 = (float *)(iVar8 + 0xc);
            }
            local_37c = 0;
            local_378 = 0;
            local_374 = 0;
            local_34c = 0;
            local_347 = 0;
            local_35c = (*pfVar14 - *pfVar9) * 0.5;
            local_358 = (pfVar14[1] - pfVar9[1]) * 0.5;
            local_354 = (pfVar14[2] - pfVar9[2]) * 0.5;
            local_348 = local_358 * local_358 + local_35c * local_35c + local_354 * local_354 <
                        1e-06;
            local_36c = (*pfVar14 + *pfVar9) * 0.5;
            local_38c = *(float *)param_2 + local_36c;
            local_368 = (pfVar14[1] + pfVar9[1]) * 0.5;
            local_388 = *(float *)(param_2 + 4) + local_368;
            local_364 = (pfVar14[2] + pfVar9[2]) * 0.5;
            local_36c = -local_36c;
            local_368 = -local_368;
            local_384 = *(float *)(param_2 + 8) + local_364;
            local_364 = -local_364;
            CTraceFilterSimple::CTraceFilterSimple
                      (local_3dc,(IHandleEntity *)0x0,8,(_func_bool_IHandleEntity_ptr_int *)0x0);
            (**(code **)(*enginetrace + 0x14))(enginetrace,&local_38c,iVar12,local_3dc,local_2e0);
            if (*(int *)(r_visualizetraces._28_4_ + 0x30) != 0) {
              DebugDrawLine(local_2e0,local_2d4,0xff,0xff,0,true,-1.0);
            }
            if ((local_2a9 == '\0') && (1.0 <= local_2b4)) {
              if (param_4) {
                iVar8 = (**(code **)(*g_pGameRules + 0x7c))();
                pfVar14 = (float *)(iVar8 + 0x30);
                iVar8 = (**(code **)(*g_pGameRules + 0x7c))(g_pGameRules);
                pfVar9 = (float *)(iVar8 + 0x24);
              }
              else {
                iVar8 = (**(code **)(*g_pGameRules + 0x7c))(g_pGameRules);
                pfVar14 = (float *)(iVar8 + 0x18);
                iVar8 = (**(code **)(*g_pGameRules + 0x7c))(g_pGameRules);
                pfVar9 = (float *)(iVar8 + 0xc);
              }
              local_32c = 0;
              local_328 = 0;
              local_324 = 0xc3000000;
              local_2fc = 0;
              local_2f7 = 1;
              local_30c = (*pfVar14 - *pfVar9) * 0.5;
              local_308 = (pfVar14[1] - pfVar9[1]) * 0.5;
              local_304 = (pfVar14[2] - pfVar9[2]) * 0.5;
              local_2f8 = local_308 * local_308 + local_30c * local_30c + local_304 * local_304 <
                          1e-06;
              local_31c = (*pfVar14 + *pfVar9) * 0.5;
              local_33c = *(float *)param_2 + local_31c;
              local_318 = (pfVar14[1] + pfVar9[1]) * 0.5;
              local_338 = *(float *)(param_2 + 4) + local_318;
              local_314 = (pfVar14[2] + pfVar9[2]) * 0.5;
              local_31c = -local_31c;
              local_318 = -local_318;
              local_334 = *(float *)(param_2 + 8) + local_314;
              local_314 = -local_314;
              CTraceFilterSimple::CTraceFilterSimple
                        (local_3cc,(IHandleEntity *)0x0,8,(_func_bool_IHandleEntity_ptr_int *)0x0);
              (**(code **)(*enginetrace + 0x14))(enginetrace,&local_33c,iVar12,local_3cc,local_28c);
              if (*(int *)(r_visualizetraces._28_4_ + 0x30) != 0) {
                DebugDrawLine(local_28c,local_280,0xff,0xff,0,true,-1.0);
              }
              if ((local_255 == '\0') && (local_260 < 1.0)) {
                uVar13 = *(undefined4 *)(this + 0x8c);
                CFmtStrN<256>::CFmtStrN
                          (local_12c,"(%f, %f, %f)",(double)*(float *)param_2,
                           SUB84((double)*(float *)(param_2 + 4),0),
                           (int)((ulonglong)(double)*(float *)(param_2 + 4) >> 0x20),
                           SUB84((double)*(float *)(param_2 + 8),0),
                           (int)((ulonglong)(double)*(float *)(param_2 + 8) >> 0x20));
                CFmtStrN<256>::CFmtStrN
                          (local_238,"(%f, %f, %f)",(double)fVar20,SUB84((double)fVar17,0),
                           (int)((ulonglong)(double)fVar17 >> 0x20),SUB84((double)fVar3,0),
                           (int)((ulonglong)(double)fVar3 >> 0x20));
                if (param_1 == (CTerrorPlayer *)0x0) {
                  pcVar10 = "BOT";
                }
                else {
                  pcVar10 = (char *)(**(code **)(*(int *)param_1 + 0xb8))(param_1);
                }
                UTIL_LogPrintf("FindNearbySpawnSpot: Moving %s from %s to %s in a nearby nav area (%d) with max range of %f\n"
                               ,pcVar10,local_233,local_127,uVar13,SUB84((double)param_5,0),
                               (int)((ulonglong)(double)param_5 >> 0x20));
                uVar13 = 1;
                goto LAB_008f6e4a;
              }
            }
          }
        }
      }
      if (iVar11 == 1) break;
      iVar11 = iVar11 + -1;
    } while( true );
  }
  uVar13 = 0;
LAB_008f6e4a:
  local_3ac = 0;
  CUtlMemory<CNavArea*,int>::Purge(local_41c);
  local_3a8 = local_3b8;
  CUtlMemory<CNavArea*,int>::Purge(local_41c);
  if (local_20 != *(int *)(in_GS_OFFSET + 0x14)) {
                    /* WARNING: Subroutine does not return */
    __stack_chk_fail();
  }
  return uVar13;
}

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)