public void LinkVRD(VesselRadarData vrd) { if(!externalVRDs.Contains(vrd)) { externalVRDs.Add(vrd); } foreach(var mr in vrd.availableRadars) { LinkToRadar(mr); } SaveExternalVRDVessels(); }
IEnumerator LinkVRDWhenReady(VesselRadarData vrd) { while(!vrd.radarsReady || vrd.vessel.packed || vrd.radarCount < 1) { yield return null; } LinkVRD(vrd); Debug.Log("Radar data link recovered: Local - " + vessel.vesselName + ", External - " + vrd.vessel.vesselName); }
void UnlinkVRD(VesselRadarData vrd) { Debug.Log("Unlinking VRD: " + vrd.vessel.vesselName); externalVRDs.Remove(vrd); List<ModuleRadar> radarsToUnlink = new List<ModuleRadar>(); foreach(var mr in availableRadars) { if(mr.vesselRadarData == vrd) { radarsToUnlink.Add(mr); } } foreach(var mr in radarsToUnlink) { Debug.Log(" - Unlinking radar: " + mr.radarName); UnlinkRadar(mr); } SaveExternalVRDVessels(); }
void EnsureVesselRadarData() { myVesselID = vessel.id.ToString(); if(vesselRadarData == null || vesselRadarData.vessel!=vessel) { vesselRadarData = vessel.gameObject.GetComponent<VesselRadarData>(); if(vesselRadarData == null) { vesselRadarData = vessel.gameObject.AddComponent<VesselRadarData>(); vesselRadarData.weaponManager = weaponManager; } } }
public void RemoveExternalVRD(VesselRadarData vrd) { linkedToVessels.Remove(vrd); }
public void AddExternalVRD(VesselRadarData vrd) { if(!linkedToVessels.Contains(vrd)) { linkedToVessels.Add(vrd); } }
void UpdateRadarTarget() { targetAcquired = false; float angleToTarget = Vector3.Angle(radarTarget.predictedPosition-transform.position,transform.forward); if(radarTarget.exists) { if(!activeRadar && ((radarTarget.predictedPosition - transform.position).sqrMagnitude > Mathf.Pow(activeRadarRange, 2) || angleToTarget > maxOffBoresight * 0.75f)) { if(vrd) { TargetSignatureData t = TargetSignatureData.noTarget; List<TargetSignatureData> possibleTargets = vrd.GetLockedTargets(); for(int i = 0; i < possibleTargets.Count; i++) { if(possibleTargets[i].vessel == radarTarget.vessel) { t = possibleTargets[i]; } } if(t.exists) { targetAcquired = true; radarTarget = t; targetPosition = radarTarget.predictedPosition; targetVelocity = radarTarget.velocity; targetAcceleration = radarTarget.acceleration; radarFailTimer = 0; return; } else { if(radarFailTimer > maxRadarFailTime) { Debug.Log("Semi-Active Radar guidance failed. Parent radar lost target."); radarTarget = TargetSignatureData.noTarget; legacyTargetVessel = null; return; } else { if(radarFailTimer == 0) { Debug.Log("Semi-Active Radar guidance failed - waiting for data"); } radarFailTimer += Time.fixedDeltaTime; radarTarget.timeAcquired = Time.time; radarTarget.position = radarTarget.predictedPosition; targetPosition = radarTarget.predictedPosition; targetVelocity = radarTarget.velocity; targetAcceleration = Vector3.zero; targetAcquired = true; } } } else { Debug.Log("Semi-Active Radar guidance failed. Out of range and no data feed."); radarTarget = TargetSignatureData.noTarget; legacyTargetVessel = null; return; } } else { vrd = null; if(angleToTarget > maxOffBoresight) { Debug.Log("Radar guidance failed. Target is out of active seeker gimbal limits."); radarTarget = TargetSignatureData.noTarget; legacyTargetVessel = null; return; } else { if(scannedTargets == null) scannedTargets = new TargetSignatureData[5]; TargetSignatureData.ResetTSDArray(ref scannedTargets); Ray ray = new Ray(transform.position, radarTarget.predictedPosition - transform.position); bool pingRWR = Time.time - lastRWRPing > 0.4f; if(pingRWR) lastRWRPing = Time.time; bool radarSnapshot = (snapshotTicker > 20); if(radarSnapshot) { snapshotTicker = 0; } else { snapshotTicker++; } RadarUtils.UpdateRadarLock(ray, lockedSensorFOV, activeRadarMinThresh, ref scannedTargets, 0.4f, pingRWR, RadarWarningReceiver.RWRThreatTypes.MissileLock, radarSnapshot); float sqrThresh = radarLOALSearching ? Mathf.Pow(500, 2) : Mathf.Pow(40, 2); if(radarLOAL && radarLOALSearching && !radarSnapshot) { //only scan on snapshot interval } else { for(int i = 0; i < scannedTargets.Length; i++) { if(scannedTargets[i].exists && (scannedTargets[i].predictedPosition - radarTarget.predictedPosition).sqrMagnitude < sqrThresh) { radarTarget = scannedTargets[i]; targetAcquired = true; radarLOALSearching = false; targetPosition = radarTarget.predictedPosition + (radarTarget.velocity * Time.fixedDeltaTime); targetVelocity = radarTarget.velocity; targetAcceleration = radarTarget.acceleration; radarFailTimer = 0; if(!activeRadar && Time.time - timeFired > 1) { if(locksCount == 0) { RadarWarningReceiver.PingRWR(ray, lockedSensorFOV, RadarWarningReceiver.RWRThreatTypes.MissileLaunch, 2f); Debug.Log("Pitbull! Radar missile has gone active. Radar sig strength: " + radarTarget.signalStrength.ToString("0.0")); } else if(locksCount > 2) { guidanceActive = false; checkMiss = true; if(BDArmorySettings.DRAW_DEBUG_LABELS) { Debug.Log("Radar missile reached max re-lock attempts."); } } locksCount++; } activeRadar = true; return; } } } if(radarLOAL) { radarLOALSearching = true; targetAcquired = true; targetPosition = radarTarget.predictedPosition + (radarTarget.velocity * Time.fixedDeltaTime); targetVelocity = radarTarget.velocity; targetAcceleration = Vector3.zero; activeRadar = false; } else { radarTarget = TargetSignatureData.noTarget; } } } } else if(radarLOAL && radarLOALSearching) { if(scannedTargets == null) scannedTargets = new TargetSignatureData[5]; TargetSignatureData.ResetTSDArray(ref scannedTargets); Ray ray = new Ray(transform.position, transform.forward); bool pingRWR = Time.time - lastRWRPing > 0.4f; if(pingRWR) lastRWRPing = Time.time; bool radarSnapshot = (snapshotTicker > 6); if(radarSnapshot) { snapshotTicker = 0; } else { snapshotTicker++; } RadarUtils.UpdateRadarLock(ray, lockedSensorFOV*3, activeRadarMinThresh*2, ref scannedTargets, 0.4f, pingRWR, RadarWarningReceiver.RWRThreatTypes.MissileLock, radarSnapshot); float sqrThresh = Mathf.Pow(300, 2); float smallestAngle = 360; TargetSignatureData lockedTarget = TargetSignatureData.noTarget; for(int i = 0; i < scannedTargets.Length; i++) { if(scannedTargets[i].exists && (scannedTargets[i].predictedPosition - radarTarget.predictedPosition).sqrMagnitude < sqrThresh) { float angle = Vector3.Angle(scannedTargets[i].predictedPosition - transform.position, transform.forward); if(angle < smallestAngle) { lockedTarget = scannedTargets[i]; smallestAngle = angle; } activeRadar = true; return; } } if(lockedTarget.exists) { radarTarget = lockedTarget; targetAcquired = true; radarLOALSearching = false; targetPosition = radarTarget.predictedPosition + (radarTarget.velocity * Time.fixedDeltaTime); targetVelocity = radarTarget.velocity; targetAcceleration = radarTarget.acceleration; if(!activeRadar && Time.time - timeFired > 1) { RadarWarningReceiver.PingRWR(new Ray(transform.position, radarTarget.predictedPosition - transform.position), lockedSensorFOV, RadarWarningReceiver.RWRThreatTypes.MissileLaunch, 2f); Debug.Log("Pitbull! Radar missile has gone active. Radar sig strength: " + radarTarget.signalStrength.ToString("0.0")); } return; } else { targetAcquired = true; targetPosition = transform.position + (startDirection * 500); targetVelocity = Vector3.zero; targetAcceleration = Vector3.zero; radarLOALSearching = true; return; } } if(!radarTarget.exists) { legacyTargetVessel = null; } }