Ejemplo n.º 1
0
 protected void ReceiveRadarPing(Vessel v, Vector3 source, RadarWarningReceiver.RWRThreatTypes type, float persistTime)
 {
     if (TargetingMode == TargetingModes.AntiRad && TargetAcquired && v == vessel)
     {
         if ((source - VectorUtils.GetWorldSurfacePostion(targetGPSCoords, vessel.mainBody)).sqrMagnitude < Mathf.Pow(maxStaticLaunchRange / 4, 2) && //drastically increase update range for anti-radiation missile to track moving targets!
             Vector3.Angle(source - transform.position, GetForwardTransform()) < maxOffBoresight)
         {
             TargetAcquired     = true;
             TargetPosition     = source;
             targetGPSCoords    = VectorUtils.WorldPositionToGeoCoords(TargetPosition, vessel.mainBody);
             TargetVelocity     = Vector3.zero;
             TargetAcceleration = Vector3.zero;
             lockFailTimer      = 0;
         }
     }
 }
Ejemplo n.º 2
0
        public override void OnStart(StartState state)
        {
            base.OnStart(state);

            if (HighLogic.LoadedSceneIsFlight)
            {
                myVesselID = vessel.id.ToString();
                RadarUtils.SetupResources();

                if (string.IsNullOrEmpty(radarName))
                {
                    radarName = part.partInfo.title;
                }

                linkedToVessels = new List <VesselRadarData>();

                signalPersistTime = omnidirectional
                    ? 360 / (scanRotationSpeed + 5)
                    : directionalFieldOfView / (scanRotationSpeed + 5);

                rwrType = (RadarWarningReceiver.RWRThreatTypes)rwrThreatType;
                if (rwrType == RadarWarningReceiver.RWRThreatTypes.Sonar)
                {
                    signalPersistTimeForRwr = RadarUtils.ACTIVE_MISSILE_PING_PERISTS_TIME;
                }
                else
                {
                    signalPersistTimeForRwr = signalPersistTime / 2;
                }

                if (rotationTransformName != string.Empty)
                {
                    rotationTransform = part.FindModelTransform(rotationTransformName);
                }

                attemptedLocks = new TargetSignatureData[3];
                TargetSignatureData.ResetTSDArray(ref attemptedLocks);
                lockedTargets = new List <TargetSignatureData>();

                referenceTransform               = (new GameObject()).transform;
                referenceTransform.parent        = transform;
                referenceTransform.localPosition = Vector3.zero;

                List <ModuleTurret> .Enumerator turr = part.FindModulesImplementing <ModuleTurret>().GetEnumerator();
                while (turr.MoveNext())
                {
                    if (turr.Current == null)
                    {
                        continue;
                    }
                    if (turr.Current.turretID != turretID)
                    {
                        continue;
                    }
                    lockingTurret = turr.Current;
                    break;
                }
                turr.Dispose();

                //GameEvents.onVesselGoOnRails.Add(OnGoOnRails);    //not needed
                EnsureVesselRadarData();
                StartCoroutine(StartUpRoutine());
            }
            else if (HighLogic.LoadedSceneIsEditor)
            {
                //Editor only:
                List <ModuleTurret> .Enumerator tur = part.FindModulesImplementing <ModuleTurret>().GetEnumerator();
                while (tur.MoveNext())
                {
                    if (tur.Current == null)
                    {
                        continue;
                    }
                    if (tur.Current.turretID != turretID)
                    {
                        continue;
                    }
                    lockingTurret = tur.Current;
                    break;
                }
                tur.Dispose();
                if (lockingTurret)
                {
                    lockingTurret.Fields["minPitch"].guiActiveEditor = false;
                    lockingTurret.Fields["maxPitch"].guiActiveEditor = false;
                    lockingTurret.Fields["yawRange"].guiActiveEditor = false;
                }
            }

            // check for not updated legacy part:
            if ((canScan && (radarMinDistanceDetect == float.MaxValue)) || (canLock && (radarMinDistanceLockTrack == float.MaxValue)))
            {
                Debug.Log("[BDArmory]: WARNING: " + part.name + " has legacy definition, missing new radarDetectionCurve and radarLockTrackCurve definitions! Please update for the part to be usable!");
            }
        }
