public bool GetLaunchAuthorization(Vessel targetV, MissileFire mf) { bool launchAuthorized = false; Vector3 target = targetV.transform.position; MissileLauncher missile = mf.currentMissile; if (missile != null) { if (!targetV.Landed) { target = MissileGuidance.GetAirToAirFireSolution(missile, targetV); } float boresightFactor = targetV.Landed ? 0.75f : 0.35f; float maxOffBoresight = missile.maxOffBoresight; if (missile.targetingMode == MissileLauncher.TargetingModes.GPS) { maxOffBoresight = 45; } float fTime = 2f; Vector3 futurePos = target + (targetV.srf_velocity * fTime); Vector3 myFuturePos = vesselTransform.position + (vessel.srf_velocity * fTime); bool fDot = Vector3.Dot(vesselTransform.up, futurePos - myFuturePos) > 0; //check target won't likely be behind me soon if (fDot && Vector3.Angle(missile.transform.forward, target - missile.transform.position) < maxOffBoresight * boresightFactor) { launchAuthorized = true; } } return(launchAuthorized); }
void UpdateTarget() { slaved = false; if (weaponManager && wm.slavingTurrets && wm.currentMissile) { slaved = true; slavedTargetPosition = MissileGuidance.GetAirToAirFireSolution(wm.currentMissile, wm.slavedPosition, wm.slavedVelocity); } }
void FlyToTargetVessel(FlightCtrlState s, Vessel v) { Vector3 target = v.CoM; MissileLauncher missile = null; Vector3 vectorToTarget = v.transform.position - vesselTransform.position; float distanceToTarget = vectorToTarget.magnitude; if (weaponManager) { missile = weaponManager.currentMissile; if (missile != null) { if (missile.targetingMode == MissileLauncher.TargetingModes.Heat && !weaponManager.heatTarget.exists) { target += v.srf_velocity.normalized * 10; } else { target = MissileGuidance.GetAirToAirFireSolution(missile, v); } if (Vector3.Angle(target - vesselTransform.position, vesselTransform.forward) < 15) { steerMode = SteerModes.Aiming; } } else { ModuleWeapon weapon = weaponManager.currentGun; if (weapon != null) { //target -= 1.30f*weapon.GetLeadOffset(); Vector3 leadOffset = weapon.GetLeadOffset(); float targetAngVel = 1.65f * Vector3.Angle(v.transform.position - vessel.transform.position, v.transform.position + (vessel.srf_velocity) - vessel.transform.position); debugString += "\ntargetAngVel: " + targetAngVel; float magnifier = Mathf.Clamp(targetAngVel, 1.25f, 5); target -= magnifier * leadOffset; float angleToLead = Vector3.Angle(vesselTransform.up, target - vesselTransform.position); if (distanceToTarget < 1600 && angleToLead < 20) { steerMode = SteerModes.Aiming; //steer to aim } } } } float targetDot = Vector3.Dot(vesselTransform.up, v.transform.position - vessel.transform.position); //manage speed when close to enemy float finalMaxSpeed = ((distanceToTarget - 100) / 8) + (float)v.srfSpeed; AdjustThrottle(finalMaxSpeed, true); if ((targetDot < 0 || vessel.srfSpeed > finalMaxSpeed) && distanceToTarget < 800) //distance is less than 800m { debugString += ("\nEnemy on tail. Braking"); AdjustThrottle(minSpeed, true); } if (missile != null && targetDot > 0 && distanceToTarget < 300 && vessel.srfSpeed > 130) { extending = true; lastTargetPosition = v.transform.position; } FlyToPosition(s, target); }