本文整理汇总了C++中CUtlVector::PurgeAndDeleteElements方法的典型用法代码示例。如果您正苦于以下问题:C++ CUtlVector::PurgeAndDeleteElements方法的具体用法?C++ CUtlVector::PurgeAndDeleteElements怎么用?C++ CUtlVector::PurgeAndDeleteElements使用的例子?那么, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类CUtlVector
的用法示例。
在下文中一共展示了CUtlVector::PurgeAndDeleteElements方法的13个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: Init
//-----------------------------------------------------------------------------
// CMaterialFileChangeWatcher implementation.
//-----------------------------------------------------------------------------
void CMaterialFileChangeWatcher::Init( CTextureSystem *pSystem, int context )
{
m_pTextureSystem = pSystem;
m_Context = context;
m_Watcher.Init( this );
char searchPaths[1024 * 16];
if ( g_pFullFileSystem->GetSearchPath( "GAME", false, searchPaths, sizeof( searchPaths ) ) > 0 )
{
CUtlVector<char*> searchPathList;
V_SplitString( searchPaths, ";", searchPathList );
for ( int i=0; i < searchPathList.Count(); i++ )
{
m_Watcher.AddDirectory( searchPathList[i], "materials", true );
}
searchPathList.PurgeAndDeleteElements();
}
else
{
Warning( "Error in GetSearchPath. Dynamic material list updating will not be available." );
}
}
示例2: SetAwardsInEvent
void CGEStats::SetAwardsInEvent( IGameEvent *pEvent )
{
// Ignore awards when only 1 person is playing
if ( GEMPRules()->GetNumActivePlayers() < 2 )
return;
CUtlVector<GEStatSort*> vAwards;
GEStatSort *award;
int i;
// Prevent divide by zero
if ( m_iRoundCount == 0 )
m_iRoundCount = 1;
for ( i=0; i < GE_AWARD_GIVEMAX; i++ )
{
// Check for valid award
if ( AwardIDToIdent(i) )
{
award = new GEStatSort;
// See if we are going to give this one out, if so store it, if not erase the dummy var
if ( GetAwardWinner(i, *award) )
vAwards.AddToTail( award );
else
delete award;
}
}
// Sort our ratios from High to Low
vAwards.Sort( &CGEStats::StatSortHigh );
char eventid[16], eventwinner[16];
CBaseEntity *pPlayer;
for ( i=0; i < vAwards.Count(); i++ )
{
// Never give out more than 6 awards
if ( i == 6 )
break;
pPlayer = m_pPlayerStats[ vAwards[i]->idx ]->GetPlayer();
if ( !pPlayer )
continue;
Q_snprintf( eventid, 16, "award%i_id", i+1 );
Q_snprintf( eventwinner, 16, "award%i_winner", i+1 );
pEvent->SetInt( eventid, vAwards[i]->m_iAward );
pEvent->SetInt( eventwinner, pPlayer->entindex() );
}
vAwards.PurgeAndDeleteElements();
}
示例3: PostShutdown
//-----------------------------------------------------------------------------
// Pre-init
//-----------------------------------------------------------------------------
void CVConfigApp::PostShutdown()
{
// Stop our message window
ShutdownMessageWindow();
// Clear our configs
g_Configs.PurgeAndDeleteElements();
// Stop file notifications
UpdateConfigsStatus_Shutdown();
BaseClass::PostShutdown();
}
示例4: PlayGameStartupSound
//-----------------------------------------------------------------------------
// Purpose: Searches for GameStartup*.mp3 files in the sound/ui folder and plays one
//-----------------------------------------------------------------------------
void CGameUI::PlayGameStartupSound()
{
#if defined( LEFT4DEAD )
// L4D not using this path, L4D UI now handling with background menu movies
return;
#endif
if ( IsX360() )
return;
if ( CommandLine()->FindParm( "-nostartupsound" ) )
return;
FileFindHandle_t fh;
CUtlVector<char *> fileNames;
char path[ 512 ];
Q_snprintf( path, sizeof( path ), "sound/ui/gamestartup*.mp3" );
Q_FixSlashes( path );
char const *fn = g_pFullFileSystem->FindFirstEx( path, "MOD", &fh );
if ( fn )
{
do
{
char ext[ 10 ];
Q_ExtractFileExtension( fn, ext, sizeof( ext ) );
if ( !Q_stricmp( ext, "mp3" ) )
{
char temp[ 512 ];
Q_snprintf( temp, sizeof( temp ), "ui/%s", fn );
char *found = new char[ strlen( temp ) + 1 ];
Q_strncpy( found, temp, strlen( temp ) + 1 );
Q_FixSlashes( found );
fileNames.AddToTail( found );
}
fn = g_pFullFileSystem->FindNext( fh );
} while ( fn );
g_pFullFileSystem->FindClose( fh );
}
// did we find any?
if ( fileNames.Count() > 0 )
{
SYSTEMTIME SystemTime;
GetSystemTime( &SystemTime );
int index = SystemTime.wMilliseconds % fileNames.Count();
if ( fileNames.IsValidIndex( index ) && fileNames[index] )
{
char found[ 512 ];
// escape chars "*#" make it stream, and be affected by snd_musicvolume
Q_snprintf( found, sizeof( found ), "play *#%s", fileNames[index] );
engine->ClientCmd_Unrestricted( found );
}
fileNames.PurgeAndDeleteElements();
}
}
示例5: OnCommand
void CGECreateServer::OnCommand( const char *command )
{
if ( !Q_stricmp(command, "play") )
{
CUtlVector<char*> commands;
// Pull the values from our controls and apply them to commands and save off the choices
for ( KeyValues *kv = m_kvCmdMap->GetFirstTrueSubKey(); kv; kv = kv->GetNextTrueSubKey() )
{
KeyValues *kv_value = m_kvCmdValues->FindKey( kv->GetName(), true );
char *cmd = new char[128];
try {
if ( !Q_stricmp(kv->GetString("type"), "CHOICE") )
{
ComboBox *panel = dynamic_cast<ComboBox*>( FindChildByName(kv->GetName()) );
const char *cmd_value = panel->GetActiveItemUserData()->GetName();
kv_value->SetStringValue( cmd_value );
if ( !Q_stricmp(cmd_value, RANDOM_VALUE) )
{
int idx = GERandom<int>( panel->GetItemCount()-1 ) + 1;
idx = panel->GetItemIDFromRow( idx );
cmd_value = panel->GetItemUserData( idx )->GetName();
}
Q_snprintf( cmd, 128, "%s \"%s\"", kv->GetString("cmd"), cmd_value );
commands.AddToTail( cmd );
}
else if ( !Q_stricmp(kv->GetString("type"), "TEXT") )
{
char cmd_value[64];
TextEntry *panel = dynamic_cast<TextEntry*>( FindChildByName(kv->GetName()) );
panel->GetText( cmd_value, 64 );
// We don't allow blank values... use default instead
if ( !cmd_value[0] )
Q_strncpy( cmd_value, kv->GetString("default",""), 64 );
kv_value->SetStringValue( cmd_value );
Q_snprintf( cmd, 128, "%s \"%s\"", kv->GetString("cmd"), cmd_value );
commands.AddToTail( cmd );
}
else if ( !Q_stricmp(kv->GetString("type"), "BOOL") )
{
CheckButton *panel = dynamic_cast<CheckButton*>( FindChildByName(kv->GetName()) );
if ( panel->IsSelected() ) {
kv_value->SetStringValue( "1" );
Q_snprintf( cmd, 128, "%s \"%s\"", kv->GetString("cmd"), kv->GetString("on_val","1") );
} else {
kv_value->SetStringValue( "0" );
Q_snprintf( cmd, 128, "%s \"%s\"", kv->GetString("cmd"), kv->GetString("off_val","0") );
}
commands.AddToTail( cmd );
}
else
{
delete [] cmd;
}
} catch (...) {
delete [] cmd;
}
}
// Apply the commands
for ( int i=0; i < commands.Count(); i++ )
engine->ClientCmd_Unrestricted( commands[i] );
// Save our last used settings to our custom file
m_kvCmdValues->SaveToFile( filesystem, COMMAND_MAP_VAL, "MOD" );
// Cleanup
commands.PurgeAndDeleteElements();
}
SetVisible( false );
}
示例6: ClearAll
void CGEObjectives::ClearAll( void )
{
m_vObjectives.PurgeAndDeleteElements();
}
示例7: SpawnRandomShieldbug
bool CASW_Spawn_Manager::SpawnRandomShieldbug()
{
int iNumNodes = g_pBigAINet->NumNodes();
if ( iNumNodes < 6 )
return false;
int nHull = HULL_WIDE_SHORT;
CUtlVector<CASW_Open_Area*> aAreas;
for ( int i = 0; i < 6; i++ )
{
CAI_Node *pNode = NULL;
int nTries = 0;
while ( nTries < 5 && ( !pNode || pNode->GetType() != NODE_GROUND ) )
{
pNode = g_pBigAINet->GetNode( RandomInt( 0, iNumNodes ) );
nTries++;
}
if ( pNode )
{
CASW_Open_Area *pArea = FindNearbyOpenArea( pNode->GetOrigin(), HULL_MEDIUMBIG );
if ( pArea && pArea->m_nTotalLinks > 30 )
{
// test if there's room to spawn a shieldbug at that spot
if ( ValidSpawnPoint( pArea->m_pNode->GetPosition( nHull ), NAI_Hull::Mins( nHull ), NAI_Hull::Maxs( nHull ), true, false ) )
{
aAreas.AddToTail( pArea );
}
else
{
delete pArea;
}
}
}
// stop searching once we have 3 acceptable candidates
if ( aAreas.Count() >= 3 )
break;
}
// find area with the highest connectivity
CASW_Open_Area *pBestArea = NULL;
for ( int i = 0; i < aAreas.Count(); i++ )
{
CASW_Open_Area *pArea = aAreas[i];
if ( !pBestArea || pArea->m_nTotalLinks > pBestArea->m_nTotalLinks )
{
pBestArea = pArea;
}
}
if ( pBestArea )
{
CBaseEntity *pAlien = SpawnAlienAt( "asw_shieldbug", pBestArea->m_pNode->GetPosition( nHull ), RandomAngle( 0, 360 ) );
IASW_Spawnable_NPC *pSpawnable = dynamic_cast<IASW_Spawnable_NPC*>( pAlien );
if ( pSpawnable )
{
pSpawnable->SetAlienOrders(AOT_SpreadThenHibernate, vec3_origin, NULL);
}
aAreas.PurgeAndDeleteElements();
return true;
}
aAreas.PurgeAndDeleteElements();
return false;
}
示例8: ReloadConfigs
//-----------------------------------------------------------------------------
// Purpose: Reload and re-parse our configuration data
//-----------------------------------------------------------------------------
void ReloadConfigs( bool bNoWarning /*= false*/ )
{
g_Configs.PurgeAndDeleteElements();
ParseConfigs();
g_pMainFrame->PopulateConfigList( bNoWarning );
}
示例9: HandlePacket_LOOKING_FOR_WORKERS
void HandlePacket_LOOKING_FOR_WORKERS( bf_read &buf, const CIPAddr &ipFrom )
{
// If we're downloading files for a job request, don't process any more "looking for workers" packets.
if ( g_Waiting_hProcess )
return;
// This will be a nonzero-length string if patching.
char versionString[512];
buf.ReadString( versionString, sizeof( versionString ) );
int iPort = buf.ReadShort();
int iPriority = buf.ReadShort();
// Make sure we don't run the same job more than once.
if ( !CheckJobID( buf, g_CurJobID ) )
return;
CUtlVector<char*> newArgv;
GetArgsFromBuffer( buf, newArgv, &g_Waiting_bShowAppWindow );
bool bForcePatch = false;
if ( buf.GetNumBytesLeft() >= 1 )
bForcePatch = (buf.ReadByte() != 0);
int iDownloaderPort = iPort;
if ( buf.GetNumBytesLeft() >= 2 )
iDownloaderPort = buf.ReadShort();
// Add these arguments after the executable filename to tell the program
// that it's an MPI worker and who to connect to.
char strDownloaderIP[128], strMainIP[128];
V_snprintf( strDownloaderIP, sizeof( strDownloaderIP ), "%d.%d.%d.%d:%d", ipFrom.ip[0], ipFrom.ip[1], ipFrom.ip[2], ipFrom.ip[3], iDownloaderPort );
V_snprintf( strMainIP, sizeof( strMainIP ), "%d.%d.%d.%d:%d", ipFrom.ip[0], ipFrom.ip[1], ipFrom.ip[2], ipFrom.ip[3], iPort );
// (-mpi is already on the command line of whoever ran the app).
// AppendArg( commandLine, sizeof( commandLine ), "-mpi" );
newArgv.InsertAfter( 0, CopyString( "-mpi_worker" ) );
newArgv.InsertAfter( 1, CopyString( strDownloaderIP ) );
// If the version string is set, then this is a patch.
bool bPatching = false;
if ( versionString[0] != 0 )
{
bPatching = true;
// Check that we haven't applied this patch version yet. This case usually happens right after we've applied a patch
// and we're restarting. The vmpi_transfer master is still pinging us telling us to patch, but we don't want to
// reapply this patch.
if ( atof( versionString ) <= atof( g_VersionString ) && !bForcePatch )
{
newArgv.PurgeAndDeleteElements();
return;
}
// Ok, it's a new version. Get rid of whatever was running before.
KillRunningProcess( "Starting a patch..", true );
}
// If there's already a job running, only interrupt it if this new one has a higher priority.
if ( WaitForProcessToExit() )
{
if ( iPriority > g_CurJobPriority )
{
KillRunningProcess( "Interrupted by a higher priority process", true );
}
else
{
// This means we're already running a job with equal to or greater priority than
// the one that has been requested. We're going to ignore this request.
newArgv.PurgeAndDeleteElements();
return;
}
}
// Responses go here.
g_CurRespondAddr = ipFrom;
// Also look for -mpi_ShowAppWindow in the args to the service.
if ( !g_Waiting_bShowAppWindow && FindArg( __argc, __argv, "-mpi_ShowAppWindow" ) )
g_Waiting_bShowAppWindow = true;
// Copy all the files from the master and put them in our cache dir to run with.
char cacheDir[MAX_PATH];
if ( StartDownloadingAppFiles( newArgv, cacheDir, sizeof( cacheDir ), g_Waiting_bShowAppWindow, &g_Waiting_hProcess, bPatching ) )
{
// After it's downloaded, we want it to switch to the main connection port.
if ( newArgv.Count() >= 3 && V_stricmp( newArgv[2], strDownloaderIP ) == 0 )
{
delete newArgv[2];
newArgv[2] = CopyString( strMainIP );
}
g_Waiting_StartTime = Plat_FloatTime();
g_Waiting_Argv.PurgeAndDeleteElements();
g_Waiting_Argv = newArgv;
g_Waiting_Priority = iPriority;
g_Waiting_bPatching = bPatching;
newArgv.Purge();
}
//.........这里部分代码省略.........
示例10: CheckDownloaderFinished
// Returns true if the service was just patched and should exit.
bool CheckDownloaderFinished()
{
if ( !g_Waiting_hProcess )
return false;
// Check if the downloader has timed out and kill it if necessary.
if ( Plat_FloatTime() - g_Waiting_StartTime > MAX_DOWNLOADER_TIME_ALLOWED )
{
TerminateProcess( g_Waiting_hProcess, 1 );
CloseHandle( g_Waiting_hProcess );
g_Waiting_hProcess = NULL;
return false;
}
// Check if it's done.
if ( WaitForSingleObject( g_Waiting_hProcess, 0 ) != WAIT_OBJECT_0 )
return false;
CloseHandle( g_Waiting_hProcess );
g_Waiting_hProcess = NULL;
// Ok, it's done. Did it finish successfully?
char testFilename[MAX_PATH];
V_ComposeFileName( g_FileCachePath, "ReadyToGo.txt", testFilename, sizeof( testFilename ) );
if ( _access( testFilename, 0 ) != 0 )
return false;
// Ok, the downloader finished successfully. Run the worker app.
if ( g_bSuperDebugMode )
AdjustSuperDebugArgs( g_Waiting_Argv );
// Figure out the name of the master machine.
V_strncpy( g_CurMasterName, "<unknown>", sizeof( g_CurMasterName ) );
for ( int iArg=1; iArg < g_Waiting_Argv.Count()-1; iArg++ )
{
if ( stricmp( g_Waiting_Argv[iArg], "-mpi_MasterName" ) == 0 )
{
Q_strncpy( g_CurMasterName, g_Waiting_Argv[iArg+1], sizeof( g_CurMasterName ) );
}
}
char DLLFilename[MAX_PATH];
if ( FindArg( __argc, __argv, "-TryDLLMode" ) &&
g_RunMode == RUNMODE_CONSOLE &&
GetDLLFilename( g_Waiting_Argv, DLLFilename ) &&
!g_Waiting_bPatching )
{
// This is just a helper for debugging. If it's VRAD, we can run it
// in-process as a DLL instead of running it as a separate EXE.
RunInDLL( DLLFilename, g_Waiting_Argv );
}
else
{
// Run the (hopefully!) MPI app they specified.
RunProcessAtCommandLine( g_Waiting_Argv, g_Waiting_bShowAppWindow, g_Waiting_bPatching, g_Waiting_Priority );
if ( g_Waiting_bPatching )
{
// Tell any currently-running UI apps to patch themselves and quit ASAP so the installer can finish.
SendPatchCommandToUIs( g_dwRunningProcessId );
ResumeThread( g_hRunningThread ); // We started the installer suspended so we could make sure we'd send out the patch command.
// We just ran the installer, but let's forget about it, otherwise we'll kill its process when we exit here.
CloseHandle( g_hRunningProcess );
CloseHandle( g_hRunningThread ) ;
g_hRunningProcess = g_hRunningThread = NULL;
g_RunningProcess_ExeName[0] = 0;
g_RunningProcess_MapName[0] = 0;
ServiceHelpers_ExitEarly();
return true;
}
}
g_Waiting_Argv.PurgeAndDeleteElements();
return false;
}
示例11: GetFavoriteWeapon
bool CGEStats::GetFavoriteWeapon( int iPlayer, GEWeaponSort &fav )
{
if ( iPlayer < 0 || iPlayer >= m_pPlayerStats.Count() )
return false;
GEPlayerStats *stats = m_pPlayerStats[iPlayer];
CBasePlayer *pPlayer = ToBasePlayer( m_pPlayerStats[iPlayer]->GetPlayer() );
if ( !pPlayer || !stats )
return false;
// We want raw kills, NOT score
int playerFrags = pPlayer->FragCount();
float roundtime = gpGlobals->curtime - m_flRoundStartTime;
// Avoid divide by zero!
if ( roundtime == 0.0f )
roundtime = 0.5f;
CUtlVector<GEWeaponSort*> weapons;
float killPercent;
for ( int i=WEAPON_NONE+1; i < WEAPON_RANDOM; i++ ) // Go up to WEAPON_RANDOM to exclude tokens.
{
GEWeaponSort *entry = new GEWeaponSort;
if ( GEGameplay()->IsInFinalIntermission() )
{
entry->m_iPercentage = stats->m_iMatchWeapons[i];
}
else
{
// Avoid divide by zero!
if ( playerFrags == 0 )
killPercent = 0.0f;
else
killPercent = (float)stats->m_iWeaponsKills[i] / (float)playerFrags;
if ( roundtime < 1.0f )
entry->m_iPercentage = 0;
else
entry->m_iPercentage = 100 * ( ((float)stats->m_iWeaponsHeldTime[i] / roundtime) + killPercent );
}
entry->m_iWeaponID = i;
weapons.AddToTail( entry );
}
weapons.Sort( &CGEStats::WeaponSort );
// Only give them a fav weapon if they have a percentage
fav.m_iPercentage = weapons[0]->m_iPercentage;
if ( fav.m_iPercentage )
fav.m_iWeaponID = weapons[0]->m_iWeaponID;
else
fav.m_iWeaponID = WEAPON_NONE;
#ifdef _DEBUG
DevMsg( "%s's weapon stats:\n", pPlayer->GetPlayerName() );
DevMsg( "Frags: %i, Roundtime: %0.2f\n", playerFrags, roundtime );
for ( int i=0; i < WEAPON_MAX-2; i++ )
{
if ( weapons[i]->m_iPercentage )
DevMsg( "%s : %i\n", WeaponIDToAlias( weapons[i]->m_iWeaponID ), weapons[i]->m_iPercentage );
}
DevMsg( "Favorite Weapon: %s\n", WeaponIDToAlias( fav.m_iWeaponID ) );
#endif
weapons.PurgeAndDeleteElements();
return true;
}
示例12: GetAwardWinner
bool CGEStats::GetAwardWinner( int iAward, GEStatSort &winner )
{
CUtlVector<GEStatSort*> stats;
if ( GEMPRules()->GetNumActivePlayers() < 2 )
return false;
// Reset any previous inclinations
winner.m_iAward = -1;
winner.m_iStat = 0;
CGEPlayer *pPlayer = NULL;
// First parse out all the award to player information
for ( int i=0; i < m_pPlayerStats.Count(); i++ )
{
// Don't try to give awards to invalid players
pPlayer = m_pPlayerStats[i]->GetPlayer();
if ( !pPlayer )
continue;
if ( pPlayer->GetTeamNumber() == TEAM_SPECTATOR )
continue;
GEStatSort *entry = new GEStatSort;
entry->idx = i;
// If this is the last report, then take the match stats, average them over the rounds, and use that as our stat
if ( GEGameplay()->IsInFinalIntermission() )
entry->m_iStat = m_pPlayerStats[i]->GetMatchStat( iAward ) / m_iRoundCount;
else
entry->m_iStat = m_pPlayerStats[i]->GetRoundStat( iAward );
stats.AddToTail( entry );
}
// Make sure after our checks we have at least two players to do awards for
if ( stats.Count() < 2 )
return false;
float playerrat = (float)(stats.Count() + GE_STATS_PLAYERRATIO) / (float)stats.Count();
if ( GetAwardSort(iAward) == GE_SORT_HIGH )
stats.Sort( &CGEStats::StatSortHigh );
else
{
stats.Sort( &CGEStats::StatSortLow );
// Since we are sorting low we have to invert our player ratio
playerrat = 1 / playerrat;
}
// Prevent divide by zero and inflation
if ( stats[1]->m_iStat == 0 )
stats[1]->m_iStat = 1;
float statrat = (float)stats[0]->m_iStat / (float)stats[1]->m_iStat;
// Low sort should have a ratio less than the inverted playerrat
if ( GetAwardSort(iAward) == GE_SORT_HIGH ? statrat > playerrat : statrat < playerrat )
{
// Prevent divide by zero
if ( statrat == 0 )
statrat = 1;
winner.idx = stats[0]->idx;
winner.m_iStat = (GetAwardSort(iAward) == GE_SORT_HIGH ? statrat : 1/statrat) * 1000; // 3 decimal precision
winner.m_iAward = iAward;
stats.PurgeAndDeleteElements();
return true;
}
stats.PurgeAndDeleteElements();
return false;
}
示例13: SpawnRandomParasitePack
bool CASW_Spawn_Manager::SpawnRandomParasitePack( int nParasites )
{
int iNumNodes = g_pBigAINet->NumNodes();
if ( iNumNodes < 6 )
return false;
int nHull = HULL_TINY;
CUtlVector<CASW_Open_Area*> aAreas;
for ( int i = 0; i < 6; i++ )
{
CAI_Node *pNode = NULL;
int nTries = 0;
while ( nTries < 5 && ( !pNode || pNode->GetType() != NODE_GROUND ) )
{
pNode = g_pBigAINet->GetNode( RandomInt( 0, iNumNodes ) );
nTries++;
}
if ( pNode )
{
CASW_Open_Area *pArea = FindNearbyOpenArea( pNode->GetOrigin(), HULL_MEDIUMBIG );
if ( pArea && pArea->m_nTotalLinks > 30 )
{
// test if there's room to spawn a shieldbug at that spot
if ( ValidSpawnPoint( pArea->m_pNode->GetPosition( nHull ), NAI_Hull::Mins( nHull ), NAI_Hull::Maxs( nHull ), true, false ) )
{
aAreas.AddToTail( pArea );
}
else
{
delete pArea;
}
}
}
// stop searching once we have 3 acceptable candidates
if ( aAreas.Count() >= 3 )
break;
}
// find area with the highest connectivity
CASW_Open_Area *pBestArea = NULL;
for ( int i = 0; i < aAreas.Count(); i++ )
{
CASW_Open_Area *pArea = aAreas[i];
if ( !pBestArea || pArea->m_nTotalLinks > pBestArea->m_nTotalLinks )
{
pBestArea = pArea;
}
}
if ( pBestArea )
{
for ( int i = 0; i < nParasites; i++ )
{
// raise the position by 12 units, a workaround for parasites
// falling through displacements
CBaseEntity *pAlien = SpawnAlienAt( "asw_parasite", pBestArea->m_pNode->GetPosition( nHull ) + Vector(0.f, 0.f, 12.f), RandomAngle( 0, 360 ) );
IASW_Spawnable_NPC *pSpawnable = dynamic_cast<IASW_Spawnable_NPC*>( pAlien );
if ( pSpawnable )
{
pSpawnable->SetAlienOrders(AOT_SpreadThenHibernate, vec3_origin, NULL);
}
if ( asw_director_debug.GetBool() && pAlien )
{
Msg( "Spawned parasite at %f %f %f\n", pAlien->GetAbsOrigin() );
NDebugOverlay::Cross3D( pAlien->GetAbsOrigin(), 8.0f, 255, 0, 0, true, 20.0f );
}
}
aAreas.PurgeAndDeleteElements();
return true;
}
aAreas.PurgeAndDeleteElements();
return false;
}