Esempio n. 1
0
        //checks to see if a friendly is too close to the gun trajectory to fire them
        public static bool CheckSafeToFireGuns(MissileFire weaponManager, Vector3 aimDirection, float safeDistance, float cosUnsafeAngle)
        {
            BDArmorySetup.BDATeams        team           = weaponManager.team ? BDArmorySetup.BDATeams.A : BDArmorySetup.BDATeams.B;
            List <TargetInfo> .Enumerator friendlyTarget = TargetDatabase[team].GetEnumerator();
            while (friendlyTarget.MoveNext())
            {
                if (friendlyTarget.Current == null || !friendlyTarget.Current.Vessel)
                {
                    continue;
                }
                float friendlyPosDot = Vector3.Dot(friendlyTarget.Current.position - weaponManager.vessel.vesselTransform.position, aimDirection);
                if (!(friendlyPosDot > 0))
                {
                    continue;
                }
                float friendlyDistance   = (friendlyTarget.Current.position - weaponManager.vessel.vesselTransform.position).magnitude;
                float friendlyPosDotNorm = friendlyPosDot / friendlyDistance;               //scale down the dot to be a 0-1 so we can check it againts cosUnsafeAngle

                if (friendlyDistance < safeDistance && cosUnsafeAngle < friendlyPosDotNorm) //if it's too close and it's within the Unsafe Angle, don't fire
                {
                    return(false);
                }
            }
            friendlyTarget.Dispose();
            return(true);
        }
Esempio n. 2
0
        public static TargetInfo GetAirToAirTarget(MissileFire mf)
        {
            BDArmorySetup.BDATeams team        = mf.team ? BDArmorySetup.BDATeams.B : BDArmorySetup.BDATeams.A;
            TargetInfo             finalTarget = null;

            float finalTargetSuitability = 0;        //this will determine how suitable the target is, based on where it is located relative to the targeting vessel and how far it is

            List <TargetInfo> .Enumerator target = TargetDatabase[team].GetEnumerator();
            while (target.MoveNext())
            {
                if (target.Current == null)
                {
                    continue;
                }
                if (target.Current.numFriendliesEngaging >= 2)
                {
                    continue;
                }
                if (target.Current && target.Current.Vessel && target.Current.isFlying && !target.Current.isMissile && target.Current.isThreat)
                {
                    Vector3 targetRelPos      = target.Current.Vessel.vesselTransform.position - mf.vessel.vesselTransform.position;
                    float   targetSuitability = Vector3.Dot(targetRelPos.normalized, mf.vessel.ReferenceTransform.up);     //prefer targets ahead to those behind
                    targetSuitability += 500 / (targetRelPos.magnitude + 100);

                    if (finalTarget == null || (target.Current.numFriendliesEngaging < finalTarget.numFriendliesEngaging) || targetSuitability > finalTargetSuitability + finalTarget.numFriendliesEngaging)
                    {
                        finalTarget            = target.Current;
                        finalTargetSuitability = targetSuitability;
                    }
                }
            }

            return(finalTarget);
        }
Esempio n. 3
0
 protected virtual void OnToggleTeam(MissileFire mf, BDArmorySetup.BDATeams team)
 {
     if (mf.vessel == vessel || (commandLeader && commandLeader.vessel == mf.vessel))
     {
         ReleaseCommand();
     }
 }
Esempio n. 4
0
 private void MissileFireOnToggleTeam(MissileFire wm, BDArmorySetup.BDATeams team)
 {
     if (_showGui)
     {
         UpdateList();
     }
 }
Esempio n. 5
0
        public static TargetInfo GetClosestMissileTarget(MissileFire mf)
        {
            BDArmorySetup.BDATeams team        = BoolToTeam(mf.team);
            TargetInfo             finalTarget = null;

            List <TargetInfo> .Enumerator target = TargetDatabase[team].GetEnumerator();
            while (target.MoveNext())
            {
                if (target.Current == null)
                {
                    continue;
                }
                if (target.Current && target.Current.Vessel && mf.CanSeeTarget(target.Current) && target.Current.isMissile)
                {
                    bool isHostile = false;
                    if (target.Current.isThreat)
                    {
                        isHostile = true;
                    }

                    if (isHostile && (finalTarget == null || target.Current.IsCloser(finalTarget, mf)))
                    {
                        finalTarget = target.Current;
                    }
                }
            }
            target.Dispose();
            return(finalTarget);
        }
