public override void OnStart(StartState state) { if (HighLogic.LoadedSceneIsFlight) { pingsData = new TargetSignatureData[dataCount]; pingWorldPositions = new Vector3[dataCount]; TargetSignatureData.ResetTSDArray(ref pingsData); launchWarnings = new List <TargetSignatureData>(); rwrIconLabelStyle = new GUIStyle(); rwrIconLabelStyle.alignment = TextAnchor.MiddleCenter; rwrIconLabelStyle.normal.textColor = Color.green; rwrIconLabelStyle.fontSize = 12; rwrIconLabelStyle.border = new RectOffset(0, 0, 0, 0); rwrIconLabelStyle.clipping = TextClipping.Overflow; rwrIconLabelStyle.wordWrap = false; rwrIconLabelStyle.fontStyle = FontStyle.Bold; audioSource = gameObject.AddComponent <AudioSource>(); audioSource.minDistance = 500; audioSource.maxDistance = 1000; audioSource.spatialBlend = 1; audioSource.dopplerLevel = 0; audioSource.loop = false; UpdateVolume(); BDArmorySettings.OnVolumeChange += UpdateVolume; float size = displayRect.height + 20; if (!windowRectInitialized) { windowRect = new Rect(40, Screen.height - size - 20, size, size + 20); windowRectInitialized = true; } foreach (var mf in vessel.FindPartModulesImplementing <MissileFire>()) { mf.rwr = this; if (!weaponManager) { weaponManager = mf; } } if (rwrEnabled) { EnableRWR(); } } }
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; } } }
protected void UpdateRadarTarget() { TargetAcquired = false; float angleToTarget = Vector3.Angle(radarTarget.predictedPosition - transform.position, GetForwardTransform()); 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("[BDArmory]: Semi-Active Radar guidance failed. Parent radar lost target."); radarTarget = TargetSignatureData.noTarget; legacyTargetVessel = null; return; } else { if (_radarFailTimer == 0) { Debug.Log("[BDArmory]: 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("[BDArmory]: 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("[BDArmory]: 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("[BDArmory]: Pitbull! Radar missileBase 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("[BDArmory]: Radar missileBase 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, GetForwardTransform()); 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, GetForwardTransform()); 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("[BDArmory]: Pitbull! Radar missileBase 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; } }