void CBirdsFlock::SetEnabled( bool bEnabled ) { if (!m_bc.bSpawnFromPoint) CFlock::SetEnabled(bEnabled); else { if (m_bEnabled != bEnabled) { SetAttractOutput(false); m_bEnabled = bEnabled; for (Boids::iterator it = m_boids.begin(); it != m_boids.end(); ++it) { CBoidBird *pBoid = (CBoidBird *)*it; float radius = 0.5; // Spawn not far from origin float z = /*gEnv->p3DEngine->GetTerrainElevation(m_origin.x,m_origin.y) + */7.f + Boid::Frand()*2.f; // z = terrain height + [5-9] pBoid->m_pos = m_origin + Vec3(radius*Boid::Frand(),radius*Boid::Frand(), radius*Boid::Frand()); z = .25f*Boid::Frand() + .25f; // z-heading = 0.0 - 0.5 pBoid->m_heading = ( Vec3(Boid::Frand(),Boid::Frand(),z) ).GetNormalized(); pBoid->m_scale = m_bc.boidScale + Boid::Frand()*m_bc.boidRandomScale; pBoid->m_speed = m_bc.MinSpeed + (Boid::Frand()+1)/2.0f*(m_bc.MaxSpeed - m_bc.MinSpeed); pBoid->m_dead = 0; pBoid->m_currentAccel(0,0,0); pBoid->SetSpawnFromPt(true); pBoid->m_fNoCenterAttract = m_bc.factorAttractToOrigin; pBoid->m_fNoKeepHeight = m_bc.factorKeepHeight; pBoid->SetAttracted(false); } if (!bEnabled && m_bEntityCreated) DeleteEntities(false); } } }
int CBirdsFlock::GetNumAliveBirds() { int numAliveBoids = 0; for (Boids::iterator it = m_boids.begin(),itEnd = m_boids.end(); it != itEnd; ++it) { CBoidBird* pBoid = static_cast<CBoidBird*>(*it); if(pBoid && !pBoid->IsDead()) ++numAliveBoids; } return numAliveBoids; }
void CBirdsFlock::Update(CCamera *pCamera) { UpdateLandingPoints(); m_isPlayerNearOrigin = GetEntity()!=NULL && IsPlayerInProximity(GetEntity()->GetPos()); CFlock::Update(pCamera); float dt = gEnv->pTimer->GetFrameTime(); // set the ai object in the middle of the boids UpdateAvgBoidPos(dt); if(m_status == Bird::FLYING && !m_bc.noLanding && (gEnv->pTimer->GetFrameStartTime()- m_flightStartTime).GetSeconds() > m_flightDuration) { if(GetEntity() && !m_isPlayerNearOrigin) Land(); } if(m_status == Bird::LANDING) { float timePassed = (gEnv->pTimer->GetFrameStartTime()- m_flightStartTime).GetSeconds(); if(timePassed < START_LANDING_TIME+0.5f) { int n = m_boids.size(); int numBoidsLandingNow = int(float(n*timePassed)/START_LANDING_TIME); if(numBoidsLandingNow >n) numBoidsLandingNow = n; for(int i = 0; i<numBoidsLandingNow ; ++i) { CBoidBird *bird = static_cast<CBoidBird *>(m_boids[i]); if(bird && !bird->IsDead() && !bird->IsLanding()) bird->Land(); } } } if(m_status == Bird::LANDING || m_status == Bird::ON_GROUND) { if(IsPlayerInProximity(GetAvgBoidPos())) TakeOff(); } }
void CBirdsFlock::TakeOff() { for (Boids::iterator it = m_boids.begin(),itEnd = m_boids.end(); it != itEnd; ++it) { CBoidBird* pBoid = static_cast<CBoidBird*>(*it); if(pBoid && !pBoid->IsDead()) pBoid->TakeOff(m_bc); } m_flightDuration = GetFlightDuration(); m_flightStartTime = gEnv->pTimer->GetFrameStartTime(); m_status = Bird::FLYING; m_birdsOnGround = 0; }
void CBirdsFlock::CreateBoids(SBoidsCreateContext &ctx) { CFlock::CreateBoids(ctx); m_boidDefaultAnimName = m_bc.GetAnimationName(Bird::ANIM_FLY); m_bc.bAutoTakeOff = false; for(uint32 i = 0; i < m_RequestedBoidsCount; i++) { CBoidObject *boid = new CBoidBird(m_bc); if(m_bc.bSpawnFromPoint) { CBoidBird *pBoid = (CBoidBird *)boid; float radius = 0.5; // Spawn not far from origin float z = /*gEnv->p3DEngine->GetTerrainElevation(m_origin.x,m_origin.y)*/ + 7.f + Boid::Frand()*2.f; // z = terrain height + [5-9] pBoid->m_pos = m_origin + Vec3(radius*Boid::Frand(),radius*Boid::Frand(), radius*Boid::Frand()); z = .25f*Boid::Frand() + .25f; // z-heading = 0.0 - 0.5 pBoid->m_heading = (Vec3(Boid::Frand(),Boid::Frand(),z)).GetNormalized(); pBoid->m_scale = m_bc.boidScale + Boid::Frand()*m_bc.boidRandomScale; boid->m_speed = m_bc.MinSpeed + (Boid::Frand()+1)/2.0f*(m_bc.MaxSpeed - m_bc.MinSpeed); pBoid->m_dead = 0; pBoid->m_currentAccel(0,0,0); pBoid->SetSpawnFromPt(true); pBoid->m_fNoCenterAttract = m_bc.factorAttractToOrigin; pBoid->m_fNoKeepHeight = m_bc.factorKeepHeight; pBoid->SetAttracted(false); } else { float radius = m_bc.fSpawnRadius; boid->m_pos = m_origin + Vec3(radius*Boid::Frand(),radius*Boid::Frand(),Boid::Frand()*radius); boid->m_heading = (Vec3(Boid::Frand(),Boid::Frand(),0)).GetNormalized(); boid->m_scale = m_bc.boidScale + Boid::Frand()*m_bc.boidRandomScale; boid->m_speed = m_bc.MinSpeed + (Boid::Frand()+1)/2.0f*(m_bc.MaxSpeed - m_bc.MinSpeed); } AddBoid(boid); } m_lastUpdatePosTimePassed = 1; m_avgBoidPos = GetPos(); // m_hasLanded = false; TakeOff(); m_terrainPoints = 0; }