Esempio n. 6
0
 void Update()
 {
     if (!vessel)
     {
         AboutToBeDestroyed();
     }
     else
     {
         if ((vessel.vesselType == VesselType.Debris) && (weaponManager == null))
         {
             RemoveFromDatabases();
             team = BDArmorySetup.BDATeams.None;
         }
     }
 }
 public TargetSignatureData(CMFlare flare, float _signalStrength)
 {
     velocity       = flare.velocity;
     geoPos         = VectorUtils.WorldPositionToGeoCoords(flare.transform.position, FlightGlobals.currentMainBody);
     exists         = true;
     acceleration   = Vector3.zero;
     timeAcquired   = Time.time;
     signalStrength = _signalStrength;
     targetInfo     = null;
     vesselJammer   = null;
     team           = BDArmorySetup.BDATeams.None;
     pingPosition   = Vector2.zero;
     orbital        = false;
     orbit          = null;
     lockedByRadar  = null;
     vessel         = null;
 }
 public TargetSignatureData(Vector3 _velocity, Vector3 _position, Vector3 _acceleration, bool _exists, float _signalStrength)
 {
     velocity       = _velocity;
     geoPos         = VectorUtils.WorldPositionToGeoCoords(_position, FlightGlobals.currentMainBody);
     acceleration   = _acceleration;
     exists         = _exists;
     timeAcquired   = Time.time;
     signalStrength = _signalStrength;
     targetInfo     = null;
     vesselJammer   = null;
     team           = BDArmorySetup.BDATeams.None;
     pingPosition   = Vector2.zero;
     orbital        = false;
     orbit          = null;
     lockedByRadar  = null;
     vessel         = null;
 }
        public TargetSignatureData(Vessel v, float _signalStrength)
        {
            orbital = v.InOrbit();
            orbit   = v.orbit;

            timeAcquired = Time.time;
            vessel       = v;
            velocity     = v.Velocity();

            geoPos       = VectorUtils.WorldPositionToGeoCoords(v.CoM, v.mainBody);
            acceleration = v.acceleration_immediate;
            exists       = true;

            signalStrength = _signalStrength;

            targetInfo = v.gameObject.GetComponent <TargetInfo> ();

            // vessel never been picked up on radar before: create new targetinfo record
            if (targetInfo == null)
            {
                targetInfo = v.gameObject.AddComponent <TargetInfo>();
            }

            team = BDArmorySetup.BDATeams.None;

            if (targetInfo)
            {
                team = targetInfo.team;
                targetInfo.detectedTime = Time.time;
            }
            else
            {
                List <MissileFire> .Enumerator mf = v.FindPartModulesImplementing <MissileFire>().GetEnumerator();
                while (mf.MoveNext())
                {
                    team = BDATargetManager.BoolToTeam(mf.Current.team);
                    break;
                }
                mf.Dispose();
            }

            vesselJammer = v.gameObject.GetComponent <VesselECMJInfo>();

            pingPosition  = Vector2.zero;
            lockedByRadar = null;
        }
Esempio n. 10
0
        //returns the target that owns this weapon manager
        public static TargetInfo GetTargetFromWeaponManager(MissileFire mf)
        {
            BDArmorySetup.BDATeams team = mf.team ? BDArmorySetup.BDATeams.A : BDArmorySetup.BDATeams.B;

            List <TargetInfo> .Enumerator target = TargetDatabase[team].GetEnumerator();
            while (target.MoveNext())
            {
                if (target.Current == null)
                {
                    continue;
                }
                if (target.Current.Vessel && target.Current.weaponManager == mf)
                {
                    return(target.Current);
                }
            }
            target.Dispose();
            return(null);
        }
