示例#1
0
//------------------------------------------------------------------------
bool CGunTurret::IsTargetShootable(IEntity *pTarget)
{
	// raycast shootability check
	Vec3 pos = m_fireHelper.empty() ? GetWeaponPos() : GetSlotHelperPos(eIGS_ThirdPerson, m_fireHelper.c_str(), true);
	Vec3 tpos = GetTargetPos(pTarget);
	Vec3 dir = tpos - pos;

	bool shootable = RayCheck(pTarget, pos, dir);

	if(!shootable)
	{
		// fallback for actors
		// todo: also use this for shooting pos!
		CActor *pActor = GetActor(pTarget->GetId());

		if(pActor && pActor->GetMovementController())
		{
			SMovementState state;
			pActor->GetMovementController()->GetMovementState(state);
			dir = state.eyePosition - pos;
			shootable = RayCheck(pTarget, pos, dir);
		}
	}

	return shootable;
}
const CContactPoint* CPhysicsServer::GetClosestContactAlongRay(const vector3& Pos,
															   const vector3& Dir,
															   const CFilterSet* ExcludeSet)
{
	RayCheck(Pos, Dir, ExcludeSet);

	// Find closest contact
	int Idx = INVALID_INDEX;
	float ClosestDistanceSq = Dir.lensquared();
	for (int i = 0; i < Contacts.Size(); i++)
	{
		const CContactPoint& CurrContact = Contacts[i];
		float DistanceSq = (CurrContact.Position - Pos).lensquared();
		if (DistanceSq < ClosestDistanceSq)
		{
			Idx = i;
			ClosestDistanceSq = DistanceSq;
		}
	}
	return (Idx != INVALID_INDEX) ? &Contacts[Idx] : NULL;
}