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