AntennaRelay, ModuleLimitedDataTransmitter: Integrated getLineOfSight methods to detect when LOS is almost lost.
--- a/AntennaRange.cfg
+++ b/AntennaRange.cfg
@@ -46,6 +46,16 @@
maxPowerFactor = 8
maxDataFactor = 4
}
+
+ MODULE
+ {
+ name = ModuleScienceContainer
+
+ dataIsCollectable = true
+ dataIsStorable = false
+
+ storageRange = 2
+ }
}
@PART[mediumDishAntenna]:FOR[AntennaRange]:NEEDS[!RemoteTech2]
@@ -56,6 +66,16 @@
nominalRange = 30000000
maxPowerFactor = 8
maxDataFactor = 4
+ }
+
+ MODULE
+ {
+ name = ModuleScienceContainer
+
+ dataIsCollectable = true
+ dataIsStorable = false
+
+ storageRange = 2
}
}
@@ -68,5 +88,15 @@
maxPowerFactor = 8
maxDataFactor = 4
}
+
+ MODULE
+ {
+ name = ModuleScienceContainer
+
+ dataIsCollectable = true
+ dataIsStorable = false
+
+ storageRange = 2
+ }
}
--- a/AntennaRelay.cs
+++ b/AntennaRelay.cs
@@ -97,6 +97,15 @@
}
/// <summary>
+ /// Gets the <see cref="ToadicusTools.LineOfSightStatus"/> of this relay.
+ /// </summary>
+ public LineOfSightStatus losStatus
+ {
+ get;
+ protected set;
+ }
+
+ /// <summary>
/// Gets the transmit distance.
/// </summary>
/// <value>The transmit distance.</value>
@@ -151,12 +160,13 @@
this.transmitDistance > this.maxTransmitDistance ||
(
requireLineOfSight &&
- this.nearestRelay == null &&
- !this.vessel.hasLineOfSightTo(this.Kerbin, out this._firstOccludingBody, radiusRatio)
+ this.nearestRelay == null
)
)
{
- return false;
+ this.losStatus = this.vessel.getLineOfSightTo(this.Kerbin, out this._firstOccludingBody, radiusRatio);
+
+ return this.losStatus != LineOfSightStatus.Blocked;
}
else
{
@@ -232,15 +242,19 @@
}
// Skip vessels to which we do not have line of sight.
- if (requireLineOfSight &&
- !this.vessel.hasLineOfSightTo(potentialVessel, out this._firstOccludingBody, radiusRatio))
- {
- Tools.PostDebugMessage(
- this,
- "Vessel {0} discarded because we do not have line of sight.",
- potentialVessel.vesselName
- );
- continue;
+ if (requireLineOfSight)
+ {
+ this.losStatus = this.vessel.getLineOfSightTo(potentialVessel, out this._firstOccludingBody, radiusRatio);
+
+ if (this.losStatus == LineOfSightStatus.Blocked)
+ {
+ Tools.PostDebugMessage(
+ this,
+ "Vessel {0} discarded because we do not have line of sight.",
+ potentialVessel.vesselName
+ );
+ continue;
+ }
}
// Find the distance from here to the vessel...
@@ -305,6 +319,8 @@
// HACK: This might not be safe in all circumstances, but since AntennaRelays are not built until Start,
// we hope it is safe enough.
this.Kerbin = FlightGlobals.Bodies.FirstOrDefault(b => b.name == "Kerbin");
+
+ this.losStatus = LineOfSightStatus.Clear;
}
static AntennaRelay()
--- a/ModuleLimitedDataTransmitter.cs
+++ b/ModuleLimitedDataTransmitter.cs
@@ -394,29 +394,55 @@
}
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))
{
- dataQueue.Remove(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)
{
@@ -433,6 +459,8 @@
}
ScreenMessages.PostScreenMessage(msg.ToString(), 4f, ScreenMessageStyle.UPPER_LEFT);
+
+ Tools.PostDebugMessage(msg.ToString());
}
this.PostCannotTransmitError ();
@@ -494,7 +522,7 @@
{
if (this.CanTransmit())
{
- this.UIrelayStatus = string.Intern("Connected");
+ this.UIrelayStatus = string.Format("Connected via {0}", this.relay);
this.UItransmitDistance = Tools.MuMech_ToSI(this.transmitDistance) + "m";
this.UIpacketSize = Tools.MuMech_ToSI(this.DataRate) + "MiT";
this.UIpacketCost = Tools.MuMech_ToSI(this.DataResourceCost) + "E";
@@ -507,7 +535,16 @@
}
else
{
- this.UIrelayStatus = string.Format("Blocked by {0}", this.relay.firstOccludingBody.bodyName);
+ if (this.relay.losStatus == LineOfSightStatus.Blocked)
+ {
+ this.UIrelayStatus =
+ string.Format("Blocked by {0}", this.relay.firstOccludingBody.bodyName);
+ }
+ else if (this.relay.losStatus == LineOfSightStatus.Marginal)
+ {
+ this.UIrelayStatus =
+ string.Format("Almost blocked by {0}", this.relay.firstOccludingBody.bodyName);
+ }
}
this.UImaxTransmitDistance = "N/A";
this.UIpacketSize = "N/A";
--- 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.4.3.*")]
+[assembly: AssemblyVersion("1.5.*")]
// 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)]