ModuleLimitedDataTransmitter: Added debug messages to TransmitData, and fixed the loop so it actually works now.
--- a/ARConfiguration.cs
+++ b/ARConfiguration.cs
@@ -17,6 +17,7 @@
private Rect configWindowPos;
private IButton toolbarButton;
+ private ApplicationLauncherButton appLauncherButton;
private System.Version runningVersion;
@@ -38,38 +39,64 @@
{
Tools.PostDebugMessage(this, "Waking up.");
+ this.runningVersion = this.GetType().Assembly.GetName().Version;
+
this.showConfigWindow = false;
this.configWindowPos = new Rect(Screen.width / 4, Screen.height / 2, 180, 15);
+
+ this.configWindowPos = this.LoadConfigValue("configWindowPos", this.configWindowPos);
+
+ AntennaRelay.requireLineOfSight = this.LoadConfigValue("requireLineOfSight", false);
+
+ AntennaRelay.radiusRatio = (1 - this.LoadConfigValue("graceRatio", .05d));
+ AntennaRelay.radiusRatio *= AntennaRelay.radiusRatio;
+
+ ARFlightController.requireConnectionForControl =
+ this.LoadConfigValue("requireConnectionForControl", false);
+
+ ModuleLimitedDataTransmitter.fixedPowerCost = this.LoadConfigValue("fixedPowerCost", false);
+
+ GameEvents.onGameSceneLoadRequested.Add(this.onSceneChangeRequested);
+
+ Debug.Log(string.Format("{0} v{1} - ARConfiguration loaded!", this.GetType().Name, this.runningVersion));
+
Tools.PostDebugMessage(this, "Awake.");
}
public void OnGUI()
{
// Only runs once, if the Toolbar is available.
- if (this.toolbarButton == null && ToolbarManager.ToolbarAvailable)
- {
- this.runningVersion = this.GetType().Assembly.GetName().Version;
-
- Tools.PostDebugMessage(this, "Toolbar available; initializing button.");
-
- this.toolbarButton = ToolbarManager.Instance.add("AntennaRange", "ARConfiguration");
- this.toolbarButton.Visibility = new GameScenesVisibility(GameScenes.SPACECENTER);
- this.toolbarButton.Text = "AR";
- this.toolbarButton.TexturePath = "AntennaRange/Textures/toolbarIcon";
- this.toolbarButton.TextColor = (Color)XKCDColors.Amethyst;
- this.toolbarButton.OnClick += delegate(ClickEvent e)
- {
- this.showConfigWindow = !this.showConfigWindow;
- };
-
- this.configWindowPos = this.LoadConfigValue("configWindowPos", this.configWindowPos);
- AntennaRelay.requireLineOfSight = this.LoadConfigValue("requireLineOfSight", false);
- ARFlightController.requireConnectionForControl =
- this.LoadConfigValue("requireConnectionForControl", false);
- ModuleLimitedDataTransmitter.fixedPowerCost = this.LoadConfigValue("fixedPowerCost", false);
-
- Debug.Log(string.Format("{0} v{1} - ARonfiguration loaded!", this.GetType().Name, this.runningVersion));
+ if (ToolbarManager.ToolbarAvailable)
+ {
+ if (this.toolbarButton == null)
+ {
+ Tools.PostDebugMessage(this, "Toolbar available; initializing toolbar button.");
+
+ this.toolbarButton = ToolbarManager.Instance.add("AntennaRange", "ARConfiguration");
+ this.toolbarButton.Visibility = new GameScenesVisibility(GameScenes.SPACECENTER);
+ this.toolbarButton.Text = "AR";
+ this.toolbarButton.TexturePath = "AntennaRange/Textures/toolbarIcon";
+ this.toolbarButton.TextColor = (Color)XKCDColors.Amethyst;
+ this.toolbarButton.OnClick += delegate(ClickEvent e)
+ {
+ this.toggleConfigWindow();
+ };
+ }
+ }
+ else if (this.appLauncherButton == null && ApplicationLauncher.Ready)
+ {
+ Tools.PostDebugMessage(this, "Toolbar available; initializing AppLauncher button.");
+
+ this.appLauncherButton = ApplicationLauncher.Instance.AddModApplication(
+ this.toggleConfigWindow,
+ this.toggleConfigWindow,
+ ApplicationLauncher.AppScenes.SPACECENTER,
+ GameDatabase.Instance.GetTexture(
+ "AntennaRange/Textures/appLauncherIcon",
+ false
+ )
+ );
}
if (this.showConfigWindow)
@@ -124,7 +151,7 @@
GUILayout.BeginHorizontal();
- bool fixedPowerCost = GUILayout.Toggle(ModuleLimitedDataTransmitter.fixedPowerCost, "Use fixed power cost");
+ bool fixedPowerCost = GUILayout.Toggle(ModuleLimitedDataTransmitter.fixedPowerCost, "Use Fixed Power Cost");
if (fixedPowerCost != ModuleLimitedDataTransmitter.fixedPowerCost)
{
ModuleLimitedDataTransmitter.fixedPowerCost = fixedPowerCost;
@@ -133,17 +160,63 @@
GUILayout.EndHorizontal();
+ if (requireLineOfSight)
+ {
+ GUILayout.BeginHorizontal();
+
+ double graceRatio = 1d - Math.Sqrt(AntennaRelay.radiusRatio);
+ double newRatio;
+
+ GUILayout.Label(string.Format("Line of Sight 'Fudge Factor': {0:P0}", graceRatio));
+
+ GUILayout.EndHorizontal();
+
+ GUILayout.BeginHorizontal();
+
+ newRatio = GUILayout.HorizontalSlider((float)graceRatio, 0f, 1f, GUILayout.ExpandWidth(true));
+ newRatio = Math.Round(newRatio, 2);
+
+ if (newRatio != graceRatio)
+ {
+ AntennaRelay.radiusRatio = (1d - newRatio) * (1d - newRatio);
+ this.SaveConfigValue("graceRatio", newRatio);
+ }
+
+ GUILayout.EndHorizontal();
+ }
+
GUILayout.EndVertical();
GUI.DragWindow();
}
- public void Destroy()
- {
+ public void OnDestroy()
+ {
+ GameEvents.onGameSceneLoadRequested.Remove(this.onSceneChangeRequested);
+
if (this.toolbarButton != null)
{
this.toolbarButton.Destroy();
}
+
+ if (this.appLauncherButton != null)
+ {
+ ApplicationLauncher.Instance.RemoveModApplication(this.appLauncherButton);
+ }
+ }
+
+ protected void onSceneChangeRequested(GameScenes scene)
+ {
+ if (scene != GameScenes.SPACECENTER)
+ {
+ print("ARConfiguration: Requesting Destruction.");
+ MonoBehaviour.Destroy(this);
+ }
+ }
+
+ private void toggleConfigWindow()
+ {
+ this.showConfigWindow = !this.showConfigWindow;
}
private T LoadConfigValue<T>(string key, T defaultValue)
--- a/ARFlightController.cs
+++ b/ARFlightController.cs
@@ -43,8 +43,11 @@
#region Fields
protected Dictionary<ConnectionStatus, string> connectionTextures;
+ protected Dictionary<ConnectionStatus, Texture> appLauncherTextures;
protected IButton toolbarButton;
+
+ protected ApplicationLauncherButton appLauncherButton;
#endregion
#region Properties
@@ -62,6 +65,14 @@
}
}
+ protected Texture currentAppLauncherTexture
+ {
+ get
+ {
+ return this.appLauncherTextures[this.currentConnectionStatus];
+ }
+ }
+
public ControlTypes currentControlLock
{
get
@@ -108,14 +119,23 @@
{
this.lockID = "ARConnectionRequired";
+ this.connectionTextures = new Dictionary<ConnectionStatus, string>();
+
+ this.connectionTextures[ConnectionStatus.None] = "AntennaRange/Textures/toolbarIconNoConnection";
+ this.connectionTextures[ConnectionStatus.Suboptimal] = "AntennaRange/Textures/toolbarIconSubOptimal";
+ this.connectionTextures[ConnectionStatus.Optimal] = "AntennaRange/Textures/toolbarIcon";
+
+ this.appLauncherTextures = new Dictionary<ConnectionStatus, Texture>();
+
+ this.appLauncherTextures[ConnectionStatus.None] =
+ GameDatabase.Instance.GetTexture("AntennaRange/Textures/appLauncherIconNoConnection", false);
+ this.appLauncherTextures[ConnectionStatus.Suboptimal] =
+ GameDatabase.Instance.GetTexture("AntennaRange/Textures/appLauncherIconSubOptimal", false);
+ this.appLauncherTextures[ConnectionStatus.Optimal] =
+ GameDatabase.Instance.GetTexture("AntennaRange/Textures/appLauncherIcon", false);
+
if (ToolbarManager.ToolbarAvailable)
{
- this.connectionTextures = new Dictionary<ConnectionStatus, string>();
-
- this.connectionTextures[ConnectionStatus.None] = "AntennaRange/Textures/toolbarIconNoConnection";
- this.connectionTextures[ConnectionStatus.Suboptimal] = "AntennaRange/Textures/toolbarIconSubOptimal";
- this.connectionTextures[ConnectionStatus.Optimal] = "AntennaRange/Textures/toolbarIcon";
-
this.toolbarButton = ToolbarManager.Instance.add("AntennaRange", "ARConnectionStatus");
this.toolbarButton.TexturePath = this.connectionTextures[ConnectionStatus.None];
@@ -130,7 +150,36 @@
protected void FixedUpdate()
{
+ if (this.appLauncherButton == null && !ToolbarManager.ToolbarAvailable && ApplicationLauncher.Ready)
+ {
+ this.appLauncherButton = ApplicationLauncher.Instance.AddModApplication(
+ ApplicationLauncher.AppScenes.FLIGHT,
+ this.appLauncherTextures[ConnectionStatus.None]
+ );
+ }
+
Tools.DebugLogger log = Tools.DebugLogger.New(this);
+
+ VesselCommand availableCommand;
+
+ if (requireConnectionForControl)
+ {
+ availableCommand = this.vessel.CurrentCommand();
+ }
+ else
+ {
+ availableCommand = VesselCommand.Crew;
+ }
+
+ log.AppendFormat("availableCommand: {0}\n\t" +
+ "(availableCommand & VesselCommand.Crew) == VesselCommand.Crew: {1}\n\t" +
+ "(availableCommand & VesselCommand.Probe) == VesselCommand.Probe: {2}\n\t" +
+ "vessel.HasConnectedRelay(): {3}",
+ (int)availableCommand,
+ (availableCommand & VesselCommand.Crew) == VesselCommand.Crew,
+ (availableCommand & VesselCommand.Probe) == VesselCommand.Probe,
+ vessel.HasConnectedRelay()
+ );
// 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...
@@ -139,8 +188,10 @@
requireConnectionForControl &&
this.vessel != null &&
this.vessel.vesselType != VesselType.EVA &&
- !this.vessel.hasCrewCommand() &&
- !this.vessel.HasConnectedRelay())
+ !(
+ (availableCommand & VesselCommand.Crew) == VesselCommand.Crew ||
+ (availableCommand & VesselCommand.Probe) == VesselCommand.Probe && vessel.HasConnectedRelay()
+ ))
{
// ...and if the controls are not currently locked...
if (currentControlLock == ControlTypes.None)
@@ -156,7 +207,11 @@
InputLockManager.RemoveControlLock(this.lockID);
}
- if (this.toolbarButton != null && HighLogic.LoadedSceneIsFlight && FlightGlobals.ActiveVessel != null)
+ if (
+ (this.toolbarButton != null || this.appLauncherButton != null) &&
+ HighLogic.LoadedSceneIsFlight &&
+ FlightGlobals.ActiveVessel != null
+ )
{
log.Append("Checking vessel relay status.\n");
@@ -220,33 +275,46 @@
log.AppendFormat("currentConnectionStatus: {0}, setting texture to {1}",
this.currentConnectionStatus, this.currentConnectionTexture);
- this.toolbarButton.TexturePath = this.currentConnectionTexture;
+ if (this.toolbarButton != null)
+ {
+ this.toolbarButton.TexturePath = this.currentConnectionTexture;
+ }
+ if (this.appLauncherButton != null)
+ {
+ this.appLauncherButton.SetTexture(this.currentAppLauncherTexture);
+ }
}
log.Print();
}
- protected void Destroy()
+ protected void OnDestroy()
{
InputLockManager.RemoveControlLock(this.lockID);
if (this.toolbarButton != null)
{
this.toolbarButton.Destroy();
+ }
+
+ if (this.appLauncherButton != null)
+ {
+ ApplicationLauncher.Instance.RemoveModApplication(this.appLauncherButton);
+ this.appLauncherButton = null;
}
GameEvents.onGameSceneLoadRequested.Remove(this.onSceneChangeRequested);
GameEvents.onVesselChange.Remove(this.onVesselChange);
+
+ print("ARFlightController: Destroyed.");
}
#endregion
#region Event Handlers
protected void onSceneChangeRequested(GameScenes scene)
{
- if (scene != GameScenes.FLIGHT)
- {
- MonoBehaviour.Destroy(this);
- }
+ print("ARFlightController: Requesting Destruction.");
+ MonoBehaviour.Destroy(this);
}
protected void onVesselChange(Vessel vessel)
@@ -264,4 +332,3 @@
}
}
-
--- a/AntennaRange.csproj
+++ b/AntennaRange.csproj
@@ -9,7 +9,7 @@
<OutputType>Library</OutputType>
<RootNamespace>AntennaRange</RootNamespace>
<AssemblyName>AntennaRange</AssemblyName>
- <ReleaseVersion>1.1</ReleaseVersion>
+ <ReleaseVersion>1.3</ReleaseVersion>
<SynchReleaseVersion>false</SynchReleaseVersion>
<TargetFrameworkVersion>v3.5</TargetFrameworkVersion>
<UseMSBuildEngine>False</UseMSBuildEngine>
--- a/AntennaRelay.cs
+++ b/AntennaRelay.cs
@@ -36,6 +36,7 @@
public class AntennaRelay
{
public static bool requireLineOfSight;
+ public static double radiusRatio;
// We don't have a Bard, so we'll hide Kerbin here.
protected CelestialBody Kerbin;
@@ -151,7 +152,7 @@
(
requireLineOfSight &&
this.nearestRelay == null &&
- !this.vessel.hasLineOfSightTo(this.Kerbin, out this._firstOccludingBody)
+ !this.vessel.hasLineOfSightTo(this.Kerbin, out this._firstOccludingBody, radiusRatio)
)
)
{
@@ -231,7 +232,8 @@
}
// Skip vessels to which we do not have line of sight.
- if (requireLineOfSight && !this.vessel.hasLineOfSightTo(potentialVessel, out this._firstOccludingBody))
+ if (requireLineOfSight &&
+ !this.vessel.hasLineOfSightTo(potentialVessel, out this._firstOccludingBody, radiusRatio))
{
Tools.PostDebugMessage(
this,
--- a/ModuleLimitedDataTransmitter.cs
+++ b/ModuleLimitedDataTransmitter.cs
@@ -341,6 +341,11 @@
// Override ModuleDataTransmitter.CanTransmit to return false when transmission is not possible.
public new bool CanTransmit()
{
+ if (this.part == null || this.relay == null)
+ {
+ return false;
+ }
+
PartStates partState = this.part.State;
if (partState == PartStates.DEAD || partState == PartStates.DEACTIVATED)
{
@@ -389,6 +394,75 @@
}
else
{
+ Tools.PostDebugMessage(this, "{0} unable to transmit during TransmitData.", this.part.partInfo.title);
+
+ var logger = Tools.DebugLogger.New(this);
+
+ foreach (ModuleScienceContainer scienceContainer in this.vessel.getModulesOfType<ModuleScienceContainer>())
+ {
+ logger.AppendFormat("Checking ModuleScienceContainer in {0}\n",
+ scienceContainer.part.partInfo.title);
+
+ if (
+ scienceContainer.capacity != 0 &&
+ scienceContainer.GetScienceCount() >= scienceContainer.capacity
+ )
+ {
+ logger.Append("\tInsufficient capacity, skipping.\n");
+ continue;
+ }
+
+ List<ScienceData> dataStored = new List<ScienceData>();
+
+ foreach (ScienceData data in dataQueue)
+ {
+ if (!scienceContainer.allowRepeatedSubjects && scienceContainer.HasData(data))
+ {
+ logger.Append("\tAlready contains subject and repeated subjects not allowed, skipping.\n");
+ continue;
+ }
+
+ logger.AppendFormat("\tAcceptable, adding data on subject {0}... ", data.subjectID);
+ if (scienceContainer.AddData(data))
+ {
+ logger.Append("done, removing from queue.\n");
+
+ dataStored.Add(data);
+ }
+ #if DEBUG
+ else
+ {
+ logger.Append("failed.\n");
+ }
+ #endif
+ }
+
+ dataQueue.RemoveAll(i => dataStored.Contains(i));
+
+ logger.AppendFormat("\t{0} data left in queue.", dataQueue.Count);
+ }
+
+ logger.Print();
+
+ if (dataQueue.Count > 0)
+ {
+ StringBuilder msg = new StringBuilder();
+
+ msg.Append('[');
+ msg.Append(this.part.partInfo.title);
+ msg.AppendFormat("]: {0} data items could not be saved: no space available in data containers.\n");
+ msg.Append("Data to be discarded:\n");
+
+ foreach (ScienceData data in dataQueue)
+ {
+ msg.AppendFormat("\n{0}\n", data.title);
+ }
+
+ ScreenMessages.PostScreenMessage(msg.ToString(), 4f, ScreenMessageStyle.UPPER_LEFT);
+
+ Tools.PostDebugMessage(msg.ToString());
+ }
+
this.PostCannotTransmitError ();
}
--- a/Properties/AssemblyInfo.cs
+++ b/Properties/AssemblyInfo.cs
@@ -39,7 +39,7 @@
// The assembly version has the format "{Major}.{Minor}.{Build}.{Revision}".
// The form "{Major}.{Minor}.*" will automatically update the build and revision,
// and "{Major}.{Minor}.{Build}.*" will update just the revision.
-[assembly: AssemblyVersion("1.2.*")]
+[assembly: AssemblyVersion("1.4.3.*")]
// The following attributes are used to specify the signing key for the assembly,
// if desired. See the Mono documentation for more information about signing.
//[assembly: AssemblyDelaySign(false)]
Binary files a/toolbarIcon.xcf and b/toolbarIcon.xcf differ
Binary files /dev/null and b/toolbarIcon_24x24.xcf differ
Binary files /dev/null and b/toolbarIcon_38x38.xcf differ