Ejemplo n.º 3
0
        public static void ScanInDirection(MissileFire myWpnManager, float directionAngle, Transform referenceTransform, float fov, Vector3 position, float minSignature, ref TargetSignatureData[] dataArray, float dataPersistTime, bool pingRWR, RadarWarningReceiver.RWRThreatTypes rwrType, bool radarSnapshot)
        {
            Vector3d geoPos        = VectorUtils.WorldPositionToGeoCoords(position, FlightGlobals.currentMainBody);
            Vector3  forwardVector = referenceTransform.forward;
            Vector3  upVector      = referenceTransform.up;      //VectorUtils.GetUpDirection(position);
            Vector3  lookDirection = Quaternion.AngleAxis(directionAngle, upVector) * forwardVector;

            int dataIndex = 0;

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

                if (myWpnManager)
                {
                    if (vessel == myWpnManager.vessel)
                    {
                        continue;                                                   //ignore self
                    }
                }
                else if ((vessel.transform.position - position).sqrMagnitude < 3600)
                {
                    continue;
                }

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

                if (Vector3.Angle(vesselDirection, lookDirection) < fov / 2)
                {
                    if (TerrainCheck(referenceTransform.position, vessel.transform.position))
                    {
                        continue;                                                                                          //blocked by terrain
                    }
                    float sig = float.MaxValue;
                    if (radarSnapshot && minSignature > 0)
                    {
                        sig = GetModifiedSignature(vessel, position);
                    }

                    RadarWarningReceiver.PingRWR(vessel, position, rwrType, dataPersistTime);

                    float detectSig = sig;

                    VesselECMJInfo vesselJammer = vessel.GetComponent <VesselECMJInfo>();
                    if (vesselJammer)
                    {
                        sig       *= vesselJammer.rcsReductionFactor;
                        detectSig += vesselJammer.jammerStrength;
                    }

                    if (detectSig > minSignature)
                    {
                        if (vessel.vesselType == VesselType.Debris)
                        {
                            vessel.gameObject.AddComponent <TargetInfo>();
                        }
                        else if (myWpnManager != null)
                        {
                            BDATargetManager.ReportVessel(vessel, myWpnManager);
                        }

                        while (dataIndex < dataArray.Length - 1)
                        {
                            if ((dataArray[dataIndex].exists && Time.time - dataArray[dataIndex].timeAcquired > dataPersistTime) || !dataArray[dataIndex].exists)
                            {
                                break;
                            }
                            dataIndex++;
                        }
                        if (dataIndex >= dataArray.Length)
                        {
                            break;
                        }
                        dataArray[dataIndex] = new TargetSignatureData(vessel, sig);
                        dataIndex++;
                        if (dataIndex >= dataArray.Length)
                        {
                            break;
                        }
                    }
                }
            }
        }
Ejemplo n.º 4
0
        public static void ScanInDirection(Ray ray, float fov, float minSignature, ref TargetSignatureData[] dataArray, float dataPersistTime, bool pingRWR, RadarWarningReceiver.RWRThreatTypes rwrType, bool radarSnapshot)
        {
            int dataIndex = 0;

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

                Vector3 vectorToTarget = vessel.transform.position - ray.origin;
                if ((vectorToTarget).sqrMagnitude < 10)
                {
                    continue;                                                    //ignore self
                }
                if (Vector3.Dot(vectorToTarget, ray.direction) < 0)
                {
                    continue;                                                                //ignore behind ray
                }
                if (Vector3.Angle(vessel.CoM - ray.origin, ray.direction) < fov / 2)
                {
                    if (TerrainCheck(ray.origin, vessel.transform.position))
                    {
                        continue;                                                                         //blocked by terrain
                    }
                    float sig = float.MaxValue;
                    if (radarSnapshot)
                    {
                        sig = GetModifiedSignature(vessel, ray.origin);
                    }

                    if (pingRWR && sig > minSignature * 0.66f)
                    {
                        RadarWarningReceiver.PingRWR(vessel, ray.origin, rwrType, dataPersistTime);
                    }

                    if (sig > minSignature)
                    {
                        while (dataIndex < dataArray.Length - 1)
                        {
                            if ((dataArray[dataIndex].exists && Time.time - dataArray[dataIndex].timeAcquired > dataPersistTime) || !dataArray[dataIndex].exists)
                            {
                                break;
                            }
                            dataIndex++;
                        }
                        if (dataIndex >= dataArray.Length)
                        {
                            break;
                        }
                        dataArray[dataIndex] = new TargetSignatureData(vessel, sig);
                        dataIndex++;
                        if (dataIndex >= dataArray.Length)
                        {
                            break;
                        }
                    }
                }
            }
        }
