/// <summary> /// Gets the laser target painter with the least angle off boresight. Set the missile as the reference transform. /// </summary> /// <returns>The laser target painter.</returns> /// <param name="referenceTransform">Reference transform.</param> /// <param name="maxBoreSight">Max bore sight.</param> public static ModuleTargetingCamera GetLaserTarget(MissileLauncher ml) { Transform referenceTransform = ml.transform; float maxOffBoresight = ml.maxOffBoresight; ModuleTargetingCamera finalCam = null; float smallestAngle = 360; foreach (var cam in ActiveLasers) { if (!cam) { continue; } if (cam.cameraEnabled && cam.groundStabilized && cam.surfaceDetected && !cam.gimbalLimitReached) { float angle = Vector3.Angle(referenceTransform.forward, cam.groundTargetPosition - referenceTransform.position); if (angle < maxOffBoresight && angle < smallestAngle && ml.CanSeePosition(cam.groundTargetPosition)) { smallestAngle = angle; finalCam = cam; } } } return(finalCam); }
public void EnableCamera() { if (!TargetingCamera.Instance) { Debug.Log("Tried to enable targeting camera, but camera instance is null."); return; } if (vessel.isActiveVessel) { activeCam = this; windowIsOpen = true; TargetingCamera.Instance.EnableCamera(cameraParentTransform); TargetingCamera.Instance.nvMode = nvMode; TargetingCamera.Instance.SetFOV(fov); RefreshWindowSize(); } cameraEnabled = true; if (weaponManager) { weaponManager.mainTGP = this; } BDATargetManager.RegisterLaserPoint(this); }
private static ModuleTargetingCamera GetModuleTargeting(bool parentOnly, Vector3 missilePosition, Vector3 position, float maxOffBoresight, Vessel vessel, Vessel sourceVessel) { ModuleTargetingCamera finalCam = null; float smallestAngle = 360; foreach (var cam in ActiveLasers) { if (!cam) { continue; } if (parentOnly && !(cam.vessel == vessel || cam.vessel == sourceVessel)) { continue; } if (cam.cameraEnabled && cam.groundStabilized && cam.surfaceDetected && !cam.gimbalLimitReached) { float angle = Vector3.Angle(missilePosition, cam.groundTargetPosition - position); if (angle < maxOffBoresight && angle < smallestAngle && CanSeePosition(cam.groundTargetPosition, vessel.transform.position, missilePosition)) { smallestAngle = angle; finalCam = cam; } } } return(finalCam); }
//Laser point stuff public static void RegisterLaserPoint(ModuleTargetingCamera cam) { if (ActiveLasers.Contains(cam)) { return; } else { ActiveLasers.Add(cam); } }
protected void SetLaserTargeting() { if (TargetingMode == TargetingModes.Laser) { laserStartPosition = MissileReferenceTransform.position; if (lockedCamera) { TargetAcquired = true; TargetPosition = lastLaserPoint = lockedCamera.groundTargetPosition; targetingPod = lockedCamera; } } }
protected void UpdateLaserTarget() { if (TargetAcquired) { if (lockedCamera && lockedCamera.groundStabilized && !lockedCamera.gimbalLimitReached && lockedCamera.surfaceDetected) //active laser target { TargetPosition = lockedCamera.groundTargetPosition; TargetVelocity = (TargetPosition - lastLaserPoint) / Time.fixedDeltaTime; TargetAcceleration = Vector3.zero; lastLaserPoint = TargetPosition; if (GuidanceMode == GuidanceModes.BeamRiding && TimeIndex > 0.25f && Vector3.Dot(GetForwardTransform(), part.transform.position - lockedCamera.transform.position) < 0) { TargetAcquired = false; lockedCamera = null; } } else //lost active laser target, home on last known position { if (CMSmoke.RaycastSmoke(new Ray(transform.position, lastLaserPoint - transform.position))) { //Debug.Log("Laser missileBase affected by smoke countermeasure"); float angle = VectorUtils.FullRangePerlinNoise(0.75f * Time.time, 10) * BDArmorySettings.SMOKE_DEFLECTION_FACTOR; TargetPosition = VectorUtils.RotatePointAround(lastLaserPoint, transform.position, VectorUtils.GetUpDirection(transform.position), angle); TargetVelocity = Vector3.zero; TargetAcceleration = Vector3.zero; lastLaserPoint = TargetPosition; } else { TargetPosition = lastLaserPoint; } } } else { ModuleTargetingCamera foundCam = null; bool parentOnly = (GuidanceMode == GuidanceModes.BeamRiding); foundCam = BDATargetManager.GetLaserTarget(this, parentOnly); if (foundCam != null && foundCam.cameraEnabled && foundCam.groundStabilized && BDATargetManager.CanSeePosition(foundCam.groundTargetPosition, vessel.transform.position, MissileReferenceTransform.position)) { Debug.Log("[BDArmory]: Laser guided missileBase actively found laser point. Enabling guidance."); lockedCamera = foundCam; TargetAcquired = true; } } }
public void DisableCamera() { cameraEnabled = false; groundStabilized = false; if (slaveTurrets) { UnslaveTurrets(); } //StopResetting(); if (!TargetingCamera.Instance) { Debug.Log("Tried to disable targeting camera, but camera instance is null."); return; } if (vessel.isActiveVessel) { TargetingCamera.Instance.DisableCamera(); if (ModuleTargetingCamera.activeCam == this) { ModuleTargetingCamera.activeCam = FindNextActiveCamera(); if (!ModuleTargetingCamera.activeCam) { windowIsOpen = false; } } else { windowIsOpen = false; } } BDATargetManager.ActiveLasers.Remove(this); if (weaponManager && weaponManager.mainTGP == this) { weaponManager.mainTGP = FindNextActiveCamera(); } }
/// <summary> /// Gets the laser target painter with the least angle off boresight. Set the missile as the reference transform. /// </summary> /// <returns>The laser target painter.</returns> /// <param name="referenceTransform">Reference transform.</param> /// <param name="maxBoreSight">Max bore sight.</param> public static ModuleTargetingCamera GetLaserTarget(MissileLauncher ml, bool parentOnly) { Transform referenceTransform = ml.transform; float maxOffBoresight = ml.maxOffBoresight; ModuleTargetingCamera finalCam = null; float smallestAngle = 360; foreach (var cam in ActiveLasers) { if (!cam) { continue; } if (parentOnly && !(cam.vessel == ml.vessel || cam.vessel == ml.sourceVessel)) { continue; } if (cam.cameraEnabled && cam.groundStabilized && cam.surfaceDetected && !cam.gimbalLimitReached) { /* * if(ml.guidanceMode == MissileLauncher.GuidanceModes.BeamRiding && Vector3.Dot(ml.transform.position - cam.transform.position, ml.transform.forward) < 0) * { * continue; * } */ float angle = Vector3.Angle(referenceTransform.forward, cam.groundTargetPosition - referenceTransform.position); if (angle < maxOffBoresight && angle < smallestAngle && ml.CanSeePosition(cam.groundTargetPosition)) { smallestAngle = angle; finalCam = cam; } } } return(finalCam); }
public void EnableCamera() { if(!TargetingCamera.Instance) { Debug.Log ("Tried to enable targeting camera, but camera instance is null."); return; } if(vessel.isActiveVessel) { activeCam = this; windowIsOpen = true; TargetingCamera.Instance.EnableCamera(cameraParentTransform); TargetingCamera.Instance.nvMode = nvMode; TargetingCamera.Instance.SetFOV(fov); RefreshWindowSize(); } cameraEnabled = true; BDATargetManager.RegisterLaserPoint(this); }
public void DisableCamera() { cameraEnabled = false; groundStabilized = false; slaveTurrets = false; StopResetting(); if(!TargetingCamera.Instance) { Debug.Log ("Tried to disable targeting camera, but camera instance is null."); return; } if(vessel.isActiveVessel) { TargetingCamera.Instance.DisableCamera(); if(ModuleTargetingCamera.activeCam == this) { ModuleTargetingCamera.activeCam = FindNextActiveCamera(); if(!ModuleTargetingCamera.activeCam) { windowIsOpen = false; } } else { windowIsOpen = false; } } BDATargetManager.ActiveLasers.Remove(this); }
//Laser point stuff public static void RegisterLaserPoint(ModuleTargetingCamera cam) { if(ActiveLasers.Contains(cam)) { return; } else { ActiveLasers.Add(cam); } }
void SearchForLaserPoint() { MissileLauncher ml = currentMissile; if(!ml || ml.targetingMode != MissileLauncher.TargetingModes.Laser) { return; } foundCam = BDATargetManager.GetLaserTarget(ml); if(foundCam) { laserPointDetected = true; } else { laserPointDetected = false; } }
void UpdateLaserTarget() { if(targetAcquired) { if(lockedCamera && lockedCamera.groundStabilized && !lockedCamera.gimbalLimitReached && lockedCamera.surfaceDetected) //active laser target { targetPosition = lockedCamera.groundTargetPosition; targetVelocity = (targetPosition - lastLaserPoint) / Time.fixedDeltaTime; targetAcceleration = Vector3.zero; lastLaserPoint = targetPosition; } else //lost active laser target, home on last known position { if(CMSmoke.RaycastSmoke(new Ray(transform.position, lastLaserPoint - transform.position))) { //Debug.Log("Laser missile affected by smoke countermeasure"); float angle = VectorUtils.FullRangePerlinNoise(0.75f * Time.time, 10) * BDArmorySettings.SMOKE_DEFLECTION_FACTOR; targetPosition = VectorUtils.RotatePointAround(lastLaserPoint, transform.position, VectorUtils.GetUpDirection(transform.position), angle); targetVelocity = Vector3.zero; targetAcceleration = Vector3.zero; lastLaserPoint = targetPosition; } else { targetPosition = lastLaserPoint; } } } else { ModuleTargetingCamera foundCam = null; foundCam = BDATargetManager.GetLaserTarget(this); if(foundCam != null && foundCam.cameraEnabled && foundCam.groundStabilized && CanSeePosition(foundCam.groundTargetPosition)) { Debug.Log("Laser guided missile actively found laser point. Enabling guidance."); lockedCamera = foundCam; targetAcquired = true; } } }
public void FireMissile() { if(!hasFired) { hasFired = true; GameEvents.onPartDie.Add(PartDie); BDATargetManager.FiredMissiles.Add(this); if(GetComponentInChildren<KSPParticleEmitter>()) { BDArmorySettings.numberOfParticleEmitters++; } foreach(var wpm in vessel.FindPartModulesImplementing<MissileFire>()) { team = wpm.team; break; } sfAudioSource.PlayOneShot(GameDatabase.Instance.GetAudioClip("BDArmory/Sounds/deployClick")); sourceVessel = vessel; //TARGETING targetPosition = transform.position + (transform.forward * 5000); //set initial target position so if no target update, missile will count a miss if it nears this point or is flying post-thrust startDirection = transform.forward; if(BDArmorySettings.ALLOW_LEGACY_TARGETING) { if(vessel.targetObject!=null && vessel.targetObject.GetVessel()!=null) { legacyTargetVessel = vessel.targetObject.GetVessel(); foreach(var mf in legacyTargetVessel.FindPartModulesImplementing<MissileFire>()) { targetMf = mf; break; } if(targetingMode == TargetingModes.Heat) { heatTarget = new TargetSignatureData(legacyTargetVessel, 9999); } } } if(targetingMode == TargetingModes.Laser) { laserStartPosition = transform.position; if(lockedCamera) { targetAcquired = true; targetPosition = lastLaserPoint = lockedCamera.groundTargetPosition; targetingPod = lockedCamera; } } else if(targetingMode == TargetingModes.AntiRad && targetAcquired) { RadarWarningReceiver.OnRadarPing += ReceiveRadarPing; } part.decouple(0); part.force_activate(); part.Unpack(); vessel.situation = Vessel.Situations.FLYING; rigidbody.isKinematic = false; BDArmorySettings.Instance.ApplyNewVesselRanges(vessel); part.bodyLiftMultiplier = 0; part.dragModel = Part.DragModel.NONE; //add target info to vessel TargetInfo info = vessel.gameObject.AddComponent<TargetInfo>(); info.team = BDATargetManager.BoolToTeam(team); info.isMissile = true; info.missileModule = this; StartCoroutine(DecoupleRoutine()); vessel.vesselName = GetShortName(); vessel.vesselType = VesselType.Probe; timeFired = Time.time; //setting ref transform for navball GameObject refObject = new GameObject(); refObject.transform.rotation = Quaternion.LookRotation(-transform.up, transform.forward); refObject.transform.parent = transform; part.SetReferenceTransform(refObject.transform); vessel.SetReferenceTransform(part); vesselReferenceTransform = refObject.transform; MissileState = MissileStates.Drop; part.crashTolerance = 9999; StartCoroutine(MissileRoutine()); } }