Esempio n. 11
0
        public static TargetInfo GetMissileTarget(MissileFire mf, bool targetingMeOnly = false)
        {
            BDArmorySetup.BDATeams team        = mf.team ? BDArmorySetup.BDATeams.B : BDArmorySetup.BDATeams.A;
            TargetInfo             finalTarget = null;

            List <TargetInfo> .Enumerator target = TargetDatabase[team].GetEnumerator();
            while (target.MoveNext())
            {
                if (target.Current == null)
                {
                    continue;
                }
                if (target.Current && target.Current.Vessel && target.Current.isMissile && target.Current.isThreat && mf.CanSeeTarget(target.Current))
                {
                    if (target.Current.MissileBaseModule)
                    {
                        if (targetingMeOnly)
                        {
                            if (Vector3.SqrMagnitude(target.Current.MissileBaseModule.TargetPosition - mf.vessel.CoM) > 60 * 60)
                            {
                                continue;
                            }
                        }
                    }
                    else
                    {
                        if (BDArmorySettings.DRAW_DEBUG_LABELS)
                        {
                            Debug.LogWarning("checking target missile -  doesn't have missile module");
                        }
                    }


                    if (((finalTarget == null && target.Current.numFriendliesEngaging < 2) || (finalTarget != null && target.Current.numFriendliesEngaging < finalTarget.numFriendliesEngaging)))
                    {
                        finalTarget = target.Current;
                    }
                }
            }
            target.Dispose();
            return(finalTarget);
        }
Esempio n. 12
0
        //returns the nearest friendly target
        public static TargetInfo GetClosestFriendly(MissileFire mf)
        {
            BDArmorySetup.BDATeams team        = mf.team ? BDArmorySetup.BDATeams.A : BDArmorySetup.BDATeams.B;
            TargetInfo             finalTarget = null;

            List <TargetInfo> .Enumerator target = TargetDatabase[team].GetEnumerator();
            while (target.MoveNext())
            {
                if (target.Current == null || !target.Current.Vessel || target.Current.weaponManager == mf)
                {
                    continue;
                }
                if (finalTarget == null || (target.Current.IsCloser(finalTarget, mf)))
                {
                    finalTarget = target.Current;
                }
            }
            target.Dispose();
            return(finalTarget);
        }
Esempio n. 13
0
        public static List <TargetInfo> GetAllTargetsExcluding(List <TargetInfo> excluding, MissileFire mf)
        {
            List <TargetInfo> finalTargets = new List <TargetInfo>();

            BDArmorySetup.BDATeams team = BoolToTeam(mf.team);

            List <TargetInfo> .Enumerator target = TargetDatabase[team].GetEnumerator();
            while (target.MoveNext())
            {
                if (target.Current == null)
                {
                    continue;
                }
                if (target.Current && target.Current.Vessel && mf.CanSeeTarget(target.Current) && !excluding.Contains(target.Current))
                {
                    finalTargets.Add(target.Current);
                }
            }
            target.Dispose();
            return(finalTargets);
        }
Esempio n. 14
0
        //this will search for an AA target that is immediately in front of the AI during an extend when it would otherwise be helpless
        public static TargetInfo GetAirToAirTargetAbortExtend(MissileFire mf, float maxDistance, float cosAngleCheck)
        {
            BDArmorySetup.BDATeams team        = mf.team ? BDArmorySetup.BDATeams.B : BDArmorySetup.BDATeams.A;
            TargetInfo             finalTarget = null;

            float finalTargetSuitability = 0;    //this will determine how suitable the target is, based on where it is located relative to the targeting vessel and how far it is

            List <TargetInfo> .Enumerator target = TargetDatabase[team].GetEnumerator();
            while (target.MoveNext())
            {
                if (target.Current == null || !target.Current.Vessel || target.Current.isLanded || target.Current.isMissile || !target.Current.isThreat)
                {
                    continue;
                }
                Vector3 targetRelPos = target.Current.Vessel.vesselTransform.position - mf.vessel.vesselTransform.position;

                float distance, dot;
                distance = targetRelPos.magnitude;
                dot      = Vector3.Dot(targetRelPos.normalized, mf.vessel.ReferenceTransform.up);

                if (distance > maxDistance || cosAngleCheck > dot)
                {
                    continue;
                }

                float targetSuitability = dot;               //prefer targets ahead to those behind
                targetSuitability += 500 / (distance + 100); //same suitability check as above

                if (finalTarget != null && !(targetSuitability > finalTargetSuitability))
                {
                    continue;
                }
                //just pick the most suitable one
                finalTarget            = target.Current;
                finalTargetSuitability = targetSuitability;
            }
            target.Dispose();
            return(finalTarget);
        }
