Ejemplo n.º 1
0
        /// <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);
        }
Ejemplo n.º 2
0
        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);
        }
Ejemplo n.º 3
0
        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);
        }
Ejemplo n.º 4
0
 //Laser point stuff
 public static void RegisterLaserPoint(ModuleTargetingCamera cam)
 {
     if (ActiveLasers.Contains(cam))
     {
         return;
     }
     else
     {
         ActiveLasers.Add(cam);
     }
 }
Ejemplo n.º 5
0
 protected void SetLaserTargeting()
 {
     if (TargetingMode == TargetingModes.Laser)
     {
         laserStartPosition = MissileReferenceTransform.position;
         if (lockedCamera)
         {
             TargetAcquired = true;
             TargetPosition = lastLaserPoint = lockedCamera.groundTargetPosition;
             targetingPod   = lockedCamera;
         }
     }
 }
Ejemplo n.º 6
0
        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;
                }
            }
        }
Ejemplo n.º 7
0
        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();
            }
        }
Ejemplo n.º 8
0
        /// <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);
        }
Ejemplo n.º 9
0
        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);
        }
Ejemplo n.º 10
0
        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);
        }
Ejemplo n.º 11
0
 //Laser point stuff
 public static void RegisterLaserPoint(ModuleTargetingCamera cam)
 {
     if(ActiveLasers.Contains(cam))
     {
         return;
     }
     else
     {
         ActiveLasers.Add(cam);
     }
 }
Ejemplo n.º 12
0
        void SearchForLaserPoint()
        {
            MissileLauncher ml = currentMissile;
            if(!ml || ml.targetingMode != MissileLauncher.TargetingModes.Laser)
            {
                return;
            }

            foundCam = BDATargetManager.GetLaserTarget(ml);
            if(foundCam)
            {
                laserPointDetected = true;
            }
            else
            {
                laserPointDetected = false;
            }
        }
Ejemplo n.º 13
0
 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;
         }
     }
 }
Ejemplo n.º 14
0
        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());

            }
        }