forked from allista/AT_Utils
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathCrewTransferBatch.cs
127 lines (117 loc) · 3.66 KB
/
CrewTransferBatch.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
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
using System.Collections.Generic;
namespace AT_Utils
{
public static class CrewTransferBatch
{
#region Vessel
public static bool moveCrew(Vessel fromV, Vessel toV, List<ProtoCrewMember> crew, bool spawn = true)
{
if(crew.Count == 0) return false;
var moved = false;
while(crew.Count > 0)
{
var kerbal = crew[0];
var fromP = fromV.parts.Find(p => p.protoModuleCrew.Contains(kerbal));
if(fromP == null) continue;
var toP = toV.parts.Find(p => p.CrewCapacity > p.protoModuleCrew.Count);
if(toP == null) break;
move_crew(fromP, toP, kerbal);
crew.RemoveAt(0);
moved = true;
}
if(moved && spawn) respawnCrew(fromV, toV);
return crew.Count == 0;
}
public static bool moveCrew(Vessel fromV, Vessel toV, bool spawn = true)
{
var all = true;
var moved = false;
foreach(var fromP in fromV.parts)
{
while(fromP.protoModuleCrew.Count > 0)
{
var toP = toV.parts.Find(p => p.CrewCapacity > p.protoModuleCrew.Count);
if(toP == null) break;
move_crew(fromP, toP, fromP.protoModuleCrew[0]);
moved = true;
}
if(fromP.protoModuleCrew.Count > 0)
{ all = false; break; }
}
if(moved && spawn) respawnCrew(fromV, toV);
return all;
}
public static bool moveCrew(Vessel fromV, Part toP, bool spawn = true)
{
if(toP.CrewCapacity <= toP.protoModuleCrew.Count) return false;
var all = true;
var moved = false;
foreach(var fromP in fromV.parts)
{
while(toP.protoModuleCrew.Count < toP.CrewCapacity && fromP.protoModuleCrew.Count > 0)
{
move_crew(fromP, toP, fromP.protoModuleCrew[0]);
moved = true;
}
if(fromP.protoModuleCrew.Count > 0)
{ all = false; break; }
}
if(moved && spawn) respawnCrew(fromV, toP.vessel);
return all;
}
public static bool moveCrew(Part fromP, Part toP, bool spawn = true)
{
if(fromP.protoModuleCrew.Count == 0 ||
toP.CrewCapacity <= toP.protoModuleCrew.Count) return false;
while(toP.protoModuleCrew.Count < toP.CrewCapacity && fromP.protoModuleCrew.Count > 0)
move_crew(fromP, toP, fromP.protoModuleCrew[0]);
if(spawn) respawnCrew(fromP.vessel, toP.vessel);
return fromP.protoModuleCrew.Count > 0;
}
static void move_crew(Part fromP, Part toP, ProtoCrewMember crew)
{
fromP.RemoveCrewmember(crew);
toP.AddCrewmember(crew);
GameEvents.onCrewTransferred.Fire(new GameEvents.HostedFromToAction<ProtoCrewMember, Part>(crew, fromP, toP));
}
public static void respawnCrew(Vessel V)
{
Vessel.CrewWasModified(V);
FlightGlobals.ActiveVessel.DespawnCrew();
V.StartCoroutine(CallbackUtil.DelayedCallback(1, FlightGlobals.ActiveVessel.SpawnCrew));
}
public static void respawnCrew(Vessel fromV, Vessel toV)
{
Vessel.CrewWasModified(fromV, toV);
FlightGlobals.ActiveVessel.DespawnCrew();
toV.StartCoroutine(CallbackUtil.DelayedCallback(1, FlightGlobals.ActiveVessel.SpawnCrew));
}
#endregion
#region ProtoVessel
//add some crew to a part
public static bool addCrew(ProtoPartSnapshot p, List<ProtoCrewMember> crew)
{
if(crew.Count == 0) return false;
if(p.partInfo.partPrefab.CrewCapacity <= p.protoModuleCrew.Count) return false;
while(p.protoModuleCrew.Count < p.partInfo.partPrefab.CrewCapacity && crew.Count > 0)
{
var kerbal = crew[0];
kerbal.rosterStatus = ProtoCrewMember.RosterStatus.Assigned;
p.protoCrewNames.Add(kerbal.name);
p.protoModuleCrew.Add(kerbal);
crew.RemoveAt(0);
}
return true;
}
//add some crew to a vessel
public static void addCrew(ProtoVessel vsl, List<ProtoCrewMember> crew)
{
foreach(var p in vsl.protoPartSnapshots)
{
if(crew.Count == 0) break;
addCrew(p, crew);
}
}
#endregion
}
}