示例#1
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);
            }
        }
示例#2
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);
            }
        }
示例#3
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);
                    }
                }
            }
        }
示例#4
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);
                    }
                }
            }
        }