L L4D2node

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 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)