Exemple #1
0
        /// <summary>
        /// Scans for targets in direction with field of view.
        /// Returns the direction scanned for debug 
        /// </summary>
        /// <returns>The scan direction.</returns>
        /// <param name="myWpnManager">My wpn manager.</param>
        /// <param name="directionAngle">Direction angle.</param>
        /// <param name="referenceTransform">Reference transform.</param>
        /// <param name="fov">Fov.</param>
        /// <param name="results">Results.</param>
        /// <param name="maxDistance">Max distance.</param>
        public static Vector3 GuardScanInDirection(MissileFire myWpnManager, float directionAngle, Transform referenceTransform, float fov, out ViewScanResults results, float maxDistance)
        {
            fov *= 1.1f;
            results = new ViewScanResults();
            results.foundMissile = false;
            results.foundHeatMissile = false;
            results.foundRadarMissile = false;
            results.foundAGM = false;
            results.firingAtMe = false;
            results.missileThreatDistance = float.MaxValue;

            if(!myWpnManager || !referenceTransform)
            {
                return Vector3.zero;
            }

            Vector3 position = referenceTransform.position;
            Vector3d geoPos = VectorUtils.WorldPositionToGeoCoords(position, FlightGlobals.currentMainBody);
            Vector3 forwardVector = referenceTransform.forward;
            Vector3 upVector = referenceTransform.up;
            Vector3 lookDirection = Quaternion.AngleAxis(directionAngle, upVector) * forwardVector;

            foreach(var vessel in BDATargetManager.LoadedVessels)
            {
                if(vessel == null) continue;

                if(vessel.loaded)
                {
                    if(vessel == myWpnManager.vessel) continue; //ignore self

                    Vector3 vesselProjectedDirection = Vector3.ProjectOnPlane(vessel.transform.position-position, upVector);
                    Vector3 vesselDirection = vessel.transform.position - position;

                    if(Vector3.Dot(vesselDirection, lookDirection) < 0) continue;

                    float vesselDistance = (vessel.transform.position - position).magnitude;

                    if(vesselDistance < maxDistance && Vector3.Angle(vesselProjectedDirection, lookDirection) < fov / 2 && Vector3.Angle(vessel.transform.position-position, -myWpnManager.transform.forward) < myWpnManager.guardAngle/2)
                    {
                        //Debug.Log("Found vessel: " + vessel.vesselName);
                        if(TerrainCheck(referenceTransform.position, vessel.transform.position)) continue; //blocked by terrain

                        BDATargetManager.ReportVessel(vessel, myWpnManager);

                        TargetInfo tInfo;
                        if((tInfo = vessel.GetComponent<TargetInfo>()))
                        {
                            if(tInfo.isMissile)
                            {
                                MissileLauncher missile;
                                if(missile = tInfo.missileModule)
                                {
                                    results.foundMissile = true;
                                    Vector3 vectorFromMissile = myWpnManager.vessel.CoM - missile.part.transform.position;
                                    Vector3 relV = missile.vessel.srf_velocity - myWpnManager.vessel.srf_velocity;
                                    bool approaching = Vector3.Dot(relV, vectorFromMissile) > 0;
                                    if(missile.hasFired && missile.timeIndex > 1 && approaching && (missile.targetPosition - (myWpnManager.vessel.CoM + (myWpnManager.vessel.rb_velocity * Time.fixedDeltaTime))).sqrMagnitude < 3600)
                                    {
                                        //Debug.Log("found missile targeting me");
                                        if(missile.targetingMode == MissileLauncher.TargetingModes.Heat)
                                        {
                                            results.foundHeatMissile = true;
                                            results.missileThreatDistance = Mathf.Min(results.missileThreatDistance, Vector3.Distance(missile.part.transform.position, myWpnManager.part.transform.position));
                                            results.threatPosition = missile.transform.position;
                                            break;
                                        }
                                        else if(missile.targetingMode == MissileLauncher.TargetingModes.Radar)
                                        {
                                            results.foundRadarMissile = true;
                                            results.missileThreatDistance = Mathf.Min(results.missileThreatDistance, Vector3.Distance(missile.part.transform.position, myWpnManager.part.transform.position));
                                            results.threatPosition = missile.transform.position;
                                        }
                                        else if(missile.targetingMode == MissileLauncher.TargetingModes.Laser)
                                        {
                                            results.foundAGM = true;
                                            results.missileThreatDistance = Mathf.Min(results.missileThreatDistance, Vector3.Distance(missile.part.transform.position, myWpnManager.part.transform.position));
                                            break;
                                        }
                                    }
                                    else
                                    {
                                        break;
                                    }
                                }
                            }
                            else
                            {
                                //check if its shooting guns at me
                                if(!results.firingAtMe)
                                {
                                    foreach(var weapon in vessel.FindPartModulesImplementing<ModuleWeapon>())
                                    {
                                        if(!weapon.isFiring) continue;
                                        if(Vector3.Dot(weapon.fireTransforms[0].forward, vesselDirection) > 0) continue;

                                        if(Vector3.Angle(weapon.fireTransforms[0].forward, -vesselDirection) < 6500 / vesselDistance)
                                        {
                                            results.firingAtMe = true;
                                            results.threatPosition = weapon.vessel.transform.position;
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
            }

            return lookDirection;
        }
Exemple #2
0
        /// <summary>
        /// Scans for targets in direction with field of view.
        /// Returns the direction scanned for debug
        /// </summary>
        /// <returns>The scan direction.</returns>
        /// <param name="myWpnManager">My wpn manager.</param>
        /// <param name="directionAngle">Direction angle.</param>
        /// <param name="referenceTransform">Reference transform.</param>
        /// <param name="fov">Fov.</param>
        /// <param name="results">Results.</param>
        /// <param name="maxDistance">Max distance.</param>
        public static Vector3 GuardScanInDirection(MissileFire myWpnManager, float directionAngle, Transform referenceTransform, float fov, out ViewScanResults results, float maxDistance)
        {
            results = new ViewScanResults();
            results.foundMissile     = false;
            results.foundHeatMissile = false;
            results.foundAGM         = false;
            results.firingAtMe       = false;

            if (!myWpnManager || !referenceTransform)
            {
                return(Vector3.zero);
            }

            Vector3  position      = referenceTransform.position;
            Vector3d geoPos        = VectorUtils.WorldPositionToGeoCoords(position, FlightGlobals.currentMainBody);
            Vector3  forwardVector = referenceTransform.forward;
            Vector3  upVector      = referenceTransform.up;
            Vector3  lookDirection = Quaternion.AngleAxis(directionAngle, upVector) * forwardVector;



            foreach (var vessel in BDATargetManager.LoadedVessels)
            {
                if (vessel == null)
                {
                    continue;
                }

                if (vessel.loaded)
                {
                    if (vessel == myWpnManager.vessel)
                    {
                        continue;                                                   //ignore self
                    }
                    Vector3 vesselProjectedDirection = Vector3.ProjectOnPlane(vessel.transform.position - position, upVector);
                    Vector3 vesselDirection          = vessel.transform.position - position;


                    if (Vector3.Dot(vesselDirection, lookDirection) < 0)
                    {
                        continue;
                    }

                    float vesselDistance = (vessel.transform.position - position).magnitude;

                    if (vesselDistance < maxDistance && Vector3.Angle(vesselProjectedDirection, lookDirection) < fov / 2 && Vector3.Angle(vessel.transform.position - position, -myWpnManager.transform.forward) < myWpnManager.guardAngle / 2)
                    {
                        //Debug.Log("Found vessel: " + vessel.vesselName);
                        if (TerrainCheck(referenceTransform.position, vessel.transform.position))
                        {
                            continue;                                                                                              //blocked by terrain
                        }
                        BDATargetManager.ReportVessel(vessel, myWpnManager);

                        TargetInfo tInfo;
                        if ((tInfo = vessel.GetComponent <TargetInfo>()))
                        {
                            if (tInfo.isMissile)
                            {
                                MissileLauncher missile;
                                if (missile = tInfo.missileModule)
                                {
                                    results.foundMissile = true;
                                    if (missile.hasFired && (missile.targetPosition - (myWpnManager.vessel.CoM + (myWpnManager.vessel.rb_velocity * Time.fixedDeltaTime))).sqrMagnitude < 3600)
                                    {
                                        //Debug.Log("found missile targeting me");
                                        if (missile.targetingMode == MissileLauncher.TargetingModes.Heat)
                                        {
                                            results.foundHeatMissile = true;
                                            break;
                                        }
                                        else if (missile.targetingMode == MissileLauncher.TargetingModes.Laser)
                                        {
                                            results.foundAGM = true;
                                            break;
                                        }
                                    }
                                    else
                                    {
                                        break;
                                    }
                                }
                            }
                            else
                            {
                                //check if its shooting guns at me
                                if (!results.firingAtMe)
                                {
                                    foreach (var weapon in vessel.FindPartModulesImplementing <ModuleWeapon>())
                                    {
                                        if (!weapon.isFiring)
                                        {
                                            continue;
                                        }
                                        if (Vector3.Dot(weapon.fireTransforms[0].forward, vesselDirection) > 0)
                                        {
                                            continue;
                                        }

                                        if (Vector3.Angle(weapon.fireTransforms[0].forward, -vesselDirection) < 6500 / vesselDistance)
                                        {
                                            results.firingAtMe = true;
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
            }

            return(lookDirection);
        }
Exemple #3
0
        /// <summary>
        /// Scans for targets in direction with field of view.
        /// Returns the direction scanned for debug
        /// </summary>
        /// <returns>The scan direction.</returns>
        /// <param name="myWpnManager">My wpn manager.</param>
        /// <param name="directionAngle">Direction angle.</param>
        /// <param name="referenceTransform">Reference transform.</param>
        /// <param name="fov">Fov.</param>
        /// <param name="results">Results.</param>
        /// <param name="maxDistance">Max distance.</param>
        public static Vector3 GuardScanInDirection(MissileFire myWpnManager, float directionAngle, Transform referenceTransform, float fov, out ViewScanResults results, float maxDistance)
        {
            fov    *= 1.1f;
            results = new ViewScanResults();
            results.foundMissile          = false;
            results.foundHeatMissile      = false;
            results.foundRadarMissile     = false;
            results.foundAGM              = false;
            results.firingAtMe            = false;
            results.missileThreatDistance = float.MaxValue;
            results.threatVessel          = null;
            results.threatWeaponManager   = null;

            if (!myWpnManager || !referenceTransform)
            {
                return(Vector3.zero);
            }

            Vector3  position      = referenceTransform.position;
            Vector3d geoPos        = VectorUtils.WorldPositionToGeoCoords(position, FlightGlobals.currentMainBody);
            Vector3  forwardVector = referenceTransform.forward;
            Vector3  upVector      = referenceTransform.up;
            Vector3  lookDirection = Quaternion.AngleAxis(directionAngle, upVector) * forwardVector;



            foreach (var vessel in BDATargetManager.LoadedVessels)
            {
                if (vessel == null)
                {
                    continue;
                }

                if (vessel.loaded)
                {
                    if (vessel == myWpnManager.vessel)
                    {
                        continue;                                                   //ignore self
                    }
                    Vector3 vesselProjectedDirection = Vector3.ProjectOnPlane(vessel.transform.position - position, upVector);
                    Vector3 vesselDirection          = vessel.transform.position - position;


                    if (Vector3.Dot(vesselDirection, lookDirection) < 0)
                    {
                        continue;
                    }

                    float vesselDistance = (vessel.transform.position - position).magnitude;

                    if (vesselDistance < maxDistance && Vector3.Angle(vesselProjectedDirection, lookDirection) < fov / 2 && Vector3.Angle(vessel.transform.position - position, -myWpnManager.transform.forward) < myWpnManager.guardAngle / 2)
                    {
                        //Debug.Log("Found vessel: " + vessel.vesselName);
                        if (TerrainCheck(referenceTransform.position, vessel.transform.position))
                        {
                            continue;                                                                                              //blocked by terrain
                        }
                        BDATargetManager.ReportVessel(vessel, myWpnManager);

                        TargetInfo tInfo;
                        if ((tInfo = vessel.GetComponent <TargetInfo>()))
                        {
                            if (tInfo.isMissile)
                            {
                                MissileLauncher missile;
                                if (missile = tInfo.missileModule)
                                {
                                    results.foundMissile = true;
                                    results.threatVessel = missile.vessel;
                                    Vector3 vectorFromMissile = myWpnManager.vessel.CoM - missile.part.transform.position;
                                    Vector3 relV        = missile.vessel.srf_velocity - myWpnManager.vessel.srf_velocity;
                                    bool    approaching = Vector3.Dot(relV, vectorFromMissile) > 0;
                                    if (missile.hasFired && missile.timeIndex > 1 && approaching && (missile.targetPosition - (myWpnManager.vessel.CoM + (myWpnManager.vessel.rb_velocity * Time.fixedDeltaTime))).sqrMagnitude < 3600)
                                    {
                                        if (missile.targetingMode == MissileLauncher.TargetingModes.Heat)
                                        {
                                            results.foundHeatMissile      = true;
                                            results.missileThreatDistance = Mathf.Min(results.missileThreatDistance, Vector3.Distance(missile.part.transform.position, myWpnManager.part.transform.position));
                                            results.threatPosition        = missile.transform.position;
                                            break;
                                        }
                                        else if (missile.targetingMode == MissileLauncher.TargetingModes.Radar)
                                        {
                                            results.foundRadarMissile     = true;
                                            results.missileThreatDistance = Mathf.Min(results.missileThreatDistance, Vector3.Distance(missile.part.transform.position, myWpnManager.part.transform.position));
                                            results.threatPosition        = missile.transform.position;
                                        }
                                        else if (missile.targetingMode == MissileLauncher.TargetingModes.Laser)
                                        {
                                            results.foundAGM = true;
                                            results.missileThreatDistance = Mathf.Min(results.missileThreatDistance, Vector3.Distance(missile.part.transform.position, myWpnManager.part.transform.position));
                                            break;
                                        }
                                    }
                                    else
                                    {
                                        break;
                                    }
                                }
                            }
                            else
                            {
                                //check if its shooting guns at me
                                //if(!results.firingAtMe)       //more work, but we can't afford to be incorrect picking the closest threat
                                //{
                                foreach (var weapon in vessel.FindPartModulesImplementing <ModuleWeapon>())
                                {
                                    if (!weapon.recentlyFiring)
                                    {
                                        continue;
                                    }
                                    if (Vector3.Dot(weapon.fireTransforms[0].forward, vesselDirection) > 0)
                                    {
                                        continue;
                                    }

                                    if (Vector3.Angle(weapon.fireTransforms[0].forward, -vesselDirection) < 6500 / vesselDistance && (!results.firingAtMe || (weapon.vessel.ReferenceTransform.position - position).magnitude < (results.threatPosition - position).magnitude))
                                    {
                                        results.firingAtMe          = true;
                                        results.threatPosition      = weapon.vessel.transform.position;
                                        results.threatVessel        = weapon.vessel;
                                        results.threatWeaponManager = weapon.weaponManager;
                                        break;
                                    }
                                }
                                //}
                            }
                        }
                    }
                }
            }

            return(lookDirection);
        }