예제 #1
0
	virtual bool Execute(Agent *_Agent)
	{
		float dist2 = 0;
		if(_Agent->Attack)
		{
			Agent *TargetEnemy = nullptr;
			for ( auto EnemyCurrent : _Agent->Enemies)
			{
				TargetEnemy = EnemyCurrent;
				float Len = 0, tLen;

				tLen = glm::length(_Agent->GetPos()) - glm::length(EnemyCurrent->GetPos());
				if(tLen < 0){tLen *= -1;}
				if(tLen > Len){Len = tLen;TargetEnemy = EnemyCurrent;}
			}
			if(TargetEnemy != nullptr)
				dist2 = glm::distance2(_Agent->GetPos(), TargetEnemy->GetPos());
		}
		else
		{
			dist2 = glm::distance2(_Agent->GetPos(), _Agent->GetTarget());
		}

		if (dist2 < Range2)
			return true;
		return false;
	}
예제 #2
0
void StalkerModule::QueueLineOfSightRay(Agent& stalker, IAIObject* target, StalkerInstance& instance)
{
	PhysSkipList skipList;
	stalker.GetPhysicalSkipEntities(skipList);
	if (IAIActor* aiActor = target->CastToIAIActor())
		aiActor->GetPhysicalSkipEntities(skipList);

	instance.rayID = g_pGame->GetRayCaster().Queue(
		RayCastRequest::HighPriority,
		RayCastRequest(target->GetPos(), stalker.GetPos() - target->GetPos(),
		ent_terrain|ent_static|ent_rigid|ent_sleeping_rigid,
		((geom_colltype_ray << rwi_colltype_bit) | rwi_colltype_any | (10 & rwi_pierceability_mask)),
		&skipList[0], skipList.size()),
		functor(*this, &StalkerModule::LineOfSightRayComplete));
}
// ===========================================================================
// Process possible collision between an agent and the hazard.
//
//	In:		The agent.
//	Out:	The collision result (NULL is invalid!)
//
void HazardDataSphere::CheckCollision(Agent& agent, HazardCollisionResult* result) const
{
	assert(result != NULL);
	result->Reset();

	if (Distance::Point_PointSq(agent.GetPos(), m_Context.m_CenterPos) > 
		m_RadiusSq)
	{
		return;
	}		

	result->m_CollisionFlag = true;
	result->m_HazardOriginPos = m_Context.m_CenterPos;
	return;
}
예제 #4
0
	virtual bool  Execute(Agent *_Agent)
	{
		glm::vec3 Pos, Dir(0);
		if(_Agent->Attack)
		{
			if(_Agent->Path.size() > 0)
			{
				_Agent->SetTarget(_Agent->Move(1.0f));
			}
			else
			{
				Agent *TargetEnemy = nullptr;
				Pos = _Agent->GetPos();
				for ( auto EnemyCurrent : _Agent->Enemies)
				{
					float Len = 0, tLen;

					tLen = glm::length(Pos) - glm::length(EnemyCurrent->GetPos());
					if(tLen < 0){tLen *= -1;}
					if(tLen > Len){Len = tLen;TargetEnemy = EnemyCurrent;}
				}


				if(TargetEnemy != nullptr)
				{
					_Agent->Path = Path->Path(Pos,TargetEnemy->GetPos());
					Dir = _Agent->Move(1.0);
				}
			}
			if(glm::length(_Agent->GetPos()) - glm::length(_Agent->Path[0]->Position)<1.0f)
			{
				_Agent->Path.erase(_Agent->Path.begin());
			}


		}
		else
		{
			if(_Agent->Path.size() > 0)
			{
				_Agent->SetTarget(_Agent->Move(1.0f));
				if(glm::length(_Agent->GetPos()) - glm::length(_Agent->Path[0]->Position)<1.0f)
				{
					_Agent->Path.erase(_Agent->Path.begin());
				}
			}
			else
			{
				Flag *TargetFlag = nullptr;
				for (auto Flag : _Agent->Flags)
				{
					float Len = 0, tLen;

					tLen = glm::length(Pos) - glm::length(Flag->GetPos());
					if(tLen < 0){tLen *= -1;}
					if(tLen > Len){Len = tLen;TargetFlag = Flag;}
				}
				if(TargetFlag != nullptr)
				{
					_Agent->Path = Path->Path(Pos,TargetFlag->Position);
				}
			}
			_Agent->Velocity +=Dir * Speed * Utility::getDeltaTime();

			return true;
		}
	}