forked from ericpzh/MiniRealisticAirways
-
Notifications
You must be signed in to change notification settings - Fork 0
/
TakeoffTask.cs
144 lines (122 loc) · 4.84 KB
/
TakeoffTask.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
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
using DG.Tweening;
using HarmonyLib;
using System;
using UnityEngine.UI;
namespace MiniRealisticAirways
{
[HarmonyPatch(typeof(TakeoffTask), "Start", new Type[] { })]
class PatchTakeoffTaskStart
{
static void Postfix(ref TakeoffTask __instance, ref Image ___AP)
{
BaseAircraftType currentAircraftType = __instance.gameObject.AddComponent<BaseAircraftType>();
currentAircraftType.weight_ = BaseAircraftType.RandomWeight();
Plugin.Log.LogInfo("TakeoffTask started with weight: " + currentAircraftType.weight_);
___AP.transform.DOScale(currentAircraftType.GetScaleFactor(), 0.5f).SetUpdate(isIndependentUpdate: true);
}
}
[HarmonyPatch(typeof(TakeoffTask), "Update", new Type[] { })]
class PatchTakeoffTaskUpdate
{
static void Postfix(ref TakeoffTask __instance, ref Image ___AP)
{
if (UnityEngine.Time.timeScale == 0f)
{
// Skip update during time pause.
return;
}
BaseAircraftType currentAircraftType = __instance.gameObject.GetComponent<BaseAircraftType>();
if (currentAircraftType == null)
{
return;
}
___AP.transform.DOScale(currentAircraftType.GetScaleFactor(), 0.5f).SetUpdate(isIndependentUpdate: true);
}
}
[HarmonyPatch(typeof(TakeoffTask), "SetupTakeoff", new Type[] { })]
class PatchSetupTakeoff
{
static bool Prefix(ref TakeoffTask __instance)
{
ActiveAircraftType activeAircraftType = AircraftManager.Instance.GetComponent<ActiveAircraftType>();
BaseAircraftType currentAircraftType = __instance.GetComponent<BaseAircraftType>();
if (activeAircraftType == null || currentAircraftType == null)
{
return true;
}
activeAircraftType.weight_ = currentAircraftType.weight_;
activeAircraftType.active_ = true;
return true;
}
static void Postfix(ref TakeoffTask __instance)
{
ActiveAircraftType activeAircraftType = AircraftManager.Instance.GetComponent<ActiveAircraftType>();
if (activeAircraftType == null)
{
return;
}
activeAircraftType.active_ = false;
}
}
[HarmonyPatch(typeof(TakeoffTask), "OnPointUp", new Type[] { })]
class PatchTakeoffTaskOnPointUp
{
static void RejectTakeoff(ref TakeoffTask __instance)
{
float duration2 = 0.5f;
__instance.Panel.transform.DOScale(1f, duration2).SetUpdate(isIndependentUpdate: true);
__instance.transform.DOMove(__instance.apron.gameObject.transform.position, duration2).SetUpdate(isIndependentUpdate: true);
AudioManager.instance.PlayCanNotComply();
__instance.inCommand = false;
TakeoffTask.CurrentCommandingTakeoffTask = null;
TakeoffTask.CurrentCommandingTakeoffPoint = null;
TakeoffTask.CurrentCommandingRunway = null;
foreach (Runway runway_ in Runway.Runways)
{
runway_.HideTakeoffPoints();
}
}
static bool Prefix(ref TakeoffTask __instance)
{
if (!__instance.inCommand)
{
return false;
}
if (TakeoffTask.CurrentCommandingTakeoffPoint == null && __instance.apron != null && __instance.apron.gameObject != null)
{
return true;
}
// Can't take-off when wind isn't right.
BaseAircraftType currentAircraftType = __instance.GetComponent<BaseAircraftType>();
if (currentAircraftType == null)
{
return true;
}
WindSock windSock = Plugin.windsock_;
Runway runway = TakeoffTask.CurrentCommandingTakeoffPoint.GetComponent<RunwayRef>().runway;
if (windSock == null || runway == null)
{
return true;
}
float heading = runway.heading;
if (TakeoffTask.CurrentCommandingTakeoffPoint == runway.TakeoffEnd.gameObject)
{
heading = (heading + 180f) % 360f;
}
if (!windSock.CanLand(heading, currentAircraftType.weight_))
{
RejectTakeoff(ref __instance);
return false;
}
// Can't take-off when runway is closed.
if (EventManager.closedRunway_ != null && EventManager.closedRunway_ == runway)
{
Plugin.Log.LogInfo("Rejected due to runway closed event.");
RejectTakeoff(ref __instance);
return false;
}
// TODO: Type based takeoff checking.
return true;
}
}
}