Ejemplo n.º 5
0
        public override void OnStart(StartState state)
        {
            base.OnStart(state);

            if (HighLogic.LoadedSceneIsFlight)
            {
                myVesselID = vessel.id.ToString();
                RadarUtils.SetupRadarCamera();

                if (string.IsNullOrEmpty(radarName))
                {
                    radarName = part.partInfo.title;
                }

                linkedToVessels = new List <VesselRadarData>();


                //rIncrements = Misc.ParseToFloatArray(rangeIncrements);
                //rangeIndex = Mathf.Clamp(rangeIndex, 0, rIncrements.Length-1);
                //maxRange = rIncrements[rIncrements.Length-1];
                signalPersistTime = omnidirectional
                    ? 360 / (scanRotationSpeed + 5)
                    : directionalFieldOfView / (scanRotationSpeed + 5);

                if (rotationTransformName != string.Empty)
                {
                    rotationTransform = part.FindModelTransform(rotationTransformName);
                }


                //lockedTarget = TargetSignatureData.noTarget;


                attemptedLocks = new TargetSignatureData[3];
                TargetSignatureData.ResetTSDArray(ref attemptedLocks);

                lockedTargets = new List <TargetSignatureData>();

                referenceTransform               = (new GameObject()).transform;
                referenceTransform.parent        = transform;
                referenceTransform.localPosition = Vector3.zero;

                foreach (var tur in part.FindModulesImplementing <ModuleTurret>())
                {
                    if (tur.turretID == turretID)
                    {
                        lockingTurret = tur;
                        break;
                    }
                }

                rwrType = (RadarWarningReceiver.RWRThreatTypes)rwrThreatType;


                foreach (var wm in vessel.FindPartModulesImplementing <MissileFire>())
                {
                    wm.radars.Add(this);
                }

                GameEvents.onVesselGoOnRails.Add(OnGoOnRails);


                EnsureVesselRadarData();

                StartCoroutine(StartUpRoutine());
            }

            if (HighLogic.LoadedSceneIsEditor)
            {
                foreach (var tur in part.FindModulesImplementing <ModuleTurret>())
                {
                    if (tur.turretID == turretID)
                    {
                        lockingTurret = tur;
                        break;
                    }
                }

                if (lockingTurret)
                {
                    lockingTurret.Fields["minPitch"].guiActiveEditor = false;
                    lockingTurret.Fields["maxPitch"].guiActiveEditor = false;
                    lockingTurret.Fields["yawRange"].guiActiveEditor = false;
                }
            }
        }
Ejemplo n.º 6
0
        public override void OnStart(StartState state)
        {
            base.OnStart (state);

            if(HighLogic.LoadedSceneIsFlight)
            {
                myVesselID = vessel.id.ToString();
                RadarUtils.SetupRadarCamera();

                if(string.IsNullOrEmpty(radarName))
                {
                    radarName = part.partInfo.title;
                }

                linkedToVessels = new List<VesselRadarData>();

                //rIncrements = Misc.ParseToFloatArray(rangeIncrements);
                //rangeIndex = Mathf.Clamp(rangeIndex, 0, rIncrements.Length-1);
                //maxRange = rIncrements[rIncrements.Length-1];
                signalPersistTime = omnidirectional ? 360/(scanRotationSpeed+5) : directionalFieldOfView/(scanRotationSpeed+5);

                if(rotationTransformName!=string.Empty)
                {
                    rotationTransform = part.FindModelTransform(rotationTransformName);
                }

                //lockedTarget = TargetSignatureData.noTarget;

                attemptedLocks = new TargetSignatureData[3];
                TargetSignatureData.ResetTSDArray(ref attemptedLocks);

                lockedTargets = new List<TargetSignatureData>();

                referenceTransform = (new GameObject()).transform;
                referenceTransform.parent = transform;
                referenceTransform.localPosition = Vector3.zero;

                foreach(var tur in part.FindModulesImplementing<ModuleTurret>())
                {
                    if(tur.turretID == turretID)
                    {
                        lockingTurret = tur;
                        break;
                    }
                }

                rwrType = (RadarWarningReceiver.RWRThreatTypes) rwrThreatType;

                foreach(var wm in vessel.FindPartModulesImplementing<MissileFire>())
                {
                    wm.radars.Add(this);
                }

                GameEvents.onVesselGoOnRails.Add(OnGoOnRails);

                EnsureVesselRadarData();

                StartCoroutine(StartUpRoutine());
            }

            if(HighLogic.LoadedSceneIsEditor)
            {
                foreach(var tur in part.FindModulesImplementing<ModuleTurret>())
                {
                    if(tur.turretID == turretID)
                    {
                        lockingTurret = tur;
                        break;
                    }
                }

                if(lockingTurret)
                {
                    lockingTurret.Fields["minPitch"].guiActiveEditor = false;
                    lockingTurret.Fields["maxPitch"].guiActiveEditor = false;
                    lockingTurret.Fields["yawRange"].guiActiveEditor = false;
                }
            }
        }
