@jtff/miztemplate-lib 3.10.13 → 4.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lua/lib/HoundElint.lua +11423 -11415
- package/lua/lib/Moose_.lua +26495 -35921
- package/lua/src/010-root_menus.lua +4 -3
- package/lua/src/020-mission_functions.lua +807 -217
- package/lua/src/110-set_clients.lua +53 -43
- package/lua/src/115-airbases.lua +191 -0
- package/lua/src/120-tankers.lua +577 -461
- package/lua/src/130-airboss.lua +1982 -440
- package/lua/src/150-awacs.lua +541 -445
- package/lua/src/160-atis.lua +136 -73
- package/lua/src/170-cap_zone_training.lua +176 -73
- package/lua/src/172-cap_zone_war.lua +383 -226
- package/lua/src/173-fox_zone_training.lua +142 -67
- package/lua/src/174-qra-scenario.lua +417 -362
- package/lua/src/176-random_air_traffic.lua +101 -12
- package/lua/src/178-training-intercept.lua +312 -261
- package/lua/src/180-logistics.lua +2 -2
- package/lua/src/190-ranges.lua +104 -37
- package/lua/src/191-sams.lua +4 -4
- package/lua/src/193-training_ranges.lua +2 -2
- package/lua/src/195-reaper-ondemand.lua +29 -29
- package/lua/src/196-fac_ranges.lua +2 -2
- package/lua/src/197-elint-ondemand.lua +53 -53
- package/lua/src/199-skynet.lua +55 -55
- package/package.json +1 -1
- package/scripts/inject-scripts.js +3 -31
- package/lua/src/135-pedro.lua +0 -21
- package/lua/src/140-beacons.lua +0 -19
package/lua/src/120-tankers.lua
CHANGED
|
@@ -1,495 +1,613 @@
|
|
|
1
1
|
-- *****************************************************************************
|
|
2
2
|
-- ** Tankers **
|
|
3
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
|
-
|
|
4
|
+
|
|
5
|
+
-- region TankerConfigFunctions
|
|
6
|
+
|
|
7
|
+
-- @type TankerCallsignConfig
|
|
8
|
+
-- @field #string alias Alias for the tanker.
|
|
9
|
+
-- @field #number name CallSign name for the tanker.
|
|
10
|
+
-- @field #number number CallSign number (1-7) for the tanker.
|
|
11
|
+
|
|
12
|
+
--- Parse an Tanker Callsign config Object.
|
|
13
|
+
-- @param #JsonObject config Config object to parse
|
|
14
|
+
-- @param #string parser_name Parser name ("AIRBASE", "AIRBOSS", etc...).
|
|
15
|
+
-- @return #TankerCallsignConfig tankerCallsignConfigJson Parsed CallSign object
|
|
16
|
+
function ParseTankerCallsignConfigJson(config, parser_name)
|
|
17
|
+
local tankerCallsignConfigJson = {}
|
|
18
|
+
local default_number = 1
|
|
19
|
+
-- **************************************************************************
|
|
20
|
+
-- name
|
|
21
|
+
-- **************************************************************************
|
|
22
|
+
if type(config.name) == "number" then
|
|
23
|
+
if table.count_value(CALLSIGN.Tanker, config.name) > 0 then
|
|
24
|
+
tankerCallsignConfigJson.name = config.name
|
|
25
|
+
else
|
|
26
|
+
Jtff_log.error("Tanker Callsign name is not a valid CallSign name, skipping tanker configuration",
|
|
27
|
+
parser_name)
|
|
28
|
+
return {}
|
|
29
|
+
end
|
|
30
|
+
else
|
|
31
|
+
Jtff_log.error("Tanker Callsign name is not valid, skipping tanker configuration", parser_name)
|
|
32
|
+
return {}
|
|
33
|
+
end
|
|
34
|
+
-- **************************************************************************
|
|
35
|
+
-- alias
|
|
36
|
+
-- **************************************************************************
|
|
37
|
+
if type(config.alias) == "string" then
|
|
38
|
+
tankerCallsignConfigJson.alias = config.alias
|
|
39
|
+
else
|
|
40
|
+
Jtff_log.warn("Tanker Callsign alias is not a string, defaulting to Tanker name", parser_name)
|
|
41
|
+
tankerCallsignConfigJson.alias = tankerCallsignConfigJson.name
|
|
42
|
+
end
|
|
43
|
+
-- **************************************************************************
|
|
44
|
+
-- number
|
|
45
|
+
-- **************************************************************************
|
|
46
|
+
if type(config.number) == "number" then
|
|
47
|
+
if config.number >= 1 and config.number <= 7 then
|
|
48
|
+
tankerCallsignConfigJson.number = config.number
|
|
49
|
+
else
|
|
50
|
+
Jtff_log.warn(
|
|
51
|
+
string.format("Tanker Callsign number is not a valid number (1-7), defaulting number to %d", default_number),
|
|
52
|
+
parser_name)
|
|
53
|
+
tankerCallsignConfigJson.number = default_number
|
|
54
|
+
end
|
|
55
|
+
else
|
|
56
|
+
Jtff_log.warn(string.format("Tanker Callsign number is not a number, defaulting number to %d", default_number),
|
|
57
|
+
parser_name)
|
|
58
|
+
tankerCallsignConfigJson.number = default_number
|
|
59
|
+
end
|
|
60
|
+
return tankerCallsignConfigJson
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
-- @type TankerConfig
|
|
64
|
+
-- @field #boolean enable Enable tanker creation.
|
|
65
|
+
-- @field #string type Tanker type.
|
|
66
|
+
-- @field #string airbaseName Airbase name.
|
|
67
|
+
-- @field #boolean autospawn Autospawn tanker.
|
|
68
|
+
-- @field #RacetrackConfig racetrack Racetrack configuration.
|
|
69
|
+
-- @field #number nbEscort Number of escort aircraft.
|
|
70
|
+
-- @field #number missionmaxduration Maximum mission duration in minutes.
|
|
71
|
+
-- @field #number refuelSystem Refueling system (0=boom, 1=probe).
|
|
72
|
+
-- @field #tacanConfig tacan TACAN configuration.
|
|
73
|
+
-- @field #radioConfig radio Radio configuration.
|
|
74
|
+
-- @field #number fuelLowThreshold Fuel low threshold in %.
|
|
75
|
+
-- @field #TankerCallsignConfig callsign Callsign configuration.
|
|
76
|
+
|
|
77
|
+
|
|
78
|
+
--- Parse Tanker config Object.
|
|
79
|
+
-- @param #JsonObject config Config object to parse
|
|
80
|
+
-- @return #TankerConfig tankerConfigJson Parsed TankerConfig object
|
|
81
|
+
function ParseTankersConfigJson(config)
|
|
82
|
+
local json = require('Scripts/json')
|
|
83
|
+
local parser_name = "TANKER"
|
|
84
|
+
local default_autospawn = false
|
|
85
|
+
local default_nbEscort = 0
|
|
86
|
+
local default_missionmaxduration = 180
|
|
87
|
+
local default_fuelLowThreshold = 35
|
|
88
|
+
local default_refuelSystem = Unit.RefuelingSystem.PROBE_AND_DROGUE
|
|
89
|
+
-- **************************************************************************
|
|
90
|
+
-- enable
|
|
91
|
+
-- **************************************************************************
|
|
92
|
+
local tankerConfigJson = {
|
|
93
|
+
enable = config.enable or false,
|
|
94
|
+
}
|
|
95
|
+
-- **************************************************************************
|
|
96
|
+
-- type
|
|
97
|
+
-- **************************************************************************
|
|
98
|
+
if type(config.type) == "string" then
|
|
99
|
+
tankerConfigJson.type = config.type
|
|
100
|
+
else
|
|
101
|
+
Jtff_log.error("Tanker type is not a string, skipping tanker configuration", parser_name)
|
|
102
|
+
config.enable = false
|
|
103
|
+
return config
|
|
104
|
+
end
|
|
105
|
+
-- **************************************************************************
|
|
106
|
+
-- airbaseName
|
|
107
|
+
-- **************************************************************************
|
|
108
|
+
if type(config.airbaseName) == "string" then
|
|
109
|
+
if type(AIRBASE:FindByName(config.airbaseName)) == 'nil' then
|
|
110
|
+
Jtff_log.error(
|
|
111
|
+
string.format(
|
|
112
|
+
"Airbase %s not found, skipping tanker configuration",
|
|
113
|
+
config.airbaseName
|
|
114
|
+
),
|
|
115
|
+
parser_name
|
|
116
|
+
)
|
|
117
|
+
config.enable = false
|
|
118
|
+
return config
|
|
119
|
+
else
|
|
120
|
+
tankerConfigJson.airbaseName = config.airbaseName
|
|
121
|
+
end
|
|
122
|
+
else
|
|
123
|
+
Jtff_log.error("Airbase warehouse is not a string", parser_name)
|
|
124
|
+
config.enable = false
|
|
125
|
+
return config
|
|
126
|
+
end
|
|
127
|
+
-- **************************************************************************
|
|
128
|
+
-- autospawn
|
|
129
|
+
-- **************************************************************************
|
|
130
|
+
if type(config.autospawn) == "boolean" then
|
|
131
|
+
tankerConfigJson.autospawn = config.autospawn
|
|
132
|
+
else
|
|
133
|
+
Jtff_log.warn("Tanker %s autospawn not defined : defaulting", parser_name)
|
|
134
|
+
tankerConfigJson.autospawn = default_autospawn
|
|
135
|
+
end
|
|
136
|
+
-- **************************************************************************
|
|
137
|
+
-- racetrack
|
|
138
|
+
-- **************************************************************************
|
|
139
|
+
if type(config.racetrack) == "table" then
|
|
140
|
+
tankerConfigJson.racetrack = ParseRacetrackConfigJson(config.racetrack, parser_name)
|
|
141
|
+
if next(tankerConfigJson.racetrack) == nil then
|
|
142
|
+
Jtff_log.error("Tanker racetrack is not a valid Racetrack object, skipping tanker configuration", parser_name)
|
|
143
|
+
config.enable = false
|
|
144
|
+
return config
|
|
145
|
+
end
|
|
146
|
+
else
|
|
147
|
+
Jtff_log.error("Tanker racetrack is not a table, skipping tanker configuration", parser_name)
|
|
148
|
+
config.enable = false
|
|
149
|
+
return config
|
|
150
|
+
end
|
|
151
|
+
-- **************************************************************************
|
|
152
|
+
-- nbEscort
|
|
153
|
+
-- **************************************************************************
|
|
154
|
+
if type(config.nbEscort) == "number" then
|
|
155
|
+
tankerConfigJson.nbEscort = config.nbEscort
|
|
156
|
+
else
|
|
157
|
+
Jtff_log.warn(string.format("Tanker nbEscort is not a number, defaulting to %d", default_nbEscort), parser_name)
|
|
158
|
+
tankerConfigJson.nbEscort = default_nbEscort
|
|
159
|
+
end
|
|
160
|
+
-- **************************************************************************
|
|
161
|
+
-- missionmaxduration
|
|
162
|
+
-- **************************************************************************
|
|
163
|
+
if type(config.missionmaxduration) == "number" then
|
|
164
|
+
tankerConfigJson.missionmaxduration = config.missionmaxduration
|
|
165
|
+
else
|
|
166
|
+
Jtff_log.warn(
|
|
167
|
+
string.format("Tanker missionmaxduration is not a number, defaulting to %d", default_missionmaxduration),
|
|
168
|
+
parser_name)
|
|
169
|
+
tankerConfigJson.missionmaxduration = default_missionmaxduration
|
|
170
|
+
end
|
|
171
|
+
-- **************************************************************************
|
|
172
|
+
-- refuelSystem
|
|
173
|
+
-- **************************************************************************
|
|
174
|
+
if type(config.refuelSystem) == "number" then
|
|
175
|
+
tankerConfigJson.refuelSystem = config.refuelSystem
|
|
176
|
+
else
|
|
177
|
+
Jtff_log.warn(string.format("Tanker refuelSystem is not a number, defaulting to %s", default_refuelSystem), parser_name)
|
|
178
|
+
tankerConfigJson.refuelSystem = default_refuelSystem
|
|
179
|
+
end
|
|
180
|
+
-- **************************************************************************
|
|
181
|
+
-- tacan
|
|
182
|
+
-- **************************************************************************
|
|
183
|
+
if type(config.tacan) == "table" then
|
|
184
|
+
tankerConfigJson.tacan = ParseTacanConfigJson(config.tacan, parser_name)
|
|
185
|
+
if next(tankerConfigJson.tacan) == nil then
|
|
186
|
+
Jtff_log.error("Tanker tacan is not a valid TACAN object, skipping tanker configuration", parser_name)
|
|
187
|
+
config.enable = false
|
|
188
|
+
return config
|
|
189
|
+
end
|
|
190
|
+
else
|
|
191
|
+
Jtff_log.error("Tanker tacan is not a table, skipping tanker configuration", parser_name)
|
|
192
|
+
config.enable = false
|
|
193
|
+
return config
|
|
194
|
+
end
|
|
195
|
+
-- **************************************************************************
|
|
196
|
+
-- radio
|
|
197
|
+
-- **************************************************************************
|
|
198
|
+
if type(config.radio) == "table" then
|
|
199
|
+
tankerConfigJson.radio = ParseRadioConfigJson(config.radio, parser_name)
|
|
200
|
+
if next(tankerConfigJson.radio) == nil then
|
|
201
|
+
Jtff_log.error("Tanker radio is not a valid Radio object, skipping tanker configuration", parser_name)
|
|
202
|
+
config.enable = false
|
|
203
|
+
return config
|
|
204
|
+
end
|
|
205
|
+
else
|
|
206
|
+
Jtff_log.error("Tanker radio is not a table, skipping tanker configuration", parser_name)
|
|
207
|
+
config.enable = false
|
|
208
|
+
return config
|
|
209
|
+
end
|
|
210
|
+
-- **************************************************************************
|
|
211
|
+
-- fuelLowThreshold
|
|
212
|
+
-- **************************************************************************
|
|
213
|
+
if type(config.fuelLowThreshold) == "number" then
|
|
214
|
+
tankerConfigJson.fuelLowThreshold = config.fuelLowThreshold
|
|
215
|
+
else
|
|
216
|
+
Jtff_log.warn(
|
|
217
|
+
string.format("Tanker fuelLowThreshold is not a number, defaulting to %d %%", default_fuelLowThreshold),
|
|
218
|
+
parser_name)
|
|
219
|
+
tankerConfigJson.fuelLowThreshold = default_fuelLowThreshold
|
|
220
|
+
end
|
|
221
|
+
-- **************************************************************************
|
|
222
|
+
-- callsign
|
|
223
|
+
-- **************************************************************************
|
|
224
|
+
if type(config.callsign) == "table" then
|
|
225
|
+
tankerConfigJson.callsign = ParseTankerCallsignConfigJson(config.callsign, parser_name)
|
|
226
|
+
if next(tankerConfigJson.callsign) == nil then
|
|
227
|
+
Jtff_log.error("Tanker callsign is not a valid Callsign object, skipping tanker configuration", parser_name)
|
|
228
|
+
config.enable = false
|
|
229
|
+
return config
|
|
230
|
+
end
|
|
231
|
+
else
|
|
232
|
+
Jtff_log.error("Tanker callsign is not a table, skipping tanker configuration", parser_name)
|
|
233
|
+
config.enable = false
|
|
234
|
+
return config
|
|
235
|
+
end
|
|
236
|
+
Jtff_log.debug(
|
|
237
|
+
string.format(
|
|
238
|
+
"parsed Tanker config for %s Tanker, resulting config :\n%s",
|
|
239
|
+
config.type or "",
|
|
240
|
+
json:encode(
|
|
241
|
+
tankerConfigJson,
|
|
242
|
+
{ indent = true }
|
|
243
|
+
)
|
|
244
|
+
),
|
|
245
|
+
parser_name
|
|
246
|
+
)
|
|
247
|
+
return tankerConfigJson
|
|
248
|
+
end
|
|
249
|
+
|
|
250
|
+
-- endregion TankerConfigFunctions
|
|
251
|
+
|
|
252
|
+
-- region TankerFunctions
|
|
253
|
+
|
|
254
|
+
--- Trigger a Tanker mission.
|
|
255
|
+
-- @param #table objTanker Tanker object.
|
|
256
|
+
function TriggerTankerMission(objTanker)
|
|
257
|
+
objTanker.airwing:AddMission(objTanker.mission)
|
|
258
|
+
Jtff_log.info(
|
|
259
|
+
string.format(
|
|
260
|
+
'Tanker %s triggered',
|
|
261
|
+
objTanker.customconfig.type
|
|
262
|
+
),
|
|
263
|
+
"TANKER"
|
|
264
|
+
)
|
|
265
|
+
end
|
|
266
|
+
|
|
267
|
+
--- Generate a Tanker mission object.
|
|
268
|
+
-- @param #TankerConfig tankerconfig Tanker configuration object.
|
|
269
|
+
-- @param #boolean manageEscort Manage escort mission creation.
|
|
270
|
+
-- @return #AUFTRAG tankermission Tanker mission object, #AIRWING airwing Airwing object.
|
|
271
|
+
function GenerateTankerMission(tankerconfig, manageEscort)
|
|
272
|
+
local generateEscortMission = false
|
|
273
|
+
if manageEscort == true then
|
|
274
|
+
generateEscortMission = true
|
|
275
|
+
end
|
|
276
|
+
local airwing = FindAirwingByAirbaseName(tankerconfig.airbaseName)
|
|
277
|
+
local tankermission = nil
|
|
278
|
+
if airwing == nil then
|
|
279
|
+
Jtff_log.error(
|
|
280
|
+
string.format(
|
|
281
|
+
"Airwing not found for Airbase %s, skipping tanker mission generation",
|
|
282
|
+
tankerconfig.airbaseName
|
|
283
|
+
),
|
|
284
|
+
"TANKER"
|
|
285
|
+
)
|
|
286
|
+
return nil,nil
|
|
287
|
+
else
|
|
288
|
+
local function isAnchorCoordValid(MGRSString, autospawn)
|
|
289
|
+
if autospawn == true then
|
|
290
|
+
return true
|
|
49
291
|
end
|
|
50
|
-
if
|
|
51
|
-
|
|
52
|
-
function(tankerObject, airBaseName)
|
|
53
|
-
--trigger.action.outText('RTB schedule trigger Tanker group : '..(tankerObject.tanker.GroupName)..' airbase'..(tankerObject.customconfig.baseUnit)..'...', 45)
|
|
54
|
-
tankerObject:RTB(AIRBASE:FindByName(tankerObject.customconfig.baseUnit))
|
|
55
|
-
end,
|
|
56
|
-
self
|
|
57
|
-
)
|
|
58
|
-
--trigger.action.outText('Tanker configured to RTB in : '..(self.customconfig.missionmaxduration)..' minutes max...', 45)
|
|
292
|
+
if #(UTILS.Split(MGRSString," ")) ~= 5 then
|
|
293
|
+
return false
|
|
59
294
|
end
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
295
|
+
return true
|
|
296
|
+
end
|
|
297
|
+
local orbitCoord = {x=0, y=0, z=0}
|
|
298
|
+
if (isAnchorCoordValid(tankerconfig.racetrack.coordinate, tankerconfig.autospawn) == true) then
|
|
299
|
+
orbitCoord = COORDINATE:NewFromMGRSString(tankerconfig.racetrack.coordinate)
|
|
300
|
+
else
|
|
301
|
+
orbitCoord = AIRBASE:FindByName(tankerconfig.airbaseName):GetCoordinate()
|
|
302
|
+
end
|
|
303
|
+
tankermission = AUFTRAG:NewTANKER(
|
|
304
|
+
orbitCoord,
|
|
305
|
+
tankerconfig.racetrack.fl * 100,
|
|
306
|
+
tankerconfig.racetrack.speed,
|
|
307
|
+
tankerconfig.racetrack.heading,
|
|
308
|
+
tankerconfig.racetrack.leg,
|
|
309
|
+
tankerconfig.refuelSystem
|
|
310
|
+
)
|
|
311
|
+
tankermission:SetDuration(tankerconfig.missionmaxduration*60)
|
|
312
|
+
tankermission:SetReturnToLegion(true)
|
|
313
|
+
tankermission:SetRequiredAssets(1)
|
|
314
|
+
tankermission:SetName(
|
|
315
|
+
string.format(
|
|
316
|
+
"Tanker-%s",
|
|
317
|
+
tankerconfig.type
|
|
318
|
+
)
|
|
319
|
+
)
|
|
320
|
+
tankermission:SetRadio(
|
|
321
|
+
tankerconfig.radio.freq,
|
|
322
|
+
tankerconfig.radio.modulation
|
|
323
|
+
)
|
|
324
|
+
tankermission:SetTACAN(
|
|
325
|
+
tankerconfig.tacan.channel,
|
|
326
|
+
tankerconfig.tacan.morse,
|
|
327
|
+
nil,
|
|
328
|
+
tankerconfig.tacan.band
|
|
329
|
+
)
|
|
330
|
+
tankermission:SetEPLRS(true)
|
|
331
|
+
tankermission:SetEmission(false)
|
|
332
|
+
tankermission:SetVerbosity(JTFF_verbosity_levels[JTFF_LOGLEVEL])
|
|
333
|
+
tankermission.additionalData = {
|
|
334
|
+
minEscort = tankerconfig.nbEscort,
|
|
335
|
+
maxEscort = tankerconfig.nbEscort,
|
|
336
|
+
tankerType = tankerconfig.type,
|
|
337
|
+
tankerDuration = tankerconfig.missionmaxduration,
|
|
338
|
+
callsign = tankerconfig.callsign,
|
|
339
|
+
tankerTacan = tankerconfig.tacan,
|
|
340
|
+
tankerRadio = tankerconfig.radio,
|
|
341
|
+
tankerRacetrack = tankerconfig.racetrack,
|
|
342
|
+
tankerFuelLowThreshold = tankerconfig.fuelLowThreshold,
|
|
343
|
+
}
|
|
344
|
+
function tankermission:OnAfterScheduled(From, Event, To)
|
|
345
|
+
local tankerToEscort = self:GetOpsGroups()[1]
|
|
346
|
+
local airwing = tankerToEscort:GetAirwing()
|
|
347
|
+
tankerToEscort:SwitchCallsign(
|
|
348
|
+
self.additionalData.callsign.name,
|
|
349
|
+
self.additionalData.callsign.number
|
|
350
|
+
)
|
|
351
|
+
tankerToEscort:SetFuelLowThreshold(self.additionalData.tankerFuelLowThreshold)
|
|
352
|
+
tankerToEscort:SetFuelCriticalThreshold(self.additionalData.tankerFuelLowThreshold-10)
|
|
353
|
+
tankerToEscort:SetFuelLowRefuel(true)
|
|
354
|
+
tankerToEscort:SetFuelLowRTB(false)
|
|
355
|
+
tankerToEscort:SetFuelCriticalRTB(true)
|
|
356
|
+
if (Jtff_map_marker[tankerToEscort:GetName()]) then
|
|
357
|
+
COORDINATE:RemoveMark(Jtff_map_marker[tankerToEscort:GetName()])
|
|
358
|
+
end
|
|
359
|
+
if(self.additionalData.tankerTacan) then
|
|
360
|
+
Jtff_map_marker[tankerToEscort:GetName()] = COORDINATE:NewFromMGRSString(self.additionalData.tankerRacetrack.coordinate):MarkToCoalition(
|
|
361
|
+
string.format(
|
|
362
|
+
'OnDemand Tanker %s - TCN %i\nFL %i at %i knots\nFreq %.2f MHz\nOn station for %i minutes\nRacetrack : %i ° for %i nm',
|
|
363
|
+
self.additionalData.tankerType,
|
|
364
|
+
self.additionalData.tankerTacan.channel,
|
|
365
|
+
UTILS.Round(self.additionalData.tankerRacetrack.fl , 0),
|
|
366
|
+
self.additionalData.tankerRacetrack.speed,
|
|
367
|
+
self.additionalData.tankerRadio.freq,
|
|
368
|
+
self.additionalData.tankerDuration,
|
|
369
|
+
self.additionalData.tankerRacetrack.heading,
|
|
370
|
+
self.additionalData.tankerRacetrack.leg
|
|
371
|
+
),
|
|
372
|
+
tankerToEscort:GetCoalition(),
|
|
373
|
+
true,
|
|
374
|
+
'OnDemand Tanker %s is Activated'
|
|
67
375
|
)
|
|
68
376
|
else
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
377
|
+
Jtff_map_marker[tankerToEscort:GetName()] = COORDINATE:NewFromMGRSString(self.additionalData.tankerRacetrack.coordinate):MarkToCoalition(
|
|
378
|
+
string.format(
|
|
379
|
+
'OnDemand Tanker %s\nFL %i at %i knots\nFreq %.2f MHz\nOn station for %i minutes\nRacetrack : %i ° for %i nm',
|
|
380
|
+
self.additionalData.tankerType,
|
|
381
|
+
UTILS.Round(self.additionalData.tankerRacetrack.fl , 0),
|
|
382
|
+
self.additionalData.tankerRacetrack.speed,
|
|
383
|
+
self.additionalData.tankerRadio.freq,
|
|
384
|
+
self.additionalData.tankerDuration,
|
|
385
|
+
self.additionalData.tankerRacetrack.heading,
|
|
386
|
+
self.additionalData.tankerRacetrack.leg
|
|
387
|
+
),
|
|
388
|
+
tankerToEscort:GetCoalition(),
|
|
389
|
+
true,
|
|
390
|
+
'OnDemand Tanker %s is Activated'
|
|
75
391
|
)
|
|
76
392
|
end
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
if self.customconfig.escortgroupname then
|
|
80
|
-
jtff_log.info('RTB: '..self.tanker.GroupName..'...',"TANKER")
|
|
81
|
-
if self.escortGroupObject:IsAirborne(false) == true then
|
|
82
|
-
jtff_log.info('escort RTB : '.. self.escortGroupObject.GroupName..' Tanker : '..self.tanker.GroupName..'...',"TANKER")
|
|
83
|
-
self.escortGroupObject:RouteRTB(airbase)
|
|
84
|
-
else
|
|
85
|
-
--self.escortGroupObject:Destroy(nil, 5)
|
|
86
|
-
end
|
|
393
|
+
function tankerToEscort:OnBeforeRTB(From, Event, To, Airbase, speed, holdspeed)
|
|
394
|
+
COORDINATE:RemoveMark(Jtff_map_marker[self:GetName()])
|
|
87
395
|
end
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
function objTanker:OnEventKill(event)
|
|
91
|
-
if self.customconfig.escortgroupname then
|
|
92
|
-
jtff_log.info(event.target' Killed !! Sending escort Home',"TANKER")
|
|
93
|
-
self.escortGroupObject:RouteRTB(AIRBASE:FindByName(self.customconfig.baseUnit))
|
|
396
|
+
function tankerToEscort:OnAfterDead(From, Event, To)
|
|
397
|
+
COORDINATE:RemoveMark(Jtff_map_marker[self:GetName()])
|
|
94
398
|
end
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
if
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
399
|
+
function tankerToEscort:OnAfterElementDestroyed(From, Event, To, Element)
|
|
400
|
+
COORDINATE:RemoveMark(Jtff_map_marker[self:GetName()])
|
|
401
|
+
end
|
|
402
|
+
if self.additionalData.maxEscort > 0 and generateEscortMission == true then
|
|
403
|
+
local escortMission = AUFTRAG:NewESCORT(
|
|
404
|
+
tankerToEscort,
|
|
405
|
+
{x=250, y=100, z=400},
|
|
406
|
+
35,
|
|
407
|
+
{'Air'}
|
|
408
|
+
)
|
|
409
|
+
escortMission:SetReturnToLegion(true)
|
|
410
|
+
escortMission:SetRequiredAssets(self.additionalData.minEscort, self.additionalData.maxEscort)
|
|
411
|
+
escortMission:SetReinforce(3)
|
|
412
|
+
escortMission:SetName(string.format("Escort-Tanker-%s", self.additionalData.tankerType))
|
|
413
|
+
escortMission:SetEPLRS(true)
|
|
414
|
+
escortMission:SetEmission(true)
|
|
415
|
+
escortMission:SetVerbosity(JTFF_verbosity_levels[JTFF_LOGLEVEL])
|
|
416
|
+
escortMission:SetFormation(ENUMS.Formation.FixedWing.EchelonRight.Close)
|
|
417
|
+
escortMission:SetMissionAltitude(20000)
|
|
418
|
+
escortMission:SetMissionWaypointRandomization(UTILS.NMToMeters(20))
|
|
419
|
+
escortMission:SetProhibitAfterburnerExecutePhase()
|
|
420
|
+
escortMission:SetTime(
|
|
421
|
+
300,
|
|
422
|
+
( self.additionalData.tankerDuration * 60 ) + 1200
|
|
423
|
+
)
|
|
424
|
+
function escortMission:OnAfterScheduled(From, Event, To)
|
|
425
|
+
for _, opsGroup in ipairs(self:GetOpsGroups()) do
|
|
426
|
+
opsGroup:SetFuelLowThreshold(30)
|
|
427
|
+
opsGroup:SetFuelCriticalThreshold(20)
|
|
428
|
+
opsGroup:SetFuelLowRefuel(true)
|
|
429
|
+
opsGroup:SetFuelLowRTB(false)
|
|
430
|
+
opsGroup:SetFuelCriticalRTB(true)
|
|
431
|
+
opsGroup:SetJettisonEmptyTanks(false)
|
|
432
|
+
opsGroup:SetJettisonWeapons(false)
|
|
433
|
+
end
|
|
109
434
|
end
|
|
435
|
+
airwing:AddMission(escortMission)
|
|
110
436
|
end
|
|
111
437
|
end
|
|
112
|
-
|
|
113
|
-
tankersArray[compteur]:Start()
|
|
438
|
+
return tankermission,airwing
|
|
114
439
|
end
|
|
115
440
|
end
|
|
116
441
|
|
|
442
|
+
-- endregion TankerFunctions
|
|
443
|
+
|
|
444
|
+
TankersArray = {}
|
|
445
|
+
MenuCoalitionTankers = {}
|
|
446
|
+
for _k, _coalition in pairs(coalition.side) do
|
|
447
|
+
MenuCoalitionTankers[UTILS.GetCoalitionName(_coalition)] = MENU_COALITION:New(_coalition, "Tankers", MenuCoalition[UTILS.GetCoalitionName(_coalition)])
|
|
448
|
+
end
|
|
449
|
+
local compteur = #TankersArray
|
|
450
|
+
for _index, _currentTankerConfigObject in ipairs(TankersConfig) do
|
|
451
|
+
local tankerconfig = ParseTankersConfigJson(_currentTankerConfigObject)
|
|
452
|
+
if tankerconfig.enable == true then
|
|
453
|
+
compteur = compteur + 1
|
|
454
|
+
Jtff_log.info(
|
|
455
|
+
string.format(
|
|
456
|
+
'configuration Tanker %s: ',
|
|
457
|
+
tankerconfig.type
|
|
458
|
+
),
|
|
459
|
+
"TANKER"
|
|
460
|
+
)
|
|
461
|
+
local tankermission, airwing = GenerateTankerMission(tankerconfig, true)
|
|
462
|
+
if tankermission == nil or airwing == nil then
|
|
463
|
+
Jtff_log.error(
|
|
464
|
+
string.format(
|
|
465
|
+
"Airwing not found for Airbase %s, skipping tanker Registration",
|
|
466
|
+
tankerconfig.airbaseName
|
|
467
|
+
),
|
|
468
|
+
"TANKER"
|
|
469
|
+
)
|
|
470
|
+
else
|
|
471
|
+
TankersArray[compteur] = {
|
|
472
|
+
customconfig = tankerconfig,
|
|
473
|
+
mission = tankermission,
|
|
474
|
+
airwing = airwing,
|
|
475
|
+
}
|
|
476
|
+
if tankerconfig.autospawn == true then
|
|
477
|
+
Jtff_log.info(
|
|
478
|
+
string.format(
|
|
479
|
+
'autospawn Tanker %s',
|
|
480
|
+
tankerconfig.type
|
|
481
|
+
),
|
|
482
|
+
"TANKER"
|
|
483
|
+
)
|
|
484
|
+
TriggerTankerMission(TankersArray[compteur])
|
|
485
|
+
-- TankersArray[compteur].airwing:AddMission(TankersArray[compteur].mission)
|
|
486
|
+
else
|
|
487
|
+
Jtff_log.info(
|
|
488
|
+
string.format(
|
|
489
|
+
'OnDemand Tanker %s Registering',
|
|
490
|
+
tankerconfig.type
|
|
491
|
+
),
|
|
492
|
+
"TANKER"
|
|
493
|
+
)
|
|
494
|
+
end
|
|
495
|
+
end
|
|
496
|
+
end
|
|
497
|
+
end
|
|
498
|
+
|
|
499
|
+
|
|
117
500
|
-- *****************************************************************************
|
|
118
501
|
-- ** OnDemand Tankers **
|
|
119
502
|
-- *********************************************************
|
|
120
|
-
function
|
|
121
|
-
|
|
122
|
-
if (
|
|
123
|
-
for index,
|
|
124
|
-
if (
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
503
|
+
function TriggerOnDemandTanker(type, askedDuration, askedFL, askedSpeed, askedAnchorCoord, askedOrbitHeading,
|
|
504
|
+
askedOrbitLeg)
|
|
505
|
+
if (TankersConfig) then
|
|
506
|
+
for index, objTanker in ipairs(TankersArray) do
|
|
507
|
+
if (objTanker.customconfig.type == type) then
|
|
508
|
+
Jtff_log.debug(
|
|
509
|
+
string.format(
|
|
510
|
+
'OnDemandTanker : Found type %s Tanker !',
|
|
511
|
+
type
|
|
512
|
+
),
|
|
513
|
+
"TANKER"
|
|
514
|
+
)
|
|
515
|
+
if (askedAnchorCoord) then
|
|
516
|
+
objTanker.customconfig.racetrack.coordinate = askedAnchorCoord:ToStringMGRS()
|
|
128
517
|
end
|
|
129
518
|
if (askedFL and askedFL > 0) then
|
|
130
|
-
|
|
519
|
+
objTanker.customconfig.racetrack.fl = askedFL
|
|
520
|
+
end
|
|
521
|
+
if (askedSpeed and askedSpeed > 0) then
|
|
522
|
+
objTanker.customconfig.racetrack.speed = askedSpeed
|
|
131
523
|
end
|
|
132
|
-
if (
|
|
133
|
-
|
|
524
|
+
if (askedDuration ~= nil and askedDuration ~= 0) then
|
|
525
|
+
objTanker.customconfig.missionmaxduration = askedDuration
|
|
134
526
|
end
|
|
135
527
|
if (askedOrbitHeading) then
|
|
136
|
-
if (askedOrbitLeg
|
|
528
|
+
if (askedOrbitLeg) then
|
|
137
529
|
--heading et Leg demandés
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
length = askedOrbitLeg,
|
|
141
|
-
}
|
|
530
|
+
objTanker.customconfig.racetrack.heading = askedOrbitHeading % 360
|
|
531
|
+
objTanker.customconfig.racetrack.leg = math.max(10, askedOrbitLeg)
|
|
142
532
|
else
|
|
143
533
|
--heading demandé et leg non demandé
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
OnDemandTanker.orbit = {
|
|
147
|
-
heading = askedOrbitHeading % 360,
|
|
148
|
-
length = 30,
|
|
149
|
-
}
|
|
150
|
-
else
|
|
151
|
-
OnDemandTanker.orbit = {
|
|
152
|
-
heading = askedOrbitHeading % 360,
|
|
153
|
-
length = math.max(10, OnDemandTanker.orbit.length),
|
|
154
|
-
}
|
|
155
|
-
end
|
|
156
|
-
else
|
|
157
|
-
OnDemandTanker.orbit = {
|
|
158
|
-
heading = askedOrbitHeading % 360,
|
|
159
|
-
length = 30,
|
|
160
|
-
}
|
|
161
|
-
end
|
|
162
|
-
end
|
|
163
|
-
else
|
|
164
|
-
--pas de heading demandé
|
|
165
|
-
if (OnDemandTanker.orbit ) then
|
|
166
|
-
if (not(OnDemandTanker.orbit.heading)) then
|
|
167
|
-
OnDemandTanker.orbit.heading = 90
|
|
168
|
-
end
|
|
169
|
-
if (not(OnDemandTanker.orbit.length)) then
|
|
170
|
-
OnDemandTanker.orbit.length = 30
|
|
171
|
-
else
|
|
172
|
-
OnDemandTanker.orbit.length = math.max(10, OnDemandTanker.orbit.length)
|
|
173
|
-
end
|
|
174
|
-
else
|
|
175
|
-
OnDemandTanker.orbit = {
|
|
176
|
-
heading = 90,
|
|
177
|
-
length = 30,
|
|
178
|
-
}
|
|
179
|
-
end
|
|
180
|
-
end
|
|
181
|
-
local set_group_tanker = SET_GROUP:New()
|
|
182
|
-
:FilterActive()
|
|
183
|
-
:FilterPrefixes(OnDemandTanker.groupName)
|
|
184
|
-
:FilterCategories("plane")
|
|
185
|
-
:FilterOnce()
|
|
186
|
-
local aliveTankersGroupList = set_group_tanker:GetSetObjects()
|
|
187
|
-
|
|
188
|
-
local is_tanker_spawned = false
|
|
189
|
-
jtff_log.debug(string.format('Looking for a Group corresponding to template %s', string.format("%s-%s", OnDemandTanker.groupName, OnDemandTanker.type)),"TANKER")
|
|
190
|
-
for currrent_index, current_group in ipairs(aliveTankersGroupList) do
|
|
191
|
-
if (
|
|
192
|
-
(not(is_tanker_spawned)) and
|
|
193
|
-
(string.find(
|
|
194
|
-
current_group.GroupName,
|
|
195
|
-
string.format("%s-%s",OnDemandTanker.groupName, OnDemandTanker.type),
|
|
196
|
-
1,
|
|
197
|
-
true
|
|
198
|
-
) ~= nil)
|
|
199
|
-
) then
|
|
200
|
-
jtff_log.debug(string.format('Found %s corresponding to template %s', current_group.GroupName, string.format("%s-%s", OnDemandTanker.groupName, OnDemandTanker.type)),"TANKER")
|
|
201
|
-
is_tanker_spawned = true
|
|
202
|
-
TankerGroup = current_group
|
|
534
|
+
objTanker.customconfig.racetrack.heading = askedOrbitHeading % 360
|
|
535
|
+
objTanker.customconfig.racetrack.leg = 30
|
|
203
536
|
end
|
|
204
537
|
end
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
jtff_log.debug(string.format('OnDemandTanker already in air : rerouting %s', OnDemandTanker.groupName),"TANKER")
|
|
215
|
-
TankerGroup:ClearTasks()
|
|
216
|
-
table.insert(
|
|
217
|
-
TankerRoute,
|
|
218
|
-
askedAnchorCoord
|
|
219
|
-
:SetAltitude(UTILS.FeetToMeters(OnDemandTanker.altitude))
|
|
220
|
-
:WaypointAirTurningPoint(
|
|
221
|
-
nil,
|
|
222
|
-
UTILS.KnotsToKmph(OnDemandTanker.speed),
|
|
223
|
-
{
|
|
224
|
-
{
|
|
225
|
-
id = 'Tanker',
|
|
226
|
-
params = {
|
|
227
|
-
}
|
|
228
|
-
},
|
|
229
|
-
{
|
|
230
|
-
id = 'ControlledTask',
|
|
231
|
-
params = {
|
|
232
|
-
task =
|
|
233
|
-
{
|
|
234
|
-
id = 'Orbit',
|
|
235
|
-
params = {
|
|
236
|
-
pattern = AI.Task.OrbitPattern.RACE_TRACK,
|
|
237
|
-
speed = UTILS.KnotsToMps(OnDemandTanker.speed),
|
|
238
|
-
altitude = UTILS.FeetToMeters(OnDemandTanker.altitude)
|
|
239
|
-
}
|
|
240
|
-
},
|
|
241
|
-
stopCondition = {
|
|
242
|
-
duration = askedDuration * 60
|
|
243
|
-
}
|
|
244
|
-
},
|
|
245
|
-
},
|
|
246
|
-
},
|
|
247
|
-
"Refuel Start"
|
|
248
|
-
)
|
|
249
|
-
)
|
|
250
|
-
table.insert(
|
|
251
|
-
TankerRoute,
|
|
252
|
-
askedAnchorCoord
|
|
253
|
-
:Translate(UTILS.NMToMeters(OnDemandTanker.orbit.length), OnDemandTanker.orbit.heading, true, false)
|
|
254
|
-
:SetAltitude(UTILS.FeetToMeters(OnDemandTanker.altitude))
|
|
255
|
-
:WaypointAirTurningPoint(
|
|
256
|
-
nil,
|
|
257
|
-
UTILS.KnotsToKmph(OnDemandTanker.speed),
|
|
258
|
-
{
|
|
259
|
-
{
|
|
260
|
-
id = 'Tanker',
|
|
261
|
-
params = {
|
|
262
|
-
}
|
|
263
|
-
},
|
|
264
|
-
},
|
|
265
|
-
"Orbit End"
|
|
266
|
-
)
|
|
267
|
-
)
|
|
268
|
-
table.insert(
|
|
269
|
-
TankerRoute,
|
|
270
|
-
RTBAirbase
|
|
271
|
-
:GetCoordinate()
|
|
272
|
-
:WaypointAirLanding(
|
|
273
|
-
UTILS.KnotsToKmph(OnDemandTanker.speed),
|
|
274
|
-
RTBAirbase
|
|
275
|
-
)
|
|
276
|
-
)
|
|
277
|
-
else
|
|
278
|
-
jtff_log.info(string.format('OnDemandTanker Spawning %s', OnDemandTanker.groupName),"TANKER")
|
|
279
|
-
local SpawnTanker = SPAWN:NewWithAlias(
|
|
280
|
-
OnDemandTanker.groupName,
|
|
281
|
-
string.format("%s-%s",OnDemandTanker.groupName,OnDemandTanker.type)
|
|
538
|
+
local oldMission = objTanker.airwing:GetMissionByID(objTanker.mission.auftragsnummer)
|
|
539
|
+
if oldMission then
|
|
540
|
+
Jtff_log.info(
|
|
541
|
+
string.format(
|
|
542
|
+
'Mission %s already registered to Airwing %s, rerouting now',
|
|
543
|
+
objTanker.mission:GetName(),
|
|
544
|
+
objTanker.airwing:GetName()
|
|
545
|
+
),
|
|
546
|
+
"TANKER"
|
|
282
547
|
)
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
AIRBASE:FindByName(OnDemandTanker.baseUnit),
|
|
293
|
-
SPAWN.Takeoff.Hot,
|
|
294
|
-
nil,
|
|
295
|
-
OnDemandTanker.terminalType,
|
|
296
|
-
true
|
|
297
|
-
)
|
|
298
|
-
table.insert(TankerRoute,
|
|
299
|
-
AIRBASE
|
|
300
|
-
:FindByName(OnDemandTanker.baseUnit)
|
|
301
|
-
:GetCoordinate()
|
|
302
|
-
:WaypointAirTakeOffParkingHot()
|
|
303
|
-
)
|
|
304
|
-
else
|
|
305
|
-
TankerGroup = SpawnTanker:SpawnFromCoordinate(
|
|
306
|
-
askedAnchorCoord
|
|
307
|
-
:GetRandomCoordinateInRadius(
|
|
308
|
-
UTILS.NMToMeters(30),
|
|
309
|
-
UTILS.NMToMeters(20)
|
|
310
|
-
)
|
|
311
|
-
:SetAltitude(
|
|
312
|
-
UTILS.FeetToMeters(OnDemandTanker.altitude)
|
|
313
|
-
)
|
|
314
|
-
)
|
|
315
|
-
end
|
|
316
|
-
TankerGroup.customconfig = OnDemandTanker
|
|
317
|
-
TankerGroup.spawnAbsTime = timer.getAbsTime()
|
|
318
|
-
TankerGroup.missionmaxduration = askedDuration
|
|
319
|
-
table.insert(TankerRoute,
|
|
320
|
-
askedAnchorCoord
|
|
321
|
-
:SetAltitude(UTILS.FeetToMeters(OnDemandTanker.altitude))
|
|
322
|
-
:WaypointAirTurningPoint(
|
|
323
|
-
nil,
|
|
324
|
-
UTILS.KnotsToKmph(OnDemandTanker.speed),
|
|
325
|
-
{
|
|
326
|
-
{
|
|
327
|
-
id = 'Tanker',
|
|
328
|
-
params = {
|
|
329
|
-
}
|
|
330
|
-
},
|
|
331
|
-
{
|
|
332
|
-
id = 'ControlledTask',
|
|
333
|
-
params = {
|
|
334
|
-
task =
|
|
335
|
-
{
|
|
336
|
-
id = 'Orbit',
|
|
337
|
-
params = {
|
|
338
|
-
pattern = AI.Task.OrbitPattern.RACE_TRACK,
|
|
339
|
-
speed = UTILS.KnotsToMps(OnDemandTanker.speed),
|
|
340
|
-
altitude = UTILS.FeetToMeters(OnDemandTanker.altitude)
|
|
341
|
-
}
|
|
342
|
-
},
|
|
343
|
-
stopCondition = {
|
|
344
|
-
duration = askedDuration * 60
|
|
345
|
-
}
|
|
346
|
-
},
|
|
347
|
-
},
|
|
348
|
-
},
|
|
349
|
-
"Refuel Start"
|
|
350
|
-
)
|
|
548
|
+
local objOpsGroup = objTanker.mission:GetOpsGroups()[1]
|
|
549
|
+
Jtff_log.debug(
|
|
550
|
+
string.format(
|
|
551
|
+
'OpsGroup executing previous mission %s ID=%d is %s',
|
|
552
|
+
oldMission:GetName(),
|
|
553
|
+
oldMission.auftragsnummer,
|
|
554
|
+
objOpsGroup:GetName()
|
|
555
|
+
),
|
|
556
|
+
"TANKER"
|
|
351
557
|
)
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
:
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
id = 'Tanker',
|
|
362
|
-
params = {
|
|
363
|
-
}
|
|
364
|
-
}
|
|
365
|
-
},
|
|
366
|
-
"Orbit End"
|
|
367
|
-
)
|
|
558
|
+
objTanker.mission, objTanker.airwing = GenerateTankerMission(objTanker.customconfig, false)
|
|
559
|
+
Jtff_log.debug(
|
|
560
|
+
string.format(
|
|
561
|
+
'Next Mission generated %s ID=%d for airwing %s',
|
|
562
|
+
objTanker.mission:GetName(),
|
|
563
|
+
objTanker.mission.auftragsnummer,
|
|
564
|
+
objTanker.airwing:GetName()
|
|
565
|
+
),
|
|
566
|
+
"TANKER"
|
|
368
567
|
)
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
:
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
)
|
|
568
|
+
objOpsGroup:AddMission(objTanker.mission)
|
|
569
|
+
Jtff_log.debug(
|
|
570
|
+
string.format(
|
|
571
|
+
'Added next Mission %s generated ID=%d to group %s : %d mission(s) active(s)',
|
|
572
|
+
objTanker.mission:GetName(),
|
|
573
|
+
objTanker.mission.auftragsnummer,
|
|
574
|
+
objOpsGroup:GetName(),
|
|
575
|
+
#(objOpsGroup.missionqueue)
|
|
576
|
+
),
|
|
577
|
+
"TANKER"
|
|
378
578
|
)
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
TankerGroup.beacon:ActivateTACAN(OnDemandTanker.tacan.channel, "Y", OnDemandTanker.tacan.morse, true)
|
|
385
|
-
end
|
|
386
|
-
if (OnDemandTanker.callsign) then
|
|
387
|
-
TankerGroup:CommandSetCallsign(OnDemandTanker.callsign.name, OnDemandTanker.callsign.number, 2)
|
|
388
|
-
end
|
|
389
|
-
if OnDemandTanker.escortgroupname then
|
|
390
|
-
TankerGroup.escortSpawnObject = SPAWN:NewWithAlias(OnDemandTanker.escortgroupname,'escort-'.. OnDemandTanker.groupName)
|
|
391
|
-
:InitRepeatOnEngineShutDown()
|
|
392
|
-
:InitSkill("Excellent")
|
|
393
|
-
:OnSpawnGroup(function(SpawnGroup)
|
|
394
|
-
taskGroupEscort({TankerGroup, SpawnGroup})
|
|
395
|
-
end)
|
|
396
|
-
TankerGroup.escortGroupObject = spawnRecoveryTankerEscort(TankerGroup.escortSpawnObject,OnDemandTanker)
|
|
397
|
-
if OnDemandTanker.missionmaxduration then
|
|
398
|
-
TankerGroup.escortGroupObject:ScheduleOnce(OnDemandTanker.missionmaxduration*60,
|
|
399
|
-
function(SpawnGroup, airBaseName)
|
|
400
|
-
--trigger.action.outText('RTB schedule trigger Tanker-escort group : '..(SpawnGroup.GroupName)..' airbase'..(airBaseName)..'...', 45)
|
|
401
|
-
SpawnGroup:RouteRTB(AIRBASE:FindByName(airBaseName))
|
|
402
|
-
end,
|
|
403
|
-
TankerGroup.escortGroupObject,
|
|
404
|
-
OnDemandTanker.baseUnit
|
|
405
|
-
)
|
|
406
|
-
--trigger.action.outText('Tanker-escort configured to RTB in : '..(OnDemandTanker.missionmaxduration)..' minutes max...', 45)
|
|
407
|
-
end
|
|
408
|
-
end
|
|
409
|
-
if (map_marker[TankerGroup:GetName()]) then
|
|
410
|
-
COORDINATE:RemoveMark(map_marker[TankerGroup:GetName()])
|
|
411
|
-
end
|
|
412
|
-
if(OnDemandTanker.tacan) then
|
|
413
|
-
map_marker[TankerGroup:GetName()] = askedAnchorCoord:MarkToCoalition(
|
|
579
|
+
-- objTanker.airwing:AddMission(objTanker.mission)
|
|
580
|
+
objTanker.mission:AssignLegion(objTanker.airwing)
|
|
581
|
+
table.insert(objTanker.airwing.missionqueue, objTanker.mission)
|
|
582
|
+
oldMission:SetTime(nil, 5)
|
|
583
|
+
Jtff_log.debug(
|
|
414
584
|
string.format(
|
|
415
|
-
'
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
OnDemandTanker.freq,
|
|
421
|
-
askedDuration,
|
|
422
|
-
OnDemandTanker.orbit.heading,
|
|
423
|
-
OnDemandTanker.orbit.length
|
|
585
|
+
'Stopped old Mission %s (ID=%d) from group %s : %d mission(s) active(s)',
|
|
586
|
+
oldMission:GetName(),
|
|
587
|
+
oldMission.auftragsnummer,
|
|
588
|
+
objOpsGroup:GetName() or "unknown",
|
|
589
|
+
#(objOpsGroup.missionqueue or {})
|
|
424
590
|
),
|
|
425
|
-
|
|
426
|
-
true,
|
|
427
|
-
'OnDemand Tanker %s is Activated'
|
|
591
|
+
"TANKER"
|
|
428
592
|
)
|
|
429
593
|
else
|
|
430
|
-
|
|
594
|
+
Jtff_log.info(
|
|
431
595
|
string.format(
|
|
432
|
-
'
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
OnDemandTanker.speed,
|
|
436
|
-
OnDemandTanker.freq,
|
|
437
|
-
askedDuration,
|
|
438
|
-
OnDemandTanker.orbit.heading,
|
|
439
|
-
OnDemandTanker.orbit.length
|
|
596
|
+
'Mission %s not registered to Airwing %s, spawning now',
|
|
597
|
+
objTanker.mission:GetName(),
|
|
598
|
+
objTanker.airwing:GetName()
|
|
440
599
|
),
|
|
441
|
-
|
|
442
|
-
true,
|
|
443
|
-
'OnDemand Tanker %s is Activated'
|
|
600
|
+
"TANKER"
|
|
444
601
|
)
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
TankerGroup:HandleEvent(EVENTS.Crash)
|
|
448
|
-
TankerGroup:HandleEvent(EVENTS.Dead)
|
|
449
|
-
function TankerGroup:OnEventLand(EventData)
|
|
450
|
-
COORDINATE:RemoveMark(map_marker[self:GetName()])
|
|
451
|
-
if self.customconfig.escortgroupname then
|
|
452
|
-
jtff_log.info('RTB: '..self.GroupName..'...',"TANKER")
|
|
453
|
-
if self.escortGroupObject:IsAirborne(false) == true then
|
|
454
|
-
jtff_log.info('escort RTB : '.. self.escortGroupObject.GroupName..' Tanker : '..self.GroupName..'...',"TANKER")
|
|
455
|
-
self.escortGroupObject:RouteRTB()
|
|
456
|
-
else
|
|
457
|
-
--self.escortGroupObject:Destroy(nil, 5)
|
|
458
|
-
end
|
|
459
|
-
end
|
|
460
|
-
end
|
|
461
|
-
function TankerGroup:OnEventCrash(EventData)
|
|
462
|
-
COORDINATE:RemoveMark(map_marker[self:GetName()])
|
|
463
|
-
if self.customconfig.escortgroupname then
|
|
464
|
-
jtff_log.info('RTB: '..self.GroupName..'...',"TANKER")
|
|
465
|
-
if self.escortGroupObject:IsAirborne(false) == true then
|
|
466
|
-
jtff_log.info('escort RTB : '.. self.escortGroupObject.GroupName..' Tanker : '..self.GroupName..'...',"TANKER")
|
|
467
|
-
self.escortGroupObject:RouteRTB()
|
|
468
|
-
else
|
|
469
|
-
--self.escortGroupObject:Destroy(nil, 5)
|
|
470
|
-
end
|
|
471
|
-
end
|
|
472
|
-
end
|
|
473
|
-
function TankerGroup:OnEventDead(EventData)
|
|
474
|
-
COORDINATE:RemoveMark(map_marker[self:GetName()])
|
|
475
|
-
if self.customconfig.escortgroupname then
|
|
476
|
-
jtff_log.info('RTB: '..self.GroupName..'...',"TANKER")
|
|
477
|
-
if self.escortGroupObject:IsAirborne(false) == true then
|
|
478
|
-
jtff_log.info('escort RTB : '.. self.escortGroupObject.GroupName..' Tanker : '..self.GroupName..'...',"TANKER")
|
|
479
|
-
self.escortGroupObject:RouteRTB()
|
|
480
|
-
else
|
|
481
|
-
--self.escortGroupObject:Destroy(nil, 5)
|
|
482
|
-
end
|
|
483
|
-
end
|
|
602
|
+
objTanker.mission, objTanker.airwing = GenerateTankerMission(objTanker.customconfig, true)
|
|
603
|
+
objTanker.airwing:AddMission(objTanker.mission)
|
|
484
604
|
end
|
|
485
605
|
end
|
|
486
606
|
end
|
|
487
607
|
end
|
|
488
|
-
return TankerGroup;
|
|
489
608
|
end
|
|
490
609
|
|
|
491
610
|
--local RestrToCoal = nil
|
|
492
|
-
tankersOnDemandArray = {}
|
|
493
611
|
local TankerMarkHandler = {}
|
|
494
612
|
|
|
495
613
|
function TankerMarkHandler:onEvent(event)
|
|
@@ -520,30 +638,30 @@ function TankerMarkHandler:onEvent(event)
|
|
|
520
638
|
|
|
521
639
|
if (string.find(full, CmdSymbol)) then
|
|
522
640
|
param1Start = string.find(full, CmdSymbol)
|
|
523
|
-
cmd = string.sub(full, 0, param1Start-1)
|
|
524
|
-
remString = string.sub(full, param1Start+1)
|
|
641
|
+
cmd = string.sub(full, 0, param1Start - 1)
|
|
642
|
+
remString = string.sub(full, param1Start + 1)
|
|
525
643
|
if (string.find(remString, CmdSymbol)) then
|
|
526
644
|
param2Start = string.find(remString, CmdSymbol)
|
|
527
|
-
param1 = string.sub(remString, 0, param2Start-1)
|
|
528
|
-
remString = string.sub(remString, param2Start+1)
|
|
645
|
+
param1 = string.sub(remString, 0, param2Start - 1)
|
|
646
|
+
remString = string.sub(remString, param2Start + 1)
|
|
529
647
|
if string.find(remString, CmdSymbol) then
|
|
530
648
|
param3Start = string.find(remString, CmdSymbol)
|
|
531
|
-
param2 = string.sub(remString, 0, param3Start-1)
|
|
532
|
-
remString = string.sub(remString, param3Start+1)
|
|
649
|
+
param2 = string.sub(remString, 0, param3Start - 1)
|
|
650
|
+
remString = string.sub(remString, param3Start + 1)
|
|
533
651
|
if string.find(remString, CmdSymbol) then
|
|
534
652
|
param4Start = string.find(remString, CmdSymbol)
|
|
535
|
-
param3 = string.sub(remString, 0, param4Start-1)
|
|
536
|
-
remString = string.sub(remString, param4Start+1)
|
|
653
|
+
param3 = string.sub(remString, 0, param4Start - 1)
|
|
654
|
+
remString = string.sub(remString, param4Start + 1)
|
|
537
655
|
|
|
538
656
|
if string.find(remString, CmdSymbol) then
|
|
539
657
|
param5Start = string.find(remString, CmdSymbol)
|
|
540
|
-
param4 = string.sub(remString, 0, param5Start-1)
|
|
541
|
-
remString = string.sub(remString, param5Start+1)
|
|
658
|
+
param4 = string.sub(remString, 0, param5Start - 1)
|
|
659
|
+
remString = string.sub(remString, param5Start + 1)
|
|
542
660
|
|
|
543
661
|
if string.find(remString, CmdSymbol) then
|
|
544
662
|
param6Start = string.find(remString, CmdSymbol)
|
|
545
|
-
param5 = string.sub(remString, 0, param6Start-1)
|
|
546
|
-
param6 = string.sub(remString, param6Start+1)
|
|
663
|
+
param5 = string.sub(remString, 0, param6Start - 1)
|
|
664
|
+
param6 = string.sub(remString, param6Start + 1)
|
|
547
665
|
else
|
|
548
666
|
param5 = remString
|
|
549
667
|
end
|
|
@@ -562,7 +680,7 @@ function TankerMarkHandler:onEvent(event)
|
|
|
562
680
|
else
|
|
563
681
|
cmd = full
|
|
564
682
|
end
|
|
565
|
-
if
|
|
683
|
+
if Log_levels[JTFF_LOGLEVEL] <= Log_levels['debug'] then
|
|
566
684
|
trigger.action.outText("Full Text = " .. full, 10)
|
|
567
685
|
trigger.action.outText("Command = " .. cmd, 10)
|
|
568
686
|
if param1 ~= nil then trigger.action.outText("type = " .. param1, 10) end
|
|
@@ -574,10 +692,10 @@ function TankerMarkHandler:onEvent(event)
|
|
|
574
692
|
end
|
|
575
693
|
|
|
576
694
|
if string.find(cmd, "tanker") then
|
|
577
|
-
if
|
|
695
|
+
if Log_levels[JTFF_LOGLEVEL] <= Log_levels['debug'] then
|
|
578
696
|
trigger.action.outText("DEBUG: On Demand Tanker Started!", 10)
|
|
579
697
|
end
|
|
580
|
-
|
|
698
|
+
TriggerOnDemandTanker(
|
|
581
699
|
param1,
|
|
582
700
|
tonumber(param2),
|
|
583
701
|
tonumber(param3),
|
|
@@ -587,9 +705,7 @@ function TankerMarkHandler:onEvent(event)
|
|
|
587
705
|
tonumber(param6)
|
|
588
706
|
)
|
|
589
707
|
end
|
|
590
|
-
--end
|
|
591
708
|
end
|
|
592
|
-
|
|
593
709
|
end
|
|
594
710
|
|
|
595
711
|
world.addEventHandler(TankerMarkHandler)
|