bool DoomsDayDevice::DamageVictims( bool& bAllDead ) { TRACE( "DoomsDayDevice::DamageVictims\n" ); char szDamageType[256]; if( !g_pServerButeMgr->GetDoomsDayDeviceDamageType( szDamageType, ARRAY_LEN( szDamageType ))) { return false; } DamageStruct damage; damage.eType = StringToDamageType( szDamageType ); damage.fDamage = g_pServerButeMgr->GetDoomsDayDeviceDamageAmount( ); damage.hDamager = m_hObject; damage.fDuration = 30.0f; // Initialize the status to all the players being dead. bAllDead = true; // Find all the victim teams and kill them. uint8 nNumTeams = CTeamMgr::Instance( ).GetNumTeams( ); for( uint8 nTeam = 0; nTeam < nNumTeams; nTeam++ ) { // Skip the activating team. if( nTeam == m_nOwningTeamID ) continue; CTeam* pTeam = CTeamMgr::Instance( ).GetTeam( nTeam ); if( !pTeam ) { ASSERT( !"DoomsDayDevice::DamageVictims: Invalid team." ); continue; } // Iterate over each player on the team and kill him. PlayerIDSet const& players = pTeam->GetPlayerIDSet( ); PlayerIDSet::const_iterator iter = players.begin( ); while( iter != players.end( )) { uint32 nClientId = *iter; iter++; HCLIENT hClient = g_pLTServer->GetClientHandle( nClientId ); if( !hClient ) continue; CPlayerObj* pTeamPlayer = ( CPlayerObj* )g_pLTServer->GetClientUserData( hClient ); if( !pTeamPlayer ) continue; // Skip if already dead. if( pTeamPlayer->IsDead( )) continue; // This player is still alive, so update the status variable. bAllDead = false; // Do the damage. damage.DoDamage( this, pTeamPlayer->m_hObject ); } } return true; }