Skip to content

Commit dfbf98a

Browse files
committed
Fix engine state persistence for repairs
1 parent 3a03e74 commit dfbf98a

6 files changed

Lines changed: 141 additions & 27 deletions

File tree

CachedEngineState.cs

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
namespace TestFlight
2+
{
3+
public class CachedEngineState : IConfigNode
4+
{
5+
[Persistent] public bool allowShutdown;
6+
[Persistent] public bool allowRestart;
7+
[Persistent] public int numIgnitions;
8+
9+
public CachedEngineState() { }
10+
11+
public CachedEngineState(ConfigNode node)
12+
{
13+
Load(node);
14+
}
15+
16+
public CachedEngineState(EngineModuleWrapper engine)
17+
{
18+
allowShutdown = engine.allowShutdown;
19+
allowRestart = engine.allowRestart;
20+
numIgnitions = engine.GetIgnitionCount();
21+
}
22+
23+
public void Load(ConfigNode node)
24+
{
25+
ConfigNode.LoadObjectFromConfig(this, node);
26+
}
27+
28+
public void Save(ConfigNode node)
29+
{
30+
ConfigNode.CreateConfigFromObject(this, node);
31+
}
32+
}
33+
}

TestFlight.csproj

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,7 @@
6767
</Reference>
6868
</ItemGroup>
6969
<ItemGroup>
70+
<Compile Include="CachedEngineState.cs" />
7071
<Compile Include="EngineRunData.cs" />
7172
<Compile Include="Failure Bases\TestFlightFailureBase_Avionics.cs" />
7273
<Compile Include="Failure Bases\TestFlightFailureBase_Docking.cs" />

TestFlightAPI/TestFlightAPI/EngineModuleWrapper.cs

Lines changed: 25 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
using System.Collections.Generic;
44
using System.Linq;
55

6+
using KSP.Localization;
67
using UnityEngine;
78

89
using TestFlightAPI;
@@ -107,6 +108,23 @@ public bool allowShutdown
107108
}
108109
}
109110

111+
public bool allowRestart
112+
{
113+
get
114+
{
115+
if (engineType == EngineModuleType.UNKNOWN)
116+
return false;
117+
118+
return moduleEngine.allowRestart;
119+
}
120+
set
121+
{
122+
if (engineType == EngineModuleType.UNKNOWN)
123+
return;
124+
moduleEngine.allowRestart = value;
125+
}
126+
}
127+
110128
public bool throttleLocked
111129
{
112130
get
@@ -332,7 +350,7 @@ public void DisableRestart()
332350
return;
333351

334352
// Need to disable this to prevent other mods from restarting the engine.
335-
moduleEngine.allowRestart = false;
353+
allowRestart = false;
336354

337355
// For some reason, need to disable GUI as well
338356
Events["Activate"].active = false;
@@ -341,6 +359,12 @@ public void DisableRestart()
341359
Events["Shutdown"].guiActive = false;
342360
}
343361

