A whole bunch of changes to start making simple relays possible.
[AntennaRange.git] / Extensions.cs
blob:a/Extensions.cs -> blob:b/Extensions.cs
--- a/Extensions.cs
+++ b/Extensions.cs
@@ -1,46 +1,91 @@
+// AntennaRange © 2014 toadicus
+//
+// AntennaRange provides incentive and requirements for the use of the various antenna parts.
+// Nominally, the breakdown is as follows:
+//
+//     Communotron 16 - Suitable up to Kerbalsynchronous Orbit
+//     Comms DTS-M1 - Suitable throughout the Kerbin subsystem
+//     Communotron 88-88 - Suitable throughout the Kerbol system.
+//
+// This work is licensed under the Creative Commons Attribution-NonCommercial-ShareAlike 3.0 Unported License. To view a
+// copy of this license, visit http://creativecommons.org/licenses/by-nc-sa/3.0/
+//
+// This software uses the ModuleManager library © 2013 ialdabaoth, used under a Creative Commons Attribution-ShareAlike
+// 3.0 Uported License.
+//
+// This software uses code from the MuMechLib library, © 2013 r4m0n, used under the GNU GPL version 3.
+
 using System;
 using System.Collections.Generic;
 using System.Linq;
 
 namespace AntennaRange
 {
+	/*
+	 * A class of utility extensions for Vessels and Relays to help find a relay path back to Kerbin.
+	 * */
 	public static class Extensions
 	{
-		public static IEnumerable<ILimitedScienceDataTransmitter> GetTransmitters (this Vessel vessel)
+		/// <summary>
+		/// Returns the distance between this Vessel and another Vessel.
+		/// </summary>
+		/// <param name="vesselOne">This <see cref="Vessel"/><see ></param>
+		/// <param name="vesselTwo">Another <see cref="Vessel"/></param>
+		public static double DistanceTo(this Vessel vesselOne, Vessel vesselTwo)
 		{
-			List<ILimitedScienceDataTransmitter> Transmitters;
-
-			if (vessel.loaded) {
-				Transmitters = vessel.Parts
-					.SelectMany (p => p.Modules.OfType<ILimitedScienceDataTransmitter> ())
-					.ToList();
-			} else {
-				Transmitters = new List<ILimitedScienceDataTransmitter>();
-
-				foreach (ProtoPartModuleSnapshot ms in vessel.protoVessel.protoPartSnapshots.SelectMany(ps => ps.modules))
-				{
-					if (ms.IsAntenna())
-					{
-						Transmitters.Add(new ProtoDataTransmitter(ms, vessel));
-					}
-				}
-			}
-
-			return Transmitters;
+			return (vesselOne.GetWorldPos3D() - vesselTwo.GetWorldPos3D()).magnitude;
 		}
 
-		public static bool IsAntenna (this PartModule module)
+		/// <summary>
+		/// Returns the distance between this Vessel and a CelestialBody
+		/// </summary>
+		/// <param name="vessel">This Vessel</param>
+		/// <param name="body">A <see cref="CelestialBody"/></param>
+		public static double DistanceTo(this Vessel vessel, CelestialBody body)
 		{
-			return module.Fields.GetValue<bool> ("IsAntenna");
+			return (vessel.GetWorldPos3D() - body.position).magnitude;
 		}
 
-		public static bool IsAntenna(this ProtoPartModuleSnapshot protomodule)
+		/// <summary>
+		/// Returns the distance between this IAntennaRelay and a Vessel
+		/// </summary>
+		/// <param name="relay">This <see cref="IAntennaRelay"/></param>
+		/// <param name="Vessel">A <see cref="Vessel"/></param>
+		public static double DistanceTo(this AntennaRelay relay, Vessel Vessel)
 		{
-			bool result;
+			return relay.vessel.DistanceTo(Vessel);
+		}
 
-			return Boolean.TryParse (protomodule.moduleValues.GetValue ("IsAntenna") ?? "False", out result)
-				? result : false;
+		/// <summary>
+		/// Returns the distance between this IAntennaRelay and a CelestialBody
+		/// </summary>
+		/// <param name="relay">This <see cref="IAntennaRelay"/></param>
+		/// <param name="body">A <see cref="CelestialBody"/></param>
+		public static double DistanceTo(this AntennaRelay relay, CelestialBody body)
+		{
+			return relay.vessel.DistanceTo(body);
 		}
+
+		/// <summary>
+		/// Returns the distance between this IAntennaRelay and another IAntennaRelay
+		/// </summary>
+		/// <param name="relayOne">This <see cref="IAntennaRelay"/></param>
+		/// <param name="relayTwo">Another <see cref="IAntennaRelay"/></param>
+		public static double DistanceTo(this AntennaRelay relayOne, IAntennaRelay relayTwo)
+		{
+			return relayOne.DistanceTo(relayTwo.vessel);
+		}
+
+		/// <summary>
+		/// Returns all of the PartModules or ProtoPartModuleSnapshots implementing IAntennaRelay in this Vessel.
+		/// </summary>
+		/// <param name="vessel">This <see cref="Vessel"/></param>
+		public static IEnumerable<IAntennaRelay> GetAntennaRelays (this Vessel vessel)
+		{
+			return RelayDatabase.Instance[vessel].Values.ToList();
+		}
+
+
 	}
 }