void CWaterPuddle::ZapEnemiesOnPuddle(int ownTeam, EntityId shooterId, EntityId weaponId, float damage, int hitTypeId, IParticleEffect* hitEffect)
{
	IGameVolumes::VolumeInfo volumeInfo;
	if (!GetVolumeInfoForEntity(GetEntityId(), &volumeInfo))
		return;
	IEntity* pEntity = GetEntity();
	Matrix34 worldTM = pEntity->GetWorldTM();
	float waterLevel = worldTM.GetTranslation().z + volumeInfo.volumeHeight * 0.5f;

	CActorManager* pActorManager = CActorManager::GetActorManager();
	const int numberOfActors	= pActorManager->GetNumActors();

	for(int i = 0; i < numberOfActors; i++)
	{
		SActorData actorData;
		pActorManager->GetNthActorData(i, actorData);

		bool isActorAlive = (actorData.health > 0.0f);
		bool isActorEnemy = (actorData.teamId != ownTeam);
		bool isActorInsidevolume = IsActorInsideVolume(worldTM, volumeInfo, actorData.entityId);

		if (isActorAlive && isActorEnemy && isActorInsidevolume)
			ApplyHit(actorData, shooterId, weaponId, damage, hitTypeId, waterLevel, hitEffect);
	}
}
//---------------------------------------
TAudioSignalID CAreaAnnouncer::BuildAnnouncement(const EntityId clientId)
{
	const int k_areaCount = m_areaList.size();
	if (k_areaCount > 0)
	{
		IActorSystem* pActorSystem = gEnv->pGame->GetIGameFramework()->GetIActorSystem();

		if (CActor* pClientActor = static_cast<CActor*>(pActorSystem->GetActor(clientId)))
		{
			int actorCount[k_maxAnnouncementAreas];
			memset(&actorCount, 0, sizeof(actorCount));

			CActorManager * pActorManager = CActorManager::GetActorManager();

			pActorManager->PrepareForIteration();

			const int kNumActors		= pActorManager->GetNumActors();
			const int kPlayerTeamId = g_pGame->GetGameRules()->GetTeam(clientId);

			for (int i = 0; i < kNumActors; i++)
			{
				SActorData actorData;
				pActorManager->GetNthActorData(i, actorData);

				if(actorData.teamId != kPlayerTeamId && actorData.health > 0 && actorData.spectatorMode == CActor::eASM_None)
				{
					for (int areaIndex = 0; areaIndex < k_areaCount; areaIndex++)
					{
						IEntity* pEntity = gEnv->pEntitySystem->GetEntity(m_areaList[areaIndex].m_areaProxyId);
						if(pEntity)
						{
							IEntityAreaProxy *pArea = (IEntityAreaProxy*)pEntity->GetProxy(ENTITY_PROXY_AREA);
							if(pArea && pArea->CalcPointWithin(INVALID_ENTITYID, actorData.position, true))
							{
								actorCount[areaIndex]++;
								break;
							}
						}
					}
				}
			}

			return GenerateAnnouncement(&actorCount[0], k_areaCount, clientId);
		}
	}

	return INVALID_AUDIOSIGNAL_ID;
}
void CLocalPlayerComponent::Revive()
{
	if(gEnv->bMultiplayer)
	{
		// Reset NotYetSpawned filter.
		IActionFilter* pNYSFilter = g_pGameActions->FilterNotYetSpawned();
		if(pNYSFilter && pNYSFilter->Enabled())
		{
			pNYSFilter->Enable(false);
		}

		// For Modes where we can swap teams per round, refresh everyone else's cloak colour on revive.
		CGameRules *pGameRules = g_pGame->GetGameRules();
		if( pGameRules->GetGameMode()==eGM_Gladiator )
		{
			IActorSystem* pActorSys = g_pGame->GetIGameFramework()->GetIActorSystem();
			CActorManager* pActorManager = CActorManager::GetActorManager();
			pActorManager->PrepareForIteration();
			const int kNumActors = pActorManager->GetNumActors();
			for(int i=0; i<kNumActors; i++)
			{
				SActorData actorData;
				pActorManager->GetNthActorData(i, actorData);		
				if(CActor* pActor = static_cast<CActor*>(pActorSys->GetActor(actorData.entityId)))
				{
					if(pActor->IsCloaked())
					{
						pActor->SetCloakLayer(false);
						pActor->SetCloakLayer(true);
					}
				}
			}
		}
	}

	m_bIsInFreeFallDeath = false;
	m_playedMidHealthSound = false;
}
void CGameRulesRSSpawning::GetEnemyTeamCentre( SUsefulSpawnData& spawnData, Vec3 * pOutCentre )
{
	//This is now a blueprint for switching over the other functions to use the CActorManager.
	//	They are not being switched over now because there are more significant changes in MPTrunk
	//	that further changes would conflict with - Rich S

	int				idx						= 0;
	EntityId	enemyPlayerId = 0;

	float fNumEnemies				= 0.0f;
	Vec3	pureAveragePosition(0.0f, 0.0f, 0.0f);

	CActorManager * pActorManager = CActorManager::GetActorManager();
	
	pActorManager->PrepareForIteration();

	const int kNumActors = pActorManager->GetNumActors();

	for(int i = 0; i < kNumActors; i++)
	{
		SActorData actorData;
		pActorManager->GetNthActorData(i, actorData);

		if(actorData.teamId == spawnData.enemyTeamId && actorData.spectatorMode == CActor::eASM_None)
		{
			fNumEnemies += 1.0f;

			float fInvNumEnemies						= __fres(fNumEnemies);
			float fCurrentPositionWeighting = 1.0f - fInvNumEnemies;

			//This is slightly more computationally expensive than adding them all up, but 
			//	avoids the potential for some float precision problems
			pureAveragePosition = (pureAveragePosition * fCurrentPositionWeighting) + (fInvNumEnemies * actorData.position);
		}		
	}

	*pOutCentre = pureAveragePosition;
}
Пример #5
0
void CJaw::SvActivateMissileCountermeasures(EntityId shooterId, const Vec3 &pos, const Vec3 &dir)
{
	if(gEnv->bServer)
	{
		float fov = sinf(DEG2RAD(60.0f));

		CActorManager * pActorManager = CActorManager::GetActorManager();

		pActorManager->PrepareForIteration();

		const int kNumActors			= pActorManager->GetNumActorsIncludingLocalPlayer();
		const int kShooterTeam		= g_pGame->GetGameRules()->GetTeam(shooterId);
		const float fZOffset			= 1.5f;
		const float kPlayerRadius = 0.5f;

		IActorSystem * pActorSystem = g_pGame->GetIGameFramework()->GetIActorSystem();

		for(int i = 0; i < kNumActors; i++)
		{
			SActorData actorData;
			pActorManager->GetNthActorData(i, actorData);
		}
	}
}
void CNetworkManager::Process()
{
	// Get our file transfer manager
	CFileTransferManager * pFileTransferManager = g_pClient->GetFileTransfer();

	// If our file transfer class exists process it
	if(pFileTransferManager)
		pFileTransferManager->Process();

	// Have we joined a server and not joined a game yet?
	if(m_bJoinedServer && !m_bJoinedGame)
	{
		// Get our local player
		CLocalPlayer * pLocalPlayer = g_pClient->GetLocalPlayer();

		// Is the file transfer list empty?
		if(pFileTransferManager->IsComplete() && pLocalPlayer->IsConnectFinished())
		{
			// Flag ourselves as joined a game
			m_bJoinedGame = true;

			// Respawn the local player
			pLocalPlayer->Respawn();
		}
	}

	if(!m_pNetClient)
		return;

	// Process the net client
	m_pNetClient->Process();

	// Are we connected to a server?
	if(m_pNetClient->IsConnected())
	{
		// If our streamer exists, process it
		CStreamer * pStreamer = g_pClient->GetStreamer();

		if(pStreamer)
			pStreamer->Pulse();

		// Is our script timer manager exists, process it
		CScriptTimerManager * pScriptTimerManager = g_pClient->GetClientScriptManager()->GetScriptTimerManager();
		if(pScriptTimerManager)
			pScriptTimerManager->Pulse();

		// If our player manager exists process it
		CPlayerManager * pPlayerManager = g_pClient->GetPlayerManager();

		if(pPlayerManager)
			pPlayerManager->Pulse();

		// If our vehicle manager exists process it
		CVehicleManager * pVehicleManager = g_pClient->GetVehicleManager();

		if(pVehicleManager)
			pVehicleManager->Pulse();

		// If our checkpoint manager exists process it
		CCheckpointManager * pCheckpointManager = g_pClient->GetCheckpointManager();

		if(pCheckpointManager)
			pCheckpointManager->Pulse();

		// If our object manager exists process it
		CObjectManager * pObjectManager = g_pClient->GetObjectManager();

		if(pObjectManager)
			pObjectManager->Process();

		// Process the audio manager
		CAudioManager * pAudioManager = g_pClient->GetAudioManager();

		if(pAudioManager)
			pAudioManager->Process();

		// Process the actor manager
		CActorManager * pActorManager = g_pClient->GetActorManager();

		if(pActorManager)
			pActorManager->Process();
	}
}