CDirectorVersusMode::UpdateVersusBossSpawning
0x008c4ca0 · 1782 bytes · __thiscall
_ZN19CDirectorVersusMode24UpdateVersusBossSpawningEv
Decompiled
undefined (1 param)
/* CDirectorVersusMode::UpdateVersusBossSpawning() */
void __thiscall CDirectorVersusMode::UpdateVersusBossSpawning(CDirectorVersusMode *this)
{
uint uVar1;
char cVar2;
int iVar3;
int iVar4;
CEscapeRoute *pCVar5;
TerrorNavArea *pTVar6;
CBaseEntity *pCVar7;
longdouble lVar8;
float fVar9;
float fVar10;
double dVar11;
double dVar12;
float fVar13;
undefined4 local_4c;
undefined4 local_48;
undefined4 local_44;
undefined4 local_40;
float local_3c;
float local_38;
float local_34 [9];
cVar2 = CDirector::AreBossesProhibited(TheDirector);
if (cVar2 != '\0') {
return;
}
iVar3 = CTerrorGameRules::GetVersusTeamFor(g_pGameRules,2);
uVar1 = iVar3 - 1;
if (1 < uVar1) {
return;
}
iVar4 = CDirector::GetScriptValue(TheDirector,"DisallowThreatType",9);
if (iVar4 == 8) {
this[iVar3 + 0x37] = (CDirectorVersusMode)0x0;
}
else {
if (iVar4 == 7) {
this[iVar3 + 0x39] = (CDirectorVersusMode)0x0;
}
if (this[iVar3 + 0x37] != (CDirectorVersusMode)0x0) goto LAB_008c4d2c;
}
if (this[iVar3 + 0x39] == (CDirectorVersusMode)0x0) {
return;
}
LAB_008c4d2c:
cVar2 = CDirector::HasAnySurvivorLeftSafeArea(TheDirector);
if (cVar2 == '\0') {
return;
}
if (*(float *)(TheNavMesh + 0x5f4) <= 0.0) {
return;
}
if (**(int **)(TheDirector + 0x638) != 5) {
return;
}
cVar2 = CDirector::IsInTransition(TheDirector);
if (cVar2 != '\0') {
return;
}
if (0.0 < *(float *)(TheDirector + 0x270)) {
return;
}
if (*(char *)(*(int *)(TheDirector + 0x634) + 0x28) != '\0') {
return;
}
if (0 < *(int *)(TheDirector + 0x1c0)) {
return;
}
local_34[0] = -9999.0;
local_34[1] = 2.8026e-45;
local_34[2] = 0.0;
local_34[3] = 0.0;
local_34[4] = 0.0;
local_34[5] = 0.0;
ForEachTerrorPlayer<HighestFlowDistance>((HighestFlowDistance *)local_34);
fVar13 = local_34[0] / *(float *)(TheNavMesh + 0x5f4);
if (*(int *)(versus_boss_debug._28_4_ + 0x30) != 0) {
if (this[iVar3 + 0x39] == (CDirectorVersusMode)0x0) {
dVar12 = -1.0;
}
else {
dVar12 = (double)*(float *)(this + uVar1 * 4 + 0x30);
}
if (this[iVar3 + 0x37] == (CDirectorVersusMode)0x0) {
dVar11 = -1.0;
}
else {
dVar11 = (double)*(float *)(this + uVar1 * 4 + 0x28);
}
Msg(" Highest survivor flow distance = %f Tank at = %f witch at %f\n",(double)fVar13,dVar11,
dVar12);
}
if (((this[iVar3 + 0x37] != (CDirectorVersusMode)0x0) &&
(*(float *)(this + uVar1 * 4 + 0x28) * *(float *)(TheNavMesh + 0x5f4) <=
*(float *)(versus_boss_buffer._28_4_ + 0x2c) + local_34[0])) &&
(iVar4 = TheEscapeRoute(), iVar4 != 0)) {
fVar9 = *(float *)(versus_boss_buffer._28_4_ + 0x2c) + local_34[0];
local_4c = vec3_origin;
local_48 = DAT_01053d4c;
local_44 = DAT_01053d50;
fVar10 = *(float *)(TheNavMesh + 0x5f4);
pCVar5 = (CEscapeRoute *)TheEscapeRoute();
CEscapeRoute::GetPositionOnPath(pCVar5,fVar9 / fVar10,(Vector *)&local_4c);
cVar2 = CZombieBorder::IsBehindZombieBorder((Vector *)&local_4c);
if (cVar2 != '\0') {
return;
}
iVar4 = CNavMesh::GetNavArea(TheNavMesh,(Vector *)&local_4c,120.0);
if (iVar4 == 0) {
pTVar6 = (TerrorNavArea *)0x0;
}
else {
pTVar6 = (TerrorNavArea *)__dynamic_cast(iVar4,&CNavArea::typeinfo,&TerrorNavArea::typeinfo,0)
;
}
iVar4 = CNavArea::m_masterMarker + 1;
CNavArea::m_masterMarker = 1;
if (iVar4 != 0) {
CNavArea::m_masterMarker = iVar4;
}
if (pTVar6 != (TerrorNavArea *)0x0) {
while (*(int *)(pTVar6 + 0x3c) != CNavArea::m_masterMarker) {
cVar2 = TerrorNavArea::IsValidForWanderingPopulation(pTVar6);
if ((cVar2 != '\0') && (pTVar6[0xa4] == (TerrorNavArea)0x0)) {
local_40 = *(undefined4 *)(pTVar6 + 0x2c);
local_3c = *(float *)(pTVar6 + 0x30);
local_38 = *(float *)(pTVar6 + 0x34) + 10.0;
/* try { // try from 008c52ad to 008c52b1 has its CatchHandler @ 008c53a6 */
cVar2 = ZombieManager::IsSpaceForZombieHere(TheZombieManager,(Vector *)&local_40);
if ((cVar2 != '\0') && (pTVar6[0x7d] == (TerrorNavArea)0x0)) {
lVar8 = (longdouble)RandomFloat(0,0x43b40000);
local_3c = (float)lVar8;
local_40 = 0;
local_38 = 0.0;
pCVar7 = (CBaseEntity *)
ZombieManager::SpawnTank(TheZombieManager,pTVar6,(QAngle *)&local_40,false);
if (pCVar7 != (CBaseEntity *)0x0) {
SearchSurroundingAreas<RemoveWanderersScan>
((CNavArea *)pTVar6,(Vector *)(pTVar6 + 0x2c),
(RemoveWanderersScan *)&local_40,
*(float *)(DirectorThreatClearRadius._28_4_ + 0x2c),0,-1);
CDirector::TryOfferingTankBot(TheDirector,pCVar7,true);
this[iVar3 + 0x37] = (CDirectorVersusMode)0x0;
}
break;
}
}
*(int *)(pTVar6 + 0x3c) = CNavArea::m_masterMarker;
pTVar6 = (TerrorNavArea *)TerrorNavArea::GetNextEscapeStep(pTVar6,(NavTraverseType *)0x0);
if (pTVar6 == (TerrorNavArea *)0x0) break;
}
}
if (this[iVar3 + 0x37] == (CDirectorVersusMode)0x0) {
return;
}
if (0.89 <= fVar13) {
fVar10 = 0.99;
}
else {
fVar10 = fVar13 + 0.1;
}
*(float *)(this + uVar1 * 4 + 0x28) = fVar10;
}
if (((this[iVar3 + 0x39] != (CDirectorVersusMode)0x0) &&
(*(float *)(this + uVar1 * 4 + 0x30) * *(float *)(TheNavMesh + 0x5f4) <=
*(float *)(versus_boss_buffer._28_4_ + 0x2c) + local_34[0])) &&
(iVar4 = TheEscapeRoute(), iVar4 != 0)) {
fVar9 = *(float *)(versus_boss_buffer._28_4_ + 0x2c) + local_34[0];
local_4c = vec3_origin;
local_48 = DAT_01053d4c;
local_44 = DAT_01053d50;
fVar10 = *(float *)(TheNavMesh + 0x5f4);
pCVar5 = (CEscapeRoute *)TheEscapeRoute();
CEscapeRoute::GetPositionOnPath(pCVar5,fVar9 / fVar10,(Vector *)&local_4c);
iVar4 = CNavMesh::GetNavArea(TheNavMesh,(Vector *)&local_4c,120.0);
if (iVar4 == 0) {
pTVar6 = (TerrorNavArea *)0x0;
}
else {
pTVar6 = (TerrorNavArea *)__dynamic_cast(iVar4,&CNavArea::typeinfo,&TerrorNavArea::typeinfo,0)
;
}
iVar4 = CNavArea::m_masterMarker + 1;
CNavArea::m_masterMarker = 1;
if (iVar4 != 0) {
CNavArea::m_masterMarker = iVar4;
}
if ((pTVar6 != (TerrorNavArea *)0x0) && (*(int *)(pTVar6 + 0x3c) != CNavArea::m_masterMarker)) {
do {
cVar2 = TerrorNavArea::IsValidForWanderingPopulation(pTVar6);
if ((cVar2 != '\0') && (pTVar6[0xa4] == (TerrorNavArea)0x0)) {
local_40 = *(undefined4 *)(pTVar6 + 0x2c);
local_3c = *(float *)(pTVar6 + 0x30);
local_38 = *(float *)(pTVar6 + 0x34) + 10.0;
/* try { // try from 008c5062 to 008c5066 has its CatchHandler @ 008c53b2 */
cVar2 = ZombieManager::IsSpaceForZombieHere(TheZombieManager,(Vector *)&local_40);
if ((cVar2 != '\0') && (pTVar6[0x7d] == (TerrorNavArea)0x0)) {
lVar8 = (longdouble)RandomFloat(0,0x43b40000);
local_3c = (float)lVar8;
local_40 = 0;
local_38 = 0.0;
/* try { // try from 008c50c0 to 008c50c4 has its CatchHandler @ 008c53ae */
iVar4 = ZombieManager::SpawnWitch(TheZombieManager,pTVar6,(QAngle *)&local_40,false);
if (iVar4 != 0) {
SearchSurroundingAreas<RemoveWanderersScan>
((CNavArea *)pTVar6,(Vector *)(pTVar6 + 0x2c),
(RemoveWanderersScan *)&local_40,
*(float *)(DirectorThreatClearRadius._28_4_ + 0x2c),0,-1);
this[iVar3 + 0x39] = (CDirectorVersusMode)0x0;
}
break;
}
}
*(int *)(pTVar6 + 0x3c) = CNavArea::m_masterMarker;
pTVar6 = (TerrorNavArea *)TerrorNavArea::GetNextEscapeStep(pTVar6,(NavTraverseType *)0x0);
if ((pTVar6 == (TerrorNavArea *)0x0) ||
(*(int *)(pTVar6 + 0x3c) == CNavArea::m_masterMarker)) break;
} while( true );
}
if (this[iVar3 + 0x39] != (CDirectorVersusMode)0x0) {
if (0.89 <= fVar13) {
fVar13 = 0.99;
}
else {
fVar13 = fVar13 + 0.1;
}
*(float *)(this + uVar1 * 4 + 0x30) = fVar13;
}
}
return;
}
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.