//checks to see if a friendly is too close to the gun trajectory to fire them public static bool CheckSafeToFireGuns(MissileFire weaponManager, Vector3 aimDirection, float safeDistance, float cosUnsafeAngle) { BDArmorySetup.BDATeams team = weaponManager.team ? BDArmorySetup.BDATeams.A : BDArmorySetup.BDATeams.B; List <TargetInfo> .Enumerator friendlyTarget = TargetDatabase[team].GetEnumerator(); while (friendlyTarget.MoveNext()) { if (friendlyTarget.Current == null || !friendlyTarget.Current.Vessel) { continue; } float friendlyPosDot = Vector3.Dot(friendlyTarget.Current.position - weaponManager.vessel.vesselTransform.position, aimDirection); if (!(friendlyPosDot > 0)) { continue; } float friendlyDistance = (friendlyTarget.Current.position - weaponManager.vessel.vesselTransform.position).magnitude; float friendlyPosDotNorm = friendlyPosDot / friendlyDistance; //scale down the dot to be a 0-1 so we can check it againts cosUnsafeAngle if (friendlyDistance < safeDistance && cosUnsafeAngle < friendlyPosDotNorm) //if it's too close and it's within the Unsafe Angle, don't fire { return(false); } } friendlyTarget.Dispose(); return(true); }
public static TargetInfo GetAirToAirTarget(MissileFire mf) { BDArmorySetup.BDATeams team = mf.team ? BDArmorySetup.BDATeams.B : BDArmorySetup.BDATeams.A; TargetInfo finalTarget = null; float finalTargetSuitability = 0; //this will determine how suitable the target is, based on where it is located relative to the targeting vessel and how far it is List <TargetInfo> .Enumerator target = TargetDatabase[team].GetEnumerator(); while (target.MoveNext()) { if (target.Current == null) { continue; } if (target.Current.numFriendliesEngaging >= 2) { continue; } if (target.Current && target.Current.Vessel && target.Current.isFlying && !target.Current.isMissile && target.Current.isThreat) { Vector3 targetRelPos = target.Current.Vessel.vesselTransform.position - mf.vessel.vesselTransform.position; float targetSuitability = Vector3.Dot(targetRelPos.normalized, mf.vessel.ReferenceTransform.up); //prefer targets ahead to those behind targetSuitability += 500 / (targetRelPos.magnitude + 100); if (finalTarget == null || (target.Current.numFriendliesEngaging < finalTarget.numFriendliesEngaging) || targetSuitability > finalTargetSuitability + finalTarget.numFriendliesEngaging) { finalTarget = target.Current; finalTargetSuitability = targetSuitability; } } } return(finalTarget); }
protected virtual void OnToggleTeam(MissileFire mf, BDArmorySetup.BDATeams team) { if (mf.vessel == vessel || (commandLeader && commandLeader.vessel == mf.vessel)) { ReleaseCommand(); } }
private void MissileFireOnToggleTeam(MissileFire wm, BDArmorySetup.BDATeams team) { if (_showGui) { UpdateList(); } }
public static TargetInfo GetClosestMissileTarget(MissileFire mf) { BDArmorySetup.BDATeams team = BoolToTeam(mf.team); TargetInfo finalTarget = null; List <TargetInfo> .Enumerator target = TargetDatabase[team].GetEnumerator(); while (target.MoveNext()) { if (target.Current == null) { continue; } if (target.Current && target.Current.Vessel && mf.CanSeeTarget(target.Current) && target.Current.isMissile) { bool isHostile = false; if (target.Current.isThreat) { isHostile = true; } if (isHostile && (finalTarget == null || target.Current.IsCloser(finalTarget, mf))) { finalTarget = target.Current; } } } target.Dispose(); return(finalTarget); }
void Update() { if (!vessel) { AboutToBeDestroyed(); } else { if ((vessel.vesselType == VesselType.Debris) && (weaponManager == null)) { RemoveFromDatabases(); team = BDArmorySetup.BDATeams.None; } } }
public TargetSignatureData(CMFlare flare, float _signalStrength) { velocity = flare.velocity; geoPos = VectorUtils.WorldPositionToGeoCoords(flare.transform.position, FlightGlobals.currentMainBody); exists = true; acceleration = Vector3.zero; timeAcquired = Time.time; signalStrength = _signalStrength; targetInfo = null; vesselJammer = null; team = BDArmorySetup.BDATeams.None; pingPosition = Vector2.zero; orbital = false; orbit = null; lockedByRadar = null; vessel = null; }
public TargetSignatureData(Vector3 _velocity, Vector3 _position, Vector3 _acceleration, bool _exists, float _signalStrength) { velocity = _velocity; geoPos = VectorUtils.WorldPositionToGeoCoords(_position, FlightGlobals.currentMainBody); acceleration = _acceleration; exists = _exists; timeAcquired = Time.time; signalStrength = _signalStrength; targetInfo = null; vesselJammer = null; team = BDArmorySetup.BDATeams.None; pingPosition = Vector2.zero; orbital = false; orbit = null; lockedByRadar = null; vessel = null; }
public TargetSignatureData(Vessel v, float _signalStrength) { orbital = v.InOrbit(); orbit = v.orbit; timeAcquired = Time.time; vessel = v; velocity = v.Velocity(); geoPos = VectorUtils.WorldPositionToGeoCoords(v.CoM, v.mainBody); acceleration = v.acceleration_immediate; exists = true; signalStrength = _signalStrength; targetInfo = v.gameObject.GetComponent <TargetInfo> (); // vessel never been picked up on radar before: create new targetinfo record if (targetInfo == null) { targetInfo = v.gameObject.AddComponent <TargetInfo>(); } team = BDArmorySetup.BDATeams.None; if (targetInfo) { team = targetInfo.team; targetInfo.detectedTime = Time.time; } else { List <MissileFire> .Enumerator mf = v.FindPartModulesImplementing <MissileFire>().GetEnumerator(); while (mf.MoveNext()) { team = BDATargetManager.BoolToTeam(mf.Current.team); break; } mf.Dispose(); } vesselJammer = v.gameObject.GetComponent <VesselECMJInfo>(); pingPosition = Vector2.zero; lockedByRadar = null; }
//returns the target that owns this weapon manager public static TargetInfo GetTargetFromWeaponManager(MissileFire mf) { BDArmorySetup.BDATeams team = mf.team ? BDArmorySetup.BDATeams.A : BDArmorySetup.BDATeams.B; List <TargetInfo> .Enumerator target = TargetDatabase[team].GetEnumerator(); while (target.MoveNext()) { if (target.Current == null) { continue; } if (target.Current.Vessel && target.Current.weaponManager == mf) { return(target.Current); } } target.Dispose(); return(null); }
public static TargetInfo GetMissileTarget(MissileFire mf, bool targetingMeOnly = false) { BDArmorySetup.BDATeams team = mf.team ? BDArmorySetup.BDATeams.B : BDArmorySetup.BDATeams.A; TargetInfo finalTarget = null; List <TargetInfo> .Enumerator target = TargetDatabase[team].GetEnumerator(); while (target.MoveNext()) { if (target.Current == null) { continue; } if (target.Current && target.Current.Vessel && target.Current.isMissile && target.Current.isThreat && mf.CanSeeTarget(target.Current)) { if (target.Current.MissileBaseModule) { if (targetingMeOnly) { if (Vector3.SqrMagnitude(target.Current.MissileBaseModule.TargetPosition - mf.vessel.CoM) > 60 * 60) { continue; } } } else { if (BDArmorySettings.DRAW_DEBUG_LABELS) { Debug.LogWarning("checking target missile - doesn't have missile module"); } } if (((finalTarget == null && target.Current.numFriendliesEngaging < 2) || (finalTarget != null && target.Current.numFriendliesEngaging < finalTarget.numFriendliesEngaging))) { finalTarget = target.Current; } } } target.Dispose(); return(finalTarget); }
//returns the nearest friendly target public static TargetInfo GetClosestFriendly(MissileFire mf) { BDArmorySetup.BDATeams team = mf.team ? BDArmorySetup.BDATeams.A : BDArmorySetup.BDATeams.B; TargetInfo finalTarget = null; List <TargetInfo> .Enumerator target = TargetDatabase[team].GetEnumerator(); while (target.MoveNext()) { if (target.Current == null || !target.Current.Vessel || target.Current.weaponManager == mf) { continue; } if (finalTarget == null || (target.Current.IsCloser(finalTarget, mf))) { finalTarget = target.Current; } } target.Dispose(); return(finalTarget); }
public static List <TargetInfo> GetAllTargetsExcluding(List <TargetInfo> excluding, MissileFire mf) { List <TargetInfo> finalTargets = new List <TargetInfo>(); BDArmorySetup.BDATeams team = BoolToTeam(mf.team); List <TargetInfo> .Enumerator target = TargetDatabase[team].GetEnumerator(); while (target.MoveNext()) { if (target.Current == null) { continue; } if (target.Current && target.Current.Vessel && mf.CanSeeTarget(target.Current) && !excluding.Contains(target.Current)) { finalTargets.Add(target.Current); } } target.Dispose(); return(finalTargets); }
//this will search for an AA target that is immediately in front of the AI during an extend when it would otherwise be helpless public static TargetInfo GetAirToAirTargetAbortExtend(MissileFire mf, float maxDistance, float cosAngleCheck) { BDArmorySetup.BDATeams team = mf.team ? BDArmorySetup.BDATeams.B : BDArmorySetup.BDATeams.A; TargetInfo finalTarget = null; float finalTargetSuitability = 0; //this will determine how suitable the target is, based on where it is located relative to the targeting vessel and how far it is List <TargetInfo> .Enumerator target = TargetDatabase[team].GetEnumerator(); while (target.MoveNext()) { if (target.Current == null || !target.Current.Vessel || target.Current.isLanded || target.Current.isMissile || !target.Current.isThreat) { continue; } Vector3 targetRelPos = target.Current.Vessel.vesselTransform.position - mf.vessel.vesselTransform.position; float distance, dot; distance = targetRelPos.magnitude; dot = Vector3.Dot(targetRelPos.normalized, mf.vessel.ReferenceTransform.up); if (distance > maxDistance || cosAngleCheck > dot) { continue; } float targetSuitability = dot; //prefer targets ahead to those behind targetSuitability += 500 / (distance + 100); //same suitability check as above if (finalTarget != null && !(targetSuitability > finalTargetSuitability)) { continue; } //just pick the most suitable one finalTarget = target.Current; finalTargetSuitability = targetSuitability; } target.Dispose(); return(finalTarget); }
public static TargetInfo GetUnengagedMissileTarget(MissileFire mf) { BDArmorySetup.BDATeams team = mf.team ? BDArmorySetup.BDATeams.B : BDArmorySetup.BDATeams.A; List <TargetInfo> .Enumerator target = TargetDatabase[team].GetEnumerator(); while (target.MoveNext()) { if (target.Current == null) { continue; } if (target.Current && target.Current.Vessel && mf.CanSeeTarget(target.Current) && target.Current.isMissile && target.Current.isThreat) { if (target.Current.numFriendliesEngaging == 0) { return(target.Current); } } } target.Dispose(); return(null); }
public static TargetInfo GetClosestTarget(MissileFire mf) { BDArmorySetup.BDATeams team = mf.team ? BDArmorySetup.BDATeams.B : BDArmorySetup.BDATeams.A; TargetInfo finalTarget = null; List <TargetInfo> .Enumerator target = TargetDatabase[team].GetEnumerator(); while (target.MoveNext()) { if (target.Current == null) { continue; } if (target.Current && target.Current.Vessel && mf.CanSeeTarget(target.Current) && !target.Current.isMissile) { if (finalTarget == null || (target.Current.IsCloser(finalTarget, mf))) { finalTarget = target.Current; } } } target.Dispose(); return(finalTarget); }
void OnToggleTeam(MissileFire mf, BDArmorySetup.BDATeams team) { RefreshFriendlies(); RefreshWingmen(); }
void RemoveTarget(TargetInfo target, BDArmorySetup.BDATeams team) { TargetDatabase[team].Remove(target); }
public static BDArmorySetup.BDATeams OtherTeam(BDArmorySetup.BDATeams team) { return(team == BDArmorySetup.BDATeams.A ? BDArmorySetup.BDATeams.B : BDArmorySetup.BDATeams.A); }
void Awake() { if (!vessel) { vessel = GetComponent <Vessel>(); } if (!vessel) { //Debug.Log ("[BDArmory]: TargetInfo was added to a non-vessel"); Destroy(this); return; } //destroy this if a target info is already attached to the vessel IEnumerator otherInfo = vessel.gameObject.GetComponents <TargetInfo>().GetEnumerator(); while (otherInfo.MoveNext()) { if ((object)otherInfo.Current != this) { Destroy(this); return; } } team = BDArmorySetup.BDATeams.None; bool foundMf = false; List <MissileFire> .Enumerator mf = vessel.FindPartModulesImplementing <MissileFire>().GetEnumerator(); while (mf.MoveNext()) { foundMf = true; team = BDATargetManager.BoolToTeam(mf.Current.team); weaponManager = mf.Current; break; } mf.Dispose(); if (!foundMf) { List <MissileBase> .Enumerator ml = vessel.FindPartModulesImplementing <MissileBase>().GetEnumerator(); while (ml.MoveNext()) { isMissile = true; MissileBaseModule = ml.Current; team = BDATargetManager.BoolToTeam(ml.Current.Team); break; } ml.Dispose(); } if (team != BDArmorySetup.BDATeams.None) { BDATargetManager.AddTarget(this); } friendliesEngaging = new List <MissileFire>(); vessel.OnJustAboutToBeDestroyed += AboutToBeDestroyed; //add delegate to peace enable event BDArmorySetup.OnPeaceEnabled += OnPeaceEnabled; //lifeRoutine = StartCoroutine(LifetimeRoutine()); // TODO: CHECK BEHAVIOUR AND SIDE EFFECTS! if (!isMissile && team != BDArmorySetup.BDATeams.None) { GameEvents.onVesselPartCountChanged.Add(VesselModified); //massRoutine = StartCoroutine(MassRoutine()); // TODO: CHECK BEHAVIOUR AND SIDE EFFECTS! } }