Пример #1
0
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;
}