-
Notifications
You must be signed in to change notification settings - Fork 8
/
Copy pathManeuverPlanner.cs
111 lines (86 loc) · 4.74 KB
/
ManeuverPlanner.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
108
109
110
111
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using KRPC.MechJeb.ExtensionMethods;
using KRPC.MechJeb.Maneuver;
using KRPC.Service.Attributes;
namespace KRPC.MechJeb {
[KRPCClass(Service = "MechJeb")]
public class ManeuverPlanner : Module {
internal const string MechJebType = "MuMech.MechJebModuleManeuverPlanner";
// Fields and methods
private static FieldInfo operationsField;
// Instance objects
private readonly Dictionary<string, Operation> operations = new Dictionary<string, Operation>();
public ManeuverPlanner() {
this.operations.Add("OperationApoapsis", new OperationApoapsis());
this.operations.Add("OperationCircularize", new OperationCircularize());
this.operations.Add("OperationCourseCorrection", new OperationCourseCorrection());
this.operations.Add("OperationEllipticize", new OperationEllipticize());
this.operations.Add("OperationInclination", new OperationInclination());
this.operations.Add("OperationInterplanetaryTransfer", new OperationInterplanetaryTransfer());
this.operations.Add("OperationKillRelVel", new OperationKillRelVel());
this.operations.Add("OperationLambert", new OperationLambert());
this.operations.Add("OperationLan", new OperationLan());
this.operations.Add("OperationLongitude", new OperationLongitude());
this.operations.Add("OperationMoonReturn", new OperationMoonReturn());
this.operations.Add("OperationPeriapsis", new OperationPeriapsis());
this.operations.Add("OperationPlane", new OperationPlane());
this.operations.Add("OperationResonantOrbit", new OperationResonantOrbit());
this.operations.Add("OperationSemiMajor", new OperationSemiMajor());
this.operations.Add("OperationGeneric", new OperationTransfer());
}
internal static void InitType(Type type) {
operationsField = type.GetCheckedField("operation", BindingFlags.NonPublic | BindingFlags.Instance);
}
protected internal override void InitInstance(object instance) {
Dictionary<string, object> operations = instance != null ? ((object[])operationsField.GetValue(instance)).ToDictionary(el => el.GetType().FullName, el => el) : new Dictionary<string, object>();
foreach(KeyValuePair<string, Operation> p in this.operations) {
string operationType = "MuMech." + p.Key;
if(instance == null)
p.Value.InitInstance(null);
else if(operations.TryGetValue(operationType, out object operationInstance))
p.Value.InitInstance(operationInstance);
else {
string error = "Operation " + p.Value.GetType().Name + " cannot be initialized";
Logger.Severe(error + ": " + operationType + " not found");
MechJeb.errors.Add(error);
}
}
}
//TODO: OperationAdvancedTransfer
[KRPCProperty]
public OperationApoapsis OperationApoapsis => (OperationApoapsis)this.operations["OperationApoapsis"];
[KRPCProperty]
public OperationCircularize OperationCircularize => (OperationCircularize)this.operations["OperationCircularize"];
[KRPCProperty]
public OperationCourseCorrection OperationCourseCorrection => (OperationCourseCorrection)this.operations["OperationCourseCorrection"];
[KRPCProperty]
public OperationEllipticize OperationEllipticize => (OperationEllipticize)this.operations["OperationEllipticize"];
[KRPCProperty]
public OperationInclination OperationInclination => (OperationInclination)this.operations["OperationInclination"];
[KRPCProperty]
public OperationInterplanetaryTransfer OperationInterplanetaryTransfer => (OperationInterplanetaryTransfer)this.operations["OperationInterplanetaryTransfer"];
[KRPCProperty]
public OperationKillRelVel OperationKillRelVel => (OperationKillRelVel)this.operations["OperationKillRelVel"];
[KRPCProperty]
public OperationLambert OperationLambert => (OperationLambert)this.operations["OperationLambert"];
[KRPCProperty]
public OperationLan OperationLan => (OperationLan)this.operations["OperationLan"];
[KRPCProperty]
public OperationLongitude OperationLongitude => (OperationLongitude)this.operations["OperationLongitude"];
[KRPCProperty]
public OperationMoonReturn OperationMoonReturn => (OperationMoonReturn)this.operations["OperationMoonReturn"];
[KRPCProperty]
public OperationPeriapsis OperationPeriapsis => (OperationPeriapsis)this.operations["OperationPeriapsis"];
[KRPCProperty]
public OperationPlane OperationPlane => (OperationPlane)this.operations["OperationPlane"];
[KRPCProperty]
public OperationResonantOrbit OperationResonantOrbit => (OperationResonantOrbit)this.operations["OperationResonantOrbit"];
[KRPCProperty]
public OperationSemiMajor OperationSemiMajor => (OperationSemiMajor)this.operations["OperationSemiMajor"];
[KRPCProperty]
public OperationTransfer OperationTransfer => (OperationTransfer)this.operations["OperationGeneric"];
}
}