-
Notifications
You must be signed in to change notification settings - Fork 4
/
Copy pathtrackingstation.cs
107 lines (88 loc) · 3.22 KB
/
trackingstation.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
/*
Copyright 2014-2018 Daniel Kinsman.
This file is part of Stand Alone Map View.
Stand Alone Map View is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
Stand Alone Map View is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with Stand Alone Map View. If not, see <http://www.gnu.org/licenses/>.
*/
using KSP;
using System;
using System.Linq;
namespace StandAloneMapView.client
{
[KSPAddon(KSPAddon.Startup.TrackingStation, false)]
public class TrackingStation : utils.MonoBehaviourExtended
{
public SocketWorker socketWorker;
public VesselChecker VesselChecker;
public TrackingStation()
{
this.LogPrefix = "samv client";
this.socketWorker = new SocketWorker();
this.VesselChecker = new VesselChecker(this);
}
public override void Awake()
{
// Invoke the worker on a 2 second delay to let things "settle in"
// Seems unstable if you don't.
this.InvokeRepeating("UnityWorker", 2.0f, 0.05f);
this.socketWorker.Start();
this.InvokeRepeating("CheckVessels", 15.0f, 5.0f);
}
public override void OnDestroy()
{
this.CancelInvoke("CheckVessels");
if(this.socketWorker != null)
{
this.socketWorker.Stop();
this.socketWorker = null;
}
}
public void UnityWorker()
{
try
{
var message = this.socketWorker.logMessages.TryPop(null);
if(message != null)
this.Log(message);
Flight.UpdateTime(this.socketWorker.TimeUpdate);
this.UpdateVessel();
}
catch(Exception e)
{
LogException(e);
throw;
}
}
public void CheckVessels()
{
this.VesselChecker.Check();
}
public void UpdateVessel()
{
var vesselUpdate = this.socketWorker.VesselUpdate;
if(vesselUpdate == null)
return;
CheckVessels();
TrackingStation.UpdateVessel(this, vesselUpdate);
}
public static void UpdateVessel(utils.MonoBehaviourExtended logger, comms.Vessel vesselUpdate)
{
var vessel = FlightGlobals.Vessels.FirstOrDefault(v => v.id == vesselUpdate.Id);
if(vessel != null)
{
GamePersistence.SaveGame(Startup.SAVEFILE, Startup.SAVEDIRECTORY, SaveMode.OVERWRITE);
FlightDriver.StartAndFocusVessel(HighLogic.CurrentGame, FlightGlobals.Vessels.IndexOf(vessel));
return;
}
logger.LogDebug("Vessel {0} not found (vessel id {1}).", vesselUpdate.Name, vesselUpdate.Id);
}
}
}