@jtff/miztemplate-lib 2.2.0 → 3.0.0-rc2

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.
Files changed (65) hide show
  1. package/index.js +4 -3
  2. package/lib/jtff-lib-ci.js +1 -307
  3. package/lib/mizlib.js +337 -0
  4. package/lua/lib/Hercules_Cargo.lua +686 -0
  5. package/lua/lib/Moose_.lua +117314 -0
  6. package/lua/lib/Splash_Damage_2_0.lua +472 -0
  7. package/lua/lib/gemman.lua +1 -0
  8. package/lua/lib/mist_4_5_107.lua +9084 -0
  9. package/lua/lib/skynet-iads-compiled.lua +3864 -0
  10. package/lua/settings/settings-RAT.lua +235 -0
  11. package/lua/settings/settings-airboss.lua +142 -0
  12. package/lua/settings/settings-atis.lua +31 -0
  13. package/lua/settings/settings-awacs.lua +58 -0
  14. package/lua/settings/settings-awacsondemand.lua +26 -0
  15. package/lua/settings/settings-beacons.lua +10 -0
  16. package/lua/settings/settings-capwarzone.lua +164 -0
  17. package/lua/settings/settings-capzone.lua +32 -0
  18. package/lua/settings/settings-fac_ranges.lua +17 -0
  19. package/lua/settings/settings-foxzone.lua +14 -0
  20. package/lua/settings/settings-gemman.lua +6 -0
  21. package/lua/settings/settings-global.lua +31 -0
  22. package/lua/settings/settings-intercept.lua +23 -0
  23. package/lua/settings/settings-logistics.lua +22 -0
  24. package/lua/settings/settings-ondemandawacs.lua +29 -0
  25. package/lua/settings/settings-ondemandtankers.lua +29 -0
  26. package/lua/settings/settings-pedros.lua +11 -0
  27. package/lua/settings/settings-ranges.lua +28 -0
  28. package/lua/settings/settings-reapers.lua +25 -0
  29. package/lua/settings/settings-sams.lua +19 -0
  30. package/lua/settings/settings-skynet.lua +239 -0
  31. package/lua/settings/settings-tankers.lua +32 -0
  32. package/lua/settings/settings-training_ranges.lua +37 -0
  33. package/lua/src/010-root_menus.lua +5 -0
  34. package/lua/src/020-mission_functions.lua +1059 -0
  35. package/lua/src/110-set_clients.lua +61 -0
  36. package/lua/src/120-tankers.lua +589 -0
  37. package/lua/src/130-airboss.lua +621 -0
  38. package/lua/src/135-pedro.lua +21 -0
  39. package/lua/src/140-beacons.lua +19 -0
  40. package/lua/src/150-awacs.lua +599 -0
  41. package/lua/src/160-atis.lua +53 -0
  42. package/lua/src/170-cap_zone_training.lua +127 -0
  43. package/lua/src/172-cap_zone_war.lua +190 -0
  44. package/lua/src/173-fox_zone_training.lua +87 -0
  45. package/lua/src/176-random_air_traffic.lua +73 -0
  46. package/lua/src/178-training-intercept.lua +263 -0
  47. package/lua/src/180-logistics.lua +80 -0
  48. package/lua/src/190-ranges.lua +54 -0
  49. package/lua/src/191-sams.lua +49 -0
  50. package/lua/src/193-training_ranges.lua +191 -0
  51. package/lua/src/195-reaper-ondemand.lua +522 -0
  52. package/lua/src/196-fac_ranges.lua +34 -0
  53. package/lua/src/199-skynet.lua +721 -0
  54. package/lua/src/200-mission.lua +3 -0
  55. package/package.json +4 -3
  56. package/resources/radios/.gitkeep +0 -0
  57. package/resources/sounds/CTLD/beacon.ogg +0 -0
  58. package/resources/sounds/CTLD/beaconsilent.ogg +0 -0
  59. package/resources/sounds/Misc/.gitkeep +0 -0
  60. package/resources/sounds/Misc/2_Bips.ogg +0 -0
  61. package/resources/sounds/Misc/Bip.ogg +0 -0
  62. package/resources/sounds/Misc/crash_wood.ogg +0 -0
  63. package/scripts/build.js +2 -1
  64. package/scripts/inject-scripts.js +127 -230
  65. package/scripts/template-update.js +1 -1