Ejemplo n.º 7
0
        public static void UpdateRadarLock(Ray ray, Vector3 predictedPos, float fov, float minSignature, ModuleRadar radar, bool pingRWR, bool radarSnapshot, float dataPersistTime, bool locked, int lockIndex, Vessel lockedVessel)
        {
            RadarWarningReceiver.RWRThreatTypes rwrType = radar.rwrType;
            //Vessel lockedVessel = null;
            float closestSqrDist = 100;

            if (lockedVessel == null)
            {
                foreach (var vessel in BDATargetManager.LoadedVessels)
                {
                    if (vessel == null)
                    {
                        continue;
                    }
                    if (!vessel.loaded)
                    {
                        continue;
                    }
                    //if(vessel.Landed) continue;

                    Vector3 vectorToTarget = vessel.transform.position - ray.origin;
                    if ((vectorToTarget).sqrMagnitude < 10)
                    {
                        continue;                                                        //ignore self
                    }
                    if (Vector3.Dot(vectorToTarget, ray.direction) < 0)
                    {
                        continue;                                                                    //ignore behind ray
                    }
                    if (Vector3.Angle(vessel.CoM - ray.origin, ray.direction) < fov / 2)
                    {
                        float sqrDist = Vector3.SqrMagnitude(vessel.CoM - predictedPos);
                        if (sqrDist < closestSqrDist)
                        {
                            closestSqrDist = sqrDist;
                            lockedVessel   = vessel;
                        }
                    }
                }
            }

            if (lockedVessel != null)
            {
                if (TerrainCheck(ray.origin, lockedVessel.transform.position))
                {
                    radar.UnlockTargetAt(lockIndex, true);                     //blocked by terrain
                    return;
                }

                float sig = float.MaxValue;
                if (radarSnapshot)
                {
                    sig = GetModifiedSignature(lockedVessel, ray.origin);
                }

                if (pingRWR && sig > minSignature * 0.66f)
                {
                    RadarWarningReceiver.PingRWR(lockedVessel, ray.origin, rwrType, dataPersistTime);
                }

                if (sig > minSignature)
                {
                    //radar.vesselRadarData.AddRadarContact(radar, new TargetSignatureData(lockedVessel, sig), locked);
                    radar.ReceiveContactData(new TargetSignatureData(lockedVessel, sig), locked);
                }
                else
                {
                    radar.UnlockTargetAt(lockIndex, true);
                    return;
                }
            }
            else
            {
                radar.UnlockTargetAt(lockIndex, true);
            }
        }
