ARFlightController: Changed up the locking logic to hopefully remove the locks in all relevant scenarios.
ARFlightController: Changed up the locking logic to hopefully remove the locks in all relevant scenarios.

--- a/ARConfiguration.cs
+++ b/ARConfiguration.cs
@@ -19,6 +19,20 @@
 		private Rect configWindowPos;
 
 		private IButton toolbarButton;
+
+		private KSP.IO.PluginConfiguration _config;
+		private KSP.IO.PluginConfiguration config
+		{
+			get
+			{
+				if (this._config == null)
+				{
+					this._config = KSP.IO.PluginConfiguration.CreateForType<AntennaRelay>();
+				}
+
+				return this._config;
+			}
+		}
 
 		public void Awake()
 		{
@@ -46,14 +60,10 @@
 					this.showConfigWindow = !this.showConfigWindow;
 				};
 
-				var config = KSP.IO.PluginConfiguration.CreateForType<AntennaRelay>();
-
-				config.load();
-
-				this.configWindowPos = config.GetValue<Rect>("configWindowPos", this.configWindowPos);
-				AntennaRelay.requireLineOfSight = config.GetValue<bool>("requireLineOfSight", false);
-
-				config.save();
+				this.configWindowPos = this.LoadConfigValue("configWindowPos", this.configWindowPos);
+				AntennaRelay.requireLineOfSight = this.LoadConfigValue("requireLineOfSight", false);
+				ARFlightController.requireConnectionForControl =
+					this.LoadConfigValue("requireConnectionForControl", false);
 			}
 
 			if (this.showConfigWindow)
@@ -81,11 +91,27 @@
 			GUILayout.BeginVertical(GUILayout.ExpandHeight(true));
 
 			GUILayout.BeginHorizontal(GUILayout.ExpandWidth(true));
+
 			bool requireLineOfSight = GUILayout.Toggle(AntennaRelay.requireLineOfSight, "Require Line of Sight");
 			if (requireLineOfSight != AntennaRelay.requireLineOfSight)
 			{
 				AntennaRelay.requireLineOfSight = requireLineOfSight;
 				this.SaveConfigValue("requireLineOfSight", requireLineOfSight);
+			}
+
+			GUILayout.EndHorizontal();
+
+			GUILayout.BeginHorizontal(GUILayout.ExpandWidth(true));
+
+			bool requireConnectionForControl =
+				GUILayout.Toggle(
+					ARFlightController.requireConnectionForControl,
+					"Require Connection for Probe Control"
+				);
+			if (requireConnectionForControl != ARFlightController.requireConnectionForControl)
+			{
+				ARFlightController.requireConnectionForControl = requireConnectionForControl;
+				this.SaveConfigValue("requireConnectionForControl", requireConnectionForControl);
 			}
 
 			GUILayout.EndHorizontal();
@@ -105,22 +131,18 @@
 
 		private T LoadConfigValue<T>(string key, T defaultValue)
 		{
-			var config = KSP.IO.PluginConfiguration.CreateForType<AntennaRelay>();
-
-			config.load();
+			this.config.load();
 
 			return config.GetValue(key, defaultValue);
 		}
 
 		private void SaveConfigValue<T>(string key, T value)
 		{
-			var config = KSP.IO.PluginConfiguration.CreateForType<AntennaRelay>();
+			this.config.load();
 
-			config.load();
+			this.config.SetValue(key, value);
 
-			config.SetValue(key, value);
-
-			config.save();
+			this.config.save();
 		}
 	}
 }

--- a/ARFlightController.cs
+++ b/ARFlightController.cs
@@ -90,33 +90,37 @@
 
 		protected void FixedUpdate()
 		{
+			// Do nothing if the vessel reference is invalid.
+			if (this.vessel == null)
+			{
+				return;
+			}
+
+			// If we are requiring a connection for control, the vessel does not have any adequately staffed pods,
+			// and the vessel does not have any connected relays...
 			if (
 				requireConnectionForControl &&
-				this.vessel != null &&
 				!this.vessel.hasCrewCommand() &&
-				this.vessel.IsControllable
-			)
+				!this.vessel.HasConnectedRelay())
 			{
-				if (this.vessel.HasConnectedRelay())
+				// ...and if the controls are not currently locked...
+				if (currentControlLock == ControlTypes.None)
 				{
-					if (currentControlLock != ControlTypes.None)
-					{
-						InputLockManager.RemoveControlLock(this.lockID);
-					}
+					// ...lock the controls.
+					InputLockManager.SetControlLock(this.lockSet, this.lockID);
 				}
-				else
-				{
-					if (currentControlLock == ControlTypes.None)
-					{
-						InputLockManager.SetControlLock(this.lockSet, this.lockID);
-					}
-				}
+			}
+			// ...otherwise, if the controls are locked...
+			else if (currentControlLock != ControlTypes.None)
+			{
+				// ...unlock the controls.
+				InputLockManager.RemoveControlLock(this.lockID);
 			}
 		}
 
 		protected void Destroy()
 		{
-
+			InputLockManager.RemoveControlLock(this.lockID);
 		}
 		#endregion
 	}

--- a/AntennaRange.csproj
+++ b/AntennaRange.csproj
@@ -12,6 +12,7 @@
     <ReleaseVersion>1.1</ReleaseVersion>
     <SynchReleaseVersion>false</SynchReleaseVersion>
     <TargetFrameworkVersion>v3.5</TargetFrameworkVersion>
+    <UseMSBuildEngine>False</UseMSBuildEngine>
   </PropertyGroup>
   <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug_win|AnyCPU' ">
     <DebugSymbols>true</DebugSymbols>
@@ -87,20 +88,23 @@
     </None>
   </ItemGroup>
   <ItemGroup>
+    <Reference Include="Assembly-CSharp">
+      <HintPath>..\_KSPAssemblies\Assembly-CSharp.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="System">
+      <HintPath>..\_KSPAssemblies\System.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
+    <Reference Include="UnityEngine">
+      <HintPath>..\_KSPAssemblies\UnityEngine.dll</HintPath>
+      <Private>False</Private>
+    </Reference>
+  </ItemGroup>
+  <ItemGroup>
     <ProjectReference Include="..\ToadicusTools\ToadicusTools.csproj">
       <Project>{D48A5542-6655-4149-BC27-B27DF0466F1C}</Project>
       <Name>ToadicusTools</Name>
     </ProjectReference>
   </ItemGroup>
-  <ItemGroup>
-    <Reference Include="Assembly-CSharp">
-      <HintPath>..\_KSPAssemblies\Assembly-CSharp.dll</HintPath>
-    </Reference>
-    <Reference Include="System">
-      <HintPath>..\_KSPAssemblies\System.dll</HintPath>
-    </Reference>
-    <Reference Include="UnityEngine">
-      <HintPath>..\_KSPAssemblies\UnityEngine.dll</HintPath>
-    </Reference>
-  </ItemGroup>
 </Project>