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 intoaddons/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.
Signatures + Functions block. The plugin uses
DHookCreateFromConf - DHooks reads return type, this-type,
calling convention, and argument types straight from the gamedata. Less
boilerplate in the plugin, types travel with the gamedata.
Gamedata KeyValues
DHooks plugin example
Type inference is best-effort from the C signature - sanity-check the DHooks types before shipping.