@jtff/miztemplate-lib 2.2.0 → 3.0.0-rc1
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/index.js +4 -3
- package/lib/jtff-lib-ci.js +1 -307
- package/lib/mizlib.js +336 -0
- package/lua/lib/Hercules_Cargo.lua +686 -0
- package/lua/lib/Moose_.lua +117314 -0
- package/lua/lib/Splash_Damage_2_0.lua +472 -0
- package/lua/lib/gemman.lua +1 -0
- package/lua/lib/mist_4_5_107.lua +9084 -0
- package/lua/lib/skynet-iads-compiled.lua +3864 -0
- package/lua/settings/settings-RAT.lua +235 -0
- package/lua/settings/settings-airboss.lua +142 -0
- package/lua/settings/settings-atis.lua +31 -0
- package/lua/settings/settings-awacs.lua +58 -0
- package/lua/settings/settings-awacsondemand.lua +26 -0
- package/lua/settings/settings-beacons.lua +10 -0
- package/lua/settings/settings-capwarzone.lua +164 -0
- package/lua/settings/settings-capzone.lua +32 -0
- package/lua/settings/settings-fac_ranges.lua +17 -0
- package/lua/settings/settings-foxzone.lua +14 -0
- package/lua/settings/settings-gemman.lua +6 -0
- package/lua/settings/settings-global.lua +31 -0
- package/lua/settings/settings-intercept.lua +23 -0
- package/lua/settings/settings-logistics.lua +22 -0
- package/lua/settings/settings-ondemandawacs.lua +29 -0
- package/lua/settings/settings-ondemandtankers.lua +29 -0
- package/lua/settings/settings-pedros.lua +11 -0
- package/lua/settings/settings-ranges.lua +28 -0
- package/lua/settings/settings-reapers.lua +25 -0
- package/lua/settings/settings-sams.lua +19 -0
- package/lua/settings/settings-skynet.lua +239 -0
- package/lua/settings/settings-tankers.lua +32 -0
- package/lua/settings/settings-training_ranges.lua +37 -0
- package/lua/src/010-root_menus.lua +5 -0
- package/lua/src/020-mission_functions.lua +1059 -0
- package/lua/src/110-set_clients.lua +61 -0
- package/lua/src/120-tankers.lua +589 -0
- package/lua/src/130-airboss.lua +621 -0
- package/lua/src/135-pedro.lua +21 -0
- package/lua/src/140-beacons.lua +19 -0
- package/lua/src/150-awacs.lua +599 -0
- package/lua/src/160-atis.lua +53 -0
- package/lua/src/170-cap_zone_training.lua +127 -0
- package/lua/src/172-cap_zone_war.lua +190 -0
- package/lua/src/173-fox_zone_training.lua +87 -0
- package/lua/src/176-random_air_traffic.lua +73 -0
- package/lua/src/178-training-intercept.lua +263 -0
- package/lua/src/180-logistics.lua +80 -0
- package/lua/src/190-ranges.lua +54 -0
- package/lua/src/191-sams.lua +49 -0
- package/lua/src/193-training_ranges.lua +191 -0
- package/lua/src/195-reaper-ondemand.lua +522 -0
- package/lua/src/196-fac_ranges.lua +34 -0
- package/lua/src/199-skynet.lua +721 -0
- package/lua/src/200-mission.lua +3 -0
- package/package.json +4 -3
- package/resources/radios/.gitkeep +0 -0
- package/resources/sounds/CTLD/beacon.ogg +0 -0
- package/resources/sounds/CTLD/beaconsilent.ogg +0 -0
- package/resources/sounds/Misc/.gitkeep +0 -0
- package/resources/sounds/Misc/2_Bips.ogg +0 -0
- package/resources/sounds/Misc/Bip.ogg +0 -0
- package/resources/sounds/Misc/crash_wood.ogg +0 -0
- package/scripts/build.js +2 -1
- package/scripts/inject-scripts.js +127 -230
- 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
|