362+
public void ResetStatus()
363+
{
364+
Status = Localizer.Format("#autoLOC_219034");
365+
StatusL2 = string.Empty;
366+
}
367+
344368
// Reduce fuel flow
345369
public void SetFuelFlowMult(float multiplier)
346370
{

TestFlightFailure_Engine.cs

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ protected class EngineHandler
2020

2121
protected List<EngineHandler> engines = new List<EngineHandler>();
2222
protected ITestFlightCore core = null;
23+
protected Dictionary<int, CachedEngineState> engineStates;
2324

2425
public new bool TestFlightEnabled
2526
{
@@ -45,6 +46,43 @@ public override void OnStart(StartState state)
4546
Startup();
4647
}
4748

49+
public override void OnLoad(ConfigNode node)
50+
{
51+
base.OnLoad(node);
52+
53+
ConfigNode[] cNodes = node.GetNodes("ENGINESTATE");
54+
if (cNodes.Length > 0 && engineStates == null)
55+
engineStates = new Dictionary<int, CachedEngineState>();
56+
57+
foreach (ConfigNode cNode in cNodes)
58+
{
59+
int id = 0;
60+
if (!cNode.TryGetValue("id", ref id))
61+
{
62+
Debug.LogError("[TestFlight] Invalid ENGINESTATE data in OnLoad:" + cNode);
63+
continue;
64+
}
65+
var state = new CachedEngineState(cNode);
66+
engineStates.Add(id, state);
67+
}
68+
}
69+
70+
public override void OnSave(ConfigNode node)
71+
{
72+
base.OnSave(node);
73+
74+
if (engineStates?.Count > 0)
75+
{
76+
foreach (KeyValuePair<int, CachedEngineState> kvp in engineStates)
77+
{
78+
var cn = new ConfigNode("ENGINESTATE");
79+
kvp.Value.Save(cn);
80+
cn.AddValue("id", kvp.Key);
81+
node.AddNode(cn);
82+
}
83+
}
84+
}
85+
4886
private void AddEngine(EngineModuleWrapper engine)
4987
{
5088
var engineHandler = new EngineHandler();
@@ -114,6 +152,15 @@ public override void SetActiveConfig(string alias)
114152
currentConfig.TryGetValue("engineID", ref engineID);
115153
}
116154

155+
public override float DoRepair()
156+
{
157+
foreach (EngineHandler engine in engines)
158+
{
159+
engine.engine.ResetStatus();
160+
}
161+
return base.DoRepair();
162+
}
163+
117164
private readonly WaitForFixedUpdate _wait = new WaitForFixedUpdate();
118165
public IEnumerator UpdateEngineStatus()
119166
{

TestFlightFailure_IgnitionFail.cs

Lines changed: 26 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -324,12 +324,19 @@ public override void DoFailure()
324324
core.LogCareerFailure(vessel, failureTitle);
325325
}
326326

327+
if (engineStates == null)
328+
engineStates = new Dictionary<int, CachedEngineState>();
329+
engineStates.Clear();
330+
327331
Log($"IgnitionFail: Failing {engines.Count} engine(s)");
328332
for (int i = 0; i < engines.Count; i++)
329333
{
330334
EngineHandler engine = engines[i];
331335
if (engine.failEngine)
332336
{
337+
var engineState = new CachedEngineState(engine.engine);
338+
engineStates.Add(i, engineState);
339+
333340
if (severity.ToLowerInvariant() == "major")
334341
{
335342
engine.engine.DisableRestart();
@@ -346,21 +353,31 @@ public override void DoFailure()
346353

347354
public override float DoRepair()
348355
{
349-
base.DoRepair();
350356
for (int i = 0; i < engines.Count; i++)
351357
{
352358
EngineHandler engine = engines[i];
359+
// Prevent auto-ignition on repair
360+
engine.engine.Shutdown();
361+
engine.engine.Events["Activate"].active = true;
362+
engine.engine.Events["Activate"].guiActive = true;
363+
engine.engine.Events["Shutdown"].guiActive = true;
364+
engine.engine.allowRestart = true;
365+
366+
CachedEngineState engineState = null;
367+
if (engineStates?.TryGetValue(i, out engineState) ?? false)
353368
{
354-
// Prevent auto-ignition on repair
355-
engine.engine.Shutdown();
356-
engine.engine.Events["Activate"].active = true;
357-
engine.engine.Events["Activate"].guiActive = true;
358-
engine.engine.Events["Shutdown"].guiActive = true;
359-
if (restoreIgnitionCharge || this.vessel.situation == Vessel.Situations.PRELAUNCH)
360-
RestoreIgnitor();
361-
engines[i].failEngine = false;
369+
engine.engine.allowShutdown = engineState.allowShutdown;
370+
engine.engine.allowRestart = engineState.allowRestart;
371+
engine.engine.SetIgnitionCount(engineState.numIgnitions);
362372
}
373+
374+
if (restoreIgnitionCharge || this.vessel.situation == Vessel.Situations.PRELAUNCH)
375+
RestoreIgnitor();
376+
engine.failEngine = false;
377+
engine.engine.failed = false;
378+
engine.engine.failMessage = "";
363379
}
380+
base.DoRepair();
364381
return 0;
365382
}
366383

TestFlightFailure_ShutdownEngine.cs

Lines changed: 9 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -4,14 +4,6 @@ namespace TestFlight
44
{
55
public class TestFlightFailure_ShutdownEngine : TestFlightFailure_Engine
66
{
7-
protected struct CachedEngineState
8-
{
9-
public bool allowShutdown;
10-
public int numIgnitions;
11-
}
12-
13-
Dictionary<int, CachedEngineState> engineStates;
14-
157
/// <summary>
168
/// Triggers the failure controlled by the failure module
179
/// </summary>
@@ -23,10 +15,8 @@ public override void DoFailure()
2315
engineStates.Clear();
2416
foreach (EngineHandler engine in engines)
2517
{
26-
int id = engine.engine.Module.GetInstanceID();
27-
CachedEngineState engineState = new CachedEngineState();
28-
engineState.allowShutdown = engine.engine.allowShutdown;
29-
engineState.numIgnitions = engine.engine.GetIgnitionCount();
18+
int id = engines.IndexOf(engine);
19+
var engineState = new CachedEngineState(engine.engine);
3020
engine.engine.Shutdown();
3121
var numIgnitionsToRemove = 1;
3222
if (severity.ToLowerInvariant() == "major")
@@ -45,24 +35,26 @@ public override void DoFailure()
4535

4636
public override float DoRepair()
4737
{
48-
base.DoRepair();
4938
// for each engine restore it
5039
foreach (EngineHandler engine in engines)
5140
{
52-
int id = engine.engine.Module.GetInstanceID();
53-
if (engineStates.ContainsKey(id))
41+
int id = engines.IndexOf(engine);
42+
CachedEngineState engineState = null;
43+
if (engineStates?.TryGetValue(id, out engineState) ?? false)
5444
{
5545
engine.engine.enabled = true;
5646
engine.engine.Events["Activate"].active = true;
5747
engine.engine.Events["Activate"].guiActive = true;
5848
engine.engine.Events["Shutdown"].guiActive = true;
59-
engine.engine.allowShutdown = engineStates[id].allowShutdown;
60-
engine.engine.SetIgnitionCount(engineStates[id].numIgnitions);
49+
engine.engine.allowShutdown = engineState.allowShutdown;
50+
engine.engine.allowRestart = engineState.allowRestart;
51+
engine.engine.SetIgnitionCount(engineState.numIgnitions);
6152
engine.engine.failed = false;
6253
engine.engine.failMessage = "";
6354
}
6455
}
6556
engineStates.Clear();
57+
base.DoRepair();
6658
return 0;
6759
}
6860
}

0 commit comments

Comments
 (0)