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