@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.
@@ -1,495 +1,613 @@
1
1
  -- *****************************************************************************
2
2
  -- ** Tankers **
3
3
  -- *********************************************************
4
- tankersArray = {}
5
- compteur = 0
6
- MenuCoalitionTankerBlue = MENU_COALITION:New(coalition.side.BLUE, "Tankers", MenuCoalitionBlue)
7
- MenuCoalitionTankerRed = MENU_COALITION:New(coalition.side.RED, "Tankers", MenuCoalitionRed)
8
- for index, tankerconfig in ipairs(TankersConfig) do
9
- if tankerconfig.enable == true then
10
- compteur = compteur + 1
11
- jtff_log.info('creation Tanker : '.. tankerconfig.groupName..'...',"TANKER")
12
- local objTanker = RECOVERYTANKER:New(UNIT:FindByName(tankerconfig.patternUnit), tankerconfig.groupName)
13
- :SetTakeoffCold()
14
- :SetRespawnOnOff(tankerconfig.autorespawn)
15
- :SetLowFuelThreshold(tankerconfig.fuelwarninglevel)
16
- :SetAltitude(tankerconfig.altitude)
17
- :SetSpeed(tankerconfig.speed)
18
- :SetHomeBase(AIRBASE:FindByName(tankerconfig.baseUnit),tankerconfig.terminalType)
19
- :SetCallsign(tankerconfig.callsign.name, tankerconfig.callsign.number)
20
- :SetRecoveryAirboss(tankerconfig.airboss_recovery)
21
- :SetRadio(tankerconfig.freq)
22
- :SetModex(tankerconfig.modex)
23
- :SetTACAN(tankerconfig.tacan.channel, tankerconfig.tacan.morse, tankerconfig.tacan.band)
24
- :SetRacetrackDistances(tankerconfig.racetrack.front, tankerconfig.racetrack.back)
25
- objTanker.customconfig = tankerconfig
26
- function objTanker:OnAfterStart(from, event, to)
27
- --self:SetTACAN(self.customconfig.tacan.channel, self.customconfig.tacan.morse, self.customconfig.tacan.band )
28
- self.spawnAbsTime = timer.getAbsTime()
29
- jtff_log.info('popup Tanker : '..self.tanker.GroupName..' at : '..self.spawnAbsTime,"TANKER")
30
- if self.customconfig.escortgroupname then
31
- self.escortSpawnObject = SPAWN:NewWithAlias(self.customconfig.escortgroupname,'escort-'.. self.customconfig.groupName)
32
- :InitRepeatOnEngineShutDown()
33
- :InitSkill("Excellent")
34
- :OnSpawnGroup(function(SpawnGroup)
35
- taskTankerEscort({self, SpawnGroup})
36
- end)
37
- self.escortGroupObject = spawnRecoveryTankerEscort(self.escortSpawnObject,self.customconfig)
38
- if self.customconfig.missionmaxduration then
39
- self.escortGroupObject:ScheduleOnce(self.customconfig.missionmaxduration*60,
40
- function(SpawnGroup, airBaseName)
41
- --trigger.action.outText('RTB schedule trigger Tanker-escort group : '..(SpawnGroup.GroupName)..' airbase'..(airBaseName)..'...', 45)
42
- SpawnGroup:RouteRTB(AIRBASE:FindByName(airBaseName))
43
- end,
44
- self.escortGroupObject,
45
- self.customconfig.baseUnit
46
- )
47
- --trigger.action.outText('Tanker-escort configured to RTB in : '..(self.customconfig.missionmaxduration)..' minutes max...', 45)
48
- end
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 self.customconfig.missionmaxduration then
51
- (self.tanker):ScheduleOnce(self.customconfig.missionmaxduration*60,
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
- if (self.customconfig.benefit_coalition == coalition.side.RED) then
61
- self.menureset = MENU_COALITION_COMMAND:New(
62
- coalition.side.RED,
63
- "Reset Tanker "..self.customconfig.callsign.alias..'-'..self.customconfig.callsign.number..'-1',
64
- MenuCoalitionTankerRed,
65
- resetRecoveryTanker,
66
- self
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
- self.menureset = MENU_COALITION_COMMAND:New(
70
- coalition.side.BLUE,
71
- "Reset Tanker "..self.customconfig.callsign.alias..'-'..self.customconfig.callsign.number..'-1',
72
- MenuCoalitionTankerBlue,
73
- resetRecoveryTanker,
74
- self
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
- end
78
- function objTanker:OnAfterRTB(from, event, to, airbase)
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
- --trigger.action.outText('Tanker is RTB : '..(self.customconfig.groupName)..'...', 45)
89
- end
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
- end
96
- function objTanker:OnAfterStatus(from, event, to)
97
- self.tanker:OptionRestrictBurner(true)
98
- if ((self.customconfig.escortgroupname) and (self.escortGroupObject)) then
99
- if not(GROUP:FindByName(self.escortGroupObject.GroupName)) then
100
- jtff_log.info('Respawning escort Group '..self.escortGroupObject.GroupName,"TANKER")
101
- self.escortGroupObject = self.escortSpawnObject
102
- :SpawnAtAirbase(
103
- AIRBASE:FindByName(self.customconfig.baseUnit),
104
- SPAWN.Takeoff.Cold,
105
- self.customconfig.altitude,
106
- nil,
107
- true
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
- tankersArray[compteur] = objTanker
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 triggerOnDemandTanker(type, askedDuration, askedFL, askedSpeed, askedAnchorCoord, askedOrbitHeading, askedOrbitLeg)
121
- local TankerGroup
122
- if (OnDemandTankersConfig) then
123
- for index, OnDemandTanker in ipairs(OnDemandTankersConfig) do
124
- if ((OnDemandTanker.type == type) and (OnDemandTanker.enable)) then
125
- jtff_log.debug(string.format('OnDemandTanker : Found type %s Tanker : %s Group!', type, OnDemandTanker.groupName),"TANKER")
126
- if (askedSpeed and askedSpeed > 0) then
127
- OnDemandTanker.speed = askedSpeed
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
- OnDemandTanker.altitude = askedFL * 100
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 ( askedDuration == nil or askedDuration == 0 ) then
133
- askedDuration = 480
524
+ if (askedDuration ~= nil and askedDuration ~= 0) then
525
+ objTanker.customconfig.missionmaxduration = askedDuration
134
526
  end
135
527
  if (askedOrbitHeading) then
136
- if (askedOrbitLeg and askedOrbitLeg > 10) then
528
+ if (askedOrbitLeg) then
137
529
  --heading et Leg demandés
138
- OnDemandTanker.orbit = {
139
- heading = askedOrbitHeading % 360,
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
- if (OnDemandTanker.orbit ) then
145
- if (not(OnDemandTanker.orbit.length)) then
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
- local RTBAirbase
207
- local TankerRoute = {}
208
- if (OnDemandTanker.baseUnit) then
209
- RTBAirbase = AIRBASE:FindByName(OnDemandTanker.baseUnit)
210
- else
211
- RTBAirbase = askedAnchorCoord:GetClosestAirbase2(Airbase.Category.AIRDROME, OnDemandTanker.benefit_coalition)
212
- end
213
- if (is_tanker_spawned) then
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
- if (OnDemandTanker.freq) then
284
- SpawnTanker:InitRadioFrequency(OnDemandTanker.freq)
285
- SpawnTanker:InitRadioModulation("AM")
286
- end
287
- if (OnDemandTanker.modex) then
288
- SpawnTanker:InitModex(OnDemandTanker.modex)
289
- end
290
- if (OnDemandTanker.baseUnit) then
291
- TankerGroup = SpawnTanker:SpawnAtAirbase(
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
- table.insert(TankerRoute,
353
- askedAnchorCoord
354
- :Translate(UTILS.NMToMeters(OnDemandTanker.orbit.length), OnDemandTanker.orbit.heading, true, false)
355
- :SetAltitude(UTILS.FeetToMeters(OnDemandTanker.altitude))
356
- :WaypointAirTurningPoint(
357
- nil,
358
- UTILS.KnotsToKmph(OnDemandTanker.speed),
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
- table.insert(TankerRoute,
370
- RTBAirbase
371
- :GetCoordinate()
372
- :WaypointAirLanding(
373
- UTILS.KnotsToKmph(OnDemandTanker.speed),
374
- RTBAirbase,
375
- {},
376
- 'RTB'
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
- end
380
- TankerGroup:Route(TankerRoute)
381
- TankerGroup:CommandEPLRS(true, 4)
382
- if (OnDemandTanker.tacan) then
383
- TankerGroup.beacon=BEACON:New(TankerGroup:GetUnit(1))
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
- 'OnDemand Tanker %s - TCN %i\nFL %i at %i knots\nFreq %.2f MHz\nOn station for %i minutes\nRacetrack : %i ° for %i nm',
416
- OnDemandTanker.type,
417
- OnDemandTanker.tacan.channel,
418
- UTILS.Round(OnDemandTanker.altitude / 100 , 0),
419
- OnDemandTanker.speed,
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
- OnDemandTanker.benefit_coalition,
426
- true,
427
- 'OnDemand Tanker %s is Activated'
591
+ "TANKER"
428
592
  )
429
593
  else
430
- map_marker[TankerGroup:GetName()] = askedAnchorCoord:MarkToCoalition(
594
+ Jtff_log.info(
431
595
  string.format(
432
- 'OnDemand Tanker %s\nFL %i at %i knots\nFreq %.2f MHz\nOn station for %i minutes\nRacetrack : %i ° for %i nm',
433
- OnDemandTanker.type,
434
- UTILS.Round(OnDemandTanker.altitude / 100 , 0),
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
- OnDemandTanker.benefit_coalition,
442
- true,
443
- 'OnDemand Tanker %s is Activated'
600
+ "TANKER"
444
601
  )
445
- end
446
- TankerGroup:HandleEvent(EVENTS.Land)
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 log_levels[JTFF_LOGLEVEL] <= log_levels['debug'] then
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 log_levels[JTFF_LOGLEVEL] <= log_levels['debug'] then
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
- tankersOnDemandArray[#tankersOnDemandArray+1] = triggerOnDemandTanker(
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)