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; } } }
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!"); } }
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; } } } } }
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; } } } } }
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; } } }
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; } } }
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); } }
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); } } } }
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()); } }