@@ -0,0 +1,127 @@
1
+ -- *****************************************************************************
2
+ -- ** CAPZone Training **
3
+ -- *********************************************************
4
+ function wipeCapZone(objCAPZone)
5
+ fctKillSpawnObject(objCAPZone.objSpawn)
6
+ trigger.action.outText('CAP Training Zone '..(objCAPZone.customconfig.name)..' cleaned !!', 30)
7
+ end
8
+
9
+ function startCapZone(objCAPZone)
10
+ local AICapGroup = objCAPZone.objSpawn:SpawnInZone(objCAPZone.objPatrolZone,
11
+ true
12
+ )
13
+ local objCAP = AI_CAP_ZONE:New(
14
+ objCAPZone.objPatrolZone,
15
+ UTILS.Round(objCAPZone.customconfig.capParameters.patrolFloor*0.3048,0),
16
+ UTILS.Round(objCAPZone.customconfig.capParameters.patrolCeiling*0.3048,0),
17
+ UTILS.Round(objCAPZone.customconfig.capParameters.minPatrolSpeed*1.852,0),
18
+ UTILS.Round(objCAPZone.customconfig.capParameters.maxPatrolSpeed*1.852,0),
19
+ AI.Task.AltitudeType.BARO
20
+ )
21
+ objCAP:SetControllable(AICapGroup)
22
+ objCAP:SetEngageZone(objCAPZone.objEngageZone)
23
+ objCAP:__Start(1)
24
+ --local objAiCapZone = AI_CAP_ZONE:New(
25
+ -- objCAPZone.objPatrolZone,
26
+ -- UTILS.Round(objCAPZone.customconfig.capParameters.patrolFloor*0.3048,0),
27
+ -- UTILS.Round(objCAPZone.customconfig.capParameters.patrolCeiling*0.3048,0),
28
+ -- UTILS.Round(objCAPZone.customconfig.capParameters.minPatrolSpeed*1.852,0),
29
+ -- UTILS.Round(objCAPZone.customconfig.capParameters.maxPatrolSpeed*1.852,0),
30
+ -- AI.Task.AltitudeType.BARO
31
+ --)
32
+ --function objAiCapZone:OnAfterStart(from, event, to)
33
+ --end
34
+
35
+ --objAiCapZone:SetControllable(
36
+ -- objCAPZone.objSpawn:SpawnInZone(objCAPZone.objPatrolZone,
37
+ -- true
38
+ -- )
39
+ --)
40
+ end
41
+
42
+
43
+ CAPZoneArray = {}
44
+ compteur = 0
45
+ MenuCoalitionCAPZoneBlue = MENU_COALITION:New(coalition.side.BLUE, "Hostile CAP Zones", MenuCoalitionBlue)
46
+ MenuCoalitionCAPZoneRed = MENU_COALITION:New(coalition.side.RED, "Hostile CAP Zones", MenuCoalitionRed)
47
+ for index, capzoneconfig in ipairs(TrainingCAPConfig) do
48
+ if capzoneconfig.enable == true then
49
+ compteur = compteur + 1
50
+ env.info('creation CAP Zone : '.. capzoneconfig.name..'...')
51
+ objCapZone = {}
52
+ objCapZone.objSpawn = SPAWN:New(capzoneconfig.CAPGoups[1])
53
+ :InitSkill(capzoneconfig.skill)
54
+ :InitRandomizeTemplate(capzoneconfig.CAPGoups)
55
+ :OnSpawnGroup(function(SpawnGroup)
56
+ SpawnGroup:OptionROE(ENUMS.ROE.OpenFireWeaponFree)
57
+ SpawnGroup:OptionROT(ENUMS.ROT.EvadeFire)
58
+ SpawnGroup:OptionRTBBingoFuel(false)
59
+ --if math.random(0,100) > 50 then
60
+ -- SpawnGroup:OptionAAAttackRange(AI.Option.Air.val.MISSILE_ATTACK.MAX_RANGE)
61
+ --else
62
+ -- SpawnGroup:OptionAAAttackRange(AI.Option.Air.val.MISSILE_ATTACK.HALF_WAY_RMAX_NEZ)
63
+ --end
64
+ SpawnGroup:OptionRestrictBurner(false)
65
+ SpawnGroup:OptionECM_OnlyLockByRadar()
66
+ SpawnGroup:EnableEmission(true)
67
+ SpawnGroup:OptionAlarmStateRed()
68
+ end)
69
+ if capzoneconfig.patrolZoneGroupName then
70
+ objCapZone.objPatrolZone = ZONE_POLYGON:New(
71
+ 'CAP_PATROL_ZONE_'..capzoneconfig.name,
72
+ GROUP:FindByName(capzoneconfig.patrolZoneGroupName))
73
+ env.info('Training CAP : Patrol zone Polygon created : '.. objCapZone.objPatrolZone:GetName() ..'...')
74
+ else
75
+ if capzoneconfig.patrolZoneName then
76
+ objCapZone.objPatrolZone = ZONE:New(capzoneconfig.patrolZoneName)
77
+ end
78
+ end
79
+ if capzoneconfig.engageZoneGroupName then
80
+ objCapZone.objEngageZone = ZONE_POLYGON:New(
81
+ 'CAP_ENGAGE_ZONE_'..capzoneconfig.name,
82
+ GROUP:FindByName(capzoneconfig.engageZoneGroupName))
83
+ env.info('Training CAP : Engage zone Polygon created : '.. objCapZone.objEngageZone:GetName() ..'...')
84
+ else
85
+ if capzoneconfig.engageZoneName then
86
+ objCapZone.objEngageZone = ZONE:New(capzoneconfig.engageZoneName)
87
+ end
88
+ end
89
+ objCapZone.customconfig = capzoneconfig
90
+ CAPZoneArray[compteur] = objCapZone
91
+ if capzoneconfig.coalitionCAP == coalition.side.RED then
92
+ MENU_COALITION_COMMAND:New(
93
+ coalition.side.BLUE,
94
+ "Zone "..capzoneconfig.name.." Start",
95
+ MenuCoalitionCAPZoneBlue,
96
+ startCapZone,
97
+ CAPZoneArray[compteur])
98
+ MENU_COALITION_COMMAND:New(
99
+ coalition.side.BLUE,
100
+ "Zone "..capzoneconfig.name.." Clean",
101
+ MenuCoalitionCAPZoneBlue,
102
+ wipeCapZone,
103
+ CAPZoneArray[compteur]
104
+ )
105
+ else
106
+ MENU_COALITION_COMMAND:New(
107
+ coalition.side.RED,
108
+ "Zone "..capzoneconfig.name.." Start",
109
+ MenuCoalitionCAPZoneRed,
110
+ startCapZone,
111
+ CAPZoneArray[compteur])
112
+ MENU_COALITION_COMMAND:New(
113
+ coalition.side.RED,
114
+ "Zone "..capzoneconfig.name.." Clean",
115
+ MenuCoalitionCAPZoneRed,
116
+ wipeCapZone,
117
+ CAPZoneArray[compteur]
118
+ )
119
+ end
120
+ --CAPZoneArray[compteur]:Start()
121
+ end
122
+ end
123
+
124
+ if compteur == 0 then
125
+ MenuCoalitionCAPZoneBlue:Remove()
126
+ MenuCoalitionCAPZoneRed:Remove()
127
+ end
@@ -0,0 +1,190 @@
1
+ -- *****************************************************************************
2
+ -- ** CAPZone War **
3
+ -- *********************************************************
4
+ function toggleDebugCapWarZone(objCapWarZone)
5
+ objCapWarZone.objDispatcher:SetTacticalDisplay(not(objCapWarZone.objDispatcher.TacticalDisplay))
6
+ end
7
+
8
+ function wipeCapWarZone(objCapWarZone)
9
+ objCapWarZone.objDispatcher:SetTacticalDisplay(false)
10
+ objCapWarZone.objDispatcher:Stop()
11
+ objCapWarZone.objDispatcher = nil
12
+ objCapWarZone.objDetectionAreas = nil
13
+ objCapWarZone.objEWRNetwork = nil
14
+ objCapWarZone.objMenu:RemoveSubMenus()
15
+ MENU_MISSION_COMMAND:New(
16
+ "Start ".. objCapWarZone.customconfig.name .. " CAP War Zone",
17
+ objCapWarZone.objMenu,
18
+ startCapWarZone,
19
+ objCapWarZone)
20
+ trigger.action.outText('CAP War Zone '..(objCapWarZone.customconfig.name)..' disabled !!', 30)
21
+ end
22
+
23
+ function startCapWarZone(objCapWarZone)
24
+ objCapWarZone.objEWRNetwork = SET_GROUP:New()
25
+ objCapWarZone.objEWRNetwork:FilterPrefixes(objCapWarZone.customconfig.ewrPrefixes)
26
+ objCapWarZone.objEWRNetwork:FilterStart()
27
+ objCapWarZone.objDetectionAreas = DETECTION_AREAS:New( objCapWarZone.objEWRNetwork, UTILS.NMToMeters(objCapWarZone.customconfig.detectionGroupingRadius or UTILS.MetersToNM(30000)))
28
+ objCapWarZone.objDispatcher = AI_A2A_DISPATCHER:New( objCapWarZone.objDetectionAreas )
29
+ objCapWarZone.objDispatcher:SetBorderZone(objCapWarZone.objZone)
30
+ objCapWarZone.objDispatcher:SetEngageRadius(UTILS.NMToMeters(objCapWarZone.customconfig.engageRadius or UTILS.MetersToNM(100000)))
31
+ objCapWarZone.objDispatcher:SetGciRadius(UTILS.NMToMeters(objCapWarZone.customconfig.gciRadius or UTILS.MetersToNM(200000)))
32
+ objCapWarZone.objDispatcher:SetDefaultTakeoffFromParkingHot()
33
+ objCapWarZone.objDispatcher:SetDefaultLandingAtRunway()
34
+ objCapWarZone.objDispatcher:SetDefaultFuelThreshold(0.30)
35
+ objCapWarZone.objDispatcher:SetDefaultCapRacetrack(
36
+ UTILS.NMToMeters(20),
37
+ UTILS.NMToMeters(40),
38
+ 0,
39
+ 180,
40
+ 15*60,
41
+ 45*60
42
+ )
43
+ for indexbase, capbaseconfig in ipairs(objCapWarZone.customconfig.CAPBases) do
44
+ for indexcapsqn, capsqnconfig in ipairs(capbaseconfig.patrolSquadrons) do
45
+ if capsqnconfig.enable then
46
+ if AIRBASE:FindByName(capbaseconfig.baseName) then
47
+ --baseName is Airbase
48
+ objCapWarZone.objDispatcher:SetSquadron(
49
+ "CAP-"..capbaseconfig.baseName.."-"..indexcapsqn,
50
+ capbaseconfig.baseName,
51
+ capsqnconfig.groupName,
52
+ capsqnconfig.groupNumber * capsqnconfig.groupForce
53
+ )
54
+ objCapWarZone.objDispatcher:SetSquadronGrouping(
55
+ "CAP-"..capbaseconfig.baseName.."-"..indexcapsqn,
56
+ capsqnconfig.groupForce
57
+ )
58
+ else
59
+ --baseName is not an Airbase --> Airstart
60
+ objCapWarZone.objDispatcher:SetSquadron(
61
+ "CAP-"..capbaseconfig.baseName.."-"..indexcapsqn,
62
+ capbaseconfig.baseName,
63
+ capsqnconfig.groupName,
64
+ capsqnconfig.groupNumber * capsqnconfig.groupForce
65
+ )
66
+ objCapWarZone.objDispatcher:SetSquadronGrouping(
67
+ "CAP-"..capbaseconfig.baseName.."-"..indexcapsqn,
68
+ capsqnconfig.groupForce
69
+ )
70
+ objCapWarZone.objDispatcher:SetSquadronTakeoffInAir(
71
+ "CAP-"..capbaseconfig.baseName.."-"..indexcapsqn,
72
+ UTILS.FeetToMeters(20000)
73
+ )
74
+ end
75
+ function objCapWarZone.objDispatcher:OnEventBirth(eventData)
76
+ local unit = UNIT:Find(eventData.initiator)
77
+ if (objCapWarZone.customconfig.fireRange) then
78
+ unit:OptionAAAttackRange(objCapWarZone.customconfig.fireRange)
79
+ else
80
+ unit:OptionAAAttackRange(AAMAxRange.TARGET_THREAT_EST)
81
+ end
82
+ unit:OptionROT(ENUMS.ROT.EvadeFire)
83
+ end
84
+ local CapZone = nil
85
+ if capsqnconfig.patrolZoneName then
86
+ if capsqnconfig.patrolZoneGroupName then
87
+ CapZone = ZONE_POLYGON:New(capsqnconfig.patrolZoneGroupName, GROUP:FindByName(capsqnconfig.patrolZoneGroupName))
88
+ else
89
+ CapZone = ZONE:New(capsqnconfig.patrolZoneName)
90
+ end
91
+ else
92
+ if capsqnconfig.patrolZoneGroupName then
93
+ CapZone = ZONE_POLYGON:New(capsqnconfig.patrolZoneGroupName, GROUP:FindByName(capsqnconfig.patrolZoneGroupName))
94
+ else
95
+ CapZone = objCapWarZone.objZone
96
+ end
97
+ end
98
+ objCapWarZone.objDispatcher:SetSquadronCap(
99
+ "CAP-"..capbaseconfig.baseName.."-"..indexcapsqn,
100
+ CapZone,
101
+ UTILS.FeetToMeters(objCapWarZone.customconfig.capParameters.patrolFloor) or UTILS.FeetToMeters(20000),
102
+ UTILS.FeetToMeters(objCapWarZone.customconfig.capParameters.patrolCeiling) or UTILS.FeetToMeters(50000),
103
+ UTILS.KnotsToKmph(objCapWarZone.customconfig.capParameters.minPatrolSpeed) or UTILS.KnotsToKmph(200),
104
+ UTILS.KnotsToKmph(objCapWarZone.customconfig.capParameters.maxPatrolSpeed) or UTILS.KnotsToKmph(400),
105
+ UTILS.KnotsToKmph(objCapWarZone.customconfig.capParameters.minEngageSpeed) or UTILS.KnotsToKmph(200),
106
+ UTILS.KnotsToKmph(objCapWarZone.customconfig.capParameters.maxEngageSpeed) or UTILS.KnotsToKmph(2000),
107
+ "BARO"
108
+ )
109
+ objCapWarZone.objDispatcher:SetSquadronCapInterval(
110
+ "CAP-"..capbaseconfig.baseName.."-"..indexcapsqn,
111
+ capsqnconfig.patrolInAirNumber,
112
+ 8*60,
113
+ 13*60,
114
+ 1
115
+ )
116
+ end
117
+ end
118
+ for indexinterceptsqn, interceptsqnconfig in ipairs(capbaseconfig.interceptSquadrons) do
119
+ if interceptsqnconfig.enable then
120
+ if AIRBASE:FindByName(capbaseconfig.baseName) then
121
+ --baseName is Airbase
122
+ objCapWarZone.objDispatcher:SetSquadron(
123
+ "GCI-"..capbaseconfig.baseName.."-"..indexinterceptsqn,
124
+ capbaseconfig.baseName,
125
+ interceptsqnconfig.groupName,
126
+ interceptsqnconfig.groupNumber
127
+ )
128
+ objCapWarZone.objDispatcher:SetSquadronGrouping(
129
+ "GCI-"..capbaseconfig.baseName.."-"..indexinterceptsqn,
130
+ interceptsqnconfig.groupForce
131
+ )
132
+ else
133
+ --baseName is not an Airbase --> Airstart
134
+ end
135
+ objCapWarZone.objDispatcher:SetSquadronGci(
136
+ "GCI-"..capbaseconfig.baseName.."-"..indexinterceptsqn,
137
+ UTILS.KnotsToKmph(objCapWarZone.customconfig.capParameters.minEngageSpeed) or UTILS.KnotsToKmph(200),
138
+ UTILS.KnotsToKmph(objCapWarZone.customconfig.capParameters.maxEngageSpeed) or UTILS.KnotsToKmph(5000)
139
+ )
140
+ end
141
+ end
142
+ end
143
+ objCapWarZone.objDispatcher:SetTacticalDisplay(objCapWarZone.customconfig.debug or false)
144
+ objCapWarZone.objMenu:RemoveSubMenus()
145
+ MENU_MISSION_COMMAND:New(
146
+ "Stop ".. objCapWarZone.customconfig.name .. " CAP War Zone",
147
+ objCapWarZone.objMenu,
148
+ wipeCapWarZone,
149
+ objCapWarZone
150
+ )
151
+ MENU_MISSION_COMMAND:New(
152
+ "Toggle Display Status ".. objCapWarZone.customconfig.name .. " CAP War Zone",
153
+ objCapWarZone.objMenu,
154
+ toggleDebugCapWarZone,
155
+ objCapWarZone
156
+ )
157
+ end
158
+
159
+ CAPWarZoneArray = {}
160
+ compteur = 0
161
+ MenuCoalitionCAPWarZone = MENU_MISSION:New("CAP War Zones", nil)
162
+ for index, capwarzoneconfig in ipairs(WarCAPConfig) do
163
+ if capwarzoneconfig.enable == true and #(capwarzoneconfig.ewrPrefixes) > 0 then
164
+ compteur = compteur + 1
165
+ env.info('creation CAP WarZone : '.. capwarzoneconfig.name..'...')
166
+ objCapWarZone = {}
167
+ if capwarzoneconfig.borderZoneGroupName then
168
+ objCapWarZone.objZone = ZONE_POLYGON:New( capwarzoneconfig.borderZoneGroupName, GROUP:FindByName( capwarzoneconfig.borderZoneGroupName ) )
169
+ else
170
+ if capwarzoneconfig.borderZoneName then
171
+ objCapWarZone.objZone = ZONE:New(capwarzoneconfig.borderZoneName)
172
+ else
173
+ objCapWarZone.objZone = ZONE_GROUP:New(
174
+ "border_" .. capwarzoneconfig.name,
175
+ GROUP:FindByName(capwarzoneconfig.ewrPrefixes[1]),
176
+ UTILS.NMToMeters(600)
177
+ )
178
+ end
179
+ end
180
+ objCapWarZone.customconfig = capwarzoneconfig
181
+ objCapWarZone.objMenu = MENU_MISSION:New(capwarzoneconfig.name, MenuCoalitionCAPWarZone)
182
+ objCapWarZone.objMenu:RemoveSubMenus()
183
+ CAPWarZoneArray[compteur] = objCapWarZone
184
+ MENU_MISSION_COMMAND:New(
185
+ "Start ".. capwarzoneconfig.name .. " CAP War Zone",
186
+ CAPWarZoneArray[compteur].objMenu,
187
+ startCapWarZone,
188
+ CAPWarZoneArray[compteur])
189
+ end
190
+ end
@@ -0,0 +1,87 @@
1
+ -- *****************************************************************************
2
+ -- ** FoxZone Training **
3
+ -- *********************************************************
4
+ FoxRangesArray = {}
5
+ compteur = 0
6
+ for index, foxzoneconfig in ipairs(FoxRangesConfig) do
7
+ if foxzoneconfig.enable == true then
8
+ compteur = compteur + 1
9
+ env.info('creation Fox Zone : '.. foxzoneconfig.name..'...')
10
+ local objFoxZone = FOX:New()
11
+ objFoxZone:SetExplosionPower(0.01)
12
+ :SetExplosionDistance(foxzoneconfig.distance_small_missile or 100)
13
+ :SetExplosionDistanceBigMissiles(foxzoneconfig.distance_big_missile or 150)
14
+ :SetDefaultMissileDestruction(foxzoneconfig.missileDestruction)
15
+ :SetDefaultLaunchAlerts(foxzoneconfig.missileLaunchMessages)
16
+ :SetDefaultLaunchMarks(false)
17
+ if foxzoneconfig.launchZoneGroupName then
18
+ objFoxZone.objLaunchZone = ZONE_POLYGON:New(
19
+ 'FOX_LAUNCH_ZONE_'..foxzoneconfig.name,
20
+ GROUP:FindByName(foxzoneconfig.launchZoneGroupName))
21
+ objFoxZone:AddLaunchZone(objFoxZone.objLaunchZone)
22
+ env.info('Fox Zone : Launch zone Polygon created : '.. objFoxZone.objLaunchZone:GetName() ..'...')
23
+ else
24
+ if foxzoneconfig.launchZoneName then
25
+ objFoxZone.objLaunchZone = ZONE:New(foxzoneconfig.launchZoneName)
26
+ objFoxZone:AddLaunchZone(objFoxZone.objLaunchZone)
27
+ end
28
+ end
29
+ if foxzoneconfig.safeZoneGroupName then
30
+ objFoxZone.objSafeZone = ZONE_POLYGON:New(
31
+ 'FOX_SAFE_ZONE_'..foxzoneconfig.name,
32
+ GROUP:FindByName(foxzoneconfig.safeZoneGroupName))
33
+ objFoxZone:AddSafeZone(objFoxZone.objSafeZone)
34
+ env.info('Fox Zone : Safe zone Polygon created : '.. objFoxZone.objSafeZone:GetName() ..'...')
35
+ else
36
+ if foxzoneconfig.safeZoneName then
37
+ objFoxZone.objSafeZone = ZONE:New(foxzoneconfig.safeZoneName)
38
+ objFoxZone:AddSafeZone(objFoxZone.objSafeZone)
39
+ end
40
+ end
41
+ if foxzoneconfig.debug then
42
+ objFoxZone:SetDebugOn()
43
+ end
44
+ objFoxZone.menudisabled = foxzoneconfig.f10Menu == false
45
+ objFoxZone:SetDisableF10Menu(objFoxZone.menudisabled)
46
+ objFoxZone.customconfig = foxzoneconfig
47
+
48
+ -- **** Message to client *****
49
+ function objFoxZone:OnAfterEnterSafeZone(From, Event, To, player)
50
+ local message = '[' .. player.name .. '] You\'re entering in the missile trainer area ' .. foxzoneconfig.name
51
+ MESSAGE:NewType(message, MESSAGE.Type.Overview):ToClient(player.client)
52
+ end
53
+
54
+ function objFoxZone:OnAfterExitSafeZone(From, Event, To, player)
55
+ local message = '[' .. player.name .. '] You\'re leaving the missile trainer area ' .. foxzoneconfig.name
56
+ MESSAGE:NewType(message, MESSAGE.Type.Overview):ToClient(player.client)
57
+ end
58
+
59
+ function objFoxZone:OnAfterMissileDestroyed(From, Event, To, missile)
60
+ local unitTargeted = missile.targetUnit -- #Wrapper.Unit#UNIT
61
+ local playerTargeted = missile.targetPlayer -- #FOX.PlayerData
62
+ local unitShooter = missile.shooterUnit -- #Wrapper.Unit#UNIT
63
+ local missileType = missile.missileType -- string
64
+ local missileName = missile.missileName -- string
65
+
66
+ local playerNameTargeted = playerTargeted.name -- string
67
+ local clientShooter = CLIENT:Find(unitShooter:GetDCSObject(), '', false)
68
+ local message = ''
69
+ if (clientShooter) then
70
+ local playerNameShooter = clientShooter:GetPlayerName()
71
+ message = playerNameTargeted .. ' HAS BEEN SHOT DOWN BY ' .. playerNameShooter
72
+ else
73
+ message = playerNameTargeted .. ' HAS BEEN SHOT DOWN BY ' .. unitShooter:GetName()
74
+ end
75
+ debug_msg(message)
76
+ Set_CLIENT:ForEachClientInZone(objFoxZone.objSafeZone, function(clientInZone)
77
+ if clientInZone:IsAlive() then
78
+ MESSAGE:NewType(message, MESSAGE.Type.Update):ToClient(clientInZone)
79
+ end
80
+ end)
81
+ end
82
+ -- *****************************
83
+
84
+ FoxRangesArray[compteur] = objFoxZone
85
+ FoxRangesArray[compteur]:Start()
86
+ end
87
+ end
@@ -0,0 +1,73 @@
1
+ -- *****************************************************************************
2
+ -- ** Random Air Traffic **
3
+ -- *********************************************************
4
+ RATManagerArray = {}
5
+ compteur = 0
6
+ for index, ratconfig in ipairs(RATConfig) do
7
+ if ratconfig.enable == true then
8
+ debug_msg(string.format("RAT Enable"))
9
+ compteur = compteur +1
10
+ if not (ratconfig.maximum_aircrafts) then
11
+ ratconfig.maximum_aircrafts = 10
12
+ end
13
+ local RATmanager=RATMANAGER:New(ratconfig.maximum_aircrafts)
14
+ for index_planegroup, planegroupconfig in ipairs(ratconfig.aircrafts_groupconfigs) do
15
+ if (type(planegroupconfig.templatename) == "string") then
16
+ planegroupconfig.templatename = {planegroupconfig.templatename}
17
+ end
18
+ if (type(planegroupconfig.templatename) == "table") then
19
+ for index, templatename in ipairs(planegroupconfig.templatename) do
20
+ debug_msg(string.format("RAT %s", templatename))
21
+ local RATGroup = RAT:New(templatename)
22
+ if (type(planegroupconfig.airbases_names) == "table" ) then
23
+ RATGroup:SetTakeoff("cold")
24
+ for airstartindex, airstartname in ipairs(planegroupconfig.airbases_names.departure) do
25
+ if not(RATGroup:_AirportExists(airstartname)) then
26
+ RATGroup:SetTakeoff("air")
27
+ end
28
+ end
29
+ for airstopindex, airstopname in ipairs(planegroupconfig.airbases_names.arrival) do
30
+ if not(RATGroup:_AirportExists(airstopname)) then
31
+ RATGroup:DestinationZone()
32
+ end
33
+ end
34
+ RATGroup:SetDeparture(planegroupconfig.airbases_names.departure)
35
+ RATGroup:SetDestination(planegroupconfig.airbases_names.arrival)
36
+ end
37
+ if (type(planegroupconfig.inactive_timer) == "number" ) then
38
+ RATGroup:TimeDestroyInactive(planegroupconfig.inactive_timer)
39
+ end
40
+ if (type(planegroupconfig.atcmessage_enable) == "boolean" ) then
41
+ RATGroup:ATC_Messages(planegroupconfig.atcmessage_enable)
42
+ else
43
+ RATGroup:ATC_Messages(false)
44
+ end
45
+ if (type(planegroupconfig.flightlevel) == "number" ) then
46
+ RATGroup:SetFLcruise(planegroupconfig.flightlevel)
47
+ end
48
+ if (type(planegroupconfig.speed) == "number") then
49
+ RATGroup:SetMaxCruiseSpeed(UTILS.KnotsToKmph(planegroupconfig.speed))
50
+ end
51
+ if (planegroupconfig.liveries) then
52
+ RATGroup:Livery(planegroupconfig.liveries)
53
+ end
54
+ if (type(planegroupconfig.allow_immortal) == "boolean" and planegroupconfig.allow_immortal == true) then
55
+ RATGroup:Immortal()
56
+ end
57
+ if (type(planegroupconfig.allow_invisible) == "boolean" and planegroupconfig.allow_invisible == true) then
58
+ RATGroup:Invisible()
59
+ end
60
+ if (type(planegroupconfig.commute) == "boolean" and planegroupconfig.commute == true) then
61
+ RATGroup:Commute(true)
62
+ end
63
+ RATGroup:SetEPLRS(true)
64
+ RATmanager:Add(RATGroup, planegroupconfig.minimun_spawns)
65
+ end
66
+ else
67
+ debug_msg(string.format("RAT error in template name type : %s", planegroupconfig.templatename))
68
+ end
69
+ end
70
+ RATManagerArray[compteur] = RATmanager
71
+ RATManagerArray[compteur]:Start(spawnStandardDelay)
72
+ end
73
+ end