Ejemplo n.º 8
0
        public static void UpdateRadarLock(MissileFire myWpnManager, float directionAngle, Transform referenceTransform, float fov, Vector3 position, float minSignature, ModuleRadar radar, bool pingRWR, RadarWarningReceiver.RWRThreatTypes rwrType, bool radarSnapshot)
        {
            Vector3d geoPos        = VectorUtils.WorldPositionToGeoCoords(position, FlightGlobals.currentMainBody);
            Vector3  forwardVector = referenceTransform.forward;
            Vector3  upVector      = referenceTransform.up;      //VectorUtils.GetUpDirection(position);
            Vector3  lookDirection = Quaternion.AngleAxis(directionAngle, upVector) * forwardVector;

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

                if (myWpnManager)
                {
                    if (vessel == myWpnManager.vessel)
                    {
                        continue;                                                   //ignore self
                    }
                }
                else if ((vessel.transform.position - position).sqrMagnitude < 3600)
                {
                    continue;
                }

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

                if (Vector3.Angle(vesselDirection, lookDirection) < fov / 2)
                {
                    if (TerrainCheck(referenceTransform.position, vessel.transform.position))
                    {
                        continue;                                                                                          //blocked by terrain
                    }
                    float sig = float.MaxValue;
                    if (radarSnapshot && minSignature > 0)
                    {
                        sig = GetModifiedSignature(vessel, position);
                    }

                    RadarWarningReceiver.PingRWR(vessel, position, rwrType, radar.signalPersistTime);

                    float detectSig = sig;

                    VesselECMJInfo vesselJammer = vessel.GetComponent <VesselECMJInfo>();
                    if (vesselJammer)
                    {
                        sig       *= vesselJammer.rcsReductionFactor;
                        detectSig += vesselJammer.jammerStrength;
                    }

                    if (detectSig > minSignature)
                    {
                        if (vessel.vesselType == VesselType.Debris)
                        {
                            vessel.gameObject.AddComponent <TargetInfo>();
                        }
                        else if (myWpnManager != null)
                        {
                            BDATargetManager.ReportVessel(vessel, myWpnManager);
                        }

                        //radar.vesselRadarData.AddRadarContact(radar, new TargetSignatureData(vessel, detectSig), false);
                        radar.ReceiveContactData(new TargetSignatureData(vessel, detectSig), false);
                    }
                }
            }
        }
Ejemplo n.º 9
0
        public override void OnStart(StartState state)
        {
            base.OnStart (state);

            if(HighLogic.LoadedSceneIsFlight)
            {
                RadarUtils.SetupRadarCamera();

                distanceStyle = new GUIStyle();
                distanceStyle.normal.textColor = new Color(0,1,0,0.75f);
                distanceStyle.alignment = TextAnchor.UpperLeft;

                lockStyle = new GUIStyle();
                lockStyle.normal.textColor = new Color(0,1,0,0.75f);
                lockStyle.alignment = TextAnchor.LowerCenter;
                lockStyle.fontSize = 16;

                radarTopStyle = new GUIStyle();
                radarTopStyle.normal.textColor = new Color(0, 1, 0, 0.65f);
                radarTopStyle.alignment = TextAnchor.UpperCenter;
                radarTopStyle.fontSize = 12;

                rIncrements = Misc.ParseToFloatArray(rangeIncrements);
                rangeIndex = Mathf.Clamp(rangeIndex, 0, rIncrements.Length-1);
                maxRange = rIncrements[rIncrements.Length-1];
                signalPersistTime = omnidirectional ? 360/(scanRotationSpeed+5) : directionalFieldOfView/(scanRotationSpeed+5);

                if(rotationTransformName!=string.Empty)
                {
                    rotationTransform = part.FindModelTransform(rotationTransformName);
                }

                if(!radarRectInitialized)
                {
                    float width = radarScreenSize + (2*windowBorder);
                    float height = radarScreenSize + (2*windowBorder) + headerHeight + controlsHeight;
                    radarWindowRect = new Rect(Screen.width - width, Screen.height - height, width, height);
                    radarRectInitialized = true;
                }

                lockedTarget = TargetSignatureData.noTarget;

                contacts = new TargetSignatureData[10];
                TargetSignatureData.ResetTSDArray(ref contacts);

                attemptedLocks = new TargetSignatureData[3];
                TargetSignatureData.ResetTSDArray(ref attemptedLocks);

                referenceTransform = (new GameObject()).transform;
                referenceTransform.parent = transform;
                referenceTransform.localPosition = Vector3.zero;

                lockingTurret = part.FindModuleImplementing<ModuleTurret> ();

                rwrType = (RadarWarningReceiver.RWRThreatTypes) rwrThreatType;

                unlinkNullRadar = false;

                foreach(var wm in vessel.FindPartModulesImplementing<MissileFire>())
                {
                    wm.radars.Add(this);
                }

                StartCoroutine(StartUpRoutine());

            }
        }