Пример #1
0
        public void LinkVRD(VesselRadarData vrd)
        {
            if(!externalVRDs.Contains(vrd))
            {
                externalVRDs.Add(vrd);
            }

            foreach(var mr in vrd.availableRadars)
            {
                LinkToRadar(mr);
            }

            SaveExternalVRDVessels();
        }
Пример #2
0
 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);
 }
Пример #3
0
        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();
        }
Пример #4
0
        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;
                }
            }
        }
Пример #5
0
 public void RemoveExternalVRD(VesselRadarData vrd)
 {
     linkedToVessels.Remove(vrd);
 }
Пример #6
0
 public void AddExternalVRD(VesselRadarData vrd)
 {
     if(!linkedToVessels.Contains(vrd))
     {
         linkedToVessels.Add(vrd);
     }
 }
Пример #7
0
		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;
			}
		}