Esempio n. 15
0
        public static TargetInfo GetUnengagedMissileTarget(MissileFire mf)
        {
            BDArmorySetup.BDATeams team = mf.team ? BDArmorySetup.BDATeams.B : BDArmorySetup.BDATeams.A;

            List <TargetInfo> .Enumerator target = TargetDatabase[team].GetEnumerator();
            while (target.MoveNext())
            {
                if (target.Current == null)
                {
                    continue;
                }
                if (target.Current && target.Current.Vessel && mf.CanSeeTarget(target.Current) && target.Current.isMissile && target.Current.isThreat)
                {
                    if (target.Current.numFriendliesEngaging == 0)
                    {
                        return(target.Current);
                    }
                }
            }
            target.Dispose();
            return(null);
        }
Esempio n. 16
0
        public static TargetInfo GetClosestTarget(MissileFire mf)
        {
            BDArmorySetup.BDATeams team        = mf.team ? BDArmorySetup.BDATeams.B : BDArmorySetup.BDATeams.A;
            TargetInfo             finalTarget = null;

            List <TargetInfo> .Enumerator target = TargetDatabase[team].GetEnumerator();
            while (target.MoveNext())
            {
                if (target.Current == null)
                {
                    continue;
                }
                if (target.Current && target.Current.Vessel && mf.CanSeeTarget(target.Current) && !target.Current.isMissile)
                {
                    if (finalTarget == null || (target.Current.IsCloser(finalTarget, mf)))
                    {
                        finalTarget = target.Current;
                    }
                }
            }
            target.Dispose();
            return(finalTarget);
        }
Esempio n. 17
0
 void OnToggleTeam(MissileFire mf, BDArmorySetup.BDATeams team)
 {
     RefreshFriendlies();
     RefreshWingmen();
 }
Esempio n. 18
0
 void RemoveTarget(TargetInfo target, BDArmorySetup.BDATeams team)
 {
     TargetDatabase[team].Remove(target);
 }
Esempio n. 19
0
 public static BDArmorySetup.BDATeams OtherTeam(BDArmorySetup.BDATeams team)
 {
     return(team == BDArmorySetup.BDATeams.A ? BDArmorySetup.BDATeams.B : BDArmorySetup.BDATeams.A);
 }
Esempio n. 20
0
        void Awake()
        {
            if (!vessel)
            {
                vessel = GetComponent <Vessel>();
            }

            if (!vessel)
            {
                //Debug.Log ("[BDArmory]: TargetInfo was added to a non-vessel");
                Destroy(this);
                return;
            }

            //destroy this if a target info is already attached to the vessel
            IEnumerator otherInfo = vessel.gameObject.GetComponents <TargetInfo>().GetEnumerator();

            while (otherInfo.MoveNext())
            {
                if ((object)otherInfo.Current != this)
                {
                    Destroy(this);
                    return;
                }
            }

            team = BDArmorySetup.BDATeams.None;
            bool foundMf = false;

            List <MissileFire> .Enumerator mf = vessel.FindPartModulesImplementing <MissileFire>().GetEnumerator();
            while (mf.MoveNext())
            {
                foundMf       = true;
                team          = BDATargetManager.BoolToTeam(mf.Current.team);
                weaponManager = mf.Current;
                break;
            }
            mf.Dispose();

            if (!foundMf)
            {
                List <MissileBase> .Enumerator ml = vessel.FindPartModulesImplementing <MissileBase>().GetEnumerator();
                while (ml.MoveNext())
                {
                    isMissile         = true;
                    MissileBaseModule = ml.Current;
                    team = BDATargetManager.BoolToTeam(ml.Current.Team);
                    break;
                }
                ml.Dispose();
            }

            if (team != BDArmorySetup.BDATeams.None)
            {
                BDATargetManager.AddTarget(this);
            }

            friendliesEngaging = new List <MissileFire>();

            vessel.OnJustAboutToBeDestroyed += AboutToBeDestroyed;

            //add delegate to peace enable event
            BDArmorySetup.OnPeaceEnabled += OnPeaceEnabled;

            //lifeRoutine = StartCoroutine(LifetimeRoutine());              // TODO: CHECK BEHAVIOUR AND SIDE EFFECTS!

            if (!isMissile && team != BDArmorySetup.BDATeams.None)
            {
                GameEvents.onVesselPartCountChanged.Add(VesselModified);
                //massRoutine = StartCoroutine(MassRoutine());              // TODO: CHECK BEHAVIOUR AND SIDE EFFECTS!
            }
        }