From b335e99d5be21f80a595ca06d468fcfa6759338a Mon Sep 17 00:00:00 2001 From: FlightControl Date: Sat, 11 Jun 2016 10:28:57 +0200 Subject: [PATCH] Lots of bugs fixed - MISSILETRAINER: is working now... SET_CLIENT. Is working much better now. Had to rework DATABASE, SPAWN to get this straight. BASE: Fixed a bug that has been in de system for a very long time. the parent should have never been deepcopied when inheriting from it. - SCHEDULER: Fixed a nasty bug with the scheduler, when the repeatparameters was nil, i was still repeating, very wrong. fixed now. --- Moose Development/Moose/Base.lua | 3 +- Moose Development/Moose/Client.lua | 7 +- Moose Development/Moose/Database.lua | 73 +- Moose Development/Moose/MissileTrainer.lua | 142 +- Moose Development/Moose/Scheduler.lua | 12 +- Moose Development/Moose/Set.lua | 34 +- .../Moose_Mission_Template.miz | Bin 0 -> 5958 bytes .../l10n/DEFAULT/Moose.lua | 19996 +--------------- Moose Mission Setup/Moose.lua | 19996 +--------------- .../Moose_Test_AIBALANCER.miz | Bin 142100 -> 20647 bytes .../Moose_Test_CLEANUP/Moose_Test_CLEANUP.miz | Bin 216864 -> 99744 bytes .../Moose_Test_DESTROY/MOOSE_Test_DESTROY.miz | Bin 152241 -> 35121 bytes .../Moose_Test_ESCORT/MOOSE_Test_ESCORT.miz | Bin 176271 -> 59151 bytes .../Moose_Test_MISSILETRAINER.miz | Bin 235549 -> 126338 bytes .../Moose_Test_SEAD/MOOSE_Test_SEAD.miz | Bin 142853 -> 25733 bytes .../Moose_Test_SET_CLIENT.lua | 3 + .../Moose_Test_SET_CLIENT.miz | Bin 0 -> 19551 bytes .../Moose_Test_SET_GROUP.miz | Bin 158364 -> 41244 bytes .../Moose_Test_SPAWN/MOOSE_Test_SPAWN.miz | Bin 172103 -> 54983 bytes .../MOOSE_Test_SPAWN_Repeat.miz | Bin 142414 -> 25294 bytes .../MOOSE_Test_TASK_Pickup_and_Deploy.miz | Bin 149015 -> 31895 bytes .../Moose_Test_WRAPPER/Moose_Test_WRAPPER.miz | Bin 158034 -> 40914 bytes .../Moose_Test_ZONE/Moose_Test_ZONE.miz | Bin 137995 -> 20875 bytes .../Moose_Test_ZONE_POLYGON.miz | Bin 138711 -> 21591 bytes .../Moose_Test_ZONE_RADIUS.miz | Bin 138147 -> 21027 bytes .../Moose_Test_ZONE_UNIT.miz | Bin 138021 -> 20901 bytes 26 files changed, 215 insertions(+), 40051 deletions(-) create mode 100644 Moose Mission Setup/Moose Mission Template/Moose_Mission_Template.miz create mode 100644 Moose Test Missions/Moose_Test_SET_CLIENT/Moose_Test_SET_CLIENT.lua create mode 100644 Moose Test Missions/Moose_Test_SET_CLIENT/Moose_Test_SET_CLIENT.miz diff --git a/Moose Development/Moose/Base.lua b/Moose Development/Moose/Base.lua index 85c4133ec..4c089958d 100644 --- a/Moose Development/Moose/Base.lua +++ b/Moose Development/Moose/Base.lua @@ -116,7 +116,8 @@ end -- @return #BASE Child function BASE:Inherit( Child, Parent ) local Child = routines.utils.deepCopy( Child ) - local Parent = routines.utils.deepCopy( Parent ) + --local Parent = routines.utils.deepCopy( Parent ) + --local Parent = Parent if Child ~= nil then setmetatable( Child, Parent ) Child.__index = Child diff --git a/Moose Development/Moose/Client.lua b/Moose Development/Moose/Client.lua index 690d4ef8e..556d5c18e 100644 --- a/Moose Development/Moose/Client.lua +++ b/Moose Development/Moose/Client.lua @@ -133,6 +133,7 @@ function CLIENT:Register( ClientName ) --self.AliveCheckScheduler = routines.scheduleFunction( self._AliveCheckScheduler, { self }, timer.getTime() + 1, 5 ) self.AliveCheckScheduler = SCHEDULER:New( self, self._AliveCheckScheduler, {}, 1, 5 ) + self:E( self ) return self end @@ -230,10 +231,10 @@ end -- @param #CLIENT self -- @param #function CallBack Function. -- @return #CLIENT -function CLIENT:Alive( CallBack, ... ) +function CLIENT:Alive( CallBackFunction, ... ) self:F() - self.ClientCallBack = CallBack + self.ClientCallBack = CallBackFunction self.ClientParameters = arg return self @@ -241,7 +242,7 @@ end --- @param #CLIENT self function CLIENT:_AliveCheckScheduler() - self:F( { self.ClientName, self.ClientAlive2, self.ClientBriefingShown } ) + self:F( { self.ClientName, self.ClientAlive2, self.ClientBriefingShown, self.ClientCallBack } ) if self:IsAlive() then -- Polymorphic call of UNIT if self.ClientAlive2 == false then diff --git a/Moose Development/Moose/Database.lua b/Moose Development/Moose/Database.lua index ac0ca55f7..ca8dfa7f2 100644 --- a/Moose Development/Moose/Database.lua +++ b/Moose Development/Moose/Database.lua @@ -75,11 +75,11 @@ local _DATABASECoalition = local _DATABASECategory = { - [Unit.Category.AIRPLANE] = "Plane", - [Unit.Category.HELICOPTER] = "Helicopter", - [Unit.Category.GROUND_UNIT] = "Vehicle", - [Unit.Category.SHIP] = "Ship", - [Unit.Category.STRUCTURE] = "Structure", + ["plane"] = Unit.Category.AIRPLANE, + ["helicopter"] = Unit.Category.HELICOPTER, + ["vehicle"] = Unit.Category.GROUND_UNIT, + ["ship"] = Unit.Category.SHIP, + ["static"] = Unit.Category.STRUCTURE, } @@ -251,7 +251,7 @@ function DATABASE:Spawn( SpawnTemplate ) SpawnTemplate.SpawnCountryID = nil SpawnTemplate.SpawnCategoryID = nil - self:_RegisterTemplate( SpawnTemplate ) + self:_RegisterTemplate( SpawnTemplate, SpawnCoalitionID, SpawnCategoryID, SpawnCountryID ) self:T3( SpawnTemplate ) coalition.addGroup( SpawnCountryID, SpawnCategoryID, SpawnTemplate ) @@ -283,14 +283,15 @@ function DATABASE:GetStatusGroup( GroupName ) end end - --- Private method that registers new Group Templates within the DATABASE Object. -- @param #DATABASE self -- @param #table GroupTemplate -- @return #DATABASE self -function DATABASE:_RegisterTemplate( GroupTemplate, CoalitionName, CategoryName, CountryName ) +function DATABASE:_RegisterTemplate( GroupTemplate, CoalitionID, CategoryID, CountryID ) local GroupTemplateName = env.getValueDictByKey(GroupTemplate.name) + + local TraceTable = {} if not self.Templates.Groups[GroupTemplateName] then self.Templates.Groups[GroupTemplateName] = {} @@ -307,11 +308,22 @@ function DATABASE:_RegisterTemplate( GroupTemplate, CoalitionName, CategoryName, self.Templates.Groups[GroupTemplateName].groupId = GroupTemplate.groupId self.Templates.Groups[GroupTemplateName].UnitCount = #GroupTemplate.units self.Templates.Groups[GroupTemplateName].Units = GroupTemplate.units - self.Templates.Groups[GroupTemplateName].CategoryName = CategoryName - self.Templates.Groups[GroupTemplateName].CoalitionName = CoalitionName - self.Templates.Groups[GroupTemplateName].CountryName = CountryName + self.Templates.Groups[GroupTemplateName].CategoryID = CategoryID + self.Templates.Groups[GroupTemplateName].CoalitionID = CoalitionID + self.Templates.Groups[GroupTemplateName].CountryID = CountryID - self:T2( { "Group", self.Templates.Groups[GroupTemplateName].GroupName, self.Templates.Groups[GroupTemplateName].UnitCount } ) + + TraceTable[#TraceTable+1] = "Group" + TraceTable[#TraceTable+1] = self.Templates.Groups[GroupTemplateName].GroupName + + TraceTable[#TraceTable+1] = "Coalition" + TraceTable[#TraceTable+1] = self.Templates.Groups[GroupTemplateName].CoalitionID + TraceTable[#TraceTable+1] = "Category" + TraceTable[#TraceTable+1] = self.Templates.Groups[GroupTemplateName].CategoryID + TraceTable[#TraceTable+1] = "Country" + TraceTable[#TraceTable+1] = self.Templates.Groups[GroupTemplateName].CountryID + + TraceTable[#TraceTable+1] = "Units" for unit_num, UnitTemplate in pairs( GroupTemplate.units ) do @@ -322,21 +334,35 @@ function DATABASE:_RegisterTemplate( GroupTemplate, CoalitionName, CategoryName, self.Templates.Units[UnitTemplateName].GroupName = GroupTemplateName self.Templates.Units[UnitTemplateName].GroupTemplate = GroupTemplate self.Templates.Units[UnitTemplateName].GroupId = GroupTemplate.groupId - self.Templates.Units[UnitTemplateName].CategoryName = CategoryName - self.Templates.Units[UnitTemplateName].CoalitionName = CoalitionName - self.Templates.Units[UnitTemplateName].CountryName = CountryName - self:E( {"skill",UnitTemplate.skill}) + self.Templates.Units[UnitTemplateName].CategoryID = CategoryID + self.Templates.Units[UnitTemplateName].CoalitionID = CoalitionID + self.Templates.Units[UnitTemplateName].CountryID = CountryID + if UnitTemplate.skill and (UnitTemplate.skill == "Client" or UnitTemplate.skill == "Player") then self.Templates.ClientsByName[UnitTemplateName] = UnitTemplate - self.Templates.ClientsByName[UnitTemplateName].CategoryName = CategoryName - self.Templates.ClientsByName[UnitTemplateName].CoalitionName = CoalitionName - self.Templates.ClientsByName[UnitTemplateName].CountryName = CountryName + self.Templates.ClientsByName[UnitTemplateName].CategoryID = CategoryID + self.Templates.ClientsByName[UnitTemplateName].CoalitionID = CoalitionID + self.Templates.ClientsByName[UnitTemplateName].CountryID = CountryID self.Templates.ClientsByID[UnitTemplate.unitId] = UnitTemplate end - self:E( { "Unit", self.Templates.Units[UnitTemplateName].UnitName } ) + + TraceTable[#TraceTable+1] = self.Templates.Units[UnitTemplateName].UnitName end + + self:E( TraceTable ) end +function DATABASE:GetCoalitionFromClientTemplate( ClientName ) + return self.Templates.ClientsByName[ClientName].CoalitionID +end + +function DATABASE:GetCategoryFromClientTemplate( ClientName ) + return self.Templates.ClientsByName[ClientName].CategoryID +end + +function DATABASE:GetCountryFromClientTemplate( ClientName ) + return self.Templates.ClientsByName[ClientName].CountryID +end --- Private method that registers all alive players in the mission. -- @param #DATABASE self @@ -671,7 +697,12 @@ function DATABASE:_RegisterTemplates() for group_num, GroupTemplate in pairs(obj_type_data.group) do if GroupTemplate and GroupTemplate.units and type(GroupTemplate.units) == 'table' then --making sure again- this is a valid group - self:_RegisterTemplate( GroupTemplate, CoalitionName, CategoryName, CountryName ) + self:_RegisterTemplate( + GroupTemplate, + coalition.side[string.upper(CoalitionName)], + _DATABASECategory[string.lower(CategoryName)], + country.id[string.upper(CountryName)] + ) end --if GroupTemplate and GroupTemplate.units then end --for group_num, GroupTemplate in pairs(obj_type_data.group) do end --if ((type(obj_type_data) == 'table') and obj_type_data.group and (type(obj_type_data.group) == 'table') and (#obj_type_data.group > 0)) then diff --git a/Moose Development/Moose/MissileTrainer.lua b/Moose Development/Moose/MissileTrainer.lua index 57520d508..cfc4606c2 100644 --- a/Moose Development/Moose/MissileTrainer.lua +++ b/Moose Development/Moose/MissileTrainer.lua @@ -72,11 +72,72 @@ --- The MISSILETRAINER class -- @type MISSILETRAINER +-- @field Set#SET_CLIENT DBClients -- @extends Base#BASE MISSILETRAINER = { ClassName = "MISSILETRAINER", + TrackingMissiles = {}, } +function MISSILETRAINER._Alive( Client, self ) + + if self.Briefing then + Client:Message( self.Briefing, 15, "HELLO WORLD", "Trainer" ) + end + + if self.MenusOnOff == true then + Client:Message( "Use the 'Radio Menu' -> 'Other (F10)' -> 'Missile Trainer' menu options to change the Missile Trainer settings (for all players).", 15, "MENU", "Trainer" ) + + Client.MainMenu = MENU_CLIENT:New( Client, "Missile Trainer", nil ) -- Menu#MENU_CLIENT + + Client.MenuMessages = MENU_CLIENT:New( Client, "Messages", Client.MainMenu ) + Client.MenuOn = MENU_CLIENT_COMMAND:New( Client, "Messages On", Client.MenuMessages, self._MenuMessages, { MenuSelf = self, MessagesOnOff = true } ) + Client.MenuOff = MENU_CLIENT_COMMAND:New( Client, "Messages Off", Client.MenuMessages, self._MenuMessages, { MenuSelf = self, MessagesOnOff = false } ) + + Client.MenuTracking = MENU_CLIENT:New( Client, "Tracking", Client.MainMenu ) + Client.MenuTrackingToAll = MENU_CLIENT_COMMAND:New( Client, "To All", Client.MenuTracking, self._MenuMessages, { MenuSelf = self, TrackingToAll = true } ) + Client.MenuTrackingToTarget = MENU_CLIENT_COMMAND:New( Client, "To Target", Client.MenuTracking, self._MenuMessages, { MenuSelf = self, TrackingToAll = false } ) + Client.MenuTrackOn = MENU_CLIENT_COMMAND:New( Client, "Tracking On", Client.MenuTracking, self._MenuMessages, { MenuSelf = self, TrackingOnOff = true } ) + Client.MenuTrackOff = MENU_CLIENT_COMMAND:New( Client, "Tracking Off", Client.MenuTracking, self._MenuMessages, { MenuSelf = self, TrackingOnOff = false } ) + Client.MenuTrackIncrease = MENU_CLIENT_COMMAND:New( Client, "Frequency Increase", Client.MenuTracking, self._MenuMessages, { MenuSelf = self, TrackingFrequency = -1 } ) + Client.MenuTrackDecrease = MENU_CLIENT_COMMAND:New( Client, "Frequency Decrease", Client.MenuTracking, self._MenuMessages, { MenuSelf = self, TrackingFrequency = 1 } ) + + Client.MenuAlerts = MENU_CLIENT:New( Client, "Alerts", Client.MainMenu ) + Client.MenuAlertsToAll = MENU_CLIENT_COMMAND:New( Client, "To All", Client.MenuAlerts, self._MenuMessages, { MenuSelf = self, AlertsToAll = true } ) + Client.MenuAlertsToTarget = MENU_CLIENT_COMMAND:New( Client, "To Target", Client.MenuAlerts, self._MenuMessages, { MenuSelf = self, AlertsToAll = false } ) + Client.MenuHitsOn = MENU_CLIENT_COMMAND:New( Client, "Hits On", Client.MenuAlerts, self._MenuMessages, { MenuSelf = self, AlertsHitsOnOff = true } ) + Client.MenuHitsOff = MENU_CLIENT_COMMAND:New( Client, "Hits Off", Client.MenuAlerts, self._MenuMessages, { MenuSelf = self, AlertsHitsOnOff = false } ) + Client.MenuLaunchesOn = MENU_CLIENT_COMMAND:New( Client, "Launches On", Client.MenuAlerts, self._MenuMessages, { MenuSelf = self, AlertsLaunchesOnOff = true } ) + Client.MenuLaunchesOff = MENU_CLIENT_COMMAND:New( Client, "Launches Off", Client.MenuAlerts, self._MenuMessages, { MenuSelf = self, AlertsLaunchesOnOff = false } ) + + Client.MenuDetails = MENU_CLIENT:New( Client, "Details", Client.MainMenu ) + Client.MenuDetailsDistanceOn = MENU_CLIENT_COMMAND:New( Client, "Range On", Client.MenuDetails, self._MenuMessages, { MenuSelf = self, DetailsRangeOnOff = true } ) + Client.MenuDetailsDistanceOff = MENU_CLIENT_COMMAND:New( Client, "Range Off", Client.MenuDetails, self._MenuMessages, { MenuSelf = self, DetailsRangeOnOff = false } ) + Client.MenuDetailsBearingOn = MENU_CLIENT_COMMAND:New( Client, "Bearing On", Client.MenuDetails, self._MenuMessages, { MenuSelf = self, DetailsBearingOnOff = true } ) + Client.MenuDetailsBearingOff = MENU_CLIENT_COMMAND:New( Client, "Bearing Off", Client.MenuDetails, self._MenuMessages, { MenuSelf = self, DetailsBearingOnOff = false } ) + + Client.MenuDistance = MENU_CLIENT:New( Client, "Set distance to plane", Client.MainMenu ) + Client.MenuDistance50 = MENU_CLIENT_COMMAND:New( Client, "50 meter", Client.MenuDistance, self._MenuMessages, { MenuSelf = self, Distance = 50 / 1000 } ) + Client.MenuDistance100 = MENU_CLIENT_COMMAND:New( Client, "100 meter", Client.MenuDistance, self._MenuMessages, { MenuSelf = self, Distance = 100 / 1000 } ) + Client.MenuDistance150 = MENU_CLIENT_COMMAND:New( Client, "150 meter", Client.MenuDistance, self._MenuMessages, { MenuSelf = self, Distance = 150 / 1000 } ) + Client.MenuDistance200 = MENU_CLIENT_COMMAND:New( Client, "200 meter", Client.MenuDistance, self._MenuMessages, { MenuSelf = self, Distance = 200 / 1000 } ) + else + if Client.MainMenu then + Client.MainMenu:Remove() + end + end + + local ClientID = Client:GetID() + self:T( ClientID ) + if not self.TrackingMissiles[ClientID] then + self.TrackingMissiles[ClientID] = {} + end + self.TrackingMissiles[ClientID].Client = Client + if not self.TrackingMissiles[ClientID].MissileData then + self.TrackingMissiles[ClientID].MissileData = {} + end +end + --- Creates the main object which is handling missile tracking. -- When a missile is fired a SCHEDULER is set off that follows the missile. When near a certain a client player, the missile will be destroyed. -- @param #MISSILETRAINER self @@ -101,76 +162,23 @@ function MISSILETRAINER:New( Distance, Briefing ) _EVENTDISPATCHER:OnShot( self._EventShot, self ) - self.DB = DATABASE:New():FilterStart() - self.DBClients = self.DB.Clients - self.DBUnits = self.DB.Units - - for ClientID, Client in pairs( self.DBClients ) do - - local function _Alive( Client ) - - if self.Briefing then - Client:Message( self.Briefing, 15, "HELLO WORLD", "Trainer" ) - end - - if self.MenusOnOff == true then - Client:Message( "Use the 'Radio Menu' -> 'Other (F10)' -> 'Missile Trainer' menu options to change the Missile Trainer settings (for all players).", 15, "MENU", "Trainer" ) - - Client.MainMenu = MENU_CLIENT:New( Client, "Missile Trainer", nil ) -- Menu#MENU_CLIENT - - Client.MenuMessages = MENU_CLIENT:New( Client, "Messages", Client.MainMenu ) - Client.MenuOn = MENU_CLIENT_COMMAND:New( Client, "Messages On", Client.MenuMessages, self._MenuMessages, { MenuSelf = self, MessagesOnOff = true } ) - Client.MenuOff = MENU_CLIENT_COMMAND:New( Client, "Messages Off", Client.MenuMessages, self._MenuMessages, { MenuSelf = self, MessagesOnOff = false } ) - - Client.MenuTracking = MENU_CLIENT:New( Client, "Tracking", Client.MainMenu ) - Client.MenuTrackingToAll = MENU_CLIENT_COMMAND:New( Client, "To All", Client.MenuTracking, self._MenuMessages, { MenuSelf = self, TrackingToAll = true } ) - Client.MenuTrackingToTarget = MENU_CLIENT_COMMAND:New( Client, "To Target", Client.MenuTracking, self._MenuMessages, { MenuSelf = self, TrackingToAll = false } ) - Client.MenuTrackOn = MENU_CLIENT_COMMAND:New( Client, "Tracking On", Client.MenuTracking, self._MenuMessages, { MenuSelf = self, TrackingOnOff = true } ) - Client.MenuTrackOff = MENU_CLIENT_COMMAND:New( Client, "Tracking Off", Client.MenuTracking, self._MenuMessages, { MenuSelf = self, TrackingOnOff = false } ) - Client.MenuTrackIncrease = MENU_CLIENT_COMMAND:New( Client, "Frequency Increase", Client.MenuTracking, self._MenuMessages, { MenuSelf = self, TrackingFrequency = -1 } ) - Client.MenuTrackDecrease = MENU_CLIENT_COMMAND:New( Client, "Frequency Decrease", Client.MenuTracking, self._MenuMessages, { MenuSelf = self, TrackingFrequency = 1 } ) - - Client.MenuAlerts = MENU_CLIENT:New( Client, "Alerts", Client.MainMenu ) - Client.MenuAlertsToAll = MENU_CLIENT_COMMAND:New( Client, "To All", Client.MenuAlerts, self._MenuMessages, { MenuSelf = self, AlertsToAll = true } ) - Client.MenuAlertsToTarget = MENU_CLIENT_COMMAND:New( Client, "To Target", Client.MenuAlerts, self._MenuMessages, { MenuSelf = self, AlertsToAll = false } ) - Client.MenuHitsOn = MENU_CLIENT_COMMAND:New( Client, "Hits On", Client.MenuAlerts, self._MenuMessages, { MenuSelf = self, AlertsHitsOnOff = true } ) - Client.MenuHitsOff = MENU_CLIENT_COMMAND:New( Client, "Hits Off", Client.MenuAlerts, self._MenuMessages, { MenuSelf = self, AlertsHitsOnOff = false } ) - Client.MenuLaunchesOn = MENU_CLIENT_COMMAND:New( Client, "Launches On", Client.MenuAlerts, self._MenuMessages, { MenuSelf = self, AlertsLaunchesOnOff = true } ) - Client.MenuLaunchesOff = MENU_CLIENT_COMMAND:New( Client, "Launches Off", Client.MenuAlerts, self._MenuMessages, { MenuSelf = self, AlertsLaunchesOnOff = false } ) - - Client.MenuDetails = MENU_CLIENT:New( Client, "Details", Client.MainMenu ) - Client.MenuDetailsDistanceOn = MENU_CLIENT_COMMAND:New( Client, "Range On", Client.MenuDetails, self._MenuMessages, { MenuSelf = self, DetailsRangeOnOff = true } ) - Client.MenuDetailsDistanceOff = MENU_CLIENT_COMMAND:New( Client, "Range Off", Client.MenuDetails, self._MenuMessages, { MenuSelf = self, DetailsRangeOnOff = false } ) - Client.MenuDetailsBearingOn = MENU_CLIENT_COMMAND:New( Client, "Bearing On", Client.MenuDetails, self._MenuMessages, { MenuSelf = self, DetailsBearingOnOff = true } ) - Client.MenuDetailsBearingOff = MENU_CLIENT_COMMAND:New( Client, "Bearing Off", Client.MenuDetails, self._MenuMessages, { MenuSelf = self, DetailsBearingOnOff = false } ) - - Client.MenuDistance = MENU_CLIENT:New( Client, "Set distance to plane", Client.MainMenu ) - Client.MenuDistance50 = MENU_CLIENT_COMMAND:New( Client, "50 meter", Client.MenuDistance, self._MenuMessages, { MenuSelf = self, Distance = 50 / 1000 } ) - Client.MenuDistance100 = MENU_CLIENT_COMMAND:New( Client, "100 meter", Client.MenuDistance, self._MenuMessages, { MenuSelf = self, Distance = 100 / 1000 } ) - Client.MenuDistance150 = MENU_CLIENT_COMMAND:New( Client, "150 meter", Client.MenuDistance, self._MenuMessages, { MenuSelf = self, Distance = 150 / 1000 } ) - Client.MenuDistance200 = MENU_CLIENT_COMMAND:New( Client, "200 meter", Client.MenuDistance, self._MenuMessages, { MenuSelf = self, Distance = 200 / 1000 } ) - else - if Client.MainMenu then - Client.MainMenu:Remove() - end - end + self.DBClients = SET_CLIENT:New():FilterStart() - local ClientID = Client:GetID() - self:T( ClientID ) - if not self.TrackingMissiles[ClientID] then - self.TrackingMissiles[ClientID] = {} - end - self.TrackingMissiles[ClientID].Client = Client - if not self.TrackingMissiles[ClientID].MissileData then - self.TrackingMissiles[ClientID].MissileData = {} - end +-- for ClientID, Client in pairs( self.DBClients.Database ) do +-- self:E( "ForEach:" .. Client.UnitName ) +-- Client:Alive( self._Alive, self ) +-- end +-- + self.DBClients:ForEachClient( + function( Client ) + self:E( "ForEach:" .. Client.UnitName ) + Client:Alive( self._Alive, self ) end + ) + - Client:Alive( _Alive ) - end - -- self.DB:ForEachClient( -- --- @param Client#CLIENT Client -- function( Client ) @@ -205,6 +213,7 @@ end -- Initialization methods. + --- Sets by default the display of any message to be ON or OFF. -- @param #MISSILETRAINER self -- @param #boolean MessagesOnOff true or false @@ -446,7 +455,7 @@ function MISSILETRAINER:_EventShot( Event ) self:T(TrainerTargetDCSUnitName ) - local Client = self.DBClients[TrainerTargetDCSUnitName] + local Client = self.DBClients:FindClient( TrainerTargetDCSUnitName ) if Client then local TrainerSourceUnit = UNIT:Find( TrainerSourceDCSUnit ) @@ -468,6 +477,7 @@ function MISSILETRAINER:_EventShot( Event ) end local ClientID = Client:GetID() + self:T( ClientID ) local MissileData = {} MissileData.TrainerSourceUnit = TrainerSourceUnit MissileData.TrainerWeapon = TrainerWeapon diff --git a/Moose Development/Moose/Scheduler.lua b/Moose Development/Moose/Scheduler.lua index ad45956f6..652c74da9 100644 --- a/Moose Development/Moose/Scheduler.lua +++ b/Moose Development/Moose/Scheduler.lua @@ -49,8 +49,10 @@ function SCHEDULER:New( TimeEventObject, TimeEventFunction, TimeEventFunctionArg if RepeatSecondsInterval then self.RepeatSecondsInterval = RepeatSecondsInterval + self.Repeat = true else self.RepeatSecondsInterval = 0 + self.Repeat = false end if RandomizationFactor then @@ -63,7 +65,6 @@ function SCHEDULER:New( TimeEventObject, TimeEventFunction, TimeEventFunctionArg self.StopSeconds = StopSeconds end - self.Repeat = false self.StartTime = timer.getTime() @@ -78,7 +79,6 @@ end function SCHEDULER:Start() self:F2( self.TimeEventObject ) - self.Repeat = true timer.scheduleFunction( self._Scheduler, self, timer.getTime() + self.StartSeconds + .01 ) return self @@ -115,14 +115,16 @@ function SCHEDULER:_Scheduler() Status, Result = xpcall( function() return self.TimeEventFunction( unpack( self.TimeEventFunctionArguments ) ) end, ErrorHandler ) end - self:T( { Status, Result } ) + self:T( { Status, Result, self.StartTime, self.RepeatSecondsInterval, self.RandomizationFactor, self.StopSeconds } ) - if Status and ( ( not Result == nil ) or ( Result and Result ~= false ) ) then + if Status and ( ( Result == nil ) or ( Result and Result ~= false ) ) then if self.Repeat and ( not self.StopSeconds or ( self.StopSeconds and timer.getTime() <= self.StartTime + self.StopSeconds ) ) then + local ScheduleTime = timer.getTime() + self.RepeatSecondsInterval + math.random( - ( self.RandomizationFactor * self.RepeatSecondsInterval / 2 ), ( self.RandomizationFactor * self.RepeatSecondsInterval / 2 ) ) + 0.01 + self:T( { timer.getTime(), ScheduleTime } ) timer.scheduleFunction( self._Scheduler, self, - timer.getTime() + self.RepeatSecondsInterval + math.random( - ( self.RandomizationFactor * self.RepeatSecondsInterval / 2 ), ( self.RandomizationFactor * self.RepeatSecondsInterval / 2 ) ) + 0.01 + ScheduleTime ) end end diff --git a/Moose Development/Moose/Set.lua b/Moose Development/Moose/Set.lua index 6ec5bec0e..ea3152776 100644 --- a/Moose Development/Moose/Set.lua +++ b/Moose Development/Moose/Set.lua @@ -187,7 +187,6 @@ SET_BASE = { ClassName = "SET_BASE", Set = {}, - Database = {}, } --- Creates a new SET_BASE object, building a set of units belonging to a coalitions, categories, countries, types or with defined prefix names. @@ -198,11 +197,13 @@ SET_BASE = { -- DBObject = SET_BASE:New() function SET_BASE:New( Database ) + env.info( tostring( Database ) ) + -- Inherits from BASE local self = BASE:Inherit( self, BASE:New() ) self.Database = Database - + self.YieldInterval = 10 self.TimeInterval = 0.001 @@ -1247,11 +1248,11 @@ SET_CLIENT = { neutral = coalition.side.NEUTRAL, }, Categories = { - plane = "plane", - helicopter = "helicopter", - ground = "vehicle", - ship = "ship", - structure = "static", + plane = Unit.Category.AIRPLANE, + helicopter = Unit.Category.HELICOPTER, + ground = Unit.Category.GROUND_UNIT, + ship = Unit.Category.SHIP, + structure = Unit.Category.STRUCTURE, }, }, } @@ -1264,7 +1265,6 @@ SET_CLIENT = { -- -- Define a new SET_CLIENT Object. This DBObject will contain a reference to all Clients. -- DBObject = SET_CLIENT:New() function SET_CLIENT:New() - -- Inherits from BASE local self = BASE:Inherit( self, SET_BASE:New( _DATABASE.CLIENTS ) ) @@ -1518,9 +1518,9 @@ function SET_CLIENT:IsIncludeObject( MClient ) if self.Filter.Coalitions then local MClientCoalition = false for CoalitionID, CoalitionName in pairs( self.Filter.Coalitions ) do - local ClientCoalitionName = _DATABASE.Templates.ClientsByName[MClientName].CoalitionName - self:T3( { "Coalition:", ClientCoalitionName, self.FilterMeta.Coalitions[CoalitionName], CoalitionName } ) - if self.FilterMeta.Coalitions[CoalitionName] and self.FilterMeta.Coalitions[CoalitionName] == ClientCoalitionName then + local ClientCoalitionID = _DATABASE:GetCoalitionFromClientTemplate( MClientName ) + self:T3( { "Coalition:", ClientCoalitionID, self.FilterMeta.Coalitions[CoalitionName], CoalitionName } ) + if self.FilterMeta.Coalitions[CoalitionName] and self.FilterMeta.Coalitions[CoalitionName] == ClientCoalitionID then MClientCoalition = true end end @@ -1531,9 +1531,9 @@ function SET_CLIENT:IsIncludeObject( MClient ) if self.Filter.Categories then local MClientCategory = false for CategoryID, CategoryName in pairs( self.Filter.Categories ) do - local ClientCategoryName = _DATABASE.Templates.ClientsByName[MClientName].CategoryName - self:T3( { "Category:", ClientCategoryName, self.FilterMeta.Categories[CategoryName], CategoryName } ) - if self.FilterMeta.Categories[CategoryName] and self.FilterMeta.Categories[CategoryName] == ClientCategoryName then + local ClientCategoryID = _DATABASE:GetCategoryFromClientTemplate( MClientName ) + self:T3( { "Category:", ClientCategoryID, self.FilterMeta.Categories[CategoryName], CategoryName } ) + if self.FilterMeta.Categories[CategoryName] and self.FilterMeta.Categories[CategoryName] == ClientCategoryID then MClientCategory = true end end @@ -1556,9 +1556,9 @@ function SET_CLIENT:IsIncludeObject( MClient ) if self.Filter.Countries then local MClientCountry = false for CountryID, CountryName in pairs( self.Filter.Countries ) do - local ClientCountryName = _DATABASE.Templates.ClientsByName[MClientName].CountryName - self:T3( { "Country:", ClientCountryName, country.id[CountryName], CountryName } ) - if country.id[CountryName] and country.id[ClientCountryName] and country.id[CountryName] == country.id[ClientCountryName] then + local ClientCountryID = _DATABASE:GetCountryFromClientTemplate(MClientName) + self:T3( { "Country:", ClientCountryID, country.id[CountryName], CountryName } ) + if country.id[CountryName] and country.id[CountryName] == ClientCountryID then MClientCountry = true end end diff --git a/Moose Mission Setup/Moose Mission Template/Moose_Mission_Template.miz b/Moose Mission Setup/Moose Mission Template/Moose_Mission_Template.miz new file mode 100644 index 0000000000000000000000000000000000000000..d1b77c07bc820256410f87b60070c4d00b821a63 GIT binary patch literal 5958 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 literal 0 HcmV?d00001 diff --git a/Moose Mission Setup/Moose Mission Update/l10n/DEFAULT/Moose.lua b/Moose Mission Setup/Moose Mission Update/l10n/DEFAULT/Moose.lua index 37a7a4c09..8e2cefd95 100644 --- a/Moose Mission Setup/Moose Mission Update/l10n/DEFAULT/Moose.lua +++ b/Moose Mission Setup/Moose Mission Update/l10n/DEFAULT/Moose.lua @@ -1,5 +1,6 @@ -env.info( '*** MOOSE STATIC INCLUDE START *** ' ) -env.info( 'Moose Generation Timestamp: 20160610_1430' ) +env.info( '*** MOOSE DYNAMIC INCLUDE START *** ' ) +env.info( 'Moose Generation Timestamp: 20160611_0744' ) + local base = _G Include = {} @@ -10,19976 +11,33 @@ Include.Path = function() end Include.File = function( IncludeFile ) + if not Include.Files[ IncludeFile ] then + Include.Files[IncludeFile] = IncludeFile + env.info( "Include:" .. IncludeFile .. " from " .. Include.ProgramPath ) + local f = assert( base.loadfile( Include.ProgramPath .. IncludeFile .. ".lua" ) ) + if f == nil then + env.info( "Include:" .. IncludeFile .. " from " .. Include.MissionPath ) + local f = assert( base.loadfile( Include.MissionPath .. IncludeFile .. ".lua" ) ) + if f == nil then + error ("Could not load MOOSE file " .. IncludeFile .. ".lua" ) + else + env.info( "Include:" .. IncludeFile .. " loaded from " .. Include.MissionPath ) + return f() + end + else + env.info( "Include:" .. IncludeFile .. " loaded from " .. Include.ProgramPath ) + return f() + end + end end +Include.ProgramPath = "Scripts/Moose/" +Include.MissionPath = Include.Path() + +env.info( "Include.ProgramPath = " .. Include.ProgramPath) +env.info( "Include.MissionPath = " .. Include.MissionPath) + Include.Files = {} ---- Various routines --- @module routines --- @author Flightcontrol -env.setErrorMessageBoxEnabled(false) - ---- Extract of MIST functions. --- @author Grimes - -routines = {} - - --- don't change these -routines.majorVersion = 3 -routines.minorVersion = 3 -routines.build = 22 - ------------------------------------------------------------------------------------------------------------------ - ----------------------------------------------------------------------------------------------- --- Utils- conversion, Lua utils, etc. -routines.utils = {} - ---from http://lua-users.org/wiki/CopyTable -routines.utils.deepCopy = function(object) - local lookup_table = {} - local function _copy(object) - if type(object) ~= "table" then - return object - elseif lookup_table[object] then - return lookup_table[object] - end - local new_table = {} - lookup_table[object] = new_table - for index, value in pairs(object) do - new_table[_copy(index)] = _copy(value) - end - return setmetatable(new_table, getmetatable(object)) - end - local objectreturn = _copy(object) - return objectreturn -end - - --- porting in Slmod's serialize_slmod2 -routines.utils.oneLineSerialize = function(tbl) -- serialization of a table all on a single line, no comments, made to replace old get_table_string function - - lookup_table = {} - - local function _Serialize( tbl ) - - if type(tbl) == 'table' then --function only works for tables! - - if lookup_table[tbl] then - return lookup_table[object] - end - - local tbl_str = {} - - lookup_table[tbl] = tbl_str - - tbl_str[#tbl_str + 1] = '{' - - for ind,val in pairs(tbl) do -- serialize its fields - local ind_str = {} - if type(ind) == "number" then - ind_str[#ind_str + 1] = '[' - ind_str[#ind_str + 1] = tostring(ind) - ind_str[#ind_str + 1] = ']=' - else --must be a string - ind_str[#ind_str + 1] = '[' - ind_str[#ind_str + 1] = routines.utils.basicSerialize(ind) - ind_str[#ind_str + 1] = ']=' - end - - local val_str = {} - if ((type(val) == 'number') or (type(val) == 'boolean')) then - val_str[#val_str + 1] = tostring(val) - val_str[#val_str + 1] = ',' - tbl_str[#tbl_str + 1] = table.concat(ind_str) - tbl_str[#tbl_str + 1] = table.concat(val_str) - elseif type(val) == 'string' then - val_str[#val_str + 1] = routines.utils.basicSerialize(val) - val_str[#val_str + 1] = ',' - tbl_str[#tbl_str + 1] = table.concat(ind_str) - tbl_str[#tbl_str + 1] = table.concat(val_str) - elseif type(val) == 'nil' then -- won't ever happen, right? - val_str[#val_str + 1] = 'nil,' - tbl_str[#tbl_str + 1] = table.concat(ind_str) - tbl_str[#tbl_str + 1] = table.concat(val_str) - elseif type(val) == 'table' then - if ind == "__index" then - -- tbl_str[#tbl_str + 1] = "__index" - -- tbl_str[#tbl_str + 1] = ',' --I think this is right, I just added it - else - - val_str[#val_str + 1] = _Serialize(val) - val_str[#val_str + 1] = ',' --I think this is right, I just added it - tbl_str[#tbl_str + 1] = table.concat(ind_str) - tbl_str[#tbl_str + 1] = table.concat(val_str) - end - elseif type(val) == 'function' then - -- tbl_str[#tbl_str + 1] = "function " .. tostring(ind) - -- tbl_str[#tbl_str + 1] = ',' --I think this is right, I just added it - else --- env.info('unable to serialize value type ' .. routines.utils.basicSerialize(type(val)) .. ' at index ' .. tostring(ind)) --- env.info( debug.traceback() ) - end - - end - tbl_str[#tbl_str + 1] = '}' - return table.concat(tbl_str) - else - return tostring(tbl) - end - end - - local objectreturn = _Serialize(tbl) - return objectreturn -end - ---porting in Slmod's "safestring" basic serialize -routines.utils.basicSerialize = function(s) - if s == nil then - return "\"\"" - else - if ((type(s) == 'number') or (type(s) == 'boolean') or (type(s) == 'function') or (type(s) == 'table') or (type(s) == 'userdata') ) then - return tostring(s) - elseif type(s) == 'string' then - s = string.format('%q', s) - return s - end - end -end - - -routines.utils.toDegree = function(angle) - return angle*180/math.pi -end - -routines.utils.toRadian = function(angle) - return angle*math.pi/180 -end - -routines.utils.metersToNM = function(meters) - return meters/1852 -end - -routines.utils.metersToFeet = function(meters) - return meters/0.3048 -end - -routines.utils.NMToMeters = function(NM) - return NM*1852 -end - -routines.utils.feetToMeters = function(feet) - return feet*0.3048 -end - -routines.utils.mpsToKnots = function(mps) - return mps*3600/1852 -end - -routines.utils.mpsToKmph = function(mps) - return mps*3.6 -end - -routines.utils.knotsToMps = function(knots) - return knots*1852/3600 -end - -routines.utils.kmphToMps = function(kmph) - return kmph/3.6 -end - -function routines.utils.makeVec2(Vec3) - if Vec3.z then - return {x = Vec3.x, y = Vec3.z} - else - return {x = Vec3.x, y = Vec3.y} -- it was actually already vec2. - end -end - -function routines.utils.makeVec3(Vec2, y) - if not Vec2.z then - if not y then - y = 0 - end - return {x = Vec2.x, y = y, z = Vec2.y} - else - return {x = Vec2.x, y = Vec2.y, z = Vec2.z} -- it was already Vec3, actually. - end -end - -function routines.utils.makeVec3GL(Vec2, offset) - local adj = offset or 0 - - if not Vec2.z then - return {x = Vec2.x, y = (land.getHeight(Vec2) + adj), z = Vec2.y} - else - return {x = Vec2.x, y = (land.getHeight({x = Vec2.x, y = Vec2.z}) + adj), z = Vec2.z} - end -end - -routines.utils.zoneToVec3 = function(zone) - local new = {} - if type(zone) == 'table' and zone.point then - new.x = zone.point.x - new.y = zone.point.y - new.z = zone.point.z - return new - elseif type(zone) == 'string' then - zone = trigger.misc.getZone(zone) - if zone then - new.x = zone.point.x - new.y = zone.point.y - new.z = zone.point.z - return new - end - end -end - --- gets heading-error corrected direction from point along vector vec. -function routines.utils.getDir(vec, point) - local dir = math.atan2(vec.z, vec.x) - dir = dir + routines.getNorthCorrection(point) - if dir < 0 then - dir = dir + 2*math.pi -- put dir in range of 0 to 2*pi - end - return dir -end - --- gets distance in meters between two points (2 dimensional) -function routines.utils.get2DDist(point1, point2) - point1 = routines.utils.makeVec3(point1) - point2 = routines.utils.makeVec3(point2) - return routines.vec.mag({x = point1.x - point2.x, y = 0, z = point1.z - point2.z}) -end - --- gets distance in meters between two points (3 dimensional) -function routines.utils.get3DDist(point1, point2) - return routines.vec.mag({x = point1.x - point2.x, y = point1.y - point2.y, z = point1.z - point2.z}) -end - - - --- From http://lua-users.org/wiki/SimpleRound --- use negative idp for rounding ahead of decimal place, positive for rounding after decimal place -routines.utils.round = function(num, idp) - local mult = 10^(idp or 0) - return math.floor(num * mult + 0.5) / mult -end - --- porting in Slmod's dostring -routines.utils.dostring = function(s) - local f, err = loadstring(s) - if f then - return true, f() - else - return false, err - end -end - - ---3D Vector manipulation -routines.vec = {} - -routines.vec.add = function(vec1, vec2) - return {x = vec1.x + vec2.x, y = vec1.y + vec2.y, z = vec1.z + vec2.z} -end - -routines.vec.sub = function(vec1, vec2) - return {x = vec1.x - vec2.x, y = vec1.y - vec2.y, z = vec1.z - vec2.z} -end - -routines.vec.scalarMult = function(vec, mult) - return {x = vec.x*mult, y = vec.y*mult, z = vec.z*mult} -end - -routines.vec.scalar_mult = routines.vec.scalarMult - -routines.vec.dp = function(vec1, vec2) - return vec1.x*vec2.x + vec1.y*vec2.y + vec1.z*vec2.z -end - -routines.vec.cp = function(vec1, vec2) - return { x = vec1.y*vec2.z - vec1.z*vec2.y, y = vec1.z*vec2.x - vec1.x*vec2.z, z = vec1.x*vec2.y - vec1.y*vec2.x} -end - -routines.vec.mag = function(vec) - return (vec.x^2 + vec.y^2 + vec.z^2)^0.5 -end - -routines.vec.getUnitVec = function(vec) - local mag = routines.vec.mag(vec) - return { x = vec.x/mag, y = vec.y/mag, z = vec.z/mag } -end - -routines.vec.rotateVec2 = function(vec2, theta) - return { x = vec2.x*math.cos(theta) - vec2.y*math.sin(theta), y = vec2.x*math.sin(theta) + vec2.y*math.cos(theta)} -end ---------------------------------------------------------------------------------------------------------------------------- - - - - --- acc- the accuracy of each easting/northing. 0, 1, 2, 3, 4, or 5. -routines.tostringMGRS = function(MGRS, acc) - if acc == 0 then - return MGRS.UTMZone .. ' ' .. MGRS.MGRSDigraph - else - return MGRS.UTMZone .. ' ' .. MGRS.MGRSDigraph .. ' ' .. string.format('%0' .. acc .. 'd', routines.utils.round(MGRS.Easting/(10^(5-acc)), 0)) - .. ' ' .. string.format('%0' .. acc .. 'd', routines.utils.round(MGRS.Northing/(10^(5-acc)), 0)) - end -end - ---[[acc: -in DM: decimal point of minutes. -In DMS: decimal point of seconds. -position after the decimal of the least significant digit: -So: -42.32 - acc of 2. -]] -routines.tostringLL = function(lat, lon, acc, DMS) - - local latHemi, lonHemi - if lat > 0 then - latHemi = 'N' - else - latHemi = 'S' - end - - if lon > 0 then - lonHemi = 'E' - else - lonHemi = 'W' - end - - lat = math.abs(lat) - lon = math.abs(lon) - - local latDeg = math.floor(lat) - local latMin = (lat - latDeg)*60 - - local lonDeg = math.floor(lon) - local lonMin = (lon - lonDeg)*60 - - if DMS then -- degrees, minutes, and seconds. - local oldLatMin = latMin - latMin = math.floor(latMin) - local latSec = routines.utils.round((oldLatMin - latMin)*60, acc) - - local oldLonMin = lonMin - lonMin = math.floor(lonMin) - local lonSec = routines.utils.round((oldLonMin - lonMin)*60, acc) - - if latSec == 60 then - latSec = 0 - latMin = latMin + 1 - end - - if lonSec == 60 then - lonSec = 0 - lonMin = lonMin + 1 - end - - local secFrmtStr -- create the formatting string for the seconds place - if acc <= 0 then -- no decimal place. - secFrmtStr = '%02d' - else - local width = 3 + acc -- 01.310 - that's a width of 6, for example. - secFrmtStr = '%0' .. width .. '.' .. acc .. 'f' - end - - return string.format('%02d', latDeg) .. ' ' .. string.format('%02d', latMin) .. '\' ' .. string.format(secFrmtStr, latSec) .. '"' .. latHemi .. ' ' - .. string.format('%02d', lonDeg) .. ' ' .. string.format('%02d', lonMin) .. '\' ' .. string.format(secFrmtStr, lonSec) .. '"' .. lonHemi - - else -- degrees, decimal minutes. - latMin = routines.utils.round(latMin, acc) - lonMin = routines.utils.round(lonMin, acc) - - if latMin == 60 then - latMin = 0 - latDeg = latDeg + 1 - end - - if lonMin == 60 then - lonMin = 0 - lonDeg = lonDeg + 1 - end - - local minFrmtStr -- create the formatting string for the minutes place - if acc <= 0 then -- no decimal place. - minFrmtStr = '%02d' - else - local width = 3 + acc -- 01.310 - that's a width of 6, for example. - minFrmtStr = '%0' .. width .. '.' .. acc .. 'f' - end - - return string.format('%02d', latDeg) .. ' ' .. string.format(minFrmtStr, latMin) .. '\'' .. latHemi .. ' ' - .. string.format('%02d', lonDeg) .. ' ' .. string.format(minFrmtStr, lonMin) .. '\'' .. lonHemi - - end -end - ---[[ required: az - radian - required: dist - meters - optional: alt - meters (set to false or nil if you don't want to use it). - optional: metric - set true to get dist and alt in km and m. - precision will always be nearest degree and NM or km.]] -routines.tostringBR = function(az, dist, alt, metric) - az = routines.utils.round(routines.utils.toDegree(az), 0) - - if metric then - dist = routines.utils.round(dist/1000, 2) - else - dist = routines.utils.round(routines.utils.metersToNM(dist), 2) - end - - local s = string.format('%03d', az) .. ' for ' .. dist - - if alt then - if metric then - s = s .. ' at ' .. routines.utils.round(alt, 0) - else - s = s .. ' at ' .. routines.utils.round(routines.utils.metersToFeet(alt), 0) - end - end - return s -end - -routines.getNorthCorrection = function(point) --gets the correction needed for true north - if not point.z then --Vec2; convert to Vec3 - point.z = point.y - point.y = 0 - end - local lat, lon = coord.LOtoLL(point) - local north_posit = coord.LLtoLO(lat + 1, lon) - return math.atan2(north_posit.z - point.z, north_posit.x - point.x) -end - - --- the main area -do - -- THE MAIN FUNCTION -- Accessed 100 times/sec. - routines.main = function() - timer.scheduleFunction(routines.main, {}, timer.getTime() + 2) --reschedule first in case of Lua error - ---------------------------------------------------------------------------------------------------------- - --area to add new stuff in - - routines.do_scheduled_functions() - end -- end of routines.main - - timer.scheduleFunction(routines.main, {}, timer.getTime() + 2) - -end - - -do - local idNum = 0 - - --Simplified event handler - routines.addEventHandler = function(f) --id is optional! - local handler = {} - idNum = idNum + 1 - handler.id = idNum - handler.f = f - handler.onEvent = function(self, event) - self.f(event) - end - world.addEventHandler(handler) - end - - routines.removeEventHandler = function(id) - for key, handler in pairs(world.eventHandlers) do - if handler.id and handler.id == id then - world.eventHandlers[key] = nil - return true - end - end - return false - end -end - --- need to return a Vec3 or Vec2? -function routines.getRandPointInCircle(point, radius, innerRadius) - local theta = 2*math.pi*math.random() - local rad = math.random() + math.random() - if rad > 1 then - rad = 2 - rad - end - - local radMult - if innerRadius and innerRadius <= radius then - radMult = (radius - innerRadius)*rad + innerRadius - else - radMult = radius*rad - end - - if not point.z then --might as well work with vec2/3 - point.z = point.y - end - - local rndCoord - if radius > 0 then - rndCoord = {x = math.cos(theta)*radMult + point.x, y = math.sin(theta)*radMult + point.z} - else - rndCoord = {x = point.x, y = point.z} - end - return rndCoord -end - -routines.goRoute = function(group, path) - local misTask = { - id = 'Mission', - params = { - route = { - points = routines.utils.deepCopy(path), - }, - }, - } - if type(group) == 'string' then - group = Group.getByName(group) - end - local groupCon = group:getController() - if groupCon then - groupCon:setTask(misTask) - return true - end - - Controller.setTask(groupCon, misTask) - return false -end - - --- Useful atomic functions from mist, ported. - -routines.ground = {} -routines.fixedWing = {} -routines.heli = {} - -routines.ground.buildWP = function(point, overRideForm, overRideSpeed) - - local wp = {} - wp.x = point.x - - if point.z then - wp.y = point.z - else - wp.y = point.y - end - local form, speed - - if point.speed and not overRideSpeed then - wp.speed = point.speed - elseif type(overRideSpeed) == 'number' then - wp.speed = overRideSpeed - else - wp.speed = routines.utils.kmphToMps(20) - end - - if point.form and not overRideForm then - form = point.form - else - form = overRideForm - end - - if not form then - wp.action = 'Cone' - else - form = string.lower(form) - if form == 'off_road' or form == 'off road' then - wp.action = 'Off Road' - elseif form == 'on_road' or form == 'on road' then - wp.action = 'On Road' - elseif form == 'rank' or form == 'line_abrest' or form == 'line abrest' or form == 'lineabrest'then - wp.action = 'Rank' - elseif form == 'cone' then - wp.action = 'Cone' - elseif form == 'diamond' then - wp.action = 'Diamond' - elseif form == 'vee' then - wp.action = 'Vee' - elseif form == 'echelon_left' or form == 'echelon left' or form == 'echelonl' then - wp.action = 'EchelonL' - elseif form == 'echelon_right' or form == 'echelon right' or form == 'echelonr' then - wp.action = 'EchelonR' - else - wp.action = 'Cone' -- if nothing matched - end - end - - wp.type = 'Turning Point' - - return wp - -end - -routines.fixedWing.buildWP = function(point, WPtype, speed, alt, altType) - - local wp = {} - wp.x = point.x - - if point.z then - wp.y = point.z - else - wp.y = point.y - end - - if alt and type(alt) == 'number' then - wp.alt = alt - else - wp.alt = 2000 - end - - if altType then - altType = string.lower(altType) - if altType == 'radio' or 'agl' then - wp.alt_type = 'RADIO' - elseif altType == 'baro' or 'asl' then - wp.alt_type = 'BARO' - end - else - wp.alt_type = 'RADIO' - end - - if point.speed then - speed = point.speed - end - - if point.type then - WPtype = point.type - end - - if not speed then - wp.speed = routines.utils.kmphToMps(500) - else - wp.speed = speed - end - - if not WPtype then - wp.action = 'Turning Point' - else - WPtype = string.lower(WPtype) - if WPtype == 'flyover' or WPtype == 'fly over' or WPtype == 'fly_over' then - wp.action = 'Fly Over Point' - elseif WPtype == 'turningpoint' or WPtype == 'turning point' or WPtype == 'turning_point' then - wp.action = 'Turning Point' - else - wp.action = 'Turning Point' - end - end - - wp.type = 'Turning Point' - return wp -end - -routines.heli.buildWP = function(point, WPtype, speed, alt, altType) - - local wp = {} - wp.x = point.x - - if point.z then - wp.y = point.z - else - wp.y = point.y - end - - if alt and type(alt) == 'number' then - wp.alt = alt - else - wp.alt = 500 - end - - if altType then - altType = string.lower(altType) - if altType == 'radio' or 'agl' then - wp.alt_type = 'RADIO' - elseif altType == 'baro' or 'asl' then - wp.alt_type = 'BARO' - end - else - wp.alt_type = 'RADIO' - end - - if point.speed then - speed = point.speed - end - - if point.type then - WPtype = point.type - end - - if not speed then - wp.speed = routines.utils.kmphToMps(200) - else - wp.speed = speed - end - - if not WPtype then - wp.action = 'Turning Point' - else - WPtype = string.lower(WPtype) - if WPtype == 'flyover' or WPtype == 'fly over' or WPtype == 'fly_over' then - wp.action = 'Fly Over Point' - elseif WPtype == 'turningpoint' or WPtype == 'turning point' or WPtype == 'turning_point' then - wp.action = 'Turning Point' - else - wp.action = 'Turning Point' - end - end - - wp.type = 'Turning Point' - return wp -end - -routines.groupToRandomPoint = function(vars) - local group = vars.group --Required - local point = vars.point --required - local radius = vars.radius or 0 - local innerRadius = vars.innerRadius - local form = vars.form or 'Cone' - local heading = vars.heading or math.random()*2*math.pi - local headingDegrees = vars.headingDegrees - local speed = vars.speed or routines.utils.kmphToMps(20) - - - local useRoads - if not vars.disableRoads then - useRoads = true - else - useRoads = false - end - - local path = {} - - if headingDegrees then - heading = headingDegrees*math.pi/180 - end - - if heading >= 2*math.pi then - heading = heading - 2*math.pi - end - - local rndCoord = routines.getRandPointInCircle(point, radius, innerRadius) - - local offset = {} - local posStart = routines.getLeadPos(group) - - offset.x = routines.utils.round(math.sin(heading - (math.pi/2)) * 50 + rndCoord.x, 3) - offset.z = routines.utils.round(math.cos(heading + (math.pi/2)) * 50 + rndCoord.y, 3) - path[#path + 1] = routines.ground.buildWP(posStart, form, speed) - - - if useRoads == true and ((point.x - posStart.x)^2 + (point.z - posStart.z)^2)^0.5 > radius * 1.3 then - path[#path + 1] = routines.ground.buildWP({['x'] = posStart.x + 11, ['z'] = posStart.z + 11}, 'off_road', speed) - path[#path + 1] = routines.ground.buildWP(posStart, 'on_road', speed) - path[#path + 1] = routines.ground.buildWP(offset, 'on_road', speed) - else - path[#path + 1] = routines.ground.buildWP({['x'] = posStart.x + 25, ['z'] = posStart.z + 25}, form, speed) - end - - path[#path + 1] = routines.ground.buildWP(offset, form, speed) - path[#path + 1] = routines.ground.buildWP(rndCoord, form, speed) - - routines.goRoute(group, path) - - return -end - -routines.groupRandomDistSelf = function(gpData, dist, form, heading, speed) - local pos = routines.getLeadPos(gpData) - local fakeZone = {} - fakeZone.radius = dist or math.random(300, 1000) - fakeZone.point = {x = pos.x, y, pos.y, z = pos.z} - routines.groupToRandomZone(gpData, fakeZone, form, heading, speed) - - return -end - -routines.groupToRandomZone = function(gpData, zone, form, heading, speed) - if type(gpData) == 'string' then - gpData = Group.getByName(gpData) - end - - if type(zone) == 'string' then - zone = trigger.misc.getZone(zone) - elseif type(zone) == 'table' and not zone.radius then - zone = trigger.misc.getZone(zone[math.random(1, #zone)]) - end - - if speed then - speed = routines.utils.kmphToMps(speed) - end - - local vars = {} - vars.group = gpData - vars.radius = zone.radius - vars.form = form - vars.headingDegrees = heading - vars.speed = speed - vars.point = routines.utils.zoneToVec3(zone) - - routines.groupToRandomPoint(vars) - - return -end - -routines.isTerrainValid = function(coord, terrainTypes) -- vec2/3 and enum or table of acceptable terrain types - if coord.z then - coord.y = coord.z - end - local typeConverted = {} - - if type(terrainTypes) == 'string' then -- if its a string it does this check - for constId, constData in pairs(land.SurfaceType) do - if string.lower(constId) == string.lower(terrainTypes) or string.lower(constData) == string.lower(terrainTypes) then - table.insert(typeConverted, constId) - end - end - elseif type(terrainTypes) == 'table' then -- if its a table it does this check - for typeId, typeData in pairs(terrainTypes) do - for constId, constData in pairs(land.SurfaceType) do - if string.lower(constId) == string.lower(typeData) or string.lower(constData) == string.lower(typeId) then - table.insert(typeConverted, constId) - end - end - end - end - for validIndex, validData in pairs(typeConverted) do - if land.getSurfaceType(coord) == land.SurfaceType[validData] then - return true - end - end - return false -end - -routines.groupToPoint = function(gpData, point, form, heading, speed, useRoads) - if type(point) == 'string' then - point = trigger.misc.getZone(point) - end - if speed then - speed = routines.utils.kmphToMps(speed) - end - - local vars = {} - vars.group = gpData - vars.form = form - vars.headingDegrees = heading - vars.speed = speed - vars.disableRoads = useRoads - vars.point = routines.utils.zoneToVec3(point) - routines.groupToRandomPoint(vars) - - return -end - - -routines.getLeadPos = function(group) - if type(group) == 'string' then -- group name - group = Group.getByName(group) - end - - local units = group:getUnits() - - local leader = units[1] - if not leader then -- SHOULD be good, but if there is a bug, this code future-proofs it then. - local lowestInd = math.huge - for ind, unit in pairs(units) do - if ind < lowestInd then - lowestInd = ind - leader = unit - end - end - end - if leader and Unit.isExist(leader) then -- maybe a little too paranoid now... - return leader:getPosition().p - end -end - ---[[ vars for routines.getMGRSString: -vars.units - table of unit names (NOT unitNameTable- maybe this should change). -vars.acc - integer between 0 and 5, inclusive -]] -routines.getMGRSString = function(vars) - local units = vars.units - local acc = vars.acc or 5 - local avgPos = routines.getAvgPos(units) - if avgPos then - return routines.tostringMGRS(coord.LLtoMGRS(coord.LOtoLL(avgPos)), acc) - end -end - ---[[ vars for routines.getLLString -vars.units - table of unit names (NOT unitNameTable- maybe this should change). -vars.acc - integer, number of numbers after decimal place -vars.DMS - if true, output in degrees, minutes, seconds. Otherwise, output in degrees, minutes. - - -]] -routines.getLLString = function(vars) - local units = vars.units - local acc = vars.acc or 3 - local DMS = vars.DMS - local avgPos = routines.getAvgPos(units) - if avgPos then - local lat, lon = coord.LOtoLL(avgPos) - return routines.tostringLL(lat, lon, acc, DMS) - end -end - ---[[ -vars.zone - table of a zone name. -vars.ref - vec3 ref point, maybe overload for vec2 as well? -vars.alt - boolean, if used, includes altitude in string -vars.metric - boolean, gives distance in km instead of NM. -]] -routines.getBRStringZone = function(vars) - local zone = trigger.misc.getZone( vars.zone ) - local ref = routines.utils.makeVec3(vars.ref, 0) -- turn it into Vec3 if it is not already. - local alt = vars.alt - local metric = vars.metric - if zone then - local vec = {x = zone.point.x - ref.x, y = zone.point.y - ref.y, z = zone.point.z - ref.z} - local dir = routines.utils.getDir(vec, ref) - local dist = routines.utils.get2DDist(zone.point, ref) - if alt then - alt = zone.y - end - return routines.tostringBR(dir, dist, alt, metric) - else - env.info( 'routines.getBRStringZone: error: zone is nil' ) - end -end - ---[[ -vars.units- table of unit names (NOT unitNameTable- maybe this should change). -vars.ref - vec3 ref point, maybe overload for vec2 as well? -vars.alt - boolean, if used, includes altitude in string -vars.metric - boolean, gives distance in km instead of NM. -]] -routines.getBRString = function(vars) - local units = vars.units - local ref = routines.utils.makeVec3(vars.ref, 0) -- turn it into Vec3 if it is not already. - local alt = vars.alt - local metric = vars.metric - local avgPos = routines.getAvgPos(units) - if avgPos then - local vec = {x = avgPos.x - ref.x, y = avgPos.y - ref.y, z = avgPos.z - ref.z} - local dir = routines.utils.getDir(vec, ref) - local dist = routines.utils.get2DDist(avgPos, ref) - if alt then - alt = avgPos.y - end - return routines.tostringBR(dir, dist, alt, metric) - end -end - - --- Returns the Vec3 coordinates of the average position of the concentration of units most in the heading direction. ---[[ vars for routines.getLeadingPos: -vars.units - table of unit names -vars.heading - direction -vars.radius - number -vars.headingDegrees - boolean, switches heading to degrees -]] -routines.getLeadingPos = function(vars) - local units = vars.units - local heading = vars.heading - local radius = vars.radius - if vars.headingDegrees then - heading = routines.utils.toRadian(vars.headingDegrees) - end - - local unitPosTbl = {} - for i = 1, #units do - local unit = Unit.getByName(units[i]) - if unit and unit:isExist() then - unitPosTbl[#unitPosTbl + 1] = unit:getPosition().p - end - end - if #unitPosTbl > 0 then -- one more more units found. - -- first, find the unit most in the heading direction - local maxPos = -math.huge - - local maxPosInd -- maxPos - the furthest in direction defined by heading; maxPosInd = - for i = 1, #unitPosTbl do - local rotatedVec2 = routines.vec.rotateVec2(routines.utils.makeVec2(unitPosTbl[i]), heading) - if (not maxPos) or maxPos < rotatedVec2.x then - maxPos = rotatedVec2.x - maxPosInd = i - end - end - - --now, get all the units around this unit... - local avgPos - if radius then - local maxUnitPos = unitPosTbl[maxPosInd] - local avgx, avgy, avgz, totNum = 0, 0, 0, 0 - for i = 1, #unitPosTbl do - if routines.utils.get2DDist(maxUnitPos, unitPosTbl[i]) <= radius then - avgx = avgx + unitPosTbl[i].x - avgy = avgy + unitPosTbl[i].y - avgz = avgz + unitPosTbl[i].z - totNum = totNum + 1 - end - end - avgPos = { x = avgx/totNum, y = avgy/totNum, z = avgz/totNum} - else - avgPos = unitPosTbl[maxPosInd] - end - - return avgPos - end -end - - ---[[ vars for routines.getLeadingMGRSString: -vars.units - table of unit names -vars.heading - direction -vars.radius - number -vars.headingDegrees - boolean, switches heading to degrees -vars.acc - number, 0 to 5. -]] -routines.getLeadingMGRSString = function(vars) - local pos = routines.getLeadingPos(vars) - if pos then - local acc = vars.acc or 5 - return routines.tostringMGRS(coord.LLtoMGRS(coord.LOtoLL(pos)), acc) - end -end - ---[[ vars for routines.getLeadingLLString: -vars.units - table of unit names -vars.heading - direction, number -vars.radius - number -vars.headingDegrees - boolean, switches heading to degrees -vars.acc - number of digits after decimal point (can be negative) -vars.DMS - boolean, true if you want DMS. -]] -routines.getLeadingLLString = function(vars) - local pos = routines.getLeadingPos(vars) - if pos then - local acc = vars.acc or 3 - local DMS = vars.DMS - local lat, lon = coord.LOtoLL(pos) - return routines.tostringLL(lat, lon, acc, DMS) - end -end - - - ---[[ vars for routines.getLeadingBRString: -vars.units - table of unit names -vars.heading - direction, number -vars.radius - number -vars.headingDegrees - boolean, switches heading to degrees -vars.metric - boolean, if true, use km instead of NM. -vars.alt - boolean, if true, include altitude. -vars.ref - vec3/vec2 reference point. -]] -routines.getLeadingBRString = function(vars) - local pos = routines.getLeadingPos(vars) - if pos then - local ref = vars.ref - local alt = vars.alt - local metric = vars.metric - - local vec = {x = pos.x - ref.x, y = pos.y - ref.y, z = pos.z - ref.z} - local dir = routines.utils.getDir(vec, ref) - local dist = routines.utils.get2DDist(pos, ref) - if alt then - alt = pos.y - end - return routines.tostringBR(dir, dist, alt, metric) - end -end - ---[[ vars for routines.message.add - vars.text = 'Hello World' - vars.displayTime = 20 - vars.msgFor = {coa = {'red'}, countries = {'Ukraine', 'Georgia'}, unitTypes = {'A-10C'}} - -]] - ---[[ vars for routines.msgMGRS -vars.units - table of unit names (NOT unitNameTable- maybe this should change). -vars.acc - integer between 0 and 5, inclusive -vars.text - text in the message -vars.displayTime - self explanatory -vars.msgFor - scope -]] -routines.msgMGRS = function(vars) - local units = vars.units - local acc = vars.acc - local text = vars.text - local displayTime = vars.displayTime - local msgFor = vars.msgFor - - local s = routines.getMGRSString{units = units, acc = acc} - local newText - if string.find(text, '%%s') then -- look for %s - newText = string.format(text, s) -- insert the coordinates into the message - else -- else, just append to the end. - newText = text .. s - end - - routines.message.add{ - text = newText, - displayTime = displayTime, - msgFor = msgFor - } -end - ---[[ vars for routines.msgLL -vars.units - table of unit names (NOT unitNameTable- maybe this should change) (Yes). -vars.acc - integer, number of numbers after decimal place -vars.DMS - if true, output in degrees, minutes, seconds. Otherwise, output in degrees, minutes. -vars.text - text in the message -vars.displayTime - self explanatory -vars.msgFor - scope -]] -routines.msgLL = function(vars) - local units = vars.units -- technically, I don't really need to do this, but it helps readability. - local acc = vars.acc - local DMS = vars.DMS - local text = vars.text - local displayTime = vars.displayTime - local msgFor = vars.msgFor - - local s = routines.getLLString{units = units, acc = acc, DMS = DMS} - local newText - if string.find(text, '%%s') then -- look for %s - newText = string.format(text, s) -- insert the coordinates into the message - else -- else, just append to the end. - newText = text .. s - end - - routines.message.add{ - text = newText, - displayTime = displayTime, - msgFor = msgFor - } - -end - - ---[[ -vars.units- table of unit names (NOT unitNameTable- maybe this should change). -vars.ref - vec3 ref point, maybe overload for vec2 as well? -vars.alt - boolean, if used, includes altitude in string -vars.metric - boolean, gives distance in km instead of NM. -vars.text - text of the message -vars.displayTime -vars.msgFor - scope -]] -routines.msgBR = function(vars) - local units = vars.units -- technically, I don't really need to do this, but it helps readability. - local ref = vars.ref -- vec2/vec3 will be handled in routines.getBRString - local alt = vars.alt - local metric = vars.metric - local text = vars.text - local displayTime = vars.displayTime - local msgFor = vars.msgFor - - local s = routines.getBRString{units = units, ref = ref, alt = alt, metric = metric} - local newText - if string.find(text, '%%s') then -- look for %s - newText = string.format(text, s) -- insert the coordinates into the message - else -- else, just append to the end. - newText = text .. s - end - - routines.message.add{ - text = newText, - displayTime = displayTime, - msgFor = msgFor - } - -end - - --------------------------------------------------------------------------------------------- --- basically, just sub-types of routines.msgBR... saves folks the work of getting the ref point. ---[[ -vars.units- table of unit names (NOT unitNameTable- maybe this should change). -vars.ref - string red, blue -vars.alt - boolean, if used, includes altitude in string -vars.metric - boolean, gives distance in km instead of NM. -vars.text - text of the message -vars.displayTime -vars.msgFor - scope -]] -routines.msgBullseye = function(vars) - if string.lower(vars.ref) == 'red' then - vars.ref = routines.DBs.missionData.bullseye.red - routines.msgBR(vars) - elseif string.lower(vars.ref) == 'blue' then - vars.ref = routines.DBs.missionData.bullseye.blue - routines.msgBR(vars) - end -end - ---[[ -vars.units- table of unit names (NOT unitNameTable- maybe this should change). -vars.ref - unit name of reference point -vars.alt - boolean, if used, includes altitude in string -vars.metric - boolean, gives distance in km instead of NM. -vars.text - text of the message -vars.displayTime -vars.msgFor - scope -]] - -routines.msgBRA = function(vars) - if Unit.getByName(vars.ref) then - vars.ref = Unit.getByName(vars.ref):getPosition().p - if not vars.alt then - vars.alt = true - end - routines.msgBR(vars) - end -end --------------------------------------------------------------------------------------------- - ---[[ vars for routines.msgLeadingMGRS: -vars.units - table of unit names -vars.heading - direction -vars.radius - number -vars.headingDegrees - boolean, switches heading to degrees (optional) -vars.acc - number, 0 to 5. -vars.text - text of the message -vars.displayTime -vars.msgFor - scope -]] -routines.msgLeadingMGRS = function(vars) - local units = vars.units -- technically, I don't really need to do this, but it helps readability. - local heading = vars.heading - local radius = vars.radius - local headingDegrees = vars.headingDegrees - local acc = vars.acc - local text = vars.text - local displayTime = vars.displayTime - local msgFor = vars.msgFor - - local s = routines.getLeadingMGRSString{units = units, heading = heading, radius = radius, headingDegrees = headingDegrees, acc = acc} - local newText - if string.find(text, '%%s') then -- look for %s - newText = string.format(text, s) -- insert the coordinates into the message - else -- else, just append to the end. - newText = text .. s - end - - routines.message.add{ - text = newText, - displayTime = displayTime, - msgFor = msgFor - } - - -end ---[[ vars for routines.msgLeadingLL: -vars.units - table of unit names -vars.heading - direction, number -vars.radius - number -vars.headingDegrees - boolean, switches heading to degrees (optional) -vars.acc - number of digits after decimal point (can be negative) -vars.DMS - boolean, true if you want DMS. (optional) -vars.text - text of the message -vars.displayTime -vars.msgFor - scope -]] -routines.msgLeadingLL = function(vars) - local units = vars.units -- technically, I don't really need to do this, but it helps readability. - local heading = vars.heading - local radius = vars.radius - local headingDegrees = vars.headingDegrees - local acc = vars.acc - local DMS = vars.DMS - local text = vars.text - local displayTime = vars.displayTime - local msgFor = vars.msgFor - - local s = routines.getLeadingLLString{units = units, heading = heading, radius = radius, headingDegrees = headingDegrees, acc = acc, DMS = DMS} - local newText - if string.find(text, '%%s') then -- look for %s - newText = string.format(text, s) -- insert the coordinates into the message - else -- else, just append to the end. - newText = text .. s - end - - routines.message.add{ - text = newText, - displayTime = displayTime, - msgFor = msgFor - } - -end - ---[[ -vars.units - table of unit names -vars.heading - direction, number -vars.radius - number -vars.headingDegrees - boolean, switches heading to degrees (optional) -vars.metric - boolean, if true, use km instead of NM. (optional) -vars.alt - boolean, if true, include altitude. (optional) -vars.ref - vec3/vec2 reference point. -vars.text - text of the message -vars.displayTime -vars.msgFor - scope -]] -routines.msgLeadingBR = function(vars) - local units = vars.units -- technically, I don't really need to do this, but it helps readability. - local heading = vars.heading - local radius = vars.radius - local headingDegrees = vars.headingDegrees - local metric = vars.metric - local alt = vars.alt - local ref = vars.ref -- vec2/vec3 will be handled in routines.getBRString - local text = vars.text - local displayTime = vars.displayTime - local msgFor = vars.msgFor - - local s = routines.getLeadingBRString{units = units, heading = heading, radius = radius, headingDegrees = headingDegrees, metric = metric, alt = alt, ref = ref} - local newText - if string.find(text, '%%s') then -- look for %s - newText = string.format(text, s) -- insert the coordinates into the message - else -- else, just append to the end. - newText = text .. s - end - - routines.message.add{ - text = newText, - displayTime = displayTime, - msgFor = msgFor - } -end - - -function spairs(t, order) - -- collect the keys - local keys = {} - for k in pairs(t) do keys[#keys+1] = k end - - -- if order function given, sort by it by passing the table and keys a, b, - -- otherwise just sort the keys - if order then - table.sort(keys, function(a,b) return order(t, a, b) end) - else - table.sort(keys) - end - - -- return the iterator function - local i = 0 - return function() - i = i + 1 - if keys[i] then - return keys[i], t[keys[i]] - end - end -end - - -function routines.IsPartOfGroupInZones( CargoGroup, LandingZones ) ---trace.f() - - local CurrentZoneID = nil - - if CargoGroup then - local CargoUnits = CargoGroup:getUnits() - for CargoUnitID, CargoUnit in pairs( CargoUnits ) do - if CargoUnit and CargoUnit:getLife() >= 1.0 then - CurrentZoneID = routines.IsUnitInZones( CargoUnit, LandingZones ) - if CurrentZoneID then - break - end - end - end - end - ---trace.r( "", "", { CurrentZoneID } ) - return CurrentZoneID -end - - - -function routines.IsUnitInZones( TransportUnit, LandingZones ) ---trace.f("", "routines.IsUnitInZones" ) - - local TransportZoneResult = nil - local TransportZonePos = nil - local TransportZone = nil - - -- fill-up some local variables to support further calculations to determine location of units within the zone. - if TransportUnit then - local TransportUnitPos = TransportUnit:getPosition().p - if type( LandingZones ) == "table" then - for LandingZoneID, LandingZoneName in pairs( LandingZones ) do - TransportZone = trigger.misc.getZone( LandingZoneName ) - if TransportZone then - TransportZonePos = {radius = TransportZone.radius, x = TransportZone.point.x, y = TransportZone.point.y, z = TransportZone.point.z} - if ((( TransportUnitPos.x - TransportZonePos.x)^2 + (TransportUnitPos.z - TransportZonePos.z)^2)^0.5 <= TransportZonePos.radius) then - TransportZoneResult = LandingZoneID - break - end - end - end - else - TransportZone = trigger.misc.getZone( LandingZones ) - TransportZonePos = {radius = TransportZone.radius, x = TransportZone.point.x, y = TransportZone.point.y, z = TransportZone.point.z} - if ((( TransportUnitPos.x - TransportZonePos.x)^2 + (TransportUnitPos.z - TransportZonePos.z)^2)^0.5 <= TransportZonePos.radius) then - TransportZoneResult = 1 - end - end - if TransportZoneResult then - --trace.i( "routines", "TransportZone:" .. TransportZoneResult ) - else - --trace.i( "routines", "TransportZone:nil logic" ) - end - return TransportZoneResult - else - --trace.i( "routines", "TransportZone:nil hard" ) - return nil - end -end - -function routines.IsUnitNearZonesRadius( TransportUnit, LandingZones, ZoneRadius ) ---trace.f("", "routines.IsUnitInZones" ) - - local TransportZoneResult = nil - local TransportZonePos = nil - local TransportZone = nil - - -- fill-up some local variables to support further calculations to determine location of units within the zone. - if TransportUnit then - local TransportUnitPos = TransportUnit:getPosition().p - if type( LandingZones ) == "table" then - for LandingZoneID, LandingZoneName in pairs( LandingZones ) do - TransportZone = trigger.misc.getZone( LandingZoneName ) - if TransportZone then - TransportZonePos = {radius = TransportZone.radius, x = TransportZone.point.x, y = TransportZone.point.y, z = TransportZone.point.z} - if ((( TransportUnitPos.x - TransportZonePos.x)^2 + (TransportUnitPos.z - TransportZonePos.z)^2)^0.5 <= ZoneRadius ) then - TransportZoneResult = LandingZoneID - break - end - end - end - else - TransportZone = trigger.misc.getZone( LandingZones ) - TransportZonePos = {radius = TransportZone.radius, x = TransportZone.point.x, y = TransportZone.point.y, z = TransportZone.point.z} - if ((( TransportUnitPos.x - TransportZonePos.x)^2 + (TransportUnitPos.z - TransportZonePos.z)^2)^0.5 <= ZoneRadius ) then - TransportZoneResult = 1 - end - end - if TransportZoneResult then - --trace.i( "routines", "TransportZone:" .. TransportZoneResult ) - else - --trace.i( "routines", "TransportZone:nil logic" ) - end - return TransportZoneResult - else - --trace.i( "routines", "TransportZone:nil hard" ) - return nil - end -end - - -function routines.IsStaticInZones( TransportStatic, LandingZones ) ---trace.f() - - local TransportZoneResult = nil - local TransportZonePos = nil - local TransportZone = nil - - -- fill-up some local variables to support further calculations to determine location of units within the zone. - local TransportStaticPos = TransportStatic:getPosition().p - if type( LandingZones ) == "table" then - for LandingZoneID, LandingZoneName in pairs( LandingZones ) do - TransportZone = trigger.misc.getZone( LandingZoneName ) - if TransportZone then - TransportZonePos = {radius = TransportZone.radius, x = TransportZone.point.x, y = TransportZone.point.y, z = TransportZone.point.z} - if ((( TransportStaticPos.x - TransportZonePos.x)^2 + (TransportStaticPos.z - TransportZonePos.z)^2)^0.5 <= TransportZonePos.radius) then - TransportZoneResult = LandingZoneID - break - end - end - end - else - TransportZone = trigger.misc.getZone( LandingZones ) - TransportZonePos = {radius = TransportZone.radius, x = TransportZone.point.x, y = TransportZone.point.y, z = TransportZone.point.z} - if ((( TransportStaticPos.x - TransportZonePos.x)^2 + (TransportStaticPos.z - TransportZonePos.z)^2)^0.5 <= TransportZonePos.radius) then - TransportZoneResult = 1 - end - end - ---trace.r( "", "", { TransportZoneResult } ) - return TransportZoneResult -end - - -function routines.IsUnitInRadius( CargoUnit, ReferencePosition, Radius ) ---trace.f() - - local Valid = true - - -- fill-up some local variables to support further calculations to determine location of units within the zone. - local CargoPos = CargoUnit:getPosition().p - local ReferenceP = ReferencePosition.p - - if (((CargoPos.x - ReferenceP.x)^2 + (CargoPos.z - ReferenceP.z)^2)^0.5 <= Radius) then - else - Valid = false - end - - return Valid -end - -function routines.IsPartOfGroupInRadius( CargoGroup, ReferencePosition, Radius ) ---trace.f() - - local Valid = true - - Valid = routines.ValidateGroup( CargoGroup, "CargoGroup", Valid ) - - -- fill-up some local variables to support further calculations to determine location of units within the zone - local CargoUnits = CargoGroup:getUnits() - for CargoUnitId, CargoUnit in pairs( CargoUnits ) do - local CargoUnitPos = CargoUnit:getPosition().p --- env.info( 'routines.IsPartOfGroupInRadius: CargoUnitPos.x = ' .. CargoUnitPos.x .. ' CargoUnitPos.z = ' .. CargoUnitPos.z ) - local ReferenceP = ReferencePosition.p --- env.info( 'routines.IsPartOfGroupInRadius: ReferenceGroupPos.x = ' .. ReferenceGroupPos.x .. ' ReferenceGroupPos.z = ' .. ReferenceGroupPos.z ) - - if ((( CargoUnitPos.x - ReferenceP.x)^2 + (CargoUnitPos.z - ReferenceP.z)^2)^0.5 <= Radius) then - else - Valid = false - break - end - end - - return Valid -end - - -function routines.ValidateString( Variable, VariableName, Valid ) ---trace.f() - - if type( Variable ) == "string" then - if Variable == "" then - error( "routines.ValidateString: error: " .. VariableName .. " must be filled out!" ) - Valid = false - end - else - error( "routines.ValidateString: error: " .. VariableName .. " is not a string." ) - Valid = false - end - ---trace.r( "", "", { Valid } ) - return Valid -end - -function routines.ValidateNumber( Variable, VariableName, Valid ) ---trace.f() - - if type( Variable ) == "number" then - else - error( "routines.ValidateNumber: error: " .. VariableName .. " is not a number." ) - Valid = false - end - ---trace.r( "", "", { Valid } ) - return Valid - -end - -function routines.ValidateGroup( Variable, VariableName, Valid ) ---trace.f() - - if Variable == nil then - error( "routines.ValidateGroup: error: " .. VariableName .. " is a nil value!" ) - Valid = false - end - ---trace.r( "", "", { Valid } ) - return Valid -end - -function routines.ValidateZone( LandingZones, VariableName, Valid ) ---trace.f() - - if LandingZones == nil then - error( "routines.ValidateGroup: error: " .. VariableName .. " is a nil value!" ) - Valid = false - end - - if type( LandingZones ) == "table" then - for LandingZoneID, LandingZoneName in pairs( LandingZones ) do - if trigger.misc.getZone( LandingZoneName ) == nil then - error( "routines.ValidateGroup: error: Zone " .. LandingZoneName .. " does not exist!" ) - Valid = false - break - end - end - else - if trigger.misc.getZone( LandingZones ) == nil then - error( "routines.ValidateGroup: error: Zone " .. LandingZones .. " does not exist!" ) - Valid = false - end - end - ---trace.r( "", "", { Valid } ) - return Valid -end - -function routines.ValidateEnumeration( Variable, VariableName, Enum, Valid ) ---trace.f() - - local ValidVariable = false - - for EnumId, EnumData in pairs( Enum ) do - if Variable == EnumData then - ValidVariable = true - break - end - end - - if ValidVariable then - else - error( 'TransportValidateEnum: " .. VariableName .. " is not a valid type.' .. Variable ) - Valid = false - end - ---trace.r( "", "", { Valid } ) - return Valid -end - -function routines.getGroupRoute(groupIdent, task) -- same as getGroupPoints but returns speed and formation type along with vec2 of point} - -- refactor to search by groupId and allow groupId and groupName as inputs - local gpId = groupIdent - if type(groupIdent) == 'string' and not tonumber(groupIdent) then - gpId = _DATABASE.Templates.Groups[groupIdent].groupId - end - - for coa_name, coa_data in pairs(env.mission.coalition) do - if (coa_name == 'red' or coa_name == 'blue') and type(coa_data) == 'table' then - if coa_data.country then --there is a country table - for cntry_id, cntry_data in pairs(coa_data.country) do - for obj_type_name, obj_type_data in pairs(cntry_data) do - if obj_type_name == "helicopter" or obj_type_name == "ship" or obj_type_name == "plane" or obj_type_name == "vehicle" then -- only these types have points - if ((type(obj_type_data) == 'table') and obj_type_data.group and (type(obj_type_data.group) == 'table') and (#obj_type_data.group > 0)) then --there's a group! - for group_num, group_data in pairs(obj_type_data.group) do - if group_data and group_data.groupId == gpId then -- this is the group we are looking for - if group_data.route and group_data.route.points and #group_data.route.points > 0 then - local points = {} - - for point_num, point in pairs(group_data.route.points) do - local routeData = {} - if not point.point then - routeData.x = point.x - routeData.y = point.y - else - routeData.point = point.point --it's possible that the ME could move to the point = Vec2 notation. - end - routeData.form = point.action - routeData.speed = point.speed - routeData.alt = point.alt - routeData.alt_type = point.alt_type - routeData.airdromeId = point.airdromeId - routeData.helipadId = point.helipadId - routeData.type = point.type - routeData.action = point.action - if task then - routeData.task = point.task - end - points[point_num] = routeData - end - - return points - end - return - end --if group_data and group_data.name and group_data.name == 'groupname' - end --for group_num, group_data in pairs(obj_type_data.group) do - end --if ((type(obj_type_data) == 'table') and obj_type_data.group and (type(obj_type_data.group) == 'table') and (#obj_type_data.group > 0)) then - end --if obj_type_name == "helicopter" or obj_type_name == "ship" or obj_type_name == "plane" or obj_type_name == "vehicle" or obj_type_name == "static" then - end --for obj_type_name, obj_type_data in pairs(cntry_data) do - end --for cntry_id, cntry_data in pairs(coa_data.country) do - end --if coa_data.country then --there is a country table - end --if coa_name == 'red' or coa_name == 'blue' and type(coa_data) == 'table' then - end --for coa_name, coa_data in pairs(mission.coalition) do -end - -routines.ground.patrolRoute = function(vars) - - - local tempRoute = {} - local useRoute = {} - local gpData = vars.gpData - if type(gpData) == 'string' then - gpData = Group.getByName(gpData) - end - - local useGroupRoute - if not vars.useGroupRoute then - useGroupRoute = vars.gpData - else - useGroupRoute = vars.useGroupRoute - end - local routeProvided = false - if not vars.route then - if useGroupRoute then - tempRoute = routines.getGroupRoute(useGroupRoute) - end - else - useRoute = vars.route - local posStart = routines.getLeadPos(gpData) - useRoute[1] = routines.ground.buildWP(posStart, useRoute[1].action, useRoute[1].speed) - routeProvided = true - end - - - local overRideSpeed = vars.speed or 'default' - local pType = vars.pType - local offRoadForm = vars.offRoadForm or 'default' - local onRoadForm = vars.onRoadForm or 'default' - - if routeProvided == false and #tempRoute > 0 then - local posStart = routines.getLeadPos(gpData) - - - useRoute[#useRoute + 1] = routines.ground.buildWP(posStart, offRoadForm, overRideSpeed) - for i = 1, #tempRoute do - local tempForm = tempRoute[i].action - local tempSpeed = tempRoute[i].speed - - if offRoadForm == 'default' then - tempForm = tempRoute[i].action - end - if onRoadForm == 'default' then - onRoadForm = 'On Road' - end - if (string.lower(tempRoute[i].action) == 'on road' or string.lower(tempRoute[i].action) == 'onroad' or string.lower(tempRoute[i].action) == 'on_road') then - tempForm = onRoadForm - else - tempForm = offRoadForm - end - - if type(overRideSpeed) == 'number' then - tempSpeed = overRideSpeed - end - - - useRoute[#useRoute + 1] = routines.ground.buildWP(tempRoute[i], tempForm, tempSpeed) - end - - if pType and string.lower(pType) == 'doubleback' then - local curRoute = routines.utils.deepCopy(useRoute) - for i = #curRoute, 2, -1 do - useRoute[#useRoute + 1] = routines.ground.buildWP(curRoute[i], curRoute[i].action, curRoute[i].speed) - end - end - - useRoute[1].action = useRoute[#useRoute].action -- make it so the first WP matches the last WP - end - - local cTask3 = {} - local newPatrol = {} - newPatrol.route = useRoute - newPatrol.gpData = gpData:getName() - cTask3[#cTask3 + 1] = 'routines.ground.patrolRoute(' - cTask3[#cTask3 + 1] = routines.utils.oneLineSerialize(newPatrol) - cTask3[#cTask3 + 1] = ')' - cTask3 = table.concat(cTask3) - local tempTask = { - id = 'WrappedAction', - params = { - action = { - id = 'Script', - params = { - command = cTask3, - - }, - }, - }, - } - - - useRoute[#useRoute].task = tempTask - routines.goRoute(gpData, useRoute) - - return -end - -routines.ground.patrol = function(gpData, pType, form, speed) - local vars = {} - - if type(gpData) == 'table' and gpData:getName() then - gpData = gpData:getName() - end - - vars.useGroupRoute = gpData - vars.gpData = gpData - vars.pType = pType - vars.offRoadForm = form - vars.speed = speed - - routines.ground.patrolRoute(vars) - - return -end - -function routines.GetUnitHeight( CheckUnit ) ---trace.f( "routines" ) - - local UnitPoint = CheckUnit:getPoint() - local UnitPosition = { x = UnitPoint.x, y = UnitPoint.z } - local UnitHeight = UnitPoint.y - - local LandHeight = land.getHeight( UnitPosition ) - - --env.info(( 'CarrierHeight: LandHeight = ' .. LandHeight .. ' CarrierHeight = ' .. CarrierHeight )) - - --trace.f( "routines", "Unit Height = " .. UnitHeight - LandHeight ) - - return UnitHeight - LandHeight - -end - - - -Su34Status = { status = {} } -boardMsgRed = { statusMsg = "" } -boardMsgAll = { timeMsg = "" } -SpawnSettings = {} -Su34MenuPath = {} -Su34Menus = 0 - - -function Su34AttackCarlVinson(groupName) ---trace.menu("", "Su34AttackCarlVinson") - local groupSu34 = Group.getByName( groupName ) - local controllerSu34 = groupSu34.getController(groupSu34) - local groupCarlVinson = Group.getByName("US Carl Vinson #001") - controllerSu34.setOption( controllerSu34, AI.Option.Air.id.ROE, AI.Option.Air.val.ROE.OPEN_FIRE ) - controllerSu34.setOption( controllerSu34, AI.Option.Air.id.REACTION_ON_THREAT, AI.Option.Air.val.REACTION_ON_THREAT.EVADE_FIRE ) - if groupCarlVinson ~= nil then - controllerSu34.pushTask(controllerSu34,{id = 'AttackGroup', params = { groupId = groupCarlVinson:getID(), expend = AI.Task.WeaponExpend.ALL, attackQtyLimit = true}}) - end - Su34Status.status[groupName] = 1 - MessageToRed( string.format('%s: ',groupName) .. 'Attacking carrier Carl Vinson. ', 10, 'RedStatus' .. groupName ) -end - -function Su34AttackWest(groupName) ---trace.f("","Su34AttackWest") - local groupSu34 = Group.getByName( groupName ) - local controllerSu34 = groupSu34.getController(groupSu34) - local groupShipWest1 = Group.getByName("US Ship West #001") - local groupShipWest2 = Group.getByName("US Ship West #002") - controllerSu34.setOption( controllerSu34, AI.Option.Air.id.ROE, AI.Option.Air.val.ROE.OPEN_FIRE ) - controllerSu34.setOption( controllerSu34, AI.Option.Air.id.REACTION_ON_THREAT, AI.Option.Air.val.REACTION_ON_THREAT.EVADE_FIRE ) - if groupShipWest1 ~= nil then - controllerSu34.pushTask(controllerSu34,{id = 'AttackGroup', params = { groupId = groupShipWest1:getID(), expend = AI.Task.WeaponExpend.ALL, attackQtyLimit = true}}) - end - if groupShipWest2 ~= nil then - controllerSu34.pushTask(controllerSu34,{id = 'AttackGroup', params = { groupId = groupShipWest2:getID(), expend = AI.Task.WeaponExpend.ALL, attackQtyLimit = true}}) - end - Su34Status.status[groupName] = 2 - MessageToRed( string.format('%s: ',groupName) .. 'Attacking invading ships in the west. ', 10, 'RedStatus' .. groupName ) -end - -function Su34AttackNorth(groupName) ---trace.menu("","Su34AttackNorth") - local groupSu34 = Group.getByName( groupName ) - local controllerSu34 = groupSu34.getController(groupSu34) - local groupShipNorth1 = Group.getByName("US Ship North #001") - local groupShipNorth2 = Group.getByName("US Ship North #002") - local groupShipNorth3 = Group.getByName("US Ship North #003") - controllerSu34.setOption( controllerSu34, AI.Option.Air.id.ROE, AI.Option.Air.val.ROE.OPEN_FIRE ) - controllerSu34.setOption( controllerSu34, AI.Option.Air.id.REACTION_ON_THREAT, AI.Option.Air.val.REACTION_ON_THREAT.EVADE_FIRE ) - if groupShipNorth1 ~= nil then - controllerSu34.pushTask(controllerSu34,{id = 'AttackGroup', params = { groupId = groupShipNorth1:getID(), expend = AI.Task.WeaponExpend.ALL, attackQtyLimit = false}}) - end - if groupShipNorth2 ~= nil then - controllerSu34.pushTask(controllerSu34,{id = 'AttackGroup', params = { groupId = groupShipNorth2:getID(), expend = AI.Task.WeaponExpend.ALL, attackQtyLimit = false}}) - end - if groupShipNorth3 ~= nil then - controllerSu34.pushTask(controllerSu34,{id = 'AttackGroup', params = { groupId = groupShipNorth3:getID(), expend = AI.Task.WeaponExpend.ALL, attackQtyLimit = false}}) - end - Su34Status.status[groupName] = 3 - MessageToRed( string.format('%s: ',groupName) .. 'Attacking invading ships in the north. ', 10, 'RedStatus' .. groupName ) -end - -function Su34Orbit(groupName) ---trace.menu("","Su34Orbit") - local groupSu34 = Group.getByName( groupName ) - local controllerSu34 = groupSu34:getController() - controllerSu34.setOption( controllerSu34, AI.Option.Air.id.ROE, AI.Option.Air.val.ROE.WEAPON_HOLD ) - controllerSu34.setOption( controllerSu34, AI.Option.Air.id.REACTION_ON_THREAT, AI.Option.Air.val.REACTION_ON_THREAT.EVADE_FIRE ) - controllerSu34:pushTask( {id = 'ControlledTask', params = { task = { id = 'Orbit', params = { pattern = AI.Task.OrbitPattern.RACE_TRACK } }, stopCondition = { duration = 600 } } } ) - Su34Status.status[groupName] = 4 - MessageToRed( string.format('%s: ',groupName) .. 'In orbit and awaiting further instructions. ', 10, 'RedStatus' .. groupName ) -end - -function Su34TakeOff(groupName) ---trace.menu("","Su34TakeOff") - local groupSu34 = Group.getByName( groupName ) - local controllerSu34 = groupSu34:getController() - controllerSu34.setOption( controllerSu34, AI.Option.Air.id.ROE, AI.Option.Air.val.ROE.WEAPON_HOLD ) - controllerSu34.setOption( controllerSu34, AI.Option.Air.id.REACTION_ON_THREAT, AI.Option.Air.val.REACTION_ON_THREAT.BYPASS_AND_ESCAPE ) - Su34Status.status[groupName] = 8 - MessageToRed( string.format('%s: ',groupName) .. 'Take-Off. ', 10, 'RedStatus' .. groupName ) -end - -function Su34Hold(groupName) ---trace.menu("","Su34Hold") - local groupSu34 = Group.getByName( groupName ) - local controllerSu34 = groupSu34:getController() - controllerSu34.setOption( controllerSu34, AI.Option.Air.id.ROE, AI.Option.Air.val.ROE.WEAPON_HOLD ) - controllerSu34.setOption( controllerSu34, AI.Option.Air.id.REACTION_ON_THREAT, AI.Option.Air.val.REACTION_ON_THREAT.BYPASS_AND_ESCAPE ) - Su34Status.status[groupName] = 5 - MessageToRed( string.format('%s: ',groupName) .. 'Holding Weapons. ', 10, 'RedStatus' .. groupName ) -end - -function Su34RTB(groupName) ---trace.menu("","Su34RTB") - Su34Status.status[groupName] = 6 - MessageToRed( string.format('%s: ',groupName) .. 'Return to Krasnodar. ', 10, 'RedStatus' .. groupName ) -end - -function Su34Destroyed(groupName) ---trace.menu("","Su34Destroyed") - Su34Status.status[groupName] = 7 - MessageToRed( string.format('%s: ',groupName) .. 'Destroyed. ', 30, 'RedStatus' .. groupName ) -end - -function GroupAlive( groupName ) ---trace.menu("","GroupAlive") - local groupTest = Group.getByName( groupName ) - - local groupExists = false - - if groupTest then - groupExists = groupTest:isExist() - end - - --trace.r( "", "", { groupExists } ) - return groupExists -end - -function Su34IsDead() ---trace.f() - -end - -function Su34OverviewStatus() ---trace.menu("","Su34OverviewStatus") - local msg = "" - local currentStatus = 0 - local Exists = false - - for groupName, currentStatus in pairs(Su34Status.status) do - - env.info(('Su34 Overview Status: GroupName = ' .. groupName )) - Alive = GroupAlive( groupName ) - - if Alive then - if currentStatus == 1 then - msg = msg .. string.format("%s: ",groupName) - msg = msg .. "Attacking carrier Carl Vinson. " - elseif currentStatus == 2 then - msg = msg .. string.format("%s: ",groupName) - msg = msg .. "Attacking supporting ships in the west. " - elseif currentStatus == 3 then - msg = msg .. string.format("%s: ",groupName) - msg = msg .. "Attacking invading ships in the north. " - elseif currentStatus == 4 then - msg = msg .. string.format("%s: ",groupName) - msg = msg .. "In orbit and awaiting further instructions. " - elseif currentStatus == 5 then - msg = msg .. string.format("%s: ",groupName) - msg = msg .. "Holding Weapons. " - elseif currentStatus == 6 then - msg = msg .. string.format("%s: ",groupName) - msg = msg .. "Return to Krasnodar. " - elseif currentStatus == 7 then - msg = msg .. string.format("%s: ",groupName) - msg = msg .. "Destroyed. " - elseif currentStatus == 8 then - msg = msg .. string.format("%s: ",groupName) - msg = msg .. "Take-Off. " - end - else - if currentStatus == 7 then - msg = msg .. string.format("%s: ",groupName) - msg = msg .. "Destroyed. " - else - Su34Destroyed(groupName) - end - end - end - - boardMsgRed.statusMsg = msg -end - - -function UpdateBoardMsg() ---trace.f() - Su34OverviewStatus() - MessageToRed( boardMsgRed.statusMsg, 15, 'RedStatus' ) -end - -function MusicReset( flg ) ---trace.f() - trigger.action.setUserFlag(95,flg) -end - -function PlaneActivate(groupNameFormat, flg) ---trace.f() - local groupName = groupNameFormat .. string.format("#%03d", trigger.misc.getUserFlag(flg)) - --trigger.action.outText(groupName,10) - trigger.action.activateGroup(Group.getByName(groupName)) -end - -function Su34Menu(groupName) ---trace.f() - - --env.info(( 'Su34Menu(' .. groupName .. ')' )) - local groupSu34 = Group.getByName( groupName ) - - if Su34Status.status[groupName] == 1 or - Su34Status.status[groupName] == 2 or - Su34Status.status[groupName] == 3 or - Su34Status.status[groupName] == 4 or - Su34Status.status[groupName] == 5 then - if Su34MenuPath[groupName] == nil then - if planeMenuPath == nil then - planeMenuPath = missionCommands.addSubMenuForCoalition( - coalition.side.RED, - "SU-34 anti-ship flights", - nil - ) - end - Su34MenuPath[groupName] = missionCommands.addSubMenuForCoalition( - coalition.side.RED, - "Flight " .. groupName, - planeMenuPath - ) - - missionCommands.addCommandForCoalition( - coalition.side.RED, - "Attack carrier Carl Vinson", - Su34MenuPath[groupName], - Su34AttackCarlVinson, - groupName - ) - - missionCommands.addCommandForCoalition( - coalition.side.RED, - "Attack ships in the west", - Su34MenuPath[groupName], - Su34AttackWest, - groupName - ) - - missionCommands.addCommandForCoalition( - coalition.side.RED, - "Attack ships in the north", - Su34MenuPath[groupName], - Su34AttackNorth, - groupName - ) - - missionCommands.addCommandForCoalition( - coalition.side.RED, - "Hold position and await instructions", - Su34MenuPath[groupName], - Su34Orbit, - groupName - ) - - missionCommands.addCommandForCoalition( - coalition.side.RED, - "Report status", - Su34MenuPath[groupName], - Su34OverviewStatus - ) - end - else - if Su34MenuPath[groupName] then - missionCommands.removeItemForCoalition(coalition.side.RED, Su34MenuPath[groupName]) - end - end -end - ---- Obsolete function, but kept to rework in framework. - -function ChooseInfantry ( TeleportPrefixTable, TeleportMax ) ---trace.f("Spawn") - --env.info(( 'ChooseInfantry: ' )) - - TeleportPrefixTableCount = #TeleportPrefixTable - TeleportPrefixTableIndex = math.random( 1, TeleportPrefixTableCount ) - - --env.info(( 'ChooseInfantry: TeleportPrefixTableIndex = ' .. TeleportPrefixTableIndex .. ' TeleportPrefixTableCount = ' .. TeleportPrefixTableCount .. ' TeleportMax = ' .. TeleportMax )) - - local TeleportFound = false - local TeleportLoop = true - local Index = TeleportPrefixTableIndex - local TeleportPrefix = '' - - while TeleportLoop do - TeleportPrefix = TeleportPrefixTable[Index] - if SpawnSettings[TeleportPrefix] then - if SpawnSettings[TeleportPrefix]['SpawnCount'] - 1 < TeleportMax then - SpawnSettings[TeleportPrefix]['SpawnCount'] = SpawnSettings[TeleportPrefix]['SpawnCount'] + 1 - TeleportFound = true - else - TeleportFound = false - end - else - SpawnSettings[TeleportPrefix] = {} - SpawnSettings[TeleportPrefix]['SpawnCount'] = 0 - TeleportFound = true - end - if TeleportFound then - TeleportLoop = false - else - if Index < TeleportPrefixTableCount then - Index = Index + 1 - else - TeleportLoop = false - end - end - --env.info(( 'ChooseInfantry: Loop 1 - TeleportPrefix = ' .. TeleportPrefix .. ' Index = ' .. Index )) - end - - if TeleportFound == false then - TeleportLoop = true - Index = 1 - while TeleportLoop do - TeleportPrefix = TeleportPrefixTable[Index] - if SpawnSettings[TeleportPrefix] then - if SpawnSettings[TeleportPrefix]['SpawnCount'] - 1 < TeleportMax then - SpawnSettings[TeleportPrefix]['SpawnCount'] = SpawnSettings[TeleportPrefix]['SpawnCount'] + 1 - TeleportFound = true - else - TeleportFound = false - end - else - SpawnSettings[TeleportPrefix] = {} - SpawnSettings[TeleportPrefix]['SpawnCount'] = 0 - TeleportFound = true - end - if TeleportFound then - TeleportLoop = false - else - if Index < TeleportPrefixTableIndex then - Index = Index + 1 - else - TeleportLoop = false - end - end - --env.info(( 'ChooseInfantry: Loop 2 - TeleportPrefix = ' .. TeleportPrefix .. ' Index = ' .. Index )) - end - end - - local TeleportGroupName = '' - if TeleportFound == true then - TeleportGroupName = TeleportPrefix .. string.format("#%03d", SpawnSettings[TeleportPrefix]['SpawnCount'] ) - else - TeleportGroupName = '' - end - - --env.info(('ChooseInfantry: TeleportGroupName = ' .. TeleportGroupName )) - --env.info(('ChooseInfantry: return')) - - return TeleportGroupName -end - -SpawnedInfantry = 0 - -function LandCarrier ( CarrierGroup, LandingZonePrefix ) ---trace.f() - --env.info(( 'LandCarrier: ' )) - --env.info(( 'LandCarrier: CarrierGroup = ' .. CarrierGroup:getName() )) - --env.info(( 'LandCarrier: LandingZone = ' .. LandingZonePrefix )) - - local controllerGroup = CarrierGroup:getController() - - local LandingZone = trigger.misc.getZone(LandingZonePrefix) - local LandingZonePos = {} - LandingZonePos.x = LandingZone.point.x + math.random(LandingZone.radius * -1, LandingZone.radius) - LandingZonePos.y = LandingZone.point.z + math.random(LandingZone.radius * -1, LandingZone.radius) - - controllerGroup:pushTask( { id = 'Land', params = { point = LandingZonePos, durationFlag = true, duration = 10 } } ) - - --env.info(( 'LandCarrier: end' )) -end - -EscortCount = 0 -function EscortCarrier ( CarrierGroup, EscortPrefix, EscortLastWayPoint, EscortEngagementDistanceMax, EscortTargetTypes ) ---trace.f() - --env.info(( 'EscortCarrier: ' )) - --env.info(( 'EscortCarrier: CarrierGroup = ' .. CarrierGroup:getName() )) - --env.info(( 'EscortCarrier: EscortPrefix = ' .. EscortPrefix )) - - local CarrierName = CarrierGroup:getName() - - local EscortMission = {} - local CarrierMission = {} - - local EscortMission = SpawnMissionGroup( EscortPrefix ) - local CarrierMission = SpawnMissionGroup( CarrierGroup:getName() ) - - if EscortMission ~= nil and CarrierMission ~= nil then - - EscortCount = EscortCount + 1 - EscortMissionName = string.format( EscortPrefix .. '#Escort %s', CarrierName ) - EscortMission.name = EscortMissionName - EscortMission.groupId = nil - EscortMission.lateActivation = false - EscortMission.taskSelected = false - - local EscortUnits = #EscortMission.units - for u = 1, EscortUnits do - EscortMission.units[u].name = string.format( EscortPrefix .. '#Escort %s %02d', CarrierName, u ) - EscortMission.units[u].unitId = nil - end - - - EscortMission.route.points[1].task = { id = "ComboTask", - params = - { - tasks = - { - [1] = - { - enabled = true, - auto = false, - id = "Escort", - number = 1, - params = - { - lastWptIndexFlagChangedManually = false, - groupId = CarrierGroup:getID(), - lastWptIndex = nil, - lastWptIndexFlag = false, - engagementDistMax = EscortEngagementDistanceMax, - targetTypes = EscortTargetTypes, - pos = - { - y = 20, - x = 20, - z = 0, - } -- end of ["pos"] - } -- end of ["params"] - } -- end of [1] - } -- end of ["tasks"] - } -- end of ["params"] - } -- end of ["task"] - - SpawnGroupAdd( EscortPrefix, EscortMission ) - - end -end - -function SendMessageToCarrier( CarrierGroup, CarrierMessage ) ---trace.f() - - if CarrierGroup ~= nil then - MessageToGroup( CarrierGroup, CarrierMessage, 30, 'Carrier/' .. CarrierGroup:getName() ) - end - -end - -function MessageToGroup( MsgGroup, MsgText, MsgTime, MsgName ) ---trace.f() - - if type(MsgGroup) == 'string' then - --env.info( 'MessageToGroup: Converted MsgGroup string "' .. MsgGroup .. '" into a Group structure.' ) - MsgGroup = Group.getByName( MsgGroup ) - end - - if MsgGroup ~= nil then - local MsgTable = {} - MsgTable.text = MsgText - MsgTable.displayTime = MsgTime - MsgTable.msgFor = { units = { MsgGroup:getUnits()[1]:getName() } } - MsgTable.name = MsgName - --routines.message.add( MsgTable ) - --env.info(('MessageToGroup: Message sent to ' .. MsgGroup:getUnits()[1]:getName() .. ' -> ' .. MsgText )) - end -end - -function MessageToUnit( UnitName, MsgText, MsgTime, MsgName ) ---trace.f() - - if UnitName ~= nil then - local MsgTable = {} - MsgTable.text = MsgText - MsgTable.displayTime = MsgTime - MsgTable.msgFor = { units = { UnitName } } - MsgTable.name = MsgName - --routines.message.add( MsgTable ) - end -end - -function MessageToAll( MsgText, MsgTime, MsgName ) ---trace.f() - - MESSAGE:New( MsgText, MsgTime, "Message" ):ToCoalition( coalition.side.RED ):ToCoalition( coalition.side.BLUE ) -end - -function MessageToRed( MsgText, MsgTime, MsgName ) ---trace.f() - - MESSAGE:New( MsgText, MsgTime, "To Red Coalition" ):ToCoalition( coalition.side.RED ) -end - -function MessageToBlue( MsgText, MsgTime, MsgName ) ---trace.f() - - MESSAGE:New( MsgText, MsgTime, "To Blue Coalition" ):ToCoalition( coalition.side.RED ) -end - -function getCarrierHeight( CarrierGroup ) ---trace.f() - - if CarrierGroup ~= nil then - if table.getn(CarrierGroup:getUnits()) == 1 then - local CarrierUnit = CarrierGroup:getUnits()[1] - local CurrentPoint = CarrierUnit:getPoint() - - local CurrentPosition = { x = CurrentPoint.x, y = CurrentPoint.z } - local CarrierHeight = CurrentPoint.y - - local LandHeight = land.getHeight( CurrentPosition ) - - --env.info(( 'CarrierHeight: LandHeight = ' .. LandHeight .. ' CarrierHeight = ' .. CarrierHeight )) - - return CarrierHeight - LandHeight - else - return 999999 - end - else - return 999999 - end - -end - -function GetUnitHeight( CheckUnit ) ---trace.f() - - local UnitPoint = CheckUnit:getPoint() - local UnitPosition = { x = CurrentPoint.x, y = CurrentPoint.z } - local UnitHeight = CurrentPoint.y - - local LandHeight = land.getHeight( CurrentPosition ) - - --env.info(( 'CarrierHeight: LandHeight = ' .. LandHeight .. ' CarrierHeight = ' .. CarrierHeight )) - - return UnitHeight - LandHeight - -end - - -_MusicTable = {} -_MusicTable.Files = {} -_MusicTable.Queue = {} -_MusicTable.FileCnt = 0 - - -function MusicRegister( SndRef, SndFile, SndTime ) ---trace.f() - - env.info(( 'MusicRegister: SndRef = ' .. SndRef )) - env.info(( 'MusicRegister: SndFile = ' .. SndFile )) - env.info(( 'MusicRegister: SndTime = ' .. SndTime )) - - - _MusicTable.FileCnt = _MusicTable.FileCnt + 1 - - _MusicTable.Files[_MusicTable.FileCnt] = {} - _MusicTable.Files[_MusicTable.FileCnt].Ref = SndRef - _MusicTable.Files[_MusicTable.FileCnt].File = SndFile - _MusicTable.Files[_MusicTable.FileCnt].Time = SndTime - - if not _MusicTable.Function then - _MusicTable.Function = routines.scheduleFunction( MusicScheduler, { }, timer.getTime() + 10, 10) - end - -end - -function MusicToPlayer( SndRef, PlayerName, SndContinue ) ---trace.f() - - --env.info(( 'MusicToPlayer: SndRef = ' .. SndRef )) - - local PlayerUnits = AlivePlayerUnits() - for PlayerUnitIdx, PlayerUnit in pairs(PlayerUnits) do - local PlayerUnitName = PlayerUnit:getPlayerName() - --env.info(( 'MusicToPlayer: PlayerUnitName = ' .. PlayerUnitName )) - if PlayerName == PlayerUnitName then - PlayerGroup = PlayerUnit:getGroup() - if PlayerGroup then - --env.info(( 'MusicToPlayer: PlayerGroup = ' .. PlayerGroup:getName() )) - MusicToGroup( SndRef, PlayerGroup, SndContinue ) - end - break - end - end - - --env.info(( 'MusicToPlayer: end' )) - -end - -function MusicToGroup( SndRef, SndGroup, SndContinue ) ---trace.f() - - --env.info(( 'MusicToGroup: SndRef = ' .. SndRef )) - - if SndGroup ~= nil then - if _MusicTable and _MusicTable.FileCnt > 0 then - if SndGroup:isExist() then - if MusicCanStart(SndGroup:getUnit(1):getPlayerName()) then - --env.info(( 'MusicToGroup: OK for Sound.' )) - local SndIdx = 0 - if SndRef == '' then - --env.info(( 'MusicToGroup: SndRef as empty. Queueing at random.' )) - SndIdx = math.random( 1, _MusicTable.FileCnt ) - else - for SndIdx = 1, _MusicTable.FileCnt do - if _MusicTable.Files[SndIdx].Ref == SndRef then - break - end - end - end - --env.info(( 'MusicToGroup: SndIdx = ' .. SndIdx )) - --env.info(( 'MusicToGroup: Queueing Music ' .. _MusicTable.Files[SndIdx].File .. ' for Group ' .. SndGroup:getID() )) - trigger.action.outSoundForGroup( SndGroup:getID(), _MusicTable.Files[SndIdx].File ) - MessageToGroup( SndGroup, 'Playing ' .. _MusicTable.Files[SndIdx].File, 15, 'Music-' .. SndGroup:getUnit(1):getPlayerName() ) - - local SndQueueRef = SndGroup:getUnit(1):getPlayerName() - if _MusicTable.Queue[SndQueueRef] == nil then - _MusicTable.Queue[SndQueueRef] = {} - end - _MusicTable.Queue[SndQueueRef].Start = timer.getTime() - _MusicTable.Queue[SndQueueRef].PlayerName = SndGroup:getUnit(1):getPlayerName() - _MusicTable.Queue[SndQueueRef].Group = SndGroup - _MusicTable.Queue[SndQueueRef].ID = SndGroup:getID() - _MusicTable.Queue[SndQueueRef].Ref = SndIdx - _MusicTable.Queue[SndQueueRef].Continue = SndContinue - _MusicTable.Queue[SndQueueRef].Type = Group - end - end - end - end -end - -function MusicCanStart(PlayerName) ---trace.f() - - --env.info(( 'MusicCanStart:' )) - - local MusicOut = false - - if _MusicTable['Queue'] ~= nil and _MusicTable.FileCnt > 0 then - --env.info(( 'MusicCanStart: PlayerName = ' .. PlayerName )) - local PlayerFound = false - local MusicStart = 0 - local MusicTime = 0 - for SndQueueIdx, SndQueue in pairs( _MusicTable.Queue ) do - if SndQueue.PlayerName == PlayerName then - PlayerFound = true - MusicStart = SndQueue.Start - MusicTime = _MusicTable.Files[SndQueue.Ref].Time - break - end - end - if PlayerFound then - --env.info(( 'MusicCanStart: MusicStart = ' .. MusicStart )) - --env.info(( 'MusicCanStart: MusicTime = ' .. MusicTime )) - --env.info(( 'MusicCanStart: timer.getTime() = ' .. timer.getTime() )) - - if MusicStart + MusicTime <= timer.getTime() then - MusicOut = true - end - else - MusicOut = true - end - end - - if MusicOut then - --env.info(( 'MusicCanStart: true' )) - else - --env.info(( 'MusicCanStart: false' )) - end - - return MusicOut -end - -function MusicScheduler() ---trace.scheduled("", "MusicScheduler") - - --env.info(( 'MusicScheduler:' )) - if _MusicTable['Queue'] ~= nil and _MusicTable.FileCnt > 0 then - --env.info(( 'MusicScheduler: Walking Sound Queue.')) - for SndQueueIdx, SndQueue in pairs( _MusicTable.Queue ) do - if SndQueue.Continue then - if MusicCanStart(SndQueue.PlayerName) then - --env.info(('MusicScheduler: MusicToGroup')) - MusicToPlayer( '', SndQueue.PlayerName, true ) - end - end - end - end - -end - - -env.info(( 'Init: Scripts Loaded v1.1' )) - ---- BASE classes. --- --- @{#BASE} class --- ============== --- The @{#BASE} class is the super class for most of the classes defined within MOOSE. --- --- It handles: --- --- * The construction and inheritance of child classes. --- * The tracing of objects during mission execution within the DCS.log file (under saved games folder). --- --- Note: Normally you would not use the BASE class unless you are extending the MOOSE framework with new classes. --- --- BASE Trace functionality --- ======================== --- The BASE class contains trace methods to trace progress within a mission execution of a certain object. --- Note that these trace methods are inherited by each MOOSE class interiting BASE. --- As such, each object created from derived class from BASE can use the tracing functions to trace its execution. --- --- Trace a function call --- --------------------- --- There are basically 3 types of tracing methods available within BASE: --- --- * @{#BASE.F}: Trace the beginning of a function and its given parameters. --- * @{#BASE.T}: Trace further logic within a function giving optional variables or parameters. --- * @{#BASE.E}: Trace an execption within a function giving optional variables or parameters. An exception will always be traced. --- --- Tracing levels --- -------------- --- There are 3 tracing levels within MOOSE. --- These tracing levels were defined to avoid bulks of tracing to be generated by lots of objects. --- --- As such, the F and T methods have additional variants to trace level 2 and 3 respectively: --- --- * @{#BASE.F2}: Trace the beginning of a function and its given parameters with tracing level 2. --- * @{#BASE.F3}: Trace the beginning of a function and its given parameters with tracing level 3. --- * @{#BASE.T2}: Trace further logic within a function giving optional variables or parameters with tracing level 2. --- * @{#BASE.T3}: Trace further logic within a function giving optional variables or parameters with tracing level 3. --- --- BASE Inheritance support --- ======================== --- The following methods are available to support inheritance: --- --- * @{#BASE.Inherit}: Inherits from a class. --- * @{#BASE.Inherited}: Returns the parent class from the class. --- --- Future --- ====== --- Further methods may be added to BASE whenever there is a need to make "overall" functions available within MOOSE. --- --- ==== --- --- @module Base --- @author FlightControl - - - -local _TraceOn = true -local _TraceLevel = 1 -local _TraceAll = false -local _TraceClass = {} -local _TraceClassMethod = {} - ---- The BASE Class --- @type BASE --- @field ClassName The name of the class. --- @field ClassID The ID number of the class. -BASE = { - ClassName = "BASE", - ClassID = 0, - Events = {}, - States = {} -} - ---- The Formation Class --- @type FORMATION --- @field Cone A cone formation. -FORMATION = { - Cone = "Cone" -} - - - ---- The base constructor. This is the top top class of all classed defined within the MOOSE. --- Any new class needs to be derived from this class for proper inheritance. --- @param #BASE self --- @return #BASE The new instance of the BASE class. --- @usage --- function TASK:New() --- --- local self = BASE:Inherit( self, BASE:New() ) --- --- -- assign Task default values during construction --- self.TaskBriefing = "Task: No Task." --- self.Time = timer.getTime() --- self.ExecuteStage = _TransportExecuteStage.NONE --- --- return self --- end --- @todo need to investigate if the deepCopy is really needed... Don't think so. -function BASE:New() - local Child = routines.utils.deepCopy( self ) - local Parent = {} - setmetatable( Child, Parent ) - Child.__index = Child - self.ClassID = self.ClassID + 1 - Child.ClassID = self.ClassID - --Child.AddEvent( Child, S_EVENT_BIRTH, Child.EventBirth ) - return Child -end - ---- This is the worker method to inherit from a parent class. --- @param #BASE self --- @param Child is the Child class that inherits. --- @param #BASE Parent is the Parent class that the Child inherits from. --- @return #BASE Child -function BASE:Inherit( Child, Parent ) - local Child = routines.utils.deepCopy( Child ) - local Parent = routines.utils.deepCopy( Parent ) - if Child ~= nil then - setmetatable( Child, Parent ) - Child.__index = Child - end - --Child.ClassName = Child.ClassName .. '.' .. Child.ClassID - self:T( 'Inherited from ' .. Parent.ClassName ) - return Child -end - ---- This is the worker method to retrieve the Parent class. --- @param #BASE self --- @param #BASE Child is the Child class from which the Parent class needs to be retrieved. --- @return #BASE -function BASE:Inherited( Child ) - local Parent = getmetatable( Child ) --- env.info('Inherited class of ' .. Child.ClassName .. ' is ' .. Parent.ClassName ) - return Parent -end - ---- Get the ClassName + ClassID of the class instance. --- The ClassName + ClassID is formatted as '%s#%09d'. --- @param #BASE self --- @return #string The ClassName + ClassID of the class instance. -function BASE:GetClassNameAndID() - return string.format( '%s#%09d', self:GetClassName(), self:GetClassID() ) -end - ---- Get the ClassName of the class instance. --- @param #BASE self --- @return #string The ClassName of the class instance. -function BASE:GetClassName() - return self.ClassName -end - ---- Get the ClassID of the class instance. --- @param #BASE self --- @return #string The ClassID of the class instance. -function BASE:GetClassID() - return self.ClassID -end - ---- Set a new listener for the class. --- @param self --- @param DCSTypes#Event Event --- @param #function EventFunction --- @return #BASE -function BASE:AddEvent( Event, EventFunction ) - self:F( Event ) - - self.Events[#self.Events+1] = {} - self.Events[#self.Events].Event = Event - self.Events[#self.Events].EventFunction = EventFunction - self.Events[#self.Events].EventEnabled = false - - return self -end - ---- Returns the event dispatcher --- @param #BASE self --- @return Event#EVENT -function BASE:Event() - - return _EVENTDISPATCHER -end - - - - - ---- Enable the event listeners for the class. --- @param #BASE self --- @return #BASE -function BASE:EnableEvents() - self:F( #self.Events ) - - for EventID, Event in pairs( self.Events ) do - Event.Self = self - Event.EventEnabled = true - end - self.Events.Handler = world.addEventHandler( self ) - - return self -end - - ---- Disable the event listeners for the class. --- @param #BASE self --- @return #BASE -function BASE:DisableEvents() - self:F() - - world.removeEventHandler( self ) - for EventID, Event in pairs( self.Events ) do - Event.Self = nil - Event.EventEnabled = false - end - - return self -end - - -local BaseEventCodes = { - "S_EVENT_SHOT", - "S_EVENT_HIT", - "S_EVENT_TAKEOFF", - "S_EVENT_LAND", - "S_EVENT_CRASH", - "S_EVENT_EJECTION", - "S_EVENT_REFUELING", - "S_EVENT_DEAD", - "S_EVENT_PILOT_DEAD", - "S_EVENT_BASE_CAPTURED", - "S_EVENT_MISSION_START", - "S_EVENT_MISSION_END", - "S_EVENT_TOOK_CONTROL", - "S_EVENT_REFUELING_STOP", - "S_EVENT_BIRTH", - "S_EVENT_HUMAN_FAILURE", - "S_EVENT_ENGINE_STARTUP", - "S_EVENT_ENGINE_SHUTDOWN", - "S_EVENT_PLAYER_ENTER_UNIT", - "S_EVENT_PLAYER_LEAVE_UNIT", - "S_EVENT_PLAYER_COMMENT", - "S_EVENT_SHOOTING_START", - "S_EVENT_SHOOTING_END", - "S_EVENT_MAX", -} - ---onEvent( {[1]="S_EVENT_BIRTH",[2]={["subPlace"]=5,["time"]=0,["initiator"]={["id_"]=16884480,},["place"]={["id_"]=5000040,},["id"]=15,["IniUnitName"]="US F-15C@RAMP-Air Support Mountains#001-01",},} --- Event = { --- id = enum world.event, --- time = Time, --- initiator = Unit, --- target = Unit, --- place = Unit, --- subPlace = enum world.BirthPlace, --- weapon = Weapon --- } - ---- Creation of a Birth Event. --- @param #BASE self --- @param DCSTypes#Time EventTime The time stamp of the event. --- @param DCSObject#Object Initiator The initiating object of the event. --- @param #string IniUnitName The initiating unit name. --- @param place --- @param subplace -function BASE:CreateEventBirth( EventTime, Initiator, IniUnitName, place, subplace ) - self:F( { EventTime, Initiator, IniUnitName, place, subplace } ) - - local Event = { - id = world.event.S_EVENT_BIRTH, - time = EventTime, - initiator = Initiator, - IniUnitName = IniUnitName, - place = place, - subplace = subplace - } - - world.onEvent( Event ) -end - ---- Creation of a Crash Event. --- @param #BASE self --- @param DCSTypes#Time EventTime The time stamp of the event. --- @param DCSObject#Object Initiator The initiating object of the event. -function BASE:CreateEventCrash( EventTime, Initiator ) - self:F( { EventTime, Initiator } ) - - local Event = { - id = world.event.S_EVENT_CRASH, - time = EventTime, - initiator = Initiator, - } - - world.onEvent( Event ) -end - --- TODO: Complete DCSTypes#Event structure. ---- The main event handling function... This function captures all events generated for the class. --- @param #BASE self --- @param DCSTypes#Event event -function BASE:onEvent(event) - --self:F( { BaseEventCodes[event.id], event } ) - - if self then - for EventID, EventObject in pairs( self.Events ) do - if EventObject.EventEnabled then - --env.info( 'onEvent Table EventObject.Self = ' .. tostring(EventObject.Self) ) - --env.info( 'onEvent event.id = ' .. tostring(event.id) ) - --env.info( 'onEvent EventObject.Event = ' .. tostring(EventObject.Event) ) - if event.id == EventObject.Event then - if self == EventObject.Self then - if event.initiator and event.initiator:isExist() then - event.IniUnitName = event.initiator:getName() - end - if event.target and event.target:isExist() then - event.TgtUnitName = event.target:getName() - end - --self:T( { BaseEventCodes[event.id], event } ) - --EventObject.EventFunction( self, event ) - end - end - end - end - end -end - -function BASE:SetState( Object, StateName, State ) - - local ClassNameAndID = Object:GetClassNameAndID() - if not self.States[ClassNameAndID] then - self.States[ClassNameAndID] = {} - end - - self.States[ClassNameAndID][StateName] = State - - return self.States[ClassNameAndID][StateName] -end - -function BASE:GetState( Object, StateName ) - - local ClassNameAndID = Object:GetClassNameAndID() - if self.States[ClassNameAndID] then - return self.States[ClassNameAndID][StateName] - end - - return nil -end - -function BASE:ClearState( Object, StateName ) - - local ClassNameAndID = Object:GetClassNameAndID() - if self.States[ClassNameAndID] then - self.States[ClassNameAndID][StateName] = nil - end -end - --- Trace section - --- Log a trace (only shown when trace is on) --- TODO: Make trace function using variable parameters. - ---- Set trace level --- @param #BASE self --- @param #number Level -function BASE:TraceLevel( Level ) - _TraceLevel = Level - self:E( "Tracing level " .. Level ) -end - ---- Trace all methods in MOOSE --- @param #BASE self --- @param #boolean TraceAll true = trace all methods in MOOSE. -function BASE:TraceAll( TraceAll ) - - _TraceAll = TraceAll - - if _TraceAll then - self:E( "Tracing all methods in MOOSE " ) - else - self:E( "Switched off tracing all methods in MOOSE" ) - end -end - ---- Set tracing for a class --- @param #BASE self --- @param #string Class -function BASE:TraceClass( Class ) - _TraceClass[Class] = true - _TraceClassMethod[Class] = {} - self:E( "Tracing class " .. Class ) -end - ---- Set tracing for a specific method of class --- @param #BASE self --- @param #string Class --- @param #string Method -function BASE:TraceClassMethod( Class, Method ) - if not _TraceClassMethod[Class] then - _TraceClassMethod[Class] = {} - _TraceClassMethod[Class].Method = {} - end - _TraceClassMethod[Class].Method[Method] = true - self:E( "Tracing method " .. Method .. " of class " .. Class ) -end - ---- Trace a function call. Must be at the beginning of the function logic. --- @param #BASE self --- @param Arguments A #table or any field. -function BASE:F( Arguments, DebugInfoCurrentParam, DebugInfoFromParam ) - - if _TraceOn and ( ( _TraceAll == true ) or ( _TraceClass[self.ClassName] or _TraceClassMethod[self.ClassName] ) ) then - - local DebugInfoCurrent = DebugInfoCurrentParam and DebugInfoCurrentParam or debug.getinfo( 2, "nl" ) - local DebugInfoFrom = DebugInfoFromParam and DebugInfoFromParam or debug.getinfo( 3, "l" ) - - local Function = "function" - if DebugInfoCurrent.name then - Function = DebugInfoCurrent.name - end - - if _TraceAll == true or _TraceClass[self.ClassName] or _TraceClassMethod[self.ClassName].Method[Function] then - local LineCurrent = DebugInfoCurrent.currentline - local LineFrom = 0 - if DebugInfoFrom then - LineFrom = DebugInfoFrom.currentline - end - env.info( string.format( "%6d(%6d)/%1s:%20s%05d.%s(%s)" , LineCurrent, LineFrom, "F", self.ClassName, self.ClassID, Function, routines.utils.oneLineSerialize( Arguments ) ) ) - end - end -end - ---- Trace a function call level 2. Must be at the beginning of the function logic. --- @param #BASE self --- @param Arguments A #table or any field. -function BASE:F2( Arguments ) - - local DebugInfoCurrent = debug.getinfo( 2, "nl" ) - local DebugInfoFrom = debug.getinfo( 3, "l" ) - - if _TraceLevel >= 2 then - self:F( Arguments, DebugInfoCurrent, DebugInfoFrom ) - end - -end - ---- Trace a function call level 3. Must be at the beginning of the function logic. --- @param #BASE self --- @param Arguments A #table or any field. -function BASE:F3( Arguments ) - - local DebugInfoCurrent = debug.getinfo( 2, "nl" ) - local DebugInfoFrom = debug.getinfo( 3, "l" ) - - if _TraceLevel >= 3 then - self:F( Arguments, DebugInfoCurrent, DebugInfoFrom ) - end - -end - ---- Trace a function logic. --- @param #BASE self --- @param Arguments A #table or any field. -function BASE:_T( Arguments, DebugInfoCurrentParam, DebugInfoFromParam ) - - if _TraceOn and ( ( _TraceAll == true ) or ( _TraceClass[self.ClassName] or _TraceClassMethod[self.ClassName] ) ) then - - local DebugInfoCurrent = DebugInfoCurrentParam and DebugInfoCurrentParam or debug.getinfo( 2, "nl" ) - local DebugInfoFrom = DebugInfoFromParam and DebugInfoFromParam or debug.getinfo( 3, "l" ) - - local Function = "function" - if DebugInfoCurrent.name then - Function = DebugInfoCurrent.name - end - - if _TraceAll == true or _TraceClass[self.ClassName] or _TraceClassMethod[self.ClassName].Method[Function] then - local LineCurrent = DebugInfoCurrent.currentline - local LineFrom = 0 - if DebugInfoFrom then - LineFrom = DebugInfoFrom.currentline - end - env.info( string.format( "%6d(%6d)/%1s:%20s%05d.%s" , LineCurrent, LineFrom, "T", self.ClassName, self.ClassID, routines.utils.oneLineSerialize( Arguments ) ) ) - end - end -end - ---- Trace a function logic level 1. Can be anywhere within the function logic. --- @param #BASE self --- @param Arguments A #table or any field. -function BASE:T( Arguments ) - - local DebugInfoCurrent = debug.getinfo( 2, "nl" ) - local DebugInfoFrom = debug.getinfo( 3, "l" ) - - if _TraceLevel >= 1 then - self:_T( Arguments, DebugInfoCurrent, DebugInfoFrom ) - end - -end - - ---- Trace a function logic level 2. Can be anywhere within the function logic. --- @param #BASE self --- @param Arguments A #table or any field. -function BASE:T2( Arguments ) - - local DebugInfoCurrent = debug.getinfo( 2, "nl" ) - local DebugInfoFrom = debug.getinfo( 3, "l" ) - - if _TraceLevel >= 2 then - self:_T( Arguments, DebugInfoCurrent, DebugInfoFrom ) - end - -end - ---- Trace a function logic level 3. Can be anywhere within the function logic. --- @param #BASE self --- @param Arguments A #table or any field. -function BASE:T3( Arguments ) - - local DebugInfoCurrent = debug.getinfo( 2, "nl" ) - local DebugInfoFrom = debug.getinfo( 3, "l" ) - - if _TraceLevel >= 3 then - self:_T( Arguments, DebugInfoCurrent, DebugInfoFrom ) - end - -end - ---- Log an exception which will be traced always. Can be anywhere within the function logic. --- @param #BASE self --- @param Arguments A #table or any field. -function BASE:E( Arguments ) - - local DebugInfoCurrent = debug.getinfo( 2, "nl" ) - local DebugInfoFrom = debug.getinfo( 3, "l" ) - - local Function = "function" - if DebugInfoCurrent.name then - Function = DebugInfoCurrent.name - end - - local LineCurrent = DebugInfoCurrent.currentline - local LineFrom = -1 - if DebugInfoFrom then - LineFrom = DebugInfoFrom.currentline - end - - env.info( string.format( "%6d(%6d)/%1s:%20s%05d.%s(%s)" , LineCurrent, LineFrom, "E", self.ClassName, self.ClassID, Function, routines.utils.oneLineSerialize( Arguments ) ) ) -end - - - ---- Models time events calling event handing functions. --- --- @{SCHEDULER} class --- =================== --- The @{SCHEDULER} class models time events calling given event handling functions. --- --- SCHEDULER constructor --- ===================== --- The SCHEDULER class is quite easy to use: --- --- * @{#SCHEDULER.New}: Setup a new scheduler and start it with the specified parameters. --- --- SCHEDULER timer methods --- ======================= --- The SCHEDULER can be stopped and restarted with the following methods: --- --- * @{#SCHEDULER.Start}: (Re-)Start the scheduler. --- * @{#SCHEDULER.Start}: Stop the scheduler. --- --- @module Scheduler --- @author FlightControl - ---- The SCHEDULER class --- @type SCHEDULER --- @extends Base#BASE -SCHEDULER = { - ClassName = "SCHEDULER", -} - - ---- Constructor. --- @param #SCHEDULER self --- @param #table TimeEventObject Specified for which Moose object the timer is setup. If a value of nil is provided, a scheduler will be setup without an object reference. --- @param #function TimeEventFunction The event function to be called when a timer event occurs. The event function needs to accept the parameters specified in TimeEventFunctionArguments. --- @param #table TimeEventFunctionArguments Optional arguments that can be given as part of scheduler. The arguments need to be given as a table { param1, param 2, ... }. --- @param #number StartSeconds Specifies the amount of seconds that will be waited before the scheduling is started, and the event function is called. --- @param #number RepeatSecondsInterval Specifies the interval in seconds when the scheduler will call the event function. --- @param #number RandomizationFactor Specifies a randomization factor between 0 and 1 to randomize the RepeatSecondsInterval. --- @param #number StopSeconds Specifies the amount of seconds when the scheduler will be stopped. --- @return #SCHEDULER self -function SCHEDULER:New( TimeEventObject, TimeEventFunction, TimeEventFunctionArguments, StartSeconds, RepeatSecondsInterval, RandomizationFactor, StopSeconds ) - local self = BASE:Inherit( self, BASE:New() ) - self:F2( { TimeEventObject, TimeEventFunction, TimeEventFunctionArguments, StartSeconds, RepeatSecondsInterval, RandomizationFactor, StopSeconds } ) - - self.TimeEventObject = TimeEventObject - self.TimeEventFunction = TimeEventFunction - self.TimeEventFunctionArguments = TimeEventFunctionArguments - self.StartSeconds = StartSeconds - - if RepeatSecondsInterval then - self.RepeatSecondsInterval = RepeatSecondsInterval - else - self.RepeatSecondsInterval = 0 - end - - if RandomizationFactor then - self.RandomizationFactor = RandomizationFactor - else - self.RandomizationFactor = 0 - end - - if StopSeconds then - self.StopSeconds = StopSeconds - end - - self.Repeat = false - - self.StartTime = timer.getTime() - - self:Start() - - return self -end - ---- (Re-)Starts the scheduler. --- @param #SCHEDULER self --- @return #SCHEDULER self -function SCHEDULER:Start() - self:F2( self.TimeEventObject ) - - self.Repeat = true - timer.scheduleFunction( self._Scheduler, self, timer.getTime() + self.StartSeconds + .01 ) - - return self -end - ---- Stops the scheduler. --- @param #SCHEDULER self --- @return #SCHEDULER self -function SCHEDULER:Stop() - self:F2( self.TimeEventObject ) - - self.Repeat = false - - return self -end - --- Private Functions - -function SCHEDULER:_Scheduler() - self:F2( self.TimeEventFunctionArguments ) - - local ErrorHandler = function( errmsg ) - - env.info( "Error in SCHEDULER function:" .. errmsg ) - env.info( debug.traceback() ) - - return errmsg - end - - local Status, Result - if self.TimeEventObject then - Status, Result = xpcall( function() return self.TimeEventFunction( self.TimeEventObject, unpack( self.TimeEventFunctionArguments ) ) end, ErrorHandler ) - else - Status, Result = xpcall( function() return self.TimeEventFunction( unpack( self.TimeEventFunctionArguments ) ) end, ErrorHandler ) - end - - self:T( { Status, Result } ) - - if Status and ( ( not Result == nil ) or ( Result and Result ~= false ) ) then - if self.Repeat and ( not self.StopSeconds or ( self.StopSeconds and timer.getTime() <= self.StartTime + self.StopSeconds ) ) then - timer.scheduleFunction( - self._Scheduler, - self, - timer.getTime() + self.RepeatSecondsInterval + math.random( - ( self.RandomizationFactor * self.RepeatSecondsInterval / 2 ), ( self.RandomizationFactor * self.RepeatSecondsInterval / 2 ) ) + 0.01 - ) - end - end - -end - - - - - - - - ---- The EVENT class models an efficient event handling process between other classes and its units, weapons. --- @module Event --- @author FlightControl - ---- The EVENT structure --- @type EVENT --- @field #EVENT.Events Events -EVENT = { - ClassName = "EVENT", - ClassID = 0, -} - -local _EVENTCODES = { - "S_EVENT_SHOT", - "S_EVENT_HIT", - "S_EVENT_TAKEOFF", - "S_EVENT_LAND", - "S_EVENT_CRASH", - "S_EVENT_EJECTION", - "S_EVENT_REFUELING", - "S_EVENT_DEAD", - "S_EVENT_PILOT_DEAD", - "S_EVENT_BASE_CAPTURED", - "S_EVENT_MISSION_START", - "S_EVENT_MISSION_END", - "S_EVENT_TOOK_CONTROL", - "S_EVENT_REFUELING_STOP", - "S_EVENT_BIRTH", - "S_EVENT_HUMAN_FAILURE", - "S_EVENT_ENGINE_STARTUP", - "S_EVENT_ENGINE_SHUTDOWN", - "S_EVENT_PLAYER_ENTER_UNIT", - "S_EVENT_PLAYER_LEAVE_UNIT", - "S_EVENT_PLAYER_COMMENT", - "S_EVENT_SHOOTING_START", - "S_EVENT_SHOOTING_END", - "S_EVENT_MAX", -} - ---- The Event structure --- @type EVENTDATA --- @field id --- @field initiator --- @field target --- @field weapon --- @field IniDCSUnit --- @field IniDCSUnitName --- @field IniDCSGroup --- @field IniDCSGroupName --- @field TgtDCSUnit --- @field TgtDCSUnitName --- @field TgtDCSGroup --- @field TgtDCSGroupName --- @field Weapon --- @field WeaponName --- @field WeaponTgtDCSUnit - ---- The Events structure --- @type EVENT.Events --- @field #number IniUnit - -function EVENT:New() - local self = BASE:Inherit( self, BASE:New() ) - self:F2() - self.EventHandler = world.addEventHandler( self ) - return self -end - -function EVENT:EventText( EventID ) - - local EventText = _EVENTCODES[EventID] - - return EventText -end - - ---- Initializes the Events structure for the event --- @param #EVENT self --- @param DCSWorld#world.event EventID --- @param #string EventClass --- @return #EVENT.Events -function EVENT:Init( EventID, EventClass ) - self:F3( { _EVENTCODES[EventID], EventClass } ) - if not self.Events[EventID] then - self.Events[EventID] = {} - end - if not self.Events[EventID][EventClass] then - self.Events[EventID][EventClass] = {} - end - return self.Events[EventID][EventClass] -end - - ---- Create an OnDead event handler for a group --- @param #EVENT self --- @param #table EventTemplate --- @param #function EventFunction The function to be called when the event occurs for the unit. --- @param EventSelf The self instance of the class for which the event is. --- @param #function OnEventFunction --- @return #EVENT -function EVENT:OnEventForTemplate( EventTemplate, EventFunction, EventSelf, OnEventFunction ) - self:F2( EventTemplate.name ) - - for EventUnitID, EventUnit in pairs( EventTemplate.units ) do - OnEventFunction( self, EventUnit.name, EventFunction, EventSelf ) - end - return self -end - ---- Set a new listener for an S_EVENT_X event independent from a unit or a weapon. --- @param #EVENT self --- @param #function EventFunction The function to be called when the event occurs for the unit. --- @param Base#BASE EventSelf The self instance of the class for which the event is. --- @param EventID --- @return #EVENT -function EVENT:OnEventGeneric( EventFunction, EventSelf, EventID ) - self:F2( { EventID } ) - - local Event = self:Init( EventID, EventSelf:GetClassNameAndID() ) - Event.EventFunction = EventFunction - Event.EventSelf = EventSelf - return self -end - - ---- Set a new listener for an S_EVENT_X event --- @param #EVENT self --- @param #string EventDCSUnitName --- @param #function EventFunction The function to be called when the event occurs for the unit. --- @param Base#BASE EventSelf The self instance of the class for which the event is. --- @param EventID --- @return #EVENT -function EVENT:OnEventForUnit( EventDCSUnitName, EventFunction, EventSelf, EventID ) - self:F2( EventDCSUnitName ) - - local Event = self:Init( EventID, EventSelf:GetClassNameAndID() ) - if not Event.IniUnit then - Event.IniUnit = {} - end - Event.IniUnit[EventDCSUnitName] = {} - Event.IniUnit[EventDCSUnitName].EventFunction = EventFunction - Event.IniUnit[EventDCSUnitName].EventSelf = EventSelf - return self -end - - ---- Create an OnBirth event handler for a group --- @param #EVENT self --- @param Group#GROUP EventGroup --- @param #function EventFunction The function to be called when the event occurs for the unit. --- @param EventSelf The self instance of the class for which the event is. --- @return #EVENT -function EVENT:OnBirthForTemplate( EventTemplate, EventFunction, EventSelf ) - self:F2( EventTemplate.name ) - - self:OnEventForTemplate( EventTemplate, EventFunction, EventSelf, self.OnBirthForUnit ) - - return self -end - ---- Set a new listener for an S_EVENT_BIRTH event, and registers the unit born. --- @param #EVENT self --- @param #function EventFunction The function to be called when the event occurs for the unit. --- @param Base#BASE EventSelf --- @return #EVENT -function EVENT:OnBirth( EventFunction, EventSelf ) - self:F2() - - self:OnEventGeneric( EventFunction, EventSelf, world.event.S_EVENT_BIRTH ) - - return self -end - ---- Set a new listener for an S_EVENT_BIRTH event. --- @param #EVENT self --- @param #string EventDCSUnitName The id of the unit for the event to be handled. --- @param #function EventFunction The function to be called when the event occurs for the unit. --- @param Base#BASE EventSelf --- @return #EVENT -function EVENT:OnBirthForUnit( EventDCSUnitName, EventFunction, EventSelf ) - self:F2( EventDCSUnitName ) - - self:OnEventForUnit( EventDCSUnitName, EventFunction, EventSelf, world.event.S_EVENT_BIRTH ) - - return self -end - ---- Create an OnCrash event handler for a group --- @param #EVENT self --- @param Group#GROUP EventGroup --- @param #function EventFunction The function to be called when the event occurs for the unit. --- @param EventSelf The self instance of the class for which the event is. --- @return #EVENT -function EVENT:OnCrashForTemplate( EventTemplate, EventFunction, EventSelf ) - self:F2( EventTemplate.name ) - - self:OnEventForTemplate( EventTemplate, EventFunction, EventSelf, self.OnCrashForUnit ) - - return self -end - ---- Set a new listener for an S_EVENT_CRASH event. --- @param #EVENT self --- @param #function EventFunction The function to be called when the event occurs for the unit. --- @param Base#BASE EventSelf --- @return #EVENT -function EVENT:OnCrash( EventFunction, EventSelf ) - self:F2() - - self:OnEventGeneric( EventFunction, EventSelf, world.event.S_EVENT_CRASH ) - - return self -end - ---- Set a new listener for an S_EVENT_CRASH event. --- @param #EVENT self --- @param #string EventDCSUnitName --- @param #function EventFunction The function to be called when the event occurs for the unit. --- @param Base#BASE EventSelf The self instance of the class for which the event is. --- @return #EVENT -function EVENT:OnCrashForUnit( EventDCSUnitName, EventFunction, EventSelf ) - self:F2( EventDCSUnitName ) - - self:OnEventForUnit( EventDCSUnitName, EventFunction, EventSelf, world.event.S_EVENT_CRASH ) - - return self -end - ---- Create an OnDead event handler for a group --- @param #EVENT self --- @param Group#GROUP EventGroup --- @param #function EventFunction The function to be called when the event occurs for the unit. --- @param EventSelf The self instance of the class for which the event is. --- @return #EVENT -function EVENT:OnDeadForTemplate( EventTemplate, EventFunction, EventSelf ) - self:F2( EventTemplate.name ) - - self:OnEventForTemplate( EventTemplate, EventFunction, EventSelf, self.OnDeadForUnit ) - - return self -end - ---- Set a new listener for an S_EVENT_DEAD event. --- @param #EVENT self --- @param #function EventFunction The function to be called when the event occurs for the unit. --- @param Base#BASE EventSelf --- @return #EVENT -function EVENT:OnDead( EventFunction, EventSelf ) - self:F2() - - self:OnEventGeneric( EventFunction, EventSelf, world.event.S_EVENT_DEAD ) - - return self -end - - ---- Set a new listener for an S_EVENT_DEAD event. --- @param #EVENT self --- @param #string EventDCSUnitName --- @param #function EventFunction The function to be called when the event occurs for the unit. --- @param Base#BASE EventSelf The self instance of the class for which the event is. --- @return #EVENT -function EVENT:OnDeadForUnit( EventDCSUnitName, EventFunction, EventSelf ) - self:F2( EventDCSUnitName ) - - self:OnEventForUnit( EventDCSUnitName, EventFunction, EventSelf, world.event.S_EVENT_DEAD ) - - return self -end - ---- Set a new listener for an S_EVENT_PILOT_DEAD event. --- @param #EVENT self --- @param #string EventDCSUnitName --- @param #function EventFunction The function to be called when the event occurs for the unit. --- @param Base#BASE EventSelf The self instance of the class for which the event is. --- @return #EVENT -function EVENT:OnPilotDeadForUnit( EventDCSUnitName, EventFunction, EventSelf ) - self:F2( EventDCSUnitName ) - - self:OnEventForUnit( EventDCSUnitName, EventFunction, EventSelf, world.event.S_EVENT_PILOT_DEAD ) - - return self -end - ---- Create an OnDead event handler for a group --- @param #EVENT self --- @param #table EventTemplate --- @param #function EventFunction The function to be called when the event occurs for the unit. --- @param EventSelf The self instance of the class for which the event is. --- @return #EVENT -function EVENT:OnLandForTemplate( EventTemplate, EventFunction, EventSelf ) - self:F2( EventTemplate.name ) - - self:OnEventForTemplate( EventTemplate, EventFunction, EventSelf, self.OnLandForUnit ) - - return self -end - ---- Set a new listener for an S_EVENT_LAND event. --- @param #EVENT self --- @param #string EventDCSUnitName --- @param #function EventFunction The function to be called when the event occurs for the unit. --- @param Base#BASE EventSelf The self instance of the class for which the event is. --- @return #EVENT -function EVENT:OnLandForUnit( EventDCSUnitName, EventFunction, EventSelf ) - self:F2( EventDCSUnitName ) - - self:OnEventForUnit( EventDCSUnitName, EventFunction, EventSelf, world.event.S_EVENT_LAND ) - - return self -end - ---- Create an OnDead event handler for a group --- @param #EVENT self --- @param #table EventTemplate --- @param #function EventFunction The function to be called when the event occurs for the unit. --- @param EventSelf The self instance of the class for which the event is. --- @return #EVENT -function EVENT:OnTakeOffForTemplate( EventTemplate, EventFunction, EventSelf ) - self:F2( EventTemplate.name ) - - self:OnEventForTemplate( EventTemplate, EventFunction, EventSelf, self.OnTakeOffForUnit ) - - return self -end - ---- Set a new listener for an S_EVENT_TAKEOFF event. --- @param #EVENT self --- @param #string EventDCSUnitName --- @param #function EventFunction The function to be called when the event occurs for the unit. --- @param Base#BASE EventSelf The self instance of the class for which the event is. --- @return #EVENT -function EVENT:OnTakeOffForUnit( EventDCSUnitName, EventFunction, EventSelf ) - self:F2( EventDCSUnitName ) - - self:OnEventForUnit( EventDCSUnitName, EventFunction, EventSelf, world.event.S_EVENT_TAKEOFF ) - - return self -end - ---- Create an OnDead event handler for a group --- @param #EVENT self --- @param #table EventTemplate --- @param #function EventFunction The function to be called when the event occurs for the unit. --- @param EventSelf The self instance of the class for which the event is. --- @return #EVENT -function EVENT:OnEngineShutDownForTemplate( EventTemplate, EventFunction, EventSelf ) - self:F2( EventTemplate.name ) - - self:OnEventForTemplate( EventTemplate, EventFunction, EventSelf, self.OnEngineShutDownForUnit ) - - return self -end - ---- Set a new listener for an S_EVENT_ENGINE_SHUTDOWN event. --- @param #EVENT self --- @param #string EventDCSUnitName --- @param #function EventFunction The function to be called when the event occurs for the unit. --- @param Base#BASE EventSelf The self instance of the class for which the event is. --- @return #EVENT -function EVENT:OnEngineShutDownForUnit( EventDCSUnitName, EventFunction, EventSelf ) - self:F2( EventDCSUnitName ) - - self:OnEventForUnit( EventDCSUnitName, EventFunction, EventSelf, world.event.S_EVENT_ENGINE_SHUTDOWN ) - - return self -end - ---- Set a new listener for an S_EVENT_ENGINE_STARTUP event. --- @param #EVENT self --- @param #string EventDCSUnitName --- @param #function EventFunction The function to be called when the event occurs for the unit. --- @param Base#BASE EventSelf The self instance of the class for which the event is. --- @return #EVENT -function EVENT:OnEngineStartUpForUnit( EventDCSUnitName, EventFunction, EventSelf ) - self:F2( EventDCSUnitName ) - - self:OnEventForUnit( EventDCSUnitName, EventFunction, EventSelf, world.event.S_EVENT_ENGINE_STARTUP ) - - return self -end - ---- Set a new listener for an S_EVENT_SHOT event. --- @param #EVENT self --- @param #function EventFunction The function to be called when the event occurs for the unit. --- @param Base#BASE EventSelf The self instance of the class for which the event is. --- @return #EVENT -function EVENT:OnShot( EventFunction, EventSelf ) - self:F2() - - self:OnEventGeneric( EventFunction, EventSelf, world.event.S_EVENT_SHOT ) - - return self -end - ---- Set a new listener for an S_EVENT_SHOT event for a unit. --- @param #EVENT self --- @param #string EventDCSUnitName --- @param #function EventFunction The function to be called when the event occurs for the unit. --- @param Base#BASE EventSelf The self instance of the class for which the event is. --- @return #EVENT -function EVENT:OnShotForUnit( EventDCSUnitName, EventFunction, EventSelf ) - self:F2( EventDCSUnitName ) - - self:OnEventForUnit( EventDCSUnitName, EventFunction, EventSelf, world.event.S_EVENT_SHOT ) - - return self -end - ---- Set a new listener for an S_EVENT_HIT event. --- @param #EVENT self --- @param #function EventFunction The function to be called when the event occurs for the unit. --- @param Base#BASE EventSelf The self instance of the class for which the event is. --- @return #EVENT -function EVENT:OnHit( EventFunction, EventSelf ) - self:F2() - - self:OnEventGeneric( EventFunction, EventSelf, world.event.S_EVENT_HIT ) - - return self -end - ---- Set a new listener for an S_EVENT_HIT event. --- @param #EVENT self --- @param #string EventDCSUnitName --- @param #function EventFunction The function to be called when the event occurs for the unit. --- @param Base#BASE EventSelf The self instance of the class for which the event is. --- @return #EVENT -function EVENT:OnHitForUnit( EventDCSUnitName, EventFunction, EventSelf ) - self:F2( EventDCSUnitName ) - - self:OnEventForUnit( EventDCSUnitName, EventFunction, EventSelf, world.event.S_EVENT_HIT ) - - return self -end - ---- Set a new listener for an S_EVENT_PLAYER_ENTER_UNIT event. --- @param #EVENT self --- @param #function EventFunction The function to be called when the event occurs for the unit. --- @param Base#BASE EventSelf The self instance of the class for which the event is. --- @return #EVENT -function EVENT:OnPlayerEnterUnit( EventFunction, EventSelf ) - self:F2() - - self:OnEventGeneric( EventFunction, EventSelf, world.event.S_EVENT_PLAYER_ENTER_UNIT ) - - return self -end - ---- Set a new listener for an S_EVENT_PLAYER_LEAVE_UNIT event. --- @param #EVENT self --- @param #function EventFunction The function to be called when the event occurs for the unit. --- @param Base#BASE EventSelf The self instance of the class for which the event is. --- @return #EVENT -function EVENT:OnPlayerLeaveUnit( EventFunction, EventSelf ) - self:F2() - - self:OnEventGeneric( EventFunction, EventSelf, world.event.S_EVENT_PLAYER_LEAVE_UNIT ) - - return self -end - - - -function EVENT:onEvent( Event ) - self:F2( { _EVENTCODES[Event.id], Event } ) - - if self and self.Events and self.Events[Event.id] then - if Event.initiator and Event.initiator:getCategory() == Object.Category.UNIT then - Event.IniDCSUnit = Event.initiator - Event.IniDCSGroup = Event.IniDCSUnit:getGroup() - Event.IniDCSUnitName = Event.IniDCSUnit:getName() - Event.IniDCSGroupName = "" - if Event.IniDCSGroup and Event.IniDCSGroup:isExist() then - Event.IniDCSGroupName = Event.IniDCSGroup:getName() - end - end - if Event.target then - if Event.target and Event.target:getCategory() == Object.Category.UNIT then - Event.TgtDCSUnit = Event.target - Event.TgtDCSGroup = Event.TgtDCSUnit:getGroup() - Event.TgtDCSUnitName = Event.TgtDCSUnit:getName() - Event.TgtDCSGroupName = "" - if Event.TgtDCSGroup and Event.TgtDCSGroup:isExist() then - Event.TgtDCSGroupName = Event.TgtDCSGroup:getName() - end - end - end - if Event.weapon then - Event.Weapon = Event.weapon - Event.WeaponName = Event.Weapon:getTypeName() - --Event.WeaponTgtDCSUnit = Event.Weapon:getTarget() - end - self:E( { _EVENTCODES[Event.id], Event } ) - for ClassName, EventData in pairs( self.Events[Event.id] ) do - if Event.IniDCSUnitName and EventData.IniUnit and EventData.IniUnit[Event.IniDCSUnitName] then - self:T2( { "Calling event function for class ", ClassName, " unit ", Event.IniDCSUnitName } ) - EventData.IniUnit[Event.IniDCSUnitName].EventFunction( EventData.IniUnit[Event.IniDCSUnitName].EventSelf, Event ) - else - if Event.IniDCSUnit and not EventData.IniUnit then - self:T2( { "Calling event function for class ", ClassName } ) - EventData.EventFunction( EventData.EventSelf, Event ) - end - end - end - end -end - ---- Encapsulation of DCS World Menu system in a set of MENU classes. --- @module Menu - ---- The MENU class --- @type MENU --- @extends Base#BASE -MENU = { - ClassName = "MENU", - MenuPath = nil, - MenuText = "", - MenuParentPath = nil -} - ---- -function MENU:New( MenuText, MenuParentPath ) - - -- Arrange meta tables - local Child = BASE:Inherit( self, BASE:New() ) - - Child.MenuPath = nil - Child.MenuText = MenuText - Child.MenuParentPath = MenuParentPath - return Child -end - ---- The COMMANDMENU class --- @type COMMANDMENU --- @extends Menu#MENU -COMMANDMENU = { - ClassName = "COMMANDMENU", - CommandMenuFunction = nil, - CommandMenuArgument = nil -} - -function COMMANDMENU:New( MenuText, ParentMenu, CommandMenuFunction, CommandMenuArgument ) - - -- Arrange meta tables - - local MenuParentPath = nil - if ParentMenu ~= nil then - MenuParentPath = ParentMenu.MenuPath - end - - local Child = BASE:Inherit( self, MENU:New( MenuText, MenuParentPath ) ) - - Child.MenuPath = missionCommands.addCommand( MenuText, MenuParentPath, CommandMenuFunction, CommandMenuArgument ) - Child.CommandMenuFunction = CommandMenuFunction - Child.CommandMenuArgument = CommandMenuArgument - return Child -end - ---- The SUBMENU class --- @type SUBMENU --- @extends Menu#MENU -SUBMENU = { - ClassName = "SUBMENU" -} - -function SUBMENU:New( MenuText, ParentMenu ) - - -- Arrange meta tables - local MenuParentPath = nil - if ParentMenu ~= nil then - MenuParentPath = ParentMenu.MenuPath - end - - local Child = BASE:Inherit( self, MENU:New( MenuText, MenuParentPath ) ) - - Child.MenuPath = missionCommands.addSubMenu( MenuText, MenuParentPath ) - return Child -end - --- This local variable is used to cache the menus registered under clients. --- Menus don't dissapear when clients are destroyed and restarted. --- So every menu for a client created must be tracked so that program logic accidentally does not create --- the same menus twice during initialization logic. --- These menu classes are handling this logic with this variable. -local _MENUCLIENTS = {} - ---- The MENU_CLIENT class --- @type MENU_CLIENT --- @extends Menu#MENU -MENU_CLIENT = { - ClassName = "MENU_CLIENT" -} - ---- Creates a new menu item for a group --- @param self --- @param Client#CLIENT MenuClient The Client owning the menu. --- @param #string MenuText The text for the menu. --- @param #table ParentMenu The parent menu. --- @return #MENU_CLIENT self -function MENU_CLIENT:New( MenuClient, MenuText, ParentMenu ) - - -- Arrange meta tables - local MenuParentPath = {} - if ParentMenu ~= nil then - MenuParentPath = ParentMenu.MenuPath - end - - local self = BASE:Inherit( self, MENU:New( MenuText, MenuParentPath ) ) - self:F( { MenuClient, MenuText, ParentMenu } ) - - self.MenuClient = MenuClient - self.MenuClientGroupID = MenuClient:GetClientGroupID() - self.MenuParentPath = MenuParentPath - self.MenuText = MenuText - self.ParentMenu = ParentMenu - - self.Menus = {} - - if not _MENUCLIENTS[self.MenuClientGroupID] then - _MENUCLIENTS[self.MenuClientGroupID] = {} - end - - local MenuPath = _MENUCLIENTS[self.MenuClientGroupID] - - self:T( { MenuClient:GetClientGroupName(), MenuPath[table.concat(MenuParentPath)], MenuParentPath, MenuText } ) - - local MenuPathID = table.concat(MenuParentPath) .. "/" .. MenuText - if MenuPath[MenuPathID] then - missionCommands.removeItemForGroup( self.MenuClient:GetClientGroupID(), MenuPath[MenuPathID] ) - end - - self.MenuPath = missionCommands.addSubMenuForGroup( self.MenuClient:GetClientGroupID(), MenuText, MenuParentPath ) - MenuPath[MenuPathID] = self.MenuPath - - self:T( { MenuClient:GetClientGroupName(), self.MenuPath } ) - - if ParentMenu and ParentMenu.Menus then - ParentMenu.Menus[self.MenuPath] = self - end - return self -end - ---- Removes the sub menus recursively of this MENU_CLIENT. --- @param #MENU_CLIENT self --- @return #MENU_CLIENT self -function MENU_CLIENT:RemoveSubMenus() - self:F( self.MenuPath ) - - for MenuID, Menu in pairs( self.Menus ) do - Menu:Remove() - end - -end - ---- Removes the sub menus recursively of this MENU_CLIENT. --- @param #MENU_CLIENT self --- @return #MENU_CLIENT self -function MENU_CLIENT:Remove() - self:F( self.MenuPath ) - - self:RemoveSubMenus() - - if not _MENUCLIENTS[self.MenuClientGroupID] then - _MENUCLIENTS[self.MenuClientGroupID] = {} - end - - local MenuPath = _MENUCLIENTS[self.MenuClientGroupID] - - if MenuPath[table.concat(self.MenuParentPath) .. "/" .. self.MenuText] then - MenuPath[table.concat(self.MenuParentPath) .. "/" .. self.MenuText] = nil - end - - missionCommands.removeItemForGroup( self.MenuClient:GetClientGroupID(), self.MenuPath ) - self.ParentMenu.Menus[self.MenuPath] = nil - return nil -end - - ---- The MENU_CLIENT_COMMAND class --- @type MENU_CLIENT_COMMAND --- @extends Menu#MENU -MENU_CLIENT_COMMAND = { - ClassName = "MENU_CLIENT_COMMAND" -} - ---- Creates a new radio command item for a group --- @param self --- @param Client#CLIENT MenuClient The Client owning the menu. --- @param MenuText The text for the menu. --- @param ParentMenu The parent menu. --- @param CommandMenuFunction A function that is called when the menu key is pressed. --- @param CommandMenuArgument An argument for the function. --- @return Menu#MENU_CLIENT_COMMAND self -function MENU_CLIENT_COMMAND:New( MenuClient, MenuText, ParentMenu, CommandMenuFunction, CommandMenuArgument ) - - -- Arrange meta tables - - local MenuParentPath = {} - if ParentMenu ~= nil then - MenuParentPath = ParentMenu.MenuPath - end - - local self = BASE:Inherit( self, MENU:New( MenuText, MenuParentPath ) ) - - self.MenuClient = MenuClient - self.MenuClientGroupID = MenuClient:GetClientGroupID() - self.MenuParentPath = MenuParentPath - self.MenuText = MenuText - self.ParentMenu = ParentMenu - - if not _MENUCLIENTS[self.MenuClientGroupID] then - _MENUCLIENTS[self.MenuClientGroupID] = {} - end - - local MenuPath = _MENUCLIENTS[self.MenuClientGroupID] - - self:T( { MenuClient:GetClientGroupName(), MenuPath[table.concat(MenuParentPath)], MenuParentPath, MenuText, CommandMenuFunction, CommandMenuArgument } ) - - local MenuPathID = table.concat(MenuParentPath) .. "/" .. MenuText - if MenuPath[MenuPathID] then - missionCommands.removeItemForGroup( self.MenuClient:GetClientGroupID(), MenuPath[MenuPathID] ) - end - - self.MenuPath = missionCommands.addCommandForGroup( self.MenuClient:GetClientGroupID(), MenuText, MenuParentPath, CommandMenuFunction, CommandMenuArgument ) - MenuPath[MenuPathID] = self.MenuPath - - self.CommandMenuFunction = CommandMenuFunction - self.CommandMenuArgument = CommandMenuArgument - - ParentMenu.Menus[self.MenuPath] = self - - return self -end - -function MENU_CLIENT_COMMAND:Remove() - self:F( self.MenuPath ) - - if not _MENUCLIENTS[self.MenuClientGroupID] then - _MENUCLIENTS[self.MenuClientGroupID] = {} - end - - local MenuPath = _MENUCLIENTS[self.MenuClientGroupID] - - if MenuPath[table.concat(self.MenuParentPath) .. "/" .. self.MenuText] then - MenuPath[table.concat(self.MenuParentPath) .. "/" .. self.MenuText] = nil - end - - missionCommands.removeItemForGroup( self.MenuClient:GetClientGroupID(), self.MenuPath ) - self.ParentMenu.Menus[self.MenuPath] = nil - return nil -end - - ---- The MENU_COALITION class --- @type MENU_COALITION --- @extends Menu#MENU -MENU_COALITION = { - ClassName = "MENU_COALITION" -} - ---- Creates a new coalition menu item --- @param #MENU_COALITION self --- @param DCSCoalition#coalition.side MenuCoalition The coalition owning the menu. --- @param #string MenuText The text for the menu. --- @param #table ParentMenu The parent menu. --- @return #MENU_COALITION self -function MENU_COALITION:New( MenuCoalition, MenuText, ParentMenu ) - - -- Arrange meta tables - local MenuParentPath = {} - if ParentMenu ~= nil then - MenuParentPath = ParentMenu.MenuPath - end - - local self = BASE:Inherit( self, MENU:New( MenuText, MenuParentPath ) ) - self:F( { MenuCoalition, MenuText, ParentMenu } ) - - self.MenuCoalition = MenuCoalition - self.MenuParentPath = MenuParentPath - self.MenuText = MenuText - self.ParentMenu = ParentMenu - - self.Menus = {} - - self:T( { MenuParentPath, MenuText } ) - - self.MenuPath = missionCommands.addSubMenuForCoalition( self.MenuCoalition, MenuText, MenuParentPath ) - - self:T( { self.MenuPath } ) - - if ParentMenu and ParentMenu.Menus then - ParentMenu.Menus[self.MenuPath] = self - end - return self -end - ---- Removes the sub menus recursively of this MENU_COALITION. --- @param #MENU_COALITION self --- @return #MENU_COALITION self -function MENU_COALITION:RemoveSubMenus() - self:F( self.MenuPath ) - - for MenuID, Menu in pairs( self.Menus ) do - Menu:Remove() - end - -end - ---- Removes the sub menus recursively of this MENU_COALITION. --- @param #MENU_COALITION self --- @return #MENU_COALITION self -function MENU_COALITION:Remove() - self:F( self.MenuPath ) - - self:RemoveSubMenus() - missionCommands.removeItemForCoalition( self.MenuCoalition, self.MenuPath ) - self.ParentMenu.Menus[self.MenuPath] = nil - - return nil -end - - ---- The MENU_COALITION_COMMAND class --- @type MENU_COALITION_COMMAND --- @extends Menu#MENU -MENU_COALITION_COMMAND = { - ClassName = "MENU_COALITION_COMMAND" -} - ---- Creates a new radio command item for a group --- @param #MENU_COALITION_COMMAND self --- @param DCSCoalition#coalition.side MenuCoalition The coalition owning the menu. --- @param MenuText The text for the menu. --- @param ParentMenu The parent menu. --- @param CommandMenuFunction A function that is called when the menu key is pressed. --- @param CommandMenuArgument An argument for the function. --- @return #MENU_COALITION_COMMAND self -function MENU_COALITION_COMMAND:New( MenuCoalition, MenuText, ParentMenu, CommandMenuFunction, CommandMenuArgument ) - - -- Arrange meta tables - - local MenuParentPath = {} - if ParentMenu ~= nil then - MenuParentPath = ParentMenu.MenuPath - end - - local self = BASE:Inherit( self, MENU:New( MenuText, MenuParentPath ) ) - - self.MenuCoalition = MenuCoalition - self.MenuParentPath = MenuParentPath - self.MenuText = MenuText - self.ParentMenu = ParentMenu - - self:T( { MenuParentPath, MenuText, CommandMenuFunction, CommandMenuArgument } ) - - self.MenuPath = missionCommands.addCommandForCoalition( self.MenuCoalition, MenuText, MenuParentPath, CommandMenuFunction, CommandMenuArgument ) - - self.CommandMenuFunction = CommandMenuFunction - self.CommandMenuArgument = CommandMenuArgument - - ParentMenu.Menus[self.MenuPath] = self - - return self -end - ---- Removes a radio command item for a coalition --- @param #MENU_COALITION_COMMAND self --- @return #MENU_COALITION_COMMAND self -function MENU_COALITION_COMMAND:Remove() - self:F( self.MenuPath ) - - missionCommands.removeItemForCoalition( self.MenuCoalition, self.MenuPath ) - self.ParentMenu.Menus[self.MenuPath] = nil - return nil -end ---- This module contains the GROUP class. --- --- 1) @{Group#GROUP} class, extends @{Base#BASE} --- ============================================= --- The @{Group#GROUP} class is a wrapper class to handle the DCS Group objects: --- --- * Support all DCS Group APIs. --- * Enhance with Group specific APIs not in the DCS Group API set. --- * Handle local Group Controller. --- * Manage the "state" of the DCS Group. --- --- **IMPORTANT: ONE SHOULD NEVER SANATIZE these GROUP OBJECT REFERENCES! (make the GROUP object references nil).** --- --- 1.1) GROUP reference methods --- ----------------------- --- For each DCS Group object alive within a running mission, a GROUP wrapper object (instance) will be created within the _@{DATABASE} object. --- This is done at the beginning of the mission (when the mission starts), and dynamically when new DCS Group objects are spawned (using the @{SPAWN} class). --- --- The GROUP class does not contain a :New() method, rather it provides :Find() methods to retrieve the object reference --- using the DCS Group or the DCS GroupName. --- --- Another thing to know is that GROUP objects do not "contain" the DCS Group object. --- The GROUP methods will reference the DCS Group object by name when it is needed during API execution. --- If the DCS Group object does not exist or is nil, the GROUP methods will return nil and log an exception in the DCS.log file. --- --- The GROUP class provides the following functions to retrieve quickly the relevant GROUP instance: --- --- * @{#GROUP.Find}(): Find a GROUP instance from the _DATABASE object using a DCS Group object. --- * @{#GROUP.FindByName}(): Find a GROUP instance from the _DATABASE object using a DCS Group name. --- --- 1.2) GROUP task methods --- ----------------------- --- Several group task methods are available that help you to prepare tasks. --- These methods return a string consisting of the task description, which can then be given to either a @{Group#GROUP.PushTask} or @{Group#SetTask} method to assign the task to the GROUP. --- Tasks are specific for the category of the GROUP, more specific, for AIR, GROUND or AIR and GROUND. --- Each task description where applicable indicates for which group category the task is valid. --- There are 2 main subdivisions of tasks: Assigned tasks and EnRoute tasks. --- --- ### 1.2.1) Assigned task methods --- --- Assigned task methods make the group execute the task where the location of the (possible) targets of the task are known before being detected. --- This is different from the EnRoute tasks, where the targets of the task need to be detected before the task can be executed. --- --- Find below a list of the **assigned task** methods: --- --- * @{#GROUP.TaskAttackGroup}: (AIR) Attack a Group. --- * @{#GROUP.TaskAttackMapObject}: (AIR) Attacking the map object (building, structure, e.t.c). --- * @{#GROUP.TaskAttackUnit}: (AIR) Attack the Unit. --- * @{#GROUP.TaskBombing}: (AIR) Delivering weapon at the point on the ground. --- * @{#GROUP.TaskBombingRunway}: (AIR) Delivering weapon on the runway. --- * @{#GROUP.TaskEmbarking}: (AIR) Move the group to a Vec2 Point, wait for a defined duration and embark a group. --- * @{#GROUP.TaskEmbarkToTransport}: (GROUND) Embark to a Transport landed at a location. --- * @{#GROUP.TaskEscort}: (AIR) Escort another airborne group. --- * @{#GROUP.TaskFAC_AttackGroup}: (AIR + GROUND) The task makes the group/unit a FAC and orders the FAC to control the target (enemy ground group) destruction. --- * @{#GROUP.TaskFireAtPoint}: (GROUND) Fire at a VEC2 point until ammunition is finished. --- * @{#GROUP.TaskFollow}: (AIR) Following another airborne group. --- * @{#GROUP.TaskHold}: (GROUND) Hold ground group from moving. --- * @{#GROUP.TaskHoldPosition}: (AIR) Hold position at the current position of the first unit of the group. --- * @{#GROUP.TaskLand}: (AIR HELICOPTER) Landing at the ground. For helicopters only. --- * @{#GROUP.TaskLandAtZone}: (AIR) Land the group at a @{Zone#ZONE_RADIUS). --- * @{#GROUP.TaskOrbitCircle}: (AIR) Orbit at the current position of the first unit of the group at a specified alititude. --- * @{#GROUP.TaskOrbitCircleAtVec2}: (AIR) Orbit at a specified position at a specified alititude during a specified duration with a specified speed. --- * @{#GROUP.TaskRefueling}: (AIR) Refueling from the nearest tanker. No parameters. --- * @{#GROUP.TaskRoute}: (AIR + GROUND) Return a Misson task to follow a given route defined by Points. --- * @{#GROUP.TaskRouteToVec2}: (AIR + GROUND) Make the Group move to a given point. --- * @{#GROUP.TaskRouteToVec3}: (AIR + GROUND) Make the Group move to a given point. --- * @{#GROUP.TaskRouteToZone}: (AIR + GROUND) Route the group to a given zone. --- --- ### 1.2.2) EnRoute task methods --- --- EnRoute tasks require the targets of the task need to be detected by the group (using its sensors) before the task can be executed: --- --- * @{#GROUP.EnRouteTaskAWACS}: (AIR) Aircraft will act as an AWACS for friendly units (will provide them with information about contacts). No parameters. --- * @{#GROUP.EnRouteTaskEngageGroup}: (AIR) Engaging a group. The task does not assign the target group to the unit/group to attack now; it just allows the unit/group to engage the target group as well as other assigned targets. --- * @{#GROUP.EnRouteTaskEngageTargets}: (AIR) Engaging targets of defined types. --- * @{#GROUP.EnRouteTaskEWR}: (AIR) Attack the Unit. --- * @{#GROUP.EnRouteTaskFAC}: (AIR + GROUND) The task makes the group/unit a FAC and lets the FAC to choose a targets (enemy ground group) around as well as other assigned targets. --- * @{#GROUP.EnRouteTaskFAC_EngageGroup}: (AIR + GROUND) The task makes the group/unit a FAC and lets the FAC to choose the target (enemy ground group) as well as other assigned targets. --- * @{#GROUP.EnRouteTaskTanker}: (AIR) Aircraft will act as a tanker for friendly units. No parameters. --- --- ### 1.2.3) Preparation task methods --- --- There are certain task methods that allow to tailor the task behaviour: --- --- * @{#GROUP.TaskWrappedAction}: Return a WrappedAction Task taking a Command. --- * @{#GROUP.TaskCombo}: Return a Combo Task taking an array of Tasks. --- * @{#GROUP.TaskCondition}: Return a condition section for a controlled task. --- * @{#GROUP.TaskControlled}: Return a Controlled Task taking a Task and a TaskCondition. --- --- ### 1.2.4) Obtain the mission from group templates --- --- Group templates contain complete mission descriptions. Sometimes you want to copy a complete mission from a group and assign it to another: --- --- * @{#GROUP.TaskMission}: (AIR + GROUND) Return a mission task from a mission template. --- --- 1.3) GROUP Command methods --- -------------------------- --- Group **command methods** prepare the execution of commands using the @{#GROUP.SetCommand} method: --- --- * @{#GROUP.CommandDoScript}: Do Script command. --- * @{#GROUP.CommandSwitchWayPoint}: Perform a switch waypoint command. --- --- 1.4) GROUP Option methods --- ------------------------- --- Group **Option methods** change the behaviour of the Group while being alive. --- --- ### 1.4.1) Rule of Engagement: --- --- * @{#GROUP.OptionROEWeaponFree} --- * @{#GROUP.OptionROEOpenFire} --- * @{#GROUP.OptionROEReturnFire} --- * @{#GROUP.OptionROEEvadeFire} --- --- To check whether an ROE option is valid for a specific group, use: --- --- * @{#GROUP.OptionROEWeaponFreePossible} --- * @{#GROUP.OptionROEOpenFirePossible} --- * @{#GROUP.OptionROEReturnFirePossible} --- * @{#GROUP.OptionROEEvadeFirePossible} --- --- ### 1.4.2) Rule on thread: --- --- * @{#GROUP.OptionROTNoReaction} --- * @{#GROUP.OptionROTPassiveDefense} --- * @{#GROUP.OptionROTEvadeFire} --- * @{#GROUP.OptionROTVertical} --- --- To test whether an ROT option is valid for a specific group, use: --- --- * @{#GROUP.OptionROTNoReactionPossible} --- * @{#GROUP.OptionROTPassiveDefensePossible} --- * @{#GROUP.OptionROTEvadeFirePossible} --- * @{#GROUP.OptionROTVerticalPossible} --- --- 1.5) GROUP Zone validation methods --- ---------------------------------- --- The group can be validated whether it is completely, partly or not within a @{Zone}. --- Use the following Zone validation methods on the group: --- --- * @{#GROUP.IsCompletelyInZone}: Returns true if all units of the group are within a @{Zone}. --- * @{#GROUP.IsPartlyInZone}: Returns true if some units of the group are within a @{Zone}. --- * @{#GROUP.IsNotInZone}: Returns true if none of the group units of the group are within a @{Zone}. --- --- The zone can be of any @{Zone} class derived from @{Zone#ZONE_BASE}. So, these methods are polymorphic to the zones tested on. --- --- @module Group --- @author FlightControl - ---- The GROUP class --- @type GROUP --- @extends Base#BASE --- @field DCSGroup#Group DCSGroup The DCS group class. --- @field #string GroupName The name of the group. -GROUP = { - ClassName = "GROUP", - GroupName = "", - GroupID = 0, - Controller = nil, - DCSGroup = nil, - WayPointFunctions = {}, -} - ---- A DCSGroup --- @type DCSGroup --- @field id_ The ID of the group in DCS - ---- Create a new GROUP from a DCSGroup --- @param #GROUP self --- @param DCSGroup#Group GroupName The DCS Group name --- @return #GROUP self -function GROUP:Register( GroupName ) - local self = BASE:Inherit( self, BASE:New() ) - self:F2( GroupName ) - self.GroupName = GroupName - return self -end - --- Reference methods. - ---- Find the GROUP wrapper class instance using the DCS Group. --- @param #GROUP self --- @param DCSGroup#Group DCSGroup The DCS Group. --- @return #GROUP The GROUP. -function GROUP:Find( DCSGroup ) - - local GroupName = DCSGroup:getName() -- Group#GROUP - local GroupFound = _DATABASE:FindGroup( GroupName ) - return GroupFound -end - ---- Find the created GROUP using the DCS Group Name. --- @param #GROUP self --- @param #string GroupName The DCS Group Name. --- @return #GROUP The GROUP. -function GROUP:FindByName( GroupName ) - - local GroupFound = _DATABASE:FindGroup( GroupName ) - return GroupFound -end - --- DCS Group methods support. - ---- Returns the DCS Group. --- @param #GROUP self --- @return DCSGroup#Group The DCS Group. -function GROUP:GetDCSGroup() - local DCSGroup = Group.getByName( self.GroupName ) - - if DCSGroup then - return DCSGroup - end - - return nil -end - - ---- Returns if the DCS Group is alive. --- When the group exists at run-time, this method will return true, otherwise false. --- @param #GROUP self --- @return #boolean true if the DCS Group is alive. -function GROUP:IsAlive() - self:F2( self.GroupName ) - - local DCSGroup = self:GetDCSGroup() - - if DCSGroup then - local GroupIsAlive = DCSGroup:isExist() - self:T3( GroupIsAlive ) - return GroupIsAlive - end - - return nil -end - ---- Destroys the DCS Group and all of its DCS Units. --- Note that this destroy method also raises a destroy event at run-time. --- So all event listeners will catch the destroy event of this DCS Group. --- @param #GROUP self -function GROUP:Destroy() - self:F2( self.GroupName ) - - local DCSGroup = self:GetDCSGroup() - - if DCSGroup then - for Index, UnitData in pairs( DCSGroup:getUnits() ) do - self:CreateEventCrash( timer.getTime(), UnitData ) - end - DCSGroup:destroy() - DCSGroup = nil - end - - return nil -end - ---- Returns category of the DCS Group. --- @param #GROUP self --- @return DCSGroup#Group.Category The category ID -function GROUP:GetCategory() - self:F2( self.GroupName ) - - local DCSGroup = self:GetDCSGroup() - if DCSGroup then - local GroupCategory = DCSGroup:getCategory() - self:T3( GroupCategory ) - return GroupCategory - end - - return nil -end - ---- Returns the category name of the DCS Group. --- @param #GROUP self --- @return #string Category name = Helicopter, Airplane, Ground Unit, Ship -function GROUP:GetCategoryName() - self:F2( self.GroupName ) - - local DCSGroup = self:GetDCSGroup() - if DCSGroup then - local CategoryNames = { - [Group.Category.AIRPLANE] = "Airplane", - [Group.Category.HELICOPTER] = "Helicopter", - [Group.Category.GROUND] = "Ground Unit", - [Group.Category.SHIP] = "Ship", - } - local GroupCategory = DCSGroup:getCategory() - self:T3( GroupCategory ) - - return CategoryNames[GroupCategory] - end - - return nil -end - - ---- Returns the coalition of the DCS Group. --- @param #GROUP self --- @return DCSCoalitionObject#coalition.side The coalition side of the DCS Group. -function GROUP:GetCoalition() - self:F2( self.GroupName ) - - local DCSGroup = self:GetDCSGroup() - if DCSGroup then - local GroupCoalition = DCSGroup:getCoalition() - self:T3( GroupCoalition ) - return GroupCoalition - end - - return nil -end - ---- Returns the country of the DCS Group. --- @param #GROUP self --- @return DCScountry#country.id The country identifier. --- @return #nil The DCS Group is not existing or alive. -function GROUP:GetCountry() - self:F2( self.GroupName ) - - local DCSGroup = self:GetDCSGroup() - if DCSGroup then - local GroupCountry = DCSGroup:getUnit(1):getCountry() - self:T3( GroupCountry ) - return GroupCountry - end - - return nil -end - ---- Returns the name of the DCS Group. --- @param #GROUP self --- @return #string The DCS Group name. -function GROUP:GetName() - self:F2( self.GroupName ) - - local DCSGroup = self:GetDCSGroup() - - if DCSGroup then - local GroupName = DCSGroup:getName() - self:T3( GroupName ) - return GroupName - end - - return nil -end - ---- Returns the DCS Group identifier. --- @param #GROUP self --- @return #number The identifier of the DCS Group. -function GROUP:GetID() - self:F2( self.GroupName ) - - local DCSGroup = self:GetDCSGroup() - - if DCSGroup then - local GroupID = DCSGroup:getID() - self:T3( GroupID ) - return GroupID - end - - return nil -end - ---- Returns the UNIT wrapper class with number UnitNumber. --- If the underlying DCS Unit does not exist, the method will return nil. . --- @param #GROUP self --- @param #number UnitNumber The number of the UNIT wrapper class to be returned. --- @return Unit#UNIT The UNIT wrapper class. -function GROUP:GetUnit( UnitNumber ) - self:F2( { self.GroupName, UnitNumber } ) - - local DCSGroup = self:GetDCSGroup() - - if DCSGroup then - local UnitFound = UNIT:Find( DCSGroup:getUnit( UnitNumber ) ) - self:T3( UnitFound.UnitName ) - self:T2( UnitFound ) - return UnitFound - end - - return nil -end - ---- Returns the DCS Unit with number UnitNumber. --- If the underlying DCS Unit does not exist, the method will return nil. . --- @param #GROUP self --- @param #number UnitNumber The number of the DCS Unit to be returned. --- @return DCSUnit#Unit The DCS Unit. -function GROUP:GetDCSUnit( UnitNumber ) - self:F2( { self.GroupName, UnitNumber } ) - - local DCSGroup = self:GetDCSGroup() - - if DCSGroup then - local DCSUnitFound = DCSGroup:getUnit( UnitNumber ) - self:T3( DCSUnitFound ) - return DCSUnitFound - end - - return nil -end - ---- Returns current size of the DCS Group. --- If some of the DCS Units of the DCS Group are destroyed the size of the DCS Group is changed. --- @param #GROUP self --- @return #number The DCS Group size. -function GROUP:GetSize() - self:F2( { self.GroupName } ) - local DCSGroup = self:GetDCSGroup() - - if DCSGroup then - local GroupSize = DCSGroup:getSize() - self:T3( GroupSize ) - return GroupSize - end - - return nil -end - ---- ---- Returns the initial size of the DCS Group. --- If some of the DCS Units of the DCS Group are destroyed, the initial size of the DCS Group is unchanged. --- @param #GROUP self --- @return #number The DCS Group initial size. -function GROUP:GetInitialSize() - self:F2( { self.GroupName } ) - local DCSGroup = self:GetDCSGroup() - - if DCSGroup then - local GroupInitialSize = DCSGroup:getInitialSize() - self:T3( GroupInitialSize ) - return GroupInitialSize - end - - return nil -end - ---- Returns the UNITs wrappers of the DCS Units of the DCS Group. --- @param #GROUP self --- @return #table The UNITs wrappers. -function GROUP:GetUnits() - self:F2( { self.GroupName } ) - local DCSGroup = self:GetDCSGroup() - - if DCSGroup then - local DCSUnits = DCSGroup:getUnits() - local Units = {} - for Index, UnitData in pairs( DCSUnits ) do - Units[#Units+1] = UNIT:Find( UnitData ) - end - self:T3( Units ) - return Units - end - - return nil -end - - ---- Returns the DCS Units of the DCS Group. --- @param #GROUP self --- @return #table The DCS Units. -function GROUP:GetDCSUnits() - self:F2( { self.GroupName } ) - local DCSGroup = self:GetDCSGroup() - - if DCSGroup then - local DCSUnits = DCSGroup:getUnits() - self:T3( DCSUnits ) - return DCSUnits - end - - return nil -end - ---- Get the controller for the GROUP. --- @param #GROUP self --- @return DCSController#Controller -function GROUP:_GetController() - self:F2( { self.GroupName } ) - local DCSGroup = self:GetDCSGroup() - - if DCSGroup then - local GroupController = DCSGroup:getController() - self:T3( GroupController ) - return GroupController - end - - return nil -end - - ---- Retrieve the group mission and allow to place function hooks within the mission waypoint plan. --- Use the method @{Group#GROUP:WayPointFunction} to define the hook functions for specific waypoints. --- Use the method @{Group@GROUP:WayPointExecute) to start the execution of the new mission plan. --- Note that when WayPointInitialize is called, the Mission of the group is RESTARTED! --- @param #GROUP self --- @return #GROUP -function GROUP:WayPointInitialize() - - self.WayPoints = self:GetTaskRoute() - - return self -end - - ---- Registers a waypoint function that will be executed when the group moves over the WayPoint. --- @param #GROUP self --- @param #number WayPoint The waypoint number. Note that the start waypoint on the route is WayPoint 1! --- @param #number WayPointIndex When defining multiple WayPoint functions for one WayPoint, use WayPointIndex to set the sequence of actions. --- @param #function WayPointFunction The waypoint function to be called when the group moves over the waypoint. The waypoint function takes variable parameters. --- @return #GROUP -function GROUP:WayPointFunction( WayPoint, WayPointIndex, WayPointFunction, ... ) - self:F2( { WayPoint, WayPointIndex, WayPointFunction } ) - - table.insert( self.WayPoints[WayPoint].task.params.tasks, WayPointIndex ) - self.WayPoints[WayPoint].task.params.tasks[WayPointIndex] = self:TaskFunction( WayPoint, WayPointIndex, WayPointFunction, arg ) - return self -end - - -function GROUP:TaskFunction( WayPoint, WayPointIndex, FunctionString, FunctionArguments ) - - local DCSTask - - local DCSScript = {} - DCSScript[#DCSScript+1] = "local MissionGroup = GROUP:Find( ... ) " - - if FunctionArguments.n > 0 then - DCSScript[#DCSScript+1] = FunctionString .. "( MissionGroup, " .. table.concat( FunctionArguments, "," ) .. ")" - else - DCSScript[#DCSScript+1] = FunctionString .. "( MissionGroup )" - end - - DCSTask = self:TaskWrappedAction( - self:CommandDoScript( - table.concat( DCSScript ) - ), WayPointIndex - ) - - self:T3( DCSTask ) - - return DCSTask - -end - - - ---- Executes the WayPoint plan. --- The function gets a WayPoint parameter, that you can use to restart the mission at a specific WayPoint. --- Note that when the WayPoint parameter is used, the new start mission waypoint of the group will be 1! --- @param #GROUP self --- @param #number WayPoint The WayPoint from where to execute the mission. --- @param #number WaitTime The amount seconds to wait before initiating the mission. --- @return #GROUP -function GROUP:WayPointExecute( WayPoint, WaitTime ) - - if not WayPoint then - WayPoint = 1 - end - - -- When starting the mission from a certain point, the TaskPoints need to be deleted before the given WayPoint. - for TaskPointID = 1, WayPoint - 1 do - table.remove( self.WayPoints, 1 ) - end - - self:T3( self.WayPoints ) - - self:SetTask( self:TaskRoute( self.WayPoints ), WaitTime ) - - return self -end - - ---- Activates a GROUP. --- @param #GROUP self -function GROUP:Activate() - self:F2( { self.GroupName } ) - trigger.action.activateGroup( self:GetDCSGroup() ) - return self:GetDCSGroup() -end - - ---- Gets the type name of the group. --- @param #GROUP self --- @return #string The type name of the group. -function GROUP:GetTypeName() - self:F2( self.GroupName ) - - local DCSGroup = self:GetDCSGroup() - - if DCSGroup then - local GroupTypeName = DCSGroup:getUnit(1):getTypeName() - self:T3( GroupTypeName ) - return( GroupTypeName ) - end - - return nil -end - ---- Gets the CallSign of the first DCS Unit of the DCS Group. --- @param #GROUP self --- @return #string The CallSign of the first DCS Unit of the DCS Group. -function GROUP:GetCallsign() - self:F2( self.GroupName ) - - local DCSGroup = self:GetDCSGroup() - - if DCSGroup then - local GroupCallSign = DCSGroup:getUnit(1):getCallsign() - self:T3( GroupCallSign ) - return GroupCallSign - end - - return nil -end - ---- Returns the current point (Vec2 vector) of the first DCS Unit in the DCS Group. --- @return DCSTypes#Vec2 Current Vec2 point of the first DCS Unit of the DCS Group. -function GROUP:GetPointVec2() - self:F2( self.GroupName ) - - local GroupPointVec2 = self:GetUnit(1):GetPointVec2() - self:T3( GroupPointVec2 ) - return GroupPointVec2 -end - ---- Returns the current point (Vec3 vector) of the first DCS Unit in the DCS Group. --- @return DCSTypes#Vec3 Current Vec3 point of the first DCS Unit of the DCS Group. -function GROUP:GetPointVec3() - self:F2( self.GroupName ) - - local GroupPointVec3 = self:GetUnit(1):GetPointVec3() - self:T3( GroupPointVec3 ) - return GroupPointVec3 -end - - - --- Is Zone Functions - ---- Returns true if all units of the group are within a @{Zone}. --- @param #GROUP self --- @param Zone#ZONE_BASE Zone The zone to test. --- @return #boolean Returns true if the Group is completely within the @{Zone#ZONE_BASE} -function GROUP:IsCompletelyInZone( Zone ) - self:F2( { self.GroupName, Zone } ) - - for UnitID, UnitData in pairs( self:GetUnits() ) do - local Unit = UnitData -- Unit#UNIT - if Zone:IsPointVec3InZone( Unit:GetPointVec3() ) then - else - return false - end - end - - return true -end - ---- Returns true if some units of the group are within a @{Zone}. --- @param #GROUP self --- @param Zone#ZONE_BASE Zone The zone to test. --- @return #boolean Returns true if the Group is completely within the @{Zone#ZONE_BASE} -function GROUP:IsPartlyInZone( Zone ) - self:F2( { self.GroupName, Zone } ) - - for UnitID, UnitData in pairs( self:GetUnits() ) do - local Unit = UnitData -- Unit#UNIT - if Zone:IsPointVec3InZone( Unit:GetPointVec3() ) then - return true - end - end - - return false -end - ---- Returns true if none of the group units of the group are within a @{Zone}. --- @param #GROUP self --- @param Zone#ZONE_BASE Zone The zone to test. --- @return #boolean Returns true if the Group is completely within the @{Zone#ZONE_BASE} -function GROUP:IsNotInZone( Zone ) - self:F2( { self.GroupName, Zone } ) - - for UnitID, UnitData in pairs( self:GetUnits() ) do - local Unit = UnitData -- Unit#UNIT - if Zone:IsPointVec3InZone( Unit:GetPointVec3() ) then - return false - end - end - - return true -end - ---- Returns if the group is of an air category. --- If the group is a helicopter or a plane, then this method will return true, otherwise false. --- @param #GROUP self --- @return #boolean Air category evaluation result. -function GROUP:IsAir() - self:F2( self.GroupName ) - - local DCSGroup = self:GetDCSGroup() - - if DCSGroup then - local IsAirResult = DCSGroup:getCategory() == Group.Category.AIRPLANE or DCSGroup:getCategory() == Group.Category.HELICOPTER - self:T3( IsAirResult ) - return IsAirResult - end - - return nil -end - ---- Returns if the DCS Group contains Helicopters. --- @param #GROUP self --- @return #boolean true if DCS Group contains Helicopters. -function GROUP:IsHelicopter() - self:F2( self.GroupName ) - - local DCSGroup = self:GetDCSGroup() - - if DCSGroup then - local GroupCategory = DCSGroup:getCategory() - self:T2( GroupCategory ) - return GroupCategory == Group.Category.HELICOPTER - end - - return nil -end - ---- Returns if the DCS Group contains AirPlanes. --- @param #GROUP self --- @return #boolean true if DCS Group contains AirPlanes. -function GROUP:IsAirPlane() - self:F2() - - local DCSGroup = self:GetDCSGroup() - - if DCSGroup then - local GroupCategory = DCSGroup:getCategory() - self:T2( GroupCategory ) - return GroupCategory == Group.Category.AIRPLANE - end - - return nil -end - ---- Returns if the DCS Group contains Ground troops. --- @param #GROUP self --- @return #boolean true if DCS Group contains Ground troops. -function GROUP:IsGround() - self:F2() - - local DCSGroup = self:GetDCSGroup() - - if DCSGroup then - local GroupCategory = DCSGroup:getCategory() - self:T2( GroupCategory ) - return GroupCategory == Group.Category.GROUND - end - - return nil -end - ---- Returns if the DCS Group contains Ships. --- @param #GROUP self --- @return #boolean true if DCS Group contains Ships. -function GROUP:IsShip() - self:F2() - - local DCSGroup = self:GetDCSGroup() - - if DCSGroup then - local GroupCategory = DCSGroup:getCategory() - self:T2( GroupCategory ) - return GroupCategory == Group.Category.SHIP - end - - return nil -end - ---- Returns if all units of the group are on the ground or landed. --- If all units of this group are on the ground, this function will return true, otherwise false. --- @param #GROUP self --- @return #boolean All units on the ground result. -function GROUP:AllOnGround() - self:F2() - - local DCSGroup = self:GetDCSGroup() - - if DCSGroup then - local AllOnGroundResult = true - - for Index, UnitData in pairs( DCSGroup:getUnits() ) do - if UnitData:inAir() then - AllOnGroundResult = false - end - end - - self:T3( AllOnGroundResult ) - return AllOnGroundResult - end - - return nil -end - ---- Returns the current maximum velocity of the group. --- Each unit within the group gets evaluated, and the maximum velocity (= the unit which is going the fastest) is returned. --- @param #GROUP self --- @return #number Maximum velocity found. -function GROUP:GetMaxVelocity() - self:F2() - - local DCSGroup = self:GetDCSGroup() - - if DCSGroup then - local MaxVelocity = 0 - - for Index, UnitData in pairs( DCSGroup:getUnits() ) do - - local Velocity = UnitData:getVelocity() - local VelocityTotal = math.abs( Velocity.x ) + math.abs( Velocity.y ) + math.abs( Velocity.z ) - - if VelocityTotal < MaxVelocity then - MaxVelocity = VelocityTotal - end - end - - return MaxVelocity - end - - return nil -end - ---- Returns the current minimum height of the group. --- Each unit within the group gets evaluated, and the minimum height (= the unit which is the lowest elevated) is returned. --- @param #GROUP self --- @return #number Minimum height found. -function GROUP:GetMinHeight() - self:F2() - -end - ---- Returns the current maximum height of the group. --- Each unit within the group gets evaluated, and the maximum height (= the unit which is the highest elevated) is returned. --- @param #GROUP self --- @return #number Maximum height found. -function GROUP:GetMaxHeight() - self:F2() - -end - --- Tasks - ---- Popping current Task from the group. --- @param #GROUP self --- @return Group#GROUP self -function GROUP:PopCurrentTask() - self:F2() - - local DCSGroup = self:GetDCSGroup() - - if DCSGroup then - local Controller = self:_GetController() - Controller:popTask() - return self - end - - return nil -end - ---- Pushing Task on the queue from the group. --- @param #GROUP self --- @return Group#GROUP self -function GROUP:PushTask( DCSTask, WaitTime ) - self:F2() - - local DCSGroup = self:GetDCSGroup() - - if DCSGroup then - local Controller = self:_GetController() - - -- When a group SPAWNs, it takes about a second to get the group in the simulator. Setting tasks to unspawned groups provides unexpected results. - -- Therefore we schedule the functions to set the mission and options for the Group. - -- Controller:pushTask( DCSTask ) - - if WaitTime then - --routines.scheduleFunction( Controller.pushTask, { Controller, DCSTask }, timer.getTime() + WaitTime ) - SCHEDULER:New( Controller, Controller.pushTask, { DCSTask }, WaitTime ) - else - Controller:pushTask( DCSTask ) - end - - return self - end - - return nil -end - ---- Clearing the Task Queue and Setting the Task on the queue from the group. --- @param #GROUP self --- @return Group#GROUP self -function GROUP:SetTask( DCSTask, WaitTime ) - self:F2( { DCSTask } ) - - local DCSGroup = self:GetDCSGroup() - - if DCSGroup then - - local Controller = self:_GetController() - - -- When a group SPAWNs, it takes about a second to get the group in the simulator. Setting tasks to unspawned groups provides unexpected results. - -- Therefore we schedule the functions to set the mission and options for the Group. - -- Controller.setTask( Controller, DCSTask ) - - if not WaitTime then - WaitTime = 1 - end - --routines.scheduleFunction( Controller.setTask, { Controller, DCSTask }, timer.getTime() + WaitTime ) - SCHEDULER:New( Controller, Controller.setTask, { DCSTask }, WaitTime ) - - return self - end - - return nil -end - - ---- Return a condition section for a controlled task. --- @param #GROUP self --- @param DCSTime#Time time --- @param #string userFlag --- @param #boolean userFlagValue --- @param #string condition --- @param DCSTime#Time duration --- @param #number lastWayPoint --- return DCSTask#Task -function GROUP:TaskCondition( time, userFlag, userFlagValue, condition, duration, lastWayPoint ) - self:F2( { time, userFlag, userFlagValue, condition, duration, lastWayPoint } ) - - local DCSStopCondition = {} - DCSStopCondition.time = time - DCSStopCondition.userFlag = userFlag - DCSStopCondition.userFlagValue = userFlagValue - DCSStopCondition.condition = condition - DCSStopCondition.duration = duration - DCSStopCondition.lastWayPoint = lastWayPoint - - self:T3( { DCSStopCondition } ) - return DCSStopCondition -end - ---- Return a Controlled Task taking a Task and a TaskCondition. --- @param #GROUP self --- @param DCSTask#Task DCSTask --- @param #DCSStopCondition DCSStopCondition --- @return DCSTask#Task -function GROUP:TaskControlled( DCSTask, DCSStopCondition ) - self:F2( { DCSTask, DCSStopCondition } ) - - local DCSTaskControlled - - DCSTaskControlled = { - id = 'ControlledTask', - params = { - task = DCSTask, - stopCondition = DCSStopCondition - } - } - - self:T3( { DCSTaskControlled } ) - return DCSTaskControlled -end - ---- Return a Combo Task taking an array of Tasks. --- @param #GROUP self --- @param DCSTask#TaskArray DCSTasks Array of @{DCSTask#Task} --- @return DCSTask#Task -function GROUP:TaskCombo( DCSTasks ) - self:F2( { DCSTasks } ) - - local DCSTaskCombo - - DCSTaskCombo = { - id = 'ComboTask', - params = { - tasks = DCSTasks - } - } - - self:T3( { DCSTaskCombo } ) - return DCSTaskCombo -end - ---- Return a WrappedAction Task taking a Command. --- @param #GROUP self --- @param DCSCommand#Command DCSCommand --- @return DCSTask#Task -function GROUP:TaskWrappedAction( DCSCommand, Index ) - self:F2( { DCSCommand } ) - - local DCSTaskWrappedAction - - DCSTaskWrappedAction = { - id = "WrappedAction", - enabled = true, - number = Index, - auto = false, - params = { - action = DCSCommand, - }, - } - - self:T3( { DCSTaskWrappedAction } ) - return DCSTaskWrappedAction -end - ---- Executes a command action --- @param #GROUP self --- @param DCSCommand#Command DCSCommand --- @return #GROUP self -function GROUP:SetCommand( DCSCommand ) - self:F2( DCSCommand ) - - local DCSGroup = self:GetDCSGroup() - - if DCSGroup then - local Controller = self:_GetController() - Controller:setCommand( DCSCommand ) - return self - end - - return nil -end - ---- Perform a switch waypoint command --- @param #GROUP self --- @param #number FromWayPoint --- @param #number ToWayPoint --- @return DCSTask#Task -function GROUP:CommandSwitchWayPoint( FromWayPoint, ToWayPoint, Index ) - self:F2( { FromWayPoint, ToWayPoint, Index } ) - - local CommandSwitchWayPoint = { - id = 'SwitchWaypoint', - params = { - fromWaypointIndex = FromWayPoint, - goToWaypointIndex = ToWayPoint, - }, - } - - self:T3( { CommandSwitchWayPoint } ) - return CommandSwitchWayPoint -end - - --- TASKS FOR AIR GROUPS - - ---- (AIR) Attack a Group. --- @param #GROUP self --- @param Group#GROUP AttackGroup The Group to be attacked. --- @param #number WeaponType (optional) Bitmask of weapon types those allowed to use. If parameter is not defined that means no limits on weapon usage. --- @param DCSTypes#AI.Task.WeaponExpend WeaponExpend (optional) Determines how much weapon will be released at each attack. If parameter is not defined the unit / group will choose expend on its own discretion. --- @param #number AttackQty (optional) This parameter limits maximal quantity of attack. The aicraft/group will not make more attack than allowed even if the target group not destroyed and the aicraft/group still have ammo. If not defined the aircraft/group will attack target until it will be destroyed or until the aircraft/group will run out of ammo. --- @param DCSTypes#Azimuth Direction (optional) Desired ingress direction from the target to the attacking aircraft. Group/aircraft will make its attacks from the direction. Of course if there is no way to attack from the direction due the terrain group/aircraft will choose another direction. --- @param DCSTypes#Distance Altitude (optional) Desired attack start altitude. Group/aircraft will make its attacks from the altitude. If the altitude is too low or too high to use weapon aircraft/group will choose closest altitude to the desired attack start altitude. If the desired altitude is defined group/aircraft will not attack from safe altitude. --- @param #boolean AttackQtyLimit (optional) The flag determines how to interpret attackQty parameter. If the flag is true then attackQty is a limit on maximal attack quantity for "AttackGroup" and "AttackUnit" tasks. If the flag is false then attackQty is a desired attack quantity for "Bombing" and "BombingRunway" tasks. --- @return DCSTask#Task The DCS task structure. -function GROUP:TaskAttackGroup( AttackGroup, WeaponType, WeaponExpend, AttackQty, Direction, Altitude, AttackQtyLimit ) - self:F2( { self.GroupName, AttackGroup, WeaponType, WeaponExpend, AttackQty, Direction, Altitude, AttackQtyLimit } ) - - -- AttackGroup = { - -- id = 'AttackGroup', - -- params = { - -- groupId = Group.ID, - -- weaponType = number, - -- expend = enum AI.Task.WeaponExpend, - -- attackQty = number, - -- directionEnabled = boolean, - -- direction = Azimuth, - -- altitudeEnabled = boolean, - -- altitude = Distance, - -- attackQtyLimit = boolean, - -- } - -- } - - local DirectionEnabled = nil - if Direction then - DirectionEnabled = true - end - - local AltitudeEnabled = nil - if Altitude then - AltitudeEnabled = true - end - - local DCSTask - DCSTask = { id = 'AttackGroup', - params = { - groupId = AttackGroup:GetID(), - weaponType = WeaponType, - expend = WeaponExpend, - attackQty = AttackQty, - directionEnabled = DirectionEnabled, - direction = Direction, - altitudeEnabled = AltitudeEnabled, - altitude = Altitude, - attackQtyLimit = AttackQtyLimit, - }, - }, - - self:T3( { DCSTask } ) - return DCSTask -end - - ---- (AIR) Attack the Unit. --- @param #GROUP self --- @param Unit#UNIT AttackUnit The unit. --- @param #number WeaponType (optional) Bitmask of weapon types those allowed to use. If parameter is not defined that means no limits on weapon usage. --- @param DCSTypes#AI.Task.WeaponExpend WeaponExpend (optional) Determines how much weapon will be released at each attack. If parameter is not defined the unit / group will choose expend on its own discretion. --- @param #number AttackQty (optional) This parameter limits maximal quantity of attack. The aicraft/group will not make more attack than allowed even if the target group not destroyed and the aicraft/group still have ammo. If not defined the aircraft/group will attack target until it will be destroyed or until the aircraft/group will run out of ammo. --- @param DCSTypes#Azimuth Direction (optional) Desired ingress direction from the target to the attacking aircraft. Group/aircraft will make its attacks from the direction. Of course if there is no way to attack from the direction due the terrain group/aircraft will choose another direction. --- @param #boolean AttackQtyLimit (optional) The flag determines how to interpret attackQty parameter. If the flag is true then attackQty is a limit on maximal attack quantity for "AttackGroup" and "AttackUnit" tasks. If the flag is false then attackQty is a desired attack quantity for "Bombing" and "BombingRunway" tasks. --- @param #boolean GroupAttack (optional) Flag indicates that the target must be engaged by all aircrafts of the group. Has effect only if the task is assigned to a group, not to a single aircraft. --- @return DCSTask#Task The DCS task structure. -function GROUP:TaskAttackUnit( AttackUnit, WeaponType, WeaponExpend, AttackQty, Direction, AttackQtyLimit, GroupAttack ) - self:F2( { self.GroupName, AttackUnit, WeaponType, WeaponExpend, AttackQty, Direction, AttackQtyLimit, GroupAttack } ) - - -- AttackUnit = { - -- id = 'AttackUnit', - -- params = { - -- unitId = Unit.ID, - -- weaponType = number, - -- expend = enum AI.Task.WeaponExpend - -- attackQty = number, - -- direction = Azimuth, - -- attackQtyLimit = boolean, - -- groupAttack = boolean, - -- } - -- } - - local DCSTask - DCSTask = { id = 'AttackUnit', - params = { - unitId = AttackUnit:GetID(), - weaponType = WeaponType, - expend = WeaponExpend, - attackQty = AttackQty, - direction = Direction, - attackQtyLimit = AttackQtyLimit, - groupAttack = GroupAttack, - }, - }, - - self:T3( { DCSTask } ) - return DCSTask -end - - ---- (AIR) Delivering weapon at the point on the ground. --- @param #GROUP self --- @param DCSTypes#Vec2 PointVec2 2D-coordinates of the point to deliver weapon at. --- @param #number WeaponType (optional) Bitmask of weapon types those allowed to use. If parameter is not defined that means no limits on weapon usage. --- @param DCSTypes#AI.Task.WeaponExpend WeaponExpend (optional) Determines how much weapon will be released at each attack. If parameter is not defined the unit / group will choose expend on its own discretion. --- @param #number AttackQty (optional) Desired quantity of passes. The parameter is not the same in AttackGroup and AttackUnit tasks. --- @param DCSTypes#Azimuth Direction (optional) Desired ingress direction from the target to the attacking aircraft. Group/aircraft will make its attacks from the direction. Of course if there is no way to attack from the direction due the terrain group/aircraft will choose another direction. --- @param #boolean GroupAttack (optional) Flag indicates that the target must be engaged by all aircrafts of the group. Has effect only if the task is assigned to a group, not to a single aircraft. --- @return DCSTask#Task The DCS task structure. -function GROUP:TaskBombing( PointVec2, WeaponType, WeaponExpend, AttackQty, Direction, GroupAttack ) - self:F2( { self.GroupName, PointVec2, WeaponType, WeaponExpend, AttackQty, Direction, GroupAttack } ) - --- Bombing = { --- id = 'Bombing', --- params = { --- point = Vec2, --- weaponType = number, --- expend = enum AI.Task.WeaponExpend, --- attackQty = number, --- direction = Azimuth, --- groupAttack = boolean, --- } --- } - - local DCSTask - DCSTask = { id = 'Bombing', - params = { - point = PointVec2, - weaponType = WeaponType, - expend = WeaponExpend, - attackQty = AttackQty, - direction = Direction, - groupAttack = GroupAttack, - }, - }, - - self:T3( { DCSTask } ) - return DCSTask -end - ---- (AIR) Orbit at a specified position at a specified alititude during a specified duration with a specified speed. --- @param #GROUP self --- @param DCSTypes#Vec2 Point The point to hold the position. --- @param #number Altitude The altitude to hold the position. --- @param #number Speed The speed flying when holding the position. --- @return #GROUP self -function GROUP:TaskOrbitCircleAtVec2( Point, Altitude, Speed ) - self:F2( { self.GroupName, Point, Altitude, Speed } ) - - -- pattern = enum AI.Task.OribtPattern, - -- point = Vec2, - -- point2 = Vec2, - -- speed = Distance, - -- altitude = Distance - - local LandHeight = land.getHeight( Point ) - - self:T3( { LandHeight } ) - - local DCSTask = { id = 'Orbit', - params = { pattern = AI.Task.OrbitPattern.CIRCLE, - point = Point, - speed = Speed, - altitude = Altitude + LandHeight - } - } - - - -- local AITask = { id = 'ControlledTask', - -- params = { task = { id = 'Orbit', - -- params = { pattern = AI.Task.OrbitPattern.CIRCLE, - -- point = Point, - -- speed = Speed, - -- altitude = Altitude + LandHeight - -- } - -- }, - -- stopCondition = { duration = Duration - -- } - -- } - -- } - -- ) - - return DCSTask -end - ---- (AIR) Orbit at the current position of the first unit of the group at a specified alititude. --- @param #GROUP self --- @param #number Altitude The altitude to hold the position. --- @param #number Speed The speed flying when holding the position. --- @return #GROUP self -function GROUP:TaskOrbitCircle( Altitude, Speed ) - self:F2( { self.GroupName, Altitude, Speed } ) - - local DCSGroup = self:GetDCSGroup() - - if DCSGroup then - local GroupPoint = self:GetPointVec2() - return self:TaskOrbitCircleAtVec2( GroupPoint, Altitude, Speed ) - end - - return nil -end - - - ---- (AIR) Hold position at the current position of the first unit of the group. --- @param #GROUP self --- @param #number Duration The maximum duration in seconds to hold the position. --- @return #GROUP self -function GROUP:TaskHoldPosition() - self:F2( { self.GroupName } ) - - return self:TaskOrbitCircle( 30, 10 ) -end - - - - ---- (AIR) Attacking the map object (building, structure, e.t.c). --- @param #GROUP self --- @param DCSTypes#Vec2 PointVec2 2D-coordinates of the point the map object is closest to. The distance between the point and the map object must not be greater than 2000 meters. Object id is not used here because Mission Editor doesn't support map object identificators. --- @param #number WeaponType (optional) Bitmask of weapon types those allowed to use. If parameter is not defined that means no limits on weapon usage. --- @param DCSTypes#AI.Task.WeaponExpend WeaponExpend (optional) Determines how much weapon will be released at each attack. If parameter is not defined the unit / group will choose expend on its own discretion. --- @param #number AttackQty (optional) This parameter limits maximal quantity of attack. The aicraft/group will not make more attack than allowed even if the target group not destroyed and the aicraft/group still have ammo. If not defined the aircraft/group will attack target until it will be destroyed or until the aircraft/group will run out of ammo. --- @param DCSTypes#Azimuth Direction (optional) Desired ingress direction from the target to the attacking aircraft. Group/aircraft will make its attacks from the direction. Of course if there is no way to attack from the direction due the terrain group/aircraft will choose another direction. --- @param #boolean GroupAttack (optional) Flag indicates that the target must be engaged by all aircrafts of the group. Has effect only if the task is assigned to a group, not to a single aircraft. --- @return DCSTask#Task The DCS task structure. -function GROUP:TaskAttackMapObject( PointVec2, WeaponType, WeaponExpend, AttackQty, Direction, GroupAttack ) - self:F2( { self.GroupName, PointVec2, WeaponType, WeaponExpend, AttackQty, Direction, GroupAttack } ) - --- AttackMapObject = { --- id = 'AttackMapObject', --- params = { --- point = Vec2, --- weaponType = number, --- expend = enum AI.Task.WeaponExpend, --- attackQty = number, --- direction = Azimuth, --- groupAttack = boolean, --- } --- } - - local DCSTask - DCSTask = { id = 'AttackMapObject', - params = { - point = PointVec2, - weaponType = WeaponType, - expend = WeaponExpend, - attackQty = AttackQty, - direction = Direction, - groupAttack = GroupAttack, - }, - }, - - self:T3( { DCSTask } ) - return DCSTask -end - - ---- (AIR) Delivering weapon on the runway. --- @param #GROUP self --- @param Airbase#AIRBASE Airbase Airbase to attack. --- @param #number WeaponType (optional) Bitmask of weapon types those allowed to use. If parameter is not defined that means no limits on weapon usage. --- @param DCSTypes#AI.Task.WeaponExpend WeaponExpend (optional) Determines how much weapon will be released at each attack. If parameter is not defined the unit / group will choose expend on its own discretion. --- @param #number AttackQty (optional) This parameter limits maximal quantity of attack. The aicraft/group will not make more attack than allowed even if the target group not destroyed and the aicraft/group still have ammo. If not defined the aircraft/group will attack target until it will be destroyed or until the aircraft/group will run out of ammo. --- @param DCSTypes#Azimuth Direction (optional) Desired ingress direction from the target to the attacking aircraft. Group/aircraft will make its attacks from the direction. Of course if there is no way to attack from the direction due the terrain group/aircraft will choose another direction. --- @param #boolean GroupAttack (optional) Flag indicates that the target must be engaged by all aircrafts of the group. Has effect only if the task is assigned to a group, not to a single aircraft. --- @return DCSTask#Task The DCS task structure. -function GROUP:TaskBombingRunway( Airbase, WeaponType, WeaponExpend, AttackQty, Direction, GroupAttack ) - self:F2( { self.GroupName, Airbase, WeaponType, WeaponExpend, AttackQty, Direction, GroupAttack } ) - --- BombingRunway = { --- id = 'BombingRunway', --- params = { --- runwayId = AirdromeId, --- weaponType = number, --- expend = enum AI.Task.WeaponExpend, --- attackQty = number, --- direction = Azimuth, --- groupAttack = boolean, --- } --- } - - local DCSTask - DCSTask = { id = 'BombingRunway', - params = { - point = Airbase:GetID(), - weaponType = WeaponType, - expend = WeaponExpend, - attackQty = AttackQty, - direction = Direction, - groupAttack = GroupAttack, - }, - }, - - self:T3( { DCSTask } ) - return DCSTask -end - - ---- (AIR) Refueling from the nearest tanker. No parameters. --- @param #GROUP self --- @return DCSTask#Task The DCS task structure. -function GROUP:TaskRefueling() - self:F2( { self.GroupName } ) - --- Refueling = { --- id = 'Refueling', --- params = {} --- } - - local DCSTask - DCSTask = { id = 'Refueling', - params = { - }, - }, - - self:T3( { DCSTask } ) - return DCSTask -end - - ---- (AIR HELICOPTER) Landing at the ground. For helicopters only. --- @param #GROUP self --- @param DCSTypes#Vec2 Point The point where to land. --- @param #number Duration The duration in seconds to stay on the ground. --- @return #GROUP self -function GROUP:TaskLandAtVec2( Point, Duration ) - self:F2( { self.GroupName, Point, Duration } ) - --- Land = { --- id= 'Land', --- params = { --- point = Vec2, --- durationFlag = boolean, --- duration = Time --- } --- } - - local DCSTask - if Duration and Duration > 0 then - DCSTask = { id = 'Land', - params = { - point = Point, - durationFlag = true, - duration = Duration, - }, - } - else - DCSTask = { id = 'Land', - params = { - point = Point, - durationFlag = false, - }, - } - end - - self:T3( DCSTask ) - return DCSTask -end - ---- (AIR) Land the group at a @{Zone#ZONE_RADIUS). --- @param #GROUP self --- @param Zone#ZONE Zone The zone where to land. --- @param #number Duration The duration in seconds to stay on the ground. --- @return #GROUP self -function GROUP:TaskLandAtZone( Zone, Duration, RandomPoint ) - self:F2( { self.GroupName, Zone, Duration, RandomPoint } ) - - local Point - if RandomPoint then - Point = Zone:GetRandomPointVec2() - else - Point = Zone:GetPointVec2() - end - - local DCSTask = self:TaskLandAtVec2( Point, Duration ) - - self:T3( DCSTask ) - return DCSTask -end - - - ---- (AIR) Following another airborne group. --- The unit / group will follow lead unit of another group, wingmens of both groups will continue following their leaders. --- If another group is on land the unit / group will orbit around. --- @param #GROUP self --- @param Group#GROUP FollowGroup The group to be followed. --- @param DCSTypes#Vec3 PointVec3 Position of the unit / lead unit of the group relative lead unit of another group in frame reference oriented by course of lead unit of another group. If another group is on land the unit / group will orbit around. --- @param #number LastWaypointIndex Detach waypoint of another group. Once reached the unit / group Follow task is finished. --- @return DCSTask#Task The DCS task structure. -function GROUP:TaskFollow( FollowGroup, PointVec3, LastWaypointIndex ) - self:F2( { self.GroupName, FollowGroup, PointVec3, LastWaypointIndex } ) - --- Follow = { --- id = 'Follow', --- params = { --- groupId = Group.ID, --- pos = Vec3, --- lastWptIndexFlag = boolean, --- lastWptIndex = number --- } --- } - - local LastWaypointIndexFlag = nil - if LastWaypointIndex then - LastWaypointIndexFlag = true - end - - local DCSTask - DCSTask = { id = 'Follow', - params = { - groupId = FollowGroup:GetID(), - pos = PointVec3, - lastWptIndexFlag = LastWaypointIndexFlag, - lastWptIndex = LastWaypointIndex, - }, - }, - - self:T3( { DCSTask } ) - return DCSTask -end - - ---- (AIR) Escort another airborne group. --- The unit / group will follow lead unit of another group, wingmens of both groups will continue following their leaders. --- The unit / group will also protect that group from threats of specified types. --- @param #GROUP self --- @param Group#GROUP EscortGroup The group to be escorted. --- @param DCSTypes#Vec3 PointVec3 Position of the unit / lead unit of the group relative lead unit of another group in frame reference oriented by course of lead unit of another group. If another group is on land the unit / group will orbit around. --- @param #number LastWaypointIndex Detach waypoint of another group. Once reached the unit / group Follow task is finished. --- @param #number EngagementDistanceMax Maximal distance from escorted group to threat. If the threat is already engaged by escort escort will disengage if the distance becomes greater than 1.5 * engagementDistMax. --- @param DCSTypes#AttributeNameArray TargetTypes Array of AttributeName that is contains threat categories allowed to engage. --- @return DCSTask#Task The DCS task structure. -function GROUP:TaskEscort( FollowGroup, PointVec3, LastWaypointIndex, EngagementDistance, TargetTypes ) - self:F2( { self.GroupName, FollowGroup, PointVec3, LastWaypointIndex, EngagementDistance, TargetTypes } ) - --- Escort = { --- id = 'Escort', --- params = { --- groupId = Group.ID, --- pos = Vec3, --- lastWptIndexFlag = boolean, --- lastWptIndex = number, --- engagementDistMax = Distance, --- targetTypes = array of AttributeName, --- } --- } - - local LastWaypointIndexFlag = nil - if LastWaypointIndex then - LastWaypointIndexFlag = true - end - - local DCSTask - DCSTask = { id = 'Follow', - params = { - groupId = FollowGroup:GetID(), - pos = PointVec3, - lastWptIndexFlag = LastWaypointIndexFlag, - lastWptIndex = LastWaypointIndex, - engagementDistMax = EngagementDistance, - targetTypes = TargetTypes, - }, - }, - - self:T3( { DCSTask } ) - return DCSTask -end - - --- GROUND TASKS - ---- (GROUND) Fire at a VEC2 point until ammunition is finished. --- @param #GROUP self --- @param DCSTypes#Vec2 PointVec2 The point to fire at. --- @param DCSTypes#Distance Radius The radius of the zone to deploy the fire at. --- @return DCSTask#Task The DCS task structure. -function GROUP:TaskFireAtPoint( PointVec2, Radius ) - self:F2( { self.GroupName, PointVec2, Radius } ) - - -- FireAtPoint = { - -- id = 'FireAtPoint', - -- params = { - -- point = Vec2, - -- radius = Distance, - -- } - -- } - - local DCSTask - DCSTask = { id = 'FireAtPoint', - params = { - point = PointVec2, - radius = Radius, - } - } - - self:T3( { DCSTask } ) - return DCSTask -end - ---- (GROUND) Hold ground group from moving. --- @param #GROUP self --- @return DCSTask#Task The DCS task structure. -function GROUP:TaskHold() - self:F2( { self.GroupName } ) - --- Hold = { --- id = 'Hold', --- params = { --- } --- } - - local DCSTask - DCSTask = { id = 'Hold', - params = { - } - } - - self:T3( { DCSTask } ) - return DCSTask -end - - --- TASKS FOR AIRBORNE AND GROUND UNITS/GROUPS - ---- (AIR + GROUND) The task makes the group/unit a FAC and orders the FAC to control the target (enemy ground group) destruction. --- The killer is player-controlled allied CAS-aircraft that is in contact with the FAC. --- If the task is assigned to the group lead unit will be a FAC. --- @param #GROUP self --- @param Group#GROUP AttackGroup Target GROUP. --- @param #number WeaponType Bitmask of weapon types those allowed to use. If parameter is not defined that means no limits on weapon usage. --- @param DCSTypes#AI.Task.Designation Designation (optional) Designation type. --- @param #boolean Datalink (optional) Allows to use datalink to send the target information to attack aircraft. Enabled by default. --- @return DCSTask#Task The DCS task structure. -function GROUP:TaskFAC_AttackGroup( AttackGroup, WeaponType, Designation, Datalink ) - self:F2( { self.GroupName, AttackGroup, WeaponType, Designation, Datalink } ) - --- FAC_AttackGroup = { --- id = 'FAC_AttackGroup', --- params = { --- groupId = Group.ID, --- weaponType = number, --- designation = enum AI.Task.Designation, --- datalink = boolean --- } --- } - - local DCSTask - DCSTask = { id = 'FAC_AttackGroup', - params = { - groupId = AttackGroup:GetID(), - weaponType = WeaponType, - designation = Designation, - datalink = Datalink, - } - } - - self:T3( { DCSTask } ) - return DCSTask -end - --- EN-ROUTE TASKS FOR AIRBORNE GROUPS - ---- (AIR) Engaging targets of defined types. --- @param #GROUP self --- @param DCSTypes#Distance Distance Maximal distance from the target to a route leg. If the target is on a greater distance it will be ignored. --- @param DCSTypes#AttributeNameArray TargetTypes Array of target categories allowed to engage. --- @param #number Priority All enroute tasks have the priority parameter. This is a number (less value - higher priority) that determines actions related to what task will be performed first. --- @return DCSTask#Task The DCS task structure. -function GROUP:EnRouteTaskEngageTargets( Distance, TargetTypes, Priority ) - self:F2( { self.GroupName, Distance, TargetTypes, Priority } ) - --- EngageTargets ={ --- id = 'EngageTargets', --- params = { --- maxDist = Distance, --- targetTypes = array of AttributeName, --- priority = number --- } --- } - - local DCSTask - DCSTask = { id = 'EngageTargets', - params = { - maxDist = Distance, - targetTypes = TargetTypes, - priority = Priority - } - } - - self:T3( { DCSTask } ) - return DCSTask -end - - - ---- (AIR) Engaging a targets of defined types at circle-shaped zone. --- @param #GROUP self --- @param DCSTypes#Vec2 PointVec2 2D-coordinates of the zone. --- @param DCSTypes#Distance Radius Radius of the zone. --- @param DCSTypes#AttributeNameArray TargetTypes Array of target categories allowed to engage. --- @param #number Priority All en-route tasks have the priority parameter. This is a number (less value - higher priority) that determines actions related to what task will be performed first. --- @return DCSTask#Task The DCS task structure. -function GROUP:EnRouteTaskEngageTargets( PointVec2, Radius, TargetTypes, Priority ) - self:F2( { self.GroupName, PointVec2, Radius, TargetTypes, Priority } ) - --- EngageTargetsInZone = { --- id = 'EngageTargetsInZone', --- params = { --- point = Vec2, --- zoneRadius = Distance, --- targetTypes = array of AttributeName, --- priority = number --- } --- } - - local DCSTask - DCSTask = { id = 'EngageTargetsInZone', - params = { - point = PointVec2, - zoneRadius = Radius, - targetTypes = TargetTypes, - priority = Priority - } - } - - self:T3( { DCSTask } ) - return DCSTask -end - - ---- (AIR) Engaging a group. The task does not assign the target group to the unit/group to attack now; it just allows the unit/group to engage the target group as well as other assigned targets. --- @param #GROUP self --- @param Group#GROUP AttackGroup The Group to be attacked. --- @param #number Priority All en-route tasks have the priority parameter. This is a number (less value - higher priority) that determines actions related to what task will be performed first. --- @param #number WeaponType (optional) Bitmask of weapon types those allowed to use. If parameter is not defined that means no limits on weapon usage. --- @param DCSTypes#AI.Task.WeaponExpend WeaponExpend (optional) Determines how much weapon will be released at each attack. If parameter is not defined the unit / group will choose expend on its own discretion. --- @param #number AttackQty (optional) This parameter limits maximal quantity of attack. The aicraft/group will not make more attack than allowed even if the target group not destroyed and the aicraft/group still have ammo. If not defined the aircraft/group will attack target until it will be destroyed or until the aircraft/group will run out of ammo. --- @param DCSTypes#Azimuth Direction (optional) Desired ingress direction from the target to the attacking aircraft. Group/aircraft will make its attacks from the direction. Of course if there is no way to attack from the direction due the terrain group/aircraft will choose another direction. --- @param DCSTypes#Distance Altitude (optional) Desired attack start altitude. Group/aircraft will make its attacks from the altitude. If the altitude is too low or too high to use weapon aircraft/group will choose closest altitude to the desired attack start altitude. If the desired altitude is defined group/aircraft will not attack from safe altitude. --- @param #boolean AttackQtyLimit (optional) The flag determines how to interpret attackQty parameter. If the flag is true then attackQty is a limit on maximal attack quantity for "AttackGroup" and "AttackUnit" tasks. If the flag is false then attackQty is a desired attack quantity for "Bombing" and "BombingRunway" tasks. --- @return DCSTask#Task The DCS task structure. -function GROUP:EnRouteTaskEngageGroup( AttackGroup, Priority, WeaponType, WeaponExpend, AttackQty, Direction, Altitude, AttackQtyLimit ) - self:F2( { self.GroupName, AttackGroup, Priority, WeaponType, WeaponExpend, AttackQty, Direction, Altitude, AttackQtyLimit } ) - - -- EngageGroup = { - -- id = 'EngageGroup ', - -- params = { - -- groupId = Group.ID, - -- weaponType = number, - -- expend = enum AI.Task.WeaponExpend, - -- attackQty = number, - -- directionEnabled = boolean, - -- direction = Azimuth, - -- altitudeEnabled = boolean, - -- altitude = Distance, - -- attackQtyLimit = boolean, - -- priority = number, - -- } - -- } - - local DirectionEnabled = nil - if Direction then - DirectionEnabled = true - end - - local AltitudeEnabled = nil - if Altitude then - AltitudeEnabled = true - end - - local DCSTask - DCSTask = { id = 'EngageGroup', - params = { - groupId = AttackGroup:GetID(), - weaponType = WeaponType, - expend = WeaponExpend, - attackQty = AttackQty, - directionEnabled = DirectionEnabled, - direction = Direction, - altitudeEnabled = AltitudeEnabled, - altitude = Altitude, - attackQtyLimit = AttackQtyLimit, - priority = Priority, - }, - }, - - self:T3( { DCSTask } ) - return DCSTask -end - - ---- (AIR) Attack the Unit. --- @param #GROUP self --- @param Unit#UNIT AttackUnit The UNIT. --- @param #number Priority All en-route tasks have the priority parameter. This is a number (less value - higher priority) that determines actions related to what task will be performed first. --- @param #number WeaponType (optional) Bitmask of weapon types those allowed to use. If parameter is not defined that means no limits on weapon usage. --- @param DCSTypes#AI.Task.WeaponExpend WeaponExpend (optional) Determines how much weapon will be released at each attack. If parameter is not defined the unit / group will choose expend on its own discretion. --- @param #number AttackQty (optional) This parameter limits maximal quantity of attack. The aicraft/group will not make more attack than allowed even if the target group not destroyed and the aicraft/group still have ammo. If not defined the aircraft/group will attack target until it will be destroyed or until the aircraft/group will run out of ammo. --- @param DCSTypes#Azimuth Direction (optional) Desired ingress direction from the target to the attacking aircraft. Group/aircraft will make its attacks from the direction. Of course if there is no way to attack from the direction due the terrain group/aircraft will choose another direction. --- @param #boolean AttackQtyLimit (optional) The flag determines how to interpret attackQty parameter. If the flag is true then attackQty is a limit on maximal attack quantity for "AttackGroup" and "AttackUnit" tasks. If the flag is false then attackQty is a desired attack quantity for "Bombing" and "BombingRunway" tasks. --- @param #boolean GroupAttack (optional) Flag indicates that the target must be engaged by all aircrafts of the group. Has effect only if the task is assigned to a group, not to a single aircraft. --- @return DCSTask#Task The DCS task structure. -function GROUP:EnRouteTaskEngageUnit( AttackUnit, Priority, WeaponType, WeaponExpend, AttackQty, Direction, AttackQtyLimit, GroupAttack ) - self:F2( { self.GroupName, AttackUnit, Priority, WeaponType, WeaponExpend, AttackQty, Direction, AttackQtyLimit, GroupAttack } ) - - -- EngageUnit = { - -- id = 'EngageUnit', - -- params = { - -- unitId = Unit.ID, - -- weaponType = number, - -- expend = enum AI.Task.WeaponExpend - -- attackQty = number, - -- direction = Azimuth, - -- attackQtyLimit = boolean, - -- groupAttack = boolean, - -- priority = number, - -- } - -- } - - local DCSTask - DCSTask = { id = 'EngageUnit', - params = { - unitId = AttackUnit:GetID(), - weaponType = WeaponType, - expend = WeaponExpend, - attackQty = AttackQty, - direction = Direction, - attackQtyLimit = AttackQtyLimit, - groupAttack = GroupAttack, - priority = Priority, - }, - }, - - self:T3( { DCSTask } ) - return DCSTask -end - - - ---- (AIR) Aircraft will act as an AWACS for friendly units (will provide them with information about contacts). No parameters. --- @param #GROUP self --- @return DCSTask#Task The DCS task structure. -function GROUP:EnRouteTaskAWACS( ) - self:F2( { self.GroupName } ) - --- AWACS = { --- id = 'AWACS', --- params = { --- } --- } - - local DCSTask - DCSTask = { id = 'AWACS', - params = { - } - } - - self:T3( { DCSTask } ) - return DCSTask -end - - ---- (AIR) Aircraft will act as a tanker for friendly units. No parameters. --- @param #GROUP self --- @return DCSTask#Task The DCS task structure. -function GROUP:EnRouteTaskTanker( ) - self:F2( { self.GroupName } ) - --- Tanker = { --- id = 'Tanker', --- params = { --- } --- } - - local DCSTask - DCSTask = { id = 'Tanker', - params = { - } - } - - self:T3( { DCSTask } ) - return DCSTask -end - - --- En-route tasks for ground units/groups - ---- (GROUND) Ground unit (EW-radar) will act as an EWR for friendly units (will provide them with information about contacts). No parameters. --- @param #GROUP self --- @return DCSTask#Task The DCS task structure. -function GROUP:EnRouteTaskEWR( ) - self:F2( { self.GroupName } ) - --- EWR = { --- id = 'EWR', --- params = { --- } --- } - - local DCSTask - DCSTask = { id = 'EWR', - params = { - } - } - - self:T3( { DCSTask } ) - return DCSTask -end - - --- En-route tasks for airborne and ground units/groups - ---- (AIR + GROUND) The task makes the group/unit a FAC and lets the FAC to choose the target (enemy ground group) as well as other assigned targets. --- The killer is player-controlled allied CAS-aircraft that is in contact with the FAC. --- If the task is assigned to the group lead unit will be a FAC. --- @param #GROUP self --- @param Group#GROUP AttackGroup Target GROUP. --- @param #number Priority All en-route tasks have the priority parameter. This is a number (less value - higher priority) that determines actions related to what task will be performed first. --- @param #number WeaponType Bitmask of weapon types those allowed to use. If parameter is not defined that means no limits on weapon usage. --- @param DCSTypes#AI.Task.Designation Designation (optional) Designation type. --- @param #boolean Datalink (optional) Allows to use datalink to send the target information to attack aircraft. Enabled by default. --- @return DCSTask#Task The DCS task structure. -function GROUP:EnRouteTaskFAC_EngageGroup( AttackGroup, Priority, WeaponType, Designation, Datalink ) - self:F2( { self.GroupName, AttackGroup, WeaponType, Priority, Designation, Datalink } ) - --- FAC_EngageGroup = { --- id = 'FAC_EngageGroup', --- params = { --- groupId = Group.ID, --- weaponType = number, --- designation = enum AI.Task.Designation, --- datalink = boolean, --- priority = number, --- } --- } - - local DCSTask - DCSTask = { id = 'FAC_EngageGroup', - params = { - groupId = AttackGroup:GetID(), - weaponType = WeaponType, - designation = Designation, - datalink = Datalink, - priority = Priority, - } - } - - self:T3( { DCSTask } ) - return DCSTask -end - - ---- (AIR + GROUND) The task makes the group/unit a FAC and lets the FAC to choose a targets (enemy ground group) around as well as other assigned targets. --- The killer is player-controlled allied CAS-aircraft that is in contact with the FAC. --- If the task is assigned to the group lead unit will be a FAC. --- @param #GROUP self --- @param DCSTypes#Distance Radius The maximal distance from the FAC to a target. --- @param #number Priority All en-route tasks have the priority parameter. This is a number (less value - higher priority) that determines actions related to what task will be performed first. --- @return DCSTask#Task The DCS task structure. -function GROUP:EnRouteTaskFAC( Radius, Priority ) - self:F2( { self.GroupName, Radius, Priority } ) - --- FAC = { --- id = 'FAC', --- params = { --- radius = Distance, --- priority = number --- } --- } - - local DCSTask - DCSTask = { id = 'FAC', - params = { - radius = Radius, - priority = Priority - } - } - - self:T3( { DCSTask } ) - return DCSTask -end - - - - ---- (AIR) Move the group to a Vec2 Point, wait for a defined duration and embark a group. --- @param #GROUP self --- @param DCSTypes#Vec2 Point The point where to wait. --- @param #number Duration The duration in seconds to wait. --- @param #GROUP EmbarkingGroup The group to be embarked. --- @return DCSTask#Task The DCS task structure -function GROUP:TaskEmbarking( Point, Duration, EmbarkingGroup ) - self:F2( { self.GroupName, Point, Duration, EmbarkingGroup.DCSGroup } ) - - local DCSTask - DCSTask = { id = 'Embarking', - params = { x = Point.x, - y = Point.y, - duration = Duration, - groupsForEmbarking = { EmbarkingGroup.GroupID }, - durationFlag = true, - distributionFlag = false, - distribution = {}, - } - } - - self:T3( { DCSTask } ) - return DCSTask -end - ---- (GROUND) Embark to a Transport landed at a location. - ---- Move to a defined Vec2 Point, and embark to a group when arrived within a defined Radius. --- @param #GROUP self --- @param DCSTypes#Vec2 Point The point where to wait. --- @param #number Radius The radius of the embarking zone around the Point. --- @return DCSTask#Task The DCS task structure. -function GROUP:TaskEmbarkToTransport( Point, Radius ) - self:F2( { self.GroupName, Point, Radius } ) - - local DCSTask --DCSTask#Task - DCSTask = { id = 'EmbarkToTransport', - params = { x = Point.x, - y = Point.y, - zoneRadius = Radius, - } - } - - self:T3( { DCSTask } ) - return DCSTask -end - - - ---- (AIR + GROUND) Return a mission task from a mission template. --- @param #GROUP self --- @param #table TaskMission A table containing the mission task. --- @return DCSTask#Task -function GROUP:TaskMission( TaskMission ) - self:F2( Points ) - - local DCSTask - DCSTask = { id = 'Mission', params = { TaskMission, }, } - - self:T3( { DCSTask } ) - return DCSTask -end - ---- Return a Misson task to follow a given route defined by Points. --- @param #GROUP self --- @param #table Points A table of route points. --- @return DCSTask#Task -function GROUP:TaskRoute( Points ) - self:F2( Points ) - - local DCSTask - DCSTask = { id = 'Mission', params = { route = { points = Points, }, }, } - - self:T3( { DCSTask } ) - return DCSTask -end - ---- (AIR + GROUND) Make the Group move to fly to a given point. --- @param #GROUP self --- @param DCSTypes#Vec3 Point The destination point in Vec3 format. --- @param #number Speed The speed to travel. --- @return #GROUP self -function GROUP:TaskRouteToVec2( Point, Speed ) - self:F2( { Point, Speed } ) - - local GroupPoint = self:GetUnit( 1 ):GetPointVec2() - - local PointFrom = {} - PointFrom.x = GroupPoint.x - PointFrom.y = GroupPoint.y - PointFrom.type = "Turning Point" - PointFrom.action = "Turning Point" - PointFrom.speed = Speed - PointFrom.speed_locked = true - PointFrom.properties = { - ["vnav"] = 1, - ["scale"] = 0, - ["angle"] = 0, - ["vangle"] = 0, - ["steer"] = 2, - } - - - local PointTo = {} - PointTo.x = Point.x - PointTo.y = Point.y - PointTo.type = "Turning Point" - PointTo.action = "Fly Over Point" - PointTo.speed = Speed - PointTo.speed_locked = true - PointTo.properties = { - ["vnav"] = 1, - ["scale"] = 0, - ["angle"] = 0, - ["vangle"] = 0, - ["steer"] = 2, - } - - - local Points = { PointFrom, PointTo } - - self:T3( Points ) - - self:Route( Points ) - - return self -end - ---- (AIR + GROUND) Make the Group move to a given point. --- @param #GROUP self --- @param DCSTypes#Vec3 Point The destination point in Vec3 format. --- @param #number Speed The speed to travel. --- @return #GROUP self -function GROUP:TaskRouteToVec3( Point, Speed ) - self:F2( { Point, Speed } ) - - local GroupPoint = self:GetUnit( 1 ):GetPointVec3() - - local PointFrom = {} - PointFrom.x = GroupPoint.x - PointFrom.y = GroupPoint.z - PointFrom.alt = GroupPoint.y - PointFrom.alt_type = "BARO" - PointFrom.type = "Turning Point" - PointFrom.action = "Turning Point" - PointFrom.speed = Speed - PointFrom.speed_locked = true - PointFrom.properties = { - ["vnav"] = 1, - ["scale"] = 0, - ["angle"] = 0, - ["vangle"] = 0, - ["steer"] = 2, - } - - - local PointTo = {} - PointTo.x = Point.x - PointTo.y = Point.z - PointTo.alt = Point.y - PointTo.alt_type = "BARO" - PointTo.type = "Turning Point" - PointTo.action = "Fly Over Point" - PointTo.speed = Speed - PointTo.speed_locked = true - PointTo.properties = { - ["vnav"] = 1, - ["scale"] = 0, - ["angle"] = 0, - ["vangle"] = 0, - ["steer"] = 2, - } - - - local Points = { PointFrom, PointTo } - - self:T3( Points ) - - self:Route( Points ) - - return self -end - - - ---- Make the group to follow a given route. --- @param #GROUP self --- @param #table GoPoints A table of Route Points. --- @return #GROUP self -function GROUP:Route( GoPoints ) - self:F2( GoPoints ) - - local DCSGroup = self:GetDCSGroup() - - if DCSGroup then - local Points = routines.utils.deepCopy( GoPoints ) - local MissionTask = { id = 'Mission', params = { route = { points = Points, }, }, } - local Controller = self:_GetController() - --Controller.setTask( Controller, MissionTask ) - --routines.scheduleFunction( Controller.setTask, { Controller, MissionTask}, timer.getTime() + 1 ) - SCHEDULER:New( Controller, Controller.setTask, { MissionTask }, 1 ) - return self - end - - return nil -end - - - ---- (AIR + GROUND) Route the group to a given zone. --- The group final destination point can be randomized. --- A speed can be given in km/h. --- A given formation can be given. --- @param #GROUP self --- @param Zone#ZONE Zone The zone where to route to. --- @param #boolean Randomize Defines whether to target point gets randomized within the Zone. --- @param #number Speed The speed. --- @param Base#FORMATION Formation The formation string. -function GROUP:TaskRouteToZone( Zone, Randomize, Speed, Formation ) - self:F2( Zone ) - - local DCSGroup = self:GetDCSGroup() - - if DCSGroup then - - local GroupPoint = self:GetPointVec2() - - local PointFrom = {} - PointFrom.x = GroupPoint.x - PointFrom.y = GroupPoint.y - PointFrom.type = "Turning Point" - PointFrom.action = "Cone" - PointFrom.speed = 20 / 1.6 - - - local PointTo = {} - local ZonePoint - - if Randomize then - ZonePoint = Zone:GetRandomPointVec2() - else - ZonePoint = Zone:GetPointVec2() - end - - PointTo.x = ZonePoint.x - PointTo.y = ZonePoint.y - PointTo.type = "Turning Point" - - if Formation then - PointTo.action = Formation - else - PointTo.action = "Cone" - end - - if Speed then - PointTo.speed = Speed - else - PointTo.speed = 20 / 1.6 - end - - local Points = { PointFrom, PointTo } - - self:T3( Points ) - - self:Route( Points ) - - return self - end - - return nil -end - --- Commands - ---- Do Script command --- @param #GROUP self --- @param #string DoScript --- @return #DCSCommand -function GROUP:CommandDoScript( DoScript ) - - local DCSDoScript = { - id = "Script", - params = { - command = DoScript, - }, - } - - self:T3( DCSDoScript ) - return DCSDoScript -end - - ---- Return the mission template of the group. --- @param #GROUP self --- @return #table The MissionTemplate -function GROUP:GetTaskMission() - self:F2( self.GroupName ) - - return routines.utils.deepCopy( _DATABASE.Templates.Groups[self.GroupName].Template ) -end - ---- Return the mission route of the group. --- @param #GROUP self --- @return #table The mission route defined by points. -function GROUP:GetTaskRoute() - self:F2( self.GroupName ) - - return routines.utils.deepCopy( _DATABASE.Templates.Groups[self.GroupName].Template.route.points ) -end - ---- Return the route of a group by using the @{Database#DATABASE} class. --- @param #GROUP self --- @param #number Begin The route point from where the copy will start. The base route point is 0. --- @param #number End The route point where the copy will end. The End point is the last point - the End point. The last point has base 0. --- @param #boolean Randomize Randomization of the route, when true. --- @param #number Radius When randomization is on, the randomization is within the radius. -function GROUP:CopyRoute( Begin, End, Randomize, Radius ) - self:F2( { Begin, End } ) - - local Points = {} - - -- Could be a Spawned Group - local GroupName = string.match( self:GetName(), ".*#" ) - if GroupName then - GroupName = GroupName:sub( 1, -2 ) - else - GroupName = self:GetName() - end - - self:T3( { GroupName } ) - - local Template = _DATABASE.Templates.Groups[GroupName].Template - - if Template then - if not Begin then - Begin = 0 - end - if not End then - End = 0 - end - - for TPointID = Begin + 1, #Template.route.points - End do - if Template.route.points[TPointID] then - Points[#Points+1] = routines.utils.deepCopy( Template.route.points[TPointID] ) - if Randomize then - if not Radius then - Radius = 500 - end - Points[#Points].x = Points[#Points].x + math.random( Radius * -1, Radius ) - Points[#Points].y = Points[#Points].y + math.random( Radius * -1, Radius ) - end - end - end - return Points - end - - return nil -end - - -function GROUP:GetDetectedTargets() - self:F2( self.GroupName ) - - local DCSGroup = self:GetDCSGroup() - if DCSGroup then - return self:_GetController():getDetectedTargets() - end - - return nil -end - -function GROUP:IsTargetDetected( DCSObject ) - self:F2( self.GroupName ) - - local DCSGroup = self:GetDCSGroup() - if DCSGroup then - - local TargetIsDetected, TargetIsVisible, TargetLastTime, TargetKnowType, TargetKnowDistance, TargetLastPos, TargetLastVelocity - = self:_GetController().isTargetDetected( self:_GetController(), DCSObject, - Controller.Detection.VISUAL, - Controller.Detection.OPTIC, - Controller.Detection.RADAR, - Controller.Detection.IRST, - Controller.Detection.RWR, - Controller.Detection.DLINK - ) - return TargetIsDetected, TargetIsVisible, TargetLastTime, TargetKnowType, TargetKnowDistance, TargetLastPos, TargetLastVelocity - end - - return nil -end - --- Options - ---- Can the GROUP hold their weapons? --- @param #GROUP self --- @return #boolean -function GROUP:OptionROEHoldFirePossible() - self:F2( { self.GroupName } ) - - local DCSGroup = self:GetDCSGroup() - if DCSGroup then - if self:IsAir() or self:IsGround() or self:IsShip() then - return true - end - - return false - end - - return nil -end - ---- Holding weapons. --- @param Group#GROUP self --- @return Group#GROUP self -function GROUP:OptionROEHoldFire() - self:F2( { self.GroupName } ) - - local DCSGroup = self:GetDCSGroup() - if DCSGroup then - local Controller = self:_GetController() - - if self:IsAir() then - Controller:setOption( AI.Option.Air.id.ROE, AI.Option.Air.val.ROE.WEAPON_HOLD ) - elseif self:IsGround() then - Controller:setOption( AI.Option.Ground.id.ROE, AI.Option.Ground.val.ROE.WEAPON_HOLD ) - elseif self:IsShip() then - Controller:setOption( AI.Option.Naval.id.ROE, AI.Option.Naval.val.ROE.WEAPON_HOLD ) - end - - return self - end - - return nil -end - ---- Can the GROUP attack returning on enemy fire? --- @param #GROUP self --- @return #boolean -function GROUP:OptionROEReturnFirePossible() - self:F2( { self.GroupName } ) - - local DCSGroup = self:GetDCSGroup() - if DCSGroup then - if self:IsAir() or self:IsGround() or self:IsShip() then - return true - end - - return false - end - - return nil -end - ---- Return fire. --- @param #GROUP self --- @return #GROUP self -function GROUP:OptionROEReturnFire() - self:F2( { self.GroupName } ) - - local DCSGroup = self:GetDCSGroup() - if DCSGroup then - local Controller = self:_GetController() - - if self:IsAir() then - Controller:setOption( AI.Option.Air.id.ROE, AI.Option.Air.val.ROE.RETURN_FIRE ) - elseif self:IsGround() then - Controller:setOption( AI.Option.Ground.id.ROE, AI.Option.Ground.val.ROE.RETURN_FIRE ) - elseif self:IsShip() then - Controller:setOption( AI.Option.Naval.id.ROE, AI.Option.Naval.val.ROE.RETURN_FIRE ) - end - - return self - end - - return nil -end - ---- Can the GROUP attack designated targets? --- @param #GROUP self --- @return #boolean -function GROUP:OptionROEOpenFirePossible() - self:F2( { self.GroupName } ) - - local DCSGroup = self:GetDCSGroup() - if DCSGroup then - if self:IsAir() or self:IsGround() or self:IsShip() then - return true - end - - return false - end - - return nil -end - ---- Openfire. --- @param #GROUP self --- @return #GROUP self -function GROUP:OptionROEOpenFire() - self:F2( { self.GroupName } ) - - local DCSGroup = self:GetDCSGroup() - if DCSGroup then - local Controller = self:_GetController() - - if self:IsAir() then - Controller:setOption( AI.Option.Air.id.ROE, AI.Option.Air.val.ROE.OPEN_FIRE ) - elseif self:IsGround() then - Controller:setOption( AI.Option.Ground.id.ROE, AI.Option.Ground.val.ROE.OPEN_FIRE ) - elseif self:IsShip() then - Controller:setOption( AI.Option.Naval.id.ROE, AI.Option.Naval.val.ROE.OPEN_FIRE ) - end - - return self - end - - return nil -end - ---- Can the GROUP attack targets of opportunity? --- @param #GROUP self --- @return #boolean -function GROUP:OptionROEWeaponFreePossible() - self:F2( { self.GroupName } ) - - local DCSGroup = self:GetDCSGroup() - if DCSGroup then - if self:IsAir() then - return true - end - - return false - end - - return nil -end - ---- Weapon free. --- @param #GROUP self --- @return #GROUP self -function GROUP:OptionROEWeaponFree() - self:F2( { self.GroupName } ) - - local DCSGroup = self:GetDCSGroup() - if DCSGroup then - local Controller = self:_GetController() - - if self:IsAir() then - Controller:setOption( AI.Option.Air.id.ROE, AI.Option.Air.val.ROE.WEAPON_FREE ) - end - - return self - end - - return nil -end - ---- Can the GROUP ignore enemy fire? --- @param #GROUP self --- @return #boolean -function GROUP:OptionROTNoReactionPossible() - self:F2( { self.GroupName } ) - - local DCSGroup = self:GetDCSGroup() - if DCSGroup then - if self:IsAir() then - return true - end - - return false - end - - return nil -end - - ---- No evasion on enemy threats. --- @param #GROUP self --- @return #GROUP self -function GROUP:OptionROTNoReaction() - self:F2( { self.GroupName } ) - - local DCSGroup = self:GetDCSGroup() - if DCSGroup then - local Controller = self:_GetController() - - if self:IsAir() then - Controller:setOption( AI.Option.Air.id.REACTION_ON_THREAT, AI.Option.Air.val.REACTION_ON_THREAT.NO_REACTION ) - end - - return self - end - - return nil -end - ---- Can the GROUP evade using passive defenses? --- @param #GROUP self --- @return #boolean -function GROUP:OptionROTPassiveDefensePossible() - self:F2( { self.GroupName } ) - - local DCSGroup = self:GetDCSGroup() - if DCSGroup then - if self:IsAir() then - return true - end - - return false - end - - return nil -end - ---- Evasion passive defense. --- @param #GROUP self --- @return #GROUP self -function GROUP:OptionROTPassiveDefense() - self:F2( { self.GroupName } ) - - local DCSGroup = self:GetDCSGroup() - if DCSGroup then - local Controller = self:_GetController() - - if self:IsAir() then - Controller:setOption( AI.Option.Air.id.REACTION_ON_THREAT, AI.Option.Air.val.REACTION_ON_THREAT.PASSIVE_DEFENCE ) - end - - return self - end - - return nil -end - ---- Can the GROUP evade on enemy fire? --- @param #GROUP self --- @return #boolean -function GROUP:OptionROTEvadeFirePossible() - self:F2( { self.GroupName } ) - - local DCSGroup = self:GetDCSGroup() - if DCSGroup then - if self:IsAir() then - return true - end - - return false - end - - return nil -end - - ---- Evade on fire. --- @param #GROUP self --- @return #GROUP self -function GROUP:OptionROTEvadeFire() - self:F2( { self.GroupName } ) - - local DCSGroup = self:GetDCSGroup() - if DCSGroup then - local Controller = self:_GetController() - - if self:IsAir() then - Controller:setOption( AI.Option.Air.id.REACTION_ON_THREAT, AI.Option.Air.val.REACTION_ON_THREAT.EVADE_FIRE ) - end - - return self - end - - return nil -end - ---- Can the GROUP evade on fire using vertical manoeuvres? --- @param #GROUP self --- @return #boolean -function GROUP:OptionROTVerticalPossible() - self:F2( { self.GroupName } ) - - local DCSGroup = self:GetDCSGroup() - if DCSGroup then - if self:IsAir() then - return true - end - - return false - end - - return nil -end - - ---- Evade on fire using vertical manoeuvres. --- @param #GROUP self --- @return #GROUP self -function GROUP:OptionROTVertical() - self:F2( { self.GroupName } ) - - local DCSGroup = self:GetDCSGroup() - if DCSGroup then - local Controller = self:_GetController() - - if self:IsAir() then - Controller:setOption( AI.Option.Air.id.REACTION_ON_THREAT, AI.Option.Air.val.REACTION_ON_THREAT.BYPASS_AND_ESCAPE ) - end - - return self - end - - return nil -end - --- Message APIs - ---- Returns a message for a coalition or a client. --- @param #GROUP self --- @param #string Message The message text --- @param DCSTypes#Duration Duration The duration of the message. --- @return Message#MESSAGE -function GROUP:Message( Message, Duration ) - self:F2( { Message, Duration } ) - - local DCSGroup = self:GetDCSGroup() - if DCSGroup then - return MESSAGE:New( Message, Duration, self:GetCallsign() .. " (" .. self:GetTypeName() .. ")" ) - end - - return nil -end - ---- Send a message to all coalitions. --- The message will appear in the message area. The message will begin with the callsign of the group and the type of the first unit sending the message. --- @param #GROUP self --- @param #string Message The message text --- @param DCSTypes#Duration Duration The duration of the message. -function GROUP:MessageToAll( Message, Duration ) - self:F2( { Message, Duration } ) - - local DCSGroup = self:GetDCSGroup() - if DCSGroup then - self:Message( Message, Duration ):ToAll() - end - - return nil -end - ---- Send a message to the red coalition. --- The message will appear in the message area. The message will begin with the callsign of the group and the type of the first unit sending the message. --- @param #GROUP self --- @param #string Message The message text --- @param DCSTYpes#Duration Duration The duration of the message. -function GROUP:MessageToRed( Message, Duration ) - self:F2( { Message, Duration } ) - - local DCSGroup = self:GetDCSGroup() - if DCSGroup then - self:Message( Message, Duration ):ToRed() - end - - return nil -end - ---- Send a message to the blue coalition. --- The message will appear in the message area. The message will begin with the callsign of the group and the type of the first unit sending the message. --- @param #GROUP self --- @param #string Message The message text --- @param DCSTypes#Duration Duration The duration of the message. -function GROUP:MessageToBlue( Message, Duration ) - self:F2( { Message, Duration } ) - - local DCSGroup = self:GetDCSGroup() - if DCSGroup then - self:Message( Message, Duration ):ToBlue() - end - - return nil -end - ---- Send a message to a client. --- The message will appear in the message area. The message will begin with the callsign of the group and the type of the first unit sending the message. --- @param #GROUP self --- @param #string Message The message text --- @param DCSTypes#Duration Duration The duration of the message. --- @param Client#CLIENT Client The client object receiving the message. -function GROUP:MessageToClient( Message, Duration, Client ) - self:F2( { Message, Duration } ) - - local DCSGroup = self:GetDCSGroup() - if DCSGroup then - self:Message( Message, Duration ):ToClient( Client ) - end - - return nil -end ---- This module contains the UNIT class. --- --- 1) @{Unit#UNIT} class, extends @{Base#BASE} --- =========================================== --- The @{Unit#UNIT} class is a wrapper class to handle the DCS Unit objects: --- --- * Support all DCS Unit APIs. --- * Enhance with Unit specific APIs not in the DCS Unit API set. --- * Handle local Unit Controller. --- * Manage the "state" of the DCS Unit. --- --- --- 1.1) UNIT reference methods --- ---------------------- --- For each DCS Unit object alive within a running mission, a UNIT wrapper object (instance) will be created within the _@{DATABASE} object. --- This is done at the beginning of the mission (when the mission starts), and dynamically when new DCS Unit objects are spawned (using the @{SPAWN} class). --- --- The UNIT class **does not contain a :New()** method, rather it provides **:Find()** methods to retrieve the object reference --- using the DCS Unit or the DCS UnitName. --- --- Another thing to know is that UNIT objects do not "contain" the DCS Unit object. --- The UNIT methods will reference the DCS Unit object by name when it is needed during API execution. --- If the DCS Unit object does not exist or is nil, the UNIT methods will return nil and log an exception in the DCS.log file. --- --- The UNIT class provides the following functions to retrieve quickly the relevant UNIT instance: --- --- * @{#UNIT.Find}(): Find a UNIT instance from the _DATABASE object using a DCS Unit object. --- * @{#UNIT.FindByName}(): Find a UNIT instance from the _DATABASE object using a DCS Unit name. --- --- IMPORTANT: ONE SHOULD NEVER SANATIZE these UNIT OBJECT REFERENCES! (make the UNIT object references nil). --- --- 1.2) DCS UNIT APIs --- ------------------ --- The DCS Unit APIs are used extensively within MOOSE. The UNIT class has for each DCS Unit API a corresponding method. --- To be able to distinguish easily in your code the difference between a UNIT API call and a DCS Unit API call, --- the first letter of the method is also capitalized. So, by example, the DCS Unit method @{DCSUnit#Unit.getName}() --- is implemented in the UNIT class as @{#UNIT.GetName}(). --- --- 1.3) Smoke, Flare Units --- ----------------------- --- The UNIT class provides methods to smoke or flare units easily. --- The @{#UNIT.SmokeBlue}(), @{#UNIT.SmokeGreen}(),@{#UNIT.SmokeOrange}(), @{#UNIT.SmokeRed}(), @{#UNIT.SmokeRed}() methods --- will smoke the unit in the corresponding color. Note that smoking a unit is done at the current position of the DCS Unit. --- When the DCS Unit moves for whatever reason, the smoking will still continue! --- The @{#UNIT.FlareGreen}(), @{#UNIT.FlareRed}(), @{#UNIT.FlareWhite}(), @{#UNIT.FlareYellow}() --- methods will fire off a flare in the air with the corresponding color. Note that a flare is a one-off shot and its effect is of very short duration. --- --- 1.4) Location Position, Point --- ----------------------------- --- The UNIT class provides methods to obtain the current point or position of the DCS Unit. --- The @{#UNIT.GetPointVec2}(), @{#UNIT.GetPointVec3}() will obtain the current **location** of the DCS Unit in a Vec2 (2D) or a **point** in a Vec3 (3D) vector respectively. --- If you want to obtain the complete **3D position** including oriëntation and direction vectors, consult the @{#UNIT.GetPositionVec3}() method respectively. --- --- 1.5) Test if alive --- ------------------ --- The @{#UNIT.IsAlive}(), @{#UNIT.IsActive}() methods determines if the DCS Unit is alive, meaning, it is existing and active. --- --- 1.6) Test for proximity --- ----------------------- --- The UNIT class contains methods to test the location or proximity against zones or other objects. --- --- ### 1.6.1) Zones --- To test whether the Unit is within a **zone**, use the @{#UNIT.IsInZone}() or the @{#UNIT.IsNotInZone}() methods. Any zone can be tested on, but the zone must be derived from @{Zone#ZONE_BASE}. --- --- ### 1.6.2) Units --- Test if another DCS Unit is within a given radius of the current DCS Unit, use the @{#UNIT.OtherUnitInRadius}() method. --- --- @module Unit --- @author FlightControl - - - - - ---- The UNIT class --- @type UNIT --- @extends Base#BASE --- @field #UNIT.FlareColor FlareColor --- @field #UNIT.SmokeColor SmokeColor -UNIT = { - ClassName="UNIT", - CategoryName = { - [Unit.Category.AIRPLANE] = "Airplane", - [Unit.Category.HELICOPTER] = "Helicoper", - [Unit.Category.GROUND_UNIT] = "Ground Unit", - [Unit.Category.SHIP] = "Ship", - [Unit.Category.STRUCTURE] = "Structure", - }, - FlareColor = { - Green = trigger.flareColor.Green, - Red = trigger.flareColor.Red, - White = trigger.flareColor.White, - Yellow = trigger.flareColor.Yellow - }, - SmokeColor = { - Green = trigger.smokeColor.Green, - Red = trigger.smokeColor.Red, - White = trigger.smokeColor.White, - Orange = trigger.smokeColor.Orange, - Blue = trigger.smokeColor.Blue - }, - } - ---- FlareColor --- @type UNIT.FlareColor --- @field Green --- @field Red --- @field White --- @field Yellow - ---- SmokeColor --- @type UNIT.SmokeColor --- @field Green --- @field Red --- @field White --- @field Orange --- @field Blue - --- Registration. - ---- Create a new UNIT from DCSUnit. --- @param #UNIT self --- @param DCSUnit#Unit DCSUnit --- @param Database#DATABASE Database --- @return Unit#UNIT -function UNIT:Register( UnitName ) - - local self = BASE:Inherit( self, BASE:New() ) - self:F2( UnitName ) - self.UnitName = UnitName - return self -end - --- Reference methods. - ---- Finds a UNIT from the _DATABASE using a DCSUnit object. --- @param #UNIT self --- @param DCSUnit#Unit DCSUnit An existing DCS Unit object reference. --- @return Unit#UNIT self -function UNIT:Find( DCSUnit ) - - local UnitName = DCSUnit:getName() - local UnitFound = _DATABASE:FindUnit( UnitName ) - return UnitFound -end - ---- Find a UNIT in the _DATABASE using the name of an existing DCS Unit. --- @param #UNIT self --- @param #string UnitName The Unit Name. --- @return Unit#UNIT self -function UNIT:FindByName( UnitName ) - - local UnitFound = _DATABASE:FindUnit( UnitName ) - return UnitFound -end - -function UNIT:GetDCSUnit() - local DCSUnit = Unit.getByName( self.UnitName ) - - if DCSUnit then - return DCSUnit - end - - self:E( "Unit " .. self.UnitName .. " not found!" ) - return nil -end - ---- Returns coalition of the Unit. --- @param Unit#UNIT self --- @return DCSCoalitionObject#coalition.side The side of the coalition. --- @return #nil The DCS Unit is not existing or alive. -function UNIT:GetCoalition() - self:F2( self.UnitName ) - - local DCSUnit = self:GetDCSUnit() - - if DCSUnit then - local UnitCoalition = DCSUnit:getCoalition() - self:T3( UnitCoalition ) - return UnitCoalition - end - - return nil -end - ---- Returns country of the Unit. --- @param Unit#UNIT self --- @return DCScountry#country.id The country identifier. --- @return #nil The DCS Unit is not existing or alive. -function UNIT:GetCountry() - self:F2( self.UnitName ) - - local DCSUnit = self:GetDCSUnit() - - if DCSUnit then - local UnitCountry = DCSUnit:getCountry() - self:T3( UnitCountry ) - return UnitCountry - end - - return nil -end - - ---- Returns DCS Unit object name. --- The function provides access to non-activated units too. --- @param Unit#UNIT self --- @return #string The name of the DCS Unit. --- @return #nil The DCS Unit is not existing or alive. -function UNIT:GetName() - self:F2( self.UnitName ) - - local DCSUnit = self:GetDCSUnit() - - if DCSUnit then - local UnitName = self.UnitName - return UnitName - end - - return nil -end - - ---- Returns if the unit is alive. --- @param Unit#UNIT self --- @return #boolean true if Unit is alive. --- @return #nil The DCS Unit is not existing or alive. -function UNIT:IsAlive() - self:F2( self.UnitName ) - - local DCSUnit = self:GetDCSUnit() - - if DCSUnit then - local UnitIsAlive = DCSUnit:isExist() - return UnitIsAlive - end - - return false -end - ---- Returns if the unit is activated. --- @param Unit#UNIT self --- @return #boolean true if Unit is activated. --- @return #nil The DCS Unit is not existing or alive. -function UNIT:IsActive() - self:F2( self.UnitName ) - - local DCSUnit = self:GetDCSUnit() - - if DCSUnit then - - local UnitIsActive = DCSUnit:isActive() - return UnitIsActive - end - - return nil -end - ---- Returns name of the player that control the unit or nil if the unit is controlled by A.I. --- @param Unit#UNIT self --- @return #string Player Name --- @return #nil The DCS Unit is not existing or alive. -function UNIT:GetPlayerName() - self:F2( self.UnitName ) - - local DCSUnit = self:GetDCSUnit() - - if DCSUnit then - - local PlayerName = DCSUnit:getPlayerName() - if PlayerName == nil then - PlayerName = "" - end - return PlayerName - end - - return nil -end - ---- Returns the unit's unique identifier. --- @param Unit#UNIT self --- @return DCSUnit#Unit.ID Unit ID --- @return #nil The DCS Unit is not existing or alive. -function UNIT:GetID() - self:F2( self.UnitName ) - - local DCSUnit = self:GetDCSUnit() - - if DCSUnit then - local UnitID = DCSUnit:getID() - return UnitID - end - - return nil -end - ---- Returns the unit's number in the group. --- The number is the same number the unit has in ME. --- It may not be changed during the mission. --- If any unit in the group is destroyed, the numbers of another units will not be changed. --- @param Unit#UNIT self --- @return #number The Unit number. --- @return #nil The DCS Unit is not existing or alive. -function UNIT:GetNumber() - self:F2( self.UnitName ) - - local DCSUnit = self:GetDCSUnit() - - if DCSUnit then - local UnitNumber = DCSUnit:getNumber() - return UnitNumber - end - - return nil -end - ---- Returns the unit's group if it exist and nil otherwise. --- @param Unit#UNIT self --- @return Group#GROUP The Group of the Unit. --- @return #nil The DCS Unit is not existing or alive. -function UNIT:GetGroup() - self:F2( self.UnitName ) - - local DCSUnit = self:GetDCSUnit() - - if DCSUnit then - local UnitGroup = DCSUnit:getGroup() - return UnitGroup - end - - return nil -end - - ---- Returns the unit's callsign - the localized string. --- @param Unit#UNIT self --- @return #string The Callsign of the Unit. --- @return #nil The DCS Unit is not existing or alive. -function UNIT:GetCallSign() - self:F2( self.UnitName ) - - local DCSUnit = self:GetDCSUnit() - - if DCSUnit then - local UnitCallSign = DCSUnit:getCallsign() - return UnitCallSign - end - - return nil -end - ---- Returns the unit's health. Dead units has health <= 1.0. --- @param Unit#UNIT self --- @return #number The Unit's health value. --- @return #nil The DCS Unit is not existing or alive. -function UNIT:GetLife() - self:F2( self.UnitName ) - - local DCSUnit = self:GetDCSUnit() - - if DCSUnit then - local UnitLife = DCSUnit:getLife() - return UnitLife - end - - return nil -end - ---- Returns the Unit's initial health. --- @param Unit#UNIT self --- @return #number The Unit's initial health value. --- @return #nil The DCS Unit is not existing or alive. -function UNIT:GetLife0() - self:F2( self.UnitName ) - - local DCSUnit = self:GetDCSUnit() - - if DCSUnit then - local UnitLife0 = DCSUnit:getLife0() - return UnitLife0 - end - - return nil -end - ---- Returns relative amount of fuel (from 0.0 to 1.0) the unit has in its internal tanks. If there are additional fuel tanks the value may be greater than 1.0. --- @param Unit#UNIT self --- @return #number The relative amount of fuel (from 0.0 to 1.0). --- @return #nil The DCS Unit is not existing or alive. -function UNIT:GetFuel() - self:F2( self.UnitName ) - - local DCSUnit = self:GetDCSUnit() - - if DCSUnit then - local UnitFuel = DCSUnit:getFuel() - return UnitFuel - end - - return nil -end - ---- Returns the Unit's ammunition. --- @param Unit#UNIT self --- @return DCSUnit#Unit.Ammo --- @return #nil The DCS Unit is not existing or alive. -function UNIT:GetAmmo() - self:F2( self.UnitName ) - - local DCSUnit = self:GetDCSUnit() - - if DCSUnit then - local UnitAmmo = DCSUnit:getAmmo() - return UnitAmmo - end - - return nil -end - ---- Returns the unit sensors. --- @param Unit#UNIT self --- @return DCSUnit#Unit.Sensors --- @return #nil The DCS Unit is not existing or alive. -function UNIT:GetSensors() - self:F2( self.UnitName ) - - local DCSUnit = self:GetDCSUnit() - - if DCSUnit then - local UnitSensors = DCSUnit:getSensors() - return UnitSensors - end - - return nil -end - --- Need to add here a function per sensortype --- unit:hasSensors(Unit.SensorType.RADAR, Unit.RadarType.AS) - ---- Returns two values: --- --- * First value indicates if at least one of the unit's radar(s) is on. --- * Second value is the object of the radar's interest. Not nil only if at least one radar of the unit is tracking a target. --- @param Unit#UNIT self --- @return #boolean Indicates if at least one of the unit's radar(s) is on. --- @return DCSObject#Object The object of the radar's interest. Not nil only if at least one radar of the unit is tracking a target. --- @return #nil The DCS Unit is not existing or alive. -function UNIT:GetRadar() - self:F2( self.UnitName ) - - local DCSUnit = self:GetDCSUnit() - - if DCSUnit then - local UnitRadarOn, UnitRadarObject = DCSUnit:getRadar() - return UnitRadarOn, UnitRadarObject - end - - return nil, nil -end - --- Need to add here functions to check if radar is on and which object etc. - ---- Returns unit descriptor. Descriptor type depends on unit category. --- @param Unit#UNIT self --- @return DCSUnit#Unit.Desc The Unit descriptor. --- @return #nil The DCS Unit is not existing or alive. -function UNIT:GetDesc() - self:F2( self.UnitName ) - - local DCSUnit = self:GetDCSUnit() - - if DCSUnit then - local UnitDesc = DCSUnit:getDesc() - self:T2( UnitDesc ) - return UnitDesc - end - - self:E( "Unit " .. self.UnitName .. "not found!" ) - return nil -end - - ---- Returns the type name of the DCS Unit. --- @param Unit#UNIT self --- @return #string The type name of the DCS Unit. --- @return #nil The DCS Unit is not existing or alive. -function UNIT:GetTypeName() - self:F2( self.UnitName ) - - local DCSUnit = self:GetDCSUnit() - - if DCSUnit then - local UnitTypeName = DCSUnit:getTypeName() - self:T3( UnitTypeName ) - return UnitTypeName - end - - return nil -end - - - ---- Returns the prefix name of the DCS Unit. A prefix name is a part of the name before a '#'-sign. --- DCS Units spawned with the @{SPAWN} class contain a '#'-sign to indicate the end of the (base) DCS Unit name. --- The spawn sequence number and unit number are contained within the name after the '#' sign. --- @param Unit#UNIT self --- @return #string The name of the DCS Unit. --- @return #nil The DCS Unit is not existing or alive. -function UNIT:GetPrefix() - self:F2( self.UnitName ) - - local DCSUnit = self:GetDCSUnit() - - if DCSUnit then - local UnitPrefix = string.match( self.UnitName, ".*#" ):sub( 1, -2 ) - self:T3( UnitPrefix ) - return UnitPrefix - end - - return nil -end - - - ---- Returns the @{DCSTypes#Vec2} vector indicating the point in 2D of the DCS Unit within the mission. --- @param Unit#UNIT self --- @return DCSTypes#Vec2 The 2D point vector of the DCS Unit. --- @return #nil The DCS Unit is not existing or alive. -function UNIT:GetPointVec2() - self:F2( self.UnitName ) - - local DCSUnit = self:GetDCSUnit() - - if DCSUnit then - local UnitPointVec3 = DCSUnit:getPosition().p - - local UnitPointVec2 = {} - UnitPointVec2.x = UnitPointVec3.x - UnitPointVec2.y = UnitPointVec3.z - - self:T2( UnitPointVec2 ) - return UnitPointVec2 - end - - return nil -end - - ---- Returns the @{DCSTypes#Vec3} vector indicating the point in 3D of the DCS Unit within the mission. --- @param Unit#UNIT self --- @return DCSTypes#Vec3 The 3D point vector of the DCS Unit. --- @return #nil The DCS Unit is not existing or alive. -function UNIT:GetPointVec3() - self:F2( self.UnitName ) - - local DCSUnit = self:GetDCSUnit() - - if DCSUnit then - local UnitPointVec3 = DCSUnit:getPosition().p - self:T3( UnitPointVec3 ) - return UnitPointVec3 - end - - return nil -end - ---- Returns the @{DCSTypes#Position3} position vectors indicating the point and direction vectors in 3D of the DCS Unit within the mission. --- @param Unit#UNIT self --- @return DCSTypes#Position The 3D position vectors of the DCS Unit. --- @return #nil The DCS Unit is not existing or alive. -function UNIT:GetPositionVec3() - self:F2( self.UnitName ) - - local DCSUnit = self:GetDCSUnit() - - if DCSUnit then - local UnitPosition = DCSUnit:getPosition() - self:T3( UnitPosition ) - return UnitPosition - end - - return nil -end - ---- Returns the DCS Unit velocity vector. --- @param Unit#UNIT self --- @return DCSTypes#Vec3 The velocity vector --- @return #nil The DCS Unit is not existing or alive. -function UNIT:GetVelocity() - self:F2( self.UnitName ) - - local DCSUnit = self:GetDCSUnit() - - if DCSUnit then - local UnitVelocityVec3 = DCSUnit:getVelocity() - self:T3( UnitVelocityVec3 ) - return UnitVelocityVec3 - end - - return nil -end - --- Is functions - ---- Returns true if the unit is within a @{Zone}. --- @param #UNIT self --- @param Zone#ZONE_BASE Zone The zone to test. --- @return #boolean Returns true if the unit is within the @{Zone#ZONE_BASE} -function UNIT:IsInZone( Zone ) - self:F2( { self.UnitName, Zone } ) - - local IsInZone = Zone:IsPointVec3InZone( self:GetPointVec3() ) - - self:T( { IsInZone } ) - return IsInZone -end - ---- Returns true if the unit is not within a @{Zone}. --- @param #UNIT self --- @param Zone#ZONE_BASE Zone The zone to test. --- @return #boolean Returns true if the unit is not within the @{Zone#ZONE_BASE} -function UNIT:IsNotInZone( Zone ) - self:F2( { self.UnitName, Zone } ) - - local IsInZone = not Zone:IsPointVec3InZone( self:GetPointVec3() ) - - self:T( { IsInZone } ) - return IsInZone -end - ---- Returns true if the DCS Unit is in the air. --- @param Unit#UNIT self --- @return #boolean true if in the air. --- @return #nil The DCS Unit is not existing or alive. -function UNIT:InAir() - self:F2( self.UnitName ) - - local DCSUnit = self:GetDCSUnit() - - if DCSUnit then - local UnitInAir = DCSUnit:inAir() - self:T3( UnitInAir ) - return UnitInAir - end - - return nil -end - ---- Returns the altitude of the DCS Unit. --- @param Unit#UNIT self --- @return DCSTypes#Distance The altitude of the DCS Unit. --- @return #nil The DCS Unit is not existing or alive. -function UNIT:GetAltitude() - self:F2() - - local DCSUnit = self:GetDCSUnit() - - if DCSUnit then - local UnitPointVec3 = DCSUnit:getPoint() --DCSTypes#Vec3 - return UnitPointVec3.y - end - - return nil -end - ---- Returns true if there is an **other** DCS Unit within a radius of the current 2D point of the DCS Unit. --- @param Unit#UNIT self --- @param Unit#UNIT AwaitUnit The other UNIT wrapper object. --- @param Radius The radius in meters with the DCS Unit in the centre. --- @return true If the other DCS Unit is within the radius of the 2D point of the DCS Unit. --- @return #nil The DCS Unit is not existing or alive. -function UNIT:OtherUnitInRadius( AwaitUnit, Radius ) - self:F2( { self.UnitName, AwaitUnit.UnitName, Radius } ) - - local DCSUnit = self:GetDCSUnit() - - if DCSUnit then - local UnitPos = self:GetPointVec3() - local AwaitUnitPos = AwaitUnit:GetPointVec3() - - if (((UnitPos.x - AwaitUnitPos.x)^2 + (UnitPos.z - AwaitUnitPos.z)^2)^0.5 <= Radius) then - self:T3( "true" ) - return true - else - self:T3( "false" ) - return false - end - end - - return nil -end - ---- Returns the DCS Unit category name as defined within the DCS Unit Descriptor. --- @param Unit#UNIT self --- @return #string The DCS Unit Category Name -function UNIT:GetCategoryName() - local DCSUnit = self:GetDCSUnit() - - if DCSUnit then - local UnitCategoryName = self.CategoryName[ self:GetDesc().category ] - return UnitCategoryName - end - - return nil -end - ---- Signal a flare at the position of the UNIT. --- @param #UNIT self -function UNIT:Flare( FlareColor ) - self:F2() - trigger.action.signalFlare( self:GetPointVec3(), FlareColor , 0 ) -end - ---- Signal a white flare at the position of the UNIT. --- @param #UNIT self -function UNIT:FlareWhite() - self:F2() - trigger.action.signalFlare( self:GetPointVec3(), trigger.flareColor.White , 0 ) -end - ---- Signal a yellow flare at the position of the UNIT. --- @param #UNIT self -function UNIT:FlareYellow() - self:F2() - trigger.action.signalFlare( self:GetPointVec3(), trigger.flareColor.Yellow , 0 ) -end - ---- Signal a green flare at the position of the UNIT. --- @param #UNIT self -function UNIT:FlareGreen() - self:F2() - trigger.action.signalFlare( self:GetPointVec3(), trigger.flareColor.Green , 0 ) -end - ---- Signal a red flare at the position of the UNIT. --- @param #UNIT self -function UNIT:FlareRed() - self:F2() - trigger.action.signalFlare( self:GetPointVec3(), trigger.flareColor.Red, 0 ) -end - ---- Smoke the UNIT. --- @param #UNIT self -function UNIT:Smoke( SmokeColor ) - self:F2() - trigger.action.smoke( self:GetPointVec3(), SmokeColor ) -end - ---- Smoke the UNIT Green. --- @param #UNIT self -function UNIT:SmokeGreen() - self:F2() - trigger.action.smoke( self:GetPointVec3(), trigger.smokeColor.Green ) -end - ---- Smoke the UNIT Red. --- @param #UNIT self -function UNIT:SmokeRed() - self:F2() - trigger.action.smoke( self:GetPointVec3(), trigger.smokeColor.Red ) -end - ---- Smoke the UNIT White. --- @param #UNIT self -function UNIT:SmokeWhite() - self:F2() - trigger.action.smoke( self:GetPointVec3(), trigger.smokeColor.White ) -end - ---- Smoke the UNIT Orange. --- @param #UNIT self -function UNIT:SmokeOrange() - self:F2() - trigger.action.smoke( self:GetPointVec3(), trigger.smokeColor.Orange ) -end - ---- Smoke the UNIT Blue. --- @param #UNIT self -function UNIT:SmokeBlue() - self:F2() - trigger.action.smoke( self:GetPointVec3(), trigger.smokeColor.Blue ) -end - --- Is methods - ---- Returns if the unit is of an air category. --- If the unit is a helicopter or a plane, then this method will return true, otherwise false. --- @param #UNIT self --- @return #boolean Air category evaluation result. -function UNIT:IsAir() - self:F2() - - local UnitDescriptor = self.DCSUnit:getDesc() - self:T3( { UnitDescriptor.category, Unit.Category.AIRPLANE, Unit.Category.HELICOPTER } ) - - local IsAirResult = ( UnitDescriptor.category == Unit.Category.AIRPLANE ) or ( UnitDescriptor.category == Unit.Category.HELICOPTER ) - - self:T3( IsAirResult ) - return IsAirResult -end - ---- This module contains the ZONE classes, inherited from @{Zone#ZONE_BASE}. --- There are essentially two core functions that zones accomodate: --- --- * Test if an object is within the zone boundaries. --- * Provide the zone behaviour. Some zones are static, while others are moveable. --- --- The object classes are using the zone classes to test the zone boundaries, which can take various forms: --- --- * Test if completely within the zone. --- * Test if partly within the zone (for @{Group#GROUP} objects). --- * Test if not in the zone. --- * Distance to the nearest intersecting point of the zone. --- * Distance to the center of the zone. --- * ... --- --- Each of these ZONE classes have a zone name, and specific parameters defining the zone type: --- --- * @{Zone#ZONE_BASE}: The ZONE_BASE class defining the base for all other zone classes. --- * @{Zone#ZONE_RADIUS}: The ZONE_RADIUS class defined by a zone name, a location and a radius. --- * @{Zone#ZONE}: The ZONE class, defined by the zone name as defined within the Mission Editor. --- * @{Zone#ZONE_UNIT}: The ZONE_UNIT class defined by a zone around a @{Unit#UNIT} with a radius. --- * @{Zone#ZONE_POLYGON}: The ZONE_POLYGON class defined by a sequence of @{Group#GROUP} waypoints within the Mission Editor, forming a polygon. --- --- Each zone implements two polymorphic functions defined in @{Zone#ZONE_BASE}: --- --- * @{#ZONE_BASE.IsPointVec2InZone}: Returns if a location is within the zone. --- * @{#ZONE_BASE.IsPointVec3InZone}: Returns if a point is within the zone. --- --- === --- --- 1) @{Zone#ZONE_BASE} class, extends @{Base#BASE} --- ================================================ --- The ZONE_BASE class defining the base for all other zone classes. --- --- === --- --- 2) @{Zone#ZONE_RADIUS} class, extends @{Zone#ZONE_BASE} --- ======================================================= --- The ZONE_RADIUS class defined by a zone name, a location and a radius. --- --- === --- --- 3) @{Zone#ZONE} class, extends @{Zone#ZONE_RADIUS} --- ========================================== --- The ZONE class, defined by the zone name as defined within the Mission Editor. --- --- === --- --- 4) @{Zone#ZONE_UNIT} class, extends @{Zone#ZONE_RADIUS} --- ======================================================= --- The ZONE_UNIT class defined by a zone around a @{Unit#UNIT} with a radius. --- --- === --- --- 5) @{Zone#ZONE_POLYGON} class, extends @{Zone#ZONE_BASE} --- ======================================================== --- The ZONE_POLYGON class defined by a sequence of @{Group#GROUP} waypoints within the Mission Editor, forming a polygon. --- --- === --- --- @module Zone --- @author FlightControl - - - - - - - - - ---- The ZONE_BASE class --- @type ZONE_BASE --- @extends Base#BASE -ZONE_BASE = { - ClassName = "ZONE_BASE", - } - ---- ZONE_BASE constructor --- @param #ZONE_BASE self --- @param #string ZoneName Name of the zone. --- @return #ZONE_BASE self -function ZONE_BASE:New( ZoneName ) - local self = BASE:Inherit( self, BASE:New() ) - self:F( ZoneName ) - - self.ZoneName = ZoneName - - return self -end - ---- Returns if a location is within the zone. --- @param #ZONE_RADIUS self --- @param DCSTypes#Vec2 PointVec2 The location to test. --- @return #boolean true if the location is within the zone. -function ZONE_BASE:IsPointVec2InZone( PointVec2 ) - self:F2( PointVec2 ) - - return false -end - ---- Returns if a point is within the zone. --- @param #ZONE_RADIUS self --- @param DCSTypes#Vec3 PointVec3 The point to test. --- @return #boolean true if the point is within the zone. -function ZONE_BASE:IsPointVec3InZone( PointVec3 ) - self:F2( PointVec3 ) - - local InZone = self:IsPointVec2InZone( { x = PointVec3.x, y = PointVec3.z } ) - - return InZone -end - ---- Smokes the zone boundaries in a color. --- @param #ZONE_BASE self --- @param SmokeColor The smoke color. -function ZONE_BASE:SmokeZone( SmokeColor ) - self:F2( SmokeColor ) - -end - - ---- The ZONE_RADIUS class, defined by a zone name, a location and a radius. --- @type ZONE_RADIUS --- @field DCSTypes#Vec2 PointVec2 The current location of the zone. --- @field DCSTypes#Distance Radius The radius of the zone. --- @extends Zone#ZONE_BASE -ZONE_RADIUS = { - ClassName="ZONE_RADIUS", - } - ---- Constructor of ZONE_RADIUS, taking the zone name, the zone location and a radius. --- @param #ZONE_RADIUS self --- @param #string ZoneName Name of the zone. --- @param DCSTypes#Vec2 PointVec2 The location of the zone. --- @param DCSTypes#Distance Radius The radius of the zone. --- @return #ZONE_RADIUS self -function ZONE_RADIUS:New( ZoneName, PointVec2, Radius ) - local self = BASE:Inherit( self, ZONE_BASE:New( ZoneName ) ) - self:F( { ZoneName, PointVec2, Radius } ) - - self.Radius = Radius - self.PointVec2 = PointVec2 - - return self -end - ---- Smokes the zone boundaries in a color. --- @param #ZONE_RADIUS self --- @param #POINT_VEC3.SmokeColor SmokeColor The smoke color. --- @param #number Points (optional) The amount of points in the circle. --- @return #ZONE_RADIUS self -function ZONE_RADIUS:SmokeZone( SmokeColor, Points ) - self:F2( SmokeColor ) - - local Point = {} - local PointVec2 = self:GetPointVec2() - - Points = Points and Points or 360 - - local Angle - local RadialBase = math.pi*2 - - for Angle = 0, 360, 360 / Points do - local Radial = Angle * RadialBase / 360 - Point.x = PointVec2.x + math.cos( Radial ) * self:GetRadius() - Point.y = PointVec2.y + math.sin( Radial ) * self:GetRadius() - POINT_VEC2:New( Point.x, Point.y ):Smoke( SmokeColor ) - end - - return self -end - - ---- Flares the zone boundaries in a color. --- @param #ZONE_RADIUS self --- @param #POINT_VEC3.FlareColor FlareColor The flare color. --- @param #number Points (optional) The amount of points in the circle. --- @param DCSTypes#Azimuth Azimuth (optional) Azimuth The azimuth of the flare. --- @return #ZONE_RADIUS self -function ZONE_RADIUS:FlareZone( FlareColor, Points, Azimuth ) - self:F2( { FlareColor, Azimuth } ) - - local Point = {} - local PointVec2 = self:GetPointVec2() - - Points = Points and Points or 360 - - local Angle - local RadialBase = math.pi*2 - - for Angle = 0, 360, 360 / Points do - local Radial = Angle * RadialBase / 360 - Point.x = PointVec2.x + math.cos( Radial ) * self:GetRadius() - Point.y = PointVec2.y + math.sin( Radial ) * self:GetRadius() - POINT_VEC2:New( Point.x, Point.y ):Flare( FlareColor, Azimuth ) - end - - return self -end - ---- Returns the radius of the zone. --- @param #ZONE_RADIUS self --- @return DCSTypes#Distance The radius of the zone. -function ZONE_RADIUS:GetRadius() - self:F2( self.ZoneName ) - - self:T2( { self.Radius } ) - - return self.Radius -end - ---- Sets the radius of the zone. --- @param #ZONE_RADIUS self --- @param DCSTypes#Distance Radius The radius of the zone. --- @return DCSTypes#Distance The radius of the zone. -function ZONE_RADIUS:SetRadius( Radius ) - self:F2( self.ZoneName ) - - self.Radius = Radius - self:T2( { self.Radius } ) - - return self.Radius -end - ---- Returns the location of the zone. --- @param #ZONE_RADIUS self --- @return DCSTypes#Vec2 The location of the zone. -function ZONE_RADIUS:GetPointVec2() - self:F2( self.ZoneName ) - - self:T2( { self.PointVec2 } ) - - return self.PointVec2 -end - ---- Sets the location of the zone. --- @param #ZONE_RADIUS self --- @param DCSTypes#Vec2 PointVec2 The new location of the zone. --- @return DCSTypes#Vec2 The new location of the zone. -function ZONE_RADIUS:SetPointVec2( PointVec2 ) - self:F2( self.ZoneName ) - - self.PointVec2 = PointVec2 - - self:T2( { self.PointVec2 } ) - - return self.PointVec2 -end - ---- Returns the point of the zone. --- @param #ZONE_RADIUS self --- @param DCSTypes#Distance Height The height to add to the land height where the center of the zone is located. --- @return DCSTypes#Vec3 The point of the zone. -function ZONE_RADIUS:GetPointVec3( Height ) - self:F2( self.ZoneName ) - - local PointVec2 = self:GetPointVec2() - - local PointVec3 = { x = PointVec2.x, y = land.getHeight( self:GetPointVec2() ) + Height, z = PointVec2.y } - - self:T2( { PointVec3 } ) - - return PointVec3 -end - - ---- Returns if a location is within the zone. --- @param #ZONE_RADIUS self --- @param DCSTypes#Vec2 PointVec2 The location to test. --- @return #boolean true if the location is within the zone. -function ZONE_RADIUS:IsPointVec2InZone( PointVec2 ) - self:F2( PointVec2 ) - - local ZonePointVec2 = self:GetPointVec2() - - if (( PointVec2.x - ZonePointVec2.x )^2 + ( PointVec2.y - ZonePointVec2.y ) ^2 ) ^ 0.5 <= self:GetRadius() then - return true - end - - return false -end - ---- Returns if a point is within the zone. --- @param #ZONE_RADIUS self --- @param DCSTypes#Vec3 PointVec3 The point to test. --- @return #boolean true if the point is within the zone. -function ZONE_RADIUS:IsPointVec3InZone( PointVec3 ) - self:F2( PointVec3 ) - - local InZone = self:IsPointVec2InZone( { x = PointVec3.x, y = PointVec3.z } ) - - return InZone -end - ---- Returns a random location within the zone. --- @param #ZONE_RADIUS self --- @return DCSTypes#Vec2 The random location within the zone. -function ZONE_RADIUS:GetRandomPointVec2() - self:F( self.ZoneName ) - - local Point = {} - local PointVec2 = self:GetPointVec2() - - local angle = math.random() * math.pi*2; - Point.x = PointVec2.x + math.cos( angle ) * math.random() * self:GetRadius(); - Point.y = PointVec2.y + math.sin( angle ) * math.random() * self:GetRadius(); - - self:T( { Point } ) - - return Point -end - - - ---- The ZONE class, defined by the zone name as defined within the Mission Editor. The location and the radius are automatically collected from the mission settings. --- @type ZONE --- @extends Zone#ZONE_RADIUS -ZONE = { - ClassName="ZONE", - } - - ---- Constructor of ZONE, taking the zone name. --- @param #ZONE self --- @param #string ZoneName The name of the zone as defined within the mission editor. --- @return #ZONE -function ZONE:New( ZoneName ) - - local Zone = trigger.misc.getZone( ZoneName ) - - if not Zone then - error( "Zone " .. ZoneName .. " does not exist." ) - return nil - end - - local self = BASE:Inherit( self, ZONE_RADIUS:New( ZoneName, { x = Zone.point.x, y = Zone.point.z }, Zone.radius ) ) - self:F( ZoneName ) - - self.Zone = Zone - - return self -end - - ---- The ZONE_UNIT class defined by a zone around a @{Unit#UNIT} with a radius. --- @type ZONE_UNIT --- @field Unit#UNIT ZoneUNIT --- @extends Zone#ZONE_RADIUS -ZONE_UNIT = { - ClassName="ZONE_UNIT", - } - ---- Constructor to create a ZONE_UNIT instance, taking the zone name, a zone unit and a radius. --- @param #ZONE_UNIT self --- @param #string ZoneName Name of the zone. --- @param Unit#UNIT ZoneUNIT The unit as the center of the zone. --- @param DCSTypes#Distance Radius The radius of the zone. --- @return #ZONE_UNIT self -function ZONE_UNIT:New( ZoneName, ZoneUNIT, Radius ) - local self = BASE:Inherit( self, ZONE_RADIUS:New( ZoneName, ZoneUNIT:GetPointVec2(), Radius ) ) - self:F( { ZoneName, ZoneUNIT:GetPointVec2(), Radius } ) - - self.ZoneUNIT = ZoneUNIT - - return self -end - - ---- Returns the current location of the @{Unit#UNIT}. --- @param #ZONE_UNIT self --- @return DCSTypes#Vec2 The location of the zone based on the @{Unit#UNIT}location. -function ZONE_UNIT:GetPointVec2() - self:F( self.ZoneName ) - - local ZonePointVec2 = self.ZoneUNIT:GetPointVec2() - - self:T( { ZonePointVec2 } ) - - return ZonePointVec2 -end - - ---- The ZONE_POLYGON class defined by a sequence of @{Group#GROUP} waypoints within the Mission Editor, forming a polygon. --- @type ZONE_POLYGON --- @extends Zone#ZONE_BASE -ZONE_POLYGON = { - ClassName="ZONE_POLYGON", - } - ---- Constructor to create a ZONE_POLYGON instance, taking the zone name and the name of the @{Group#GROUP} defined within the Mission Editor. --- The @{Group#GROUP} waypoints define the polygon corners. The first and the last point are automatically connected by ZONE_POLYGON. --- @param #ZONE_POLYGON self --- @param #string ZoneName Name of the zone. --- @param Group#GROUP ZoneGroup The GROUP waypoints as defined within the Mission Editor define the polygon shape. --- @return #ZONE_POLYGON self -function ZONE_POLYGON:New( ZoneName, ZoneGroup ) - local self = BASE:Inherit( self, ZONE_BASE:New( ZoneName ) ) - self:F( { ZoneName, ZoneGroup } ) - - local GroupPoints = ZoneGroup:GetTaskRoute() - local i = 0 - - self.Polygon = {} - - for i = 1, #GroupPoints do - self.Polygon[i] = {} - self.Polygon[i].x = GroupPoints[i].x - self.Polygon[i].y = GroupPoints[i].y - end - - return self -end - ---- Smokes the zone boundaries in a color. --- @param #ZONE_POLYGON self --- @param #POINT_VEC3.SmokeColor SmokeColor The smoke color. --- @return #ZONE_POLYGON self -function ZONE_POLYGON:SmokeZone( SmokeColor ) - self:F2( SmokeColor ) - - local i - local j - local Segments = 10 - - i = 1 - j = #self.Polygon - - while i <= #self.Polygon do - self:T( { i, j, self.Polygon[i], self.Polygon[j] } ) - - local DeltaX = self.Polygon[j].x - self.Polygon[i].x - local DeltaY = self.Polygon[j].y - self.Polygon[i].y - - for Segment = 0, Segments do -- We divide each line in 5 segments and smoke a point on the line. - local PointX = self.Polygon[i].x + ( Segment * DeltaX / Segments ) - local PointY = self.Polygon[i].y + ( Segment * DeltaY / Segments ) - POINT_VEC2:New( PointX, PointY ):Smoke( SmokeColor ) - end - j = i - i = i + 1 - end - - return self -end - - - - ---- Returns if a location is within the zone. --- @param #ZONE_POLYGON self --- @param DCSTypes#Vec2 PointVec2 The location to test. --- @return #boolean true if the location is within the zone. -function ZONE_POLYGON:IsPointVec2InZone( PointVec2 ) - self:F2( PointVec2 ) - - local i - local j - local c = false - - i = 1 - j = #self.Polygon - - while i < #self.Polygon do - j = i - i = i + 1 - self:T( { i, j, self.Polygon[i], self.Polygon[j] } ) - if ( ( ( self.Polygon[i].y > PointVec2.y ) ~= ( self.Polygon[j].y > PointVec2.y ) ) and - ( PointVec2.x < ( self.Polygon[j].x - self.Polygon[i].x ) * ( PointVec2.y - self.Polygon[i].y ) / ( self.Polygon[j].y - self.Polygon[i].y ) + self.Polygon[i].x ) - ) then - c = not c - end - self:T2( { "c = ", c } ) - end - - self:T( { "c = ", c } ) - return c -end - ---- This module contains the CLIENT class. --- --- 1) @{Client#CLIENT} class, extends @{Unit#UNIT} --- =============================================== --- Clients are those **Units** defined within the Mission Editor that have the skillset defined as __Client__ or __Player__. --- Note that clients are NOT the same as Units, they are NOT necessarily alive. --- The @{Client#CLIENT} class is a wrapper class to handle the DCS Unit objects that have the skillset defined as __Client__ or __Player__: --- --- * Wraps the DCS Unit objects with skill level set to Player or Client. --- * Support all DCS Unit APIs. --- * Enhance with Unit specific APIs not in the DCS Group API set. --- * When player joins Unit, execute alive init logic. --- * Handles messages to players. --- * Manage the "state" of the DCS Unit. --- --- Clients are being used by the @{MISSION} class to follow players and register their successes. --- --- 1.1) CLIENT reference methods --- ----------------------------- --- For each DCS Unit having skill level Player or Client, a CLIENT wrapper object (instance) will be created within the _@{DATABASE} object. --- This is done at the beginning of the mission (when the mission starts). --- --- The CLIENT class does not contain a :New() method, rather it provides :Find() methods to retrieve the object reference --- using the DCS Unit or the DCS UnitName. --- --- Another thing to know is that CLIENT objects do not "contain" the DCS Unit object. --- The CLIENT methods will reference the DCS Unit object by name when it is needed during API execution. --- If the DCS Unit object does not exist or is nil, the CLIENT methods will return nil and log an exception in the DCS.log file. --- --- The CLIENT class provides the following functions to retrieve quickly the relevant CLIENT instance: --- --- * @{#CLIENT.Find}(): Find a CLIENT instance from the _DATABASE object using a DCS Unit object. --- * @{#CLIENT.FindByName}(): Find a CLIENT instance from the _DATABASE object using a DCS Unit name. --- --- IMPORTANT: ONE SHOULD NEVER SANATIZE these CLIENT OBJECT REFERENCES! (make the CLIENT object references nil). --- --- @module Client --- @author FlightControl - - - - - - - ---- The CLIENT class --- @type CLIENT --- @extends Unit#UNIT -CLIENT = { - ONBOARDSIDE = { - NONE = 0, - LEFT = 1, - RIGHT = 2, - BACK = 3, - FRONT = 4 - }, - ClassName = "CLIENT", - ClientName = nil, - ClientAlive = false, - ClientTransport = false, - ClientBriefingShown = false, - _Menus = {}, - _Tasks = {}, - Messages = { - } -} - - ---- Finds a CLIENT from the _DATABASE using the relevant DCS Unit. --- @param #CLIENT self --- @param #string ClientName Name of the DCS **Unit** as defined within the Mission Editor. --- @param #string ClientBriefing Text that describes the briefing of the mission when a Player logs into the Client. --- @return #CLIENT --- @usage --- -- Create new Clients. --- local Mission = MISSIONSCHEDULER.AddMission( 'Russia Transport Troops SA-6', 'Operational', 'Transport troops from the control center to one of the SA-6 SAM sites to activate their operation.', 'Russia' ) --- Mission:AddGoal( DeploySA6TroopsGoal ) --- --- Mission:AddClient( CLIENT:FindByName( 'RU MI-8MTV2*HOT-Deploy Troops 1' ):Transport() ) --- Mission:AddClient( CLIENT:FindByName( 'RU MI-8MTV2*RAMP-Deploy Troops 3' ):Transport() ) --- Mission:AddClient( CLIENT:FindByName( 'RU MI-8MTV2*HOT-Deploy Troops 2' ):Transport() ) --- Mission:AddClient( CLIENT:FindByName( 'RU MI-8MTV2*RAMP-Deploy Troops 4' ):Transport() ) -function CLIENT:Find( DCSUnit ) - local ClientName = DCSUnit:getName() - local ClientFound = _DATABASE:FindClient( ClientName ) - - if ClientFound then - ClientFound:F( ClientName ) - return ClientFound - end - - error( "CLIENT not found for: " .. ClientName ) -end - - ---- Finds a CLIENT from the _DATABASE using the relevant Client Unit Name. --- As an optional parameter, a briefing text can be given also. --- @param #CLIENT self --- @param #string ClientName Name of the DCS **Unit** as defined within the Mission Editor. --- @param #string ClientBriefing Text that describes the briefing of the mission when a Player logs into the Client. --- @return #CLIENT --- @usage --- -- Create new Clients. --- local Mission = MISSIONSCHEDULER.AddMission( 'Russia Transport Troops SA-6', 'Operational', 'Transport troops from the control center to one of the SA-6 SAM sites to activate their operation.', 'Russia' ) --- Mission:AddGoal( DeploySA6TroopsGoal ) --- --- Mission:AddClient( CLIENT:FindByName( 'RU MI-8MTV2*HOT-Deploy Troops 1' ):Transport() ) --- Mission:AddClient( CLIENT:FindByName( 'RU MI-8MTV2*RAMP-Deploy Troops 3' ):Transport() ) --- Mission:AddClient( CLIENT:FindByName( 'RU MI-8MTV2*HOT-Deploy Troops 2' ):Transport() ) --- Mission:AddClient( CLIENT:FindByName( 'RU MI-8MTV2*RAMP-Deploy Troops 4' ):Transport() ) -function CLIENT:FindByName( ClientName, ClientBriefing ) - local ClientFound = _DATABASE:FindClient( ClientName ) - - if ClientFound then - ClientFound:F( { ClientName, ClientBriefing } ) - ClientFound:AddBriefing( ClientBriefing ) - ClientFound.MessageSwitch = true - - return ClientFound - end - - error( "CLIENT not found for: " .. ClientName ) -end - -function CLIENT:Register( ClientName ) - local self = BASE:Inherit( self, UNIT:Register( ClientName ) ) - - self:F( ClientName ) - self.ClientName = ClientName - self.MessageSwitch = true - self.ClientAlive2 = false - - --self.AliveCheckScheduler = routines.scheduleFunction( self._AliveCheckScheduler, { self }, timer.getTime() + 1, 5 ) - self.AliveCheckScheduler = SCHEDULER:New( self, self._AliveCheckScheduler, {}, 1, 5 ) - - return self -end - - ---- Transport defines that the Client is a Transport. Transports show cargo. --- @param #CLIENT self --- @return #CLIENT -function CLIENT:Transport() - self:F() - - self.ClientTransport = true - return self -end - ---- AddBriefing adds a briefing to a CLIENT when a player joins a mission. --- @param #CLIENT self --- @param #string ClientBriefing is the text defining the Mission briefing. --- @return #CLIENT self -function CLIENT:AddBriefing( ClientBriefing ) - self:F( ClientBriefing ) - self.ClientBriefing = ClientBriefing - self.ClientBriefingShown = false - - return self -end - ---- Show the briefing of a CLIENT. --- @param #CLIENT self --- @return #CLIENT self -function CLIENT:ShowBriefing() - self:F( { self.ClientName, self.ClientBriefingShown } ) - - if not self.ClientBriefingShown then - self.ClientBriefingShown = true - local Briefing = "" - if self.ClientBriefing then - Briefing = Briefing .. self.ClientBriefing - end - Briefing = Briefing .. " Press [LEFT ALT]+[B] to view the complete mission briefing." - self:Message( Briefing, 60, self.ClientName .. '/ClientBriefing', "Briefing" ) - end - - return self -end - ---- Show the mission briefing of a MISSION to the CLIENT. --- @param #CLIENT self --- @param #string MissionBriefing --- @return #CLIENT self -function CLIENT:ShowMissionBriefing( MissionBriefing ) - self:F( { self.ClientName } ) - - if MissionBriefing then - self:Message( MissionBriefing, 60, self.ClientName .. '/MissionBriefing', "Mission Briefing" ) - end - - return self -end - - - ---- Resets a CLIENT. --- @param #CLIENT self --- @param #string ClientName Name of the Group as defined within the Mission Editor. The Group must have a Unit with the type Client. -function CLIENT:Reset( ClientName ) - self:F() - self._Menus = {} -end - --- Is Functions - ---- Checks if the CLIENT is a multi-seated UNIT. --- @param #CLIENT self --- @return #boolean true if multi-seated. -function CLIENT:IsMultiSeated() - self:F( self.ClientName ) - - local ClientMultiSeatedTypes = { - ["Mi-8MT"] = "Mi-8MT", - ["UH-1H"] = "UH-1H", - ["P-51B"] = "P-51B" - } - - if self:IsAlive() then - local ClientTypeName = self:GetClientGroupUnit():GetTypeName() - if ClientMultiSeatedTypes[ClientTypeName] then - return true - end - end - - return false -end - ---- Checks for a client alive event and calls a function on a continuous basis. --- @param #CLIENT self --- @param #function CallBack Function. --- @return #CLIENT -function CLIENT:Alive( CallBack, ... ) - self:F() - - self.ClientCallBack = CallBack - self.ClientParameters = arg - - return self -end - ---- @param #CLIENT self -function CLIENT:_AliveCheckScheduler() - self:F( { self.ClientName, self.ClientAlive2, self.ClientBriefingShown } ) - - if self:IsAlive() then -- Polymorphic call of UNIT - if self.ClientAlive2 == false then - self:ShowBriefing() - if self.ClientCallBack then - self:T("Calling Callback function") - self.ClientCallBack( self, unpack( self.ClientParameters ) ) - end - self.ClientAlive2 = true - end - else - if self.ClientAlive2 == true then - self.ClientAlive2 = false - end - end - - return true -end - ---- Return the DCSGroup of a Client. --- This function is modified to deal with a couple of bugs in DCS 1.5.3 --- @param #CLIENT self --- @return DCSGroup#Group -function CLIENT:GetDCSGroup() - self:F3() - --- local ClientData = Group.getByName( self.ClientName ) --- if ClientData and ClientData:isExist() then --- self:T( self.ClientName .. " : group found!" ) --- return ClientData --- else --- return nil --- end - - local ClientUnit = Unit.getByName( self.ClientName ) - - local CoalitionsData = { AlivePlayersRed = coalition.getPlayers( coalition.side.RED ), AlivePlayersBlue = coalition.getPlayers( coalition.side.BLUE ) } - for CoalitionId, CoalitionData in pairs( CoalitionsData ) do - self:T3( { "CoalitionData:", CoalitionData } ) - for UnitId, UnitData in pairs( CoalitionData ) do - self:T3( { "UnitData:", UnitData } ) - if UnitData and UnitData:isExist() then - - --self:E(self.ClientName) - if ClientUnit then - local ClientGroup = ClientUnit:getGroup() - if ClientGroup then - self:T3( "ClientGroup = " .. self.ClientName ) - if ClientGroup:isExist() and UnitData:getGroup():isExist() then - if ClientGroup:getID() == UnitData:getGroup():getID() then - self:T3( "Normal logic" ) - self:T3( self.ClientName .. " : group found!" ) - self.ClientGroupID = ClientGroup:getID() - self.ClientGroupName = ClientGroup:getName() - return ClientGroup - end - else - -- Now we need to resolve the bugs in DCS 1.5 ... - -- Consult the database for the units of the Client Group. (ClientGroup:getUnits() returns nil) - self:T3( "Bug 1.5 logic" ) - local ClientGroupTemplate = _DATABASE.Templates.Units[self.ClientName].GroupTemplate - self.ClientGroupID = ClientGroupTemplate.groupId - self.ClientGroupName = _DATABASE.Templates.Units[self.ClientName].GroupName - self:T3( self.ClientName .. " : group found in bug 1.5 resolvement logic!" ) - return ClientGroup - end - -- else - -- error( "Client " .. self.ClientName .. " not found!" ) - end - else - --self:E( { "Client not found!", self.ClientName } ) - end - end - end - end - - -- For non player clients - if ClientUnit then - local ClientGroup = ClientUnit:getGroup() - if ClientGroup then - self:T3( "ClientGroup = " .. self.ClientName ) - if ClientGroup:isExist() then - self:T3( "Normal logic" ) - self:T3( self.ClientName .. " : group found!" ) - return ClientGroup - end - end - end - - self.ClientGroupID = nil - self.ClientGroupUnit = nil - - return nil -end - - --- TODO: Check DCSTypes#Group.ID ---- Get the group ID of the client. --- @param #CLIENT self --- @return DCSTypes#Group.ID -function CLIENT:GetClientGroupID() - - local ClientGroup = self:GetDCSGroup() - - --self:E( self.ClientGroupID ) -- Determined in GetDCSGroup() - return self.ClientGroupID -end - - ---- Get the name of the group of the client. --- @param #CLIENT self --- @return #string -function CLIENT:GetClientGroupName() - - local ClientGroup = self:GetDCSGroup() - - self:T( self.ClientGroupName ) -- Determined in GetDCSGroup() - return self.ClientGroupName -end - ---- Returns the UNIT of the CLIENT. --- @param #CLIENT self --- @return Unit#UNIT -function CLIENT:GetClientGroupUnit() - self:F2() - - local ClientDCSUnit = Unit.getByName( self.ClientName ) - - self:T( self.ClientDCSUnit ) - if ClientDCSUnit and ClientDCSUnit:isExist() then - local ClientUnit = _DATABASE:FindUnit( self.ClientName ) - self:T2( ClientUnit ) - return ClientUnit - end -end - ---- Returns the DCSUnit of the CLIENT. --- @param #CLIENT self --- @return DCSTypes#Unit -function CLIENT:GetClientGroupDCSUnit() - self:F2() - - local ClientDCSUnit = Unit.getByName( self.ClientName ) - - if ClientDCSUnit and ClientDCSUnit:isExist() then - self:T2( ClientDCSUnit ) - return ClientDCSUnit - end -end - - ---- Evaluates if the CLIENT is a transport. --- @param #CLIENT self --- @return #boolean true is a transport. -function CLIENT:IsTransport() - self:F() - return self.ClientTransport -end - ---- Shows the @{Cargo#CARGO} contained within the CLIENT to the player as a message. --- The @{Cargo#CARGO} is shown using the @{Message#MESSAGE} distribution system. --- @param #CLIENT self -function CLIENT:ShowCargo() - self:F() - - local CargoMsg = "" - - for CargoName, Cargo in pairs( CARGOS ) do - if self == Cargo:IsLoadedInClient() then - CargoMsg = CargoMsg .. Cargo.CargoName .. " Type:" .. Cargo.CargoType .. " Weight: " .. Cargo.CargoWeight .. "\n" - end - end - - if CargoMsg == "" then - CargoMsg = "empty" - end - - self:Message( CargoMsg, 15, self.ClientName .. "/Cargo", "Co-Pilot: Cargo Status", 30 ) - -end - --- TODO (1) I urgently need to revise this. ---- A local function called by the DCS World Menu system to switch off messages. -function CLIENT.SwitchMessages( PrmTable ) - PrmTable[1].MessageSwitch = PrmTable[2] -end - ---- The main message driver for the CLIENT. --- This function displays various messages to the Player logged into the CLIENT through the DCS World Messaging system. --- @param #CLIENT self --- @param #string Message is the text describing the message. --- @param #number MessageDuration is the duration in seconds that the Message should be displayed. --- @param #string MessageId is a text identifying the Message in the MessageQueue. The Message system overwrites Messages with the same MessageId --- @param #string MessageCategory is the category of the message (the title). --- @param #number MessageInterval is the interval in seconds between the display of the @{Message#MESSAGE} when the CLIENT is in the air. -function CLIENT:Message( Message, MessageDuration, MessageId, MessageCategory, MessageInterval ) - self:F( { Message, MessageDuration, MessageId, MessageCategory, MessageInterval } ) - - if not self.MenuMessages then - if self:GetClientGroupID() then - self.MenuMessages = MENU_CLIENT:New( self, 'Messages' ) - self.MenuRouteMessageOn = MENU_CLIENT_COMMAND:New( self, 'Messages On', self.MenuMessages, CLIENT.SwitchMessages, { self, true } ) - self.MenuRouteMessageOff = MENU_CLIENT_COMMAND:New( self,'Messages Off', self.MenuMessages, CLIENT.SwitchMessages, { self, false } ) - end - end - - if self.MessageSwitch == true then - if MessageCategory == nil then - MessageCategory = "Messages" - end - if self.Messages[MessageId] == nil then - self.Messages[MessageId] = {} - self.Messages[MessageId].MessageId = MessageId - self.Messages[MessageId].MessageTime = timer.getTime() - self.Messages[MessageId].MessageDuration = MessageDuration - if MessageInterval == nil then - self.Messages[MessageId].MessageInterval = 600 - else - self.Messages[MessageId].MessageInterval = MessageInterval - end - MESSAGE:New( Message, MessageDuration, MessageCategory ):ToClient( self ) - else - if self:GetClientGroupDCSUnit() and not self:GetClientGroupDCSUnit():inAir() then - if timer.getTime() - self.Messages[MessageId].MessageTime >= self.Messages[MessageId].MessageDuration + 10 then - MESSAGE:New( Message, MessageDuration , MessageCategory):ToClient( self ) - self.Messages[MessageId].MessageTime = timer.getTime() - end - else - if timer.getTime() - self.Messages[MessageId].MessageTime >= self.Messages[MessageId].MessageDuration + self.Messages[MessageId].MessageInterval then - MESSAGE:New( Message, MessageDuration, MessageCategory ):ToClient( self ) - self.Messages[MessageId].MessageTime = timer.getTime() - end - end - end - end -end ---- This module contains the STATIC class. --- --- 1) @{Static#STATIC} class, extends @{Unit#UNIT} --- =============================================== --- Statics are **Static Units** defined within the Mission Editor. --- Note that Statics are almost the same as Units, but they don't have a controller. --- The @{Static#STATIC} class is a wrapper class to handle the DCS Static objects: --- --- * Wraps the DCS Static objects. --- * Support all DCS Static APIs. --- * Enhance with Static specific APIs not in the DCS API set. --- --- 1.1) STATIC reference methods --- ----------------------------- --- For each DCS Static will have a STATIC wrapper object (instance) within the _@{DATABASE} object. --- This is done at the beginning of the mission (when the mission starts). --- --- The STATIC class does not contain a :New() method, rather it provides :Find() methods to retrieve the object reference --- using the Static Name. --- --- Another thing to know is that STATIC objects do not "contain" the DCS Static object. --- The STATIc methods will reference the DCS Static object by name when it is needed during API execution. --- If the DCS Static object does not exist or is nil, the STATIC methods will return nil and log an exception in the DCS.log file. --- --- The STATIc class provides the following functions to retrieve quickly the relevant STATIC instance: --- --- * @{#STATIC.FindByName}(): Find a STATIC instance from the _DATABASE object using a DCS Static name. --- --- IMPORTANT: ONE SHOULD NEVER SANATIZE these STATIC OBJECT REFERENCES! (make the STATIC object references nil). --- --- @module Static --- @author FlightControl - - - - - - ---- The STATIC class --- @type STATIC --- @extends Unit#UNIT -STATIC = { - ClassName = "STATIC", -} - - ---- Finds a STATIC from the _DATABASE using the relevant Static Name. --- As an optional parameter, a briefing text can be given also. --- @param #STATIC self --- @param #string StaticName Name of the DCS **Static** as defined within the Mission Editor. --- @return #STATIC -function STATIC:FindByName( StaticName ) - local StaticFound = _DATABASE:FindStatic( StaticName ) - - if StaticFound then - StaticFound:F( { StaticName } ) - - return StaticFound - end - - error( "STATIC not found for: " .. StaticName ) -end - -function STATIC:Register( StaticName ) - local self = BASE:Inherit( self, UNIT:Register( StaticName ) ) - - self:F( StaticName ) - - return self -end - - -function STATIC:GetDCSUnit() - local DCSStatic = StaticObject.getByName( self.UnitName ) - - if DCSStatic then - return DCSStatic - end - - return nil -end ---- Manage the mission database. --- --- @{#DATABASE} class --- ================== --- Mission designers can use the DATABASE class to refer to: --- --- * UNITS --- * GROUPS --- * players --- * alive players --- * CLIENTS --- * alive CLIENTS --- --- On top, for internal MOOSE administration purposes, the DATBASE administers the Unit and Gruop templates as defined within the Mission Editor. --- --- Moose will automatically create one instance of the DATABASE class into the **global** object _DATABASE. --- Moose refers to _DATABASE within the framework extensively, but you can also refer to the _DATABASE object within your missions if required. --- --- DATABASE iterators: --- =================== --- You can iterate the database with the available iterator methods. --- The iterator methods will walk the DATABASE set, and call for each element within the set a function that you provide. --- The following iterator methods are currently available within the DATABASE: --- --- * @{#DATABASE.ForEachUnit}: Calls a function for each @{UNIT} it finds within the DATABASE. --- * @{#DATABASE.ForEachGroup}: Calls a function for each @{GROUP} it finds within the DATABASE. --- * @{#DATABASE.ForEachPlayer}: Calls a function for each player it finds within the DATABASE. --- * @{#DATABASE.ForEachPlayerAlive}: Calls a function for each alive player it finds within the DATABASE. --- * @{#DATABASE.ForEachClient}: Calls a function for each @{CLIENT} it finds within the DATABASE. --- * @{#DATABASE.ForEachClientAlive}: Calls a function for each alive @{CLIENT} it finds within the DATABASE. --- --- @module Database --- @author FlightControl - - - - - - - - - - - - ---- DATABASE class --- @type DATABASE --- @extends Base#BASE -DATABASE = { - ClassName = "DATABASE", - Templates = { - Units = {}, - Groups = {}, - ClientsByName = {}, - ClientsByID = {}, - }, - DCSUnits = {}, - DCSGroups = {}, - DCSStatics = {}, - UNITS = {}, - STATICS = {}, - GROUPS = {}, - PLAYERS = {}, - PLAYERSALIVE = {}, - CLIENTS = {}, - CLIENTSALIVE = {}, - NavPoints = {}, -} - -local _DATABASECoalition = - { - [1] = "Red", - [2] = "Blue", - } - -local _DATABASECategory = - { - [Unit.Category.AIRPLANE] = "Plane", - [Unit.Category.HELICOPTER] = "Helicopter", - [Unit.Category.GROUND_UNIT] = "Vehicle", - [Unit.Category.SHIP] = "Ship", - [Unit.Category.STRUCTURE] = "Structure", - } - - ---- Creates a new DATABASE object, building a set of units belonging to a coalitions, categories, countries, types or with defined prefix names. --- @param #DATABASE self --- @return #DATABASE --- @usage --- -- Define a new DATABASE Object. This DBObject will contain a reference to all Group and Unit Templates defined within the ME and the DCSRTE. --- DBObject = DATABASE:New() -function DATABASE:New() - - -- Inherits from BASE - local self = BASE:Inherit( self, BASE:New() ) - - _EVENTDISPATCHER:OnBirth( self._EventOnBirth, self ) - _EVENTDISPATCHER:OnDead( self._EventOnDeadOrCrash, self ) - _EVENTDISPATCHER:OnCrash( self._EventOnDeadOrCrash, self ) - - - -- Follow alive players and clients - _EVENTDISPATCHER:OnPlayerEnterUnit( self._EventOnPlayerEnterUnit, self ) - _EVENTDISPATCHER:OnPlayerLeaveUnit( self._EventOnPlayerLeaveUnit, self ) - - self:_RegisterTemplates() - self:_RegisterGroupsAndUnits() - self:_RegisterClients() - self:_RegisterStatics() - self:_RegisterPlayers() - - return self -end - ---- Finds a Unit based on the Unit Name. --- @param #DATABASE self --- @param #string UnitName --- @return Unit#UNIT The found Unit. -function DATABASE:FindUnit( UnitName ) - - local UnitFound = self.UNITS[UnitName] - return UnitFound -end - - ---- Adds a Unit based on the Unit Name in the DATABASE. --- @param #DATABASE self -function DATABASE:AddUnit( DCSUnit, DCSUnitName ) - - self.DCSUnits[DCSUnitName] = DCSUnit - self.UNITS[DCSUnitName] = UNIT:Register( DCSUnitName ) -end - - ---- Deletes a Unit from the DATABASE based on the Unit Name. --- @param #DATABASE self -function DATABASE:DeleteUnit( DCSUnitName ) - - self.DCSUnits[DCSUnitName] = nil -end - ---- Adds a Static based on the Static Name in the DATABASE. --- @param #DATABASE self -function DATABASE:AddStatic( DCSStatic, DCSStaticName ) - - self.DCSStatics[DCSStaticName] = DCSStatic - self.STATICS[DCSStaticName] = STATIC:Register( DCSStaticName ) -end - - ---- Deletes a Static from the DATABASE based on the Static Name. --- @param #DATABASE self -function DATABASE:DeleteStatic( DCSStaticName ) - - self.DCSStatics[DCSStaticName] = nil -end - ---- Finds a STATIC based on the StaticName. --- @param #DATABASE self --- @param #string StaticName --- @return Static#STATIC The found STATIC. -function DATABASE:FindStatic( StaticName ) - - local StaticFound = self.STATICS[StaticName] - return StaticFound -end - - ---- Finds a CLIENT based on the ClientName. --- @param #DATABASE self --- @param #string ClientName --- @return Client#CLIENT The found CLIENT. -function DATABASE:FindClient( ClientName ) - - local ClientFound = self.CLIENTS[ClientName] - return ClientFound -end - - ---- Adds a CLIENT based on the ClientName in the DATABASE. --- @param #DATABASE self -function DATABASE:AddClient( ClientName ) - - self.CLIENTS[ClientName] = CLIENT:Register( ClientName ) - self:E( self.CLIENTS[ClientName]:GetClassNameAndID() ) -end - - ---- Finds a GROUP based on the GroupName. --- @param #DATABASE self --- @param #string GroupName --- @return Group#GROUP The found GROUP. -function DATABASE:FindGroup( GroupName ) - - local GroupFound = self.GROUPS[GroupName] - return GroupFound -end - - ---- Adds a GROUP based on the GroupName in the DATABASE. --- @param #DATABASE self -function DATABASE:AddGroup( DCSGroup, GroupName ) - - self.DCSGroups[GroupName] = DCSGroup - self.GROUPS[GroupName] = GROUP:Register( GroupName ) -end - ---- Adds a player based on the Player Name in the DATABASE. --- @param #DATABASE self -function DATABASE:AddPlayer( UnitName, PlayerName ) - - if PlayerName then - self:E( { "Add player for unit:", UnitName, PlayerName } ) - self.PLAYERS[PlayerName] = PlayerName - self.PLAYERSALIVE[PlayerName] = PlayerName - self.CLIENTSALIVE[PlayerName] = self:FindClient( UnitName ) - end -end - ---- Deletes a player from the DATABASE based on the Player Name. --- @param #DATABASE self -function DATABASE:DeletePlayer( PlayerName ) - - if PlayerName then - self:E( { "Clean player:", PlayerName } ) - self.PLAYERSALIVE[PlayerName] = nil - self.CLIENTSALIVE[PlayerName] = nil - end -end - - ---- Instantiate new Groups within the DCSRTE. --- This method expects EXACTLY the same structure as a structure within the ME, and needs 2 additional fields defined: --- SpawnCountryID, SpawnCategoryID --- This method is used by the SPAWN class. --- @param #DATABASE self --- @param #table SpawnTemplate --- @return #DATABASE self -function DATABASE:Spawn( SpawnTemplate ) - self:F2( SpawnTemplate.name ) - - self:T2( { SpawnTemplate.SpawnCountryID, SpawnTemplate.SpawnCategoryID } ) - - -- Copy the spawn variables of the template in temporary storage, nullify, and restore the spawn variables. - local SpawnCoalitionID = SpawnTemplate.SpawnCoalitionID - local SpawnCountryID = SpawnTemplate.SpawnCountryID - local SpawnCategoryID = SpawnTemplate.SpawnCategoryID - - -- Nullify - SpawnTemplate.SpawnCoalitionID = nil - SpawnTemplate.SpawnCountryID = nil - SpawnTemplate.SpawnCategoryID = nil - - self:_RegisterTemplate( SpawnTemplate ) - - self:T3( SpawnTemplate ) - coalition.addGroup( SpawnCountryID, SpawnCategoryID, SpawnTemplate ) - - -- Restore - SpawnTemplate.SpawnCoalitionID = SpawnCoalitionID - SpawnTemplate.SpawnCountryID = SpawnCountryID - SpawnTemplate.SpawnCategoryID = SpawnCategoryID - - local SpawnGroup = GROUP:Register( SpawnTemplate.name ) - return SpawnGroup -end - ---- Set a status to a Group within the Database, this to check crossing events for example. -function DATABASE:SetStatusGroup( GroupName, Status ) - self:F2( Status ) - - self.Templates.Groups[GroupName].Status = Status -end - ---- Get a status to a Group within the Database, this to check crossing events for example. -function DATABASE:GetStatusGroup( GroupName ) - self:F2( Status ) - - if self.Templates.Groups[GroupName] then - return self.Templates.Groups[GroupName].Status - else - return "" - end -end - - ---- Private method that registers new Group Templates within the DATABASE Object. --- @param #DATABASE self --- @param #table GroupTemplate --- @return #DATABASE self -function DATABASE:_RegisterTemplate( GroupTemplate, CoalitionName, CategoryName, CountryName ) - - local GroupTemplateName = env.getValueDictByKey(GroupTemplate.name) - - if not self.Templates.Groups[GroupTemplateName] then - self.Templates.Groups[GroupTemplateName] = {} - self.Templates.Groups[GroupTemplateName].Status = nil - end - - -- Delete the spans from the route, it is not needed and takes memory. - if GroupTemplate.route and GroupTemplate.route.spans then - GroupTemplate.route.spans = nil - end - - self.Templates.Groups[GroupTemplateName].GroupName = GroupTemplateName - self.Templates.Groups[GroupTemplateName].Template = GroupTemplate - self.Templates.Groups[GroupTemplateName].groupId = GroupTemplate.groupId - self.Templates.Groups[GroupTemplateName].UnitCount = #GroupTemplate.units - self.Templates.Groups[GroupTemplateName].Units = GroupTemplate.units - self.Templates.Groups[GroupTemplateName].CategoryName = CategoryName - self.Templates.Groups[GroupTemplateName].CoalitionName = CoalitionName - self.Templates.Groups[GroupTemplateName].CountryName = CountryName - - self:T2( { "Group", self.Templates.Groups[GroupTemplateName].GroupName, self.Templates.Groups[GroupTemplateName].UnitCount } ) - - for unit_num, UnitTemplate in pairs( GroupTemplate.units ) do - - local UnitTemplateName = env.getValueDictByKey(UnitTemplate.name) - self.Templates.Units[UnitTemplateName] = {} - self.Templates.Units[UnitTemplateName].UnitName = UnitTemplateName - self.Templates.Units[UnitTemplateName].Template = UnitTemplate - self.Templates.Units[UnitTemplateName].GroupName = GroupTemplateName - self.Templates.Units[UnitTemplateName].GroupTemplate = GroupTemplate - self.Templates.Units[UnitTemplateName].GroupId = GroupTemplate.groupId - self.Templates.Units[UnitTemplateName].CategoryName = CategoryName - self.Templates.Units[UnitTemplateName].CoalitionName = CoalitionName - self.Templates.Units[UnitTemplateName].CountryName = CountryName - self:E( {"skill",UnitTemplate.skill}) - if UnitTemplate.skill and (UnitTemplate.skill == "Client" or UnitTemplate.skill == "Player") then - self.Templates.ClientsByName[UnitTemplateName] = UnitTemplate - self.Templates.ClientsByName[UnitTemplateName].CategoryName = CategoryName - self.Templates.ClientsByName[UnitTemplateName].CoalitionName = CoalitionName - self.Templates.ClientsByName[UnitTemplateName].CountryName = CountryName - self.Templates.ClientsByID[UnitTemplate.unitId] = UnitTemplate - end - self:E( { "Unit", self.Templates.Units[UnitTemplateName].UnitName } ) - end -end - - ---- Private method that registers all alive players in the mission. --- @param #DATABASE self --- @return #DATABASE self -function DATABASE:_RegisterPlayers() - - local CoalitionsData = { AlivePlayersRed = coalition.getPlayers( coalition.side.RED ), AlivePlayersBlue = coalition.getPlayers( coalition.side.BLUE ) } - for CoalitionId, CoalitionData in pairs( CoalitionsData ) do - for UnitId, UnitData in pairs( CoalitionData ) do - self:T3( { "UnitData:", UnitData } ) - if UnitData and UnitData:isExist() then - local UnitName = UnitData:getName() - local PlayerName = UnitData:getPlayerName() - if not self.PLAYERS[PlayerName] then - self:E( { "Add player for unit:", UnitName, PlayerName } ) - self:AddPlayer( UnitName, PlayerName ) - end - end - end - end - - return self -end - - ---- Private method that registers all Groups and Units within in the mission. --- @param #DATABASE self --- @return #DATABASE self -function DATABASE:_RegisterGroupsAndUnits() - - local CoalitionsData = { GroupsRed = coalition.getGroups( coalition.side.RED ), GroupsBlue = coalition.getGroups( coalition.side.BLUE ) } - for CoalitionId, CoalitionData in pairs( CoalitionsData ) do - for DCSGroupId, DCSGroup in pairs( CoalitionData ) do - - if DCSGroup:isExist() then - local DCSGroupName = DCSGroup:getName() - - self:E( { "Register Group:", DCSGroup, DCSGroupName } ) - self:AddGroup( DCSGroup, DCSGroupName ) - - for DCSUnitId, DCSUnit in pairs( DCSGroup:getUnits() ) do - - local DCSUnitName = DCSUnit:getName() - self:E( { "Register Unit:", DCSUnit, DCSUnitName } ) - self:AddUnit( DCSUnit, DCSUnitName ) - end - else - self:E( { "Group does not exist: ", DCSGroup } ) - end - - end - end - - return self -end - ---- Private method that registers all Units of skill Client or Player within in the mission. --- @param #DATABASE self --- @return #DATABASE self -function DATABASE:_RegisterClients() - - for ClientName, ClientTemplate in pairs( self.Templates.ClientsByName ) do - self:E( { "Register Client:", ClientName } ) - self:AddClient( ClientName ) - end - - return self -end - -function DATABASE:_RegisterStatics() - - local CoalitionsData = { GroupsRed = coalition.getStaticObjects( coalition.side.RED ), GroupsBlue = coalition.getStaticObjects( coalition.side.BLUE ) } - for CoalitionId, CoalitionData in pairs( CoalitionsData ) do - for DCSStaticId, DCSStatic in pairs( CoalitionData ) do - - if DCSStatic:isExist() then - local DCSStaticName = DCSStatic:getName() - - self:E( { "Register Static:", DCSStatic, DCSStaticName } ) - self:AddStatic( DCSStatic, DCSStaticName ) - else - self:E( { "Static does not exist: ", DCSStatic } ) - end - end - end - - return self -end - - ---- Events - ---- Handles the OnBirth event for the alive units set. --- @param #DATABASE self --- @param Event#EVENTDATA Event -function DATABASE:_EventOnBirth( Event ) - self:F2( { Event } ) - - if Event.IniDCSUnit then - self:AddUnit( Event.IniDCSUnit, Event.IniDCSUnitName ) - self:AddGroup( Event.IniDCSGroup, Event.IniDCSGroupName ) - self:_EventOnPlayerEnterUnit( Event ) - end -end - - ---- Handles the OnDead or OnCrash event for alive units set. --- @param #DATABASE self --- @param Event#EVENTDATA Event -function DATABASE:_EventOnDeadOrCrash( Event ) - self:F2( { Event } ) - - if Event.IniDCSUnit then - if self.DCSUnits[Event.IniDCSUnitName] then - self:DeleteUnit( Event.IniDCSUnitName ) - -- add logic to correctly remove a group once all units are destroyed... - end - end -end - - ---- Handles the OnPlayerEnterUnit event to fill the active players table (with the unit filter applied). --- @param #DATABASE self --- @param Event#EVENTDATA Event -function DATABASE:_EventOnPlayerEnterUnit( Event ) - self:F2( { Event } ) - - if Event.IniDCSUnit then - local PlayerName = Event.IniDCSUnit:getPlayerName() - if not self.PLAYERSALIVE[PlayerName] then - self:AddPlayer( Event.IniDCSUnitName, PlayerName ) - end - end -end - - ---- Handles the OnPlayerLeaveUnit event to clean the active players table. --- @param #DATABASE self --- @param Event#EVENTDATA Event -function DATABASE:_EventOnPlayerLeaveUnit( Event ) - self:F2( { Event } ) - - if Event.IniDCSUnit then - local PlayerName = Event.IniDCSUnit:getPlayerName() - if self.PLAYERSALIVE[PlayerName] then - self:DeletePlayer( PlayerName ) - end - end -end - ---- Iterators - ---- Iterate the DATABASE and call an iterator function for the given set, providing the Object for each element within the set and optional parameters. --- @param #DATABASE self --- @param #function IteratorFunction The function that will be called when there is an alive player in the database. --- @return #DATABASE self -function DATABASE:ForEach( IteratorFunction, arg, Set ) - self:F2( arg ) - - local function CoRoutine() - local Count = 0 - for ObjectID, Object in pairs( Set ) do - self:T2( Object ) - IteratorFunction( Object, unpack( arg ) ) - Count = Count + 1 - if Count % 10 == 0 then - coroutine.yield( false ) - end - end - return true - end - - local co = coroutine.create( CoRoutine ) - - local function Schedule() - - local status, res = coroutine.resume( co ) - self:T2( { status, res } ) - - if status == false then - error( res ) - end - if res == false then - return true -- resume next time the loop - end - - return false - end - - local Scheduler = SCHEDULER:New( self, Schedule, {}, 0.001, 0.001, 0 ) - - return self -end - - ---- Iterate the DATABASE and call an iterator function for each **alive** unit, providing the DCSUnit and optional parameters. --- @param #DATABASE self --- @param #function IteratorFunction The function that will be called when there is an alive unit in the database. The function needs to accept a DCSUnit parameter. --- @return #DATABASE self -function DATABASE:ForEachDCSUnit( IteratorFunction, ... ) - self:F2( arg ) - - self:ForEach( IteratorFunction, arg, self.DCSUnits ) - - return self -end - - ---- Iterate the DATABASE and call an iterator function for each **alive** UNIT, providing the UNIT and optional parameters. --- @param #DATABASE self --- @param #function IteratorFunction The function that will be called when there is an alive UNIT in the database. The function needs to accept a UNIT parameter. --- @return #DATABASE self -function DATABASE:ForEachUnit( IteratorFunction, ... ) - self:F2( arg ) - - self:ForEach( IteratorFunction, arg, self.UNITS ) - - return self -end - ---- Iterate the DATABASE and call an iterator function for each **alive** GROUP, providing the GROUP and optional parameters. --- @param #DATABASE self --- @param #function IteratorFunction The function that will be called when there is an alive GROUP in the database. The function needs to accept a GROUP parameter. --- @return #DATABASE self -function DATABASE:ForEachGroup( IteratorFunction, ... ) - self:F2( arg ) - - self:ForEach( IteratorFunction, arg, self.GROUPS ) - - return self -end - - ---- Iterate the DATABASE and call an iterator function for each player, providing the player name and optional parameters. --- @param #DATABASE self --- @param #function IteratorFunction The function that will be called when there is an player in the database. The function needs to accept the player name. --- @return #DATABASE self -function DATABASE:ForEachPlayer( IteratorFunction, ... ) - self:F2( arg ) - - self:ForEach( IteratorFunction, arg, self.PLAYERS ) - - return self -end - - ---- Iterate the DATABASE and call an iterator function for each **alive** player, providing the Unit of the player and optional parameters. --- @param #DATABASE self --- @param #function IteratorFunction The function that will be called when there is an alive player in the database. The function needs to accept a UNIT parameter. --- @return #DATABASE self -function DATABASE:ForEachPlayerAlive( IteratorFunction, ... ) - self:F2( arg ) - - self:ForEach( IteratorFunction, arg, self.PLAYERSALIVE ) - - return self -end - ---- Iterate the DATABASE and call an iterator function for each CLIENT, providing the CLIENT to the function and optional parameters. --- @param #DATABASE self --- @param #function IteratorFunction The function that will be called when there is an alive player in the database. The function needs to accept a CLIENT parameter. --- @return #DATABASE self -function DATABASE:ForEachClient( IteratorFunction, ... ) - self:F2( arg ) - - self:ForEach( IteratorFunction, arg, self.CLIENTS ) - - return self -end - ---- Iterate the DATABASE and call an iterator function for each **ALIVE** CLIENT, providing the CLIENT to the function and optional parameters. --- @param #DATABASE self --- @param #function IteratorFunction The function that will be called when there is an alive CLIENT in the database. The function needs to accept a CLIENT parameter. --- @return #DATABASE self -function DATABASE:ForEachClientAlive( IteratorFunction, ... ) - self:F2( arg ) - - self:ForEach( IteratorFunction, arg, self.CLIENTSALIVE ) - - return self -end - - -function DATABASE:_RegisterTemplates() - self:F2() - - self.Navpoints = {} - self.UNITS = {} - --Build routines.db.units and self.Navpoints - for CoalitionName, coa_data in pairs(env.mission.coalition) do - - if (CoalitionName == 'red' or CoalitionName == 'blue') and type(coa_data) == 'table' then - --self.Units[coa_name] = {} - - ---------------------------------------------- - -- build nav points DB - self.Navpoints[CoalitionName] = {} - if coa_data.nav_points then --navpoints - for nav_ind, nav_data in pairs(coa_data.nav_points) do - - if type(nav_data) == 'table' then - self.Navpoints[CoalitionName][nav_ind] = routines.utils.deepCopy(nav_data) - - self.Navpoints[CoalitionName][nav_ind]['name'] = nav_data.callsignStr -- name is a little bit more self-explanatory. - self.Navpoints[CoalitionName][nav_ind]['point'] = {} -- point is used by SSE, support it. - self.Navpoints[CoalitionName][nav_ind]['point']['x'] = nav_data.x - self.Navpoints[CoalitionName][nav_ind]['point']['y'] = 0 - self.Navpoints[CoalitionName][nav_ind]['point']['z'] = nav_data.y - end - end - end - ------------------------------------------------- - if coa_data.country then --there is a country table - for cntry_id, cntry_data in pairs(coa_data.country) do - - local CountryName = string.upper(cntry_data.name) - --self.Units[coa_name][countryName] = {} - --self.Units[coa_name][countryName]["countryId"] = cntry_data.id - - if type(cntry_data) == 'table' then --just making sure - - for obj_type_name, obj_type_data in pairs(cntry_data) do - - if obj_type_name == "helicopter" or obj_type_name == "ship" or obj_type_name == "plane" or obj_type_name == "vehicle" or obj_type_name == "static" then --should be an unncessary check - - local CategoryName = obj_type_name - - if ((type(obj_type_data) == 'table') and obj_type_data.group and (type(obj_type_data.group) == 'table') and (#obj_type_data.group > 0)) then --there's a group! - - --self.Units[coa_name][countryName][category] = {} - - for group_num, GroupTemplate in pairs(obj_type_data.group) do - - if GroupTemplate and GroupTemplate.units and type(GroupTemplate.units) == 'table' then --making sure again- this is a valid group - self:_RegisterTemplate( GroupTemplate, CoalitionName, CategoryName, CountryName ) - end --if GroupTemplate and GroupTemplate.units then - end --for group_num, GroupTemplate in pairs(obj_type_data.group) do - end --if ((type(obj_type_data) == 'table') and obj_type_data.group and (type(obj_type_data.group) == 'table') and (#obj_type_data.group > 0)) then - end --if obj_type_name == "helicopter" or obj_type_name == "ship" or obj_type_name == "plane" or obj_type_name == "vehicle" or obj_type_name == "static" then - end --for obj_type_name, obj_type_data in pairs(cntry_data) do - end --if type(cntry_data) == 'table' then - end --for cntry_id, cntry_data in pairs(coa_data.country) do - end --if coa_data.country then --there is a country table - end --if coa_name == 'red' or coa_name == 'blue' and type(coa_data) == 'table' then - end --for coa_name, coa_data in pairs(mission.coalition) do - - return self -end - - - - ---- This module contains the SET classes. --- --- === --- --- 1) @{Set#SET_BASE} class, extends @{Base#BASE} --- ================================================ --- The @{Set#SET_BASE} class defines the core functions that define a collection of objects. --- A SET provides iterators to iterate the SET, but will **temporarily** yield the ForEach interator loop at defined **"intervals"** to the mail simulator loop. --- In this way, large loops can be done while not blocking the simulator main processing loop. --- The default **"yield interval"** is after 10 objects processed. --- The default **"time interval"** is after 0.001 seconds. --- --- 1.1) Add or remove objects from the SET --- --------------------------------------- --- Some key core functions are @{Set#SET_BASE.Add} and @{Set#SET_BASE.Remove} to add or remove objects from the SET in your logic. --- --- 1.2) Define the SET iterator **"yield interval"** and the **"time interval"**. --- ------------------------------------------------------------------------------------- --- Modify the iterator intervals with the @{Set#SET_BASE.SetInteratorIntervals} method. --- You can set the **"yield interval"**, and the **"time interval"**. (See above). --- --- === --- --- 2) @{Set#SET_GROUP} class, extends @{Set#SET_BASE} --- ==================================================== --- Mission designers can use the @{Set#SET_GROUP} class to build sets of groups belonging to certain: --- --- * Coalitions --- * Categories --- * Countries --- * Starting with certain prefix strings. --- --- 2.1) SET_GROUP construction method: --- ----------------------------------- --- Create a new SET_GROUP object with the @{#SET_GROUP.New} method: --- --- * @{#SET_GROUP.New}: Creates a new SET_GROUP object. --- --- 2.2) Add or Remove GROUP(s) from SET_GROUP: --- ------------------------------------------- --- GROUPS can be added and removed using the @{Set#SET_GROUP.AddGroupsByName} and @{Set#SET_GROUP.RemoveGroupsByName} respectively. --- These methods take a single GROUP name or an array of GROUP names to be added or removed from SET_GROUP. --- --- 2.3) SET_GROUP filter criteria: --- ------------------------------- --- You can set filter criteria to define the set of groups within the SET_GROUP. --- Filter criteria are defined by: --- --- * @{#SET_GROUP.FilterCoalitions}: Builds the SET_GROUP with the groups belonging to the coalition(s). --- * @{#SET_GROUP.FilterCategories}: Builds the SET_GROUP with the groups belonging to the category(ies). --- * @{#SET_GROUP.FilterCountries}: Builds the SET_GROUP with the gruops belonging to the country(ies). --- * @{#SET_GROUP.FilterPrefixes}: Builds the SET_GROUP with the groups starting with the same prefix string(s). --- --- Once the filter criteria have been set for the SET_GROUP, you can start filtering using: --- --- * @{#SET_GROUP.FilterStart}: Starts the filtering of the groups within the SET_GROUP and add or remove GROUP objects **dynamically**. --- --- Planned filter criteria within development are (so these are not yet available): --- --- * @{#SET_GROUP.FilterZones}: Builds the SET_GROUP with the groups within a @{Zone#ZONE}. --- --- 2.4) SET_GROUP iterators: --- ------------------------- --- Once the filters have been defined and the SET_GROUP has been built, you can iterate the SET_GROUP with the available iterator methods. --- The iterator methods will walk the SET_GROUP set, and call for each element within the set a function that you provide. --- The following iterator methods are currently available within the SET_GROUP: --- --- * @{#SET_GROUP.ForEachGroup}: Calls a function for each alive group it finds within the SET_GROUP. --- * @{#SET_GROUP.ForEachGroupCompletelyInZone}: Iterate the SET_GROUP and call an iterator function for each **alive** GROUP presence completely in a @{Zone}, providing the GROUP and optional parameters to the called function. --- * @{#SET_GROUP.ForEachGroupPartlyInZone}: Iterate the SET_GROUP and call an iterator function for each **alive** GROUP presence partly in a @{Zone}, providing the GROUP and optional parameters to the called function. --- * @{#SET_GROUP.ForEachGroupNotInZone}: Iterate the SET_GROUP and call an iterator function for each **alive** GROUP presence not in a @{Zone}, providing the GROUP and optional parameters to the called function. --- --- ==== --- --- 3) @{Set#SET_UNIT} class, extends @{Set#SET_BASE} --- =================================================== --- Mission designers can use the @{Set#SET_UNIT} class to build sets of units belonging to certain: --- --- * Coalitions --- * Categories --- * Countries --- * Unit types --- * Starting with certain prefix strings. --- --- 3.1) SET_UNIT construction method: --- ---------------------------------- --- Create a new SET_UNIT object with the @{#SET_UNIT.New} method: --- --- * @{#SET_UNIT.New}: Creates a new SET_UNIT object. --- --- 3.2) Add or Remove UNIT(s) from SET_UNIT: --- ----------------------------------------- --- UNITs can be added and removed using the @{Set#SET_UNIT.AddUnitsByName} and @{Set#SET_UNIT.RemoveUnitsByName} respectively. --- These methods take a single UNIT name or an array of UNIT names to be added or removed from SET_UNIT. --- --- 3.3) SET_UNIT filter criteria: --- ------------------------------ --- You can set filter criteria to define the set of units within the SET_UNIT. --- Filter criteria are defined by: --- --- * @{#SET_UNIT.FilterCoalitions}: Builds the SET_UNIT with the units belonging to the coalition(s). --- * @{#SET_UNIT.FilterCategories}: Builds the SET_UNIT with the units belonging to the category(ies). --- * @{#SET_UNIT.FilterTypes}: Builds the SET_UNIT with the units belonging to the unit type(s). --- * @{#SET_UNIT.FilterCountries}: Builds the SET_UNIT with the units belonging to the country(ies). --- * @{#SET_UNIT.FilterPrefixes}: Builds the SET_UNIT with the units starting with the same prefix string(s). --- --- Once the filter criteria have been set for the SET_UNIT, you can start filtering using: --- --- * @{#SET_UNIT.FilterStart}: Starts the filtering of the units within the SET_UNIT. --- --- Planned filter criteria within development are (so these are not yet available): --- --- * @{#SET_UNIT.FilterZones}: Builds the SET_UNIT with the units within a @{Zone#ZONE}. --- --- 3.4) SET_UNIT iterators: --- ------------------------ --- Once the filters have been defined and the SET_UNIT has been built, you can iterate the SET_UNIT with the available iterator methods. --- The iterator methods will walk the SET_UNIT set, and call for each element within the set a function that you provide. --- The following iterator methods are currently available within the SET_UNIT: --- --- * @{#SET_UNIT.ForEachUnit}: Calls a function for each alive unit it finds within the SET_UNIT. --- * @{#SET_GROUP.ForEachGroupCompletelyInZone}: Iterate the SET_GROUP and call an iterator function for each **alive** GROUP presence completely in a @{Zone}, providing the GROUP and optional parameters to the called function. --- * @{#SET_GROUP.ForEachGroupNotInZone}: Iterate the SET_GROUP and call an iterator function for each **alive** GROUP presence not in a @{Zone}, providing the GROUP and optional parameters to the called function. --- --- Planned iterators methods in development are (so these are not yet available): --- --- * @{#SET_UNIT.ForEachUnitInUnit}: Calls a function for each unit contained within the SET_UNIT. --- * @{#SET_UNIT.ForEachUnitCompletelyInZone}: Iterate and call an iterator function for each **alive** UNIT presence completely in a @{Zone}, providing the UNIT and optional parameters to the called function. --- * @{#SET_UNIT.ForEachUnitNotInZone}: Iterate and call an iterator function for each **alive** UNIT presence not in a @{Zone}, providing the UNIT and optional parameters to the called function. --- --- 4) @{Set#SET_CLIENT} class, extends @{Set#SET_BASE} --- =================================================== --- Mission designers can use the @{Set#SET_CLIENT} class to build sets of units belonging to certain: --- --- * Coalitions --- * Categories --- * Countries --- * Client types --- * Starting with certain prefix strings. --- --- 4.1) SET_CLIENT construction method: --- ---------------------------------- --- Create a new SET_CLIENT object with the @{#SET_CLIENT.New} method: --- --- * @{#SET_CLIENT.New}: Creates a new SET_CLIENT object. --- --- 4.2) Add or Remove CLIENT(s) from SET_CLIENT: --- ----------------------------------------- --- CLIENTs can be added and removed using the @{Set#SET_CLIENT.AddClientsByName} and @{Set#SET_CLIENT.RemoveClientsByName} respectively. --- These methods take a single CLIENT name or an array of CLIENT names to be added or removed from SET_CLIENT. --- --- 4.3) SET_CLIENT filter criteria: --- ------------------------------ --- You can set filter criteria to define the set of clients within the SET_CLIENT. --- Filter criteria are defined by: --- --- * @{#SET_CLIENT.FilterCoalitions}: Builds the SET_CLIENT with the clients belonging to the coalition(s). --- * @{#SET_CLIENT.FilterCategories}: Builds the SET_CLIENT with the clients belonging to the category(ies). --- * @{#SET_CLIENT.FilterTypes}: Builds the SET_CLIENT with the clients belonging to the client type(s). --- * @{#SET_CLIENT.FilterCountries}: Builds the SET_CLIENT with the clients belonging to the country(ies). --- * @{#SET_CLIENT.FilterPrefixes}: Builds the SET_CLIENT with the clients starting with the same prefix string(s). --- --- Once the filter criteria have been set for the SET_CLIENT, you can start filtering using: --- --- * @{#SET_CLIENT.FilterStart}: Starts the filtering of the clients within the SET_CLIENT. --- --- Planned filter criteria within development are (so these are not yet available): --- --- * @{#SET_CLIENT.FilterZones}: Builds the SET_CLIENT with the clients within a @{Zone#ZONE}. --- --- 4.4) SET_CLIENT iterators: --- ------------------------ --- Once the filters have been defined and the SET_CLIENT has been built, you can iterate the SET_CLIENT with the available iterator methods. --- The iterator methods will walk the SET_CLIENT set, and call for each element within the set a function that you provide. --- The following iterator methods are currently available within the SET_CLIENT: --- --- * @{#SET_CLIENT.ForEachClient}: Calls a function for each alive client it finds within the SET_CLIENT. --- --- ==== --- --- @module Set --- @author FlightControl - ---- SET_BASE class --- @type SET_BASE --- @extends Base#BASE -SET_BASE = { - ClassName = "SET_BASE", - Set = {}, - Database = {}, -} - ---- Creates a new SET_BASE object, building a set of units belonging to a coalitions, categories, countries, types or with defined prefix names. --- @param #SET_BASE self --- @return #SET_BASE --- @usage --- -- Define a new SET_BASE Object. This DBObject will contain a reference to all Group and Unit Templates defined within the ME and the DCSRTE. --- DBObject = SET_BASE:New() -function SET_BASE:New( Database ) - - -- Inherits from BASE - local self = BASE:Inherit( self, BASE:New() ) - - self.Database = Database - - self.YieldInterval = 10 - self.TimeInterval = 0.001 - - return self -end - ---- Finds an @{Base#BASE} object based on the object Name. --- @param #SET_BASE self --- @param #string ObjectName --- @return Base#BASE The Object found. -function SET_BASE:_Find( ObjectName ) - - local ObjectFound = self.Set[ObjectName] - return ObjectFound -end - - ---- Adds a @{Base#BASE} object in the @{Set#SET_BASE}, using the Object Name as the index. --- @param #SET_BASE self --- @param #string ObjectName --- @param Base#BASE Object --- @return Base#BASE The added BASE Object. -function SET_BASE:Add( ObjectName, Object ) - - self.Set[ObjectName] = Object -end - ---- Removes a @{Base#BASE} object from the @{Set#SET_BASE} and derived classes, based on the Object Name. --- @param #SET_BASE self --- @param #string ObjectName -function SET_BASE:Remove( ObjectName ) - - self.Set[ObjectName] = nil -end - ---- Define the SET iterator **"yield interval"** and the **"time interval"**. --- @param #SET_BASE self --- @param #number YieldInterval Sets the frequency when the iterator loop will yield after the number of objects processed. The default frequency is 10 objects processed. --- @param #number TimeInterval Sets the time in seconds when the main logic will resume the iterator loop. The default time is 0.001 seconds. --- @return #SET_BASE self -function SET_BASE:SetIteratorIntervals( YieldInterval, TimeInterval ) - - self.YieldInterval = YieldInterval - self.TimeInterval = TimeInterval - - return self -end - - - ---- Starts the filtering for the defined collection. --- @param #SET_BASE self --- @return #SET_BASE self -function SET_BASE:_FilterStart() - - for ObjectName, Object in pairs( self.Database ) do - - if self:IsIncludeObject( Object ) then - self:E( { "Adding Object:", ObjectName } ) - self:Add( ObjectName, Object ) - end - end - - _EVENTDISPATCHER:OnBirth( self._EventOnBirth, self ) - _EVENTDISPATCHER:OnDead( self._EventOnDeadOrCrash, self ) - _EVENTDISPATCHER:OnCrash( self._EventOnDeadOrCrash, self ) - - -- Follow alive players and clients --- _EVENTDISPATCHER:OnPlayerEnterUnit( self._EventOnPlayerEnterUnit, self ) --- _EVENTDISPATCHER:OnPlayerLeaveUnit( self._EventOnPlayerLeaveUnit, self ) - - - return self -end - - - ------ Private method that registers all alive players in the mission. ----- @param #SET_BASE self ----- @return #SET_BASE self ---function SET_BASE:_RegisterPlayers() --- --- local CoalitionsData = { AlivePlayersRed = coalition.getPlayers( coalition.side.RED ), AlivePlayersBlue = coalition.getPlayers( coalition.side.BLUE ) } --- for CoalitionId, CoalitionData in pairs( CoalitionsData ) do --- for UnitId, UnitData in pairs( CoalitionData ) do --- self:T3( { "UnitData:", UnitData } ) --- if UnitData and UnitData:isExist() then --- local UnitName = UnitData:getName() --- if not self.PlayersAlive[UnitName] then --- self:E( { "Add player for unit:", UnitName, UnitData:getPlayerName() } ) --- self.PlayersAlive[UnitName] = UnitData:getPlayerName() --- end --- end --- end --- end --- --- return self ---end - ---- Events - ---- Handles the OnBirth event for the Set. --- @param #SET_BASE self --- @param Event#EVENTDATA Event -function SET_BASE:_EventOnBirth( Event ) - self:F3( { Event } ) - - if Event.IniDCSUnit then - local ObjectName, Object = self:AddInDatabase( Event ) - self:T3( ObjectName, Object ) - if self:IsIncludeObject( Object ) then - self:Add( ObjectName, Object ) - --self:_EventOnPlayerEnterUnit( Event ) - end - end -end - ---- Handles the OnDead or OnCrash event for alive units set. --- @param #SET_BASE self --- @param Event#EVENTDATA Event -function SET_BASE:_EventOnDeadOrCrash( Event ) - self:F3( { Event } ) - - if Event.IniDCSUnit then - local ObjectName, Object = self:FindInDatabase( Event ) - if ObjectName and Object then - self:Remove( ObjectName ) - end - end -end - ------ Handles the OnPlayerEnterUnit event to fill the active players table (with the unit filter applied). ----- @param #SET_BASE self ----- @param Event#EVENTDATA Event ---function SET_BASE:_EventOnPlayerEnterUnit( Event ) --- self:F3( { Event } ) --- --- if Event.IniDCSUnit then --- if self:IsIncludeObject( Event.IniDCSUnit ) then --- if not self.PlayersAlive[Event.IniDCSUnitName] then --- self:E( { "Add player for unit:", Event.IniDCSUnitName, Event.IniDCSUnit:getPlayerName() } ) --- self.PlayersAlive[Event.IniDCSUnitName] = Event.IniDCSUnit:getPlayerName() --- self.ClientsAlive[Event.IniDCSUnitName] = _DATABASE.Clients[ Event.IniDCSUnitName ] --- end --- end --- end ---end --- ------ Handles the OnPlayerLeaveUnit event to clean the active players table. ----- @param #SET_BASE self ----- @param Event#EVENTDATA Event ---function SET_BASE:_EventOnPlayerLeaveUnit( Event ) --- self:F3( { Event } ) --- --- if Event.IniDCSUnit then --- if self:IsIncludeObject( Event.IniDCSUnit ) then --- if self.PlayersAlive[Event.IniDCSUnitName] then --- self:E( { "Cleaning player for unit:", Event.IniDCSUnitName, Event.IniDCSUnit:getPlayerName() } ) --- self.PlayersAlive[Event.IniDCSUnitName] = nil --- self.ClientsAlive[Event.IniDCSUnitName] = nil --- end --- end --- end ---end - --- Iterators - ---- Iterate the SET_BASE and derived classes and call an iterator function for the given SET_BASE, providing the Object for each element within the set and optional parameters. --- @param #SET_BASE self --- @param #function IteratorFunction The function that will be called. --- @return #SET_BASE self -function SET_BASE:ForEach( IteratorFunction, arg, Set, Function, FunctionArguments ) - self:F3( arg ) - - local function CoRoutine() - local Count = 0 - for ObjectID, Object in pairs( Set ) do - self:T2( Object ) - if Function then - if Function( unpack( FunctionArguments ), Object ) == true then - IteratorFunction( Object, unpack( arg ) ) - end - else - IteratorFunction( Object, unpack( arg ) ) - end - Count = Count + 1 - if Count % self.YieldInterval == 0 then - coroutine.yield( false ) - end - end - return true - end - - local co = coroutine.create( CoRoutine ) - - local function Schedule() - - local status, res = coroutine.resume( co ) - self:T3( { status, res } ) - - if status == false then - error( res ) - end - if res == false then - return true -- resume next time the loop - end - - return false - end - - local Scheduler = SCHEDULER:New( self, Schedule, {}, self.TimeInterval, self.TimeInterval, 0 ) - - return self -end - - ------ Interate the SET_BASE and call an interator function for each **alive** unit, providing the Unit and optional parameters. ----- @param #SET_BASE self ----- @param #function IteratorFunction The function that will be called when there is an alive unit in the SET_BASE. The function needs to accept a UNIT parameter. ----- @return #SET_BASE self ---function SET_BASE:ForEachDCSUnitAlive( IteratorFunction, ... ) --- self:F3( arg ) --- --- self:ForEach( IteratorFunction, arg, self.DCSUnitsAlive ) --- --- return self ---end --- ------ Interate the SET_BASE and call an interator function for each **alive** player, providing the Unit of the player and optional parameters. ----- @param #SET_BASE self ----- @param #function IteratorFunction The function that will be called when there is an alive player in the SET_BASE. The function needs to accept a UNIT parameter. ----- @return #SET_BASE self ---function SET_BASE:ForEachPlayer( IteratorFunction, ... ) --- self:F3( arg ) --- --- self:ForEach( IteratorFunction, arg, self.PlayersAlive ) --- --- return self ---end --- --- ------ Interate the SET_BASE and call an interator function for each client, providing the Client to the function and optional parameters. ----- @param #SET_BASE self ----- @param #function IteratorFunction The function that will be called when there is an alive player in the SET_BASE. The function needs to accept a CLIENT parameter. ----- @return #SET_BASE self ---function SET_BASE:ForEachClient( IteratorFunction, ... ) --- self:F3( arg ) --- --- self:ForEach( IteratorFunction, arg, self.Clients ) --- --- return self ---end - - ---- Decides whether to include the Object --- @param #SET_BASE self --- @param #table Object --- @return #SET_BASE self -function SET_BASE:IsIncludeObject( Object ) - self:F3( Object ) - - return true -end - ---- Flushes the current SET_BASE contents in the log ... (for debug reasons). --- @param #SET_BASE self --- @return #string A string with the names of the objects. -function SET_BASE:Flush() - self:F3() - - local ObjectNames = "" - for ObjectName, Object in pairs( self.Set ) do - ObjectNames = ObjectNames .. ObjectName .. ", " - end - self:T( { "Objects in Set:", ObjectNames } ) - - return ObjectNames -end - --- SET_GROUP - ---- SET_GROUP class --- @type SET_GROUP --- @extends Set#SET_BASE -SET_GROUP = { - ClassName = "SET_GROUP", - Filter = { - Coalitions = nil, - Categories = nil, - Countries = nil, - GroupPrefixes = nil, - }, - FilterMeta = { - Coalitions = { - red = coalition.side.RED, - blue = coalition.side.BLUE, - neutral = coalition.side.NEUTRAL, - }, - Categories = { - plane = Group.Category.AIRPLANE, - helicopter = Group.Category.HELICOPTER, - ground = Group.Category.GROUND_UNIT, - ship = Group.Category.SHIP, - structure = Group.Category.STRUCTURE, - }, - }, -} - - ---- Creates a new SET_GROUP object, building a set of groups belonging to a coalitions, categories, countries, types or with defined prefix names. --- @param #SET_GROUP self --- @return #SET_GROUP --- @usage --- -- Define a new SET_GROUP Object. This DBObject will contain a reference to all alive GROUPS. --- DBObject = SET_GROUP:New() -function SET_GROUP:New() - - -- Inherits from BASE - local self = BASE:Inherit( self, SET_BASE:New( _DATABASE.GROUPS ) ) - - return self -end - ---- Add GROUP(s) to SET_GROUP. --- @param Set#SET_GROUP self --- @param #string AddGroupNames A single name or an array of GROUP names. --- @return self -function SET_GROUP:AddGroupsByName( AddGroupNames ) - - local AddGroupNamesArray = ( type( AddGroupNames ) == "table" ) and AddGroupNames or { AddGroupNames } - - for AddGroupID, AddGroupName in pairs( AddGroupNamesArray ) do - self:Add( AddGroupName, GROUP:FindByName( AddGroupName ) ) - end - - return self -end - ---- Remove GROUP(s) from SET_GROUP. --- @param Set#SET_GROUP self --- @param Group#GROUP RemoveGroupNames A single name or an array of GROUP names. --- @return self -function SET_GROUP:RemoveGroupsByName( RemoveGroupNames ) - - local RemoveGroupNamesArray = ( type( RemoveGroupNames ) == "table" ) and RemoveGroupNames or { RemoveGroupNames } - - for RemoveGroupID, RemoveGroupName in pairs( RemoveGroupNamesArray ) do - self:Remove( RemoveGroupName.GroupName ) - end - - return self -end - - - - ---- Finds a Group based on the Group Name. --- @param #SET_GROUP self --- @param #string GroupName --- @return Group#GROUP The found Group. -function SET_GROUP:FindGroup( GroupName ) - - local GroupFound = self.Set[GroupName] - return GroupFound -end - - - ---- Builds a set of groups of coalitions. --- Possible current coalitions are red, blue and neutral. --- @param #SET_GROUP self --- @param #string Coalitions Can take the following values: "red", "blue", "neutral". --- @return #SET_GROUP self -function SET_GROUP:FilterCoalitions( Coalitions ) - if not self.Filter.Coalitions then - self.Filter.Coalitions = {} - end - if type( Coalitions ) ~= "table" then - Coalitions = { Coalitions } - end - for CoalitionID, Coalition in pairs( Coalitions ) do - self.Filter.Coalitions[Coalition] = Coalition - end - return self -end - - ---- Builds a set of groups out of categories. --- Possible current categories are plane, helicopter, ground, ship. --- @param #SET_GROUP self --- @param #string Categories Can take the following values: "plane", "helicopter", "ground", "ship". --- @return #SET_GROUP self -function SET_GROUP:FilterCategories( Categories ) - if not self.Filter.Categories then - self.Filter.Categories = {} - end - if type( Categories ) ~= "table" then - Categories = { Categories } - end - for CategoryID, Category in pairs( Categories ) do - self.Filter.Categories[Category] = Category - end - return self -end - ---- Builds a set of groups of defined countries. --- Possible current countries are those known within DCS world. --- @param #SET_GROUP self --- @param #string Countries Can take those country strings known within DCS world. --- @return #SET_GROUP self -function SET_GROUP:FilterCountries( Countries ) - if not self.Filter.Countries then - self.Filter.Countries = {} - end - if type( Countries ) ~= "table" then - Countries = { Countries } - end - for CountryID, Country in pairs( Countries ) do - self.Filter.Countries[Country] = Country - end - return self -end - - ---- Builds a set of groups of defined GROUP prefixes. --- All the groups starting with the given prefixes will be included within the set. --- @param #SET_GROUP self --- @param #string Prefixes The prefix of which the group name starts with. --- @return #SET_GROUP self -function SET_GROUP:FilterPrefixes( Prefixes ) - if not self.Filter.GroupPrefixes then - self.Filter.GroupPrefixes = {} - end - if type( Prefixes ) ~= "table" then - Prefixes = { Prefixes } - end - for PrefixID, Prefix in pairs( Prefixes ) do - self.Filter.GroupPrefixes[Prefix] = Prefix - end - return self -end - - ---- Starts the filtering. --- @param #SET_GROUP self --- @return #SET_GROUP self -function SET_GROUP:FilterStart() - - if _DATABASE then - self:_FilterStart() - end - - return self -end - ---- Handles the Database to check on an event (birth) that the Object was added in the Database. --- This is required, because sometimes the _DATABASE birth event gets called later than the SET_BASE birth event! --- @param #SET_GROUP self --- @param Event#EVENTDATA Event --- @return #string The name of the GROUP --- @return #table The GROUP -function SET_GROUP:AddInDatabase( Event ) - self:F3( { Event } ) - - if not self.Database[Event.IniDCSGroupName] then - self.Database[Event.IniDCSGroupName] = GROUP:Register( Event.IniDCSGroupName ) - self:T3( self.Database[Event.IniDCSGroupName] ) - end - - return Event.IniDCSGroupName, self.Database[Event.IniDCSGroupName] -end - ---- Handles the Database to check on any event that Object exists in the Database. --- This is required, because sometimes the _DATABASE event gets called later than the SET_BASE event or vise versa! --- @param #SET_GROUP self --- @param Event#EVENTDATA Event --- @return #string The name of the GROUP --- @return #table The GROUP -function SET_GROUP:FindInDatabase( Event ) - self:F3( { Event } ) - - return Event.IniDCSGroupName, self.Database[Event.IniDCSGroupName] -end - ---- Iterate the SET_GROUP and call an iterator function for each **alive** GROUP, providing the GROUP and optional parameters. --- @param #SET_GROUP self --- @param #function IteratorFunction The function that will be called when there is an alive GROUP in the SET_GROUP. The function needs to accept a GROUP parameter. --- @return #SET_GROUP self -function SET_GROUP:ForEachGroup( IteratorFunction, ... ) - self:F2( arg ) - - self:ForEach( IteratorFunction, arg, self.Set ) - - return self -end - ---- Iterate the SET_GROUP and call an iterator function for each **alive** GROUP presence completely in a @{Zone}, providing the GROUP and optional parameters to the called function. --- @param #SET_GROUP self --- @param Zone#ZONE ZoneObject The Zone to be tested for. --- @param #function IteratorFunction The function that will be called when there is an alive GROUP in the SET_GROUP. The function needs to accept a GROUP parameter. --- @return #SET_GROUP self -function SET_GROUP:ForEachGroupCompletelyInZone( ZoneObject, IteratorFunction, ... ) - self:F2( arg ) - - self:ForEach( IteratorFunction, arg, self.Set, - --- @param Zone#ZONE_BASE ZoneObject - -- @param Group#GROUP GroupObject - function( ZoneObject, GroupObject ) - if GroupObject:IsCompletelyInZone( ZoneObject ) then - return true - else - return false - end - end, { ZoneObject } ) - - return self -end - ---- Iterate the SET_GROUP and call an iterator function for each **alive** GROUP presence partly in a @{Zone}, providing the GROUP and optional parameters to the called function. --- @param #SET_GROUP self --- @param Zone#ZONE ZoneObject The Zone to be tested for. --- @param #function IteratorFunction The function that will be called when there is an alive GROUP in the SET_GROUP. The function needs to accept a GROUP parameter. --- @return #SET_GROUP self -function SET_GROUP:ForEachGroupPartlyInZone( ZoneObject, IteratorFunction, ... ) - self:F2( arg ) - - self:ForEach( IteratorFunction, arg, self.Set, - --- @param Zone#ZONE_BASE ZoneObject - -- @param Group#GROUP GroupObject - function( ZoneObject, GroupObject ) - if GroupObject:IsPartlyInZone( ZoneObject ) then - return true - else - return false - end - end, { ZoneObject } ) - - return self -end - ---- Iterate the SET_GROUP and call an iterator function for each **alive** GROUP presence not in a @{Zone}, providing the GROUP and optional parameters to the called function. --- @param #SET_GROUP self --- @param Zone#ZONE ZoneObject The Zone to be tested for. --- @param #function IteratorFunction The function that will be called when there is an alive GROUP in the SET_GROUP. The function needs to accept a GROUP parameter. --- @return #SET_GROUP self -function SET_GROUP:ForEachGroupNotInZone( ZoneObject, IteratorFunction, ... ) - self:F2( arg ) - - self:ForEach( IteratorFunction, arg, self.Set, - --- @param Zone#ZONE_BASE ZoneObject - -- @param Group#GROUP GroupObject - function( ZoneObject, GroupObject ) - if GroupObject:IsNotInZone( ZoneObject ) then - return true - else - return false - end - end, { ZoneObject } ) - - return self -end - - ------ Interate the SET_GROUP and call an interator function for each **alive** player, providing the Group of the player and optional parameters. ----- @param #SET_GROUP self ----- @param #function IteratorFunction The function that will be called when there is an alive player in the SET_GROUP. The function needs to accept a GROUP parameter. ----- @return #SET_GROUP self ---function SET_GROUP:ForEachPlayer( IteratorFunction, ... ) --- self:F2( arg ) --- --- self:ForEach( IteratorFunction, arg, self.PlayersAlive ) --- --- return self ---end --- --- ------ Interate the SET_GROUP and call an interator function for each client, providing the Client to the function and optional parameters. ----- @param #SET_GROUP self ----- @param #function IteratorFunction The function that will be called when there is an alive player in the SET_GROUP. The function needs to accept a CLIENT parameter. ----- @return #SET_GROUP self ---function SET_GROUP:ForEachClient( IteratorFunction, ... ) --- self:F2( arg ) --- --- self:ForEach( IteratorFunction, arg, self.Clients ) --- --- return self ---end - - ---- --- @param #SET_GROUP self --- @param Group#GROUP MooseGroup --- @return #SET_GROUP self -function SET_GROUP:IsIncludeObject( MooseGroup ) - self:F2( MooseGroup ) - local MooseGroupInclude = true - - if self.Filter.Coalitions then - local MooseGroupCoalition = false - for CoalitionID, CoalitionName in pairs( self.Filter.Coalitions ) do - self:T3( { "Coalition:", MooseGroup:GetCoalition(), self.FilterMeta.Coalitions[CoalitionName], CoalitionName } ) - if self.FilterMeta.Coalitions[CoalitionName] and self.FilterMeta.Coalitions[CoalitionName] == MooseGroup:GetCoalition() then - MooseGroupCoalition = true - end - end - MooseGroupInclude = MooseGroupInclude and MooseGroupCoalition - end - - if self.Filter.Categories then - local MooseGroupCategory = false - for CategoryID, CategoryName in pairs( self.Filter.Categories ) do - self:T3( { "Category:", MooseGroup:GetCategory(), self.FilterMeta.Categories[CategoryName], CategoryName } ) - if self.FilterMeta.Categories[CategoryName] and self.FilterMeta.Categories[CategoryName] == MooseGroup:GetCategory() then - MooseGroupCategory = true - end - end - MooseGroupInclude = MooseGroupInclude and MooseGroupCategory - end - - if self.Filter.Countries then - local MooseGroupCountry = false - for CountryID, CountryName in pairs( self.Filter.Countries ) do - self:T3( { "Country:", MooseGroup:GetCountry(), CountryName } ) - if country.id[CountryName] == MooseGroup:GetCountry() then - MooseGroupCountry = true - end - end - MooseGroupInclude = MooseGroupInclude and MooseGroupCountry - end - - if self.Filter.GroupPrefixes then - local MooseGroupPrefix = false - for GroupPrefixId, GroupPrefix in pairs( self.Filter.GroupPrefixes ) do - self:T3( { "Prefix:", string.find( MooseGroup:GetName(), GroupPrefix, 1 ), GroupPrefix } ) - if string.find( MooseGroup:GetName(), GroupPrefix, 1 ) then - MooseGroupPrefix = true - end - end - MooseGroupInclude = MooseGroupInclude and MooseGroupPrefix - end - - self:T2( MooseGroupInclude ) - return MooseGroupInclude -end - ---- SET_UNIT class --- @type SET_UNIT --- @extends Set#SET_BASE -SET_UNIT = { - ClassName = "SET_UNIT", - Units = {}, - Filter = { - Coalitions = nil, - Categories = nil, - Types = nil, - Countries = nil, - UnitPrefixes = nil, - }, - FilterMeta = { - Coalitions = { - red = coalition.side.RED, - blue = coalition.side.BLUE, - neutral = coalition.side.NEUTRAL, - }, - Categories = { - plane = Unit.Category.AIRPLANE, - helicopter = Unit.Category.HELICOPTER, - ground = Unit.Category.GROUND_UNIT, - ship = Unit.Category.SHIP, - structure = Unit.Category.STRUCTURE, - }, - }, -} - - ---- Creates a new SET_UNIT object, building a set of units belonging to a coalitions, categories, countries, types or with defined prefix names. --- @param #SET_UNIT self --- @return #SET_UNIT --- @usage --- -- Define a new SET_UNIT Object. This DBObject will contain a reference to all alive Units. --- DBObject = SET_UNIT:New() -function SET_UNIT:New() - - -- Inherits from BASE - local self = BASE:Inherit( self, SET_BASE:New( _DATABASE.UNITS ) ) - - return self -end - ---- Add UNIT(s) to SET_UNIT. --- @param Set#SET_UNIT self --- @param #string AddUnitNames A single name or an array of UNIT names. --- @return self -function SET_UNIT:AddUnitsByName( AddUnitNames ) - - local AddUnitNamesArray = ( type( AddUnitNames ) == "table" ) and AddUnitNames or { AddUnitNames } - - for AddUnitID, AddUnitName in pairs( AddUnitNamesArray ) do - self:Add( AddUnitName, UNIT:FindByName( AddUnitName ) ) - end - - return self -end - ---- Remove UNIT(s) from SET_UNIT. --- @param Set#SET_UNIT self --- @param Unit#UNIT RemoveUnitNames A single name or an array of UNIT names. --- @return self -function SET_UNIT:RemoveUnitsByName( RemoveUnitNames ) - - local RemoveUnitNamesArray = ( type( RemoveUnitNames ) == "table" ) and RemoveUnitNames or { RemoveUnitNames } - - for RemoveUnitID, RemoveUnitName in pairs( RemoveUnitNamesArray ) do - self:Remove( RemoveUnitName.UnitName ) - end - - return self -end - - ---- Finds a Unit based on the Unit Name. --- @param #SET_UNIT self --- @param #string UnitName --- @return Unit#UNIT The found Unit. -function SET_UNIT:FindUnit( UnitName ) - - local UnitFound = self.Set[UnitName] - return UnitFound -end - - - ---- Builds a set of units of coalitions. --- Possible current coalitions are red, blue and neutral. --- @param #SET_UNIT self --- @param #string Coalitions Can take the following values: "red", "blue", "neutral". --- @return #SET_UNIT self -function SET_UNIT:FilterCoalitions( Coalitions ) - if not self.Filter.Coalitions then - self.Filter.Coalitions = {} - end - if type( Coalitions ) ~= "table" then - Coalitions = { Coalitions } - end - for CoalitionID, Coalition in pairs( Coalitions ) do - self.Filter.Coalitions[Coalition] = Coalition - end - return self -end - - ---- Builds a set of units out of categories. --- Possible current categories are plane, helicopter, ground, ship. --- @param #SET_UNIT self --- @param #string Categories Can take the following values: "plane", "helicopter", "ground", "ship". --- @return #SET_UNIT self -function SET_UNIT:FilterCategories( Categories ) - if not self.Filter.Categories then - self.Filter.Categories = {} - end - if type( Categories ) ~= "table" then - Categories = { Categories } - end - for CategoryID, Category in pairs( Categories ) do - self.Filter.Categories[Category] = Category - end - return self -end - - ---- Builds a set of units of defined unit types. --- Possible current types are those types known within DCS world. --- @param #SET_UNIT self --- @param #string Types Can take those type strings known within DCS world. --- @return #SET_UNIT self -function SET_UNIT:FilterTypes( Types ) - if not self.Filter.Types then - self.Filter.Types = {} - end - if type( Types ) ~= "table" then - Types = { Types } - end - for TypeID, Type in pairs( Types ) do - self.Filter.Types[Type] = Type - end - return self -end - - ---- Builds a set of units of defined countries. --- Possible current countries are those known within DCS world. --- @param #SET_UNIT self --- @param #string Countries Can take those country strings known within DCS world. --- @return #SET_UNIT self -function SET_UNIT:FilterCountries( Countries ) - if not self.Filter.Countries then - self.Filter.Countries = {} - end - if type( Countries ) ~= "table" then - Countries = { Countries } - end - for CountryID, Country in pairs( Countries ) do - self.Filter.Countries[Country] = Country - end - return self -end - - ---- Builds a set of units of defined unit prefixes. --- All the units starting with the given prefixes will be included within the set. --- @param #SET_UNIT self --- @param #string Prefixes The prefix of which the unit name starts with. --- @return #SET_UNIT self -function SET_UNIT:FilterPrefixes( Prefixes ) - if not self.Filter.UnitPrefixes then - self.Filter.UnitPrefixes = {} - end - if type( Prefixes ) ~= "table" then - Prefixes = { Prefixes } - end - for PrefixID, Prefix in pairs( Prefixes ) do - self.Filter.UnitPrefixes[Prefix] = Prefix - end - return self -end - - - - ---- Starts the filtering. --- @param #SET_UNIT self --- @return #SET_UNIT self -function SET_UNIT:FilterStart() - - if _DATABASE then - self:_FilterStart() - end - - return self -end - ---- Handles the Database to check on an event (birth) that the Object was added in the Database. --- This is required, because sometimes the _DATABASE birth event gets called later than the SET_BASE birth event! --- @param #SET_UNIT self --- @param Event#EVENTDATA Event --- @return #string The name of the UNIT --- @return #table The UNIT -function SET_UNIT:AddInDatabase( Event ) - self:F3( { Event } ) - - if not self.Database[Event.IniDCSUnitName] then - self.Database[Event.IniDCSUnitName] = UNIT:Register( Event.IniDCSUnitName ) - self:T3( self.Database[Event.IniDCSUnitName] ) - end - - return Event.IniDCSUnitName, self.Database[Event.IniDCSUnitName] -end - ---- Handles the Database to check on any event that Object exists in the Database. --- This is required, because sometimes the _DATABASE event gets called later than the SET_BASE event or vise versa! --- @param #SET_UNIT self --- @param Event#EVENTDATA Event --- @return #string The name of the UNIT --- @return #table The UNIT -function SET_UNIT:FindInDatabase( Event ) - self:F3( { Event } ) - - return Event.IniDCSUnitName, self.Database[Event.IniDCSUnitName] -end - ---- Interate the SET_UNIT and call an interator function for each **alive** UNIT, providing the UNIT and optional parameters. --- @param #SET_UNIT self --- @param #function IteratorFunction The function that will be called when there is an alive UNIT in the SET_UNIT. The function needs to accept a UNIT parameter. --- @return #SET_UNIT self -function SET_UNIT:ForEachUnit( IteratorFunction, ... ) - self:F2( arg ) - - self:ForEach( IteratorFunction, arg, self.Set ) - - return self -end - ---- Iterate the SET_UNIT and call an iterator function for each **alive** UNIT presence completely in a @{Zone}, providing the UNIT and optional parameters to the called function. --- @param #SET_UNIT self --- @param Zone#ZONE ZoneObject The Zone to be tested for. --- @param #function IteratorFunction The function that will be called when there is an alive UNIT in the SET_UNIT. The function needs to accept a UNIT parameter. --- @return #SET_UNIT self -function SET_UNIT:ForEachUnitCompletelyInZone( ZoneObject, IteratorFunction, ... ) - self:F2( arg ) - - self:ForEach( IteratorFunction, arg, self.Set, - --- @param Zone#ZONE_BASE ZoneObject - -- @param Unit#UNIT UnitObject - function( ZoneObject, UnitObject ) - if UnitObject:IsCompletelyInZone( ZoneObject ) then - return true - else - return false - end - end, { ZoneObject } ) - - return self -end - ---- Iterate the SET_UNIT and call an iterator function for each **alive** UNIT presence not in a @{Zone}, providing the UNIT and optional parameters to the called function. --- @param #SET_UNIT self --- @param Zone#ZONE ZoneObject The Zone to be tested for. --- @param #function IteratorFunction The function that will be called when there is an alive UNIT in the SET_UNIT. The function needs to accept a UNIT parameter. --- @return #SET_UNIT self -function SET_UNIT:ForEachUnitNotInZone( ZoneObject, IteratorFunction, ... ) - self:F2( arg ) - - self:ForEach( IteratorFunction, arg, self.Set, - --- @param Zone#ZONE_BASE ZoneObject - -- @param Unit#UNIT UnitObject - function( ZoneObject, UnitObject ) - if UnitObject:IsNotInZone( ZoneObject ) then - return true - else - return false - end - end, { ZoneObject } ) - - return self -end - - - ------ Interate the SET_UNIT and call an interator function for each **alive** player, providing the Unit of the player and optional parameters. ----- @param #SET_UNIT self ----- @param #function IteratorFunction The function that will be called when there is an alive player in the SET_UNIT. The function needs to accept a UNIT parameter. ----- @return #SET_UNIT self ---function SET_UNIT:ForEachPlayer( IteratorFunction, ... ) --- self:F2( arg ) --- --- self:ForEach( IteratorFunction, arg, self.PlayersAlive ) --- --- return self ---end --- --- ------ Interate the SET_UNIT and call an interator function for each client, providing the Client to the function and optional parameters. ----- @param #SET_UNIT self ----- @param #function IteratorFunction The function that will be called when there is an alive player in the SET_UNIT. The function needs to accept a CLIENT parameter. ----- @return #SET_UNIT self ---function SET_UNIT:ForEachClient( IteratorFunction, ... ) --- self:F2( arg ) --- --- self:ForEach( IteratorFunction, arg, self.Clients ) --- --- return self ---end - - ---- --- @param #SET_UNIT self --- @param Unit#UNIT MUnit --- @return #SET_UNIT self -function SET_UNIT:IsIncludeObject( MUnit ) - self:F2( MUnit ) - local MUnitInclude = true - - if self.Filter.Coalitions then - local MUnitCoalition = false - for CoalitionID, CoalitionName in pairs( self.Filter.Coalitions ) do - self:T3( { "Coalition:", MUnit:GetCoalition(), self.FilterMeta.Coalitions[CoalitionName], CoalitionName } ) - if self.FilterMeta.Coalitions[CoalitionName] and self.FilterMeta.Coalitions[CoalitionName] == MUnit:GetCoalition() then - MUnitCoalition = true - end - end - MUnitInclude = MUnitInclude and MUnitCoalition - end - - if self.Filter.Categories then - local MUnitCategory = false - for CategoryID, CategoryName in pairs( self.Filter.Categories ) do - self:T3( { "Category:", MUnit:GetDesc().category, self.FilterMeta.Categories[CategoryName], CategoryName } ) - if self.FilterMeta.Categories[CategoryName] and self.FilterMeta.Categories[CategoryName] == MUnit:GetDesc().category then - MUnitCategory = true - end - end - MUnitInclude = MUnitInclude and MUnitCategory - end - - if self.Filter.Types then - local MUnitType = false - for TypeID, TypeName in pairs( self.Filter.Types ) do - self:T3( { "Type:", MUnit:GetTypeName(), TypeName } ) - if TypeName == MUnit:GetTypeName() then - MUnitType = true - end - end - MUnitInclude = MUnitInclude and MUnitType - end - - if self.Filter.Countries then - local MUnitCountry = false - for CountryID, CountryName in pairs( self.Filter.Countries ) do - self:T3( { "Country:", MUnit:GetCountry(), CountryName } ) - if country.id[CountryName] == MUnit:GetCountry() then - MUnitCountry = true - end - end - MUnitInclude = MUnitInclude and MUnitCountry - end - - if self.Filter.UnitPrefixes then - local MUnitPrefix = false - for UnitPrefixId, UnitPrefix in pairs( self.Filter.UnitPrefixes ) do - self:T3( { "Prefix:", string.find( MUnit:GetName(), UnitPrefix, 1 ), UnitPrefix } ) - if string.find( MUnit:GetName(), UnitPrefix, 1 ) then - MUnitPrefix = true - end - end - MUnitInclude = MUnitInclude and MUnitPrefix - end - - self:T2( MUnitInclude ) - return MUnitInclude -end - - ---- SET_CLIENT - ---- SET_CLIENT class --- @type SET_CLIENT --- @extends Set#SET_BASE -SET_CLIENT = { - ClassName = "SET_CLIENT", - Clients = {}, - Filter = { - Coalitions = nil, - Categories = nil, - Types = nil, - Countries = nil, - ClientPrefixes = nil, - }, - FilterMeta = { - Coalitions = { - red = coalition.side.RED, - blue = coalition.side.BLUE, - neutral = coalition.side.NEUTRAL, - }, - Categories = { - plane = "plane", - helicopter = "helicopter", - ground = "vehicle", - ship = "ship", - structure = "static", - }, - }, -} - - ---- Creates a new SET_CLIENT object, building a set of clients belonging to a coalitions, categories, countries, types or with defined prefix names. --- @param #SET_CLIENT self --- @return #SET_CLIENT --- @usage --- -- Define a new SET_CLIENT Object. This DBObject will contain a reference to all Clients. --- DBObject = SET_CLIENT:New() -function SET_CLIENT:New() - - -- Inherits from BASE - local self = BASE:Inherit( self, SET_BASE:New( _DATABASE.CLIENTS ) ) - - return self -end - ---- Add CLIENT(s) to SET_CLIENT. --- @param Set#SET_CLIENT self --- @param #string AddClientNames A single name or an array of CLIENT names. --- @return self -function SET_CLIENT:AddClientsByName( AddClientNames ) - - local AddClientNamesArray = ( type( AddClientNames ) == "table" ) and AddClientNames or { AddClientNames } - - for AddClientID, AddClientName in pairs( AddClientNamesArray ) do - self:Add( AddClientName, CLIENT:FindByName( AddClientName ) ) - end - - return self -end - ---- Remove CLIENT(s) from SET_CLIENT. --- @param Set#SET_CLIENT self --- @param Client#CLIENT RemoveClientNames A single name or an array of CLIENT names. --- @return self -function SET_CLIENT:RemoveClientsByName( RemoveClientNames ) - - local RemoveClientNamesArray = ( type( RemoveClientNames ) == "table" ) and RemoveClientNames or { RemoveClientNames } - - for RemoveClientID, RemoveClientName in pairs( RemoveClientNamesArray ) do - self:Remove( RemoveClientName.ClientName ) - end - - return self -end - - ---- Finds a Client based on the Client Name. --- @param #SET_CLIENT self --- @param #string ClientName --- @return Client#CLIENT The found Client. -function SET_CLIENT:FindClient( ClientName ) - - local ClientFound = self.Set[ClientName] - return ClientFound -end - - - ---- Builds a set of clients of coalitions. --- Possible current coalitions are red, blue and neutral. --- @param #SET_CLIENT self --- @param #string Coalitions Can take the following values: "red", "blue", "neutral". --- @return #SET_CLIENT self -function SET_CLIENT:FilterCoalitions( Coalitions ) - if not self.Filter.Coalitions then - self.Filter.Coalitions = {} - end - if type( Coalitions ) ~= "table" then - Coalitions = { Coalitions } - end - for CoalitionID, Coalition in pairs( Coalitions ) do - self.Filter.Coalitions[Coalition] = Coalition - end - return self -end - - ---- Builds a set of clients out of categories. --- Possible current categories are plane, helicopter, ground, ship. --- @param #SET_CLIENT self --- @param #string Categories Can take the following values: "plane", "helicopter", "ground", "ship". --- @return #SET_CLIENT self -function SET_CLIENT:FilterCategories( Categories ) - if not self.Filter.Categories then - self.Filter.Categories = {} - end - if type( Categories ) ~= "table" then - Categories = { Categories } - end - for CategoryID, Category in pairs( Categories ) do - self.Filter.Categories[Category] = Category - end - return self -end - - ---- Builds a set of clients of defined client types. --- Possible current types are those types known within DCS world. --- @param #SET_CLIENT self --- @param #string Types Can take those type strings known within DCS world. --- @return #SET_CLIENT self -function SET_CLIENT:FilterTypes( Types ) - if not self.Filter.Types then - self.Filter.Types = {} - end - if type( Types ) ~= "table" then - Types = { Types } - end - for TypeID, Type in pairs( Types ) do - self.Filter.Types[Type] = Type - end - return self -end - - ---- Builds a set of clients of defined countries. --- Possible current countries are those known within DCS world. --- @param #SET_CLIENT self --- @param #string Countries Can take those country strings known within DCS world. --- @return #SET_CLIENT self -function SET_CLIENT:FilterCountries( Countries ) - if not self.Filter.Countries then - self.Filter.Countries = {} - end - if type( Countries ) ~= "table" then - Countries = { Countries } - end - for CountryID, Country in pairs( Countries ) do - self.Filter.Countries[Country] = Country - end - return self -end - - ---- Builds a set of clients of defined client prefixes. --- All the clients starting with the given prefixes will be included within the set. --- @param #SET_CLIENT self --- @param #string Prefixes The prefix of which the client name starts with. --- @return #SET_CLIENT self -function SET_CLIENT:FilterPrefixes( Prefixes ) - if not self.Filter.ClientPrefixes then - self.Filter.ClientPrefixes = {} - end - if type( Prefixes ) ~= "table" then - Prefixes = { Prefixes } - end - for PrefixID, Prefix in pairs( Prefixes ) do - self.Filter.ClientPrefixes[Prefix] = Prefix - end - return self -end - - - - ---- Starts the filtering. --- @param #SET_CLIENT self --- @return #SET_CLIENT self -function SET_CLIENT:FilterStart() - - if _DATABASE then - self:_FilterStart() - end - - return self -end - ---- Handles the Database to check on an event (birth) that the Object was added in the Database. --- This is required, because sometimes the _DATABASE birth event gets called later than the SET_BASE birth event! --- @param #SET_CLIENT self --- @param Event#EVENTDATA Event --- @return #string The name of the CLIENT --- @return #table The CLIENT -function SET_CLIENT:AddInDatabase( Event ) - self:F3( { Event } ) - - return Event.IniDCSUnitName, self.Database[Event.IniDCSUnitName] -end - ---- Handles the Database to check on any event that Object exists in the Database. --- This is required, because sometimes the _DATABASE event gets called later than the SET_BASE event or vise versa! --- @param #SET_CLIENT self --- @param Event#EVENTDATA Event --- @return #string The name of the CLIENT --- @return #table The CLIENT -function SET_CLIENT:FindInDatabase( Event ) - self:F3( { Event } ) - - return Event.IniDCSUnitName, self.Database[Event.IniDCSUnitName] -end - ---- Interate the SET_CLIENT and call an interator function for each **alive** CLIENT, providing the CLIENT and optional parameters. --- @param #SET_CLIENT self --- @param #function IteratorFunction The function that will be called when there is an alive CLIENT in the SET_CLIENT. The function needs to accept a CLIENT parameter. --- @return #SET_CLIENT self -function SET_CLIENT:ForEachClient( IteratorFunction, ... ) - self:F2( arg ) - - self:ForEach( IteratorFunction, arg, self.Set ) - - return self -end - ---- Iterate the SET_CLIENT and call an iterator function for each **alive** CLIENT presence completely in a @{Zone}, providing the CLIENT and optional parameters to the called function. --- @param #SET_CLIENT self --- @param Zone#ZONE ZoneObject The Zone to be tested for. --- @param #function IteratorFunction The function that will be called when there is an alive CLIENT in the SET_CLIENT. The function needs to accept a CLIENT parameter. --- @return #SET_CLIENT self -function SET_CLIENT:ForEachClientCompletelyInZone( ZoneObject, IteratorFunction, ... ) - self:F2( arg ) - - self:ForEach( IteratorFunction, arg, self.Set, - --- @param Zone#ZONE_BASE ZoneObject - -- @param Client#CLIENT ClientObject - function( ZoneObject, ClientObject ) - if ClientObject:IsCompletelyInZone( ZoneObject ) then - return true - else - return false - end - end, { ZoneObject } ) - - return self -end - ---- Iterate the SET_CLIENT and call an iterator function for each **alive** CLIENT presence not in a @{Zone}, providing the CLIENT and optional parameters to the called function. --- @param #SET_CLIENT self --- @param Zone#ZONE ZoneObject The Zone to be tested for. --- @param #function IteratorFunction The function that will be called when there is an alive CLIENT in the SET_CLIENT. The function needs to accept a CLIENT parameter. --- @return #SET_CLIENT self -function SET_CLIENT:ForEachClientNotInZone( ZoneObject, IteratorFunction, ... ) - self:F2( arg ) - - self:ForEach( IteratorFunction, arg, self.Set, - --- @param Zone#ZONE_BASE ZoneObject - -- @param Client#CLIENT ClientObject - function( ZoneObject, ClientObject ) - if ClientObject:IsNotInZone( ZoneObject ) then - return true - else - return false - end - end, { ZoneObject } ) - - return self -end - ---- --- @param #SET_CLIENT self --- @param Client#CLIENT MClient --- @return #SET_CLIENT self -function SET_CLIENT:IsIncludeObject( MClient ) - self:F2( MClient ) - - local MClientInclude = true - - if MClient then - local MClientName = MClient.UnitName - - if self.Filter.Coalitions then - local MClientCoalition = false - for CoalitionID, CoalitionName in pairs( self.Filter.Coalitions ) do - local ClientCoalitionName = _DATABASE.Templates.ClientsByName[MClientName].CoalitionName - self:T3( { "Coalition:", ClientCoalitionName, self.FilterMeta.Coalitions[CoalitionName], CoalitionName } ) - if self.FilterMeta.Coalitions[CoalitionName] and self.FilterMeta.Coalitions[CoalitionName] == ClientCoalitionName then - MClientCoalition = true - end - end - self:T( { "Evaluated Coalition", MClientCoalition } ) - MClientInclude = MClientInclude and MClientCoalition - end - - if self.Filter.Categories then - local MClientCategory = false - for CategoryID, CategoryName in pairs( self.Filter.Categories ) do - local ClientCategoryName = _DATABASE.Templates.ClientsByName[MClientName].CategoryName - self:T3( { "Category:", ClientCategoryName, self.FilterMeta.Categories[CategoryName], CategoryName } ) - if self.FilterMeta.Categories[CategoryName] and self.FilterMeta.Categories[CategoryName] == ClientCategoryName then - MClientCategory = true - end - end - self:T( { "Evaluated Category", MClientCategory } ) - MClientInclude = MClientInclude and MClientCategory - end - - if self.Filter.Types then - local MClientType = false - for TypeID, TypeName in pairs( self.Filter.Types ) do - self:T3( { "Type:", MClient:GetTypeName(), TypeName } ) - if TypeName == MClient:GetTypeName() then - MClientType = true - end - end - self:T( { "Evaluated Type", MClientType } ) - MClientInclude = MClientInclude and MClientType - end - - if self.Filter.Countries then - local MClientCountry = false - for CountryID, CountryName in pairs( self.Filter.Countries ) do - local ClientCountryName = _DATABASE.Templates.ClientsByName[MClientName].CountryName - self:T3( { "Country:", ClientCountryName, country.id[CountryName], CountryName } ) - if country.id[CountryName] and country.id[ClientCountryName] and country.id[CountryName] == country.id[ClientCountryName] then - MClientCountry = true - end - end - self:T( { "Evaluated Country", MClientCountry } ) - MClientInclude = MClientInclude and MClientCountry - end - - if self.Filter.ClientPrefixes then - local MClientPrefix = false - for ClientPrefixId, ClientPrefix in pairs( self.Filter.ClientPrefixes ) do - self:T3( { "Prefix:", string.find( MClient.UnitName, ClientPrefix, 1 ), ClientPrefix } ) - if string.find( MClient.UnitName, ClientPrefix, 1 ) then - MClientPrefix = true - end - end - self:T( { "Evaluated Prefix", MClientPrefix } ) - MClientInclude = MClientInclude and MClientPrefix - end - end - - self:T2( MClientInclude ) - return MClientInclude -end - ---- This module contains the POINT classes. --- --- 1) @{Point#POINT_VEC3} class, extends @{Base#BASE} --- =============================================== --- The @{Point#POINT_VEC3} class defines a 3D point in the simulator. --- --- 1.1) POINT_VEC3 constructor --- --------------------------- --- --- A new POINT instance can be created with: --- --- * @{#POINT_VEC3.New}(): a 3D point. --- --- 2) @{Point#POINT_VEC2} class, extends @{Point#POINT_VEC3} --- ========================================================= --- The @{Point#POINT_VEC2} class defines a 2D point in the simulator. The height coordinate (if needed) will be the land height + an optional added height specified. --- --- 2.1) POINT_VEC2 constructor --- --------------------------- --- --- A new POINT instance can be created with: --- --- * @{#POINT_VEC2.New}(): a 2D point. --- --- @module Point --- @author FlightControl - ---- The POINT_VEC3 class --- @type POINT_VEC3 --- @extends Base#BASE --- @field #POINT_VEC3.SmokeColor SmokeColor --- @field #POINT_VEC3.FlareColor FlareColor -POINT_VEC3 = { - ClassName = "POINT_VEC3", - SmokeColor = { - Green = trigger.smokeColor.Green, - Red = trigger.smokeColor.Red, - White = trigger.smokeColor.White, - Orange = trigger.smokeColor.Orange, - Blue = trigger.smokeColor.Blue - }, - FlareColor = { - Green = trigger.flareColor.Green, - Red = trigger.flareColor.Red, - White = trigger.flareColor.White, - Yellow = trigger.flareColor.Yellow - }, - } - ---- SmokeColor --- @type POINT_VEC3.SmokeColor --- @field Green --- @field Red --- @field White --- @field Orange --- @field Blue - ---- FlareColor --- @type POINT_VEC3.FlareColor --- @field Green --- @field Red --- @field White --- @field Yellow - --- Constructor. - ---- Create a new POINT_VEC3 object. --- @param #POINT_VEC3 self --- @param DCSTypes#Distance x The x coordinate of the Vec3 point, pointing to the North. --- @param DCSTypes#Distance y The y coordinate of the Vec3 point, pointing Upwards. --- @param DCSTypes#Distance z The z coordinate of the Vec3 point, pointing to the Right. --- @return Point#POINT_VEC3 -function POINT_VEC3:New( x, y, z ) - - local self = BASE:Inherit( self, BASE:New() ) - self:F2( { x, y, z } ) - self.PointVec3 = { x = x, y = y, z = z } - return self -end - ---- Smokes the point in a color. --- @param #POINT_VEC3 self --- @param Point#POINT_VEC3.SmokeColor SmokeColor -function POINT_VEC3:Smoke( SmokeColor ) - self:F2( { SmokeColor, self.PointVec3 } ) - trigger.action.smoke( self.PointVec3, SmokeColor ) -end - ---- Smoke the POINT_VEC3 Green. --- @param #POINT_VEC3 self -function POINT_VEC3:SmokeGreen() - self:F2() - self:Smoke( POINT_VEC3.SmokeColor.Green ) -end - ---- Smoke the POINT_VEC3 Red. --- @param #POINT_VEC3 self -function POINT_VEC3:SmokeRed() - self:F2() - self:Smoke( POINT_VEC3.SmokeColor.Red ) -end - ---- Smoke the POINT_VEC3 White. --- @param #POINT_VEC3 self -function POINT_VEC3:SmokeWhite() - self:F2() - self:Smoke( POINT_VEC3.SmokeColor.White ) -end - ---- Smoke the POINT_VEC3 Orange. --- @param #POINT_VEC3 self -function POINT_VEC3:SmokeOrange() - self:F2() - self:Smoke( POINT_VEC3.SmokeColor.Orange ) -end - ---- Smoke the POINT_VEC3 Blue. --- @param #POINT_VEC3 self -function POINT_VEC3:SmokeBlue() - self:F2() - self:Smoke( POINT_VEC3.SmokeColor.Blue ) -end - ---- Flares the point in a color. --- @param #POINT_VEC3 self --- @param Point#POINT_VEC3.FlareColor --- @param DCSTypes#Azimuth (optional) Azimuth The azimuth of the flare direction. The default azimuth is 0. -function POINT_VEC3:Flare( FlareColor, Azimuth ) - self:F2( { FlareColor, self.PointVec3 } ) - trigger.action.signalFlare( self.PointVec3, FlareColor, Azimuth and Azimuth or 0 ) -end - ---- Flare the POINT_VEC3 White. --- @param #POINT_VEC3 self --- @param DCSTypes#Azimuth (optional) Azimuth The azimuth of the flare direction. The default azimuth is 0. -function POINT_VEC3:FlareWhite( Azimuth ) - self:F2( Azimuth ) - self:Flare( POINT_VEC3.FlareColor.White, Azimuth ) -end - ---- Flare the POINT_VEC3 Yellow. --- @param #POINT_VEC3 self --- @param DCSTypes#Azimuth (optional) Azimuth The azimuth of the flare direction. The default azimuth is 0. -function POINT_VEC3:FlareYellow( Azimuth ) - self:F2( Azimuth ) - self:Flare( POINT_VEC3.FlareColor.Yellow, Azimuth ) -end - ---- Flare the POINT_VEC3 Green. --- @param #POINT_VEC3 self --- @param DCSTypes#Azimuth (optional) Azimuth The azimuth of the flare direction. The default azimuth is 0. -function POINT_VEC3:FlareGreen( Azimuth ) - self:F2( Azimuth ) - self:Flare( POINT_VEC3.FlareColor.Green, Azimuth ) -end - ---- Flare the POINT_VEC3 Red. --- @param #POINT_VEC3 self -function POINT_VEC3:FlareRed( Azimuth ) - self:F2( Azimuth ) - self:Flare( POINT_VEC3.FlareColor.Red, Azimuth ) -end - - ---- The POINT_VEC2 class --- @type POINT_VEC2 --- @extends Point#POINT_VEC3 -POINT_VEC2 = { - ClassName = "POINT_VEC2", - } - ---- Create a new POINT_VEC2 object. --- @param #POINT_VEC2 self --- @param DCSTypes#Distance x The x coordinate of the Vec3 point, pointing to the North. --- @param DCSTypes#Distance y The y coordinate of the Vec3 point, pointing to the Right. --- @param DCSTypes#Distance LandHeightAdd (optional) The default height if required to be evaluated will be the land height of the x, y coordinate. You can specify an extra height to be added to the land height. --- @return Point#POINT_VEC2 -function POINT_VEC2:New( x, y, LandHeightAdd ) - - local LandHeight = land.getHeight( { ["x"] = x, ["y"] = y } ) - if LandHeightAdd then - LandHeight = LandHeight + LandHeightAdd - end - - local self = BASE:Inherit( self, POINT_VEC3:New( x, LandHeight, y ) ) - self:F2( { x, y, LandHeightAdd } ) - - return self -end - - ---- The main include file for the MOOSE system. - -Include.File( "Routines" ) -Include.File( "Base" ) -Include.File( "Scheduler" ) -Include.File( "Event" ) -Include.File( "Menu" ) -Include.File( "Group" ) -Include.File( "Unit" ) -Include.File( "Zone" ) -Include.File( "Client" ) -Include.File( "Static" ) -Include.File( "Database" ) -Include.File( "Set" ) -Include.File( "Point" ) Include.File( "Moose" ) -Include.File( "Scoring" ) -Include.File( "Cargo" ) -Include.File( "Message" ) -Include.File( "Stage" ) -Include.File( "Task" ) -Include.File( "GoHomeTask" ) -Include.File( "DestroyBaseTask" ) -Include.File( "DestroyGroupsTask" ) -Include.File( "DestroyRadarsTask" ) -Include.File( "DestroyUnitTypesTask" ) -Include.File( "PickupTask" ) -Include.File( "DeployTask" ) -Include.File( "NoTask" ) -Include.File( "RouteTask" ) -Include.File( "Mission" ) -Include.File( "CleanUp" ) -Include.File( "Spawn" ) -Include.File( "Movement" ) -Include.File( "Sead" ) -Include.File( "Escort" ) -Include.File( "MissileTrainer" ) -Include.File( "AIBalancer" ) - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - --- The order of the declarations is important here. Don't touch it. - ---- Declare the event dispatcher based on the EVENT class -_EVENTDISPATCHER = EVENT:New() -- #EVENT - ---- Declare the main database object, which is used internally by the MOOSE classes. -_DATABASE = DATABASE:New() -- Database#DATABASE - ---- Scoring system for MOOSE. --- This scoring class calculates the hits and kills that players make within a simulation session. --- Scoring is calculated using a defined algorithm. --- With a small change in MissionScripting.lua, the scoring can also be logged in a CSV file, that can then be uploaded --- to a database or a BI tool to publish the scoring results to the player community. --- @module Scoring --- @author FlightControl - - ---- The Scoring class --- @type SCORING --- @field Players A collection of the current players that have joined the game. --- @extends Base#BASE -SCORING = { - ClassName = "SCORING", - ClassID = 0, - Players = {}, -} - -local _SCORINGCoalition = - { - [1] = "Red", - [2] = "Blue", - } - -local _SCORINGCategory = - { - [Unit.Category.AIRPLANE] = "Plane", - [Unit.Category.HELICOPTER] = "Helicopter", - [Unit.Category.GROUND_UNIT] = "Vehicle", - [Unit.Category.SHIP] = "Ship", - [Unit.Category.STRUCTURE] = "Structure", - } - ---- Creates a new SCORING object to administer the scoring achieved by players. --- @param #SCORING self --- @param #string GameName The name of the game. This name is also logged in the CSV score file. --- @return #SCORING self --- @usage --- -- Define a new scoring object for the mission Gori Valley. --- ScoringObject = SCORING:New( "Gori Valley" ) -function SCORING:New( GameName ) - - -- Inherits from BASE - local self = BASE:Inherit( self, BASE:New() ) - - if GameName then - self.GameName = GameName - else - error( "A game name must be given to register the scoring results" ) - end - - - _EVENTDISPATCHER:OnDead( self._EventOnDeadOrCrash, self ) - _EVENTDISPATCHER:OnCrash( self._EventOnDeadOrCrash, self ) - _EVENTDISPATCHER:OnHit( self._EventOnHit, self ) - - --self.SchedulerId = routines.scheduleFunction( SCORING._FollowPlayersScheduled, { self }, 0, 5 ) - self.SchedulerId = SCHEDULER:New( self, self._FollowPlayersScheduled, {}, 0, 5 ) - - self:ScoreMenu() - - return self - -end - ---- Creates a score radio menu. Can be accessed using Radio -> F10. --- @param #SCORING self --- @return #SCORING self -function SCORING:ScoreMenu() - self.Menu = SUBMENU:New( 'Scoring' ) - self.AllScoresMenu = COMMANDMENU:New( 'Score All Active Players', self.Menu, SCORING.ReportScoreAll, self ) - --- = COMMANDMENU:New('Your Current Score', ReportScore, SCORING.ReportScorePlayer, self ) - return self -end - ---- Follows new players entering Clients within the DCSRTE. --- TODO: Need to see if i can catch this also with an event. It will eliminate the schedule ... -function SCORING:_FollowPlayersScheduled() - self:F3( "_FollowPlayersScheduled" ) - - local ClientUnit = 0 - local CoalitionsData = { AlivePlayersRed = coalition.getPlayers(coalition.side.RED), AlivePlayersBlue = coalition.getPlayers(coalition.side.BLUE) } - local unitId - local unitData - local AlivePlayerUnits = {} - - for CoalitionId, CoalitionData in pairs( CoalitionsData ) do - self:T3( { "_FollowPlayersScheduled", CoalitionData } ) - for UnitId, UnitData in pairs( CoalitionData ) do - self:_AddPlayerFromUnit( UnitData ) - end - end - - return true -end - - ---- Track DEAD or CRASH events for the scoring. --- @param #SCORING self --- @param Event#EVENTDATA Event -function SCORING:_EventOnDeadOrCrash( Event ) - self:F( { Event } ) - - local TargetUnit = nil - local TargetGroup = nil - local TargetUnitName = "" - local TargetGroupName = "" - local TargetPlayerName = "" - local TargetCoalition = nil - local TargetCategory = nil - local TargetType = nil - local TargetUnitCoalition = nil - local TargetUnitCategory = nil - local TargetUnitType = nil - - if Event.IniDCSUnit then - - TargetUnit = Event.IniDCSUnit - TargetUnitName = Event.IniDCSUnitName - TargetGroup = Event.IniDCSGroup - TargetGroupName = Event.IniDCSGroupName - TargetPlayerName = TargetUnit:getPlayerName() - - TargetCoalition = TargetUnit:getCoalition() - --TargetCategory = TargetUnit:getCategory() - TargetCategory = TargetUnit:getDesc().category -- Workaround - TargetType = TargetUnit:getTypeName() - - TargetUnitCoalition = _SCORINGCoalition[TargetCoalition] - TargetUnitCategory = _SCORINGCategory[TargetCategory] - TargetUnitType = TargetType - - self:T( { TargetUnitName, TargetGroupName, TargetPlayerName, TargetCoalition, TargetCategory, TargetType } ) - end - - for PlayerName, PlayerData in pairs( self.Players ) do - if PlayerData then -- This should normally not happen, but i'll test it anyway. - self:T( "Something got killed" ) - - -- Some variables - local InitUnitName = PlayerData.UnitName - local InitUnitType = PlayerData.UnitType - local InitCoalition = PlayerData.UnitCoalition - local InitCategory = PlayerData.UnitCategory - local InitUnitCoalition = _SCORINGCoalition[InitCoalition] - local InitUnitCategory = _SCORINGCategory[InitCategory] - - self:T( { InitUnitName, InitUnitType, InitUnitCoalition, InitCoalition, InitUnitCategory, InitCategory } ) - - -- What is he hitting? - if TargetCategory then - if PlayerData and PlayerData.Hit and PlayerData.Hit[TargetCategory] and PlayerData.Hit[TargetCategory][TargetUnitName] then -- Was there a hit for this unit for this player before registered??? - if not PlayerData.Kill[TargetCategory] then - PlayerData.Kill[TargetCategory] = {} - end - if not PlayerData.Kill[TargetCategory][TargetType] then - PlayerData.Kill[TargetCategory][TargetType] = {} - PlayerData.Kill[TargetCategory][TargetType].Score = 0 - PlayerData.Kill[TargetCategory][TargetType].ScoreKill = 0 - PlayerData.Kill[TargetCategory][TargetType].Penalty = 0 - PlayerData.Kill[TargetCategory][TargetType].PenaltyKill = 0 - end - - if InitCoalition == TargetCoalition then - PlayerData.Penalty = PlayerData.Penalty + 25 - PlayerData.Kill[TargetCategory][TargetType].Penalty = PlayerData.Kill[TargetCategory][TargetType].Penalty + 25 - PlayerData.Kill[TargetCategory][TargetType].PenaltyKill = PlayerData.Kill[TargetCategory][TargetType].PenaltyKill + 1 - MESSAGE:New( "Player '" .. PlayerName .. "' killed a friendly " .. TargetUnitCategory .. " ( " .. TargetType .. " ) " .. - PlayerData.Kill[TargetCategory][TargetType].PenaltyKill .. " times. Penalty: -" .. PlayerData.Kill[TargetCategory][TargetType].Penalty .. - ". Score Total:" .. PlayerData.Score - PlayerData.Penalty, - 5 ):ToAll() - self:ScoreCSV( PlayerName, "KILL_PENALTY", 1, -125, InitUnitName, InitUnitCoalition, InitUnitCategory, InitUnitType, TargetUnitName, TargetUnitCoalition, TargetUnitCategory, TargetUnitType ) - else - PlayerData.Score = PlayerData.Score + 10 - PlayerData.Kill[TargetCategory][TargetType].Score = PlayerData.Kill[TargetCategory][TargetType].Score + 10 - PlayerData.Kill[TargetCategory][TargetType].ScoreKill = PlayerData.Kill[TargetCategory][TargetType].ScoreKill + 1 - MESSAGE:New( "Player '" .. PlayerName .. "' killed an enemy " .. TargetUnitCategory .. " ( " .. TargetType .. " ) " .. - PlayerData.Kill[TargetCategory][TargetType].ScoreKill .. " times. Score: " .. PlayerData.Kill[TargetCategory][TargetType].Score .. - ". Score Total:" .. PlayerData.Score - PlayerData.Penalty, - 5 ):ToAll() - self:ScoreCSV( PlayerName, "KILL_SCORE", 1, 10, InitUnitName, InitUnitCoalition, InitUnitCategory, InitUnitType, TargetUnitName, TargetUnitCoalition, TargetUnitCategory, TargetUnitType ) - end - end - end - end - end -end - - - ---- Add a new player entering a Unit. -function SCORING:_AddPlayerFromUnit( UnitData ) - self:F( UnitData ) - - if UnitData and UnitData:isExist() then - local UnitName = UnitData:getName() - local PlayerName = UnitData:getPlayerName() - local UnitDesc = UnitData:getDesc() - local UnitCategory = UnitDesc.category - local UnitCoalition = UnitData:getCoalition() - local UnitTypeName = UnitData:getTypeName() - - self:T( { PlayerName, UnitName, UnitCategory, UnitCoalition, UnitTypeName } ) - - if self.Players[PlayerName] == nil then -- I believe this is the place where a Player gets a life in a mission when he enters a unit ... - self.Players[PlayerName] = {} - self.Players[PlayerName].Hit = {} - self.Players[PlayerName].Kill = {} - self.Players[PlayerName].Mission = {} - - -- for CategoryID, CategoryName in pairs( SCORINGCategory ) do - -- self.Players[PlayerName].Hit[CategoryID] = {} - -- self.Players[PlayerName].Kill[CategoryID] = {} - -- end - self.Players[PlayerName].HitPlayers = {} - self.Players[PlayerName].HitUnits = {} - self.Players[PlayerName].Score = 0 - self.Players[PlayerName].Penalty = 0 - self.Players[PlayerName].PenaltyCoalition = 0 - self.Players[PlayerName].PenaltyWarning = 0 - end - - if not self.Players[PlayerName].UnitCoalition then - self.Players[PlayerName].UnitCoalition = UnitCoalition - else - if self.Players[PlayerName].UnitCoalition ~= UnitCoalition then - self.Players[PlayerName].Penalty = self.Players[PlayerName].Penalty + 50 - self.Players[PlayerName].PenaltyCoalition = self.Players[PlayerName].PenaltyCoalition + 1 - MESSAGE:New( "Player '" .. PlayerName .. "' changed coalition from " .. _SCORINGCoalition[self.Players[PlayerName].UnitCoalition] .. " to " .. _SCORINGCoalition[UnitCoalition] .. - "(changed " .. self.Players[PlayerName].PenaltyCoalition .. " times the coalition). 50 Penalty points added.", - 2 - ):ToAll() - self:ScoreCSV( PlayerName, "COALITION_PENALTY", 1, -50, self.Players[PlayerName].UnitName, _SCORINGCoalition[self.Players[PlayerName].UnitCoalition], _SCORINGCategory[self.Players[PlayerName].UnitCategory], self.Players[PlayerName].UnitType, - UnitName, _SCORINGCoalition[UnitCoalition], _SCORINGCategory[UnitCategory], UnitData:getTypeName() ) - end - end - self.Players[PlayerName].UnitName = UnitName - self.Players[PlayerName].UnitCoalition = UnitCoalition - self.Players[PlayerName].UnitCategory = UnitCategory - self.Players[PlayerName].UnitType = UnitTypeName - - if self.Players[PlayerName].Penalty > 100 then - if self.Players[PlayerName].PenaltyWarning < 1 then - MESSAGE:New( "Player '" .. PlayerName .. "': WARNING! If you continue to commit FRATRICIDE and have a PENALTY score higher than 150, you will be COURT MARTIALED and DISMISSED from this mission! \nYour total penalty is: " .. self.Players[PlayerName].Penalty, - 30 - ):ToAll() - self.Players[PlayerName].PenaltyWarning = self.Players[PlayerName].PenaltyWarning + 1 - end - end - - if self.Players[PlayerName].Penalty > 150 then - ClientGroup = GROUP:NewFromDCSUnit( UnitData ) - ClientGroup:Destroy() - MESSAGE:New( "Player '" .. PlayerName .. "' committed FRATRICIDE, he will be COURT MARTIALED and is DISMISSED from this mission!", - 10 - ):ToAll() - end - - end -end - - ---- Registers Scores the players completing a Mission Task. -function SCORING:_AddMissionTaskScore( PlayerUnit, MissionName, Score ) - self:F( { PlayerUnit, MissionName, Score } ) - - local PlayerName = PlayerUnit:getPlayerName() - - if not self.Players[PlayerName].Mission[MissionName] then - self.Players[PlayerName].Mission[MissionName] = {} - self.Players[PlayerName].Mission[MissionName].ScoreTask = 0 - self.Players[PlayerName].Mission[MissionName].ScoreMission = 0 - end - - self:T( PlayerName ) - self:T( self.Players[PlayerName].Mission[MissionName] ) - - self.Players[PlayerName].Score = self.Players[PlayerName].Score + Score - self.Players[PlayerName].Mission[MissionName].ScoreTask = self.Players[PlayerName].Mission[MissionName].ScoreTask + Score - - MESSAGE:New( "Player '" .. PlayerName .. "' has finished another Task in Mission '" .. MissionName .. "'. " .. - Score .. " Score points added.", - 20 ):ToAll() - - self:ScoreCSV( PlayerName, "TASK_" .. MissionName:gsub( ' ', '_' ), 1, Score, PlayerUnit:getName() ) -end - - ---- Registers Mission Scores for possible multiple players that contributed in the Mission. -function SCORING:_AddMissionScore( MissionName, Score ) - self:F( { MissionName, Score } ) - - for PlayerName, PlayerData in pairs( self.Players ) do - - if PlayerData.Mission[MissionName] then - PlayerData.Score = PlayerData.Score + Score - PlayerData.Mission[MissionName].ScoreMission = PlayerData.Mission[MissionName].ScoreMission + Score - MESSAGE:New( "Player '" .. PlayerName .. "' has finished Mission '" .. MissionName .. "'. " .. - Score .. " Score points added.", - 20 ):ToAll() - self:ScoreCSV( PlayerName, "MISSION_" .. MissionName:gsub( ' ', '_' ), 1, Score ) - end - end -end - ---- Handles the OnHit event for the scoring. --- @param #SCORING self --- @param Event#EVENTDATA Event -function SCORING:_EventOnHit( Event ) - self:F( { Event } ) - - local InitUnit = nil - local InitUnitName = "" - local InitGroup = nil - local InitGroupName = "" - local InitPlayerName = nil - - local InitCoalition = nil - local InitCategory = nil - local InitType = nil - local InitUnitCoalition = nil - local InitUnitCategory = nil - local InitUnitType = nil - - local TargetUnit = nil - local TargetUnitName = "" - local TargetGroup = nil - local TargetGroupName = "" - local TargetPlayerName = "" - - local TargetCoalition = nil - local TargetCategory = nil - local TargetType = nil - local TargetUnitCoalition = nil - local TargetUnitCategory = nil - local TargetUnitType = nil - - if Event.IniDCSUnit then - - InitUnit = Event.IniDCSUnit - InitUnitName = Event.IniDCSUnitName - InitGroup = Event.IniDCSGroup - InitGroupName = Event.IniDCSGroupName - InitPlayerName = InitUnit:getPlayerName() - - InitCoalition = InitUnit:getCoalition() - --TODO: Workaround Client DCS Bug - --InitCategory = InitUnit:getCategory() - InitCategory = InitUnit:getDesc().category - InitType = InitUnit:getTypeName() - - InitUnitCoalition = _SCORINGCoalition[InitCoalition] - InitUnitCategory = _SCORINGCategory[InitCategory] - InitUnitType = InitType - - self:T( { InitUnitName, InitGroupName, InitPlayerName, InitCoalition, InitCategory, InitType , InitUnitCoalition, InitUnitCategory, InitUnitType } ) - end - - - if Event.TgtDCSUnit then - - TargetUnit = Event.TgtDCSUnit - TargetUnitName = Event.TgtDCSUnitName - TargetGroup = Event.TgtDCSGroup - TargetGroupName = Event.TgtDCSGroupName - TargetPlayerName = TargetUnit:getPlayerName() - - TargetCoalition = TargetUnit:getCoalition() - --TODO: Workaround Client DCS Bug - --TargetCategory = TargetUnit:getCategory() - TargetCategory = TargetUnit:getDesc().category - TargetType = TargetUnit:getTypeName() - - TargetUnitCoalition = _SCORINGCoalition[TargetCoalition] - TargetUnitCategory = _SCORINGCategory[TargetCategory] - TargetUnitType = TargetType - - self:T( { TargetUnitName, TargetGroupName, TargetPlayerName, TargetCoalition, TargetCategory, TargetType, TargetUnitCoalition, TargetUnitCategory, TargetUnitType } ) - end - - if InitPlayerName ~= nil then -- It is a player that is hitting something - self:_AddPlayerFromUnit( InitUnit ) - if self.Players[InitPlayerName] then -- This should normally not happen, but i'll test it anyway. - if TargetPlayerName ~= nil then -- It is a player hitting another player ... - self:_AddPlayerFromUnit( TargetUnit ) - self.Players[InitPlayerName].HitPlayers = self.Players[InitPlayerName].HitPlayers + 1 - end - - self:T( "Hitting Something" ) - -- What is he hitting? - if TargetCategory then - if not self.Players[InitPlayerName].Hit[TargetCategory] then - self.Players[InitPlayerName].Hit[TargetCategory] = {} - end - if not self.Players[InitPlayerName].Hit[TargetCategory][TargetUnitName] then - self.Players[InitPlayerName].Hit[TargetCategory][TargetUnitName] = {} - self.Players[InitPlayerName].Hit[TargetCategory][TargetUnitName].Score = 0 - self.Players[InitPlayerName].Hit[TargetCategory][TargetUnitName].Penalty = 0 - self.Players[InitPlayerName].Hit[TargetCategory][TargetUnitName].ScoreHit = 0 - self.Players[InitPlayerName].Hit[TargetCategory][TargetUnitName].PenaltyHit = 0 - end - local Score = 0 - if InitCoalition == TargetCoalition then - self.Players[InitPlayerName].Penalty = self.Players[InitPlayerName].Penalty + 10 - self.Players[InitPlayerName].Hit[TargetCategory][TargetUnitName].Penalty = self.Players[InitPlayerName].Hit[TargetCategory][TargetUnitName].Penalty + 10 - self.Players[InitPlayerName].Hit[TargetCategory][TargetUnitName].PenaltyHit = self.Players[InitPlayerName].Hit[TargetCategory][TargetUnitName].PenaltyHit + 1 - MESSAGE:New( "Player '" .. InitPlayerName .. "' hit a friendly " .. TargetUnitCategory .. " ( " .. TargetType .. " ) " .. - self.Players[InitPlayerName].Hit[TargetCategory][TargetUnitName].PenaltyHit .. " times. Penalty: -" .. self.Players[InitPlayerName].Hit[TargetCategory][TargetUnitName].Penalty .. - ". Score Total:" .. self.Players[InitPlayerName].Score - self.Players[InitPlayerName].Penalty, - 2 - ):ToAll() - self:ScoreCSV( InitPlayerName, "HIT_PENALTY", 1, -25, InitUnitName, InitUnitCoalition, InitUnitCategory, InitUnitType, TargetUnitName, TargetUnitCoalition, TargetUnitCategory, TargetUnitType ) - else - self.Players[InitPlayerName].Score = self.Players[InitPlayerName].Score + 10 - self.Players[InitPlayerName].Hit[TargetCategory][TargetUnitName].Score = self.Players[InitPlayerName].Hit[TargetCategory][TargetUnitName].Score + 1 - self.Players[InitPlayerName].Hit[TargetCategory][TargetUnitName].ScoreHit = self.Players[InitPlayerName].Hit[TargetCategory][TargetUnitName].ScoreHit + 1 - MESSAGE:New( "Player '" .. InitPlayerName .. "' hit a target " .. TargetUnitCategory .. " ( " .. TargetType .. " ) " .. - self.Players[InitPlayerName].Hit[TargetCategory][TargetUnitName].ScoreHit .. " times. Score: " .. self.Players[InitPlayerName].Hit[TargetCategory][TargetUnitName].Score .. - ". Score Total:" .. self.Players[InitPlayerName].Score - self.Players[InitPlayerName].Penalty, - 2 - ):ToAll() - self:ScoreCSV( InitPlayerName, "HIT_SCORE", 1, 1, InitUnitName, InitUnitCoalition, InitUnitCategory, InitUnitType, TargetUnitName, TargetUnitCoalition, TargetUnitCategory, TargetUnitType ) - end - end - end - elseif InitPlayerName == nil then -- It is an AI hitting a player??? - - end -end - - -function SCORING:ReportScoreAll() - - env.info( "Hello World " ) - - local ScoreMessage = "" - local PlayerMessage = "" - - self:T( "Score Report" ) - - for PlayerName, PlayerData in pairs( self.Players ) do - if PlayerData then -- This should normally not happen, but i'll test it anyway. - self:T( "Score Player: " .. PlayerName ) - - -- Some variables - local InitUnitCoalition = _SCORINGCoalition[PlayerData.UnitCoalition] - local InitUnitCategory = _SCORINGCategory[PlayerData.UnitCategory] - local InitUnitType = PlayerData.UnitType - local InitUnitName = PlayerData.UnitName - - local PlayerScore = 0 - local PlayerPenalty = 0 - - ScoreMessage = ":\n" - - local ScoreMessageHits = "" - - for CategoryID, CategoryName in pairs( _SCORINGCategory ) do - self:T( CategoryName ) - if PlayerData.Hit[CategoryID] then - local Score = 0 - local ScoreHit = 0 - local Penalty = 0 - local PenaltyHit = 0 - self:T( "Hit scores exist for player " .. PlayerName ) - for UnitName, UnitData in pairs( PlayerData.Hit[CategoryID] ) do - Score = Score + UnitData.Score - ScoreHit = ScoreHit + UnitData.ScoreHit - Penalty = Penalty + UnitData.Penalty - PenaltyHit = UnitData.PenaltyHit - end - local ScoreMessageHit = string.format( "%s:%d ", CategoryName, Score - Penalty ) - self:T( ScoreMessageHit ) - ScoreMessageHits = ScoreMessageHits .. ScoreMessageHit - PlayerScore = PlayerScore + Score - PlayerPenalty = PlayerPenalty + Penalty - else - --ScoreMessageHits = ScoreMessageHits .. string.format( "%s:%d ", string.format(CategoryName, 1, 1), 0 ) - end - end - if ScoreMessageHits ~= "" then - ScoreMessage = ScoreMessage .. " Hits: " .. ScoreMessageHits .. "\n" - end - - local ScoreMessageKills = "" - for CategoryID, CategoryName in pairs( _SCORINGCategory ) do - self:T( "Kill scores exist for player " .. PlayerName ) - if PlayerData.Kill[CategoryID] then - local Score = 0 - local ScoreKill = 0 - local Penalty = 0 - local PenaltyKill = 0 - - for UnitName, UnitData in pairs( PlayerData.Kill[CategoryID] ) do - Score = Score + UnitData.Score - ScoreKill = ScoreKill + UnitData.ScoreKill - Penalty = Penalty + UnitData.Penalty - PenaltyKill = PenaltyKill + UnitData.PenaltyKill - end - - local ScoreMessageKill = string.format( " %s:%d ", CategoryName, Score - Penalty ) - self:T( ScoreMessageKill ) - ScoreMessageKills = ScoreMessageKills .. ScoreMessageKill - - PlayerScore = PlayerScore + Score - PlayerPenalty = PlayerPenalty + Penalty - else - --ScoreMessageKills = ScoreMessageKills .. string.format( "%s:%d ", string.format(CategoryName, 1, 1), 0 ) - end - end - if ScoreMessageKills ~= "" then - ScoreMessage = ScoreMessage .. " Kills: " .. ScoreMessageKills .. "\n" - end - - local ScoreMessageCoalitionChangePenalties = "" - if PlayerData.PenaltyCoalition ~= 0 then - ScoreMessageCoalitionChangePenalties = ScoreMessageCoalitionChangePenalties .. string.format( " -%d (%d changed)", PlayerData.Penalty, PlayerData.PenaltyCoalition ) - PlayerPenalty = PlayerPenalty + PlayerData.Penalty - end - if ScoreMessageCoalitionChangePenalties ~= "" then - ScoreMessage = ScoreMessage .. " Coalition Penalties: " .. ScoreMessageCoalitionChangePenalties .. "\n" - end - - local ScoreMessageMission = "" - local ScoreMission = 0 - local ScoreTask = 0 - for MissionName, MissionData in pairs( PlayerData.Mission ) do - ScoreMission = ScoreMission + MissionData.ScoreMission - ScoreTask = ScoreTask + MissionData.ScoreTask - ScoreMessageMission = ScoreMessageMission .. "'" .. MissionName .. "'; " - end - PlayerScore = PlayerScore + ScoreMission + ScoreTask - - if ScoreMessageMission ~= "" then - ScoreMessage = ScoreMessage .. " Tasks: " .. ScoreTask .. " Mission: " .. ScoreMission .. " ( " .. ScoreMessageMission .. ")\n" - end - - PlayerMessage = PlayerMessage .. string.format( "Player '%s' Score:%d (%d Score -%d Penalties)%s", PlayerName, PlayerScore - PlayerPenalty, PlayerScore, PlayerPenalty, ScoreMessage ) - end - end - MESSAGE:New( PlayerMessage, 30, "Player Scores" ):ToAll() -end - - -function SCORING:ReportScorePlayer() - - env.info( "Hello World " ) - - local ScoreMessage = "" - local PlayerMessage = "" - - self:T( "Score Report" ) - - for PlayerName, PlayerData in pairs( self.Players ) do - if PlayerData then -- This should normally not happen, but i'll test it anyway. - self:T( "Score Player: " .. PlayerName ) - - -- Some variables - local InitUnitCoalition = _SCORINGCoalition[PlayerData.UnitCoalition] - local InitUnitCategory = _SCORINGCategory[PlayerData.UnitCategory] - local InitUnitType = PlayerData.UnitType - local InitUnitName = PlayerData.UnitName - - local PlayerScore = 0 - local PlayerPenalty = 0 - - ScoreMessage = "" - - local ScoreMessageHits = "" - - for CategoryID, CategoryName in pairs( _SCORINGCategory ) do - self:T( CategoryName ) - if PlayerData.Hit[CategoryID] then - local Score = 0 - local ScoreHit = 0 - local Penalty = 0 - local PenaltyHit = 0 - self:T( "Hit scores exist for player " .. PlayerName ) - for UnitName, UnitData in pairs( PlayerData.Hit[CategoryID] ) do - Score = Score + UnitData.Score - ScoreHit = ScoreHit + UnitData.ScoreHit - Penalty = Penalty + UnitData.Penalty - PenaltyHit = UnitData.PenaltyHit - end - local ScoreMessageHit = string.format( "\n %s = %d score(%d;-%d) hits(#%d;#-%d)", CategoryName, Score - Penalty, Score, Penalty, ScoreHit, PenaltyHit ) - self:T( ScoreMessageHit ) - ScoreMessageHits = ScoreMessageHits .. ScoreMessageHit - PlayerScore = PlayerScore + Score - PlayerPenalty = PlayerPenalty + Penalty - else - --ScoreMessageHits = ScoreMessageHits .. string.format( "%s:%d ", string.format(CategoryName, 1, 1), 0 ) - end - end - if ScoreMessageHits ~= "" then - ScoreMessage = ScoreMessage .. "\n Hits: " .. ScoreMessageHits .. " " - end - - local ScoreMessageKills = "" - for CategoryID, CategoryName in pairs( _SCORINGCategory ) do - self:T( "Kill scores exist for player " .. PlayerName ) - if PlayerData.Kill[CategoryID] then - local Score = 0 - local ScoreKill = 0 - local Penalty = 0 - local PenaltyKill = 0 - - for UnitName, UnitData in pairs( PlayerData.Kill[CategoryID] ) do - Score = Score + UnitData.Score - ScoreKill = ScoreKill + UnitData.ScoreKill - Penalty = Penalty + UnitData.Penalty - PenaltyKill = PenaltyKill + UnitData.PenaltyKill - end - - local ScoreMessageKill = string.format( "\n %s = %d score(%d;-%d) hits(#%d;#-%d)", CategoryName, Score - Penalty, Score, Penalty, ScoreKill, PenaltyKill ) - self:T( ScoreMessageKill ) - ScoreMessageKills = ScoreMessageKills .. ScoreMessageKill - - PlayerScore = PlayerScore + Score - PlayerPenalty = PlayerPenalty + Penalty - else - --ScoreMessageKills = ScoreMessageKills .. string.format( "%s:%d ", string.format(CategoryName, 1, 1), 0 ) - end - end - if ScoreMessageKills ~= "" then - ScoreMessage = ScoreMessage .. "\n Kills: " .. ScoreMessageKills .. " " - end - - local ScoreMessageCoalitionChangePenalties = "" - if PlayerData.PenaltyCoalition ~= 0 then - ScoreMessageCoalitionChangePenalties = ScoreMessageCoalitionChangePenalties .. string.format( " -%d (%d changed)", PlayerData.Penalty, PlayerData.PenaltyCoalition ) - PlayerPenalty = PlayerPenalty + PlayerData.Penalty - end - if ScoreMessageCoalitionChangePenalties ~= "" then - ScoreMessage = ScoreMessage .. "\n Coalition: " .. ScoreMessageCoalitionChangePenalties .. " " - end - - local ScoreMessageMission = "" - local ScoreMission = 0 - local ScoreTask = 0 - for MissionName, MissionData in pairs( PlayerData.Mission ) do - ScoreMission = ScoreMission + MissionData.ScoreMission - ScoreTask = ScoreTask + MissionData.ScoreTask - ScoreMessageMission = ScoreMessageMission .. "'" .. MissionName .. "'; " - end - PlayerScore = PlayerScore + ScoreMission + ScoreTask - - if ScoreMessageMission ~= "" then - ScoreMessage = ScoreMessage .. "\n Tasks: " .. ScoreTask .. " Mission: " .. ScoreMission .. " ( " .. ScoreMessageMission .. ") " - end - - PlayerMessage = PlayerMessage .. string.format( "Player '%s' Score = %d ( %d Score, -%d Penalties ):%s", PlayerName, PlayerScore - PlayerPenalty, PlayerScore, PlayerPenalty, ScoreMessage ) - end - end - MESSAGE:New( PlayerMessage, 30, "Player Scores" ):ToAll() - -end - - -function SCORING:SecondsToClock(sSeconds) - local nSeconds = sSeconds - if nSeconds == 0 then - --return nil; - return "00:00:00"; - else - nHours = string.format("%02.f", math.floor(nSeconds/3600)); - nMins = string.format("%02.f", math.floor(nSeconds/60 - (nHours*60))); - nSecs = string.format("%02.f", math.floor(nSeconds - nHours*3600 - nMins *60)); - return nHours..":"..nMins..":"..nSecs - end -end - ---- Opens a score CSV file to log the scores. --- @param #SCORING self --- @param #string ScoringCSV --- @return #SCORING self --- @usage --- -- Open a new CSV file to log the scores of the game Gori Valley. Let the name of the CSV file begin with "Player Scores". --- ScoringObject = SCORING:New( "Gori Valley" ) --- ScoringObject:OpenCSV( "Player Scores" ) -function SCORING:OpenCSV( ScoringCSV ) - self:F( ScoringCSV ) - - if lfs and io and os then - if ScoringCSV then - self.ScoringCSV = ScoringCSV - local fdir = lfs.writedir() .. [[Logs\]] .. self.ScoringCSV .. " " .. os.date( "%Y-%m-%d %H-%M-%S" ) .. ".csv" - - self.CSVFile, self.err = io.open( fdir, "w+" ) - if not self.CSVFile then - error( "Error: Cannot open CSV file in " .. lfs.writedir() ) - end - - self.CSVFile:write( '"GameName","RunTime","Time","PlayerName","ScoreType","PlayerUnitCoaltion","PlayerUnitCategory","PlayerUnitType","PlayerUnitName","TargetUnitCoalition","TargetUnitCategory","TargetUnitType","TargetUnitName","Times","Score"\n' ) - - self.RunTime = os.date("%y-%m-%d_%H-%M-%S") - else - error( "A string containing the CSV file name must be given." ) - end - else - self:E( "The MissionScripting.lua file has not been changed to allow lfs, io and os modules to be used..." ) - end - return self -end - - ---- Registers a score for a player. --- @param #SCORING self --- @param #string PlayerName The name of the player. --- @param #string ScoreType The type of the score. --- @param #string ScoreTimes The amount of scores achieved. --- @param #string ScoreAmount The score given. --- @param #string PlayerUnitName The unit name of the player. --- @param #string PlayerUnitCoalition The coalition of the player unit. --- @param #string PlayerUnitCategory The category of the player unit. --- @param #string PlayerUnitType The type of the player unit. --- @param #string TargetUnitName The name of the target unit. --- @param #string TargetUnitCoalition The coalition of the target unit. --- @param #string TargetUnitCategory The category of the target unit. --- @param #string TargetUnitType The type of the target unit. --- @return #SCORING self -function SCORING:ScoreCSV( PlayerName, ScoreType, ScoreTimes, ScoreAmount, PlayerUnitName, PlayerUnitCoalition, PlayerUnitCategory, PlayerUnitType, TargetUnitName, TargetUnitCoalition, TargetUnitCategory, TargetUnitType ) - --write statistic information to file - local ScoreTime = self:SecondsToClock( timer.getTime() ) - PlayerName = PlayerName:gsub( '"', '_' ) - - if PlayerUnitName and PlayerUnitName ~= '' then - local PlayerUnit = Unit.getByName( PlayerUnitName ) - - if PlayerUnit then - if not PlayerUnitCategory then - --PlayerUnitCategory = SCORINGCategory[PlayerUnit:getCategory()] - PlayerUnitCategory = _SCORINGCategory[PlayerUnit:getDesc().category] - end - - if not PlayerUnitCoalition then - PlayerUnitCoalition = _SCORINGCoalition[PlayerUnit:getCoalition()] - end - - if not PlayerUnitType then - PlayerUnitType = PlayerUnit:getTypeName() - end - else - PlayerUnitName = '' - PlayerUnitCategory = '' - PlayerUnitCoalition = '' - PlayerUnitType = '' - end - else - PlayerUnitName = '' - PlayerUnitCategory = '' - PlayerUnitCoalition = '' - PlayerUnitType = '' - end - - if not TargetUnitCoalition then - TargetUnitCoalition = '' - end - - if not TargetUnitCategory then - TargetUnitCategory = '' - end - - if not TargetUnitType then - TargetUnitType = '' - end - - if not TargetUnitName then - TargetUnitName = '' - end - - if lfs and io and os then - self.CSVFile:write( - '"' .. self.GameName .. '"' .. ',' .. - '"' .. self.RunTime .. '"' .. ',' .. - '' .. ScoreTime .. '' .. ',' .. - '"' .. PlayerName .. '"' .. ',' .. - '"' .. ScoreType .. '"' .. ',' .. - '"' .. PlayerUnitCoalition .. '"' .. ',' .. - '"' .. PlayerUnitCategory .. '"' .. ',' .. - '"' .. PlayerUnitType .. '"' .. ',' .. - '"' .. PlayerUnitName .. '"' .. ',' .. - '"' .. TargetUnitCoalition .. '"' .. ',' .. - '"' .. TargetUnitCategory .. '"' .. ',' .. - '"' .. TargetUnitType .. '"' .. ',' .. - '"' .. TargetUnitName .. '"' .. ',' .. - '' .. ScoreTimes .. '' .. ',' .. - '' .. ScoreAmount - ) - - self.CSVFile:write( "\n" ) - end -end - - -function SCORING:CloseCSV() - if lfs and io and os then - self.CSVFile:close() - end -end - ---- CARGO Classes --- @module CARGO - - - - - - - ---- Clients are those Groups defined within the Mission Editor that have the skillset defined as "Client" or "Player". --- These clients are defined within the Mission Orchestration Framework (MOF) - -CARGOS = {} - - -CARGO_ZONE = { - ClassName="CARGO_ZONE", - CargoZoneName = '', - CargoHostUnitName = '', - SIGNAL = { - TYPE = { - SMOKE = { ID = 1, TEXT = "smoke" }, - FLARE = { ID = 2, TEXT = "flare" } - }, - COLOR = { - GREEN = { ID = 1, TRIGGERCOLOR = trigger.smokeColor.Green, TEXT = "A green" }, - RED = { ID = 2, TRIGGERCOLOR = trigger.smokeColor.Red, TEXT = "A red" }, - WHITE = { ID = 3, TRIGGERCOLOR = trigger.smokeColor.White, TEXT = "A white" }, - ORANGE = { ID = 4, TRIGGERCOLOR = trigger.smokeColor.Orange, TEXT = "An orange" }, - BLUE = { ID = 5, TRIGGERCOLOR = trigger.smokeColor.Blue, TEXT = "A blue" }, - YELLOW = { ID = 6, TRIGGERCOLOR = trigger.flareColor.Yellow, TEXT = "A yellow" } - } - } -} - ---- Creates a new zone where cargo can be collected or deployed. --- The zone functionality is useful to smoke or indicate routes for cargo pickups or deployments. --- Provide the zone name as declared in the mission file into the CargoZoneName in the :New method. --- An optional parameter is the CargoHostName, which is a Group declared with Late Activation switched on in the mission file. --- The CargoHostName is the "host" of the cargo zone: --- --- * It will smoke the zone position when a client is approaching the zone. --- * Depending on the cargo type, it will assist in the delivery of the cargo by driving to and from the client. --- --- @param #CARGO_ZONE self --- @param #string CargoZoneName The name of the zone as declared within the mission editor. --- @param #string CargoHostName The name of the Group "hosting" the zone. The Group MUST NOT be a static, and must be a "mobile" unit. -function CARGO_ZONE:New( CargoZoneName, CargoHostName ) local self = BASE:Inherit( self, ZONE:New( CargoZoneName ) ) - self:F( { CargoZoneName, CargoHostName } ) - - self.CargoZoneName = CargoZoneName - self.SignalHeight = 2 - --self.CargoZone = trigger.misc.getZone( CargoZoneName ) - - - if CargoHostName then - self.CargoHostName = CargoHostName - end - - self:T( self.CargoZoneName ) - - return self -end - -function CARGO_ZONE:Spawn() - self:F( self.CargoHostName ) - - if self.CargoHostName then -- Only spawn a host in the zone when there is one given as a parameter in the New function. - if self.CargoHostSpawn then - local CargoHostGroup = self.CargoHostSpawn:GetGroupFromIndex() - if CargoHostGroup and CargoHostGroup:IsAlive() then - else - self.CargoHostSpawn:ReSpawn( 1 ) - end - else - self:T( "Initialize CargoHostSpawn" ) - self.CargoHostSpawn = SPAWN:New( self.CargoHostName ):Limit( 1, 1 ) - self.CargoHostSpawn:ReSpawn( 1 ) - end - end - - return self -end - -function CARGO_ZONE:GetHostUnit() - self:F( self ) - - if self.CargoHostName then - - -- A Host has been given, signal the host - local CargoHostGroup = self.CargoHostSpawn:GetGroupFromIndex() - local CargoHostUnit - if CargoHostGroup and CargoHostGroup:IsAlive() then - CargoHostUnit = CargoHostGroup:GetUnit(1) - else - CargoHostUnit = StaticObject.getByName( self.CargoHostName ) - end - - return CargoHostUnit - end - - return nil -end - -function CARGO_ZONE:ReportCargosToClient( Client, CargoType ) - self:F() - - local SignalUnit = self:GetHostUnit() - - if SignalUnit then - - local SignalUnitTypeName = SignalUnit:getTypeName() - - local HostMessage = "" - - local IsCargo = false - for CargoID, Cargo in pairs( CARGOS ) do - if Cargo.CargoType == Task.CargoType then - if Cargo:IsStatusNone() then - HostMessage = HostMessage .. " - " .. Cargo.CargoName .. " - " .. Cargo.CargoType .. " (" .. Cargo.Weight .. "kg)" .. "\n" - IsCargo = true - end - end - end - - if not IsCargo then - HostMessage = "No Cargo Available." - end - - Client:Message( HostMessage, 20, Mission.Name .. "/StageHosts." .. SignalUnitTypeName, SignalUnitTypeName .. ": Reporting Cargo", 10 ) - end -end - - -function CARGO_ZONE:Signal() - self:F() - - local Signalled = false - - if self.SignalType then - - if self.CargoHostName then - - -- A Host has been given, signal the host - - local SignalUnit = self:GetHostUnit() - - if SignalUnit then - - self:T( 'Signalling Unit' ) - local SignalVehiclePos = SignalUnit:GetPointVec3() - SignalVehiclePos.y = SignalVehiclePos.y + 2 - - if self.SignalType.ID == CARGO_ZONE.SIGNAL.TYPE.SMOKE.ID then - - trigger.action.smoke( SignalVehiclePos, self.SignalColor.TRIGGERCOLOR ) - Signalled = true - - elseif self.SignalType.ID == CARGO_ZONE.SIGNAL.TYPE.FLARE.ID then - - trigger.action.signalFlare( SignalVehiclePos, self.SignalColor.TRIGGERCOLOR , 0 ) - Signalled = false - - end - end - - else - - local ZonePointVec3 = self:GetPointVec3( self.SignalHeight ) -- Get the zone position + the landheight + 2 meters - - if self.SignalType.ID == CARGO_ZONE.SIGNAL.TYPE.SMOKE.ID then - - trigger.action.smoke( ZonePointVec3, self.SignalColor.TRIGGERCOLOR ) - Signalled = true - - elseif self.SignalType.ID == CARGO_ZONE.SIGNAL.TYPE.FLARE.ID then - trigger.action.signalFlare( ZonePointVec3, self.SignalColor.TRIGGERCOLOR, 0 ) - Signalled = false - - end - end - end - - return Signalled - -end - -function CARGO_ZONE:WhiteSmoke( SignalHeight ) - self:F() - - self.SignalType = CARGO_ZONE.SIGNAL.TYPE.SMOKE - self.SignalColor = CARGO_ZONE.SIGNAL.COLOR.WHITE - - if SignalHeight then - self.SignalHeight = SignalHeight - end - - return self -end - -function CARGO_ZONE:BlueSmoke( SignalHeight ) - self:F() - - self.SignalType = CARGO_ZONE.SIGNAL.TYPE.SMOKE - self.SignalColor = CARGO_ZONE.SIGNAL.COLOR.BLUE - - if SignalHeight then - self.SignalHeight = SignalHeight - end - - return self -end - -function CARGO_ZONE:RedSmoke( SignalHeight ) - self:F() - - self.SignalType = CARGO_ZONE.SIGNAL.TYPE.SMOKE - self.SignalColor = CARGO_ZONE.SIGNAL.COLOR.RED - - if SignalHeight then - self.SignalHeight = SignalHeight - end - - return self -end - -function CARGO_ZONE:OrangeSmoke( SignalHeight ) - self:F() - - self.SignalType = CARGO_ZONE.SIGNAL.TYPE.SMOKE - self.SignalColor = CARGO_ZONE.SIGNAL.COLOR.ORANGE - - if SignalHeight then - self.SignalHeight = SignalHeight - end - - return self -end - -function CARGO_ZONE:GreenSmoke( SignalHeight ) - self:F() - - self.SignalType = CARGO_ZONE.SIGNAL.TYPE.SMOKE - self.SignalColor = CARGO_ZONE.SIGNAL.COLOR.GREEN - - if SignalHeight then - self.SignalHeight = SignalHeight - end - - return self -end - - -function CARGO_ZONE:WhiteFlare( SignalHeight ) - self:F() - - self.SignalType = CARGO_ZONE.SIGNAL.TYPE.FLARE - self.SignalColor = CARGO_ZONE.SIGNAL.COLOR.WHITE - - if SignalHeight then - self.SignalHeight = SignalHeight - end - - return self -end - -function CARGO_ZONE:RedFlare( SignalHeight ) - self:F() - - self.SignalType = CARGO_ZONE.SIGNAL.TYPE.FLARE - self.SignalColor = CARGO_ZONE.SIGNAL.COLOR.RED - - if SignalHeight then - self.SignalHeight = SignalHeight - end - - return self -end - -function CARGO_ZONE:GreenFlare( SignalHeight ) - self:F() - - self.SignalType = CARGO_ZONE.SIGNAL.TYPE.FLARE - self.SignalColor = CARGO_ZONE.SIGNAL.COLOR.GREEN - - if SignalHeight then - self.SignalHeight = SignalHeight - end - - return self -end - -function CARGO_ZONE:YellowFlare( SignalHeight ) - self:F() - - self.SignalType = CARGO_ZONE.SIGNAL.TYPE.FLARE - self.SignalColor = CARGO_ZONE.SIGNAL.COLOR.YELLOW - - if SignalHeight then - self.SignalHeight = SignalHeight - end - - return self -end - - -function CARGO_ZONE:GetCargoHostUnit() - self:F( self ) - - if self.CargoHostSpawn then - local CargoHostGroup = self.CargoHostSpawn:GetGroupFromIndex(1) - if CargoHostGroup and CargoHostGroup:IsAlive() then - local CargoHostUnit = CargoHostGroup:GetUnit(1) - if CargoHostUnit and CargoHostUnit:IsAlive() then - return CargoHostUnit - end - end - end - - return nil -end - -function CARGO_ZONE:GetCargoZoneName() - self:F() - - return self.CargoZoneName -end - -CARGO = { - ClassName = "CARGO", - STATUS = { - NONE = 0, - LOADED = 1, - UNLOADED = 2, - LOADING = 3 - }, - CargoClient = nil -} - ---- Add Cargo to the mission... Cargo functionality needs to be reworked a bit, so this is still under construction. I need to make a CARGO Class... -function CARGO:New( CargoType, CargoName, CargoWeight ) local self = BASE:Inherit( self, BASE:New() ) - self:F( { CargoType, CargoName, CargoWeight } ) - - - self.CargoType = CargoType - self.CargoName = CargoName - self.CargoWeight = CargoWeight - - self:StatusNone() - - return self -end - -function CARGO:Spawn( Client ) - self:F() - - return self - -end - -function CARGO:IsNear( Client, LandingZone ) - self:F() - - local Near = true - - return Near - -end - - -function CARGO:IsLoadingToClient() - self:F() - - if self:IsStatusLoading() then - return self.CargoClient - end - - return nil - -end - - -function CARGO:IsLoadedInClient() - self:F() - - if self:IsStatusLoaded() then - return self.CargoClient - end - - return nil - -end - - -function CARGO:UnLoad( Client, TargetZoneName ) - self:F() - - self:StatusUnLoaded() - - return self -end - -function CARGO:OnBoard( Client, LandingZone ) - self:F() - - local Valid = true - - self.CargoClient = Client - local ClientUnit = Client:GetClientGroupDCSUnit() - - return Valid -end - -function CARGO:OnBoarded( Client, LandingZone ) - self:F() - - local OnBoarded = true - - return OnBoarded -end - -function CARGO:Load( Client ) - self:F() - - self:StatusLoaded( Client ) - - return self -end - -function CARGO:IsLandingRequired() - self:F() - return true -end - -function CARGO:IsSlingLoad() - self:F() - return false -end - - -function CARGO:StatusNone() - self:F() - - self.CargoClient = nil - self.CargoStatus = CARGO.STATUS.NONE - - return self -end - -function CARGO:StatusLoading( Client ) - self:F() - - self.CargoClient = Client - self.CargoStatus = CARGO.STATUS.LOADING - self:T( "Cargo " .. self.CargoName .. " loading to Client: " .. self.CargoClient:GetClientGroupName() ) - - return self -end - -function CARGO:StatusLoaded( Client ) - self:F() - - self.CargoClient = Client - self.CargoStatus = CARGO.STATUS.LOADED - self:T( "Cargo " .. self.CargoName .. " loaded in Client: " .. self.CargoClient:GetClientGroupName() ) - - return self -end - -function CARGO:StatusUnLoaded() - self:F() - - self.CargoClient = nil - self.CargoStatus = CARGO.STATUS.UNLOADED - - return self -end - - -function CARGO:IsStatusNone() - self:F() - - return self.CargoStatus == CARGO.STATUS.NONE -end - -function CARGO:IsStatusLoading() - self:F() - - return self.CargoStatus == CARGO.STATUS.LOADING -end - -function CARGO:IsStatusLoaded() - self:F() - - return self.CargoStatus == CARGO.STATUS.LOADED -end - -function CARGO:IsStatusUnLoaded() - self:F() - - return self.CargoStatus == CARGO.STATUS.UNLOADED -end - - -CARGO_GROUP = { - ClassName = "CARGO_GROUP" -} - - -function CARGO_GROUP:New( CargoType, CargoName, CargoWeight, CargoGroupTemplate, CargoZone ) local self = BASE:Inherit( self, CARGO:New( CargoType, CargoName, CargoWeight ) ) - self:F( { CargoType, CargoName, CargoWeight, CargoGroupTemplate, CargoZone } ) - - self.CargoSpawn = SPAWN:NewWithAlias( CargoGroupTemplate, CargoName ) - self.CargoZone = CargoZone - - CARGOS[self.CargoName] = self - - return self - -end - -function CARGO_GROUP:Spawn( Client ) - self:F( { Client } ) - - local SpawnCargo = true - - if self:IsStatusNone() then - local CargoGroup = Group.getByName( self.CargoName ) - if CargoGroup and CargoGroup:isExist() then - SpawnCargo = false - end - - elseif self:IsStatusLoading() then - - local Client = self:IsLoadingToClient() - if Client and Client:GetDCSGroup() then - SpawnCargo = false - else - local CargoGroup = Group.getByName( self.CargoName ) - if CargoGroup and CargoGroup:isExist() then - SpawnCargo = false - end - end - - elseif self:IsStatusLoaded() then - - local ClientLoaded = self:IsLoadedInClient() - -- Now test if another Client is alive (not this one), and it has the CARGO, then this cargo does not need to be initialized and spawned. - if ClientLoaded and ClientLoaded ~= Client then - local ClientGroup = Client:GetDCSGroup() - if ClientLoaded:GetClientGroupDCSUnit() and ClientLoaded:GetClientGroupDCSUnit():isExist() then - SpawnCargo = false - else - self:StatusNone() - end - else - -- Same Client, but now in initialize, so set back the status to None. - self:StatusNone() - end - - elseif self:IsStatusUnLoaded() then - - SpawnCargo = false - - end - - if SpawnCargo then - if self.CargoZone:GetCargoHostUnit() then - --- ReSpawn the Cargo from the CargoHost - self.CargoGroupName = self.CargoSpawn:SpawnFromUnit( self.CargoZone:GetCargoHostUnit(), 60, 30, 1 ):GetName() - else - --- ReSpawn the Cargo in the CargoZone without a host ... - self:T( self.CargoZone ) - self.CargoGroupName = self.CargoSpawn:SpawnInZone( self.CargoZone, true, 1 ):GetName() - end - self:StatusNone() - end - - self:T( { self.CargoGroupName, CARGOS[self.CargoName].CargoGroupName } ) - - return self -end - -function CARGO_GROUP:IsNear( Client, LandingZone ) - self:F() - - local Near = false - - if self.CargoGroupName then - local CargoGroup = Group.getByName( self.CargoGroupName ) - if routines.IsPartOfGroupInRadius( CargoGroup, Client:GetPositionVec3(), 250 ) then - Near = true - end - end - - return Near - -end - - -function CARGO_GROUP:OnBoard( Client, LandingZone, OnBoardSide ) - self:F() - - local Valid = true - - local ClientUnit = Client:GetClientGroupDCSUnit() - - local CarrierPos = ClientUnit:getPoint() - local CarrierPosMove = ClientUnit:getPoint() - local CarrierPosOnBoard = ClientUnit:getPoint() - - local CargoGroup = Group.getByName( self.CargoGroupName ) - - local CargoUnit = CargoGroup:getUnit(1) - local CargoPos = CargoUnit:getPoint() - - self.CargoInAir = CargoUnit:inAir() - - self:T( self.CargoInAir ) - - -- Only move the group to the carrier when the cargo is not in the air - -- (eg. cargo can be on a oil derrick, moving the cargo on the oil derrick will drop the cargo on the sea). - if not self.CargoInAir then - - local Points = {} - - self:T( 'CargoPos x = ' .. CargoPos.x .. " z = " .. CargoPos.z ) - self:T( 'CarrierPosMove x = ' .. CarrierPosMove.x .. " z = " .. CarrierPosMove.z ) - - Points[#Points+1] = routines.ground.buildWP( CargoPos, "Cone", 10 ) - - self:T( 'Points[1] x = ' .. Points[1].x .. " y = " .. Points[1].y ) - - if OnBoardSide == nil then - OnBoardSide = CLIENT.ONBOARDSIDE.NONE - end - - if OnBoardSide == CLIENT.ONBOARDSIDE.LEFT then - - self:T( "TransportCargoOnBoard: Onboarding LEFT" ) - CarrierPosMove.z = CarrierPosMove.z - 25 - CarrierPosOnBoard.z = CarrierPosOnBoard.z - 5 - Points[#Points+1] = routines.ground.buildWP( CarrierPosMove, "Cone", 10 ) - Points[#Points+1] = routines.ground.buildWP( CarrierPosOnBoard, "Cone", 10 ) - - elseif OnBoardSide == CLIENT.ONBOARDSIDE.RIGHT then - - self:T( "TransportCargoOnBoard: Onboarding RIGHT" ) - CarrierPosMove.z = CarrierPosMove.z + 25 - CarrierPosOnBoard.z = CarrierPosOnBoard.z + 5 - Points[#Points+1] = routines.ground.buildWP( CarrierPosMove, "Cone", 10 ) - Points[#Points+1] = routines.ground.buildWP( CarrierPosOnBoard, "Cone", 10 ) - - elseif OnBoardSide == CLIENT.ONBOARDSIDE.BACK then - - self:T( "TransportCargoOnBoard: Onboarding BACK" ) - CarrierPosMove.x = CarrierPosMove.x - 25 - CarrierPosOnBoard.x = CarrierPosOnBoard.x - 5 - Points[#Points+1] = routines.ground.buildWP( CarrierPosMove, "Cone", 10 ) - Points[#Points+1] = routines.ground.buildWP( CarrierPosOnBoard, "Cone", 10 ) - - elseif OnBoardSide == CLIENT.ONBOARDSIDE.FRONT then - - self:T( "TransportCargoOnBoard: Onboarding FRONT" ) - CarrierPosMove.x = CarrierPosMove.x + 25 - CarrierPosOnBoard.x = CarrierPosOnBoard.x + 5 - Points[#Points+1] = routines.ground.buildWP( CarrierPosMove, "Cone", 10 ) - Points[#Points+1] = routines.ground.buildWP( CarrierPosOnBoard, "Cone", 10 ) - - elseif OnBoardSide == CLIENT.ONBOARDSIDE.NONE then - - self:T( "TransportCargoOnBoard: Onboarding CENTRAL" ) - Points[#Points+1] = routines.ground.buildWP( CarrierPos, "Cone", 10 ) - - end - self:T( "TransportCargoOnBoard: Routing " .. self.CargoGroupName ) - - --routines.scheduleFunction( routines.goRoute, { self.CargoGroupName, Points}, timer.getTime() + 4 ) - SCHEDULER:New( self, routines.goRoute, { self.CargoGroupName, Points}, 4 ) - end - - self:StatusLoading( Client ) - - return Valid - -end - - -function CARGO_GROUP:OnBoarded( Client, LandingZone ) - self:F() - - local OnBoarded = false - - local CargoGroup = Group.getByName( self.CargoGroupName ) - - if not self.CargoInAir then - if routines.IsPartOfGroupInRadius( CargoGroup, Client:GetPositionVec3(), 25 ) then - CargoGroup:destroy() - self:StatusLoaded( Client ) - OnBoarded = true - end - else - CargoGroup:destroy() - self:StatusLoaded( Client ) - OnBoarded = true - end - - return OnBoarded -end - - -function CARGO_GROUP:UnLoad( Client, TargetZoneName ) - self:F() - - self:T( 'self.CargoName = ' .. self.CargoName ) - - local CargoGroup = self.CargoSpawn:SpawnFromUnit( Client:GetClientGroupUnit(), 60, 30 ) - - self.CargoGroupName = CargoGroup:GetName() - self:T( 'self.CargoGroupName = ' .. self.CargoGroupName ) - - CargoGroup:TaskRouteToZone( ZONE:New( TargetZoneName ), true ) - - self:StatusUnLoaded() - - return self -end - - -CARGO_PACKAGE = { - ClassName = "CARGO_PACKAGE" -} - - -function CARGO_PACKAGE:New( CargoType, CargoName, CargoWeight, CargoClient ) local self = BASE:Inherit( self, CARGO:New( CargoType, CargoName, CargoWeight ) ) - self:F( { CargoType, CargoName, CargoWeight, CargoClient } ) - - self.CargoClient = CargoClient - - CARGOS[self.CargoName] = self - - return self - -end - - -function CARGO_PACKAGE:Spawn( Client ) - self:F( { self, Client } ) - - -- this needs to be checked thoroughly - - local CargoClientGroup = self.CargoClient:GetDCSGroup() - if not CargoClientGroup then - if not self.CargoClientSpawn then - self.CargoClientSpawn = SPAWN:New( self.CargoClient:GetClientGroupName() ):Limit( 1, 1 ) - end - self.CargoClientSpawn:ReSpawn( 1 ) - end - - local SpawnCargo = true - - if self:IsStatusNone() then - - elseif self:IsStatusLoading() or self:IsStatusLoaded() then - - local CargoClientLoaded = self:IsLoadedInClient() - if CargoClientLoaded and CargoClientLoaded:GetDCSGroup() then - SpawnCargo = false - end - - elseif self:IsStatusUnLoaded() then - - SpawnCargo = false - - else - - end - - if SpawnCargo then - self:StatusLoaded( self.CargoClient ) - end - - return self -end - - -function CARGO_PACKAGE:IsNear( Client, LandingZone ) - self:F() - - local Near = false - - if self.CargoClient and self.CargoClient:GetDCSGroup() then - self:T( self.CargoClient.ClientName ) - self:T( 'Client Exists.' ) - - if routines.IsUnitInRadius( self.CargoClient:GetClientGroupDCSUnit(), Client:GetPositionVec3(), 150 ) then - Near = true - end - end - - return Near - -end - - -function CARGO_PACKAGE:OnBoard( Client, LandingZone, OnBoardSide ) - self:F() - - local Valid = true - - local ClientUnit = Client:GetClientGroupDCSUnit() - - local CarrierPos = ClientUnit:getPoint() - local CarrierPosMove = ClientUnit:getPoint() - local CarrierPosOnBoard = ClientUnit:getPoint() - local CarrierPosMoveAway = ClientUnit:getPoint() - - local CargoHostGroup = self.CargoClient:GetDCSGroup() - local CargoHostName = self.CargoClient:GetDCSGroup():getName() - - local CargoHostUnits = CargoHostGroup:getUnits() - local CargoPos = CargoHostUnits[1]:getPoint() - - local Points = {} - - self:T( 'CargoPos x = ' .. CargoPos.x .. " z = " .. CargoPos.z ) - self:T( 'CarrierPosMove x = ' .. CarrierPosMove.x .. " z = " .. CarrierPosMove.z ) - - Points[#Points+1] = routines.ground.buildWP( CargoPos, "Cone", 10 ) - - self:T( 'Points[1] x = ' .. Points[1].x .. " y = " .. Points[1].y ) - - if OnBoardSide == nil then - OnBoardSide = CLIENT.ONBOARDSIDE.NONE - end - - if OnBoardSide == CLIENT.ONBOARDSIDE.LEFT then - - self:T( "TransportCargoOnBoard: Onboarding LEFT" ) - CarrierPosMove.z = CarrierPosMove.z - 25 - CarrierPosOnBoard.z = CarrierPosOnBoard.z - 5 - CarrierPosMoveAway.z = CarrierPosMoveAway.z - 20 - Points[#Points+1] = routines.ground.buildWP( CarrierPosMove, "Cone", 10 ) - Points[#Points+1] = routines.ground.buildWP( CarrierPosOnBoard, "Cone", 10 ) - Points[#Points+1] = routines.ground.buildWP( CarrierPosMoveAway, "Cone", 10 ) - - elseif OnBoardSide == CLIENT.ONBOARDSIDE.RIGHT then - - self:T( "TransportCargoOnBoard: Onboarding RIGHT" ) - CarrierPosMove.z = CarrierPosMove.z + 25 - CarrierPosOnBoard.z = CarrierPosOnBoard.z + 5 - CarrierPosMoveAway.z = CarrierPosMoveAway.z + 20 - Points[#Points+1] = routines.ground.buildWP( CarrierPosMove, "Cone", 10 ) - Points[#Points+1] = routines.ground.buildWP( CarrierPosOnBoard, "Cone", 10 ) - Points[#Points+1] = routines.ground.buildWP( CarrierPosMoveAway, "Cone", 10 ) - - elseif OnBoardSide == CLIENT.ONBOARDSIDE.BACK then - - self:T( "TransportCargoOnBoard: Onboarding BACK" ) - CarrierPosMove.x = CarrierPosMove.x - 25 - CarrierPosOnBoard.x = CarrierPosOnBoard.x - 5 - CarrierPosMoveAway.x = CarrierPosMoveAway.x - 20 - Points[#Points+1] = routines.ground.buildWP( CarrierPosMove, "Cone", 10 ) - Points[#Points+1] = routines.ground.buildWP( CarrierPosOnBoard, "Cone", 10 ) - Points[#Points+1] = routines.ground.buildWP( CarrierPosMoveAway, "Cone", 10 ) - - elseif OnBoardSide == CLIENT.ONBOARDSIDE.FRONT then - - self:T( "TransportCargoOnBoard: Onboarding FRONT" ) - CarrierPosMove.x = CarrierPosMove.x + 25 - CarrierPosOnBoard.x = CarrierPosOnBoard.x + 5 - CarrierPosMoveAway.x = CarrierPosMoveAway.x + 20 - Points[#Points+1] = routines.ground.buildWP( CarrierPosMove, "Cone", 10 ) - Points[#Points+1] = routines.ground.buildWP( CarrierPosOnBoard, "Cone", 10 ) - Points[#Points+1] = routines.ground.buildWP( CarrierPosMoveAway, "Cone", 10 ) - - elseif OnBoardSide == CLIENT.ONBOARDSIDE.NONE then - - self:T( "TransportCargoOnBoard: Onboarding FRONT" ) - CarrierPosMove.x = CarrierPosMove.x + 25 - CarrierPosOnBoard.x = CarrierPosOnBoard.x + 5 - CarrierPosMoveAway.x = CarrierPosMoveAway.x + 20 - Points[#Points+1] = routines.ground.buildWP( CarrierPosMove, "Cone", 10 ) - Points[#Points+1] = routines.ground.buildWP( CarrierPosOnBoard, "Cone", 10 ) - Points[#Points+1] = routines.ground.buildWP( CarrierPosMoveAway, "Cone", 10 ) - - end - self:T( "Routing " .. CargoHostName ) - - --routines.scheduleFunction( routines.goRoute, { CargoHostName, Points}, timer.getTime() + 4 ) - SCHEDULER:New( self, routines.goRoute, { CargoHostName, Points }, 4 ) - - return Valid - -end - - -function CARGO_PACKAGE:OnBoarded( Client, LandingZone ) - self:F() - - local OnBoarded = false - - if self.CargoClient and self.CargoClient:GetDCSGroup() then - if routines.IsUnitInRadius( self.CargoClient:GetClientGroupDCSUnit(), self.CargoClient:GetPositionVec3(), 10 ) then - - -- Switch Cargo from self.CargoClient to Client ... Each cargo can have only one client. So assigning the new client for the cargo is enough. - self:StatusLoaded( Client ) - - -- All done, onboarded the Cargo to the new Client. - OnBoarded = true - end - end - - return OnBoarded -end - - -function CARGO_PACKAGE:UnLoad( Client, TargetZoneName ) - self:F() - - self:T( 'self.CargoName = ' .. self.CargoName ) - --self:T( 'self.CargoHostName = ' .. self.CargoHostName ) - - --self.CargoSpawn:FromCarrier( Client:GetDCSGroup(), TargetZoneName, self.CargoHostName ) - self:StatusUnLoaded() - - return Cargo -end - - -CARGO_SLINGLOAD = { - ClassName = "CARGO_SLINGLOAD" -} - - -function CARGO_SLINGLOAD:New( CargoType, CargoName, CargoWeight, CargoZone, CargoHostName, CargoCountryID ) - local self = BASE:Inherit( self, CARGO:New( CargoType, CargoName, CargoWeight ) ) - self:F( { CargoType, CargoName, CargoWeight, CargoZone, CargoHostName, CargoCountryID } ) - - self.CargoHostName = CargoHostName - - -- Cargo will be initialized around the CargoZone position. - self.CargoZone = CargoZone - - self.CargoCount = 0 - self.CargoStaticName = string.format( "%s#%03d", self.CargoName, self.CargoCount ) - - -- The country ID needs to be correctly set. - self.CargoCountryID = CargoCountryID - - CARGOS[self.CargoName] = self - - return self - -end - - -function CARGO_SLINGLOAD:IsLandingRequired() - self:F() - return false -end - - -function CARGO_SLINGLOAD:IsSlingLoad() - self:F() - return true -end - - -function CARGO_SLINGLOAD:Spawn( Client ) - self:F( { self, Client } ) - - local Zone = trigger.misc.getZone( self.CargoZone ) - - local ZonePos = {} - ZonePos.x = Zone.point.x + math.random( Zone.radius / 2 * -1, Zone.radius / 2 ) - ZonePos.y = Zone.point.z + math.random( Zone.radius / 2 * -1, Zone.radius / 2 ) - - self:T( "Cargo Location = " .. ZonePos.x .. ", " .. ZonePos.y ) - - --[[ - -- This does not work in 1.5.2. - CargoStatic = StaticObject.getByName( self.CargoName ) - if CargoStatic then - CargoStatic:destroy() - end - --]] - - CargoStatic = StaticObject.getByName( self.CargoStaticName ) - - if CargoStatic and CargoStatic:isExist() then - CargoStatic:destroy() - end - - -- I need to make every time a new cargo due to bugs in 1.5.2. - - self.CargoCount = self.CargoCount + 1 - self.CargoStaticName = string.format( "%s#%03d", self.CargoName, self.CargoCount ) - - local CargoTemplate = { - ["category"] = "Cargo", - ["shape_name"] = "ab-212_cargo", - ["type"] = "Cargo1", - ["x"] = ZonePos.x, - ["y"] = ZonePos.y, - ["mass"] = self.CargoWeight, - ["name"] = self.CargoStaticName, - ["canCargo"] = true, - ["heading"] = 0, - } - - coalition.addStaticObject( self.CargoCountryID, CargoTemplate ) - --- end - - return self -end - - -function CARGO_SLINGLOAD:IsNear( Client, LandingZone ) - self:F() - - local Near = false - - return Near -end - - -function CARGO_SLINGLOAD:IsInLandingZone( Client, LandingZone ) - self:F() - - local Near = false - - local CargoStaticUnit = StaticObject.getByName( self.CargoName ) - if CargoStaticUnit then - if routines.IsStaticInZones( CargoStaticUnit, LandingZone ) then - Near = true - end - end - - return Near -end - - -function CARGO_SLINGLOAD:OnBoard( Client, LandingZone, OnBoardSide ) - self:F() - - local Valid = true - - - return Valid -end - - -function CARGO_SLINGLOAD:OnBoarded( Client, LandingZone ) - self:F() - - local OnBoarded = false - - local CargoStaticUnit = StaticObject.getByName( self.CargoName ) - if CargoStaticUnit then - if not routines.IsStaticInZones( CargoStaticUnit, LandingZone ) then - OnBoarded = true - end - end - - return OnBoarded -end - - -function CARGO_SLINGLOAD:UnLoad( Client, TargetZoneName ) - self:F() - - self:T( 'self.CargoName = ' .. self.CargoName ) - self:T( 'self.CargoGroupName = ' .. self.CargoGroupName ) - - self:StatusUnLoaded() - - return Cargo -end ---- This module contains the MESSAGE class. --- --- 1) @{Message#MESSAGE} class, extends @{Base#BASE} --- ================================================= --- Message System to display Messages to Clients, Coalitions or All. --- Messages are shown on the display panel for an amount of seconds, and will then disappear. --- Messages can contain a category which is indicating the category of the message. --- --- 1.1) MESSAGE construction methods --- --------------------------------- --- Messages are created with @{Message#MESSAGE.New}. Note that when the MESSAGE object is created, no message is sent yet. --- To send messages, you need to use the To functions. --- --- 1.2) Send messages with MESSAGE To methods --- ------------------------------------------ --- Messages are sent to: --- --- * Clients with @{Message#MESSAGE.ToClient}. --- * Coalitions with @{Message#MESSAGE.ToCoalition}. --- * All Players with @{Message#MESSAGE.ToAll}. --- --- @module Message --- @author FlightControl - ---- The MESSAGE class --- @type MESSAGE --- @extends Base#BASE -MESSAGE = { - ClassName = "MESSAGE", - MessageCategory = 0, - MessageID = 0, -} - - ---- Creates a new MESSAGE object. Note that these MESSAGE objects are not yet displayed on the display panel. You must use the functions @{ToClient} or @{ToCoalition} or @{ToAll} to send these Messages to the respective recipients. --- @param self --- @param #string MessageText is the text of the Message. --- @param #number MessageDuration is a number in seconds of how long the MESSAGE should be shown on the display panel. --- @param #string MessageCategory (optional) is a string expressing the "category" of the Message. The category will be shown as the first text in the message followed by a ": ". --- @return #MESSAGE --- @usage --- -- Create a series of new Messages. --- -- MessageAll is meant to be sent to all players, for 25 seconds, and is classified as "Score". --- -- MessageRED is meant to be sent to the RED players only, for 10 seconds, and is classified as "End of Mission", with ID "Win". --- -- MessageClient1 is meant to be sent to a Client, for 25 seconds, and is classified as "Score", with ID "Score". --- -- MessageClient1 is meant to be sent to a Client, for 25 seconds, and is classified as "Score", with ID "Score". --- MessageAll = MESSAGE:New( "To all Players: BLUE has won! Each player of BLUE wins 50 points!", 25, "End of Mission" ) --- MessageRED = MESSAGE:New( "To the RED Players: You receive a penalty because you've killed one of your own units", 25, "Penalty" ) --- MessageClient1 = MESSAGE:New( "Congratulations, you've just hit a target", 25, "Score" ) --- MessageClient2 = MESSAGE:New( "Congratulations, you've just killed a target", 25, "Score") -function MESSAGE:New( MessageText, MessageDuration, MessageCategory ) - local self = BASE:Inherit( self, BASE:New() ) - self:F( { MessageText, MessageDuration, MessageCategory } ) - - -- When no MessageCategory is given, we don't show it as a title... - if MessageCategory and MessageCategory ~= "" then - self.MessageCategory = MessageCategory .. ": " - else - self.MessageCategory = "" - end - - self.MessageDuration = MessageDuration - self.MessageTime = timer.getTime() - self.MessageText = MessageText - - self.MessageSent = false - self.MessageGroup = false - self.MessageCoalition = false - - return self -end - ---- Sends a MESSAGE to a Client Group. Note that the Group needs to be defined within the ME with the skillset "Client" or "Player". --- @param #MESSAGE self --- @param Client#CLIENT Client is the Group of the Client. --- @return #MESSAGE --- @usage --- -- Send the 2 messages created with the @{New} method to the Client Group. --- -- Note that the Message of MessageClient2 is overwriting the Message of MessageClient1. --- ClientGroup = Group.getByName( "ClientGroup" ) --- --- MessageClient1 = MESSAGE:New( "Congratulations, you've just hit a target", "Score", 25, "Score" ):ToClient( ClientGroup ) --- MessageClient2 = MESSAGE:New( "Congratulations, you've just killed a target", "Score", 25, "Score" ):ToClient( ClientGroup ) --- or --- MESSAGE:New( "Congratulations, you've just hit a target", "Score", 25, "Score" ):ToClient( ClientGroup ) --- MESSAGE:New( "Congratulations, you've just killed a target", "Score", 25, "Score" ):ToClient( ClientGroup ) --- or --- MessageClient1 = MESSAGE:New( "Congratulations, you've just hit a target", "Score", 25, "Score" ) --- MessageClient2 = MESSAGE:New( "Congratulations, you've just killed a target", "Score", 25, "Score" ) --- MessageClient1:ToClient( ClientGroup ) --- MessageClient2:ToClient( ClientGroup ) -function MESSAGE:ToClient( Client ) - self:F( Client ) - - if Client and Client:GetClientGroupID() then - - local ClientGroupID = Client:GetClientGroupID() - self:T( self.MessageCategory .. self.MessageText:gsub("\n$",""):gsub("\n$","") .. " / " .. self.MessageDuration ) - trigger.action.outTextForGroup( ClientGroupID, self.MessageCategory .. self.MessageText:gsub("\n$",""):gsub("\n$",""), self.MessageDuration ) - end - - return self -end - ---- Sends a MESSAGE to the Blue coalition. --- @param #MESSAGE self --- @return #MESSAGE --- @usage --- -- Send a message created with the @{New} method to the BLUE coalition. --- MessageBLUE = MESSAGE:New( "To the BLUE Players: You receive a penalty because you've killed one of your own units", "Penalty", 25, "Score" ):ToBlue() --- or --- MESSAGE:New( "To the BLUE Players: You receive a penalty because you've killed one of your own units", "Penalty", 25, "Score" ):ToBlue() --- or --- MessageBLUE = MESSAGE:New( "To the BLUE Players: You receive a penalty because you've killed one of your own units", "Penalty", 25, "Score" ) --- MessageBLUE:ToBlue() -function MESSAGE:ToBlue() - self:F() - - self:ToCoalition( coalition.side.BLUE ) - - return self -end - ---- Sends a MESSAGE to the Red Coalition. --- @param #MESSAGE self --- @return #MESSAGE --- @usage --- -- Send a message created with the @{New} method to the RED coalition. --- MessageRED = MESSAGE:New( "To the RED Players: You receive a penalty because you've killed one of your own units", "Penalty", 25, "Score" ):ToRed() --- or --- MESSAGE:New( "To the RED Players: You receive a penalty because you've killed one of your own units", "Penalty", 25, "Score" ):ToRed() --- or --- MessageRED = MESSAGE:New( "To the RED Players: You receive a penalty because you've killed one of your own units", "Penalty", 25, "Score" ) --- MessageRED:ToRed() -function MESSAGE:ToRed( ) - self:F() - - self:ToCoalition( coalition.side.RED ) - - return self -end - ---- Sends a MESSAGE to a Coalition. --- @param #MESSAGE self --- @param CoalitionSide needs to be filled out by the defined structure of the standard scripting engine @{coalition.side}. --- @return #MESSAGE --- @usage --- -- Send a message created with the @{New} method to the RED coalition. --- MessageRED = MESSAGE:New( "To the RED Players: You receive a penalty because you've killed one of your own units", "Penalty", 25, "Score" ):ToCoalition( coalition.side.RED ) --- or --- MESSAGE:New( "To the RED Players: You receive a penalty because you've killed one of your own units", "Penalty", 25, "Score" ):ToCoalition( coalition.side.RED ) --- or --- MessageRED = MESSAGE:New( "To the RED Players: You receive a penalty because you've killed one of your own units", "Penalty", 25, "Score" ) --- MessageRED:ToCoalition( coalition.side.RED ) -function MESSAGE:ToCoalition( CoalitionSide ) - self:F( CoalitionSide ) - - if CoalitionSide then - self:T( self.MessageCategory .. self.MessageText:gsub("\n$",""):gsub("\n$","") .. " / " .. self.MessageDuration ) - trigger.action.outTextForCoalition( CoalitionSide, self.MessageCategory .. self.MessageText:gsub("\n$",""):gsub("\n$",""), self.MessageDuration ) - end - - return self -end - ---- Sends a MESSAGE to all players. --- @param #MESSAGE self --- @return #MESSAGE --- @usage --- -- Send a message created to all players. --- MessageAll = MESSAGE:New( "To all Players: BLUE has won! Each player of BLUE wins 50 points!", "End of Mission", 25, "Win" ):ToAll() --- or --- MESSAGE:New( "To all Players: BLUE has won! Each player of BLUE wins 50 points!", "End of Mission", 25, "Win" ):ToAll() --- or --- MessageAll = MESSAGE:New( "To all Players: BLUE has won! Each player of BLUE wins 50 points!", "End of Mission", 25, "Win" ) --- MessageAll:ToAll() -function MESSAGE:ToAll() - self:F() - - self:ToCoalition( coalition.side.RED ) - self:ToCoalition( coalition.side.BLUE ) - - return self -end - - - ------ The MESSAGEQUEUE class ----- @type MESSAGEQUEUE ---MESSAGEQUEUE = { --- ClientGroups = {}, --- CoalitionSides = {} ---} --- ---function MESSAGEQUEUE:New( RefreshInterval ) --- local self = BASE:Inherit( self, BASE:New() ) --- self:F( { RefreshInterval } ) --- --- self.RefreshInterval = RefreshInterval --- --- --self.DisplayFunction = routines.scheduleFunction( self._DisplayMessages, { self }, 0, RefreshInterval ) --- self.DisplayFunction = SCHEDULER:New( self, self._DisplayMessages, {}, 0, RefreshInterval ) --- --- return self ---end --- ------ This function is called automatically by the MESSAGEQUEUE scheduler. ---function MESSAGEQUEUE:_DisplayMessages() --- --- -- First we display all messages that a coalition needs to receive... Also those who are not in a client (CA module clients...). --- for CoalitionSideID, CoalitionSideData in pairs( self.CoalitionSides ) do --- for MessageID, MessageData in pairs( CoalitionSideData.Messages ) do --- if MessageData.MessageSent == false then --- --trigger.action.outTextForCoalition( CoalitionSideID, MessageData.MessageCategory .. '\n' .. MessageData.MessageText:gsub("\n$",""):gsub("\n$",""), MessageData.MessageDuration ) --- MessageData.MessageSent = true --- end --- local MessageTimeLeft = ( MessageData.MessageTime + MessageData.MessageDuration ) - timer.getTime() --- if MessageTimeLeft <= 0 then --- MessageData = nil --- end --- end --- end --- --- -- Then we send the messages for each individual client, but also to be included are those Coalition messages for the Clients who belong to a coalition. --- -- Because the Client messages will overwrite the Coalition messages (for that Client). --- for ClientGroupName, ClientGroupData in pairs( self.ClientGroups ) do --- for MessageID, MessageData in pairs( ClientGroupData.Messages ) do --- if MessageData.MessageGroup == false then --- trigger.action.outTextForGroup( Group.getByName(ClientGroupName):getID(), MessageData.MessageCategory .. '\n' .. MessageData.MessageText:gsub("\n$",""):gsub("\n$",""), MessageData.MessageDuration ) --- MessageData.MessageGroup = true --- end --- local MessageTimeLeft = ( MessageData.MessageTime + MessageData.MessageDuration ) - timer.getTime() --- if MessageTimeLeft <= 0 then --- MessageData = nil --- end --- end --- --- -- Now check if the Client also has messages that belong to the Coalition of the Client... --- for CoalitionSideID, CoalitionSideData in pairs( self.CoalitionSides ) do --- for MessageID, MessageData in pairs( CoalitionSideData.Messages ) do --- local CoalitionGroup = Group.getByName( ClientGroupName ) --- if CoalitionGroup and CoalitionGroup:getCoalition() == CoalitionSideID then --- if MessageData.MessageCoalition == false then --- trigger.action.outTextForGroup( Group.getByName(ClientGroupName):getID(), MessageData.MessageCategory .. '\n' .. MessageData.MessageText:gsub("\n$",""):gsub("\n$",""), MessageData.MessageDuration ) --- MessageData.MessageCoalition = true --- end --- end --- local MessageTimeLeft = ( MessageData.MessageTime + MessageData.MessageDuration ) - timer.getTime() --- if MessageTimeLeft <= 0 then --- MessageData = nil --- end --- end --- end --- end --- --- return true ---end --- ------ The _MessageQueue object is created when the MESSAGE class module is loaded. -----_MessageQueue = MESSAGEQUEUE:New( 0.5 ) --- ---- Stages within a @{TASK} within a @{MISSION}. All of the STAGE functionality is considered internally administered and not to be used by any Mission designer. --- @module STAGE --- @author Flightcontrol - - - - - - - ---- The STAGE class --- @type -STAGE = { - ClassName = "STAGE", - MSG = { ID = "None", TIME = 10 }, - FREQUENCY = { NONE = 0, ONCE = 1, REPEAT = -1 }, - - Name = "NoStage", - StageType = '', - WaitTime = 1, - Frequency = 1, - MessageCount = 0, - MessageInterval = 15, - MessageShown = {}, - MessageShow = false, - MessageFlash = false -} - - -function STAGE:New() - local self = BASE:Inherit( self, BASE:New() ) - self:F() - return self -end - -function STAGE:Execute( Mission, Client, Task ) - - local Valid = true - - return Valid -end - -function STAGE:Executing( Mission, Client, Task ) - -end - -function STAGE:Validate( Mission, Client, Task ) - local Valid = true - - return Valid -end - - -STAGEBRIEF = { - ClassName = "BRIEF", - MSG = { ID = "Brief", TIME = 1 }, - Name = "Brief", - StageBriefingTime = 0, - StageBriefingDuration = 1 -} - -function STAGEBRIEF:New() - local self = BASE:Inherit( self, STAGE:New() ) - self:F() - self.StageType = 'CLIENT' - return self -end - ---- Execute --- @param #STAGEBRIEF self --- @param Mission#MISSION Mission --- @param Client#CLIENT Client --- @param Task#TASK Task --- @return #boolean -function STAGEBRIEF:Execute( Mission, Client, Task ) - local Valid = BASE:Inherited(self):Execute( Mission, Client, Task ) - self:F() - Client:ShowMissionBriefing( Mission.MissionBriefing ) - self.StageBriefingTime = timer.getTime() - return Valid -end - -function STAGEBRIEF:Validate( Mission, Client, Task ) - local Valid = STAGE:Validate( Mission, Client, Task ) - self:T() - - if timer.getTime() - self.StageBriefingTime <= self.StageBriefingDuration then - return 0 - else - self.StageBriefingTime = timer.getTime() - return 1 - end - -end - - -STAGESTART = { - ClassName = "START", - MSG = { ID = "Start", TIME = 1 }, - Name = "Start", - StageStartTime = 0, - StageStartDuration = 1 -} - -function STAGESTART:New() - local self = BASE:Inherit( self, STAGE:New() ) - self:F() - self.StageType = 'CLIENT' - return self -end - -function STAGESTART:Execute( Mission, Client, Task ) - self:F() - local Valid = BASE:Inherited(self):Execute( Mission, Client, Task ) - if Task.TaskBriefing then - Client:Message( Task.TaskBriefing, 30, Mission.Name .. "/Stage", "Command" ) - else - Client:Message( 'Task ' .. Task.TaskNumber .. '.', 30, Mission.Name .. "/Stage", "Command" ) - end - self.StageStartTime = timer.getTime() - return Valid -end - -function STAGESTART:Validate( Mission, Client, Task ) - self:F() - local Valid = STAGE:Validate( Mission, Client, Task ) - - if timer.getTime() - self.StageStartTime <= self.StageStartDuration then - return 0 - else - self.StageStartTime = timer.getTime() - return 1 - end - - return 1 - -end - -STAGE_CARGO_LOAD = { - ClassName = "STAGE_CARGO_LOAD" -} - -function STAGE_CARGO_LOAD:New() - local self = BASE:Inherit( self, STAGE:New() ) - self:F() - self.StageType = 'CLIENT' - return self -end - -function STAGE_CARGO_LOAD:Execute( Mission, Client, Task ) - self:F() - local Valid = BASE:Inherited(self):Execute( Mission, Client, Task ) - - for LoadCargoID, LoadCargo in pairs( Task.Cargos.LoadCargos ) do - LoadCargo:Load( Client ) - end - - if Mission.MissionReportFlash and Client:IsTransport() then - Client:ShowCargo() - end - - return Valid -end - -function STAGE_CARGO_LOAD:Validate( Mission, Client, Task ) - self:F() - local Valid = STAGE:Validate( Mission, Client, Task ) - - return 1 -end - - -STAGE_CARGO_INIT = { - ClassName = "STAGE_CARGO_INIT" -} - -function STAGE_CARGO_INIT:New() - local self = BASE:Inherit( self, STAGE:New() ) - self:F() - self.StageType = 'CLIENT' - return self -end - -function STAGE_CARGO_INIT:Execute( Mission, Client, Task ) - self:F() - local Valid = BASE:Inherited(self):Execute( Mission, Client, Task ) - - for InitLandingZoneID, InitLandingZone in pairs( Task.LandingZones.LandingZones ) do - self:T( InitLandingZone ) - InitLandingZone:Spawn() - end - - - self:T( Task.Cargos.InitCargos ) - for InitCargoID, InitCargoData in pairs( Task.Cargos.InitCargos ) do - self:T( { InitCargoData } ) - InitCargoData:Spawn( Client ) - end - - return Valid -end - - -function STAGE_CARGO_INIT:Validate( Mission, Client, Task ) - self:F() - local Valid = STAGE:Validate( Mission, Client, Task ) - - return 1 -end - - - -STAGEROUTE = { - ClassName = "STAGEROUTE", - MSG = { ID = "Route", TIME = 5 }, - Frequency = STAGE.FREQUENCY.REPEAT, - Name = "Route" -} - -function STAGEROUTE:New() - local self = BASE:Inherit( self, STAGE:New() ) - self:F() - self.StageType = 'CLIENT' - self.MessageSwitch = true - return self -end - - ---- Execute the routing. --- @param #STAGEROUTE self --- @param Mission#MISSION Mission --- @param Client#CLIENT Client --- @param Task#TASK Task -function STAGEROUTE:Execute( Mission, Client, Task ) - self:F() - local Valid = BASE:Inherited(self):Execute( Mission, Client, Task ) - - local RouteMessage = "Fly to: " - self:T( Task.LandingZones ) - for LandingZoneID, LandingZoneName in pairs( Task.LandingZones.LandingZoneNames ) do - RouteMessage = RouteMessage .. "\n " .. LandingZoneName .. ' at ' .. routines.getBRStringZone( { zone = LandingZoneName, ref = Client:GetClientGroupDCSUnit():getPoint(), true, true } ) .. ' km.' - end - - if Client:IsMultiSeated() then - Client:Message( RouteMessage, self.MSG.TIME, Mission.Name .. "/StageRoute", "Co-Pilot", 20 ) - else - Client:Message( RouteMessage, self.MSG.TIME, Mission.Name .. "/StageRoute", "Command", 20 ) - end - - - if Mission.MissionReportFlash and Client:IsTransport() then - Client:ShowCargo() - end - - return Valid -end - -function STAGEROUTE:Validate( Mission, Client, Task ) - self:F() - local Valid = STAGE:Validate( Mission, Client, Task ) - - -- check if the Client is in the landing zone - self:T( Task.LandingZones.LandingZoneNames ) - Task.CurrentLandingZoneName = routines.IsUnitNearZonesRadius( Client:GetClientGroupDCSUnit(), Task.LandingZones.LandingZoneNames, 500 ) - - if Task.CurrentLandingZoneName then - - Task.CurrentLandingZone = Task.LandingZones.LandingZones[Task.CurrentLandingZoneName].CargoZone - Task.CurrentCargoZone = Task.LandingZones.LandingZones[Task.CurrentLandingZoneName] - - if Task.CurrentCargoZone then - if not Task.Signalled then - Task.Signalled = Task.CurrentCargoZone:Signal() - end - end - - self:T( 1 ) - return 1 - end - - self:T( 0 ) - return 0 -end - - - -STAGELANDING = { - ClassName = "STAGELANDING", - MSG = { ID = "Landing", TIME = 10 }, - Name = "Landing", - Signalled = false -} - -function STAGELANDING:New() - local self = BASE:Inherit( self, STAGE:New() ) - self:F() - self.StageType = 'CLIENT' - return self -end - ---- Execute the landing coordination. --- @param #STAGELANDING self --- @param Mission#MISSION Mission --- @param Client#CLIENT Client --- @param Task#TASK Task -function STAGELANDING:Execute( Mission, Client, Task ) - self:F() - - if Client:IsMultiSeated() then - Client:Message( "We have arrived at the landing zone.", self.MSG.TIME, Mission.Name .. "/StageArrived", "Co-Pilot", 10 ) - else - Client:Message( "You have arrived at the landing zone.", self.MSG.TIME, Mission.Name .. "/StageArrived", "Command", 10 ) - end - - Task.HostUnit = Task.CurrentCargoZone:GetHostUnit() - - self:T( { Task.HostUnit } ) - - if Task.HostUnit then - - Task.HostUnitName = Task.HostUnit:GetPrefix() - Task.HostUnitTypeName = Task.HostUnit:GetTypeName() - - local HostMessage = "" - Task.CargoNames = "" - - local IsFirst = true - - for CargoID, Cargo in pairs( CARGOS ) do - if Cargo.CargoType == Task.CargoType then - - if Cargo:IsLandingRequired() then - self:T( "Task for cargo " .. Cargo.CargoType .. " requires landing.") - Task.IsLandingRequired = true - end - - if Cargo:IsSlingLoad() then - self:T( "Task for cargo " .. Cargo.CargoType .. " is a slingload.") - Task.IsSlingLoad = true - end - - if IsFirst then - IsFirst = false - Task.CargoNames = Task.CargoNames .. Cargo.CargoName .. "( " .. Cargo.CargoWeight .. " )" - else - Task.CargoNames = Task.CargoNames .. "; " .. Cargo.CargoName .. "( " .. Cargo.CargoWeight .. " )" - end - end - end - - if Task.IsLandingRequired then - HostMessage = "Land the helicopter to " .. Task.TEXT[1] .. " " .. Task.CargoNames .. "." - else - HostMessage = "Use the Radio menu and F6 to find the cargo, then fly or land near the cargo and " .. Task.TEXT[1] .. " " .. Task.CargoNames .. "." - end - - local Host = "Command" - if Task.HostUnitName then - Host = Task.HostUnitName .. " (" .. Task.HostUnitTypeName .. ")" - else - if Client:IsMultiSeated() then - Host = "Co-Pilot" - end - end - - Client:Message( HostMessage, self.MSG.TIME, Mission.Name .. "/STAGELANDING.EXEC." .. Host, Host, 10 ) - - end -end - -function STAGELANDING:Validate( Mission, Client, Task ) - self:F() - - Task.CurrentLandingZoneName = routines.IsUnitNearZonesRadius( Client:GetClientGroupDCSUnit(), Task.LandingZones.LandingZoneNames, 500 ) - if Task.CurrentLandingZoneName then - - -- Client is in de landing zone. - self:T( Task.CurrentLandingZoneName ) - - Task.CurrentLandingZone = Task.LandingZones.LandingZones[Task.CurrentLandingZoneName].CargoZone - Task.CurrentCargoZone = Task.LandingZones.LandingZones[Task.CurrentLandingZoneName] - - if Task.CurrentCargoZone then - if not Task.Signalled then - Task.Signalled = Task.CurrentCargoZone:Signal() - end - end - else - if Task.CurrentLandingZone then - Task.CurrentLandingZone = nil - end - if Task.CurrentCargoZone then - Task.CurrentCargoZone = nil - end - Task.Signalled = false - Task:RemoveCargoMenus( Client ) - self:T( -1 ) - return -1 - end - - - local DCSUnitVelocityVec3 = Client:GetClientGroupDCSUnit():getVelocity() - local DCSUnitVelocity = ( DCSUnitVelocityVec3.x ^2 + DCSUnitVelocityVec3.y ^2 + DCSUnitVelocityVec3.z ^2 ) ^ 0.5 - - local DCSUnitPointVec3 = Client:GetClientGroupDCSUnit():getPoint() - local LandHeight = land.getHeight( { x = DCSUnitPointVec3.x, y = DCSUnitPointVec3.z } ) - local DCSUnitHeight = DCSUnitPointVec3.y - LandHeight - - self:T( { Task.IsLandingRequired, Client:GetClientGroupDCSUnit():inAir() } ) - if Task.IsLandingRequired and not Client:GetClientGroupDCSUnit():inAir() then - self:T( 1 ) - Task.IsInAirTestRequired = true - return 1 - end - - self:T( { DCSUnitVelocity, DCSUnitHeight, LandHeight, Task.CurrentCargoZone.SignalHeight } ) - if Task.IsLandingRequired and DCSUnitVelocity <= 0.05 and DCSUnitHeight <= Task.CurrentCargoZone.SignalHeight then - self:T( 1 ) - Task.IsInAirTestRequired = false - return 1 - end - - self:T( 0 ) - return 0 -end - -STAGELANDED = { - ClassName = "STAGELANDED", - MSG = { ID = "Land", TIME = 10 }, - Name = "Landed", - MenusAdded = false -} - -function STAGELANDED:New() - local self = BASE:Inherit( self, STAGE:New() ) - self:F() - self.StageType = 'CLIENT' - return self -end - -function STAGELANDED:Execute( Mission, Client, Task ) - self:F() - - if Task.IsLandingRequired then - - local Host = "Command" - if Task.HostUnitName then - Host = Task.HostUnitName .. " (" .. Task.HostUnitTypeName .. ")" - else - if Client:IsMultiSeated() then - Host = "Co-Pilot" - end - end - - Client:Message( 'You have landed within the landing zone. Use the radio menu (F10) to ' .. Task.TEXT[1] .. ' the ' .. Task.CargoType .. '.', - self.MSG.TIME, Mission.Name .. "/STAGELANDED.EXEC" .. Host, Host ) - - if not self.MenusAdded then - Task.Cargo = nil - Task:RemoveCargoMenus( Client ) - Task:AddCargoMenus( Client, CARGOS, 250 ) - end - end -end - - - -function STAGELANDED:Validate( Mission, Client, Task ) - self:F() - - if not routines.IsUnitNearZonesRadius( Client:GetClientGroupDCSUnit(), Task.CurrentLandingZoneName, 500 ) then - self:T( "Client is not anymore in the landing zone, go back to stage Route, and remove cargo menus." ) - Task.Signalled = false - Task:RemoveCargoMenus( Client ) - self:T( -2 ) - return -2 - end - - local DCSUnitVelocityVec3 = Client:GetClientGroupDCSUnit():getVelocity() - local DCSUnitVelocity = ( DCSUnitVelocityVec3.x ^2 + DCSUnitVelocityVec3.y ^2 + DCSUnitVelocityVec3.z ^2 ) ^ 0.5 - - local DCSUnitPointVec3 = Client:GetClientGroupDCSUnit():getPoint() - local LandHeight = land.getHeight( { x = DCSUnitPointVec3.x, y = DCSUnitPointVec3.z } ) - local DCSUnitHeight = DCSUnitPointVec3.y - LandHeight - - self:T( { Task.IsLandingRequired, Client:GetClientGroupDCSUnit():inAir() } ) - if Task.IsLandingRequired and Task.IsInAirTestRequired == true and Client:GetClientGroupDCSUnit():inAir() then - self:T( "Client went back in the air. Go back to stage Landing." ) - self:T( -1 ) - return -1 - end - - self:T( { DCSUnitVelocity, DCSUnitHeight, LandHeight, Task.CurrentCargoZone.SignalHeight } ) - if Task.IsLandingRequired and Task.IsInAirTestRequired == false and DCSUnitVelocity >= 2 and DCSUnitHeight >= Task.CurrentCargoZone.SignalHeight then - self:T( "It seems the Client went back in the air and over the boundary limits. Go back to stage Landing." ) - self:T( -1 ) - return -1 - end - - -- Wait until cargo is selected from the menu. - if Task.IsLandingRequired then - if not Task.Cargo then - self:T( 0 ) - return 0 - end - end - - self:T( 1 ) - return 1 -end - -STAGEUNLOAD = { - ClassName = "STAGEUNLOAD", - MSG = { ID = "Unload", TIME = 10 }, - Name = "Unload" -} - -function STAGEUNLOAD:New() - local self = BASE:Inherit( self, STAGE:New() ) - self:F() - self.StageType = 'CLIENT' - return self -end - ---- Coordinate UnLoading --- @param #STAGEUNLOAD self --- @param Mission#MISSION Mission --- @param Client#CLIENT Client --- @param Task#TASK Task -function STAGEUNLOAD:Execute( Mission, Client, Task ) - self:F() - - if Client:IsMultiSeated() then - Client:Message( 'The ' .. Task.CargoType .. ' are being ' .. Task.TEXT[2] .. ' within the landing zone. Wait until the helicopter is ' .. Task.TEXT[3] .. '.', - self.MSG.TIME, Mission.Name .. "/StageUnLoad", "Co-Pilot" ) - else - Client:Message( 'You are unloading the ' .. Task.CargoType .. ' ' .. Task.TEXT[2] .. ' within the landing zone. Wait until the helicopter is ' .. Task.TEXT[3] .. '.', - self.MSG.TIME, Mission.Name .. "/StageUnLoad", "Command" ) - end - Task:RemoveCargoMenus( Client ) -end - -function STAGEUNLOAD:Executing( Mission, Client, Task ) - self:F() - env.info( 'STAGEUNLOAD:Executing() Task.Cargo.CargoName = ' .. Task.Cargo.CargoName ) - - local TargetZoneName - - if Task.TargetZoneName then - TargetZoneName = Task.TargetZoneName - else - TargetZoneName = Task.CurrentLandingZoneName - end - - if Task.Cargo:UnLoad( Client, TargetZoneName ) then - Task.ExecuteStage = _TransportExecuteStage.SUCCESS - if Mission.MissionReportFlash then - Client:ShowCargo() - end - end -end - ---- Validate UnLoading --- @param #STAGEUNLOAD self --- @param Mission#MISSION Mission --- @param Client#CLIENT Client --- @param Task#TASK Task -function STAGEUNLOAD:Validate( Mission, Client, Task ) - self:F() - env.info( 'STAGEUNLOAD:Validate()' ) - - if routines.IsUnitNearZonesRadius( Client:GetClientGroupDCSUnit(), Task.CurrentLandingZoneName, 500 ) then - else - Task.ExecuteStage = _TransportExecuteStage.FAILED - Task:RemoveCargoMenus( Client ) - if Client:IsMultiSeated() then - Client:Message( 'The ' .. Task.CargoType .. " haven't been successfully " .. Task.TEXT[3] .. ' within the landing zone. Task and mission has failed.', - _TransportStageMsgTime.DONE, Mission.Name .. "/StageFailure", "Co-Pilot" ) - else - Client:Message( 'The ' .. Task.CargoType .. " haven't been successfully " .. Task.TEXT[3] .. ' within the landing zone. Task and mission has failed.', - _TransportStageMsgTime.DONE, Mission.Name .. "/StageFailure", "Command" ) - end - return 1 - end - - if not Client:GetClientGroupDCSUnit():inAir() then - else - Task.ExecuteStage = _TransportExecuteStage.FAILED - Task:RemoveCargoMenus( Client ) - if Client:IsMultiSeated() then - Client:Message( 'The ' .. Task.CargoType .. " haven't been successfully " .. Task.TEXT[3] .. ' within the landing zone. Task and mission has failed.', - _TransportStageMsgTime.DONE, Mission.Name .. "/StageFailure", "Co-Pilot" ) - else - Client:Message( 'The ' .. Task.CargoType .. " haven't been successfully " .. Task.TEXT[3] .. ' within the landing zone. Task and mission has failed.', - _TransportStageMsgTime.DONE, Mission.Name .. "/StageFailure", "Command" ) - end - return 1 - end - - if Task.ExecuteStage == _TransportExecuteStage.SUCCESS then - if Client:IsMultiSeated() then - Client:Message( 'The ' .. Task.CargoType .. ' have been sucessfully ' .. Task.TEXT[3] .. ' within the landing zone.', _TransportStageMsgTime.DONE, Mission.Name .. "/Stage", "Co-Pilot" ) - else - Client:Message( 'The ' .. Task.CargoType .. ' have been sucessfully ' .. Task.TEXT[3] .. ' within the landing zone.', _TransportStageMsgTime.DONE, Mission.Name .. "/Stage", "Command" ) - end - Task:RemoveCargoMenus( Client ) - Task.MissionTask:AddGoalCompletion( Task.MissionTask.GoalVerb, Task.CargoName, 1 ) -- We set the cargo as one more goal completed in the mission. - return 1 - end - - return 1 -end - -STAGELOAD = { - ClassName = "STAGELOAD", - MSG = { ID = "Load", TIME = 10 }, - Name = "Load" -} - -function STAGELOAD:New() - local self = BASE:Inherit( self, STAGE:New() ) - self:F() - self.StageType = 'CLIENT' - return self -end - -function STAGELOAD:Execute( Mission, Client, Task ) - self:F() - - if not Task.IsSlingLoad then - - local Host = "Command" - if Task.HostUnitName then - Host = Task.HostUnitName .. " (" .. Task.HostUnitTypeName .. ")" - else - if Client:IsMultiSeated() then - Host = "Co-Pilot" - end - end - - Client:Message( 'The ' .. Task.CargoType .. ' are being ' .. Task.TEXT[2] .. ' within the landing zone. Wait until the helicopter is ' .. Task.TEXT[3] .. '.', - _TransportStageMsgTime.EXECUTING, Mission.Name .. "/STAGELOAD.EXEC." .. Host, Host ) - - -- Route the cargo to the Carrier - - Task.Cargo:OnBoard( Client, Task.CurrentCargoZone, Task.OnBoardSide ) - Task.ExecuteStage = _TransportExecuteStage.EXECUTING - else - Task.ExecuteStage = _TransportExecuteStage.EXECUTING - end -end - -function STAGELOAD:Executing( Mission, Client, Task ) - self:F() - - -- If the Cargo is ready to be loaded, load it into the Client. - - local Host = "Command" - if Task.HostUnitName then - Host = Task.HostUnitName .. " (" .. Task.HostUnitTypeName .. ")" - else - if Client:IsMultiSeated() then - Host = "Co-Pilot" - end - end - - if not Task.IsSlingLoad then - self:T( Task.Cargo.CargoName) - - if Task.Cargo:OnBoarded( Client, Task.CurrentCargoZone ) then - - -- Load the Cargo onto the Client - Task.Cargo:Load( Client ) - - -- Message to the pilot that cargo has been loaded. - Client:Message( "The cargo " .. Task.Cargo.CargoName .. " has been loaded in our helicopter.", - 20, Mission.Name .. "/STAGELANDING.LOADING1." .. Host, Host ) - Task.ExecuteStage = _TransportExecuteStage.SUCCESS - - Client:ShowCargo() - end - else - Client:Message( "Hook the " .. Task.CargoNames .. " onto the helicopter " .. Task.TEXT[3] .. " within the landing zone.", - _TransportStageMsgTime.EXECUTING, Mission.Name .. "/STAGELOAD.LOADING.1." .. Host, Host , 10 ) - for CargoID, Cargo in pairs( CARGOS ) do - self:T( "Cargo.CargoName = " .. Cargo.CargoName ) - - if Cargo:IsSlingLoad() then - local CargoStatic = StaticObject.getByName( Cargo.CargoStaticName ) - if CargoStatic then - self:T( "Cargo is found in the DCS simulator.") - local CargoStaticPosition = CargoStatic:getPosition().p - self:T( "Cargo Position x = " .. CargoStaticPosition.x .. ", y = " .. CargoStaticPosition.y .. ", z = " .. CargoStaticPosition.z ) - local CargoStaticHeight = routines.GetUnitHeight( CargoStatic ) - if CargoStaticHeight > 5 then - self:T( "Cargo is airborne.") - Cargo:StatusLoaded() - Task.Cargo = Cargo - Client:Message( 'The Cargo has been successfully hooked onto the helicopter and is now being sling loaded. Fly outside the landing zone.', - self.MSG.TIME, Mission.Name .. "/STAGELANDING.LOADING.2." .. Host, Host ) - Task.ExecuteStage = _TransportExecuteStage.SUCCESS - break - end - else - self:T( "Cargo not found in the DCS simulator." ) - end - end - end - end - -end - -function STAGELOAD:Validate( Mission, Client, Task ) - self:F() - - self:T( "Task.CurrentLandingZoneName = " .. Task.CurrentLandingZoneName ) - - local Host = "Command" - if Task.HostUnitName then - Host = Task.HostUnitName .. " (" .. Task.HostUnitTypeName .. ")" - else - if Client:IsMultiSeated() then - Host = "Co-Pilot" - end - end - - if not Task.IsSlingLoad then - if not routines.IsUnitNearZonesRadius( Client:GetClientGroupDCSUnit(), Task.CurrentLandingZoneName, 500 ) then - Task:RemoveCargoMenus( Client ) - Task.ExecuteStage = _TransportExecuteStage.FAILED - Task.CargoName = nil - Client:Message( "The " .. Task.CargoType .. " loading has been aborted. You flew outside the pick-up zone while loading. ", - self.MSG.TIME, Mission.Name .. "/STAGELANDING.VALIDATE.1." .. Host, Host ) - self:T( -1 ) - return -1 - end - - local DCSUnitVelocityVec3 = Client:GetClientGroupDCSUnit():getVelocity() - local DCSUnitVelocity = ( DCSUnitVelocityVec3.x ^2 + DCSUnitVelocityVec3.y ^2 + DCSUnitVelocityVec3.z ^2 ) ^ 0.5 - - local DCSUnitPointVec3 = Client:GetClientGroupDCSUnit():getPoint() - local LandHeight = land.getHeight( { x = DCSUnitPointVec3.x, y = DCSUnitPointVec3.z } ) - local DCSUnitHeight = DCSUnitPointVec3.y - LandHeight - - self:T( { Task.IsLandingRequired, Client:GetClientGroupDCSUnit():inAir() } ) - if Task.IsLandingRequired and Task.IsInAirTestRequired == true and Client:GetClientGroupDCSUnit():inAir() then - Task:RemoveCargoMenus( Client ) - Task.ExecuteStage = _TransportExecuteStage.FAILED - Task.CargoName = nil - Client:Message( "The " .. Task.CargoType .. " loading has been aborted. Re-start the " .. Task.TEXT[3] .. " process. Don't fly outside the pick-up zone.", - self.MSG.TIME, Mission.Name .. "/STAGELANDING.VALIDATE.1." .. Host, Host ) - self:T( -1 ) - return -1 - end - - self:T( { DCSUnitVelocity, DCSUnitHeight, LandHeight, Task.CurrentCargoZone.SignalHeight } ) - if Task.IsLandingRequired and Task.IsInAirTestRequired == false and DCSUnitVelocity >= 2 and DCSUnitHeight >= Task.CurrentCargoZone.SignalHeight then - Task:RemoveCargoMenus( Client ) - Task.ExecuteStage = _TransportExecuteStage.FAILED - Task.CargoName = nil - Client:Message( "The " .. Task.CargoType .. " loading has been aborted. Re-start the " .. Task.TEXT[3] .. " process. Don't fly outside the pick-up zone.", - self.MSG.TIME, Mission.Name .. "/STAGELANDING.VALIDATE.1." .. Host, Host ) - self:T( -1 ) - return -1 - end - - if Task.ExecuteStage == _TransportExecuteStage.SUCCESS then - Task:RemoveCargoMenus( Client ) - Client:Message( "Good Job. The " .. Task.CargoType .. " has been sucessfully " .. Task.TEXT[3] .. " within the landing zone.", - self.MSG.TIME, Mission.Name .. "/STAGELANDING.VALIDATE.3." .. Host, Host ) - Task.MissionTask:AddGoalCompletion( Task.MissionTask.GoalVerb, Task.CargoName, 1 ) - self:T( 1 ) - return 1 - end - - else - if Task.ExecuteStage == _TransportExecuteStage.SUCCESS then - CargoStatic = StaticObject.getByName( Task.Cargo.CargoStaticName ) - if CargoStatic and not routines.IsStaticInZones( CargoStatic, Task.CurrentLandingZoneName ) then - Client:Message( "Good Job. The " .. Task.CargoType .. " has been sucessfully " .. Task.TEXT[3] .. " and flown outside of the landing zone.", - self.MSG.TIME, Mission.Name .. "/STAGELANDING.VALIDATE.4." .. Host, Host ) - Task.MissionTask:AddGoalCompletion( Task.MissionTask.GoalVerb, Task.Cargo.CargoName, 1 ) - self:T( 1 ) - return 1 - end - end - - end - - - self:T( 0 ) - return 0 -end - - -STAGEDONE = { - ClassName = "STAGEDONE", - MSG = { ID = "Done", TIME = 10 }, - Name = "Done" -} - -function STAGEDONE:New() - local self = BASE:Inherit( self, STAGE:New() ) - self:F() - self.StageType = 'AI' - return self -end - -function STAGEDONE:Execute( Mission, Client, Task ) - self:F() - -end - -function STAGEDONE:Validate( Mission, Client, Task ) - self:F() - - Task:Done() - - return 0 -end - -STAGEARRIVE = { - ClassName = "STAGEARRIVE", - MSG = { ID = "Arrive", TIME = 10 }, - Name = "Arrive" -} - -function STAGEARRIVE:New() - local self = BASE:Inherit( self, STAGE:New() ) - self:F() - self.StageType = 'CLIENT' - return self -end - - ---- Execute Arrival --- @param #STAGEARRIVE self --- @param Mission#MISSION Mission --- @param Client#CLIENT Client --- @param Task#TASK Task -function STAGEARRIVE:Execute( Mission, Client, Task ) - self:F() - - if Client:IsMultiSeated() then - Client:Message( 'We have arrived at ' .. Task.CurrentLandingZoneName .. ".", self.MSG.TIME, Mission.Name .. "/Stage", "Co-Pilot" ) - else - Client:Message( 'We have arrived at ' .. Task.CurrentLandingZoneName .. ".", self.MSG.TIME, Mission.Name .. "/Stage", "Command" ) - end - -end - -function STAGEARRIVE:Validate( Mission, Client, Task ) - self:F() - - Task.CurrentLandingZoneID = routines.IsUnitInZones( Client:GetClientGroupDCSUnit(), Task.LandingZones ) - if ( Task.CurrentLandingZoneID ) then - else - return -1 - end - - return 1 -end - -STAGEGROUPSDESTROYED = { - ClassName = "STAGEGROUPSDESTROYED", - DestroyGroupSize = -1, - Frequency = STAGE.FREQUENCY.REPEAT, - MSG = { ID = "DestroyGroup", TIME = 10 }, - Name = "GroupsDestroyed" -} - -function STAGEGROUPSDESTROYED:New() - local self = BASE:Inherit( self, STAGE:New() ) - self:F() - self.StageType = 'AI' - return self -end - ---function STAGEGROUPSDESTROYED:Execute( Mission, Client, Task ) --- --- Client:Message( 'Task: Still ' .. DestroyGroupSize .. " of " .. Task.DestroyGroupCount .. " " .. Task.DestroyGroupType .. " to be destroyed!", self.MSG.TIME, Mission.Name .. "/Stage" ) --- ---end - -function STAGEGROUPSDESTROYED:Validate( Mission, Client, Task ) - self:F() - - if Task.MissionTask:IsGoalReached() then - return 1 - else - return 0 - end -end - -function STAGEGROUPSDESTROYED:Execute( Mission, Client, Task ) - self:F() - self:T( { Task.ClassName, Task.Destroyed } ) - --env.info( 'Event Table Task = ' .. tostring(Task) ) - -end - - - - - - - - - - - - - ---[[ - _TransportStage: Defines the different stages of which of transport missions can be in. This table is internal and is used to control the sequence of messages, actions and flow. - - - _TransportStage.START - - _TransportStage.ROUTE - - _TransportStage.LAND - - _TransportStage.EXECUTE - - _TransportStage.DONE - - _TransportStage.REMOVE ---]] -_TransportStage = { - HOLD = "HOLD", - START = "START", - ROUTE = "ROUTE", - LANDING = "LANDING", - LANDED = "LANDED", - EXECUTING = "EXECUTING", - LOAD = "LOAD", - UNLOAD = "UNLOAD", - DONE = "DONE", - NEXT = "NEXT" -} - -_TransportStageMsgTime = { - HOLD = 10, - START = 60, - ROUTE = 5, - LANDING = 10, - LANDED = 30, - EXECUTING = 30, - LOAD = 30, - UNLOAD = 30, - DONE = 30, - NEXT = 0 -} - -_TransportStageTime = { - HOLD = 10, - START = 5, - ROUTE = 5, - LANDING = 1, - LANDED = 1, - EXECUTING = 5, - LOAD = 5, - UNLOAD = 5, - DONE = 1, - NEXT = 0 -} - -_TransportStageAction = { - REPEAT = -1, - NONE = 0, - ONCE = 1 -} ---- The TASK Classes define major end-to-end activities within a MISSION. The TASK Class is the Master Class to orchestrate these activities. From this class, many concrete TASK classes are inherited. --- @module TASK - - - - - - - ---- The TASK class --- @type TASK --- @extends Base#BASE -TASK = { - - -- Defines the different signal types with a Task. - SIGNAL = { - COLOR = { - RED = { ID = 1, COLOR = trigger.smokeColor.Red, TEXT = "A red" }, - GREEN = { ID = 2, COLOR = trigger.smokeColor.Green, TEXT = "A green" }, - BLUE = { ID = 3, COLOR = trigger.smokeColor.Blue, TEXT = "A blue" }, - WHITE = { ID = 4, COLOR = trigger.smokeColor.White, TEXT = "A white" }, - ORANGE = { ID = 5, COLOR = trigger.smokeColor.Orange, TEXT = "An orange" } - }, - TYPE = { - SMOKE = { ID = 1, TEXT = "smoke" }, - FLARE = { ID = 2, TEXT = "flare" } - } - }, - ClassName = "TASK", - Mission = {}, -- Owning mission of the Task - Name = '', - Stages = {}, - Stage = {}, - Cargos = { - InitCargos = {}, - LoadCargos = {} - }, - LandingZones = { - LandingZoneNames = {}, - LandingZones = {} - }, - ActiveStage = 0, - TaskDone = false, - TaskFailed = false, - GoalTasks = {} -} - ---- Instantiates a new TASK Base. Should never be used. Interface Class. --- @return TASK -function TASK:New() - local self = BASE:Inherit( self, BASE:New() ) - self:F() - - -- assign Task default values during construction - self.TaskBriefing = "Task: No Task." - self.Time = timer.getTime() - self.ExecuteStage = _TransportExecuteStage.NONE - - return self -end - -function TASK:SetStage( StageSequenceIncrement ) - self:F( { StageSequenceIncrement } ) - - local Valid = false - if StageSequenceIncrement ~= 0 then - self.ActiveStage = self.ActiveStage + StageSequenceIncrement - if 1 <= self.ActiveStage and self.ActiveStage <= #self.Stages then - self.Stage = self.Stages[self.ActiveStage] - self:T( { self.Stage.Name } ) - self.Frequency = self.Stage.Frequency - Valid = true - else - Valid = false - env.info( "TASK:SetStage() self.ActiveStage is smaller or larger than self.Stages array. self.ActiveStage = " .. self.ActiveStage ) - end - end - self.Time = timer.getTime() - return Valid -end - -function TASK:Init() - self:F() - self.ActiveStage = 0 - self:SetStage(1) - self.TaskDone = false - self.TaskFailed = false -end - - ---- Get progress of a TASK. --- @return string GoalsText -function TASK:GetGoalProgress() - self:F2() - - local GoalsText = "" - for GoalVerb, GoalVerbData in pairs( self.GoalTasks ) do - local Goals = self:GetGoalCompletion( GoalVerb ) - if Goals and Goals ~= "" then - Goals = '(' .. Goals .. ')' - else - Goals = '( - )' - end - GoalsText = GoalsText .. GoalVerb .. ': ' .. self:GetGoalCount(GoalVerb) .. ' goals ' .. Goals .. ' of ' .. self:GetGoalTotal(GoalVerb) .. ' goals completed (' .. self:GetGoalPercentage(GoalVerb) .. '%); ' - end - - if GoalsText == "" then - GoalsText = "( - )" - end - - return GoalsText -end - ---- Show progress of a TASK. --- @param MISSION Mission Group structure describing the Mission. --- @param CLIENT Client Group structure describing the Client. -function TASK:ShowGoalProgress( Mission, Client ) - self:F2() - - local GoalsText = "" - for GoalVerb, GoalVerbData in pairs( self.GoalTasks ) do - if Mission:IsCompleted() then - else - local Goals = self:GetGoalCompletion( GoalVerb ) - if Goals and Goals ~= "" then - else - Goals = "-" - end - GoalsText = GoalsText .. self:GetGoalProgress() - end - end - - if Mission.MissionReportFlash or Mission.MissionReportShow then - Client:Message( GoalsText, 10, "/TASKPROGRESS" .. self.ClassName, "Mission Command: Task Status", 30 ) - end -end - ---- Sets a TASK to status Done. -function TASK:Done() - self:F2() - self.TaskDone = true -end - ---- Returns if a TASK is done. --- @return bool -function TASK:IsDone() - self:F2( self.TaskDone ) - return self.TaskDone -end - ---- Sets a TASK to status failed. -function TASK:Failed() - self:F() - self.TaskFailed = true -end - ---- Returns if a TASk has failed. --- @return bool -function TASK:IsFailed() - self:F2( self.TaskFailed ) - return self.TaskFailed -end - -function TASK:Reset( Mission, Client ) - self:F2() - self.ExecuteStage = _TransportExecuteStage.NONE -end - ---- Returns the Goals of a TASK --- @return @table Goals -function TASK:GetGoals() - return self.GoalTasks -end - ---- Returns if a TASK has Goal(s). --- @param #TASK self --- @param #string GoalVerb is the name of the Goal of the TASK. --- @return bool -function TASK:Goal( GoalVerb ) - self:F2( { GoalVerb } ) - if not GoalVerb then - GoalVerb = self.GoalVerb - end - self:T2( {self.GoalTasks[GoalVerb] } ) - if self.GoalTasks[GoalVerb] and self.GoalTasks[GoalVerb].GoalTotal > 0 then - return true - else - return false - end -end - ---- Sets the total Goals to be achieved of the Goal Name --- @param number GoalTotal is the number of times the GoalVerb needs to be achieved. --- @param ?string GoalVerb is the name of the Goal of the TASK. If the GoalVerb is not given, then the default TASK Goals will be used. -function TASK:SetGoalTotal( GoalTotal, GoalVerb ) - self:F2( { GoalTotal, GoalVerb } ) - - if not GoalVerb then - GoalVerb = self.GoalVerb - end - self.GoalTasks[GoalVerb] = {} - self.GoalTasks[GoalVerb].Goals = {} - self.GoalTasks[GoalVerb].GoalTotal = GoalTotal - self.GoalTasks[GoalVerb].GoalCount = 0 - return self -end - ---- Gets the total of Goals to be achieved within the TASK of the GoalVerb. --- @param ?string GoalVerb is the name of the Goal of the TASK. If the GoalVerb is not given, then the default TASK Goals will be used. -function TASK:GetGoalTotal( GoalVerb ) - self:F2( { GoalVerb } ) - if not GoalVerb then - GoalVerb = self.GoalVerb - end - if self:Goal( GoalVerb ) then - return self.GoalTasks[GoalVerb].GoalTotal - else - return 0 - end -end - ---- Sets the total of Goals currently achieved within the TASK of the GoalVerb. --- @param number GoalCount is the total number of Goals achieved within the TASK. --- @param ?string GoalVerb is the name of the Goal of the TASK. If the GoalVerb is not given, then the default TASK Goals will be used. --- @return TASK -function TASK:SetGoalCount( GoalCount, GoalVerb ) - self:F2() - if not GoalVerb then - GoalVerb = self.GoalVerb - end - if self:Goal( GoalVerb) then - self.GoalTasks[GoalVerb].GoalCount = GoalCount - end - return self -end - ---- Increments the total of Goals currently achieved within the TASK of the GoalVerb, with the given GoalCountIncrease. --- @param number GoalCountIncrease is the number of new Goals achieved within the TASK. --- @param ?string GoalVerb is the name of the Goal of the TASK. If the GoalVerb is not given, then the default TASK Goals will be used. --- @return TASK -function TASK:IncreaseGoalCount( GoalCountIncrease, GoalVerb ) - self:F2( { GoalCountIncrease, GoalVerb } ) - if not GoalVerb then - GoalVerb = self.GoalVerb - end - if self:Goal( GoalVerb) then - self.GoalTasks[GoalVerb].GoalCount = self.GoalTasks[GoalVerb].GoalCount + GoalCountIncrease - end - return self -end - ---- Gets the total of Goals currently achieved within the TASK of the GoalVerb. --- @param ?string GoalVerb is the name of the Goal of the TASK. If the GoalVerb is not given, then the default TASK Goals will be used. --- @return TASK -function TASK:GetGoalCount( GoalVerb ) - self:F2() - if not GoalVerb then - GoalVerb = self.GoalVerb - end - if self:Goal( GoalVerb ) then - return self.GoalTasks[GoalVerb].GoalCount - else - return 0 - end -end - ---- Gets the percentage of Goals currently achieved within the TASK of the GoalVerb. --- @param ?string GoalVerb is the name of the Goal of the TASK. If the GoalVerb is not given, then the default TASK Goals will be used. --- @return TASK -function TASK:GetGoalPercentage( GoalVerb ) - self:F2() - if not GoalVerb then - GoalVerb = self.GoalVerb - end - if self:Goal( GoalVerb ) then - return math.floor( self:GetGoalCount( GoalVerb ) / self:GetGoalTotal( GoalVerb ) * 100 + .5 ) - else - return 100 - end -end - ---- Returns if all the Goals of the TASK were achieved. --- @return bool -function TASK:IsGoalReached() - self:F2() - - local GoalReached = true - - for GoalVerb, Goals in pairs( self.GoalTasks ) do - self:T2( { "GoalVerb", GoalVerb } ) - if self:Goal( GoalVerb ) then - local GoalToDo = self:GetGoalTotal( GoalVerb ) - self:GetGoalCount( GoalVerb ) - self:T2( "GoalToDo = " .. GoalToDo ) - if GoalToDo <= 0 then - else - GoalReached = false - break - end - else - break - end - end - - self:T( { GoalReached, self.GoalTasks } ) - return GoalReached -end - ---- Adds an Additional Goal for the TASK to be achieved. --- @param string GoalVerb is the name of the Goal of the TASK. --- @param string GoalTask is a text describing the Goal of the TASK to be achieved. --- @param number GoalIncrease is a number by which the Goal achievement is increasing. -function TASK:AddGoalCompletion( GoalVerb, GoalTask, GoalIncrease ) - self:F2( { GoalVerb, GoalTask, GoalIncrease } ) - - if self:Goal( GoalVerb ) then - self.GoalTasks[GoalVerb].Goals[#self.GoalTasks[GoalVerb].Goals+1] = GoalTask - self.GoalTasks[GoalVerb].GoalCount = self.GoalTasks[GoalVerb].GoalCount + GoalIncrease - end - return self -end - ---- Returns if the additional Goal for the TASK was completed. --- @param ?string GoalVerb is the name of the Goal of the TASK. If the GoalVerb is not given, then the default TASK Goals will be used. --- @return string Goals -function TASK:GetGoalCompletion( GoalVerb ) - self:F2( { GoalVerb } ) - - if self:Goal( GoalVerb ) then - local Goals = "" - for GoalID, GoalName in pairs( self.GoalTasks[GoalVerb].Goals ) do Goals = Goals .. GoalName .. " + " end - return Goals:gsub(" + $", ""), self.GoalTasks[GoalVerb].GoalCount - end -end - -function TASK.MenuAction( Parameter ) - Parameter.ReferenceTask.ExecuteStage = _TransportExecuteStage.EXECUTING - Parameter.ReferenceTask.Cargo = Parameter.CargoTask -end - -function TASK:StageExecute() - self:F() - - local Execute = false - - if self.Frequency == STAGE.FREQUENCY.REPEAT then - Execute = true - elseif self.Frequency == STAGE.FREQUENCY.NONE then - Execute = false - elseif self.Frequency >= 0 then - Execute = true - self.Frequency = self.Frequency - 1 - end - - return Execute - -end - ---- Work function to set signal events within a TASK. -function TASK:AddSignal( SignalUnitNames, SignalType, SignalColor, SignalHeight ) - self:F() - - local Valid = true - - if Valid then - if type( SignalUnitNames ) == "table" then - self.LandingZoneSignalUnitNames = SignalUnitNames - else - self.LandingZoneSignalUnitNames = { SignalUnitNames } - end - self.LandingZoneSignalType = SignalType - self.LandingZoneSignalColor = SignalColor - self.Signalled = false - if SignalHeight ~= nil then - self.LandingZoneSignalHeight = SignalHeight - else - self.LandingZoneSignalHeight = 0 - end - - if self.TaskBriefing then - self.TaskBriefing = self.TaskBriefing .. " " .. SignalColor.TEXT .. " " .. SignalType.TEXT .. " will be fired when entering the landing zone." - end - end - - return Valid -end - ---- When the CLIENT is approaching the landing zone, a RED SMOKE will be fired by an optional SignalUnitNames. --- @param table|string SignalUnitNames Name of the Group that will fire the signal. If this parameter is NIL, the signal will be fired from the center of the landing zone. --- @param number SignalHeight Altitude that the Signal should be fired... -function TASK:AddSmokeRed( SignalUnitNames, SignalHeight ) - self:F() - self:AddSignal( SignalUnitNames, TASK.SIGNAL.TYPE.SMOKE, TASK.SIGNAL.COLOR.RED, SignalHeight ) -end - ---- When the CLIENT is approaching the landing zone, a GREEN SMOKE will be fired by an optional SignalUnitNames. --- @param table|string SignalUnitNames Name of the Group that will fire the signal. If this parameter is NIL, the signal will be fired from the center of the landing zone. --- @param number SignalHeight Altitude that the Signal should be fired... -function TASK:AddSmokeGreen( SignalUnitNames, SignalHeight ) - self:F() - self:AddSignal( SignalUnitNames, TASK.SIGNAL.TYPE.SMOKE, TASK.SIGNAL.COLOR.GREEN, SignalHeight ) -end - ---- When the CLIENT is approaching the landing zone, a BLUE SMOKE will be fired by an optional SignalUnitNames. --- @param table|string SignalUnitNames Name of the Group that will fire the signal. If this parameter is NIL, the signal will be fired from the center of the landing zone. --- @param number SignalHeight Altitude that the Signal should be fired... -function TASK:AddSmokeBlue( SignalUnitNames, SignalHeight ) - self:F() - self:AddSignal( SignalUnitNames, TASK.SIGNAL.TYPE.SMOKE, TASK.SIGNAL.COLOR.BLUE, SignalHeight ) -end - ---- When the CLIENT is approaching the landing zone, a WHITE SMOKE will be fired by an optional SignalUnitNames. --- @param table|string SignalUnitNames Name of the Group that will fire the signal. If this parameter is NIL, the signal will be fired from the center of the landing zone. --- @param number SignalHeight Altitude that the Signal should be fired... -function TASK:AddSmokeWhite( SignalUnitNames, SignalHeight ) - self:F() - self:AddSignal( SignalUnitNames, TASK.SIGNAL.TYPE.SMOKE, TASK.SIGNAL.COLOR.WHITE, SignalHeight ) -end - ---- When the CLIENT is approaching the landing zone, an ORANGE SMOKE will be fired by an optional SignalUnitNames. --- @param table|string SignalUnitNames Name of the Group that will fire the signal. If this parameter is NIL, the signal will be fired from the center of the landing zone. --- @param number SignalHeight Altitude that the Signal should be fired... -function TASK:AddSmokeOrange( SignalUnitNames, SignalHeight ) - self:F() - self:AddSignal( SignalUnitNames, TASK.SIGNAL.TYPE.SMOKE, TASK.SIGNAL.COLOR.ORANGE, SignalHeight ) -end - ---- When the CLIENT is approaching the landing zone, a RED FLARE will be fired by an optional SignalUnitNames. --- @param table|string SignalUnitNames Name of the Group that will fire the signal. If this parameter is NIL, the signal will be fired from the center of the landing zone. --- @param number SignalHeight Altitude that the Signal should be fired... -function TASK:AddFlareRed( SignalUnitNames, SignalHeight ) - self:F() - self:AddSignal( SignalUnitNames, TASK.SIGNAL.TYPE.FLARE, TASK.SIGNAL.COLOR.RED, SignalHeight ) -end - ---- When the CLIENT is approaching the landing zone, a GREEN FLARE will be fired by an optional SignalUnitNames. --- @param table|string SignalUnitNames Name of the Group that will fire the signal. If this parameter is NIL, the signal will be fired from the center of the landing zone. --- @param number SignalHeight Altitude that the Signal should be fired... -function TASK:AddFlareGreen( SignalUnitNames, SignalHeight ) - self:F() - self:AddSignal( SignalUnitNames, TASK.SIGNAL.TYPE.FLARE, TASK.SIGNAL.COLOR.GREEN, SignalHeight ) -end - ---- When the CLIENT is approaching the landing zone, a BLUE FLARE will be fired by an optional SignalUnitNames. --- @param table|string SignalUnitNames Name of the Group that will fire the signal. If this parameter is NIL, the signal will be fired from the center of the landing zone. --- @param number SignalHeight Altitude that the Signal should be fired... -function TASK:AddFlareBlue( SignalUnitNames, SignalHeight ) - self:F() - self:AddSignal( SignalUnitNames, TASK.SIGNAL.TYPE.FLARE, TASK.SIGNAL.COLOR.BLUE, SignalHeight ) -end - ---- When the CLIENT is approaching the landing zone, a WHITE FLARE will be fired by an optional SignalUnitNames. --- @param table|string SignalUnitNames Name of the Group that will fire the signal. If this parameter is NIL, the signal will be fired from the center of the landing zone. --- @param number SignalHeight Altitude that the Signal should be fired... -function TASK:AddFlareWhite( SignalUnitNames, SignalHeight ) - self:F() - self:AddSignal( SignalUnitNames, TASK.SIGNAL.TYPE.FLARE, TASK.SIGNAL.COLOR.WHITE, SignalHeight ) -end - ---- When the CLIENT is approaching the landing zone, an ORANGE FLARE will be fired by an optional SignalUnitNames. --- @param table|string SignalUnitNames Name of the Group that will fire the signal. If this parameter is NIL, the signal will be fired from the center of the landing zone. --- @param number SignalHeight Altitude that the Signal should be fired... -function TASK:AddFlareOrange( SignalUnitNames, SignalHeight ) - self:F() - self:AddSignal( SignalUnitNames, TASK.SIGNAL.TYPE.FLARE, TASK.SIGNAL.COLOR.ORANGE, SignalHeight ) -end ---- A GOHOMETASK orchestrates the travel back to the home base, which is a specific zone defined within the ME. --- @module GOHOMETASK - ---- The GOHOMETASK class --- @type -GOHOMETASK = { - ClassName = "GOHOMETASK", -} - ---- Creates a new GOHOMETASK. --- @param table{string,...}|string LandingZones Table of Landing Zone names where Home(s) are located. --- @return GOHOMETASK -function GOHOMETASK:New( LandingZones ) - local self = BASE:Inherit( self, TASK:New() ) - self:F( { LandingZones } ) - local Valid = true - - Valid = routines.ValidateZone( LandingZones, "LandingZones", Valid ) - - if Valid then - self.Name = 'Fly Home' - self.TaskBriefing = "Task: Fly back to your home base. Your co-pilot will provide you with the directions (required flight angle in degrees) and the distance (in km) to your home base." - if type( LandingZones ) == "table" then - self.LandingZones = LandingZones - else - self.LandingZones = { LandingZones } - end - self.Stages = { STAGEBRIEF:New(), STAGESTART:New(), STAGEROUTE:New(), STAGEARRIVE:New(), STAGEDONE:New() } - self.SetStage( self, 1 ) - end - - return self -end ---- A DESTROYBASETASK will monitor the destruction of Groups and Units. This is a BASE class, other classes are derived from this class. --- @module DESTROYBASETASK --- @see DESTROYGROUPSTASK --- @see DESTROYUNITTYPESTASK --- @see DESTROY_RADARS_TASK - - - ---- The DESTROYBASETASK class --- @type DESTROYBASETASK -DESTROYBASETASK = { - ClassName = "DESTROYBASETASK", - Destroyed = 0, - GoalVerb = "Destroy", - DestroyPercentage = 100, -} - ---- Creates a new DESTROYBASETASK. --- @param #DESTROYBASETASK self --- @param #string DestroyGroupType Text describing the group to be destroyed. f.e. "Radar Installations", "Ships", "Vehicles", "Command Centers". --- @param #string DestroyUnitType Text describing the unit types to be destroyed. f.e. "SA-6", "Row Boats", "Tanks", "Tents". --- @param #list<#string> DestroyGroupPrefixes Table of Prefixes of the Groups to be destroyed before task is completed. --- @param #number DestroyPercentage defines the %-tage that needs to be destroyed to achieve mission success. eg. If in the Group there are 10 units, then a value of 75 would require 8 units to be destroyed from the Group to complete the @{TASK}. --- @return DESTROYBASETASK -function DESTROYBASETASK:New( DestroyGroupType, DestroyUnitType, DestroyGroupPrefixes, DestroyPercentage ) - local self = BASE:Inherit( self, TASK:New() ) - self:F() - - self.Name = 'Destroy' - self.Destroyed = 0 - self.DestroyGroupPrefixes = DestroyGroupPrefixes - self.DestroyGroupType = DestroyGroupType - self.DestroyUnitType = DestroyUnitType - if DestroyPercentage then - self.DestroyPercentage = DestroyPercentage - end - self.TaskBriefing = "Task: Destroy " .. DestroyGroupType .. "." - self.Stages = { STAGEBRIEF:New(), STAGESTART:New(), STAGEGROUPSDESTROYED:New(), STAGEDONE:New() } - self.SetStage( self, 1 ) - - return self -end - ---- Handle the S_EVENT_DEAD events to validate the destruction of units for the task monitoring. --- @param #DESTROYBASETASK self --- @param Event#EVENTDATA Event structure of MOOSE. -function DESTROYBASETASK:EventDead( Event ) - self:F( { Event } ) - - if Event.IniDCSUnit then - local DestroyUnit = Event.IniDCSUnit - local DestroyUnitName = Event.IniDCSUnitName - local DestroyGroup = Event.IniDCSGroup - local DestroyGroupName = Event.IniDCSGroupName - - --TODO: I need to fix here if 2 groups in the mission have a similar name with GroupPrefix equal, then i should differentiate for which group the goal was reached! - --I may need to test if for the goalverb that group goal was reached or something. Need to think about it a bit more ... - local UnitsDestroyed = 0 - for DestroyGroupPrefixID, DestroyGroupPrefix in pairs( self.DestroyGroupPrefixes ) do - self:T( DestroyGroupPrefix ) - if string.find( DestroyGroupName, DestroyGroupPrefix, 1, true ) then - self:T( BASE:Inherited(self).ClassName ) - UnitsDestroyed = self:ReportGoalProgress( DestroyGroup, DestroyUnit ) - self:T( UnitsDestroyed ) - end - end - - self:T( { UnitsDestroyed } ) - self:IncreaseGoalCount( UnitsDestroyed, self.GoalVerb ) - end - -end - ---- Validate task completeness of DESTROYBASETASK. --- @param DestroyGroup Group structure describing the group to be evaluated. --- @param DestroyUnit Unit structure describing the Unit to be evaluated. -function DESTROYBASETASK:ReportGoalProgress( DestroyGroup, DestroyUnit ) - self:F() - - return 0 -end ---- DESTROYGROUPSTASK --- @module DESTROYGROUPSTASK - - - ---- The DESTROYGROUPSTASK class --- @type -DESTROYGROUPSTASK = { - ClassName = "DESTROYGROUPSTASK", - GoalVerb = "Destroy Groups", -} - ---- Creates a new DESTROYGROUPSTASK. --- @param #DESTROYGROUPSTASK self --- @param #string DestroyGroupType String describing the group to be destroyed. --- @param #string DestroyUnitType String describing the unit to be destroyed. --- @param #list<#string> DestroyGroupNames Table of string containing the name of the groups to be destroyed before task is completed. --- @param #number DestroyPercentage defines the %-tage that needs to be destroyed to achieve mission success. eg. If in the Group there are 10 units, then a value of 75 would require 8 units to be destroyed from the Group to complete the @{TASK}. ----@return DESTROYGROUPSTASK -function DESTROYGROUPSTASK:New( DestroyGroupType, DestroyUnitType, DestroyGroupNames, DestroyPercentage ) - local self = BASE:Inherit( self, DESTROYBASETASK:New( DestroyGroupType, DestroyUnitType, DestroyGroupNames, DestroyPercentage ) ) - self:F() - - self.Name = 'Destroy Groups' - self.GoalVerb = "Destroy " .. DestroyGroupType - - _EVENTDISPATCHER:OnDead( self.EventDead , self ) - _EVENTDISPATCHER:OnCrash( self.EventDead , self ) - - return self -end - ---- Report Goal Progress. --- @param #DESTROYGROUPSTASK self --- @param DCSGroup#Group DestroyGroup Group structure describing the group to be evaluated. --- @param DCSUnit#Unit DestroyUnit Unit structure describing the Unit to be evaluated. --- @return #number The DestroyCount reflecting the amount of units destroyed within the group. -function DESTROYGROUPSTASK:ReportGoalProgress( DestroyGroup, DestroyUnit ) - self:F( { DestroyGroup, DestroyUnit, self.DestroyPercentage } ) - - local DestroyGroupSize = DestroyGroup:getSize() - 1 -- When a DEAD event occurs, the getSize is still one larger than the destroyed unit. - local DestroyGroupInitialSize = DestroyGroup:getInitialSize() - self:T( { DestroyGroupSize, DestroyGroupInitialSize - ( DestroyGroupInitialSize * self.DestroyPercentage / 100 ) } ) - - local DestroyCount = 0 - if DestroyGroup then - if DestroyGroupSize <= DestroyGroupInitialSize - ( DestroyGroupInitialSize * self.DestroyPercentage / 100 ) then - DestroyCount = 1 - end - else - DestroyCount = 1 - end - - self:T( DestroyCount ) - - return DestroyCount -end ---- Task class to destroy radar installations. --- @module DESTROYRADARSTASK - - - ---- The DESTROYRADARS class --- @type -DESTROYRADARSTASK = { - ClassName = "DESTROYRADARSTASK", - GoalVerb = "Destroy Radars" -} - ---- Creates a new DESTROYRADARSTASK. --- @param table{string,...} DestroyGroupNames Table of string containing the group names of which the radars are be destroyed. --- @return DESTROYRADARSTASK -function DESTROYRADARSTASK:New( DestroyGroupNames ) - local self = BASE:Inherit( self, DESTROYGROUPSTASK:New( 'radar installations', 'radars', DestroyGroupNames ) ) - self:F() - - self.Name = 'Destroy Radars' - - _EVENTDISPATCHER:OnDead( self.EventDead , self ) - - return self -end - ---- Report Goal Progress. --- @param Group DestroyGroup Group structure describing the group to be evaluated. --- @param Unit DestroyUnit Unit structure describing the Unit to be evaluated. -function DESTROYRADARSTASK:ReportGoalProgress( DestroyGroup, DestroyUnit ) - self:F( { DestroyGroup, DestroyUnit } ) - - local DestroyCount = 0 - if DestroyUnit and DestroyUnit:hasSensors( Unit.SensorType.RADAR, Unit.RadarType.AS ) then - if DestroyUnit and DestroyUnit:getLife() <= 1.0 then - self:T( 'Destroyed a radar' ) - DestroyCount = 1 - end - end - return DestroyCount -end ---- Set TASK to destroy certain unit types. --- @module DESTROYUNITTYPESTASK - - - ---- The DESTROYUNITTYPESTASK class --- @type -DESTROYUNITTYPESTASK = { - ClassName = "DESTROYUNITTYPESTASK", - GoalVerb = "Destroy", -} - ---- Creates a new DESTROYUNITTYPESTASK. --- @param string DestroyGroupType String describing the group to be destroyed. f.e. "Radar Installations", "Fleet", "Batallion", "Command Centers". --- @param string DestroyUnitType String describing the unit to be destroyed. f.e. "radars", "ships", "tanks", "centers". --- @param table{string,...} DestroyGroupNames Table of string containing the group names of which the radars are be destroyed. --- @param string DestroyUnitTypes Table of string containing the type names of the units to achieve mission success. --- @return DESTROYUNITTYPESTASK -function DESTROYUNITTYPESTASK:New( DestroyGroupType, DestroyUnitType, DestroyGroupNames, DestroyUnitTypes ) - local self = BASE:Inherit( self, DESTROYBASETASK:New( DestroyGroupType, DestroyUnitType, DestroyGroupNames ) ) - self:F( { DestroyGroupType, DestroyUnitType, DestroyGroupNames, DestroyUnitTypes } ) - - if type(DestroyUnitTypes) == 'table' then - self.DestroyUnitTypes = DestroyUnitTypes - else - self.DestroyUnitTypes = { DestroyUnitTypes } - end - - self.Name = 'Destroy Unit Types' - self.GoalVerb = "Destroy " .. DestroyGroupType - - _EVENTDISPATCHER:OnDead( self.EventDead , self ) - - return self -end - ---- Report Goal Progress. --- @param Group DestroyGroup Group structure describing the group to be evaluated. --- @param Unit DestroyUnit Unit structure describing the Unit to be evaluated. -function DESTROYUNITTYPESTASK:ReportGoalProgress( DestroyGroup, DestroyUnit ) - self:F( { DestroyGroup, DestroyUnit } ) - - local DestroyCount = 0 - for UnitTypeID, UnitType in pairs( self.DestroyUnitTypes ) do - if DestroyUnit and DestroyUnit:getTypeName() == UnitType then - if DestroyUnit and DestroyUnit:getLife() <= 1.0 then - DestroyCount = DestroyCount + 1 - end - end - end - return DestroyCount -end ---- A PICKUPTASK orchestrates the loading of CARGO at a specific landing zone. --- @module PICKUPTASK --- @parent TASK - ---- The PICKUPTASK class --- @type -PICKUPTASK = { - ClassName = "PICKUPTASK", - TEXT = { "Pick-Up", "picked-up", "loaded" }, - GoalVerb = "Pick-Up" -} - ---- Creates a new PICKUPTASK. --- @param table{string,...}|string LandingZones Table of Zone names where Cargo is to be loaded. --- @param CARGO_TYPE CargoType Type of the Cargo. The type must be of the following Enumeration:.. --- @param number OnBoardSide Reflects from which side the cargo Group will be on-boarded on the Carrier. -function PICKUPTASK:New( CargoType, OnBoardSide ) - local self = BASE:Inherit( self, TASK:New() ) - self:F() - - -- self holds the inherited instance of the PICKUPTASK Class to the BASE class. - - local Valid = true - - if Valid then - self.Name = 'Pickup Cargo' - self.TaskBriefing = "Task: Fly to the indicated landing zones and pickup " .. CargoType .. ". Your co-pilot will provide you with the directions (required flight angle in degrees) and the distance (in km) to the pickup zone." - self.CargoType = CargoType - self.GoalVerb = CargoType .. " " .. self.GoalVerb - self.OnBoardSide = OnBoardSide - self.IsLandingRequired = true -- required to decide whether the client needs to land or not - self.IsSlingLoad = false -- Indicates whether the cargo is a sling load cargo - self.Stages = { STAGE_CARGO_INIT:New(), STAGE_CARGO_LOAD:New(), STAGEBRIEF:New(), STAGESTART:New(), STAGEROUTE:New(), STAGELANDING:New(), STAGELANDED:New(), STAGELOAD:New(), STAGEDONE:New() } - self.SetStage( self, 1 ) - end - - return self -end - -function PICKUPTASK:FromZone( LandingZone ) - self:F() - - self.LandingZones.LandingZoneNames[LandingZone.CargoZoneName] = LandingZone.CargoZoneName - self.LandingZones.LandingZones[LandingZone.CargoZoneName] = LandingZone - - return self -end - -function PICKUPTASK:InitCargo( InitCargos ) - self:F( { InitCargos } ) - - if type( InitCargos ) == "table" then - self.Cargos.InitCargos = InitCargos - else - self.Cargos.InitCargos = { InitCargos } - end - - return self -end - -function PICKUPTASK:LoadCargo( LoadCargos ) - self:F( { LoadCargos } ) - - if type( LoadCargos ) == "table" then - self.Cargos.LoadCargos = LoadCargos - else - self.Cargos.LoadCargos = { LoadCargos } - end - - return self -end - -function PICKUPTASK:AddCargoMenus( Client, Cargos, TransportRadius ) - self:F() - - for CargoID, Cargo in pairs( Cargos ) do - - self:T( { Cargo.ClassName, Cargo.CargoName, Cargo.CargoType, Cargo:IsStatusNone(), Cargo:IsStatusLoaded(), Cargo:IsStatusLoading(), Cargo:IsStatusUnLoaded() } ) - - -- If the Cargo has no status, allow the menu option. - if Cargo:IsStatusNone() or ( Cargo:IsStatusLoading() and Client == Cargo:IsLoadingToClient() ) then - - local MenuAdd = false - if Cargo:IsNear( Client, self.CurrentCargoZone ) then - MenuAdd = true - end - - if MenuAdd then - if Client._Menus[Cargo.CargoType] == nil then - Client._Menus[Cargo.CargoType] = {} - end - - if not Client._Menus[Cargo.CargoType].PickupMenu then - Client._Menus[Cargo.CargoType].PickupMenu = missionCommands.addSubMenuForGroup( - Client:GetClientGroupID(), - self.TEXT[1] .. " " .. Cargo.CargoType, - nil - ) - self:T( 'Added PickupMenu: ' .. self.TEXT[1] .. " " .. Cargo.CargoType ) - end - - if Client._Menus[Cargo.CargoType].PickupSubMenus == nil then - Client._Menus[Cargo.CargoType].PickupSubMenus = {} - end - - Client._Menus[Cargo.CargoType].PickupSubMenus[ #Client._Menus[Cargo.CargoType].PickupSubMenus + 1 ] = missionCommands.addCommandForGroup( - Client:GetClientGroupID(), - Cargo.CargoName .. " ( " .. Cargo.CargoWeight .. "kg )", - Client._Menus[Cargo.CargoType].PickupMenu, - self.MenuAction, - { ReferenceTask = self, CargoTask = Cargo } - ) - self:T( 'Added PickupSubMenu' .. Cargo.CargoType .. ":" .. Cargo.CargoName .. " ( " .. Cargo.CargoWeight .. "kg )" ) - end - end - end - -end - -function PICKUPTASK:RemoveCargoMenus( Client ) - self:F() - - for MenuID, MenuData in pairs( Client._Menus ) do - for SubMenuID, SubMenuData in pairs( MenuData.PickupSubMenus ) do - missionCommands.removeItemForGroup( Client:GetClientGroupID(), SubMenuData ) - self:T( "Removed PickupSubMenu " ) - SubMenuData = nil - end - if MenuData.PickupMenu then - missionCommands.removeItemForGroup( Client:GetClientGroupID(), MenuData.PickupMenu ) - self:T( "Removed PickupMenu " ) - MenuData.PickupMenu = nil - end - end - - for CargoID, Cargo in pairs( CARGOS ) do - self:T( { Cargo.ClassName, Cargo.CargoName, Cargo.CargoType, Cargo:IsStatusNone(), Cargo:IsStatusLoaded(), Cargo:IsStatusLoading(), Cargo:IsStatusUnLoaded() } ) - if Cargo:IsStatusLoading() and Client == Cargo:IsLoadingToClient() then - Cargo:StatusNone() - end - end - -end - - - -function PICKUPTASK:HasFailed( ClientDead ) - self:F() - - local TaskHasFailed = self.TaskFailed - return TaskHasFailed -end - ---- A DEPLOYTASK orchestrates the deployment of CARGO within a specific landing zone. --- @module DEPLOYTASK - - - ---- A DeployTask --- @type DEPLOYTASK -DEPLOYTASK = { - ClassName = "DEPLOYTASK", - TEXT = { "Deploy", "deployed", "unloaded" }, - GoalVerb = "Deployment" -} - - ---- Creates a new DEPLOYTASK object, which models the sequence of STAGEs to unload a cargo. --- @function [parent=#DEPLOYTASK] New --- @param #string CargoType Type of the Cargo. --- @return #DEPLOYTASK The created DeployTask -function DEPLOYTASK:New( CargoType ) - local self = BASE:Inherit( self, TASK:New() ) - self:F() - - local Valid = true - - if Valid then - self.Name = 'Deploy Cargo' - self.TaskBriefing = "Fly to one of the indicated landing zones and deploy " .. CargoType .. ". Your co-pilot will provide you with the directions (required flight angle in degrees) and the distance (in km) to the deployment zone." - self.CargoType = CargoType - self.GoalVerb = CargoType .. " " .. self.GoalVerb - self.Stages = { STAGE_CARGO_INIT:New(), STAGE_CARGO_LOAD:New(), STAGEBRIEF:New(), STAGESTART:New(), STAGEROUTE:New(), STAGELANDING:New(), STAGELANDED:New(), STAGEUNLOAD:New(), STAGEDONE:New() } - self.SetStage( self, 1 ) - end - - return self -end - -function DEPLOYTASK:ToZone( LandingZone ) - self:F() - - self.LandingZones.LandingZoneNames[LandingZone.CargoZoneName] = LandingZone.CargoZoneName - self.LandingZones.LandingZones[LandingZone.CargoZoneName] = LandingZone - - return self -end - - -function DEPLOYTASK:InitCargo( InitCargos ) - self:F( { InitCargos } ) - - if type( InitCargos ) == "table" then - self.Cargos.InitCargos = InitCargos - else - self.Cargos.InitCargos = { InitCargos } - end - - return self -end - - -function DEPLOYTASK:LoadCargo( LoadCargos ) - self:F( { LoadCargos } ) - - if type( LoadCargos ) == "table" then - self.Cargos.LoadCargos = LoadCargos - else - self.Cargos.LoadCargos = { LoadCargos } - end - - return self -end - - ---- When the cargo is unloaded, it will move to the target zone name. --- @param string TargetZoneName Name of the Zone to where the Cargo should move after unloading. -function DEPLOYTASK:SetCargoTargetZoneName( TargetZoneName ) - self:F() - - local Valid = true - - Valid = routines.ValidateString( TargetZoneName, "TargetZoneName", Valid ) - - if Valid then - self.TargetZoneName = TargetZoneName - end - - return Valid - -end - -function DEPLOYTASK:AddCargoMenus( Client, Cargos, TransportRadius ) - self:F() - - local ClientGroupID = Client:GetClientGroupID() - - self:T( ClientGroupID ) - - for CargoID, Cargo in pairs( Cargos ) do - - self:T( { Cargo.ClassName, Cargo.CargoName, Cargo.CargoType, Cargo.CargoWeight } ) - - if Cargo:IsStatusLoaded() and Client == Cargo:IsLoadedInClient() then - - if Client._Menus[Cargo.CargoType] == nil then - Client._Menus[Cargo.CargoType] = {} - end - - if not Client._Menus[Cargo.CargoType].DeployMenu then - Client._Menus[Cargo.CargoType].DeployMenu = missionCommands.addSubMenuForGroup( - ClientGroupID, - self.TEXT[1] .. " " .. Cargo.CargoType, - nil - ) - self:T( 'Added DeployMenu ' .. self.TEXT[1] ) - end - - if Client._Menus[Cargo.CargoType].DeploySubMenus == nil then - Client._Menus[Cargo.CargoType].DeploySubMenus = {} - end - - if Client._Menus[Cargo.CargoType].DeployMenu == nil then - self:T( 'deploymenu is nil' ) - end - - Client._Menus[Cargo.CargoType].DeploySubMenus[ #Client._Menus[Cargo.CargoType].DeploySubMenus + 1 ] = missionCommands.addCommandForGroup( - ClientGroupID, - Cargo.CargoName .. " ( " .. Cargo.CargoWeight .. "kg )", - Client._Menus[Cargo.CargoType].DeployMenu, - self.MenuAction, - { ReferenceTask = self, CargoTask = Cargo } - ) - self:T( 'Added DeploySubMenu ' .. Cargo.CargoType .. ":" .. Cargo.CargoName .. " ( " .. Cargo.CargoWeight .. "kg )" ) - end - end - -end - -function DEPLOYTASK:RemoveCargoMenus( Client ) - self:F() - - local ClientGroupID = Client:GetClientGroupID() - self:T( ClientGroupID ) - - for MenuID, MenuData in pairs( Client._Menus ) do - if MenuData.DeploySubMenus ~= nil then - for SubMenuID, SubMenuData in pairs( MenuData.DeploySubMenus ) do - missionCommands.removeItemForGroup( ClientGroupID, SubMenuData ) - self:T( "Removed DeploySubMenu " ) - SubMenuData = nil - end - end - if MenuData.DeployMenu then - missionCommands.removeItemForGroup( ClientGroupID, MenuData.DeployMenu ) - self:T( "Removed DeployMenu " ) - MenuData.DeployMenu = nil - end - end - -end ---- A NOTASK is a dummy activity... But it will show a Mission Briefing... --- @module NOTASK - ---- The NOTASK class --- @type -NOTASK = { - ClassName = "NOTASK", -} - ---- Creates a new NOTASK. -function NOTASK:New() - local self = BASE:Inherit( self, TASK:New() ) - self:F() - - local Valid = true - - if Valid then - self.Name = 'Nothing' - self.TaskBriefing = "Task: Execute your mission." - self.Stages = { STAGEBRIEF:New(), STAGESTART:New(), STAGEDONE:New() } - self.SetStage( self, 1 ) - end - - return self -end ---- A ROUTETASK orchestrates the travel to a specific zone defined within the ME. --- @module ROUTETASK - ---- The ROUTETASK class --- @type -ROUTETASK = { - ClassName = "ROUTETASK", - GoalVerb = "Route", -} - ---- Creates a new ROUTETASK. --- @param table{sring,...}|string LandingZones Table of Zone Names where the target is located. --- @param string TaskBriefing (optional) Defines a text describing the briefing of the task. --- @return ROUTETASK -function ROUTETASK:New( LandingZones, TaskBriefing ) - local self = BASE:Inherit( self, TASK:New() ) - self:F( { LandingZones, TaskBriefing } ) - - local Valid = true - - Valid = routines.ValidateZone( LandingZones, "LandingZones", Valid ) - - if Valid then - self.Name = 'Route To Zone' - if TaskBriefing then - self.TaskBriefing = TaskBriefing .. " Your co-pilot will provide you with the directions (required flight angle in degrees) and the distance (in km) to the target objective." - else - self.TaskBriefing = "Task: Fly to specified zone(s). Your co-pilot will provide you with the directions (required flight angle in degrees) and the distance (in km) to the target objective." - end - if type( LandingZones ) == "table" then - self.LandingZones = LandingZones - else - self.LandingZones = { LandingZones } - end - self.Stages = { STAGEBRIEF:New(), STAGESTART:New(), STAGEROUTE:New(), STAGEARRIVE:New(), STAGEDONE:New() } - self.SetStage( self, 1 ) - end - - return self -end - ---- A MISSION is the main owner of a Mission orchestration within MOOSE . The Mission framework orchestrates @{CLIENT}s, @{TASK}s, @{STAGE}s etc. --- A @{CLIENT} needs to be registered within the @{MISSION} through the function @{AddClient}. A @{TASK} needs to be registered within the @{MISSION} through the function @{AddTask}. --- @module Mission - ---- The MISSION class --- @type MISSION --- @extends Base#BASE --- @field #MISSION.Clients _Clients --- @field #string MissionBriefing -MISSION = { - ClassName = "MISSION", - Name = "", - MissionStatus = "PENDING", - _Clients = {}, - _Tasks = {}, - _ActiveTasks = {}, - GoalFunction = nil, - MissionReportTrigger = 0, - MissionProgressTrigger = 0, - MissionReportShow = false, - MissionReportFlash = false, - MissionTimeInterval = 0, - MissionCoalition = "", - SUCCESS = 1, - FAILED = 2, - REPEAT = 3, - _GoalTasks = {} -} - ---- @type MISSION.Clients --- @list - -function MISSION:Meta() - - local self = BASE:Inherit( self, BASE:New() ) - self:F() - - return self -end - ---- This is the main MISSION declaration method. Each Mission is like the master or a Mission orchestration between, Clients, Tasks, Stages etc. --- @param string MissionName is the name of the mission. This name will be used to reference the status of each mission by the players. --- @param string MissionPriority is a string indicating the "priority" of the Mission. f.e. "Primary", "Secondary" or "First", "Second". It is free format and up to the Mission designer to choose. There are no rules behind this field. --- @param string MissionBriefing is a string indicating the mission briefing to be shown when a player joins a @{CLIENT}. --- @param string MissionCoalition is a string indicating the coalition or party to which this mission belongs to. It is free format and can be chosen freely by the mission designer. Note that this field is not to be confused with the coalition concept of the ME. Examples of a Mission Coalition could be "NATO", "CCCP", "Intruders", "Terrorists"... --- @return MISSION --- @usage --- -- Declare a few missions. --- local Mission = MISSIONSCHEDULER.AddMission( 'Russia Transport Troops SA-6', 'Operational', 'Transport troops from the control center to one of the SA-6 SAM sites to activate their operation.', 'Russia' ) --- local Mission = MISSIONSCHEDULER.AddMission( 'Patriots', 'Primary', 'Our intelligence reports that 3 Patriot SAM defense batteries are located near Ruisi, Kvarhiti and Gori.', 'Russia' ) --- local Mission = MISSIONSCHEDULER.AddMission( 'Package Delivery', 'Operational', 'In order to be in full control of the situation, we need you to deliver a very important package at a secret location. Fly undetected through the NATO defenses and deliver the secret package. The secret agent is located at waypoint 4.', 'Russia' ) --- local Mission = MISSIONSCHEDULER.AddMission( 'Rescue General', 'Tactical', 'Our intelligence has received a remote signal behind Gori. We believe it is a very important Russian General that was captured by Georgia. Go out there and rescue him! Ensure you stay out of the battle zone, keep south. Waypoint 4 is the location of our Russian General.', 'Russia' ) --- local Mission = MISSIONSCHEDULER.AddMission( 'NATO Transport Troops', 'Operational', 'Transport 3 groups of air defense engineers from our barracks "Gold" and "Titan" to each patriot battery control center to activate our air defenses.', 'NATO' ) --- local Mission = MISSIONSCHEDULER.AddMission( 'SA-6 SAMs', 'Primary', 'Our intelligence reports that 3 SA-6 SAM defense batteries are located near Didmukha, Khetagurov and Berula. Eliminate the Russian SAMs.', 'NATO' ) --- local Mission = MISSIONSCHEDULER.AddMission( 'NATO Sling Load', 'Operational', 'Fly to the cargo pickup zone at Dzegvi or Kaspi, and sling the cargo to Soganlug airbase.', 'NATO' ) --- local Mission = MISSIONSCHEDULER.AddMission( 'Rescue secret agent', 'Tactical', 'In order to be in full control of the situation, we need you to rescue a secret agent from the woods behind enemy lines. Avoid the Russian defenses and rescue the agent. Keep south until Khasuri, and keep your eyes open for any SAM presence. The agent is located at waypoint 4 on your kneeboard.', 'NATO' ) -function MISSION:New( MissionName, MissionPriority, MissionBriefing, MissionCoalition ) - - self = MISSION:Meta() - self:T({ MissionName, MissionPriority, MissionBriefing, MissionCoalition }) - - local Valid = true - - Valid = routines.ValidateString( MissionName, "MissionName", Valid ) - Valid = routines.ValidateString( MissionPriority, "MissionPriority", Valid ) - Valid = routines.ValidateString( MissionBriefing, "MissionBriefing", Valid ) - Valid = routines.ValidateString( MissionCoalition, "MissionCoalition", Valid ) - - if Valid then - self.Name = MissionName - self.MissionPriority = MissionPriority - self.MissionBriefing = MissionBriefing - self.MissionCoalition = MissionCoalition - end - - return self -end - ---- Returns if a Mission has completed. --- @return bool -function MISSION:IsCompleted() - self:F() - return self.MissionStatus == "ACCOMPLISHED" -end - ---- Set a Mission to completed. -function MISSION:Completed() - self:F() - self.MissionStatus = "ACCOMPLISHED" - self:StatusToClients() -end - ---- Returns if a Mission is ongoing. --- treturn bool -function MISSION:IsOngoing() - self:F() - return self.MissionStatus == "ONGOING" -end - ---- Set a Mission to ongoing. -function MISSION:Ongoing() - self:F() - self.MissionStatus = "ONGOING" - --self:StatusToClients() -end - ---- Returns if a Mission is pending. --- treturn bool -function MISSION:IsPending() - self:F() - return self.MissionStatus == "PENDING" -end - ---- Set a Mission to pending. -function MISSION:Pending() - self:F() - self.MissionStatus = "PENDING" - self:StatusToClients() -end - ---- Returns if a Mission has failed. --- treturn bool -function MISSION:IsFailed() - self:F() - return self.MissionStatus == "FAILED" -end - ---- Set a Mission to failed. -function MISSION:Failed() - self:F() - self.MissionStatus = "FAILED" - self:StatusToClients() -end - ---- Send the status of the MISSION to all Clients. -function MISSION:StatusToClients() - self:F() - if self.MissionReportFlash then - for ClientID, Client in pairs( self._Clients ) do - Client:Message( self.MissionCoalition .. ' "' .. self.Name .. '": ' .. self.MissionStatus .. '! ( ' .. self.MissionPriority .. ' mission ) ', 10, self.Name .. '/Status', "Mission Command: Mission Status") - end - end -end - ---- Handles the reporting. After certain time intervals, a MISSION report MESSAGE will be shown to All Players. -function MISSION:ReportTrigger() - self:F() - - if self.MissionReportShow == true then - self.MissionReportShow = false - return true - else - if self.MissionReportFlash == true then - if timer.getTime() >= self.MissionReportTrigger then - self.MissionReportTrigger = timer.getTime() + self.MissionTimeInterval - return true - else - return false - end - else - return false - end - end -end - ---- Report the status of all MISSIONs to all active Clients. -function MISSION:ReportToAll() - self:F() - - local AlivePlayers = '' - for ClientID, Client in pairs( self._Clients ) do - if Client:GetDCSGroup() then - if Client:GetClientGroupDCSUnit() then - if Client:GetClientGroupDCSUnit():getLife() > 0.0 then - if AlivePlayers == '' then - AlivePlayers = ' Players: ' .. Client:GetClientGroupDCSUnit():getPlayerName() - else - AlivePlayers = AlivePlayers .. ' / ' .. Client:GetClientGroupDCSUnit():getPlayerName() - end - end - end - end - end - local Tasks = self:GetTasks() - local TaskText = "" - for TaskID, TaskData in pairs( Tasks ) do - TaskText = TaskText .. " - Task " .. TaskID .. ": " .. TaskData.Name .. ": " .. TaskData:GetGoalProgress() .. "\n" - end - MESSAGE:New( self.MissionCoalition .. ' "' .. self.Name .. '": ' .. self.MissionStatus .. ' ( ' .. self.MissionPriority .. ' mission )' .. AlivePlayers .. "\n" .. TaskText:gsub("\n$",""), 10, "Mission Command: Mission Report" ):ToAll() -end - - ---- Add a goal function to a MISSION. Goal functions are called when a @{TASK} within a mission has been completed. --- @param function GoalFunction is the function defined by the mission designer to evaluate whether a certain goal has been reached after a @{TASK} finishes within the @{MISSION}. A GoalFunction must accept 2 parameters: Mission, Client, which contains the current MISSION object and the current CLIENT object respectively. --- @usage --- PatriotActivation = { --- { "US SAM Patriot Zerti", false }, --- { "US SAM Patriot Zegduleti", false }, --- { "US SAM Patriot Gvleti", false } --- } --- --- function DeployPatriotTroopsGoal( Mission, Client ) --- --- --- -- Check if the cargo is all deployed for mission success. --- for CargoID, CargoData in pairs( Mission._Cargos ) do --- if Group.getByName( CargoData.CargoGroupName ) then --- CargoGroup = Group.getByName( CargoData.CargoGroupName ) --- if CargoGroup then --- -- Check if the cargo is ready to activate --- CurrentLandingZoneID = routines.IsUnitInZones( CargoGroup:getUnits()[1], Mission:GetTask( 2 ).LandingZones ) -- The second task is the Deploytask to measure mission success upon --- if CurrentLandingZoneID then --- if PatriotActivation[CurrentLandingZoneID][2] == false then --- -- Now check if this is a new Mission Task to be completed... --- trigger.action.setGroupAIOn( Group.getByName( PatriotActivation[CurrentLandingZoneID][1] ) ) --- PatriotActivation[CurrentLandingZoneID][2] = true --- MessageToBlue( "Mission Command: Message to all airborne units! The " .. PatriotActivation[CurrentLandingZoneID][1] .. " is armed. Our air defenses are now stronger.", 60, "BLUE/PatriotDefense" ) --- MessageToRed( "Mission Command: Our satellite systems are detecting additional NATO air defenses. To all airborne units: Take care!!!", 60, "RED/PatriotDefense" ) --- Mission:GetTask( 2 ):AddGoalCompletion( "Patriots activated", PatriotActivation[CurrentLandingZoneID][1], 1 ) -- Register Patriot activation as part of mission goal. --- end --- end --- end --- end --- end --- end --- --- local Mission = MISSIONSCHEDULER.AddMission( 'NATO Transport Troops', 'Operational', 'Transport 3 groups of air defense engineers from our barracks "Gold" and "Titan" to each patriot battery control center to activate our air defenses.', 'NATO' ) --- Mission:AddGoalFunction( DeployPatriotTroopsGoal ) -function MISSION:AddGoalFunction( GoalFunction ) - self:F() - self.GoalFunction = GoalFunction -end - ---- Register a new @{CLIENT} to participate within the mission. --- @param CLIENT Client is the @{CLIENT} object. The object must have been instantiated with @{CLIENT:New}. --- @return CLIENT --- @usage --- Add a number of Client objects to the Mission. --- Mission:AddClient( CLIENT:FindByName( 'US UH-1H*HOT-Deploy Troops 1', 'Transport 3 groups of air defense engineers from our barracks "Gold" and "Titan" to each patriot battery control center to activate our air defenses.' ):Transport() ) --- Mission:AddClient( CLIENT:FindByName( 'US UH-1H*RAMP-Deploy Troops 3', 'Transport 3 groups of air defense engineers from our barracks "Gold" and "Titan" to each patriot battery control center to activate our air defenses.' ):Transport() ) --- Mission:AddClient( CLIENT:FindByName( 'US UH-1H*HOT-Deploy Troops 2', 'Transport 3 groups of air defense engineers from our barracks "Gold" and "Titan" to each patriot battery control center to activate our air defenses.' ):Transport() ) --- Mission:AddClient( CLIENT:FindByName( 'US UH-1H*RAMP-Deploy Troops 4', 'Transport 3 groups of air defense engineers from our barracks "Gold" and "Titan" to each patriot battery control center to activate our air defenses.' ):Transport() ) -function MISSION:AddClient( Client ) - self:F( { Client } ) - - local Valid = true - - if Valid then - self._Clients[Client.ClientName] = Client - end - - return Client -end - ---- Find a @{CLIENT} object within the @{MISSION} by its ClientName. --- @param CLIENT ClientName is a string defining the Client Group as defined within the ME. --- @return CLIENT --- @usage --- -- Seach for Client "Bomber" within the Mission. --- local BomberClient = Mission:FindClient( "Bomber" ) -function MISSION:FindClient( ClientName ) - self:F( { self._Clients[ClientName] } ) - return self._Clients[ClientName] -end - - ---- Register a @{TASK} to be completed within the @{MISSION}. Note that there can be multiple @{TASK}s registered to be completed. Each TASK can be set a certain Goal. The MISSION will not be completed until all Goals are reached. --- @param TASK Task is the @{TASK} object. The object must have been instantiated with @{TASK:New} or any of its inherited @{TASK}s. --- @param number TaskNumber is the sequence number of the TASK within the MISSION. This number does have to be chronological. --- @return TASK --- @usage --- -- Define a few tasks for the Mission. --- PickupZones = { "NATO Gold Pickup Zone", "NATO Titan Pickup Zone" } --- PickupSignalUnits = { "NATO Gold Coordination Center", "NATO Titan Coordination Center" } --- --- -- Assign the Pickup Task --- local PickupTask = PICKUPTASK:New( PickupZones, CARGO_TYPE.ENGINEERS, CLIENT.ONBOARDSIDE.LEFT ) --- PickupTask:AddSmokeBlue( PickupSignalUnits ) --- PickupTask:SetGoalTotal( 3 ) --- Mission:AddTask( PickupTask, 1 ) --- --- -- Assign the Deploy Task --- local PatriotActivationZones = { "US Patriot Battery 1 Activation", "US Patriot Battery 2 Activation", "US Patriot Battery 3 Activation" } --- local PatriotActivationZonesSmokeUnits = { "US SAM Patriot - Battery 1 Control", "US SAM Patriot - Battery 2 Control", "US SAM Patriot - Battery 3 Control" } --- local DeployTask = DEPLOYTASK:New( PatriotActivationZones, CARGO_TYPE.ENGINEERS ) --- --DeployTask:SetCargoTargetZoneName( 'US Troops Attack ' .. math.random(2) ) --- DeployTask:AddSmokeBlue( PatriotActivationZonesSmokeUnits ) --- DeployTask:SetGoalTotal( 3 ) --- DeployTask:SetGoalTotal( 3, "Patriots activated" ) --- Mission:AddTask( DeployTask, 2 ) - -function MISSION:AddTask( Task, TaskNumber ) - self:F() - - self._Tasks[TaskNumber] = Task - self._Tasks[TaskNumber]:EnableEvents() - self._Tasks[TaskNumber].ID = TaskNumber - - return Task - end - ---- Get the TASK idenified by the TaskNumber from the Mission. This function is useful in GoalFunctions. --- @param number TaskNumber is the number of the @{TASK} within the @{MISSION}. --- @return TASK --- @usage --- -- Get Task 2 from the Mission. --- Task2 = Mission:GetTask( 2 ) - -function MISSION:GetTask( TaskNumber ) - self:F() - - local Valid = true - - local Task = nil - - if type(TaskNumber) ~= "number" then - Valid = false - end - - if Valid then - Task = self._Tasks[TaskNumber] - end - - return Task -end - ---- Get all the TASKs from the Mission. This function is useful in GoalFunctions. --- @return {TASK,...} Structure of TASKS with the @{TASK} number as the key. --- @usage --- -- Get Tasks from the Mission. --- Tasks = Mission:GetTasks() --- env.info( "Task 2 Completion = " .. Tasks[2]:GetGoalPercentage() .. "%" ) -function MISSION:GetTasks() - self:F() - - return self._Tasks -end - - ---[[ - _TransportExecuteStage: Defines the different stages of Transport unload/load execution. This table is internal and is used to control the validity of Transport load/unload timing. - - - _TransportExecuteStage.EXECUTING - - _TransportExecuteStage.SUCCESS - - _TransportExecuteStage.FAILED - ---]] -_TransportExecuteStage = { - NONE = 0, - EXECUTING = 1, - SUCCESS = 2, - FAILED = 3 -} - - ---- The MISSIONSCHEDULER is an OBJECT and is the main scheduler of ALL active MISSIONs registered within this scheduler. It's workings are considered internal and is automatically created when the Mission.lua file is included. --- @type MISSIONSCHEDULER --- @field #MISSIONSCHEDULER.MISSIONS Missions -MISSIONSCHEDULER = { - Missions = {}, - MissionCount = 0, - TimeIntervalCount = 0, - TimeIntervalShow = 150, - TimeSeconds = 14400, - TimeShow = 5 -} - ---- @type MISSIONSCHEDULER.MISSIONS --- @list <#MISSION> Mission - ---- This is the main MISSIONSCHEDULER Scheduler function. It is considered internal and is automatically created when the Mission.lua file is included. -function MISSIONSCHEDULER.Scheduler() - - - -- loop through the missions in the TransportTasks - for MissionName, MissionData in pairs( MISSIONSCHEDULER.Missions ) do - - local Mission = MissionData -- #MISSION - - if not Mission:IsCompleted() then - - -- This flag will monitor if for this mission, there are clients alive. If this flag is still false at the end of the loop, the mission status will be set to Pending (if not Failed or Completed). - local ClientsAlive = false - - for ClientID, ClientData in pairs( Mission._Clients ) do - - local Client = ClientData -- Client#CLIENT - - if Client:IsAlive() then - - -- There is at least one Client that is alive... So the Mission status is set to Ongoing. - ClientsAlive = true - - -- If this Client was not registered as Alive before: - -- 1. We register the Client as Alive. - -- 2. We initialize the Client Tasks and make a link to the original Mission Task. - -- 3. We initialize the Cargos. - -- 4. We flag the Mission as Ongoing. - if not Client.ClientAlive then - Client.ClientAlive = true - Client.ClientBriefingShown = false - for TaskNumber, Task in pairs( Mission._Tasks ) do - -- Note that this a deepCopy. Each client must have their own Tasks with own Stages!!! - Client._Tasks[TaskNumber] = routines.utils.deepCopy( Mission._Tasks[TaskNumber] ) - -- Each MissionTask must point to the original Mission. - Client._Tasks[TaskNumber].MissionTask = Mission._Tasks[TaskNumber] - Client._Tasks[TaskNumber].Cargos = Mission._Tasks[TaskNumber].Cargos - Client._Tasks[TaskNumber].LandingZones = Mission._Tasks[TaskNumber].LandingZones - end - - Mission:Ongoing() - end - - - -- For each Client, check for each Task the state and evolve the mission. - -- This flag will indicate if the Task of the Client is Complete. - local TaskComplete = false - - for TaskNumber, Task in pairs( Client._Tasks ) do - - if not Task.Stage then - Task:SetStage( 1 ) - end - - - local TransportTime = timer.getTime() - - if not Task:IsDone() then - - if Task:Goal() then - Task:ShowGoalProgress( Mission, Client ) - end - - --env.info( 'Scheduler: Mission = ' .. Mission.Name .. ' / Client = ' .. Client.ClientName .. ' / Task = ' .. Task.Name .. ' / Stage = ' .. Task.ActiveStage .. ' - ' .. Task.Stage.Name .. ' - ' .. Task.Stage.StageType ) - - -- Action - if Task:StageExecute() then - Task.Stage:Execute( Mission, Client, Task ) - end - - -- Wait until execution is finished - if Task.ExecuteStage == _TransportExecuteStage.EXECUTING then - Task.Stage:Executing( Mission, Client, Task ) - end - - -- Validate completion or reverse to earlier stage - if Task.Time + Task.Stage.WaitTime <= TransportTime then - Task:SetStage( Task.Stage:Validate( Mission, Client, Task ) ) - end - - if Task:IsDone() then - --env.info( 'Scheduler: Mission '.. Mission.Name .. ' Task ' .. Task.Name .. ' Stage ' .. Task.Stage.Name .. ' done. TaskComplete = ' .. string.format ( "%s", TaskComplete and "true" or "false" ) ) - TaskComplete = true -- when a task is not yet completed, a mission cannot be completed - - else - -- break only if this task is not yet done, so that future task are not yet activated. - TaskComplete = false -- when a task is not yet completed, a mission cannot be completed - --env.info( 'Scheduler: Mission "'.. Mission.Name .. '" Task "' .. Task.Name .. '" Stage "' .. Task.Stage.Name .. '" break. TaskComplete = ' .. string.format ( "%s", TaskComplete and "true" or "false" ) ) - break - end - - if TaskComplete then - - if Mission.GoalFunction ~= nil then - Mission.GoalFunction( Mission, Client ) - end - if MISSIONSCHEDULER.Scoring then - MISSIONSCHEDULER.Scoring:_AddMissionTaskScore( Client:GetClientGroupDCSUnit(), Mission.Name, 25 ) - end - --- if not Mission:IsCompleted() then --- end - end - end - end - - local MissionComplete = true - for TaskNumber, Task in pairs( Mission._Tasks ) do - if Task:Goal() then --- Task:ShowGoalProgress( Mission, Client ) - if Task:IsGoalReached() then - else - MissionComplete = false - end - else - MissionComplete = false -- If there is no goal, the mission should never be ended. The goal status will be set somewhere else. - end - end - - if MissionComplete then - Mission:Completed() - if MISSIONSCHEDULER.Scoring then - MISSIONSCHEDULER.Scoring:_AddMissionScore( Mission.Name, 100 ) - end - else - if TaskComplete then - -- Reset for new tasking of active client - Client.ClientAlive = false -- Reset the client tasks. - end - end - - - else - if Client.ClientAlive then - env.info( 'Scheduler: Client "' .. Client.ClientName .. '" is inactive.' ) - Client.ClientAlive = false - - -- This is tricky. If we sanitize Client._Tasks before sanitizing Client._Tasks[TaskNumber].MissionTask, then the original MissionTask will be sanitized, and will be lost within the garbage collector. - -- So first sanitize Client._Tasks[TaskNumber].MissionTask, after that, sanitize only the whole _Tasks structure... - --Client._Tasks[TaskNumber].MissionTask = nil - --Client._Tasks = nil - end - end - end - - -- If all Clients of this Mission are not activated, then the Mission status needs to be put back into Pending status. - -- But only if the Mission was Ongoing. In case the Mission is Completed or Failed, the Mission status may not be changed. In these cases, this will be the last run of this Mission in the Scheduler. - if ClientsAlive == false then - if Mission:IsOngoing() then - -- Mission status back to pending... - Mission:Pending() - end - end - end - - Mission:StatusToClients() - - if Mission:ReportTrigger() then - Mission:ReportToAll() - end - end - - return true -end - ---- Start the MISSIONSCHEDULER. -function MISSIONSCHEDULER.Start() - if MISSIONSCHEDULER ~= nil then - --MISSIONSCHEDULER.SchedulerId = routines.scheduleFunction( MISSIONSCHEDULER.Scheduler, { }, 0, 2 ) - MISSIONSCHEDULER.SchedulerId = SCHEDULER:New( nil, MISSIONSCHEDULER.Scheduler, { }, 0, 2 ) - end -end - ---- Stop the MISSIONSCHEDULER. -function MISSIONSCHEDULER.Stop() - if MISSIONSCHEDULER.SchedulerId then - routines.removeFunction(MISSIONSCHEDULER.SchedulerId) - MISSIONSCHEDULER.SchedulerId = nil - end -end - ---- This is the main MISSION declaration method. Each Mission is like the master or a Mission orchestration between, Clients, Tasks, Stages etc. --- @param Mission is the MISSION object instantiated by @{MISSION:New}. --- @return MISSION --- @usage --- -- Declare a mission. --- Mission = MISSION:New( 'Russia Transport Troops SA-6', --- 'Operational', --- 'Transport troops from the control center to one of the SA-6 SAM sites to activate their operation.', --- 'Russia' ) --- MISSIONSCHEDULER:AddMission( Mission ) -function MISSIONSCHEDULER.AddMission( Mission ) - MISSIONSCHEDULER.Missions[Mission.Name] = Mission - MISSIONSCHEDULER.MissionCount = MISSIONSCHEDULER.MissionCount + 1 - -- Add an overall AI Client for the AI tasks... This AI Client will facilitate the Events in the background for each Task. - --MissionAdd:AddClient( CLIENT:Register( 'AI' ) ) - - return Mission -end - ---- Remove a MISSION from the MISSIONSCHEDULER. --- @param MissionName is the name of the MISSION given at declaration using @{AddMission}. --- @usage --- -- Declare a mission. --- Mission = MISSION:New( 'Russia Transport Troops SA-6', --- 'Operational', --- 'Transport troops from the control center to one of the SA-6 SAM sites to activate their operation.', --- 'Russia' ) --- MISSIONSCHEDULER:AddMission( Mission ) --- --- -- Now remove the Mission. --- MISSIONSCHEDULER:RemoveMission( 'Russia Transport Troops SA-6' ) -function MISSIONSCHEDULER.RemoveMission( MissionName ) - MISSIONSCHEDULER.Missions[MissionName] = nil - MISSIONSCHEDULER.MissionCount = MISSIONSCHEDULER.MissionCount - 1 -end - ---- Find a MISSION within the MISSIONSCHEDULER. --- @param MissionName is the name of the MISSION given at declaration using @{AddMission}. --- @return MISSION --- @usage --- -- Declare a mission. --- Mission = MISSION:New( 'Russia Transport Troops SA-6', --- 'Operational', --- 'Transport troops from the control center to one of the SA-6 SAM sites to activate their operation.', --- 'Russia' ) --- MISSIONSCHEDULER:AddMission( Mission ) --- --- -- Now find the Mission. --- MissionFind = MISSIONSCHEDULER:FindMission( 'Russia Transport Troops SA-6' ) -function MISSIONSCHEDULER.FindMission( MissionName ) - return MISSIONSCHEDULER.Missions[MissionName] -end - --- Internal function used by the MISSIONSCHEDULER menu. -function MISSIONSCHEDULER.ReportMissionsShow( ) - for MissionName, Mission in pairs( MISSIONSCHEDULER.Missions ) do - Mission.MissionReportShow = true - Mission.MissionReportFlash = false - end -end - --- Internal function used by the MISSIONSCHEDULER menu. -function MISSIONSCHEDULER.ReportMissionsFlash( TimeInterval ) - local Count = 0 - for MissionName, Mission in pairs( MISSIONSCHEDULER.Missions ) do - Mission.MissionReportShow = false - Mission.MissionReportFlash = true - Mission.MissionReportTrigger = timer.getTime() + Count * TimeInterval - Mission.MissionTimeInterval = MISSIONSCHEDULER.MissionCount * TimeInterval - env.info( "TimeInterval = " .. Mission.MissionTimeInterval ) - Count = Count + 1 - end -end - --- Internal function used by the MISSIONSCHEDULER menu. -function MISSIONSCHEDULER.ReportMissionsHide( Prm ) - for MissionName, Mission in pairs( MISSIONSCHEDULER.Missions ) do - Mission.MissionReportShow = false - Mission.MissionReportFlash = false - end -end - ---- Enables a MENU option in the communications menu under F10 to control the status of the active missions. --- This function should be called only once when starting the MISSIONSCHEDULER. -function MISSIONSCHEDULER.ReportMenu() - local ReportMenu = SUBMENU:New( 'Status' ) - local ReportMenuShow = COMMANDMENU:New( 'Show Report Missions', ReportMenu, MISSIONSCHEDULER.ReportMissionsShow, 0 ) - local ReportMenuFlash = COMMANDMENU:New('Flash Report Missions', ReportMenu, MISSIONSCHEDULER.ReportMissionsFlash, 120 ) - local ReportMenuHide = COMMANDMENU:New( 'Hide Report Missions', ReportMenu, MISSIONSCHEDULER.ReportMissionsHide, 0 ) -end - ---- Show the remaining mission time. -function MISSIONSCHEDULER:TimeShow() - self.TimeIntervalCount = self.TimeIntervalCount + 1 - if self.TimeIntervalCount >= self.TimeTriggerShow then - local TimeMsg = string.format("%00d", ( self.TimeSeconds / 60 ) - ( timer.getTime() / 60 )) .. ' minutes left until mission reload.' - MESSAGE:New( TimeMsg, self.TimeShow, "Mission time" ):ToAll() - self.TimeIntervalCount = 0 - end -end - -function MISSIONSCHEDULER:Time( TimeSeconds, TimeIntervalShow, TimeShow ) - - self.TimeIntervalCount = 0 - self.TimeSeconds = TimeSeconds - self.TimeIntervalShow = TimeIntervalShow - self.TimeShow = TimeShow -end - ---- Adds a mission scoring to the game. -function MISSIONSCHEDULER:Scoring( Scoring ) - - self.Scoring = Scoring -end - ---- The CLEANUP class keeps an area clean of crashing or colliding airplanes. It also prevents airplanes from firing within this area. --- @module CleanUp --- @author Flightcontrol - - - - - - - ---- The CLEANUP class. --- @type CLEANUP --- @extends Base#BASE -CLEANUP = { - ClassName = "CLEANUP", - ZoneNames = {}, - TimeInterval = 300, - CleanUpList = {}, -} - ---- Creates the main object which is handling the cleaning of the debris within the given Zone Names. --- @param #CLEANUP self --- @param #table ZoneNames Is a table of zone names where the debris should be cleaned. Also a single string can be passed with one zone name. --- @param #number TimeInterval The interval in seconds when the clean activity takes place. The default is 300 seconds, thus every 5 minutes. --- @return #CLEANUP --- @usage --- -- Clean these Zones. --- CleanUpAirports = CLEANUP:New( { 'CLEAN Tbilisi', 'CLEAN Kutaisi' }, 150 ) --- or --- CleanUpTbilisi = CLEANUP:New( 'CLEAN Tbilisi', 150 ) --- CleanUpKutaisi = CLEANUP:New( 'CLEAN Kutaisi', 600 ) -function CLEANUP:New( ZoneNames, TimeInterval ) local self = BASE:Inherit( self, BASE:New() ) - self:F( { ZoneNames, TimeInterval } ) - - if type( ZoneNames ) == 'table' then - self.ZoneNames = ZoneNames - else - self.ZoneNames = { ZoneNames } - end - if TimeInterval then - self.TimeInterval = TimeInterval - end - - _EVENTDISPATCHER:OnBirth( self._OnEventBirth, self ) - - --self.CleanUpScheduler = routines.scheduleFunction( self._CleanUpScheduler, { self }, timer.getTime() + 1, TimeInterval ) - self.CleanUpScheduler = SCHEDULER:New( self, self._CleanUpScheduler, {}, 1, TimeInterval ) - - return self -end - - ---- Destroys a group from the simulator, but checks first if it is still existing! --- @param #CLEANUP self --- @param DCSGroup#Group GroupObject The object to be destroyed. --- @param #string CleanUpGroupName The groupname... -function CLEANUP:_DestroyGroup( GroupObject, CleanUpGroupName ) - self:F( { GroupObject, CleanUpGroupName } ) - - if GroupObject then -- and GroupObject:isExist() then - trigger.action.deactivateGroup(GroupObject) - self:T( { "GroupObject Destroyed", GroupObject } ) - end -end - ---- Destroys a @{DCSUnit#Unit} from the simulator, but checks first if it is still existing! --- @param #CLEANUP self --- @param DCSUnit#Unit CleanUpUnit The object to be destroyed. --- @param #string CleanUpUnitName The Unit name ... -function CLEANUP:_DestroyUnit( CleanUpUnit, CleanUpUnitName ) - self:F( { CleanUpUnit, CleanUpUnitName } ) - - if CleanUpUnit then - local CleanUpGroup = Unit.getGroup(CleanUpUnit) - -- TODO Client bug in 1.5.3 - if CleanUpGroup and CleanUpGroup:isExist() then - local CleanUpGroupUnits = CleanUpGroup:getUnits() - if #CleanUpGroupUnits == 1 then - local CleanUpGroupName = CleanUpGroup:getName() - --self:CreateEventCrash( timer.getTime(), CleanUpUnit ) - CleanUpGroup:destroy() - self:T( { "Destroyed Group:", CleanUpGroupName } ) - else - CleanUpUnit:destroy() - self:T( { "Destroyed Unit:", CleanUpUnitName } ) - end - self.CleanUpList[CleanUpUnitName] = nil -- Cleaning from the list - CleanUpUnit = nil - end - end -end - --- TODO check DCSTypes#Weapon ---- Destroys a missile from the simulator, but checks first if it is still existing! --- @param #CLEANUP self --- @param DCSTypes#Weapon MissileObject -function CLEANUP:_DestroyMissile( MissileObject ) - self:F( { MissileObject } ) - - if MissileObject and MissileObject:isExist() then - MissileObject:destroy() - self:T( "MissileObject Destroyed") - end -end - -function CLEANUP:_OnEventBirth( Event ) - self:F( { Event } ) - - self.CleanUpList[Event.IniDCSUnitName] = {} - self.CleanUpList[Event.IniDCSUnitName].CleanUpUnit = Event.IniDCSUnit - self.CleanUpList[Event.IniDCSUnitName].CleanUpGroup = Event.IniDCSGroup - self.CleanUpList[Event.IniDCSUnitName].CleanUpGroupName = Event.IniDCSGroupName - self.CleanUpList[Event.IniDCSUnitName].CleanUpUnitName = Event.IniDCSUnitName - - _EVENTDISPATCHER:OnEngineShutDownForUnit( Event.IniDCSUnitName, self._EventAddForCleanUp, self ) - _EVENTDISPATCHER:OnEngineStartUpForUnit( Event.IniDCSUnitName, self._EventAddForCleanUp, self ) - _EVENTDISPATCHER:OnHitForUnit( Event.IniDCSUnitName, self._EventAddForCleanUp, self ) - _EVENTDISPATCHER:OnPilotDeadForUnit( Event.IniDCSUnitName, self._EventCrash, self ) - _EVENTDISPATCHER:OnDeadForUnit( Event.IniDCSUnitName, self._EventCrash, self ) - _EVENTDISPATCHER:OnCrashForUnit( Event.IniDCSUnitName, self._EventCrash, self ) - _EVENTDISPATCHER:OnShotForUnit( Event.IniDCSUnitName, self._EventShot, self ) - - --self:AddEvent( world.event.S_EVENT_ENGINE_SHUTDOWN, self._EventAddForCleanUp ) - --self:AddEvent( world.event.S_EVENT_ENGINE_STARTUP, self._EventAddForCleanUp ) --- self:AddEvent( world.event.S_EVENT_HIT, self._EventAddForCleanUp ) -- , self._EventHitCleanUp ) --- self:AddEvent( world.event.S_EVENT_CRASH, self._EventCrash ) -- , self._EventHitCleanUp ) --- --self:AddEvent( world.event.S_EVENT_DEAD, self._EventCrash ) --- self:AddEvent( world.event.S_EVENT_SHOT, self._EventShot ) --- --- self:EnableEvents() - - -end - ---- Detects if a crash event occurs. --- Crashed units go into a CleanUpList for removal. --- @param #CLEANUP self --- @param DCSTypes#Event event -function CLEANUP:_EventCrash( Event ) - self:F( { Event } ) - - --TODO: This stuff is not working due to a DCS bug. Burning units cannot be destroyed. - -- self:T("before getGroup") - -- local _grp = Unit.getGroup(event.initiator)-- Identify the group that fired - -- self:T("after getGroup") - -- _grp:destroy() - -- self:T("after deactivateGroup") - -- event.initiator:destroy() - - self.CleanUpList[Event.IniDCSUnitName] = {} - self.CleanUpList[Event.IniDCSUnitName].CleanUpUnit = Event.IniDCSUnit - self.CleanUpList[Event.IniDCSUnitName].CleanUpGroup = Event.IniDCSGroup - self.CleanUpList[Event.IniDCSUnitName].CleanUpGroupName = Event.IniDCSGroupName - self.CleanUpList[Event.IniDCSUnitName].CleanUpUnitName = Event.IniDCSUnitName - -end - ---- Detects if a unit shoots a missile. --- If this occurs within one of the zones, then the weapon used must be destroyed. --- @param #CLEANUP self --- @param DCSTypes#Event event -function CLEANUP:_EventShot( Event ) - self:F( { Event } ) - - -- Test if the missile was fired within one of the CLEANUP.ZoneNames. - local CurrentLandingZoneID = 0 - CurrentLandingZoneID = routines.IsUnitInZones( Event.IniDCSUnit, self.ZoneNames ) - if ( CurrentLandingZoneID ) then - -- Okay, the missile was fired within the CLEANUP.ZoneNames, destroy the fired weapon. - --_SEADmissile:destroy() - --routines.scheduleFunction( CLEANUP._DestroyMissile, { self, Event.Weapon }, timer.getTime() + 0.1) - SCHEDULER:New( self, CLEANUP._DestroyMissile, { Event.Weapon }, 0.1 ) - end -end - - ---- Detects if the Unit has an S_EVENT_HIT within the given ZoneNames. If this is the case, destroy the unit. --- @param #CLEANUP self --- @param DCSTypes#Event event -function CLEANUP:_EventHitCleanUp( Event ) - self:F( { Event } ) - - if Event.IniDCSUnit then - if routines.IsUnitInZones( Event.IniDCSUnit, self.ZoneNames ) ~= nil then - self:T( { "Life: ", Event.IniDCSUnitName, ' = ', Event.IniDCSUnit:getLife(), "/", Event.IniDCSUnit:getLife0() } ) - if Event.IniDCSUnit:getLife() < Event.IniDCSUnit:getLife0() then - self:T( "CleanUp: Destroy: " .. Event.IniDCSUnitName ) - --routines.scheduleFunction( CLEANUP._DestroyUnit, { self, Event.IniDCSUnit }, timer.getTime() + 0.1) - SCHEDULER:New( self, CLEANUP._DestroyUnit, { Event.IniDCSUnit }, 0.1 ) - end - end - end - - if Event.TgtDCSUnit then - if routines.IsUnitInZones( Event.TgtDCSUnit, self.ZoneNames ) ~= nil then - self:T( { "Life: ", Event.TgtDCSUnitName, ' = ', Event.TgtDCSUnit:getLife(), "/", Event.TgtDCSUnit:getLife0() } ) - if Event.TgtDCSUnit:getLife() < Event.TgtDCSUnit:getLife0() then - self:T( "CleanUp: Destroy: " .. Event.TgtDCSUnitName ) - --routines.scheduleFunction( CLEANUP._DestroyUnit, { self, Event.TgtDCSUnit }, timer.getTime() + 0.1 ) - SCHEDULER:New( self, CLEANUP._DestroyUnit, { Event.TgtDCSUnit }, 0.1 ) - end - end - end -end - ---- Add the @{DCSUnit#Unit} to the CleanUpList for CleanUp. -function CLEANUP:_AddForCleanUp( CleanUpUnit, CleanUpUnitName ) - self:F( { CleanUpUnit, CleanUpUnitName } ) - - self.CleanUpList[CleanUpUnitName] = {} - self.CleanUpList[CleanUpUnitName].CleanUpUnit = CleanUpUnit - self.CleanUpList[CleanUpUnitName].CleanUpUnitName = CleanUpUnitName - self.CleanUpList[CleanUpUnitName].CleanUpGroup = Unit.getGroup(CleanUpUnit) - self.CleanUpList[CleanUpUnitName].CleanUpGroupName = Unit.getGroup(CleanUpUnit):getName() - self.CleanUpList[CleanUpUnitName].CleanUpTime = timer.getTime() - self.CleanUpList[CleanUpUnitName].CleanUpMoved = false - - self:T( { "CleanUp: Add to CleanUpList: ", Unit.getGroup(CleanUpUnit):getName(), CleanUpUnitName } ) - -end - ---- Detects if the Unit has an S_EVENT_ENGINE_SHUTDOWN or an S_EVENT_HIT within the given ZoneNames. If this is the case, add the Group to the CLEANUP List. --- @param #CLEANUP self --- @param DCSTypes#Event event -function CLEANUP:_EventAddForCleanUp( Event ) - - if Event.IniDCSUnit then - if self.CleanUpList[Event.IniDCSUnitName] == nil then - if routines.IsUnitInZones( Event.IniDCSUnit, self.ZoneNames ) ~= nil then - self:_AddForCleanUp( Event.IniDCSUnit, Event.IniDCSUnitName ) - end - end - end - - if Event.TgtDCSUnit then - if self.CleanUpList[Event.TgtDCSUnitName] == nil then - if routines.IsUnitInZones( Event.TgtDCSUnit, self.ZoneNames ) ~= nil then - self:_AddForCleanUp( Event.TgtDCSUnit, Event.TgtDCSUnitName ) - end - end - end - -end - -local CleanUpSurfaceTypeText = { - "LAND", - "SHALLOW_WATER", - "WATER", - "ROAD", - "RUNWAY" - } - ---- At the defined time interval, CleanUp the Groups within the CleanUpList. --- @param #CLEANUP self -function CLEANUP:_CleanUpScheduler() - self:F( { "CleanUp Scheduler" } ) - - local CleanUpCount = 0 - for CleanUpUnitName, UnitData in pairs( self.CleanUpList ) do - CleanUpCount = CleanUpCount + 1 - - self:T( { CleanUpUnitName, UnitData } ) - local CleanUpUnit = Unit.getByName(UnitData.CleanUpUnitName) - local CleanUpGroupName = UnitData.CleanUpGroupName - local CleanUpUnitName = UnitData.CleanUpUnitName - if CleanUpUnit then - self:T( { "CleanUp Scheduler", "Checking:", CleanUpUnitName } ) - if _DATABASE:GetStatusGroup( CleanUpGroupName ) ~= "ReSpawn" then - local CleanUpUnitVec3 = CleanUpUnit:getPoint() - --self:T( CleanUpUnitVec3 ) - local CleanUpUnitVec2 = {} - CleanUpUnitVec2.x = CleanUpUnitVec3.x - CleanUpUnitVec2.y = CleanUpUnitVec3.z - --self:T( CleanUpUnitVec2 ) - local CleanUpSurfaceType = land.getSurfaceType(CleanUpUnitVec2) - --self:T( CleanUpSurfaceType ) - - if CleanUpUnit and CleanUpUnit:getLife() <= CleanUpUnit:getLife0() * 0.95 then - if CleanUpSurfaceType == land.SurfaceType.RUNWAY then - if CleanUpUnit:inAir() then - local CleanUpLandHeight = land.getHeight(CleanUpUnitVec2) - local CleanUpUnitHeight = CleanUpUnitVec3.y - CleanUpLandHeight - self:T( { "CleanUp Scheduler", "Height = " .. CleanUpUnitHeight } ) - if CleanUpUnitHeight < 30 then - self:T( { "CleanUp Scheduler", "Destroy " .. CleanUpUnitName .. " because below safe height and damaged." } ) - self:_DestroyUnit(CleanUpUnit, CleanUpUnitName) - end - else - self:T( { "CleanUp Scheduler", "Destroy " .. CleanUpUnitName .. " because on runway and damaged." } ) - self:_DestroyUnit(CleanUpUnit, CleanUpUnitName) - end - end - end - -- Clean Units which are waiting for a very long time in the CleanUpZone. - if CleanUpUnit then - local CleanUpUnitVelocity = CleanUpUnit:getVelocity() - local CleanUpUnitVelocityTotal = math.abs(CleanUpUnitVelocity.x) + math.abs(CleanUpUnitVelocity.y) + math.abs(CleanUpUnitVelocity.z) - if CleanUpUnitVelocityTotal < 1 then - if UnitData.CleanUpMoved then - if UnitData.CleanUpTime + 180 <= timer.getTime() then - self:T( { "CleanUp Scheduler", "Destroy due to not moving anymore " .. CleanUpUnitName } ) - self:_DestroyUnit(CleanUpUnit, CleanUpUnitName) - end - end - else - UnitData.CleanUpTime = timer.getTime() - UnitData.CleanUpMoved = true - end - end - - else - -- Do nothing ... - self.CleanUpList[CleanUpUnitName] = nil -- Not anymore in the DCSRTE - end - else - self:T( "CleanUp: Group " .. CleanUpUnitName .. " cannot be found in DCS RTE, removing ..." ) - self.CleanUpList[CleanUpUnitName] = nil -- Not anymore in the DCSRTE - end - end - self:T(CleanUpCount) - - return true -end - ---- This module contains the SPAWN class. --- --- 1) @{Spawn#SPAWN} class, extends @{Base#BASE} --- ============================================= --- The @{#SPAWN} class allows to spawn dynamically new groups, based on pre-defined initialization settings, modifying the behaviour when groups are spawned. --- For each group to be spawned, within the mission editor, a group has to be created with the "late activation flag" set. We call this group the *"Spawn Template"* of the SPAWN object. --- A reference to this Spawn Template needs to be provided when constructing the SPAWN object, by indicating the name of the group within the mission editor in the constructor methods. --- --- Within the SPAWN object, there is an internal index that keeps track of which group from the internal group list was spawned. --- When new groups get spawned by using the SPAWN functions (see below), it will be validated whether the Limits (@{#SPAWN.Limit}) of the SPAWN object are not reached. --- When all is valid, a new group will be created by the spawning methods, and the internal index will be increased with 1. --- --- Regarding the name of new spawned groups, a _SpawnPrefix_ will be assigned for each new group created. --- If you want to have the Spawn Template name to be used as the _SpawnPrefix_ name, use the @{#SPAWN.New} constructor. --- However, when the @{#SPAWN.NewWithAlias} constructor was used, the Alias name will define the _SpawnPrefix_ name. --- Groups will follow the following naming structure when spawned at run-time: --- --- 1. Spawned groups will have the name _SpawnPrefix_#ggg, where ggg is a counter from 0 to 999. --- 2. Spawned units will have the name _SpawnPrefix_#ggg-uu, where uu is a counter from 0 to 99 for each new spawned unit belonging to the group. --- --- Some additional notes that need to be remembered: --- --- * Templates are actually groups defined within the mission editor, with the flag "Late Activation" set. As such, these groups are never used within the mission, but are used by the @{#SPAWN} module. --- * It is important to defined BEFORE you spawn new groups, a proper initialization of the SPAWN instance is done with the options you want to use. --- * When designing a mission, NEVER name groups using a "#" within the name of the group Spawn Template(s), or the SPAWN module logic won't work anymore. --- --- 1.1) SPAWN construction methods --- ------------------------------- --- Create a new SPAWN object with the @{#SPAWN.New} or the @{#SPAWN.NewWithAlias} methods: --- --- * @{#SPAWN.New}: Creates a new SPAWN object taking the name of the group that functions as the Template. --- --- It is important to understand how the SPAWN class works internally. The SPAWN object created will contain internally a list of groups that will be spawned and that are already spawned. --- The initialization functions will modify this list of groups so that when a group gets spawned, ALL information is already prepared when spawning. This is done for performance reasons. --- So in principle, the group list will contain all parameters and configurations after initialization, and when groups get actually spawned, this spawning can be done quickly and efficient. --- --- 1.2) SPAWN initialization methods --- --------------------------------- --- A spawn object will behave differently based on the usage of initialization methods: --- --- * @{#SPAWN.Limit}: Limits the amount of groups that can be alive at the same time and that can be dynamically spawned. --- * @{#SPAWN.RandomizeRoute}: Randomize the routes of spawned groups. --- * @{#SPAWN.RandomizeTemplate}: Randomize the group templates so that when a new group is spawned, a random group template is selected from one of the templates defined. --- * @{#SPAWN.Uncontrolled}: Spawn plane groups uncontrolled. --- * @{#SPAWN.Array}: Make groups visible before they are actually activated, and order these groups like a batallion in an array. --- * @{#SPAWN.InitRepeat}: Re-spawn groups when they land at the home base. Similar functions are @{#SPAWN.InitRepeatOnLanding} and @{#SPAWN.InitRepeatOnEngineShutDown}. --- --- 1.3) SPAWN spawning methods --- --------------------------- --- Groups can be spawned at different times and methods: --- --- * @{#SPAWN.Spawn}: Spawn one new group based on the last spawned index. --- * @{#SPAWN.ReSpawn}: Re-spawn a group based on a given index. --- * @{#SPAWN.SpawnScheduled}: Spawn groups at scheduled but randomized intervals. You can use @{#SPAWN.SpawnScheduleStart} and @{#SPAWN.SpawnScheduleStop} to start and stop the schedule respectively. --- * @{#SPAWN.SpawnFromUnit}: Spawn a new group taking the position of a @{UNIT}. --- * @{#SPAWN.SpawnInZone}: Spawn a new group in a @{ZONE}. --- --- Note that @{#SPAWN.Spawn} and @{#SPAWN.ReSpawn} return a @{GROUP#GROUP.New} object, that contains a reference to the DCSGroup object. --- You can use the @{GROUP} object to do further actions with the DCSGroup. --- --- 1.4) SPAWN object cleaning --- -------------------------- --- Sometimes, it will occur during a mission run-time, that ground or especially air objects get damaged, and will while being damged stop their activities, while remaining alive. --- In such cases, the SPAWN object will just sit there and wait until that group gets destroyed, but most of the time it won't, --- and it may occur that no new groups are or can be spawned as limits are reached. --- To prevent this, a @{#SPAWN.CleanUp} initialization method has been defined that will silently monitor the status of each spawned group. --- Once a group has a velocity = 0, and has been waiting for a defined interval, that group will be cleaned or removed from run-time. --- There is a catch however :-) If a damaged group has returned to an airbase within the coalition, that group will not be considered as "lost"... --- In such a case, when the inactive group is cleaned, a new group will Re-spawned automatically. --- This models AI that has succesfully returned to their airbase, to restart their combat activities. --- Check the @{#SPAWN.CleanUp} for further info. --- --- --- @module Spawn --- @author FlightControl - ---- SPAWN Class --- @type SPAWN --- @extends Base#BASE --- @field ClassName --- @field #string SpawnTemplatePrefix --- @field #string SpawnAliasPrefix -SPAWN = { - ClassName = "SPAWN", - SpawnTemplatePrefix = nil, - SpawnAliasPrefix = nil, -} - - - ---- Creates the main object to spawn a GROUP defined in the DCS ME. --- @param #SPAWN self --- @param #string SpawnTemplatePrefix is the name of the Group in the ME that defines the Template. Each new group will have the name starting with SpawnTemplatePrefix. --- @return #SPAWN --- @usage --- -- NATO helicopters engaging in the battle field. --- Spawn_BE_KA50 = SPAWN:New( 'BE KA-50@RAMP-Ground Defense' ) --- @usage local Plane = SPAWN:New( "Plane" ) -- Creates a new local variable that can initiate new planes with the name "Plane#ddd" using the template "Plane" as defined within the ME. -function SPAWN:New( SpawnTemplatePrefix ) - local self = BASE:Inherit( self, BASE:New() ) - self:F( { SpawnTemplatePrefix } ) - - local TemplateGroup = Group.getByName( SpawnTemplatePrefix ) - if TemplateGroup then - self.SpawnTemplatePrefix = SpawnTemplatePrefix - self.SpawnIndex = 0 - self.SpawnCount = 0 -- The internal counter of the amount of spawning the has happened since SpawnStart. - self.AliveUnits = 0 -- Contains the counter how many units are currently alive - self.SpawnIsScheduled = false -- Reflects if the spawning for this SpawnTemplatePrefix is going to be scheduled or not. - self.SpawnTemplate = self._GetTemplate( self, SpawnTemplatePrefix ) -- Contains the template structure for a Group Spawn from the Mission Editor. Note that this group must have lateActivation always on!!! - self.Repeat = false -- Don't repeat the group from Take-Off till Landing and back Take-Off by ReSpawning. - self.UnControlled = false -- When working in UnControlled mode, all planes are Spawned in UnControlled mode before the scheduler starts. - self.SpawnMaxUnitsAlive = 0 -- The maximum amount of groups that can be alive of SpawnTemplatePrefix at the same time. - self.SpawnMaxGroups = 0 -- The maximum amount of groups that can be spawned. - self.SpawnRandomize = false -- Sets the randomization flag of new Spawned units to false. - self.SpawnVisible = false -- Flag that indicates if all the Groups of the SpawnGroup need to be visible when Spawned. - - self.SpawnGroups = {} -- Array containing the descriptions of each Group to be Spawned. - else - error( "SPAWN:New: There is no group declared in the mission editor with SpawnTemplatePrefix = '" .. SpawnTemplatePrefix .. "'" ) - end - - return self -end - ---- Creates a new SPAWN instance to create new groups based on the defined template and using a new alias for each new group. --- @param #SPAWN self --- @param #string SpawnTemplatePrefix is the name of the Group in the ME that defines the Template. --- @param #string SpawnAliasPrefix is the name that will be given to the Group at runtime. --- @return #SPAWN --- @usage --- -- NATO helicopters engaging in the battle field. --- Spawn_BE_KA50 = SPAWN:NewWithAlias( 'BE KA-50@RAMP-Ground Defense', 'Helicopter Attacking a City' ) --- @usage local PlaneWithAlias = SPAWN:NewWithAlias( "Plane", "Bomber" ) -- Creates a new local variable that can instantiate new planes with the name "Bomber#ddd" using the template "Plane" as defined within the ME. -function SPAWN:NewWithAlias( SpawnTemplatePrefix, SpawnAliasPrefix ) - local self = BASE:Inherit( self, BASE:New() ) - self:F( { SpawnTemplatePrefix, SpawnAliasPrefix } ) - - local TemplateGroup = Group.getByName( SpawnTemplatePrefix ) - if TemplateGroup then - self.SpawnTemplatePrefix = SpawnTemplatePrefix - self.SpawnAliasPrefix = SpawnAliasPrefix - self.SpawnIndex = 0 - self.SpawnCount = 0 -- The internal counter of the amount of spawning the has happened since SpawnStart. - self.AliveUnits = 0 -- Contains the counter how many units are currently alive - self.SpawnIsScheduled = false -- Reflects if the spawning for this SpawnTemplatePrefix is going to be scheduled or not. - self.SpawnTemplate = self._GetTemplate( self, SpawnTemplatePrefix ) -- Contains the template structure for a Group Spawn from the Mission Editor. Note that this group must have lateActivation always on!!! - self.Repeat = false -- Don't repeat the group from Take-Off till Landing and back Take-Off by ReSpawning. - self.UnControlled = false -- When working in UnControlled mode, all planes are Spawned in UnControlled mode before the scheduler starts. - self.SpawnMaxUnitsAlive = 0 -- The maximum amount of groups that can be alive of SpawnTemplatePrefix at the same time. - self.SpawnMaxGroups = 0 -- The maximum amount of groups that can be spawned. - self.SpawnRandomize = false -- Sets the randomization flag of new Spawned units to false. - self.SpawnVisible = false -- Flag that indicates if all the Groups of the SpawnGroup need to be visible when Spawned. - - self.SpawnGroups = {} -- Array containing the descriptions of each Group to be Spawned. - else - error( "SPAWN:New: There is no group declared in the mission editor with SpawnTemplatePrefix = '" .. SpawnTemplatePrefix .. "'" ) - end - - return self -end - - ---- Limits the Maximum amount of Units that can be alive at the same time, and the maximum amount of groups that can be spawned. --- Note that this method is exceptionally important to balance the performance of the mission. Depending on the machine etc, a mission can only process a maximum amount of units. --- If the time interval must be short, but there should not be more Units or Groups alive than a maximum amount of units, then this function should be used... --- When a @{#SPAWN.New} is executed and the limit of the amount of units alive is reached, then no new spawn will happen of the group, until some of these units of the spawn object will be destroyed. --- @param #SPAWN self --- @param #number SpawnMaxUnitsAlive The maximum amount of units that can be alive at runtime. --- @param #number SpawnMaxGroups The maximum amount of groups that can be spawned. When the limit is reached, then no more actual spawns will happen of the group. --- This parameter is useful to define a maximum amount of airplanes, ground troops, helicopters, ships etc within a supply area. --- This parameter accepts the value 0, which defines that there are no maximum group limits, but there are limits on the maximum of units that can be alive at the same time. --- @return #SPAWN self --- @usage --- -- NATO helicopters engaging in the battle field. --- -- This helicopter group consists of one Unit. So, this group will SPAWN maximum 2 groups simultaneously within the DCSRTE. --- -- There will be maximum 24 groups spawned during the whole mission lifetime. --- Spawn_BE_KA50 = SPAWN:New( 'BE KA-50@RAMP-Ground Defense' ):Limit( 2, 24 ) -function SPAWN:Limit( SpawnMaxUnitsAlive, SpawnMaxGroups ) - self:F( { self.SpawnTemplatePrefix, SpawnMaxUnitsAlive, SpawnMaxGroups } ) - - self.SpawnMaxUnitsAlive = SpawnMaxUnitsAlive -- The maximum amount of groups that can be alive of SpawnTemplatePrefix at the same time. - self.SpawnMaxGroups = SpawnMaxGroups -- The maximum amount of groups that can be spawned. - - for SpawnGroupID = 1, self.SpawnMaxGroups do - self:_InitializeSpawnGroups( SpawnGroupID ) - end - - return self -end - - ---- Randomizes the defined route of the SpawnTemplatePrefix group in the ME. This is very useful to define extra variation of the behaviour of groups. --- @param #SPAWN self --- @param #number SpawnStartPoint is the waypoint where the randomization begins. --- Note that the StartPoint = 0 equaling the point where the group is spawned. --- @param #number SpawnEndPoint is the waypoint where the randomization ends counting backwards. --- This parameter is useful to avoid randomization to end at a waypoint earlier than the last waypoint on the route. --- @param #number SpawnRadius is the radius in meters in which the randomization of the new waypoints, with the original waypoint of the original template located in the middle ... --- @return #SPAWN --- @usage --- -- NATO helicopters engaging in the battle field. --- -- The KA-50 has waypoints Start point ( =0 or SP ), 1, 2, 3, 4, End point (= 5 or DP). --- -- Waypoints 2 and 3 will only be randomized. The others will remain on their original position with each new spawn of the helicopter. --- -- The randomization of waypoint 2 and 3 will take place within a radius of 2000 meters. --- Spawn_BE_KA50 = SPAWN:New( 'BE KA-50@RAMP-Ground Defense' ):RandomizeRoute( 2, 2, 2000 ) -function SPAWN:RandomizeRoute( SpawnStartPoint, SpawnEndPoint, SpawnRadius ) - self:F( { self.SpawnTemplatePrefix, SpawnStartPoint, SpawnEndPoint, SpawnRadius } ) - - self.SpawnRandomizeRoute = true - self.SpawnRandomizeRouteStartPoint = SpawnStartPoint - self.SpawnRandomizeRouteEndPoint = SpawnEndPoint - self.SpawnRandomizeRouteRadius = SpawnRadius - - for GroupID = 1, self.SpawnMaxGroups do - self:_RandomizeRoute( GroupID ) - end - - return self -end - - ---- This function is rather complicated to understand. But I'll try to explain. --- This function becomes useful when you need to spawn groups with random templates of groups defined within the mission editor, --- but they will all follow the same Template route and have the same prefix name. --- In other words, this method randomizes between a defined set of groups the template to be used for each new spawn of a group. --- @param #SPAWN self --- @param #string SpawnTemplatePrefixTable A table with the names of the groups defined within the mission editor, from which one will be choosen when a new group will be spawned. --- @return #SPAWN --- @usage --- -- NATO Tank Platoons invading Gori. --- -- Choose between 13 different 'US Tank Platoon' configurations for each new SPAWN the Group to be spawned for the --- -- 'US Tank Platoon Left', 'US Tank Platoon Middle' and 'US Tank Platoon Right' SpawnTemplatePrefixes. --- -- Each new SPAWN will randomize the route, with a defined time interval of 200 seconds with 40% time variation (randomization) and --- -- with a limit set of maximum 12 Units alive simulteneously and 150 Groups to be spawned during the whole mission. --- Spawn_US_Platoon = { 'US Tank Platoon 1', 'US Tank Platoon 2', 'US Tank Platoon 3', 'US Tank Platoon 4', 'US Tank Platoon 5', --- 'US Tank Platoon 6', 'US Tank Platoon 7', 'US Tank Platoon 8', 'US Tank Platoon 9', 'US Tank Platoon 10', --- 'US Tank Platoon 11', 'US Tank Platoon 12', 'US Tank Platoon 13' } --- Spawn_US_Platoon_Left = SPAWN:New( 'US Tank Platoon Left' ):Limit( 12, 150 ):Schedule( 200, 0.4 ):RandomizeTemplate( Spawn_US_Platoon ):RandomizeRoute( 3, 3, 2000 ) --- Spawn_US_Platoon_Middle = SPAWN:New( 'US Tank Platoon Middle' ):Limit( 12, 150 ):Schedule( 200, 0.4 ):RandomizeTemplate( Spawn_US_Platoon ):RandomizeRoute( 3, 3, 2000 ) --- Spawn_US_Platoon_Right = SPAWN:New( 'US Tank Platoon Right' ):Limit( 12, 150 ):Schedule( 200, 0.4 ):RandomizeTemplate( Spawn_US_Platoon ):RandomizeRoute( 3, 3, 2000 ) -function SPAWN:RandomizeTemplate( SpawnTemplatePrefixTable ) - self:F( { self.SpawnTemplatePrefix, SpawnTemplatePrefixTable } ) - - self.SpawnTemplatePrefixTable = SpawnTemplatePrefixTable - self.SpawnRandomizeTemplate = true - - for SpawnGroupID = 1, self.SpawnMaxGroups do - self:_RandomizeTemplate( SpawnGroupID ) - end - - return self -end - - - - - ---- For planes and helicopters, when these groups go home and land on their home airbases and farps, they normally would taxi to the parking spot, shut-down their engines and wait forever until the Group is removed by the runtime environment. --- This function is used to re-spawn automatically (so no extra call is needed anymore) the same group after it has landed. --- This will enable a spawned group to be re-spawned after it lands, until it is destroyed... --- Note: When the group is respawned, it will re-spawn from the original airbase where it took off. --- So ensure that the routes for groups that respawn, always return to the original airbase, or players may get confused ... --- @param #SPAWN self --- @return #SPAWN self --- @usage --- -- RU Su-34 - AI Ship Attack --- -- Re-SPAWN the Group(s) after each landing and Engine Shut-Down automatically. --- SpawnRU_SU34 = SPAWN:New( 'TF1 RU Su-34 Krymsk@AI - Attack Ships' ):Schedule( 2, 3, 1800, 0.4 ):SpawnUncontrolled():RandomizeRoute( 1, 1, 3000 ):RepeatOnEngineShutDown() -function SPAWN:InitRepeat() - self:F( { self.SpawnTemplatePrefix, self.SpawnIndex } ) - - self.Repeat = true - self.RepeatOnEngineShutDown = false - self.RepeatOnLanding = true - - return self -end - ---- Respawn group after landing. --- @param #SPAWN self --- @return #SPAWN self -function SPAWN:InitRepeatOnLanding() - self:F( { self.SpawnTemplatePrefix } ) - - self:InitRepeat() - self.RepeatOnEngineShutDown = false - self.RepeatOnLanding = true - - return self -end - - ---- Respawn after landing when its engines have shut down. --- @param #SPAWN self --- @return #SPAWN self -function SPAWN:InitRepeatOnEngineShutDown() - self:F( { self.SpawnTemplatePrefix } ) - - self:InitRepeat() - self.RepeatOnEngineShutDown = true - self.RepeatOnLanding = false - - return self -end - - ---- CleanUp groups when they are still alive, but inactive. --- When groups are still alive and have become inactive due to damage and are unable to contribute anything, then this group will be removed at defined intervals in seconds. --- @param #SPAWN self --- @param #string SpawnCleanUpInterval The interval to check for inactive groups within seconds. --- @return #SPAWN self --- @usage Spawn_Helicopter:CleanUp( 20 ) -- CleanUp the spawning of the helicopters every 20 seconds when they become inactive. -function SPAWN:CleanUp( SpawnCleanUpInterval ) - self:F( { self.SpawnTemplatePrefix, SpawnCleanUpInterval } ) - - self.SpawnCleanUpInterval = SpawnCleanUpInterval - self.SpawnCleanUpTimeStamps = {} - --self.CleanUpFunction = routines.scheduleFunction( self._SpawnCleanUpScheduler, { self }, timer.getTime() + 1, SpawnCleanUpInterval ) - self.CleanUpScheduler = SCHEDULER:New( self, self._SpawnCleanUpScheduler, {}, 1, SpawnCleanUpInterval, 0.2 ) - return self -end - - - ---- Makes the groups visible before start (like a batallion). --- The method will take the position of the group as the first position in the array. --- @param #SPAWN self --- @param #number SpawnAngle The angle in degrees how the groups and each unit of the group will be positioned. --- @param #number SpawnWidth The amount of Groups that will be positioned on the X axis. --- @param #number SpawnDeltaX The space between each Group on the X-axis. --- @param #number SpawnDeltaY The space between each Group on the Y-axis. --- @return #SPAWN self --- @usage --- -- Define an array of Groups. --- Spawn_BE_Ground = SPAWN:New( 'BE Ground' ):Limit( 2, 24 ):Visible( 90, "Diamond", 10, 100, 50 ) -function SPAWN:Array( SpawnAngle, SpawnWidth, SpawnDeltaX, SpawnDeltaY ) - self:F( { self.SpawnTemplatePrefix, SpawnAngle, SpawnWidth, SpawnDeltaX, SpawnDeltaY } ) - - self.SpawnVisible = true -- When the first Spawn executes, all the Groups need to be made visible before start. - - local SpawnX = 0 - local SpawnY = 0 - local SpawnXIndex = 0 - local SpawnYIndex = 0 - - for SpawnGroupID = 1, self.SpawnMaxGroups do - self:T( { SpawnX, SpawnY, SpawnXIndex, SpawnYIndex } ) - - self.SpawnGroups[SpawnGroupID].Visible = true - self.SpawnGroups[SpawnGroupID].Spawned = false - - SpawnXIndex = SpawnXIndex + 1 - if SpawnWidth and SpawnWidth ~= 0 then - if SpawnXIndex >= SpawnWidth then - SpawnXIndex = 0 - SpawnYIndex = SpawnYIndex + 1 - end - end - - local SpawnRootX = self.SpawnGroups[SpawnGroupID].SpawnTemplate.x - local SpawnRootY = self.SpawnGroups[SpawnGroupID].SpawnTemplate.y - - self:_TranslateRotate( SpawnGroupID, SpawnRootX, SpawnRootY, SpawnX, SpawnY, SpawnAngle ) - - self.SpawnGroups[SpawnGroupID].SpawnTemplate.lateActivation = true - self.SpawnGroups[SpawnGroupID].SpawnTemplate.visible = true - - self.SpawnGroups[SpawnGroupID].Visible = true - - _EVENTDISPATCHER:OnBirthForTemplate( self.SpawnGroups[SpawnGroupID].SpawnTemplate, self._OnBirth, self ) - _EVENTDISPATCHER:OnCrashForTemplate( self.SpawnGroups[SpawnGroupID].SpawnTemplate, self._OnDeadOrCrash, self ) - _EVENTDISPATCHER:OnDeadForTemplate( self.SpawnGroups[SpawnGroupID].SpawnTemplate, self._OnDeadOrCrash, self ) - - if self.Repeat then - _EVENTDISPATCHER:OnTakeOffForTemplate( self.SpawnGroups[SpawnGroupID].SpawnTemplate, self._OnTakeOff, self ) - _EVENTDISPATCHER:OnLandForTemplate( self.SpawnGroups[SpawnGroupID].SpawnTemplate, self._OnLand, self ) - end - if self.RepeatOnEngineShutDown then - _EVENTDISPATCHER:OnEngineShutDownForTemplate( self.SpawnGroups[SpawnGroupID].SpawnTemplate, self._OnEngineShutDown, self ) - end - - self.SpawnGroups[SpawnGroupID].Group = _DATABASE:Spawn( self.SpawnGroups[SpawnGroupID].SpawnTemplate ) - - SpawnX = SpawnXIndex * SpawnDeltaX - SpawnY = SpawnYIndex * SpawnDeltaY - end - - return self -end - - - ---- Will spawn a group based on the internal index. --- Note: Uses @{DATABASE} module defined in MOOSE. --- @param #SPAWN self --- @return Group#GROUP The group that was spawned. You can use this group for further actions. -function SPAWN:Spawn() - self:F( { self.SpawnTemplatePrefix, self.SpawnIndex } ) - - return self:SpawnWithIndex( self.SpawnIndex + 1 ) -end - ---- Will re-spawn a group based on a given index. --- Note: Uses @{DATABASE} module defined in MOOSE. --- @param #SPAWN self --- @param #string SpawnIndex The index of the group to be spawned. --- @return Group#GROUP The group that was spawned. You can use this group for further actions. -function SPAWN:ReSpawn( SpawnIndex ) - self:F( { self.SpawnTemplatePrefix, SpawnIndex } ) - - if not SpawnIndex then - SpawnIndex = 1 - end - --- TODO: This logic makes DCS crash and i don't know why (yet). - local SpawnGroup = self:GetGroupFromIndex( SpawnIndex ) - if SpawnGroup then - local SpawnDCSGroup = SpawnGroup:GetDCSGroup() - if SpawnDCSGroup then - SpawnGroup:Destroy() - end - end - - return self:SpawnWithIndex( SpawnIndex ) -end - ---- Will spawn a group with a specified index number. --- Uses @{DATABASE} global object defined in MOOSE. --- @param #SPAWN self --- @return Group#GROUP The group that was spawned. You can use this group for further actions. -function SPAWN:SpawnWithIndex( SpawnIndex ) - self:F( { self.SpawnTemplatePrefix, SpawnIndex, self.SpawnMaxGroups } ) - - if self:_GetSpawnIndex( SpawnIndex ) then - - if self.SpawnGroups[self.SpawnIndex].Visible then - self.SpawnGroups[self.SpawnIndex].Group:Activate() - else - self:T( self.SpawnGroups[self.SpawnIndex].SpawnTemplate ) - _EVENTDISPATCHER:OnBirthForTemplate( self.SpawnGroups[self.SpawnIndex].SpawnTemplate, self._OnBirth, self ) - _EVENTDISPATCHER:OnCrashForTemplate( self.SpawnGroups[self.SpawnIndex].SpawnTemplate, self._OnDeadOrCrash, self ) - _EVENTDISPATCHER:OnDeadForTemplate( self.SpawnGroups[self.SpawnIndex].SpawnTemplate, self._OnDeadOrCrash, self ) - - if self.Repeat then - _EVENTDISPATCHER:OnTakeOffForTemplate( self.SpawnGroups[self.SpawnIndex].SpawnTemplate, self._OnTakeOff, self ) - _EVENTDISPATCHER:OnLandForTemplate( self.SpawnGroups[self.SpawnIndex].SpawnTemplate, self._OnLand, self ) - end - if self.RepeatOnEngineShutDown then - _EVENTDISPATCHER:OnEngineShutDownForTemplate( self.SpawnGroups[self.SpawnIndex].SpawnTemplate, self._OnEngineShutDown, self ) - end - - self:T( self.SpawnGroups[self.SpawnIndex].SpawnTemplate ) - - self.SpawnGroups[self.SpawnIndex].Group = _DATABASE:Spawn( self.SpawnGroups[self.SpawnIndex].SpawnTemplate ) - - -- If there is a SpawnFunction hook defined, call it. - if self.SpawnFunctionHook then - self.SpawnFunctionHook( self.SpawnGroups[self.SpawnIndex].Group, unpack( self.SpawnFunctionArguments ) ) - end - -- TODO: Need to fix this by putting an "R" in the name of the group when the group repeats. - --if self.Repeat then - -- _DATABASE:SetStatusGroup( SpawnTemplate.name, "ReSpawn" ) - --end - end - - self.SpawnGroups[self.SpawnIndex].Spawned = true - return self.SpawnGroups[self.SpawnIndex].Group - else - --self:E( { self.SpawnTemplatePrefix, "No more Groups to Spawn:", SpawnIndex, self.SpawnMaxGroups } ) - end - - return nil -end - ---- Spawns new groups at varying time intervals. --- This is useful if you want to have continuity within your missions of certain (AI) groups to be present (alive) within your missions. --- @param #SPAWN self --- @param #number SpawnTime The time interval defined in seconds between each new spawn of new groups. --- @param #number SpawnTimeVariation The variation to be applied on the defined time interval between each new spawn. --- The variation is a number between 0 and 1, representing the %-tage of variation to be applied on the time interval. --- @return #SPAWN self --- @usage --- -- NATO helicopters engaging in the battle field. --- -- The time interval is set to SPAWN new helicopters between each 600 seconds, with a time variation of 50%. --- -- The time variation in this case will be between 450 seconds and 750 seconds. --- -- This is calculated as follows: --- -- Low limit: 600 * ( 1 - 0.5 / 2 ) = 450 --- -- High limit: 600 * ( 1 + 0.5 / 2 ) = 750 --- -- Between these two values, a random amount of seconds will be choosen for each new spawn of the helicopters. --- Spawn_BE_KA50 = SPAWN:New( 'BE KA-50@RAMP-Ground Defense' ):Schedule( 600, 0.5 ) -function SPAWN:SpawnScheduled( SpawnTime, SpawnTimeVariation ) - self:F( { SpawnTime, SpawnTimeVariation } ) - - if SpawnTime ~= nil and SpawnTimeVariation ~= nil then - self.SpawnScheduler = SCHEDULER:New( self, self._Scheduler, {}, 1, SpawnTime, SpawnTimeVariation ) - end - - return self -end - ---- Will re-start the spawning scheduler. --- Note: This function is only required to be called when the schedule was stopped. -function SPAWN:SpawnScheduleStart() - self:F( { self.SpawnTemplatePrefix } ) - - self.SpawnScheduler:Start() -end - ---- Will stop the scheduled spawning scheduler. -function SPAWN:SpawnScheduleStop() - self:F( { self.SpawnTemplatePrefix } ) - - self.SpawnScheduler:Stop() -end - - ---- Allows to place a CallFunction hook when a new group spawns. --- The provided function will be called when a new group is spawned, including its given parameters. --- The first parameter of the SpawnFunction is the @{Group#GROUP} that was spawned. --- @param #SPAWN self --- @param #function SpawnFunctionHook The function to be called when a group spawns. --- @param SpawnFunctionArguments A random amount of arguments to be provided to the function when the group spawns. --- @return #SPAWN -function SPAWN:SpawnFunction( SpawnFunctionHook, ... ) - self:F( SpawnFunction ) - - self.SpawnFunctionHook = SpawnFunctionHook - self.SpawnFunctionArguments = {} - if arg then - self.SpawnFunctionArguments = arg - end - - return self -end - - - - ---- Will spawn a group from a hosting unit. This function is mostly advisable to be used if you want to simulate spawning from air units, like helicopters, which are dropping infantry into a defined Landing Zone. --- Note that each point in the route assigned to the spawning group is reset to the point of the spawn. --- You can use the returned group to further define the route to be followed. --- @param #SPAWN self --- @param Unit#UNIT HostUnit The air or ground unit dropping or unloading the group. --- @param #number OuterRadius The outer radius in meters where the new group will be spawned. --- @param #number InnerRadius The inner radius in meters where the new group will NOT be spawned. --- @param #number SpawnIndex (Optional) The index which group to spawn within the given zone. --- @return Group#GROUP that was spawned. --- @return #nil Nothing was spawned. -function SPAWN:SpawnFromUnit( HostUnit, OuterRadius, InnerRadius, SpawnIndex ) - self:F( { self.SpawnTemplatePrefix, HostUnit, OuterRadius, InnerRadius, SpawnIndex } ) - - if HostUnit and HostUnit:IsAlive() then -- and HostUnit:getUnit(1):inAir() == false then - - if SpawnIndex then - else - SpawnIndex = self.SpawnIndex + 1 - end - - if self:_GetSpawnIndex( SpawnIndex ) then - - local SpawnTemplate = self.SpawnGroups[self.SpawnIndex].SpawnTemplate - - if SpawnTemplate then - - local UnitPoint = HostUnit:GetPointVec2() - - self:T( { "Current point of ", self.SpawnTemplatePrefix, UnitPoint } ) - - --for PointID, Point in pairs( SpawnTemplate.route.points ) do - --Point.x = UnitPoint.x - --Point.y = UnitPoint.y - --Point.alt = nil - --Point.alt_type = nil - --end - - SpawnTemplate.route.points[1].x = UnitPoint.x - SpawnTemplate.route.points[1].y = UnitPoint.y - - if not InnerRadius then - InnerRadius = 10 - end - - if not OuterRadius then - OuterRadius = 50 - end - - -- Apply SpawnFormation - for UnitID = 1, #SpawnTemplate.units do - if InnerRadius == 0 then - SpawnTemplate.units[UnitID].x = UnitPoint.x - SpawnTemplate.units[UnitID].y = UnitPoint.y - else - local CirclePos = routines.getRandPointInCircle( UnitPoint, OuterRadius, InnerRadius ) - SpawnTemplate.units[UnitID].x = CirclePos.x - SpawnTemplate.units[UnitID].y = CirclePos.y - end - self:T( 'SpawnTemplate.units['..UnitID..'].x = ' .. SpawnTemplate.units[UnitID].x .. ', SpawnTemplate.units['..UnitID..'].y = ' .. SpawnTemplate.units[UnitID].y ) - end - - local SpawnPos = routines.getRandPointInCircle( UnitPoint, OuterRadius, InnerRadius ) - local Point = {} - Point.type = "Turning Point" - Point.x = SpawnPos.x - Point.y = SpawnPos.y - Point.action = "Cone" - Point.speed = 5 - - table.insert( SpawnTemplate.route.points, 2, Point ) - - return self:SpawnWithIndex( self.SpawnIndex ) - end - end - end - - return nil -end - ---- Will spawn a Group within a given @{Zone#ZONE}. --- Once the group is spawned within the zone, it will continue on its route. --- The first waypoint (where the group is spawned) is replaced with the zone coordinates. --- @param #SPAWN self --- @param Zone#ZONE Zone The zone where the group is to be spawned. --- @param #number ZoneRandomize (Optional) Set to true if you want to randomize the starting point in the zone. --- @param #number SpawnIndex (Optional) The index which group to spawn within the given zone. --- @return Group#GROUP that was spawned. --- @return #nil when nothing was spawned. -function SPAWN:SpawnInZone( Zone, ZoneRandomize, SpawnIndex ) - self:F( { self.SpawnTemplatePrefix, Zone, ZoneRandomize, SpawnIndex } ) - - if Zone then - - if SpawnIndex then - else - SpawnIndex = self.SpawnIndex + 1 - end - - if self:_GetSpawnIndex( SpawnIndex ) then - - local SpawnTemplate = self.SpawnGroups[self.SpawnIndex].SpawnTemplate - - if SpawnTemplate then - - local ZonePoint - - if ZoneRandomize == true then - ZonePoint = Zone:GetRandomPointVec2() - else - ZonePoint = Zone:GetPointVec2() - end - - SpawnTemplate.route.points[1].x = ZonePoint.x - SpawnTemplate.route.points[1].y = ZonePoint.y - - -- Apply SpawnFormation - for UnitID = 1, #SpawnTemplate.units do - local ZonePointUnit = Zone:GetRandomPointVec2() - SpawnTemplate.units[UnitID].x = ZonePointUnit.x - SpawnTemplate.units[UnitID].y = ZonePointUnit.y - self:T( 'SpawnTemplate.units['..UnitID..'].x = ' .. SpawnTemplate.units[UnitID].x .. ', SpawnTemplate.units['..UnitID..'].y = ' .. SpawnTemplate.units[UnitID].y ) - end - - return self:SpawnWithIndex( self.SpawnIndex ) - end - end - end - - return nil -end - - - - ---- Will spawn a plane group in uncontrolled mode... --- This will be similar to the uncontrolled flag setting in the ME. --- @return #SPAWN self -function SPAWN:UnControlled() - self:F( { self.SpawnTemplatePrefix } ) - - self.SpawnUnControlled = true - - for SpawnGroupID = 1, self.SpawnMaxGroups do - self.SpawnGroups[SpawnGroupID].UnControlled = true - end - - return self -end - - - ---- Will return the SpawnGroupName either with with a specific count number or without any count. --- @param #SPAWN self --- @param #number SpawnIndex Is the number of the Group that is to be spawned. --- @return #string SpawnGroupName -function SPAWN:SpawnGroupName( SpawnIndex ) - self:F( { self.SpawnTemplatePrefix, SpawnIndex } ) - - local SpawnPrefix = self.SpawnTemplatePrefix - if self.SpawnAliasPrefix then - SpawnPrefix = self.SpawnAliasPrefix - end - - if SpawnIndex then - local SpawnName = string.format( '%s#%03d', SpawnPrefix, SpawnIndex ) - self:T( SpawnName ) - return SpawnName - else - self:T( SpawnPrefix ) - return SpawnPrefix - end - -end - ---- Find the first alive group. --- @param #SPAWN self --- @param #number SpawnCursor A number holding the index from where to find the first group from. --- @return Group#GROUP, #number The group found, the new index where the group was found. --- @return #nil, #nil When no group is found, #nil is returned. -function SPAWN:GetFirstAliveGroup( SpawnCursor ) - self:F( { self.SpawnTemplatePrefix, self.SpawnAliasPrefix, SpawnCursor } ) - - for SpawnIndex = 1, self.SpawnCount do - local SpawnGroup = self:GetGroupFromIndex( SpawnIndex ) - if SpawnGroup and SpawnGroup:IsAlive() then - SpawnCursor = SpawnIndex - return SpawnGroup, SpawnCursor - end - end - - return nil, nil -end - - ---- Find the next alive group. --- @param #SPAWN self --- @param #number SpawnCursor A number holding the last found previous index. --- @return Group#GROUP, #number The group found, the new index where the group was found. --- @return #nil, #nil When no group is found, #nil is returned. -function SPAWN:GetNextAliveGroup( SpawnCursor ) - self:F( { self.SpawnTemplatePrefix, self.SpawnAliasPrefix, SpawnCursor } ) - - SpawnCursor = SpawnCursor + 1 - for SpawnIndex = SpawnCursor, self.SpawnCount do - local SpawnGroup = self:GetGroupFromIndex( SpawnIndex ) - if SpawnGroup and SpawnGroup:IsAlive() then - SpawnCursor = SpawnIndex - return SpawnGroup, SpawnCursor - end - end - - return nil, nil -end - ---- Find the last alive group during runtime. -function SPAWN:GetLastAliveGroup() - self:F( { self.SpawnTemplatePrefixself.SpawnAliasPrefix } ) - - self.SpawnIndex = self:_GetLastIndex() - for SpawnIndex = self.SpawnIndex, 1, -1 do - local SpawnGroup = self:GetGroupFromIndex( SpawnIndex ) - if SpawnGroup and SpawnGroup:IsAlive() then - self.SpawnIndex = SpawnIndex - return SpawnGroup - end - end - - self.SpawnIndex = nil - return nil -end - - - ---- Get the group from an index. --- Returns the group from the SpawnGroups list. --- If no index is given, it will return the first group in the list. --- @param #SPAWN self --- @param #number SpawnIndex The index of the group to return. --- @return Group#GROUP self -function SPAWN:GetGroupFromIndex( SpawnIndex ) - self:F( { self.SpawnTemplatePrefix, self.SpawnAliasPrefix, SpawnIndex } ) - - if not SpawnIndex then - SpawnIndex = 1 - end - - if self.SpawnGroups and self.SpawnGroups[SpawnIndex] then - local SpawnGroup = self.SpawnGroups[SpawnIndex].Group - return SpawnGroup - else - return nil - end -end - ---- Get the group index from a DCSUnit. --- The method will search for a #-mark, and will return the index behind the #-mark of the DCSUnit. --- It will return nil of no prefix was found. --- @param #SPAWN self --- @param DCSUnit The DCS unit to be searched. --- @return #string The prefix --- @return #nil Nothing found -function SPAWN:_GetGroupIndexFromDCSUnit( DCSUnit ) - self:F( { self.SpawnTemplatePrefix, self.SpawnAliasPrefix, DCSUnit } ) - - if DCSUnit and DCSUnit:getName() then - local IndexString = string.match( DCSUnit:getName(), "#.*-" ):sub( 2, -2 ) - self:T( IndexString ) - - if IndexString then - local Index = tonumber( IndexString ) - self:T( { "Index:", IndexString, Index } ) - return Index - end - end - - return nil -end - ---- Return the prefix of a DCSUnit. --- The method will search for a #-mark, and will return the text before the #-mark. --- It will return nil of no prefix was found. --- @param #SPAWN self --- @param DCSUnit The DCS unit to be searched. --- @return #string The prefix --- @return #nil Nothing found -function SPAWN:_GetPrefixFromDCSUnit( DCSUnit ) - self:F( { self.SpawnTemplatePrefix, self.SpawnAliasPrefix, DCSUnit } ) - - if DCSUnit and DCSUnit:getName() then - local SpawnPrefix = string.match( DCSUnit:getName(), ".*#" ) - if SpawnPrefix then - SpawnPrefix = SpawnPrefix:sub( 1, -2 ) - end - self:T( SpawnPrefix ) - return SpawnPrefix - end - - return nil -end - ---- Return the group within the SpawnGroups collection with input a DCSUnit. -function SPAWN:_GetGroupFromDCSUnit( DCSUnit ) - self:F( { self.SpawnTemplatePrefix, self.SpawnAliasPrefix, DCSUnit } ) - - if DCSUnit then - local SpawnPrefix = self:_GetPrefixFromDCSUnit( DCSUnit ) - - if self.SpawnTemplatePrefix == SpawnPrefix or ( self.SpawnAliasPrefix and self.SpawnAliasPrefix == SpawnPrefix ) then - local SpawnGroupIndex = self:_GetGroupIndexFromDCSUnit( DCSUnit ) - local SpawnGroup = self.SpawnGroups[SpawnGroupIndex].Group - self:T( SpawnGroup ) - return SpawnGroup - end - end - - return nil -end - - ---- Get the index from a given group. --- The function will search the name of the group for a #, and will return the number behind the #-mark. -function SPAWN:GetSpawnIndexFromGroup( SpawnGroup ) - self:F( { self.SpawnTemplatePrefix, self.SpawnAliasPrefix, SpawnGroup } ) - - local IndexString = string.match( SpawnGroup:GetName(), "#.*$" ):sub( 2 ) - local Index = tonumber( IndexString ) - - self:T( IndexString, Index ) - return Index - -end - ---- Return the last maximum index that can be used. -function SPAWN:_GetLastIndex() - self:F( { self.SpawnTemplatePrefix, self.SpawnAliasPrefix } ) - - return self.SpawnMaxGroups -end - ---- Initalize the SpawnGroups collection. -function SPAWN:_InitializeSpawnGroups( SpawnIndex ) - self:F( { self.SpawnTemplatePrefix, self.SpawnAliasPrefix, SpawnIndex } ) - - if not self.SpawnGroups[SpawnIndex] then - self.SpawnGroups[SpawnIndex] = {} - self.SpawnGroups[SpawnIndex].Visible = false - self.SpawnGroups[SpawnIndex].Spawned = false - self.SpawnGroups[SpawnIndex].UnControlled = false - self.SpawnGroups[SpawnIndex].SpawnTime = 0 - - self.SpawnGroups[SpawnIndex].SpawnTemplatePrefix = self.SpawnTemplatePrefix - self.SpawnGroups[SpawnIndex].SpawnTemplate = self:_Prepare( self.SpawnGroups[SpawnIndex].SpawnTemplatePrefix, SpawnIndex ) - end - - self:_RandomizeTemplate( SpawnIndex ) - self:_RandomizeRoute( SpawnIndex ) - --self:_TranslateRotate( SpawnIndex ) - - return self.SpawnGroups[SpawnIndex] -end - - - ---- Gets the CategoryID of the Group with the given SpawnPrefix -function SPAWN:_GetGroupCategoryID( SpawnPrefix ) - local TemplateGroup = Group.getByName( SpawnPrefix ) - - if TemplateGroup then - return TemplateGroup:getCategory() - else - return nil - end -end - ---- Gets the CoalitionID of the Group with the given SpawnPrefix -function SPAWN:_GetGroupCoalitionID( SpawnPrefix ) - local TemplateGroup = Group.getByName( SpawnPrefix ) - - if TemplateGroup then - return TemplateGroup:getCoalition() - else - return nil - end -end - ---- Gets the CountryID of the Group with the given SpawnPrefix -function SPAWN:_GetGroupCountryID( SpawnPrefix ) - self:F( { self.SpawnTemplatePrefix, self.SpawnAliasPrefix, SpawnPrefix } ) - - local TemplateGroup = Group.getByName( SpawnPrefix ) - - if TemplateGroup then - local TemplateUnits = TemplateGroup:getUnits() - return TemplateUnits[1]:getCountry() - else - return nil - end -end - ---- Gets the Group Template from the ME environment definition. --- This method used the @{DATABASE} object, which contains ALL initial and new spawned object in MOOSE. --- @param #SPAWN self --- @param #string SpawnTemplatePrefix --- @return @SPAWN self -function SPAWN:_GetTemplate( SpawnTemplatePrefix ) - self:F( { self.SpawnTemplatePrefix, self.SpawnAliasPrefix, SpawnTemplatePrefix } ) - - local SpawnTemplate = nil - - SpawnTemplate = routines.utils.deepCopy( _DATABASE.Templates.Groups[SpawnTemplatePrefix].Template ) - - if SpawnTemplate == nil then - error( 'No Template returned for SpawnTemplatePrefix = ' .. SpawnTemplatePrefix ) - end - - SpawnTemplate.SpawnCoalitionID = self:_GetGroupCoalitionID( SpawnTemplatePrefix ) - SpawnTemplate.SpawnCategoryID = self:_GetGroupCategoryID( SpawnTemplatePrefix ) - SpawnTemplate.SpawnCountryID = self:_GetGroupCountryID( SpawnTemplatePrefix ) - - self:T( { SpawnTemplate } ) - return SpawnTemplate -end - ---- Prepares the new Group Template. --- @param #SPAWN self --- @param #string SpawnTemplatePrefix --- @param #number SpawnIndex --- @return #SPAWN self -function SPAWN:_Prepare( SpawnTemplatePrefix, SpawnIndex ) - self:F( { self.SpawnTemplatePrefix, self.SpawnAliasPrefix } ) - - local SpawnTemplate = self:_GetTemplate( SpawnTemplatePrefix ) - SpawnTemplate.name = self:SpawnGroupName( SpawnIndex ) - - SpawnTemplate.groupId = nil - --SpawnTemplate.lateActivation = false - SpawnTemplate.lateActivation = false -- TODO BUGFIX - - if SpawnTemplate.SpawnCategoryID == Group.Category.GROUND then - self:T( "For ground units, visible needs to be false..." ) - SpawnTemplate.visible = false -- TODO BUGFIX - end - - if SpawnTemplate.SpawnCategoryID == Group.Category.HELICOPTER or SpawnTemplate.SpawnCategoryID == Group.Category.AIRPLANE then - SpawnTemplate.uncontrolled = false - end - - for UnitID = 1, #SpawnTemplate.units do - SpawnTemplate.units[UnitID].name = string.format( SpawnTemplate.name .. '-%02d', UnitID ) - SpawnTemplate.units[UnitID].unitId = nil - SpawnTemplate.units[UnitID].x = SpawnTemplate.route.points[1].x - SpawnTemplate.units[UnitID].y = SpawnTemplate.route.points[1].y - end - - self:T( { "Template:", SpawnTemplate } ) - return SpawnTemplate - -end - ---- Private method randomizing the routes. --- @param #SPAWN self --- @param #number SpawnIndex The index of the group to be spawned. --- @return #SPAWN -function SPAWN:_RandomizeRoute( SpawnIndex ) - self:F( { self.SpawnTemplatePrefix, SpawnIndex, self.SpawnRandomizeRoute, self.SpawnRandomizeRouteStartPoint, self.SpawnRandomizeRouteEndPoint, self.SpawnRandomizeRouteRadius } ) - - if self.SpawnRandomizeRoute then - local SpawnTemplate = self.SpawnGroups[SpawnIndex].SpawnTemplate - local RouteCount = #SpawnTemplate.route.points - - for t = self.SpawnRandomizeRouteStartPoint + 1, ( RouteCount - self.SpawnRandomizeRouteEndPoint ) do - SpawnTemplate.route.points[t].x = SpawnTemplate.route.points[t].x + math.random( self.SpawnRandomizeRouteRadius * -1, self.SpawnRandomizeRouteRadius ) - SpawnTemplate.route.points[t].y = SpawnTemplate.route.points[t].y + math.random( self.SpawnRandomizeRouteRadius * -1, self.SpawnRandomizeRouteRadius ) - -- TODO: manage altitude for airborne units ... - SpawnTemplate.route.points[t].alt = nil - --SpawnGroup.route.points[t].alt_type = nil - self:T( 'SpawnTemplate.route.points[' .. t .. '].x = ' .. SpawnTemplate.route.points[t].x .. ', SpawnTemplate.route.points[' .. t .. '].y = ' .. SpawnTemplate.route.points[t].y ) - end - end - - return self -end - ---- Private method that randomizes the template of the group. --- @param #SPAWN self --- @param #number SpawnIndex --- @return #SPAWN self -function SPAWN:_RandomizeTemplate( SpawnIndex ) - self:F( { self.SpawnTemplatePrefix, SpawnIndex, self.SpawnRandomizeTemplate } ) - - if self.SpawnRandomizeTemplate then - self.SpawnGroups[SpawnIndex].SpawnTemplatePrefix = self.SpawnTemplatePrefixTable[ math.random( 1, #self.SpawnTemplatePrefixTable ) ] - self.SpawnGroups[SpawnIndex].SpawnTemplate = self:_Prepare( self.SpawnGroups[SpawnIndex].SpawnTemplatePrefix, SpawnIndex ) - self.SpawnGroups[SpawnIndex].SpawnTemplate.route = routines.utils.deepCopy( self.SpawnTemplate.route ) - self.SpawnGroups[SpawnIndex].SpawnTemplate.x = self.SpawnTemplate.x - self.SpawnGroups[SpawnIndex].SpawnTemplate.y = self.SpawnTemplate.y - self.SpawnGroups[SpawnIndex].SpawnTemplate.start_time = self.SpawnTemplate.start_time - for UnitID = 1, #self.SpawnGroups[SpawnIndex].SpawnTemplate.units do - self.SpawnGroups[SpawnIndex].SpawnTemplate.units[UnitID].heading = self.SpawnTemplate.units[1].heading - end - end - - self:_RandomizeRoute( SpawnIndex ) - - return self -end - -function SPAWN:_TranslateRotate( SpawnIndex, SpawnRootX, SpawnRootY, SpawnX, SpawnY, SpawnAngle ) - self:F( { self.SpawnTemplatePrefix, SpawnIndex, SpawnRootX, SpawnRootY, SpawnX, SpawnY, SpawnAngle } ) - - -- Translate - local TranslatedX = SpawnX - local TranslatedY = SpawnY - - -- Rotate - -- From Wikipedia: https://en.wikipedia.org/wiki/Rotation_matrix#Common_rotations - -- x' = x \cos \theta - y \sin \theta\ - -- y' = x \sin \theta + y \cos \theta\ - local RotatedX = - TranslatedX * math.cos( math.rad( SpawnAngle ) ) - + TranslatedY * math.sin( math.rad( SpawnAngle ) ) - local RotatedY = TranslatedX * math.sin( math.rad( SpawnAngle ) ) - + TranslatedY * math.cos( math.rad( SpawnAngle ) ) - - -- Assign - self.SpawnGroups[SpawnIndex].SpawnTemplate.x = SpawnRootX - RotatedX - self.SpawnGroups[SpawnIndex].SpawnTemplate.y = SpawnRootY + RotatedY - - - local SpawnUnitCount = table.getn( self.SpawnGroups[SpawnIndex].SpawnTemplate.units ) - for u = 1, SpawnUnitCount do - - -- Translate - local TranslatedX = SpawnX - local TranslatedY = SpawnY - 10 * ( u - 1 ) - - -- Rotate - local RotatedX = - TranslatedX * math.cos( math.rad( SpawnAngle ) ) - + TranslatedY * math.sin( math.rad( SpawnAngle ) ) - local RotatedY = TranslatedX * math.sin( math.rad( SpawnAngle ) ) - + TranslatedY * math.cos( math.rad( SpawnAngle ) ) - - -- Assign - self.SpawnGroups[SpawnIndex].SpawnTemplate.units[u].x = SpawnRootX - RotatedX - self.SpawnGroups[SpawnIndex].SpawnTemplate.units[u].y = SpawnRootY + RotatedY - self.SpawnGroups[SpawnIndex].SpawnTemplate.units[u].heading = self.SpawnGroups[SpawnIndex].SpawnTemplate.units[u].heading + math.rad( SpawnAngle ) - end - - return self -end - ---- Get the next index of the groups to be spawned. This function is complicated, as it is used at several spaces. -function SPAWN:_GetSpawnIndex( SpawnIndex ) - self:F( { self.SpawnTemplatePrefix, SpawnIndex, self.SpawnMaxGroups, self.SpawnMaxUnitsAlive, self.AliveUnits, #self.SpawnTemplate.units } ) - - - if ( self.SpawnMaxGroups == 0 ) or ( SpawnIndex <= self.SpawnMaxGroups ) then - if ( self.SpawnMaxUnitsAlive == 0 ) or ( self.AliveUnits < self.SpawnMaxUnitsAlive * #self.SpawnTemplate.units ) or self.UnControlled then - if SpawnIndex and SpawnIndex >= self.SpawnCount + 1 then - self.SpawnCount = self.SpawnCount + 1 - SpawnIndex = self.SpawnCount - end - self.SpawnIndex = SpawnIndex - if not self.SpawnGroups[self.SpawnIndex] then - self:_InitializeSpawnGroups( self.SpawnIndex ) - end - else - return nil - end - else - return nil - end - - return self.SpawnIndex -end - - --- TODO Need to delete this... _DATABASE does this now ... -function SPAWN:_OnBirth( event ) - - if timer.getTime0() < timer.getAbsTime() then -- dont need to add units spawned in at the start of the mission if mist is loaded in init line - if event.initiator and event.initiator:getName() then - local EventPrefix = self:_GetPrefixFromDCSUnit( event.initiator ) - if EventPrefix == self.SpawnTemplatePrefix or ( self.SpawnAliasPrefix and EventPrefix == self.SpawnAliasPrefix ) then - self:T( { "Birth event: " .. event.initiator:getName(), event } ) - --MessageToAll( "Mission command: unit " .. SpawnTemplatePrefix .. " spawned." , 5, EventPrefix .. '/Event') - self.AliveUnits = self.AliveUnits + 1 - self:T( "Alive Units: " .. self.AliveUnits ) - end - end - end - -end - ---- Obscolete --- @todo Need to delete this... _DATABASE does this now ... -function SPAWN:_OnDeadOrCrash( event ) - self:F( self.SpawnTemplatePrefix, event ) - - if event.initiator and event.initiator:getName() then - local EventPrefix = self:_GetPrefixFromDCSUnit( event.initiator ) - if EventPrefix == self.SpawnTemplatePrefix or ( self.SpawnAliasPrefix and EventPrefix == self.SpawnAliasPrefix ) then - self:T( { "Dead event: " .. event.initiator:getName(), event } ) --- local DestroyedUnit = Unit.getByName( EventPrefix ) --- if DestroyedUnit and DestroyedUnit.getLife() <= 1.0 then - --MessageToAll( "Mission command: unit " .. SpawnTemplatePrefix .. " crashed." , 5, EventPrefix .. '/Event') - self.AliveUnits = self.AliveUnits - 1 - self:T( "Alive Units: " .. self.AliveUnits ) --- end - end - end -end - ---- Will detect AIR Units taking off... When the event takes place, the spawned Group is registered as airborne... --- This is needed to ensure that Re-SPAWNing only is done for landed AIR Groups. --- @todo Need to test for AIR Groups only... -function SPAWN:_OnTakeOff( event ) - self:F( self.SpawnTemplatePrefix, event ) - - if event.initiator and event.initiator:getName() then - local SpawnGroup = self:_GetGroupFromDCSUnit( event.initiator ) - if SpawnGroup then - self:T( { "TakeOff event: " .. event.initiator:getName(), event } ) - self:T( "self.Landed = false" ) - self.Landed = false - end - end -end - ---- Will detect AIR Units landing... When the event takes place, the spawned Group is registered as landed. --- This is needed to ensure that Re-SPAWNing is only done for landed AIR Groups. --- @todo Need to test for AIR Groups only... -function SPAWN:_OnLand( event ) - self:F( self.SpawnTemplatePrefix, event ) - - local SpawnUnit = event.initiator - if SpawnUnit and SpawnUnit:isExist() and Object.getCategory(SpawnUnit) == Object.Category.UNIT then - local SpawnGroup = self:_GetGroupFromDCSUnit( SpawnUnit ) - if SpawnGroup then - self:T( { "Landed event:" .. SpawnUnit:getName(), event } ) - self.Landed = true - self:T( "self.Landed = true" ) - if self.Landed and self.RepeatOnLanding then - local SpawnGroupIndex = self:GetSpawnIndexFromGroup( SpawnGroup ) - self:T( { "Landed:", "ReSpawn:", SpawnGroup:GetName(), SpawnGroupIndex } ) - self:ReSpawn( SpawnGroupIndex ) - end - end - end -end - ---- Will detect AIR Units shutting down their engines ... --- When the event takes place, and the method @{RepeatOnEngineShutDown} was called, the spawned Group will Re-SPAWN. --- But only when the Unit was registered to have landed. --- @param #SPAWN self --- @see _OnTakeOff --- @see _OnLand --- @todo Need to test for AIR Groups only... -function SPAWN:_OnEngineShutDown( event ) - self:F( self.SpawnTemplatePrefix, event ) - - local SpawnUnit = event.initiator - if SpawnUnit and SpawnUnit:isExist() and Object.getCategory(SpawnUnit) == Object.Category.UNIT then - local SpawnGroup = self:_GetGroupFromDCSUnit( SpawnUnit ) - if SpawnGroup then - self:T( { "EngineShutDown event: " .. SpawnUnit:getName(), event } ) - if self.Landed and self.RepeatOnEngineShutDown then - local SpawnGroupIndex = self:GetSpawnIndexFromGroup( SpawnGroup ) - self:T( { "EngineShutDown: ", "ReSpawn:", SpawnGroup:GetName(), SpawnGroupIndex } ) - self:ReSpawn( SpawnGroupIndex ) - end - end - end -end - ---- This function is called automatically by the Spawning scheduler. --- It is the internal worker method SPAWNing new Groups on the defined time intervals. -function SPAWN:_Scheduler() - self:F( { "_Scheduler", self.SpawnTemplatePrefix, self.SpawnAliasPrefix, self.SpawnIndex, self.SpawnMaxGroups, self.SpawnMaxUnitsAlive } ) - - -- Validate if there are still groups left in the batch... - self:Spawn() - - return true -end - -function SPAWN:_SpawnCleanUpScheduler() - self:F( { "CleanUp Scheduler:", self.SpawnTemplatePrefix } ) - - local SpawnCursor - local SpawnGroup, SpawnCursor = self:GetFirstAliveGroup( SpawnCursor ) - - self:T( { "CleanUp Scheduler:", SpawnGroup } ) - - while SpawnGroup do - - if SpawnGroup:AllOnGround() and SpawnGroup:GetMaxVelocity() < 1 then - if not self.SpawnCleanUpTimeStamps[SpawnGroup:GetName()] then - self.SpawnCleanUpTimeStamps[SpawnGroup:GetName()] = timer.getTime() - else - if self.SpawnCleanUpTimeStamps[SpawnGroup:GetName()] + self.SpawnCleanUpInterval < timer.getTime() then - self:T( { "CleanUp Scheduler:", "Cleaning:", SpawnGroup } ) - SpawnGroup:Destroy() - end - end - else - self.SpawnCleanUpTimeStamps[SpawnGroup:GetName()] = nil - end - - SpawnGroup, SpawnCursor = self:GetNextAliveGroup( SpawnCursor ) - - self:T( { "CleanUp Scheduler:", SpawnGroup } ) - - end - - return true -- Repeat - -end ---- Limit the simultaneous movement of Groups within a running Mission. --- This module is defined to improve the performance in missions, and to bring additional realism for GROUND vehicles. --- Performance: If in a DCSRTE there are a lot of moving GROUND units, then in a multi player mission, this WILL create lag if --- the main DCS execution core of your CPU is fully utilized. So, this class will limit the amount of simultaneous moving GROUND units --- on defined intervals (currently every minute). --- @module MOVEMENT - ---- the MOVEMENT class --- @type -MOVEMENT = { - ClassName = "MOVEMENT", -} - ---- Creates the main object which is handling the GROUND forces movement. --- @param table{string,...}|string MovePrefixes is a table of the Prefixes (names) of the GROUND Groups that need to be controlled by the MOVEMENT Object. --- @param number MoveMaximum is a number that defines the maximum amount of GROUND Units to be moving during one minute. --- @return MOVEMENT --- @usage --- -- Limit the amount of simultaneous moving units on the ground to prevent lag. --- Movement_US_Platoons = MOVEMENT:New( { 'US Tank Platoon Left', 'US Tank Platoon Middle', 'US Tank Platoon Right', 'US CH-47D Troops' }, 15 ) - -function MOVEMENT:New( MovePrefixes, MoveMaximum ) - local self = BASE:Inherit( self, BASE:New() ) - self:F( { MovePrefixes, MoveMaximum } ) - - if type( MovePrefixes ) == 'table' then - self.MovePrefixes = MovePrefixes - else - self.MovePrefixes = { MovePrefixes } - end - self.MoveCount = 0 -- The internal counter of the amount of Moveing the has happened since MoveStart. - self.MoveMaximum = MoveMaximum -- Contains the Maximum amount of units that are allowed to move... - self.AliveUnits = 0 -- Contains the counter how many units are currently alive - self.MoveUnits = {} -- Reflects if the Moving for this MovePrefixes is going to be scheduled or not. - - _EVENTDISPATCHER:OnBirth( self.OnBirth, self ) - --- self:AddEvent( world.event.S_EVENT_BIRTH, self.OnBirth ) --- --- self:EnableEvents() - - self:ScheduleStart() - - return self -end - ---- Call this function to start the MOVEMENT scheduling. -function MOVEMENT:ScheduleStart() - self:F() - --self.MoveFunction = routines.scheduleFunction( self._Scheduler, { self }, timer.getTime() + 1, 120 ) - self.MoveFunction = SCHEDULER:New( self, self._Scheduler, {}, 1, 120 ) -end - ---- Call this function to stop the MOVEMENT scheduling. --- @todo need to implement it ... Forgot. -function MOVEMENT:ScheduleStop() - self:F() - -end - ---- Captures the birth events when new Units were spawned. --- @todo This method should become obsolete. The new @{DATABASE} class will handle the collection administration. -function MOVEMENT:OnBirth( Event ) - self:F( { Event } ) - - if timer.getTime0() < timer.getAbsTime() then -- dont need to add units spawned in at the start of the mission if mist is loaded in init line - if Event.IniDCSUnit then - self:T( "Birth object : " .. Event.IniDCSUnitName ) - if Event.IniDCSGroup and Event.IniDCSGroup:isExist() then - for MovePrefixID, MovePrefix in pairs( self.MovePrefixes ) do - if string.find( Event.IniDCSUnitName, MovePrefix, 1, true ) then - self.AliveUnits = self.AliveUnits + 1 - self.MoveUnits[Event.IniDCSUnitName] = Event.IniDCSGroupName - self:T( self.AliveUnits ) - end - end - end - end - _EVENTDISPATCHER:OnCrashForUnit( Event.IniDCSUnitName, self.OnDeadOrCrash, self ) - _EVENTDISPATCHER:OnDeadForUnit( Event.IniDCSUnitName, self.OnDeadOrCrash, self ) - end - -end - ---- Captures the Dead or Crash events when Units crash or are destroyed. --- @todo This method should become obsolete. The new @{DATABASE} class will handle the collection administration. -function MOVEMENT:OnDeadOrCrash( Event ) - self:F( { Event } ) - - if Event.IniDCSUnit then - self:T( "Dead object : " .. Event.IniDCSUnitName ) - for MovePrefixID, MovePrefix in pairs( self.MovePrefixes ) do - if string.find( Event.IniDCSUnitName, MovePrefix, 1, true ) then - self.AliveUnits = self.AliveUnits - 1 - self.MoveUnits[Event.IniDCSUnitName] = nil - self:T( self.AliveUnits ) - end - end - end -end - ---- This function is called automatically by the MOVEMENT scheduler. A new function is scheduled when MoveScheduled is true. -function MOVEMENT:_Scheduler() - self:F( { self.MovePrefixes, self.MoveMaximum, self.AliveUnits, self.MovementGroups } ) - - if self.AliveUnits > 0 then - local MoveProbability = ( self.MoveMaximum * 100 ) / self.AliveUnits - self:T( 'Move Probability = ' .. MoveProbability ) - - for MovementUnitName, MovementGroupName in pairs( self.MoveUnits ) do - local MovementGroup = Group.getByName( MovementGroupName ) - if MovementGroup and MovementGroup:isExist() then - local MoveOrStop = math.random( 1, 100 ) - self:T( 'MoveOrStop = ' .. MoveOrStop ) - if MoveOrStop <= MoveProbability then - self:T( 'Group continues moving = ' .. MovementGroupName ) - trigger.action.groupContinueMoving( MovementGroup ) - else - self:T( 'Group stops moving = ' .. MovementGroupName ) - trigger.action.groupStopMoving( MovementGroup ) - end - else - self.MoveUnits[MovementUnitName] = nil - end - end - end - return true -end ---- Provides defensive behaviour to a set of SAM sites within a running Mission. --- @module Sead --- @author to be searched on the forum --- @author (co) Flightcontrol (Modified and enriched with functionality) - ---- The SEAD class --- @type SEAD --- @extends Base#BASE -SEAD = { - ClassName = "SEAD", - TargetSkill = { - Average = { Evade = 50, DelayOff = { 10, 25 }, DelayOn = { 10, 30 } } , - Good = { Evade = 30, DelayOff = { 8, 20 }, DelayOn = { 20, 40 } } , - High = { Evade = 15, DelayOff = { 5, 17 }, DelayOn = { 30, 50 } } , - Excellent = { Evade = 10, DelayOff = { 3, 10 }, DelayOn = { 30, 60 } } - }, - SEADGroupPrefixes = {} -} - ---- Creates the main object which is handling defensive actions for SA sites or moving SA vehicles. --- When an anti radiation missile is fired (KH-58, KH-31P, KH-31A, KH-25MPU, HARM missiles), the SA will shut down their radars and will take evasive actions... --- Chances are big that the missile will miss. --- @param table{string,...}|string SEADGroupPrefixes which is a table of Prefixes of the SA Groups in the DCSRTE on which evasive actions need to be taken. --- @return SEAD --- @usage --- -- CCCP SEAD Defenses --- -- Defends the Russian SA installations from SEAD attacks. --- SEAD_RU_SAM_Defenses = SEAD:New( { 'RU SA-6 Kub', 'RU SA-6 Defenses', 'RU MI-26 Troops', 'RU Attack Gori' } ) -function SEAD:New( SEADGroupPrefixes ) - local self = BASE:Inherit( self, BASE:New() ) - self:F( SEADGroupPrefixes ) - if type( SEADGroupPrefixes ) == 'table' then - for SEADGroupPrefixID, SEADGroupPrefix in pairs( SEADGroupPrefixes ) do - self.SEADGroupPrefixes[SEADGroupPrefix] = SEADGroupPrefix - end - else - self.SEADGroupNames[SEADGroupPrefixes] = SEADGroupPrefixes - end - _EVENTDISPATCHER:OnShot( self.EventShot, self ) - - return self -end - ---- Detects if an SA site was shot with an anti radiation missile. In this case, take evasive actions based on the skill level set within the ME. --- @see SEAD -function SEAD:EventShot( Event ) - self:F( { Event } ) - - local SEADUnit = Event.IniDCSUnit - local SEADUnitName = Event.IniDCSUnitName - local SEADWeapon = Event.Weapon -- Identify the weapon fired - local SEADWeaponName = Event.WeaponName -- return weapon type - --trigger.action.outText( string.format("Alerte, depart missile " ..string.format(SEADWeaponName)), 20) --debug message - -- Start of the 2nd loop - self:T( "Missile Launched = " .. SEADWeaponName ) - if SEADWeaponName == "KH-58" or SEADWeaponName == "KH-25MPU" or SEADWeaponName == "AGM-88" or SEADWeaponName == "KH-31A" or SEADWeaponName == "KH-31P" then -- Check if the missile is a SEAD - local _evade = math.random (1,100) -- random number for chance of evading action - local _targetMim = Event.Weapon:getTarget() -- Identify target - local _targetMimname = Unit.getName(_targetMim) - local _targetMimgroup = Unit.getGroup(Weapon.getTarget(SEADWeapon)) - local _targetMimgroupName = _targetMimgroup:getName() - local _targetMimcont= _targetMimgroup:getController() - local _targetskill = _DATABASE.Templates.Units[_targetMimname].Template.skill - self:T( self.SEADGroupPrefixes ) - self:T( _targetMimgroupName ) - local SEADGroupFound = false - for SEADGroupPrefixID, SEADGroupPrefix in pairs( self.SEADGroupPrefixes ) do - if string.find( _targetMimgroupName, SEADGroupPrefix, 1, true ) then - SEADGroupFound = true - self:T( 'Group Found' ) - break - end - end - if SEADGroupFound == true then - if _targetskill == "Random" then -- when skill is random, choose a skill - local Skills = { "Average", "Good", "High", "Excellent" } - _targetskill = Skills[ math.random(1,4) ] - end - self:T( _targetskill ) -- debug message for skill check - if self.TargetSkill[_targetskill] then - if (_evade > self.TargetSkill[_targetskill].Evade) then - self:T( string.format("Evading, target skill " ..string.format(_targetskill)) ) --debug message - local _targetMim = Weapon.getTarget(SEADWeapon) - local _targetMimname = Unit.getName(_targetMim) - local _targetMimgroup = Unit.getGroup(Weapon.getTarget(SEADWeapon)) - local _targetMimcont= _targetMimgroup:getController() - routines.groupRandomDistSelf(_targetMimgroup,300,'Diamond',250,20) -- move randomly - local SuppressedGroups1 = {} -- unit suppressed radar off for a random time - local function SuppressionEnd1(id) - id.ctrl:setOption(AI.Option.Ground.id.ALARM_STATE,AI.Option.Ground.val.ALARM_STATE.GREEN) - SuppressedGroups1[id.groupName] = nil - end - local id = { - groupName = _targetMimgroup, - ctrl = _targetMimcont - } - local delay1 = math.random(self.TargetSkill[_targetskill].DelayOff[1], self.TargetSkill[_targetskill].DelayOff[2]) - if SuppressedGroups1[id.groupName] == nil then - SuppressedGroups1[id.groupName] = { - SuppressionEndTime1 = timer.getTime() + delay1, - SuppressionEndN1 = SuppressionEndCounter1 --Store instance of SuppressionEnd() scheduled function - } - Controller.setOption(_targetMimcont, AI.Option.Ground.id.ALARM_STATE,AI.Option.Ground.val.ALARM_STATE.GREEN) - timer.scheduleFunction(SuppressionEnd1, id, SuppressedGroups1[id.groupName].SuppressionEndTime1) --Schedule the SuppressionEnd() function - --trigger.action.outText( string.format("Radar Off " ..string.format(delay1)), 20) - end - - local SuppressedGroups = {} - local function SuppressionEnd(id) - id.ctrl:setOption(AI.Option.Ground.id.ALARM_STATE,AI.Option.Ground.val.ALARM_STATE.RED) - SuppressedGroups[id.groupName] = nil - end - local id = { - groupName = _targetMimgroup, - ctrl = _targetMimcont - } - local delay = math.random(self.TargetSkill[_targetskill].DelayOn[1], self.TargetSkill[_targetskill].DelayOn[2]) - if SuppressedGroups[id.groupName] == nil then - SuppressedGroups[id.groupName] = { - SuppressionEndTime = timer.getTime() + delay, - SuppressionEndN = SuppressionEndCounter --Store instance of SuppressionEnd() scheduled function - } - timer.scheduleFunction(SuppressionEnd, id, SuppressedGroups[id.groupName].SuppressionEndTime) --Schedule the SuppressionEnd() function - --trigger.action.outText( string.format("Radar On " ..string.format(delay)), 20) - end - end - end - end - end -end ---- Taking the lead of AI escorting your flight. --- --- @{#ESCORT} class --- ================ --- The @{#ESCORT} class allows you to interact with escorting AI on your flight and take the lead. --- Each escorting group can be commanded with a whole set of radio commands (radio menu in your flight, and then F10). --- --- The radio commands will vary according the category of the group. The richest set of commands are with Helicopters and AirPlanes. --- Ships and Ground troops will have a more limited set, but they can provide support through the bombing of targets designated by the other escorts. --- --- RADIO MENUs that can be created: --- ================================ --- Find a summary below of the current available commands: --- --- Navigation ...: --- --------------- --- Escort group navigation functions: --- --- * **"Join-Up and Follow at x meters":** The escort group fill follow you at about x meters, and they will follow you. --- * **"Flare":** Provides menu commands to let the escort group shoot a flare in the air in a color. --- * **"Smoke":** Provides menu commands to let the escort group smoke the air in a color. Note that smoking is only available for ground and naval troops. --- --- Hold position ...: --- ------------------ --- Escort group navigation functions: --- --- * **"At current location":** Stops the escort group and they will hover 30 meters above the ground at the position they stopped. --- * **"At client location":** Stops the escort group and they will hover 30 meters above the ground at the position they stopped. --- --- Report targets ...: --- ------------------- --- Report targets will make the escort group to report any target that it identifies within a 8km range. Any detected target can be attacked using the 4. Attack nearby targets function. (see below). --- --- * **"Report now":** Will report the current detected targets. --- * **"Report targets on":** Will make the escort group to report detected targets and will fill the "Attack nearby targets" menu list. --- * **"Report targets off":** Will stop detecting targets. --- --- Scan targets ...: --- ----------------- --- Menu items to pop-up the escort group for target scanning. After scanning, the escort group will resume with the mission or defined task. --- --- * **"Scan targets 30 seconds":** Scan 30 seconds for targets. --- * **"Scan targets 60 seconds":** Scan 60 seconds for targets. --- --- Attack targets ...: --- ------------------- --- This menu item will list all detected targets within a 15km range. Depending on the level of detection (known/unknown) and visuality, the targets type will also be listed. --- --- Request assistance from ...: --- ---------------------------- --- This menu item will list all detected targets within a 15km range, as with the menu item **Attack Targets**. --- This menu item allows to request attack support from other escorts supporting the current client group. --- eg. the function allows a player to request support from the Ship escort to attack a target identified by the Plane escort with its Tomahawk missiles. --- eg. the function allows a player to request support from other Planes escorting to bomb the unit with illumination missiles or bombs, so that the main plane escort can attack the area. --- --- ROE ...: --- -------- --- Sets the Rules of Engagement (ROE) of the escort group when in flight. --- --- * **"Hold Fire":** The escort group will hold fire. --- * **"Return Fire":** The escort group will return fire. --- * **"Open Fire":** The escort group will open fire on designated targets. --- * **"Weapon Free":** The escort group will engage with any target. --- --- Evasion ...: --- ------------ --- Will define the evasion techniques that the escort group will perform during flight or combat. --- --- * **"Fight until death":** The escort group will have no reaction to threats. --- * **"Use flares, chaff and jammers":** The escort group will use passive defense using flares and jammers. No evasive manoeuvres are executed. --- * **"Evade enemy fire":** The rescort group will evade enemy fire before firing. --- * **"Go below radar and evade fire":** The escort group will perform evasive vertical manoeuvres. --- --- Resume Mission ...: --- ------------------- --- Escort groups can have their own mission. This menu item will allow the escort group to resume their Mission from a given waypoint. --- Note that this is really fantastic, as you now have the dynamic of taking control of the escort groups, and allowing them to resume their path or mission. --- --- ESCORT construction methods. --- ============================ --- Create a new SPAWN object with the @{#ESCORT.New} method: --- --- * @{#ESCORT.New}: Creates a new ESCORT object from a @{Group#GROUP} for a @{Client#CLIENT}, with an optional briefing text. --- --- ESCORT initialization methods. --- ============================== --- The following menus are created within the RADIO MENU of an active unit hosted by a player: --- --- * @{#ESCORT.MenuFollowAt}: Creates a menu to make the escort follow the client. --- * @{#ESCORT.MenuHoldAtEscortPosition}: Creates a menu to hold the escort at its current position. --- * @{#ESCORT.MenuHoldAtLeaderPosition}: Creates a menu to hold the escort at the client position. --- * @{#ESCORT.MenuScanForTargets}: Creates a menu so that the escort scans targets. --- * @{#ESCORT.MenuFlare}: Creates a menu to disperse flares. --- * @{#ESCORT.MenuSmoke}: Creates a menu to disparse smoke. --- * @{#ESCORT.MenuReportTargets}: Creates a menu so that the escort reports targets. --- * @{#ESCORT.MenuReportPosition}: Creates a menu so that the escort reports its current position from bullseye. --- * @{#ESCORT.MenuAssistedAttack: Creates a menu so that the escort supportes assisted attack from other escorts with the client. --- * @{#ESCORT.MenuROE: Creates a menu structure to set the rules of engagement of the escort. --- * @{#ESCORT.MenuEvasion: Creates a menu structure to set the evasion techniques when the escort is under threat. --- * @{#ESCORT.MenuResumeMission}: Creates a menu structure so that the escort can resume from a waypoint. --- --- @module Escort --- @author FlightControl - - - - - - - ---- --- @type ESCORT --- @extends Base#BASE --- @field Client#CLIENT EscortClient --- @field Group#GROUP EscortGroup --- @field #string EscortName --- @field #ESCORT.MODE EscortMode The mode the escort is in. --- @field #number FollowScheduler The id of the _FollowScheduler function. --- @field #boolean ReportTargets If true, nearby targets are reported. --- @Field DCSTypes#AI.Option.Air.val.ROE OptionROE Which ROE is set to the EscortGroup. --- @field DCSTypes#AI.Option.Air.val.REACTION_ON_THREAT OptionReactionOnThreat Which REACTION_ON_THREAT is set to the EscortGroup. --- @field Menu#MENU_CLIENT EscortMenuResumeMission -ESCORT = { - ClassName = "ESCORT", - EscortName = nil, -- The Escort Name - EscortClient = nil, - EscortGroup = nil, - EscortMode = nil, - MODE = { - FOLLOW = 1, - MISSION = 2, - }, - Targets = {}, -- The identified targets - FollowScheduler = nil, - ReportTargets = true, - OptionROE = AI.Option.Air.val.ROE.OPEN_FIRE, - OptionReactionOnThreat = AI.Option.Air.val.REACTION_ON_THREAT.ALLOW_ABORT_MISSION, - TaskPoints = {} -} - ---- ESCORT.Mode class --- @type ESCORT.MODE --- @field #number FOLLOW --- @field #number MISSION - ---- MENUPARAM type --- @type MENUPARAM --- @field #ESCORT ParamSelf --- @field #Distance ParamDistance --- @field #function ParamFunction --- @field #string ParamMessage - ---- ESCORT class constructor for an AI group --- @param #ESCORT self --- @param Client#CLIENT EscortClient The client escorted by the EscortGroup. --- @param Group#GROUP EscortGroup The group AI escorting the EscortClient. --- @param #string EscortName Name of the escort. --- @return #ESCORT self -function ESCORT:New( EscortClient, EscortGroup, EscortName, EscortBriefing ) - local self = BASE:Inherit( self, BASE:New() ) - self:F( { EscortClient, EscortGroup, EscortName } ) - - self.EscortClient = EscortClient -- Client#CLIENT - self.EscortGroup = EscortGroup -- Group#GROUP - self.EscortName = EscortName - self.EscortBriefing = EscortBriefing - - self:T( EscortGroup:GetClassNameAndID() ) - - -- Set EscortGroup known at EscortClient. - if not self.EscortClient._EscortGroups then - self.EscortClient._EscortGroups = {} - end - - if not self.EscortClient._EscortGroups[EscortGroup:GetName()] then - self.EscortClient._EscortGroups[EscortGroup:GetName()] = {} - self.EscortClient._EscortGroups[EscortGroup:GetName()].EscortGroup = self.EscortGroup - self.EscortClient._EscortGroups[EscortGroup:GetName()].EscortName = self.EscortName - self.EscortClient._EscortGroups[EscortGroup:GetName()].Targets = {} - self.EscortMode = ESCORT.MODE.FOLLOW - end - - - self.EscortMenu = MENU_CLIENT:New( self.EscortClient, self.EscortName ) - - self.EscortGroup:WayPointInitialize(1) - - self.EscortGroup:OptionROTVertical() - self.EscortGroup:OptionROEOpenFire() - - EscortGroup:MessageToClient( EscortGroup:GetCategoryName() .. " '" .. EscortName .. "' (" .. EscortGroup:GetCallsign() .. ") reporting! " .. - "We're escorting your flight. " .. - "Use the Radio Menu and F10 and use the options under + " .. EscortName .. "\n", - 60, EscortClient - ) - - return self -end - - ---- Defines the default menus --- @param #ESCORT self --- @return #ESCORT -function ESCORT:Menus() - self:F() - - self:MenuFollowAt( 100 ) - self:MenuFollowAt( 200 ) - self:MenuFollowAt( 300 ) - self:MenuFollowAt( 400 ) - - self:MenuScanForTargets( 100, 60 ) - - self:MenuHoldAtEscortPosition( 30 ) - self:MenuHoldAtLeaderPosition( 30 ) - - self:MenuFlare() - self:MenuSmoke() - - self:MenuReportTargets( 60 ) - self:MenuAssistedAttack() - self:MenuROE() - self:MenuEvasion() - self:MenuResumeMission() - - return self -end - - - ---- Defines a menu slot to let the escort Join and Follow you at a certain distance. --- This menu will appear under **Navigation**. --- @param #ESCORT self --- @param DCSTypes#Distance Distance The distance in meters that the escort needs to follow the client. --- @return #ESCORT -function ESCORT:MenuFollowAt( Distance ) - self:F(Distance) - - if self.EscortGroup:IsAir() then - if not self.EscortMenuReportNavigation then - self.EscortMenuReportNavigation = MENU_CLIENT:New( self.EscortClient, "Navigation", self.EscortMenu ) - end - - if not self.EscortMenuJoinUpAndFollow then - self.EscortMenuJoinUpAndFollow = {} - end - - self.EscortMenuJoinUpAndFollow[#self.EscortMenuJoinUpAndFollow+1] = MENU_CLIENT_COMMAND:New( self.EscortClient, "Join-Up and Follow at " .. Distance, self.EscortMenuReportNavigation, ESCORT._JoinUpAndFollow, { ParamSelf = self, ParamDistance = Distance } ) - - self.EscortMode = ESCORT.MODE.FOLLOW - end - - return self -end - ---- Defines a menu slot to let the escort hold at their current position and stay low with a specified height during a specified time in seconds. --- This menu will appear under **Hold position**. --- @param #ESCORT self --- @param DCSTypes#Distance Height Optional parameter that sets the height in meters to let the escort orbit at the current location. The default value is 30 meters. --- @param DCSTypes#Time Seconds Optional parameter that lets the escort orbit at the current position for a specified time. (not implemented yet). The default value is 0 seconds, meaning, that the escort will orbit forever until a sequent command is given. --- @param #string MenuTextFormat Optional parameter that shows the menu option text. The text string is formatted, and should contain two %d tokens in the string. The first for the Height, the second for the Time (if given). If no text is given, the default text will be displayed. --- @return #ESCORT --- TODO: Implement Seconds parameter. Challenge is to first develop the "continue from last activity" function. -function ESCORT:MenuHoldAtEscortPosition( Height, Seconds, MenuTextFormat ) - self:F( { Height, Seconds, MenuTextFormat } ) - - if self.EscortGroup:IsAir() then - - if not self.EscortMenuHold then - self.EscortMenuHold = MENU_CLIENT:New( self.EscortClient, "Hold position", self.EscortMenu ) - end - - if not Height then - Height = 30 - end - - if not Seconds then - Seconds = 0 - end - - local MenuText = "" - if not MenuTextFormat then - if Seconds == 0 then - MenuText = string.format( "Hold at %d meter", Height ) - else - MenuText = string.format( "Hold at %d meter for %d seconds", Height, Seconds ) - end - else - if Seconds == 0 then - MenuText = string.format( MenuTextFormat, Height ) - else - MenuText = string.format( MenuTextFormat, Height, Seconds ) - end - end - - if not self.EscortMenuHoldPosition then - self.EscortMenuHoldPosition = {} - end - - self.EscortMenuHoldPosition[#self.EscortMenuHoldPosition+1] = MENU_CLIENT_COMMAND - :New( - self.EscortClient, - MenuText, - self.EscortMenuHold, - ESCORT._HoldPosition, - { ParamSelf = self, - ParamOrbitGroup = self.EscortGroup, - ParamHeight = Height, - ParamSeconds = Seconds - } - ) - end - - return self -end - - ---- Defines a menu slot to let the escort hold at the client position and stay low with a specified height during a specified time in seconds. --- This menu will appear under **Navigation**. --- @param #ESCORT self --- @param DCSTypes#Distance Height Optional parameter that sets the height in meters to let the escort orbit at the current location. The default value is 30 meters. --- @param DCSTypes#Time Seconds Optional parameter that lets the escort orbit at the current position for a specified time. (not implemented yet). The default value is 0 seconds, meaning, that the escort will orbit forever until a sequent command is given. --- @param #string MenuTextFormat Optional parameter that shows the menu option text. The text string is formatted, and should contain one or two %d tokens in the string. The first for the Height, the second for the Time (if given). If no text is given, the default text will be displayed. --- @return #ESCORT --- TODO: Implement Seconds parameter. Challenge is to first develop the "continue from last activity" function. -function ESCORT:MenuHoldAtLeaderPosition( Height, Seconds, MenuTextFormat ) - self:F( { Height, Seconds, MenuTextFormat } ) - - if self.EscortGroup:IsAir() then - - if not self.EscortMenuHold then - self.EscortMenuHold = MENU_CLIENT:New( self.EscortClient, "Hold position", self.EscortMenu ) - end - - if not Height then - Height = 30 - end - - if not Seconds then - Seconds = 0 - end - - local MenuText = "" - if not MenuTextFormat then - if Seconds == 0 then - MenuText = string.format( "Rejoin and hold at %d meter", Height ) - else - MenuText = string.format( "Rejoin and hold at %d meter for %d seconds", Height, Seconds ) - end - else - if Seconds == 0 then - MenuText = string.format( MenuTextFormat, Height ) - else - MenuText = string.format( MenuTextFormat, Height, Seconds ) - end - end - - if not self.EscortMenuHoldAtLeaderPosition then - self.EscortMenuHoldAtLeaderPosition = {} - end - - self.EscortMenuHoldAtLeaderPosition[#self.EscortMenuHoldAtLeaderPosition+1] = MENU_CLIENT_COMMAND - :New( - self.EscortClient, - MenuText, - self.EscortMenuHold, - ESCORT._HoldPosition, - { ParamSelf = self, - ParamOrbitGroup = self.EscortClient, - ParamHeight = Height, - ParamSeconds = Seconds - } - ) - end - - return self -end - ---- Defines a menu slot to let the escort scan for targets at a certain height for a certain time in seconds. --- This menu will appear under **Scan targets**. --- @param #ESCORT self --- @param DCSTypes#Distance Height Optional parameter that sets the height in meters to let the escort orbit at the current location. The default value is 30 meters. --- @param DCSTypes#Time Seconds Optional parameter that lets the escort orbit at the current position for a specified time. (not implemented yet). The default value is 0 seconds, meaning, that the escort will orbit forever until a sequent command is given. --- @param #string MenuTextFormat Optional parameter that shows the menu option text. The text string is formatted, and should contain one or two %d tokens in the string. The first for the Height, the second for the Time (if given). If no text is given, the default text will be displayed. --- @return #ESCORT -function ESCORT:MenuScanForTargets( Height, Seconds, MenuTextFormat ) - self:F( { Height, Seconds, MenuTextFormat } ) - - if self.EscortGroup:IsAir() then - if not self.EscortMenuScan then - self.EscortMenuScan = MENU_CLIENT:New( self.EscortClient, "Scan for targets", self.EscortMenu ) - end - - if not Height then - Height = 100 - end - - if not Seconds then - Seconds = 30 - end - - local MenuText = "" - if not MenuTextFormat then - if Seconds == 0 then - MenuText = string.format( "At %d meter", Height ) - else - MenuText = string.format( "At %d meter for %d seconds", Height, Seconds ) - end - else - if Seconds == 0 then - MenuText = string.format( MenuTextFormat, Height ) - else - MenuText = string.format( MenuTextFormat, Height, Seconds ) - end - end - - if not self.EscortMenuScanForTargets then - self.EscortMenuScanForTargets = {} - end - - self.EscortMenuScanForTargets[#self.EscortMenuScanForTargets+1] = MENU_CLIENT_COMMAND - :New( - self.EscortClient, - MenuText, - self.EscortMenuScan, - ESCORT._ScanTargets, - { ParamSelf = self, - ParamScanDuration = 30 - } - ) - end - - return self -end - - - ---- Defines a menu slot to let the escort disperse a flare in a certain color. --- This menu will appear under **Navigation**. --- The flare will be fired from the first unit in the group. --- @param #ESCORT self --- @param #string MenuTextFormat Optional parameter that shows the menu option text. If no text is given, the default text will be displayed. --- @return #ESCORT -function ESCORT:MenuFlare( MenuTextFormat ) - self:F() - - if not self.EscortMenuReportNavigation then - self.EscortMenuReportNavigation = MENU_CLIENT:New( self.EscortClient, "Navigation", self.EscortMenu ) - end - - local MenuText = "" - if not MenuTextFormat then - MenuText = "Flare" - else - MenuText = MenuTextFormat - end - - if not self.EscortMenuFlare then - self.EscortMenuFlare = MENU_CLIENT:New( self.EscortClient, MenuText, self.EscortMenuReportNavigation, ESCORT._Flare, { ParamSelf = self } ) - self.EscortMenuFlareGreen = MENU_CLIENT_COMMAND:New( self.EscortClient, "Release green flare", self.EscortMenuFlare, ESCORT._Flare, { ParamSelf = self, ParamColor = UNIT.FlareColor.Green, ParamMessage = "Released a green flare!" } ) - self.EscortMenuFlareRed = MENU_CLIENT_COMMAND:New( self.EscortClient, "Release red flare", self.EscortMenuFlare, ESCORT._Flare, { ParamSelf = self, ParamColor = UNIT.FlareColor.Red, ParamMessage = "Released a red flare!" } ) - self.EscortMenuFlareWhite = MENU_CLIENT_COMMAND:New( self.EscortClient, "Release white flare", self.EscortMenuFlare, ESCORT._Flare, { ParamSelf = self, ParamColor = UNIT.FlareColor.White, ParamMessage = "Released a white flare!" } ) - self.EscortMenuFlareYellow = MENU_CLIENT_COMMAND:New( self.EscortClient, "Release yellow flare", self.EscortMenuFlare, ESCORT._Flare, { ParamSelf = self, ParamColor = UNIT.FlareColor.Yellow, ParamMessage = "Released a yellow flare!" } ) - end - - return self -end - ---- Defines a menu slot to let the escort disperse a smoke in a certain color. --- This menu will appear under **Navigation**. --- Note that smoke menu options will only be displayed for ships and ground units. Not for air units. --- The smoke will be fired from the first unit in the group. --- @param #ESCORT self --- @param #string MenuTextFormat Optional parameter that shows the menu option text. If no text is given, the default text will be displayed. --- @return #ESCORT -function ESCORT:MenuSmoke( MenuTextFormat ) - self:F() - - if not self.EscortGroup:IsAir() then - if not self.EscortMenuReportNavigation then - self.EscortMenuReportNavigation = MENU_CLIENT:New( self.EscortClient, "Navigation", self.EscortMenu ) - end - - local MenuText = "" - if not MenuTextFormat then - MenuText = "Smoke" - else - MenuText = MenuTextFormat - end - - if not self.EscortMenuSmoke then - self.EscortMenuSmoke = MENU_CLIENT:New( self.EscortClient, "Smoke", self.EscortMenuReportNavigation, ESCORT._Smoke, { ParamSelf = self } ) - self.EscortMenuSmokeGreen = MENU_CLIENT_COMMAND:New( self.EscortClient, "Release green smoke", self.EscortMenuSmoke, ESCORT._Smoke, { ParamSelf = self, ParamColor = UNIT.SmokeColor.Green, ParamMessage = "Releasing green smoke!" } ) - self.EscortMenuSmokeRed = MENU_CLIENT_COMMAND:New( self.EscortClient, "Release red smoke", self.EscortMenuSmoke, ESCORT._Smoke, { ParamSelf = self, ParamColor = UNIT.SmokeColor.Red, ParamMessage = "Releasing red smoke!" } ) - self.EscortMenuSmokeWhite = MENU_CLIENT_COMMAND:New( self.EscortClient, "Release white smoke", self.EscortMenuSmoke, ESCORT._Smoke, { ParamSelf = self, ParamColor = UNIT.SmokeColor.White, ParamMessage = "Releasing white smoke!" } ) - self.EscortMenuSmokeOrange = MENU_CLIENT_COMMAND:New( self.EscortClient, "Release orange smoke", self.EscortMenuSmoke, ESCORT._Smoke, { ParamSelf = self, ParamColor = UNIT.SmokeColor.Orange, ParamMessage = "Releasing orange smoke!" } ) - self.EscortMenuSmokeBlue = MENU_CLIENT_COMMAND:New( self.EscortClient, "Release blue smoke", self.EscortMenuSmoke, ESCORT._Smoke, { ParamSelf = self, ParamColor = UNIT.SmokeColor.Blue, ParamMessage = "Releasing blue smoke!" } ) - end - end - - return self -end - ---- Defines a menu slot to let the escort report their current detected targets with a specified time interval in seconds. --- This menu will appear under **Report targets**. --- Note that if a report targets menu is not specified, no targets will be detected by the escort, and the attack and assisted attack menus will not be displayed. --- @param #ESCORT self --- @param DCSTypes#Time Seconds Optional parameter that lets the escort report their current detected targets after specified time interval in seconds. The default time is 30 seconds. --- @return #ESCORT -function ESCORT:MenuReportTargets( Seconds ) - self:F( { Seconds } ) - - if not self.EscortMenuReportNearbyTargets then - self.EscortMenuReportNearbyTargets = MENU_CLIENT:New( self.EscortClient, "Report targets", self.EscortMenu ) - end - - if not Seconds then - Seconds = 30 - end - - -- Report Targets - self.EscortMenuReportNearbyTargetsNow = MENU_CLIENT_COMMAND:New( self.EscortClient, "Report targets now!", self.EscortMenuReportNearbyTargets, ESCORT._ReportNearbyTargetsNow, { ParamSelf = self } ) - self.EscortMenuReportNearbyTargetsOn = MENU_CLIENT_COMMAND:New( self.EscortClient, "Report targets on", self.EscortMenuReportNearbyTargets, ESCORT._SwitchReportNearbyTargets, { ParamSelf = self, ParamReportTargets = true } ) - self.EscortMenuReportNearbyTargetsOff = MENU_CLIENT_COMMAND:New( self.EscortClient, "Report targets off", self.EscortMenuReportNearbyTargets, ESCORT._SwitchReportNearbyTargets, { ParamSelf = self, ParamReportTargets = false, } ) - - -- Attack Targets - self.EscortMenuAttackNearbyTargets = MENU_CLIENT:New( self.EscortClient, "Attack targets", self.EscortMenu ) - - - --self.ReportTargetsScheduler = routines.scheduleFunction( self._ReportTargetsScheduler, { self }, timer.getTime() + 1, Seconds ) - self.ReportTargetsScheduler = SCHEDULER:New( self, self._ReportTargetsScheduler, {}, 1, Seconds ) - - return self -end - ---- Defines a menu slot to let the escort attack its detected targets using assisted attack from another escort joined also with the client. --- This menu will appear under **Request assistance from**. --- Note that this method needs to be preceded with the method MenuReportTargets. --- @param #ESCORT self --- @return #ESCORT -function ESCORT:MenuAssistedAttack() - self:F() - - -- Request assistance from other escorts. - -- This is very useful to let f.e. an escorting ship attack a target detected by an escorting plane... - self.EscortMenuTargetAssistance = MENU_CLIENT:New( self.EscortClient, "Request assistance from", self.EscortMenu ) - - return self -end - ---- Defines a menu to let the escort set its rules of engagement. --- All rules of engagement will appear under the menu **ROE**. --- @param #ESCORT self --- @return #ESCORT -function ESCORT:MenuROE( MenuTextFormat ) - self:F( MenuTextFormat ) - - if not self.EscortMenuROE then - -- Rules of Engagement - self.EscortMenuROE = MENU_CLIENT:New( self.EscortClient, "ROE", self.EscortMenu ) - if self.EscortGroup:OptionROEHoldFirePossible() then - self.EscortMenuROEHoldFire = MENU_CLIENT_COMMAND:New( self.EscortClient, "Hold Fire", self.EscortMenuROE, ESCORT._ROE, { ParamSelf = self, ParamFunction = self.EscortGroup:OptionROEHoldFire(), ParamMessage = "Holding weapons!" } ) - end - if self.EscortGroup:OptionROEReturnFirePossible() then - self.EscortMenuROEReturnFire = MENU_CLIENT_COMMAND:New( self.EscortClient, "Return Fire", self.EscortMenuROE, ESCORT._ROE, { ParamSelf = self, ParamFunction = self.EscortGroup:OptionROEReturnFire(), ParamMessage = "Returning fire!" } ) - end - if self.EscortGroup:OptionROEOpenFirePossible() then - self.EscortMenuROEOpenFire = MENU_CLIENT_COMMAND:New( self.EscortClient, "Open Fire", self.EscortMenuROE, ESCORT._ROE, { ParamSelf = self, ParamFunction = self.EscortGroup:OptionROEOpenFire(), ParamMessage = "Opening fire on designated targets!!" } ) - end - if self.EscortGroup:OptionROEWeaponFreePossible() then - self.EscortMenuROEWeaponFree = MENU_CLIENT_COMMAND:New( self.EscortClient, "Weapon Free", self.EscortMenuROE, ESCORT._ROE, { ParamSelf = self, ParamFunction = self.EscortGroup:OptionROEWeaponFree(), ParamMessage = "Opening fire on targets of opportunity!" } ) - end - end - - return self -end - - ---- Defines a menu to let the escort set its evasion when under threat. --- All rules of engagement will appear under the menu **Evasion**. --- @param #ESCORT self --- @return #ESCORT -function ESCORT:MenuEvasion( MenuTextFormat ) - self:F( MenuTextFormat ) - - if self.EscortGroup:IsAir() then - if not self.EscortMenuEvasion then - -- Reaction to Threats - self.EscortMenuEvasion = MENU_CLIENT:New( self.EscortClient, "Evasion", self.EscortMenu ) - if self.EscortGroup:OptionROTNoReactionPossible() then - self.EscortMenuEvasionNoReaction = MENU_CLIENT_COMMAND:New( self.EscortClient, "Fight until death", self.EscortMenuEvasion, ESCORT._ROT, { ParamSelf = self, ParamFunction = self.EscortGroup:OptionROTNoReaction(), ParamMessage = "Fighting until death!" } ) - end - if self.EscortGroup:OptionROTPassiveDefensePossible() then - self.EscortMenuEvasionPassiveDefense = MENU_CLIENT_COMMAND:New( self.EscortClient, "Use flares, chaff and jammers", self.EscortMenuEvasion, ESCORT._ROT, { ParamSelf = self, ParamFunction = self.EscortGroup:OptionROTPassiveDefense(), ParamMessage = "Defending using jammers, chaff and flares!" } ) - end - if self.EscortGroup:OptionROTEvadeFirePossible() then - self.EscortMenuEvasionEvadeFire = MENU_CLIENT_COMMAND:New( self.EscortClient, "Evade enemy fire", self.EscortMenuEvasion, ESCORT._ROT, { ParamSelf = self, ParamFunction = self.EscortGroup:OptionROTEvadeFire(), ParamMessage = "Evading on enemy fire!" } ) - end - if self.EscortGroup:OptionROTVerticalPossible() then - self.EscortMenuOptionEvasionVertical = MENU_CLIENT_COMMAND:New( self.EscortClient, "Go below radar and evade fire", self.EscortMenuEvasion, ESCORT._ROT, { ParamSelf = self, ParamFunction = self.EscortGroup:OptionROTVertical(), ParamMessage = "Evading on enemy fire with vertical manoeuvres!" } ) - end - end - end - - return self -end - ---- Defines a menu to let the escort resume its mission from a waypoint on its route. --- All rules of engagement will appear under the menu **Resume mission from**. --- @param #ESCORT self --- @return #ESCORT -function ESCORT:MenuResumeMission() - self:F() - - if not self.EscortMenuResumeMission then - -- Mission Resume Menu Root - self.EscortMenuResumeMission = MENU_CLIENT:New( self.EscortClient, "Resume mission from", self.EscortMenu ) - end - - return self -end - - ---- @param #MENUPARAM MenuParam -function ESCORT._HoldPosition( MenuParam ) - - local self = MenuParam.ParamSelf - local EscortGroup = self.EscortGroup - local EscortClient = self.EscortClient - - local OrbitGroup = MenuParam.ParamOrbitGroup -- Group#GROUP - local OrbitUnit = OrbitGroup:GetUnit(1) -- Unit#UNIT - local OrbitHeight = MenuParam.ParamHeight - local OrbitSeconds = MenuParam.ParamSeconds -- Not implemented yet - - routines.removeFunction( self.FollowScheduler ) - - local PointFrom = {} - local GroupPoint = EscortGroup:GetUnit(1):GetPointVec3() - PointFrom = {} - PointFrom.x = GroupPoint.x - PointFrom.y = GroupPoint.z - PointFrom.speed = 250 - PointFrom.type = AI.Task.WaypointType.TURNING_POINT - PointFrom.alt = GroupPoint.y - PointFrom.alt_type = AI.Task.AltitudeType.BARO - - local OrbitPoint = OrbitUnit:GetPointVec2() - local PointTo = {} - PointTo.x = OrbitPoint.x - PointTo.y = OrbitPoint.y - PointTo.speed = 250 - PointTo.type = AI.Task.WaypointType.TURNING_POINT - PointTo.alt = OrbitHeight - PointTo.alt_type = AI.Task.AltitudeType.BARO - PointTo.task = EscortGroup:TaskOrbitCircleAtVec2( OrbitPoint, OrbitHeight, 0 ) - - local Points = { PointFrom, PointTo } - - EscortGroup:OptionROEHoldFire() - EscortGroup:OptionROTPassiveDefense() - - EscortGroup:SetTask( EscortGroup:TaskRoute( Points ) ) - EscortGroup:MessageToClient( "Orbiting at location.", 10, EscortClient ) -end - ---- @param #MENUPARAM MenuParam -function ESCORT._JoinUpAndFollow( MenuParam ) - - local self = MenuParam.ParamSelf - local EscortGroup = self.EscortGroup - local EscortClient = self.EscortClient - - self.Distance = MenuParam.ParamDistance - - self:JoinUpAndFollow( EscortGroup, EscortClient, self.Distance ) -end - ---- JoinsUp and Follows a CLIENT. --- @param Escort#ESCORT self --- @param Group#GROUP EscortGroup --- @param Client#CLIENT EscortClient --- @param DCSTypes#Distance Distance -function ESCORT:JoinUpAndFollow( EscortGroup, EscortClient, Distance ) - self:F( { EscortGroup, EscortClient, Distance } ) - - if self.FollowScheduler then - routines.removeFunction( self.FollowScheduler ) - end - - EscortGroup:OptionROEHoldFire() - EscortGroup:OptionROTPassiveDefense() - - self.EscortMode = ESCORT.MODE.FOLLOW - - self.CT1 = 0 - self.GT1 = 0 - --self.FollowScheduler = routines.scheduleFunction( self._FollowScheduler, { self, Distance }, timer.getTime() + 1, .5 ) - self.FollowScheduler = SCHEDULER:New( self, self._FollowScheduler, { Distance }, 1, .5, .1 ) - EscortGroup:MessageToClient( "Rejoining and Following at " .. Distance .. "!", 30, EscortClient ) -end - ---- @param #MENUPARAM MenuParam -function ESCORT._Flare( MenuParam ) - - local self = MenuParam.ParamSelf - local EscortGroup = self.EscortGroup - local EscortClient = self.EscortClient - - local Color = MenuParam.ParamColor - local Message = MenuParam.ParamMessage - - EscortGroup:GetUnit(1):Flare( Color ) - EscortGroup:MessageToClient( Message, 10, EscortClient ) -end - ---- @param #MENUPARAM MenuParam -function ESCORT._Smoke( MenuParam ) - - local self = MenuParam.ParamSelf - local EscortGroup = self.EscortGroup - local EscortClient = self.EscortClient - - local Color = MenuParam.ParamColor - local Message = MenuParam.ParamMessage - - EscortGroup:GetUnit(1):Smoke( Color ) - EscortGroup:MessageToClient( Message, 10, EscortClient ) -end - - ---- @param #MENUPARAM MenuParam -function ESCORT._ReportNearbyTargetsNow( MenuParam ) - - local self = MenuParam.ParamSelf - local EscortGroup = self.EscortGroup - local EscortClient = self.EscortClient - - self:_ReportTargetsScheduler() - -end - -function ESCORT._SwitchReportNearbyTargets( MenuParam ) - - local self = MenuParam.ParamSelf - local EscortGroup = self.EscortGroup - local EscortClient = self.EscortClient - - self.ReportTargets = MenuParam.ParamReportTargets - - if self.ReportTargets then - if not self.ReportTargetsScheduler then - --self.ReportTargetsScheduler = routines.scheduleFunction( self._ReportTargetsScheduler, { self }, timer.getTime() + 1, 30 ) - self.ReportTargetsScheduler = SCHEDULER:New( self, self._ReportTargetsScheduler, {}, 1, 30 ) - end - else - routines.removeFunction( self.ReportTargetsScheduler ) - self.ReportTargetsScheduler = nil - end -end - ---- @param #MENUPARAM MenuParam -function ESCORT._ScanTargets( MenuParam ) - - local self = MenuParam.ParamSelf - local EscortGroup = self.EscortGroup - local EscortClient = self.EscortClient - - local ScanDuration = MenuParam.ParamScanDuration - - if self.FollowScheduler then - routines.removeFunction( self.FollowScheduler ) - end - - self:T( { "FollowScheduler after removefunction: ", self.FollowScheduler } ) - - if EscortGroup:IsHelicopter() then - SCHEDULER:New( EscortGroup, EscortGroup.PushTask, - { EscortGroup:TaskControlled( - EscortGroup:TaskOrbitCircle( 200, 20 ), - EscortGroup:TaskCondition( nil, nil, nil, nil, ScanDuration, nil ) - ) - }, - 1 - ) - elseif EscortGroup:IsAirPlane() then - SCHEDULER:New( EscortGroup, EscortGroup.PushTask, - { EscortGroup:TaskControlled( - EscortGroup:TaskOrbitCircle( 1000, 500 ), - EscortGroup:TaskCondition( nil, nil, nil, nil, ScanDuration, nil ) - ) - }, - 1 - ) - end - - EscortGroup:MessageToClient( "Scanning targets for " .. ScanDuration .. " seconds.", ScanDuration, EscortClient ) - - if self.EscortMode == ESCORT.MODE.FOLLOW then - --self.FollowScheduler = routines.scheduleFunction( self._FollowScheduler, { self, Distance }, timer.getTime() + ScanDuration, 1 ) - self.FollowScheduler:Start() - end - -end - -function _Resume( EscortGroup ) - env.info( '_Resume' ) - - local Escort = EscortGroup.Escort -- #ESCORT - env.info( "EscortMode = " .. Escort.EscortMode ) - if Escort.EscortMode == ESCORT.MODE.FOLLOW then - Escort:JoinUpAndFollow( EscortGroup, Escort.EscortClient, Escort.Distance ) - end - -end - ---- @param #MENUPARAM MenuParam -function ESCORT._AttackTarget( MenuParam ) - - local self = MenuParam.ParamSelf - local EscortGroup = self.EscortGroup - local EscortClient = self.EscortClient - local AttackUnit = MenuParam.ParamUnit -- Unit#UNIT - - if self.FollowScheduler then - routines.removeFunction( self.FollowScheduler ) - end - - self:T( AttackUnit ) - - if EscortGroup:IsAir() then - EscortGroup:OptionROEOpenFire() - EscortGroup:OptionROTPassiveDefense() - EscortGroup.Escort = self -- Need to do this trick to get the reference for the escort in the _Resume function. --- routines.scheduleFunction( --- EscortGroup.PushTask, --- { EscortGroup, --- EscortGroup:TaskCombo( --- { EscortGroup:TaskAttackUnit( AttackUnit ), --- EscortGroup:TaskFunction( 1, 2, "_Resume", {"''"} ) --- } --- ) --- }, timer.getTime() + 10 --- ) - SCHEDULER:New( EscortGroup, - EscortGroup.PushTask, - { EscortGroup:TaskCombo( - { EscortGroup:TaskAttackUnit( AttackUnit ), - EscortGroup:TaskFunction( 1, 2, "_Resume", {"''"} ) - } - ) - }, 10 - ) - else --- routines.scheduleFunction( --- EscortGroup.PushTask, --- { EscortGroup, --- EscortGroup:TaskCombo( --- { EscortGroup:TaskFireAtPoint( AttackUnit:GetPointVec2(), 50 ) --- } --- ) --- }, timer.getTime() + 10 --- ) - SCHEDULER:New( EscortGroup, - EscortGroup.PushTask, - { EscortGroup:TaskCombo( - { EscortGroup:TaskFireAtPoint( AttackUnit:GetPointVec2(), 50 ) - } - ) - }, 10 - ) - end - EscortGroup:MessageToClient( "Engaging Designated Unit!", 10, EscortClient ) - - -end - ---- @param #MENUPARAM MenuParam -function ESCORT._AssistTarget( MenuParam ) - - local self = MenuParam.ParamSelf - local EscortGroup = self.EscortGroup - local EscortClient = self.EscortClient - local EscortGroupAttack = MenuParam.ParamEscortGroup - local AttackUnit = MenuParam.ParamUnit -- Unit#UNIT - - if self.FollowScheduler then - routines.removeFunction( self.FollowScheduler ) - end - - - self:T( AttackUnit ) - - if EscortGroupAttack:IsAir() then - EscortGroupAttack:OptionROEOpenFire() - EscortGroupAttack:OptionROTVertical() --- routines.scheduleFunction( --- EscortGroupAttack.PushTask, --- { EscortGroupAttack, --- EscortGroupAttack:TaskCombo( --- { EscortGroupAttack:TaskAttackUnit( AttackUnit ), --- EscortGroupAttack:TaskOrbitCircle( 500, 350 ) --- } --- ) --- }, timer.getTime() + 10 --- ) - SCHDULER:New( EscortGroupAttack, - EscortGroupAttack.PushTask, - { EscortGroupAttack:TaskCombo( - { EscortGroupAttack:TaskAttackUnit( AttackUnit ), - EscortGroupAttack:TaskOrbitCircle( 500, 350 ) - } - ) - }, 10 - ) - else --- routines.scheduleFunction( --- EscortGroupAttack.PushTask, --- { EscortGroupAttack, --- EscortGroupAttack:TaskCombo( --- { EscortGroupAttack:TaskFireAtPoint( AttackUnit:GetPointVec2(), 50 ) --- } --- ) --- }, timer.getTime() + 10 --- ) - SCHEDULER:New( EscortGroupAttack, - EscortGroupAttack.PushTask, - { EscortGroupAttack:TaskCombo( - { EscortGroupAttack:TaskFireAtPoint( AttackUnit:GetPointVec2(), 50 ) - } - ) - }, 10 - ) - end - EscortGroupAttack:MessageToClient( "Assisting with the destroying the enemy unit!", 10, EscortClient ) - -end - ---- @param #MENUPARAM MenuParam -function ESCORT._ROE( MenuParam ) - - local self = MenuParam.ParamSelf - local EscortGroup = self.EscortGroup - local EscortClient = self.EscortClient - - local EscortROEFunction = MenuParam.ParamFunction - local EscortROEMessage = MenuParam.ParamMessage - - pcall( function() EscortROEFunction() end ) - EscortGroup:MessageToClient( EscortROEMessage, 10, EscortClient ) -end - ---- @param #MENUPARAM MenuParam -function ESCORT._ROT( MenuParam ) - - local self = MenuParam.ParamSelf - local EscortGroup = self.EscortGroup - local EscortClient = self.EscortClient - - local EscortROTFunction = MenuParam.ParamFunction - local EscortROTMessage = MenuParam.ParamMessage - - pcall( function() EscortROTFunction() end ) - EscortGroup:MessageToClient( EscortROTMessage, 10, EscortClient ) -end - ---- @param #MENUPARAM MenuParam -function ESCORT._ResumeMission( MenuParam ) - - local self = MenuParam.ParamSelf - local EscortGroup = self.EscortGroup - local EscortClient = self.EscortClient - - local WayPoint = MenuParam.ParamWayPoint - - routines.removeFunction( self.FollowScheduler ) - self.FollowScheduler = nil - - local WayPoints = EscortGroup:GetTaskRoute() - self:T( WayPoint, WayPoints ) - - for WayPointIgnore = 1, WayPoint do - table.remove( WayPoints, 1 ) - end - - --routines.scheduleFunction( EscortGroup.SetTask, {EscortGroup, EscortGroup:TaskRoute( WayPoints ) }, timer.getTime() + 1 ) - SCHEDULER:New( EscortGroup, EscortGroup.SetTask, { EscortGroup:TaskRoute( WayPoints ) }, 1 ) - - EscortGroup:MessageToClient( "Resuming mission from waypoint " .. WayPoint .. ".", 10, EscortClient ) -end - ---- Registers the waypoints --- @param #ESCORT self --- @return #table -function ESCORT:RegisterRoute() - self:F() - - local EscortGroup = self.EscortGroup -- Group#GROUP - - local TaskPoints = EscortGroup:GetTaskRoute() - - self:T( TaskPoints ) - - return TaskPoints -end - ---- @param Escort#ESCORT self -function ESCORT:_FollowScheduler( FollowDistance ) - self:F( { FollowDistance }) - - if self.EscortGroup:IsAlive() and self.EscortClient:IsAlive() then - - local ClientUnit = self.EscortClient:GetClientGroupUnit() - local GroupUnit = self.EscortGroup:GetUnit( 1 ) - - if self.CT1 == 0 and self.GT1 == 0 then - self.CV1 = ClientUnit:GetPointVec3() - self.CT1 = timer.getTime() - self.GV1 = GroupUnit:GetPointVec3() - self.GT1 = timer.getTime() - else - local CT1 = self.CT1 - local CT2 = timer.getTime() - local CV1 = self.CV1 - local CV2 = ClientUnit:GetPointVec3() - self.CT1 = CT2 - self.CV1 = CV2 - - local CD = ( ( CV2.x - CV1.x )^2 + ( CV2.y - CV1.y )^2 + ( CV2.z - CV1.z )^2 ) ^ 0.5 - local CT = CT2 - CT1 - - local CS = ( 3600 / CT ) * ( CD / 1000 ) - - self:T2( { "Client:", CS, CD, CT, CV2, CV1, CT2, CT1 } ) - - local GT1 = self.GT1 - local GT2 = timer.getTime() - local GV1 = self.GV1 - local GV2 = GroupUnit:GetPointVec3() - self.GT1 = GT2 - self.GV1 = GV2 - - local GD = ( ( GV2.x - GV1.x )^2 + ( GV2.y - GV1.y )^2 + ( GV2.z - GV1.z )^2 ) ^ 0.5 - local GT = GT2 - GT1 - - local GS = ( 3600 / GT ) * ( GD / 1000 ) - - self:T2( { "Group:", GS, GD, GT, GV2, GV1, GT2, GT1 } ) - - -- Calculate the group direction vector - local GV = { x = GV2.x - CV2.x, y = GV2.y - CV2.y, z = GV2.z - CV2.z } - - -- Calculate GH2, GH2 with the same height as CV2. - local GH2 = { x = GV2.x, y = CV2.y, z = GV2.z } - - -- Calculate the angle of GV to the orthonormal plane - local alpha = math.atan2( GV.z, GV.x ) - - -- Now we calculate the intersecting vector between the circle around CV2 with radius FollowDistance and GH2. - -- From the GeoGebra model: CVI = (x(CV2) + FollowDistance cos(alpha), y(GH2) + FollowDistance sin(alpha), z(CV2)) - local CVI = { x = CV2.x + FollowDistance * math.cos(alpha), - y = GH2.y, - z = CV2.z + FollowDistance * math.sin(alpha), - } - - -- Calculate the direction vector DV of the escort group. We use CVI as the base and CV2 as the direction. - local DV = { x = CV2.x - CVI.x, y = CV2.y - CVI.y, z = CV2.z - CVI.z } - - -- We now calculate the unary direction vector DVu, so that we can multiply DVu with the speed, which is expressed in meters / s. - -- We need to calculate this vector to predict the point the escort group needs to fly to according its speed. - -- The distance of the destination point should be far enough not to have the aircraft starting to swipe left to right... - local DVu = { x = DV.x / FollowDistance, y = DV.y / FollowDistance, z = DV.z / FollowDistance } - - -- Now we can calculate the group destination vector GDV. - local GDV = { x = DVu.x * CS * 8 + CVI.x, y = CVI.y, z = DVu.z * CS * 8 + CVI.z } - - --trigger.action.smoke( GDV, trigger.smokeColor.Red ) - self:T2( { "CV2:", CV2 } ) - self:T2( { "CVI:", CVI } ) - self:T2( { "GDV:", GDV } ) - - -- Measure distance between client and group - local CatchUpDistance = ( ( GDV.x - GV2.x )^2 + ( GDV.y - GV2.y )^2 + ( GDV.z - GV2.z )^2 ) ^ 0.5 - - -- The calculation of the Speed would simulate that the group would take 30 seconds to overcome - -- the requested Distance). - local Time = 10 - local CatchUpSpeed = ( CatchUpDistance - ( CS * 8.4 ) ) / Time - - local Speed = CS + CatchUpSpeed - if Speed < 0 then - Speed = 0 - end - - self:T( { "Client Speed, Escort Speed, Speed, FlyDistance, Time:", CS, GS, Speed, Distance, Time } ) - - -- Now route the escort to the desired point with the desired speed. - self.EscortGroup:TaskRouteToVec3( GDV, Speed / 3.6 ) -- DCS models speed in Mps (Miles per second) - end - return true - end - - return false -end - - ---- Report Targets Scheduler. --- @param #ESCORT self -function ESCORT:_ReportTargetsScheduler() - self:F( self.EscortGroup:GetName() ) - - if self.EscortGroup:IsAlive() and self.EscortClient:IsAlive() then - local EscortGroupName = self.EscortGroup:GetName() - local EscortTargets = self.EscortGroup:GetDetectedTargets() - - local ClientEscortTargets = self.EscortClient._EscortGroups[EscortGroupName].Targets - - local EscortTargetMessages = "" - for EscortTargetID, EscortTarget in pairs( EscortTargets ) do - local EscortObject = EscortTarget.object - self:T( EscortObject ) - if EscortObject and EscortObject:isExist() and EscortObject.id_ < 50000000 then - - local EscortTargetUnit = UNIT:Find( EscortObject ) - local EscortTargetUnitName = EscortTargetUnit:GetName() - - - - -- local EscortTargetIsDetected, - -- EscortTargetIsVisible, - -- EscortTargetLastTime, - -- EscortTargetKnowType, - -- EscortTargetKnowDistance, - -- EscortTargetLastPos, - -- EscortTargetLastVelocity - -- = self.EscortGroup:IsTargetDetected( EscortObject ) - -- - -- self:T( { EscortTargetIsDetected, - -- EscortTargetIsVisible, - -- EscortTargetLastTime, - -- EscortTargetKnowType, - -- EscortTargetKnowDistance, - -- EscortTargetLastPos, - -- EscortTargetLastVelocity } ) - - - local EscortTargetUnitPositionVec3 = EscortTargetUnit:GetPointVec3() - local EscortPositionVec3 = self.EscortGroup:GetPointVec3() - local Distance = ( ( EscortTargetUnitPositionVec3.x - EscortPositionVec3.x )^2 + - ( EscortTargetUnitPositionVec3.y - EscortPositionVec3.y )^2 + - ( EscortTargetUnitPositionVec3.z - EscortPositionVec3.z )^2 - ) ^ 0.5 / 1000 - - self:T( { self.EscortGroup:GetName(), EscortTargetUnit:GetName(), Distance, EscortTarget } ) - - if Distance <= 15 then - - if not ClientEscortTargets[EscortTargetUnitName] then - ClientEscortTargets[EscortTargetUnitName] = {} - end - ClientEscortTargets[EscortTargetUnitName].AttackUnit = EscortTargetUnit - ClientEscortTargets[EscortTargetUnitName].visible = EscortTarget.visible - ClientEscortTargets[EscortTargetUnitName].type = EscortTarget.type - ClientEscortTargets[EscortTargetUnitName].distance = EscortTarget.distance - else - if ClientEscortTargets[EscortTargetUnitName] then - ClientEscortTargets[EscortTargetUnitName] = nil - end - end - end - end - - self:T( { "Sorting Targets Table:", ClientEscortTargets } ) - table.sort( ClientEscortTargets, function( a, b ) return a.Distance < b.Distance end ) - self:T( { "Sorted Targets Table:", ClientEscortTargets } ) - - -- Remove the sub menus of the Attack menu of the Escort for the EscortGroup. - self.EscortMenuAttackNearbyTargets:RemoveSubMenus() - - if self.EscortMenuTargetAssistance then - self.EscortMenuTargetAssistance:RemoveSubMenus() - end - - --for MenuIndex = 1, #self.EscortMenuAttackTargets do - -- self:T( { "Remove Menu:", self.EscortMenuAttackTargets[MenuIndex] } ) - -- self.EscortMenuAttackTargets[MenuIndex] = self.EscortMenuAttackTargets[MenuIndex]:Remove() - --end - - - if ClientEscortTargets then - for ClientEscortTargetUnitName, ClientEscortTargetData in pairs( ClientEscortTargets ) do - - for ClientEscortGroupName, EscortGroupData in pairs( self.EscortClient._EscortGroups ) do - - if ClientEscortTargetData and ClientEscortTargetData.AttackUnit:IsAlive() then - - local EscortTargetMessage = "" - local EscortTargetCategoryName = ClientEscortTargetData.AttackUnit:GetCategoryName() - local EscortTargetCategoryType = ClientEscortTargetData.AttackUnit:GetTypeName() - if ClientEscortTargetData.type then - EscortTargetMessage = EscortTargetMessage .. EscortTargetCategoryName .. " (" .. EscortTargetCategoryType .. ") at " - else - EscortTargetMessage = EscortTargetMessage .. "Unknown target at " - end - - local EscortTargetUnitPositionVec3 = ClientEscortTargetData.AttackUnit:GetPointVec3() - local EscortPositionVec3 = self.EscortGroup:GetPointVec3() - local Distance = ( ( EscortTargetUnitPositionVec3.x - EscortPositionVec3.x )^2 + - ( EscortTargetUnitPositionVec3.y - EscortPositionVec3.y )^2 + - ( EscortTargetUnitPositionVec3.z - EscortPositionVec3.z )^2 - ) ^ 0.5 / 1000 - - self:T( { self.EscortGroup:GetName(), ClientEscortTargetData.AttackUnit:GetName(), Distance, ClientEscortTargetData.AttackUnit } ) - if ClientEscortTargetData.visible == false then - EscortTargetMessage = EscortTargetMessage .. string.format( "%.2f", Distance ) .. " estimated km" - else - EscortTargetMessage = EscortTargetMessage .. string.format( "%.2f", Distance ) .. " km" - end - - if ClientEscortTargetData.visible then - EscortTargetMessage = EscortTargetMessage .. ", visual" - end - - if ClientEscortGroupName == EscortGroupName then - - MENU_CLIENT_COMMAND:New( self.EscortClient, - EscortTargetMessage, - self.EscortMenuAttackNearbyTargets, - ESCORT._AttackTarget, - { ParamSelf = self, - ParamUnit = ClientEscortTargetData.AttackUnit - } - ) - EscortTargetMessages = EscortTargetMessages .. "\n - " .. EscortTargetMessage - else - if self.EscortMenuTargetAssistance then - local MenuTargetAssistance = MENU_CLIENT:New( self.EscortClient, EscortGroupData.EscortName, self.EscortMenuTargetAssistance ) - MENU_CLIENT_COMMAND:New( self.EscortClient, - EscortTargetMessage, - MenuTargetAssistance, - ESCORT._AssistTarget, - { ParamSelf = self, - ParamEscortGroup = EscortGroupData.EscortGroup, - ParamUnit = ClientEscortTargetData.AttackUnit - } - ) - end - end - else - ClientEscortTargetData = nil - end - end - end - - if EscortTargetMessages ~= "" and self.ReportTargets == true then - self.EscortGroup:MessageToClient( "Detected targets within 15 km range:" .. EscortTargetMessages:gsub("\n$",""), 20, self.EscortClient ) - else - self.EscortGroup:MessageToClient( "No targets detected!", 20, self.EscortClient ) - end - end - - if self.EscortMenuResumeMission then - self.EscortMenuResumeMission:RemoveSubMenus() - - -- if self.EscortMenuResumeWayPoints then - -- for MenuIndex = 1, #self.EscortMenuResumeWayPoints do - -- self:T( { "Remove Menu:", self.EscortMenuResumeWayPoints[MenuIndex] } ) - -- self.EscortMenuResumeWayPoints[MenuIndex] = self.EscortMenuResumeWayPoints[MenuIndex]:Remove() - -- end - -- end - - local TaskPoints = self:RegisterRoute() - for WayPointID, WayPoint in pairs( TaskPoints ) do - local EscortPositionVec3 = self.EscortGroup:GetPointVec3() - local Distance = ( ( WayPoint.x - EscortPositionVec3.x )^2 + - ( WayPoint.y - EscortPositionVec3.z )^2 - ) ^ 0.5 / 1000 - MENU_CLIENT_COMMAND:New( self.EscortClient, "Waypoint " .. WayPointID .. " at " .. string.format( "%.2f", Distance ).. "km", self.EscortMenuResumeMission, ESCORT._ResumeMission, { ParamSelf = self, ParamWayPoint = WayPointID } ) - end - end - return true - end - - return false -end ---- Provides missile training functions. --- --- @{#MISSILETRAINER} class --- ======================== --- The @{#MISSILETRAINER} class uses the DCS world messaging system to be alerted of any missiles fired, and when a missile would hit your aircraft, --- the class will destroy the missile within a certain range, to avoid damage to your aircraft. --- It suports the following functionality: --- --- * Track the missiles fired at you and other players, providing bearing and range information of the missiles towards the airplanes. --- * Provide alerts of missile launches, including detailed information of the units launching, including bearing, range … --- * Provide alerts when a missile would have killed your aircraft. --- * Provide alerts when the missile self destructs. --- * Enable / Disable and Configure the Missile Trainer using the various menu options. --- --- When running a mission where MISSILETRAINER is used, the following radio menu structure ( 'Radio Menu' -> 'Other (F10)' -> 'MissileTrainer' ) options are available for the players: --- --- * **Messages**: Menu to configure all messages. --- * **Messages On**: Show all messages. --- * **Messages Off**: Disable all messages. --- * **Tracking**: Menu to configure missile tracking messages. --- * **To All**: Shows missile tracking messages to all players. --- * **To Target**: Shows missile tracking messages only to the player where the missile is targetted at. --- * **Tracking On**: Show missile tracking messages. --- * **Tracking Off**: Disable missile tracking messages. --- * **Frequency Increase**: Increases the missile tracking message frequency with one second. --- * **Frequency Decrease**: Decreases the missile tracking message frequency with one second. --- * **Alerts**: Menu to configure alert messages. --- * **To All**: Shows alert messages to all players. --- * **To Target**: Shows alert messages only to the player where the missile is (was) targetted at. --- * **Hits On**: Show missile hit alert messages. --- * **Hits Off**: Disable missile hit alert messages. --- * **Launches On**: Show missile launch messages. --- * **Launches Off**: Disable missile launch messages. --- * **Details**: Menu to configure message details. --- * **Range On**: Shows range information when a missile is fired to a target. --- * **Range Off**: Disable range information when a missile is fired to a target. --- * **Bearing On**: Shows bearing information when a missile is fired to a target. --- * **Bearing Off**: Disable bearing information when a missile is fired to a target. --- * **Distance**: Menu to configure the distance when a missile needs to be destroyed when near to a player, during tracking. This will improve/influence hit calculation accuracy, but has the risk of damaging the aircraft when the missile reaches the aircraft before the distance is measured. --- * **50 meter**: Destroys the missile when the distance to the aircraft is below or equal to 50 meter. --- * **100 meter**: Destroys the missile when the distance to the aircraft is below or equal to 100 meter. --- * **150 meter**: Destroys the missile when the distance to the aircraft is below or equal to 150 meter. --- * **200 meter**: Destroys the missile when the distance to the aircraft is below or equal to 200 meter. --- --- --- MISSILETRAINER construction methods: --- ==================================== --- Create a new MISSILETRAINER object with the @{#MISSILETRAINER.New} method: --- --- * @{#MISSILETRAINER.New}: Creates a new MISSILETRAINER object taking the maximum distance to your aircraft to evaluate when a missile needs to be destroyed. --- --- MISSILETRAINER will collect each unit declared in the mission with a skill level "Client" and "Player", and will monitor the missiles shot at those. --- --- MISSILETRAINER initialization methods: --- ====================================== --- A MISSILETRAINER object will behave differently based on the usage of initialization methods: --- --- * @{#MISSILETRAINER.InitMessagesOnOff}: Sets by default the display of any message to be ON or OFF. --- * @{#MISSILETRAINER.InitTrackingToAll}: Sets by default the missile tracking report for all players or only for those missiles targetted to you. --- * @{#MISSILETRAINER.InitTrackingOnOff}: Sets by default the display of missile tracking report to be ON or OFF. --- * @{#MISSILETRAINER.InitTrackingFrequency}: Increases, decreases the missile tracking message display frequency with the provided time interval in seconds. --- * @{#MISSILETRAINER.InitAlertsToAll}: Sets by default the display of alerts to be shown to all players or only to you. --- * @{#MISSILETRAINER.InitAlertsHitsOnOff}: Sets by default the display of hit alerts ON or OFF. --- * @{#MISSILETRAINER.InitAlertsLaunchesOnOff}: Sets by default the display of launch alerts ON or OFF. --- * @{#MISSILETRAINER.InitRangeOnOff}: Sets by default the display of range information of missiles ON of OFF. --- * @{#MISSILETRAINER.InitBearingOnOff}: Sets by default the display of bearing information of missiles ON of OFF. --- * @{#MISSILETRAINER.InitMenusOnOff}: Allows to configure the options through the radio menu. --- --- @module MissileTrainer --- @author FlightControl - - ---- The MISSILETRAINER class --- @type MISSILETRAINER --- @extends Base#BASE -MISSILETRAINER = { - ClassName = "MISSILETRAINER", -} - ---- Creates the main object which is handling missile tracking. --- When a missile is fired a SCHEDULER is set off that follows the missile. When near a certain a client player, the missile will be destroyed. --- @param #MISSILETRAINER self --- @param #number Distance The distance in meters when a tracked missile needs to be destroyed when close to a player. --- @param #string Briefing (Optional) Will show a text to the players when starting their mission. Can be used for briefing purposes. --- @return #MISSILETRAINER -function MISSILETRAINER:New( Distance, Briefing ) - local self = BASE:Inherit( self, BASE:New() ) - self:F( Distance ) - - if Briefing then - self.Briefing = Briefing - end - - self.Schedulers = {} - self.SchedulerID = 0 - - self.MessageInterval = 2 - self.MessageLastTime = timer.getTime() - - self.Distance = Distance / 1000 - - _EVENTDISPATCHER:OnShot( self._EventShot, self ) - - self.DB = DATABASE:New():FilterStart() - self.DBClients = self.DB.Clients - self.DBUnits = self.DB.Units - - for ClientID, Client in pairs( self.DBClients ) do - - local function _Alive( Client ) - - if self.Briefing then - Client:Message( self.Briefing, 15, "HELLO WORLD", "Trainer" ) - end - - if self.MenusOnOff == true then - Client:Message( "Use the 'Radio Menu' -> 'Other (F10)' -> 'Missile Trainer' menu options to change the Missile Trainer settings (for all players).", 15, "MENU", "Trainer" ) - - Client.MainMenu = MENU_CLIENT:New( Client, "Missile Trainer", nil ) -- Menu#MENU_CLIENT - - Client.MenuMessages = MENU_CLIENT:New( Client, "Messages", Client.MainMenu ) - Client.MenuOn = MENU_CLIENT_COMMAND:New( Client, "Messages On", Client.MenuMessages, self._MenuMessages, { MenuSelf = self, MessagesOnOff = true } ) - Client.MenuOff = MENU_CLIENT_COMMAND:New( Client, "Messages Off", Client.MenuMessages, self._MenuMessages, { MenuSelf = self, MessagesOnOff = false } ) - - Client.MenuTracking = MENU_CLIENT:New( Client, "Tracking", Client.MainMenu ) - Client.MenuTrackingToAll = MENU_CLIENT_COMMAND:New( Client, "To All", Client.MenuTracking, self._MenuMessages, { MenuSelf = self, TrackingToAll = true } ) - Client.MenuTrackingToTarget = MENU_CLIENT_COMMAND:New( Client, "To Target", Client.MenuTracking, self._MenuMessages, { MenuSelf = self, TrackingToAll = false } ) - Client.MenuTrackOn = MENU_CLIENT_COMMAND:New( Client, "Tracking On", Client.MenuTracking, self._MenuMessages, { MenuSelf = self, TrackingOnOff = true } ) - Client.MenuTrackOff = MENU_CLIENT_COMMAND:New( Client, "Tracking Off", Client.MenuTracking, self._MenuMessages, { MenuSelf = self, TrackingOnOff = false } ) - Client.MenuTrackIncrease = MENU_CLIENT_COMMAND:New( Client, "Frequency Increase", Client.MenuTracking, self._MenuMessages, { MenuSelf = self, TrackingFrequency = -1 } ) - Client.MenuTrackDecrease = MENU_CLIENT_COMMAND:New( Client, "Frequency Decrease", Client.MenuTracking, self._MenuMessages, { MenuSelf = self, TrackingFrequency = 1 } ) - - Client.MenuAlerts = MENU_CLIENT:New( Client, "Alerts", Client.MainMenu ) - Client.MenuAlertsToAll = MENU_CLIENT_COMMAND:New( Client, "To All", Client.MenuAlerts, self._MenuMessages, { MenuSelf = self, AlertsToAll = true } ) - Client.MenuAlertsToTarget = MENU_CLIENT_COMMAND:New( Client, "To Target", Client.MenuAlerts, self._MenuMessages, { MenuSelf = self, AlertsToAll = false } ) - Client.MenuHitsOn = MENU_CLIENT_COMMAND:New( Client, "Hits On", Client.MenuAlerts, self._MenuMessages, { MenuSelf = self, AlertsHitsOnOff = true } ) - Client.MenuHitsOff = MENU_CLIENT_COMMAND:New( Client, "Hits Off", Client.MenuAlerts, self._MenuMessages, { MenuSelf = self, AlertsHitsOnOff = false } ) - Client.MenuLaunchesOn = MENU_CLIENT_COMMAND:New( Client, "Launches On", Client.MenuAlerts, self._MenuMessages, { MenuSelf = self, AlertsLaunchesOnOff = true } ) - Client.MenuLaunchesOff = MENU_CLIENT_COMMAND:New( Client, "Launches Off", Client.MenuAlerts, self._MenuMessages, { MenuSelf = self, AlertsLaunchesOnOff = false } ) - - Client.MenuDetails = MENU_CLIENT:New( Client, "Details", Client.MainMenu ) - Client.MenuDetailsDistanceOn = MENU_CLIENT_COMMAND:New( Client, "Range On", Client.MenuDetails, self._MenuMessages, { MenuSelf = self, DetailsRangeOnOff = true } ) - Client.MenuDetailsDistanceOff = MENU_CLIENT_COMMAND:New( Client, "Range Off", Client.MenuDetails, self._MenuMessages, { MenuSelf = self, DetailsRangeOnOff = false } ) - Client.MenuDetailsBearingOn = MENU_CLIENT_COMMAND:New( Client, "Bearing On", Client.MenuDetails, self._MenuMessages, { MenuSelf = self, DetailsBearingOnOff = true } ) - Client.MenuDetailsBearingOff = MENU_CLIENT_COMMAND:New( Client, "Bearing Off", Client.MenuDetails, self._MenuMessages, { MenuSelf = self, DetailsBearingOnOff = false } ) - - Client.MenuDistance = MENU_CLIENT:New( Client, "Set distance to plane", Client.MainMenu ) - Client.MenuDistance50 = MENU_CLIENT_COMMAND:New( Client, "50 meter", Client.MenuDistance, self._MenuMessages, { MenuSelf = self, Distance = 50 / 1000 } ) - Client.MenuDistance100 = MENU_CLIENT_COMMAND:New( Client, "100 meter", Client.MenuDistance, self._MenuMessages, { MenuSelf = self, Distance = 100 / 1000 } ) - Client.MenuDistance150 = MENU_CLIENT_COMMAND:New( Client, "150 meter", Client.MenuDistance, self._MenuMessages, { MenuSelf = self, Distance = 150 / 1000 } ) - Client.MenuDistance200 = MENU_CLIENT_COMMAND:New( Client, "200 meter", Client.MenuDistance, self._MenuMessages, { MenuSelf = self, Distance = 200 / 1000 } ) - else - if Client.MainMenu then - Client.MainMenu:Remove() - end - end - - - local ClientID = Client:GetID() - self:T( ClientID ) - if not self.TrackingMissiles[ClientID] then - self.TrackingMissiles[ClientID] = {} - end - self.TrackingMissiles[ClientID].Client = Client - if not self.TrackingMissiles[ClientID].MissileData then - self.TrackingMissiles[ClientID].MissileData = {} - end - end - - Client:Alive( _Alive ) - - end - --- self.DB:ForEachClient( --- --- @param Client#CLIENT Client --- function( Client ) --- --- ... actions ... --- --- end --- ) - - self.MessagesOnOff = true - - self.TrackingToAll = false - self.TrackingOnOff = true - self.TrackingFrequency = 3 - - self.AlertsToAll = true - self.AlertsHitsOnOff = true - self.AlertsLaunchesOnOff = true - - self.DetailsRangeOnOff = true - self.DetailsBearingOnOff = true - - self.MenusOnOff = true - - self.TrackingMissiles = {} - - self.TrackingScheduler = SCHEDULER:New( self, self._TrackMissiles, {}, 0.5, 0.05, 0 ) - - return self -end - --- Initialization methods. - - ---- Sets by default the display of any message to be ON or OFF. --- @param #MISSILETRAINER self --- @param #boolean MessagesOnOff true or false --- @return #MISSILETRAINER self -function MISSILETRAINER:InitMessagesOnOff( MessagesOnOff ) - self:F( MessagesOnOff ) - - self.MessagesOnOff = MessagesOnOff - if self.MessagesOnOff == true then - MESSAGE:New( "Messages ON", 15, "Menu" ):ToAll() - else - MESSAGE:New( "Messages OFF", 15, "Menu" ):ToAll() - end - - return self -end - ---- Sets by default the missile tracking report for all players or only for those missiles targetted to you. --- @param #MISSILETRAINER self --- @param #boolean TrackingToAll true or false --- @return #MISSILETRAINER self -function MISSILETRAINER:InitTrackingToAll( TrackingToAll ) - self:F( TrackingToAll ) - - self.TrackingToAll = TrackingToAll - if self.TrackingToAll == true then - MESSAGE:New( "Missile tracking to all players ON", 15, "Menu" ):ToAll() - else - MESSAGE:New( "Missile tracking to all players OFF", 15, "Menu" ):ToAll() - end - - return self -end - ---- Sets by default the display of missile tracking report to be ON or OFF. --- @param #MISSILETRAINER self --- @param #boolean TrackingOnOff true or false --- @return #MISSILETRAINER self -function MISSILETRAINER:InitTrackingOnOff( TrackingOnOff ) - self:F( TrackingOnOff ) - - self.TrackingOnOff = TrackingOnOff - if self.TrackingOnOff == true then - MESSAGE:New( "Missile tracking ON", 15, "Menu" ):ToAll() - else - MESSAGE:New( "Missile tracking OFF", 15, "Menu" ):ToAll() - end - - return self -end - ---- Increases, decreases the missile tracking message display frequency with the provided time interval in seconds. --- The default frequency is a 3 second interval, so the Tracking Frequency parameter specifies the increase or decrease from the default 3 seconds or the last frequency update. --- @param #MISSILETRAINER self --- @param #number TrackingFrequency Provide a negative or positive value in seconds to incraese or decrease the display frequency. --- @return #MISSILETRAINER self -function MISSILETRAINER:InitTrackingFrequency( TrackingFrequency ) - self:F( TrackingFrequency ) - - self.TrackingFrequency = self.TrackingFrequency + TrackingFrequency - if self.TrackingFrequency < 0.5 then - self.TrackingFrequency = 0.5 - end - if self.TrackingFrequency then - MESSAGE:New( "Missile tracking frequency is " .. self.TrackingFrequency .. " seconds.", 15, "Menu" ):ToAll() - end - - return self -end - ---- Sets by default the display of alerts to be shown to all players or only to you. --- @param #MISSILETRAINER self --- @param #boolean AlertsToAll true or false --- @return #MISSILETRAINER self -function MISSILETRAINER:InitAlertsToAll( AlertsToAll ) - self:F( AlertsToAll ) - - self.AlertsToAll = AlertsToAll - if self.AlertsToAll == true then - MESSAGE:New( "Alerts to all players ON", 15, "Menu" ):ToAll() - else - MESSAGE:New( "Alerts to all players OFF", 15, "Menu" ):ToAll() - end - - return self -end - ---- Sets by default the display of hit alerts ON or OFF. --- @param #MISSILETRAINER self --- @param #boolean AlertsHitsOnOff true or false --- @return #MISSILETRAINER self -function MISSILETRAINER:InitAlertsHitsOnOff( AlertsHitsOnOff ) - self:F( AlertsHitsOnOff ) - - self.AlertsHitsOnOff = AlertsHitsOnOff - if self.AlertsHitsOnOff == true then - MESSAGE:New( "Alerts Hits ON", 15, "Menu" ):ToAll() - else - MESSAGE:New( "Alerts Hits OFF", 15, "Menu" ):ToAll() - end - - return self -end - ---- Sets by default the display of launch alerts ON or OFF. --- @param #MISSILETRAINER self --- @param #boolean AlertsLaunchesOnOff true or false --- @return #MISSILETRAINER self -function MISSILETRAINER:InitAlertsLaunchesOnOff( AlertsLaunchesOnOff ) - self:F( AlertsLaunchesOnOff ) - - self.AlertsLaunchesOnOff = AlertsLaunchesOnOff - if self.AlertsLaunchesOnOff == true then - MESSAGE:New( "Alerts Launches ON", 15, "Menu" ):ToAll() - else - MESSAGE:New( "Alerts Launches OFF", 15, "Menu" ):ToAll() - end - - return self -end - ---- Sets by default the display of range information of missiles ON of OFF. --- @param #MISSILETRAINER self --- @param #boolean DetailsRangeOnOff true or false --- @return #MISSILETRAINER self -function MISSILETRAINER:InitRangeOnOff( DetailsRangeOnOff ) - self:F( DetailsRangeOnOff ) - - self.DetailsRangeOnOff = DetailsRangeOnOff - if self.DetailsRangeOnOff == true then - MESSAGE:New( "Range display ON", 15, "Menu" ):ToAll() - else - MESSAGE:New( "Range display OFF", 15, "Menu" ):ToAll() - end - - return self -end - ---- Sets by default the display of bearing information of missiles ON of OFF. --- @param #MISSILETRAINER self --- @param #boolean DetailsBearingOnOff true or false --- @return #MISSILETRAINER self -function MISSILETRAINER:InitBearingOnOff( DetailsBearingOnOff ) - self:F( DetailsBearingOnOff ) - - self.DetailsBearingOnOff = DetailsBearingOnOff - if self.DetailsBearingOnOff == true then - MESSAGE:New( "Bearing display OFF", 15, "Menu" ):ToAll() - else - MESSAGE:New( "Bearing display OFF", 15, "Menu" ):ToAll() - end - - return self -end - ---- Enables / Disables the menus. --- @param #MISSILETRAINER self --- @param #boolean MenusOnOff true or false --- @return #MISSILETRAINER self -function MISSILETRAINER:InitMenusOnOff( MenusOnOff ) - self:F( MenusOnOff ) - - self.MenusOnOff = MenusOnOff - if self.MenusOnOff == true then - MESSAGE:New( "Menus are ENABLED (only when a player rejoins a slot)", 15, "Menu" ):ToAll() - else - MESSAGE:New( "Menus are DISABLED", 15, "Menu" ):ToAll() - end - - return self -end - - --- Menu functions - -function MISSILETRAINER._MenuMessages( MenuParameters ) - - local self = MenuParameters.MenuSelf - - if MenuParameters.MessagesOnOff ~= nil then - self:InitMessagesOnOff( MenuParameters.MessagesOnOff ) - end - - if MenuParameters.TrackingToAll ~= nil then - self:InitTrackingToAll( MenuParameters.TrackingToAll ) - end - - if MenuParameters.TrackingOnOff ~= nil then - self:InitTrackingOnOff( MenuParameters.TrackingOnOff ) - end - - if MenuParameters.TrackingFrequency ~= nil then - self:InitTrackingFrequency( MenuParameters.TrackingFrequency ) - end - - if MenuParameters.AlertsToAll ~= nil then - self:InitAlertsToAll( MenuParameters.AlertsToAll ) - end - - if MenuParameters.AlertsHitsOnOff ~= nil then - self:InitAlertsHitsOnOff( MenuParameters.AlertsHitsOnOff ) - end - - if MenuParameters.AlertsLaunchesOnOff ~= nil then - self:InitAlertsLaunchesOnOff( MenuParameters.AlertsLaunchesOnOff ) - end - - if MenuParameters.DetailsRangeOnOff ~= nil then - self:InitRangeOnOff( MenuParameters.DetailsRangeOnOff ) - end - - if MenuParameters.DetailsBearingOnOff ~= nil then - self:InitBearingOnOff( MenuParameters.DetailsBearingOnOff ) - end - - if MenuParameters.Distance ~= nil then - self.Distance = MenuParameters.Distance - MESSAGE:New( "Hit detection distance set to " .. self.Distance .. " meters", 15, "Menu" ):ToAll() - end - -end - ---- Detects if an SA site was shot with an anti radiation missile. In this case, take evasive actions based on the skill level set within the ME. --- @param #MISSILETRAINER self --- @param Event#EVENTDATA Event -function MISSILETRAINER:_EventShot( Event ) - self:F( { Event } ) - - local TrainerSourceDCSUnit = Event.IniDCSUnit - local TrainerSourceDCSUnitName = Event.IniDCSUnitName - local TrainerWeapon = Event.Weapon -- Identify the weapon fired - local TrainerWeaponName = Event.WeaponName -- return weapon type - - self:T( "Missile Launched = " .. TrainerWeaponName ) - - local TrainerTargetDCSUnit = TrainerWeapon:getTarget() -- Identify target - local TrainerTargetDCSUnitName = Unit.getName( TrainerTargetDCSUnit ) - local TrainerTargetSkill = _DATABASE.Templates.Units[TrainerTargetDCSUnitName].Template.skill - - self:T(TrainerTargetDCSUnitName ) - - local Client = self.DBClients[TrainerTargetDCSUnitName] - if Client then - - local TrainerSourceUnit = UNIT:Find( TrainerSourceDCSUnit ) - local TrainerTargetUnit = UNIT:Find( TrainerTargetDCSUnit ) - - if self.MessagesOnOff == true and self.AlertsLaunchesOnOff == true then - - local Message = MESSAGE:New( - string.format( "%s launched a %s", - TrainerSourceUnit:GetTypeName(), - TrainerWeaponName - ) .. self:_AddRange( Client, TrainerWeapon ) .. self:_AddBearing( Client, TrainerWeapon ), 5, "Launch Alert" ) - - if self.AlertsToAll then - Message:ToAll() - else - Message:ToClient( Client ) - end - end - - local ClientID = Client:GetID() - local MissileData = {} - MissileData.TrainerSourceUnit = TrainerSourceUnit - MissileData.TrainerWeapon = TrainerWeapon - MissileData.TrainerTargetUnit = TrainerTargetUnit - MissileData.TrainerWeaponTypeName = TrainerWeapon:getTypeName() - MissileData.TrainerWeaponLaunched = true - table.insert( self.TrackingMissiles[ClientID].MissileData, MissileData ) - --self:T( self.TrackingMissiles ) - end -end - -function MISSILETRAINER:_AddRange( Client, TrainerWeapon ) - - local RangeText = "" - - if self.DetailsRangeOnOff then - - local PositionMissile = TrainerWeapon:getPoint() - local PositionTarget = Client:GetPointVec3() - - local Range = ( ( PositionMissile.x - PositionTarget.x )^2 + - ( PositionMissile.y - PositionTarget.y )^2 + - ( PositionMissile.z - PositionTarget.z )^2 - ) ^ 0.5 / 1000 - - RangeText = string.format( ", at %4.2fkm", Range ) - end - - return RangeText -end - -function MISSILETRAINER:_AddBearing( Client, TrainerWeapon ) - - local BearingText = "" - - if self.DetailsBearingOnOff then - - local PositionMissile = TrainerWeapon:getPoint() - local PositionTarget = Client:GetPointVec3() - - self:T2( { PositionTarget, PositionMissile }) - - local DirectionVector = { x = PositionMissile.x - PositionTarget.x, y = PositionMissile.y - PositionTarget.y, z = PositionMissile.z - PositionTarget.z } - local DirectionRadians = math.atan2( DirectionVector.z, DirectionVector.x ) - --DirectionRadians = DirectionRadians + routines.getNorthCorrection( PositionTarget ) - if DirectionRadians < 0 then - DirectionRadians = DirectionRadians + 2 * math.pi - end - local DirectionDegrees = DirectionRadians * 180 / math.pi - - BearingText = string.format( ", %d degrees", DirectionDegrees ) - end - - return BearingText -end - - -function MISSILETRAINER:_TrackMissiles() - self:F2() - - - local ShowMessages = false - if self.MessagesOnOff and self.MessageLastTime + self.TrackingFrequency <= timer.getTime() then - self.MessageLastTime = timer.getTime() - ShowMessages = true - end - - -- ALERTS PART - - -- Loop for all Player Clients to check the alerts and deletion of missiles. - for ClientDataID, ClientData in pairs( self.TrackingMissiles ) do - - local Client = ClientData.Client - self:T2( { Client:GetName() } ) - - for MissileDataID, MissileData in pairs( ClientData.MissileData ) do - self:T3( MissileDataID ) - - local TrainerSourceUnit = MissileData.TrainerSourceUnit - local TrainerWeapon = MissileData.TrainerWeapon - local TrainerTargetUnit = MissileData.TrainerTargetUnit - local TrainerWeaponTypeName = MissileData.TrainerWeaponTypeName - local TrainerWeaponLaunched = MissileData.TrainerWeaponLaunched - - if Client and Client:IsAlive() and TrainerSourceUnit and TrainerSourceUnit:IsAlive() and TrainerWeapon and TrainerWeapon:isExist() and TrainerTargetUnit and TrainerTargetUnit:IsAlive() then - local PositionMissile = TrainerWeapon:getPosition().p - local PositionTarget = Client:GetPointVec3() - - local Distance = ( ( PositionMissile.x - PositionTarget.x )^2 + - ( PositionMissile.y - PositionTarget.y )^2 + - ( PositionMissile.z - PositionTarget.z )^2 - ) ^ 0.5 / 1000 - - if Distance <= self.Distance then - -- Hit alert - TrainerWeapon:destroy() - if self.MessagesOnOff == true and self.AlertsHitsOnOff == true then - - self:T( "killed" ) - - local Message = MESSAGE:New( - string.format( "%s launched by %s killed %s", - TrainerWeapon:getTypeName(), - TrainerSourceUnit:GetTypeName(), - TrainerTargetUnit:GetPlayerName() - ), 15, "Hit Alert" ) - - if self.AlertsToAll == true then - Message:ToAll() - else - Message:ToClient( Client ) - end - - MissileData = nil - table.remove( ClientData.MissileData, MissileDataID ) - self:T(ClientData.MissileData) - end - end - else - if not ( TrainerWeapon and TrainerWeapon:isExist() ) then - if self.MessagesOnOff == true and self.AlertsLaunchesOnOff == true then - -- Weapon does not exist anymore. Delete from Table - local Message = MESSAGE:New( - string.format( "%s launched by %s self destructed!", - TrainerWeaponTypeName, - TrainerSourceUnit:GetTypeName() - ), 5, "Tracking" ) - - if self.AlertsToAll == true then - Message:ToAll() - else - Message:ToClient( Client ) - end - end - MissileData = nil - table.remove( ClientData.MissileData, MissileDataID ) - self:T( ClientData.MissileData ) - end - end - end - end - - if ShowMessages == true and self.MessagesOnOff == true and self.TrackingOnOff == true then -- Only do this when tracking information needs to be displayed. - - -- TRACKING PART - - -- For the current client, the missile range and bearing details are displayed To the Player Client. - -- For the other clients, the missile range and bearing details are displayed To the other Player Clients. - -- To achieve this, a cross loop is done for each Player Client <-> Other Player Client missile information. - - -- Main Player Client loop - for ClientDataID, ClientData in pairs( self.TrackingMissiles ) do - - local Client = ClientData.Client - self:T2( { Client:GetName() } ) - - - ClientData.MessageToClient = "" - ClientData.MessageToAll = "" - - -- Other Players Client loop - for TrackingDataID, TrackingData in pairs( self.TrackingMissiles ) do - - for MissileDataID, MissileData in pairs( TrackingData.MissileData ) do - self:T3( MissileDataID ) - - local TrainerSourceUnit = MissileData.TrainerSourceUnit - local TrainerWeapon = MissileData.TrainerWeapon - local TrainerTargetUnit = MissileData.TrainerTargetUnit - local TrainerWeaponTypeName = MissileData.TrainerWeaponTypeName - local TrainerWeaponLaunched = MissileData.TrainerWeaponLaunched - - if Client and Client:IsAlive() and TrainerSourceUnit and TrainerSourceUnit:IsAlive() and TrainerWeapon and TrainerWeapon:isExist() and TrainerTargetUnit and TrainerTargetUnit:IsAlive() then - - if ShowMessages == true then - local TrackingTo - TrackingTo = string.format( " -> %s", - TrainerWeaponTypeName - ) - - if ClientDataID == TrackingDataID then - if ClientData.MessageToClient == "" then - ClientData.MessageToClient = "Missiles to You:\n" - end - ClientData.MessageToClient = ClientData.MessageToClient .. TrackingTo .. self:_AddRange( ClientData.Client, TrainerWeapon ) .. self:_AddBearing( ClientData.Client, TrainerWeapon ) .. "\n" - else - if self.TrackingToAll == true then - if ClientData.MessageToAll == "" then - ClientData.MessageToAll = "Missiles to other Players:\n" - end - ClientData.MessageToAll = ClientData.MessageToAll .. TrackingTo .. self:_AddRange( ClientData.Client, TrainerWeapon ) .. self:_AddBearing( ClientData.Client, TrainerWeapon ) .. " ( " .. TrainerTargetUnit:GetPlayerName() .. " )\n" - end - end - end - end - end - end - - -- Once the Player Client and the Other Player Client tracking messages are prepared, show them. - if ClientData.MessageToClient ~= "" or ClientData.MessageToAll ~= "" then - local Message = MESSAGE:New( ClientData.MessageToClient .. ClientData.MessageToAll, 1, "Tracking" ):ToClient( Client ) - end - end - end - - return true -end ---- This module contains the AIBALANCER class. --- --- === --- --- 1) @{AIBalancer#AIBALANCER} class, extends @{Base#BASE} --- ================================================ --- The @{AIBalancer#AIBALANCER} class controls the dynamic spawning of AI GROUPS depending on a SET_CLIENT. --- There will be as many AI GROUPS spawned as there at CLIENTS in SET_CLIENT not spawned. --- --- 1.1) AIBALANCER construction method: --- ------------------------------------ --- Create a new AIBALANCER object with the @{#AIBALANCER.New} method: --- --- * @{#AIBALANCER.New}: Creates a new AIBALANCER object. --- --- --- === --- @module AIBalancer --- @author FlightControl - ---- AIBALANCER class --- @type AIBALANCER --- @field Set#SET_CLIENT SetClient --- @field Spawn#SPAWN SpawnAI --- @extends Base#BASE -AIBALANCER = { - ClassName = "AIBALANCER", -} - ---- Creates a new AIBALANCER object, building a set of units belonging to a coalitions, categories, countries, types or with defined prefix names. --- @param #AIBALANCER self --- @param SetClient A SET_CLIENT object that will contain the CLIENT objects to be monitored if they are alive or not (joined by a player). --- @param SpawnAI A SPAWN object that will spawn the AI units required, balancing the SetClient. --- @return #AIBALANCER self -function AIBALANCER:New( SetClient, SpawnAI ) - - -- Inherits from BASE - local self = BASE:Inherit( self, BASE:New() ) - - self.SetClient = SetClient - self.SpawnAI = SpawnAI - - self.AIMonitorSchedule = SCHEDULER:New( self, self._ClientAliveMonitorScheduler, {}, 1, 10, 0 ) - - return self -end - ---- @param #AIBALANCER self -function AIBALANCER:_ClientAliveMonitorScheduler() - - self.SetClient:ForEachClient( - --- @param Client#CLIENT Client - function( Client ) - local ClientAIAliveState = Client:GetState( self, 'AIAlive' ) - self:T( ClientAIAliveState ) - if Client:IsAlive() then - if ClientAIAliveState == true then - Client:SetState( self, 'AIAlive', false ) - local AIGroup = Client:GetState( self, 'AIGroup' ) -- Group#GROUP - AIGroup:Destroy() - end - else - if not ClientAIAliveState or ClientAIAliveState == false then - Client:SetState( self, 'AIAlive', true ) - Client:SetState( self, 'AIGroup', self.SpawnAI:Spawn() ) - end - end - end - ) - return true -end - - - env.info( '*** MOOSE INCLUDE END *** ' ) diff --git a/Moose Mission Setup/Moose.lua b/Moose Mission Setup/Moose.lua index 37a7a4c09..8e2cefd95 100644 --- a/Moose Mission Setup/Moose.lua +++ b/Moose Mission Setup/Moose.lua @@ -1,5 +1,6 @@ -env.info( '*** MOOSE STATIC INCLUDE START *** ' ) -env.info( 'Moose Generation Timestamp: 20160610_1430' ) +env.info( '*** MOOSE DYNAMIC INCLUDE START *** ' ) +env.info( 'Moose Generation Timestamp: 20160611_0744' ) + local base = _G Include = {} @@ -10,19976 +11,33 @@ Include.Path = function() end Include.File = function( IncludeFile ) + if not Include.Files[ IncludeFile ] then + Include.Files[IncludeFile] = IncludeFile + env.info( "Include:" .. IncludeFile .. " from " .. Include.ProgramPath ) + local f = assert( base.loadfile( Include.ProgramPath .. IncludeFile .. ".lua" ) ) + if f == nil then + env.info( "Include:" .. IncludeFile .. " from " .. Include.MissionPath ) + local f = assert( base.loadfile( Include.MissionPath .. IncludeFile .. ".lua" ) ) + if f == nil then + error ("Could not load MOOSE file " .. IncludeFile .. ".lua" ) + else + env.info( "Include:" .. IncludeFile .. " loaded from " .. Include.MissionPath ) + return f() + end + else + env.info( "Include:" .. IncludeFile .. " loaded from " .. Include.ProgramPath ) + return f() + end + end end +Include.ProgramPath = "Scripts/Moose/" +Include.MissionPath = Include.Path() + +env.info( "Include.ProgramPath = " .. Include.ProgramPath) +env.info( "Include.MissionPath = " .. Include.MissionPath) + Include.Files = {} ---- Various routines --- @module routines --- @author Flightcontrol -env.setErrorMessageBoxEnabled(false) - ---- Extract of MIST functions. --- @author Grimes - -routines = {} - - --- don't change these -routines.majorVersion = 3 -routines.minorVersion = 3 -routines.build = 22 - ------------------------------------------------------------------------------------------------------------------ - ----------------------------------------------------------------------------------------------- --- Utils- conversion, Lua utils, etc. -routines.utils = {} - ---from http://lua-users.org/wiki/CopyTable -routines.utils.deepCopy = function(object) - local lookup_table = {} - local function _copy(object) - if type(object) ~= "table" then - return object - elseif lookup_table[object] then - return lookup_table[object] - end - local new_table = {} - lookup_table[object] = new_table - for index, value in pairs(object) do - new_table[_copy(index)] = _copy(value) - end - return setmetatable(new_table, getmetatable(object)) - end - local objectreturn = _copy(object) - return objectreturn -end - - --- porting in Slmod's serialize_slmod2 -routines.utils.oneLineSerialize = function(tbl) -- serialization of a table all on a single line, no comments, made to replace old get_table_string function - - lookup_table = {} - - local function _Serialize( tbl ) - - if type(tbl) == 'table' then --function only works for tables! - - if lookup_table[tbl] then - return lookup_table[object] - end - - local tbl_str = {} - - lookup_table[tbl] = tbl_str - - tbl_str[#tbl_str + 1] = '{' - - for ind,val in pairs(tbl) do -- serialize its fields - local ind_str = {} - if type(ind) == "number" then - ind_str[#ind_str + 1] = '[' - ind_str[#ind_str + 1] = tostring(ind) - ind_str[#ind_str + 1] = ']=' - else --must be a string - ind_str[#ind_str + 1] = '[' - ind_str[#ind_str + 1] = routines.utils.basicSerialize(ind) - ind_str[#ind_str + 1] = ']=' - end - - local val_str = {} - if ((type(val) == 'number') or (type(val) == 'boolean')) then - val_str[#val_str + 1] = tostring(val) - val_str[#val_str + 1] = ',' - tbl_str[#tbl_str + 1] = table.concat(ind_str) - tbl_str[#tbl_str + 1] = table.concat(val_str) - elseif type(val) == 'string' then - val_str[#val_str + 1] = routines.utils.basicSerialize(val) - val_str[#val_str + 1] = ',' - tbl_str[#tbl_str + 1] = table.concat(ind_str) - tbl_str[#tbl_str + 1] = table.concat(val_str) - elseif type(val) == 'nil' then -- won't ever happen, right? - val_str[#val_str + 1] = 'nil,' - tbl_str[#tbl_str + 1] = table.concat(ind_str) - tbl_str[#tbl_str + 1] = table.concat(val_str) - elseif type(val) == 'table' then - if ind == "__index" then - -- tbl_str[#tbl_str + 1] = "__index" - -- tbl_str[#tbl_str + 1] = ',' --I think this is right, I just added it - else - - val_str[#val_str + 1] = _Serialize(val) - val_str[#val_str + 1] = ',' --I think this is right, I just added it - tbl_str[#tbl_str + 1] = table.concat(ind_str) - tbl_str[#tbl_str + 1] = table.concat(val_str) - end - elseif type(val) == 'function' then - -- tbl_str[#tbl_str + 1] = "function " .. tostring(ind) - -- tbl_str[#tbl_str + 1] = ',' --I think this is right, I just added it - else --- env.info('unable to serialize value type ' .. routines.utils.basicSerialize(type(val)) .. ' at index ' .. tostring(ind)) --- env.info( debug.traceback() ) - end - - end - tbl_str[#tbl_str + 1] = '}' - return table.concat(tbl_str) - else - return tostring(tbl) - end - end - - local objectreturn = _Serialize(tbl) - return objectreturn -end - ---porting in Slmod's "safestring" basic serialize -routines.utils.basicSerialize = function(s) - if s == nil then - return "\"\"" - else - if ((type(s) == 'number') or (type(s) == 'boolean') or (type(s) == 'function') or (type(s) == 'table') or (type(s) == 'userdata') ) then - return tostring(s) - elseif type(s) == 'string' then - s = string.format('%q', s) - return s - end - end -end - - -routines.utils.toDegree = function(angle) - return angle*180/math.pi -end - -routines.utils.toRadian = function(angle) - return angle*math.pi/180 -end - -routines.utils.metersToNM = function(meters) - return meters/1852 -end - -routines.utils.metersToFeet = function(meters) - return meters/0.3048 -end - -routines.utils.NMToMeters = function(NM) - return NM*1852 -end - -routines.utils.feetToMeters = function(feet) - return feet*0.3048 -end - -routines.utils.mpsToKnots = function(mps) - return mps*3600/1852 -end - -routines.utils.mpsToKmph = function(mps) - return mps*3.6 -end - -routines.utils.knotsToMps = function(knots) - return knots*1852/3600 -end - -routines.utils.kmphToMps = function(kmph) - return kmph/3.6 -end - -function routines.utils.makeVec2(Vec3) - if Vec3.z then - return {x = Vec3.x, y = Vec3.z} - else - return {x = Vec3.x, y = Vec3.y} -- it was actually already vec2. - end -end - -function routines.utils.makeVec3(Vec2, y) - if not Vec2.z then - if not y then - y = 0 - end - return {x = Vec2.x, y = y, z = Vec2.y} - else - return {x = Vec2.x, y = Vec2.y, z = Vec2.z} -- it was already Vec3, actually. - end -end - -function routines.utils.makeVec3GL(Vec2, offset) - local adj = offset or 0 - - if not Vec2.z then - return {x = Vec2.x, y = (land.getHeight(Vec2) + adj), z = Vec2.y} - else - return {x = Vec2.x, y = (land.getHeight({x = Vec2.x, y = Vec2.z}) + adj), z = Vec2.z} - end -end - -routines.utils.zoneToVec3 = function(zone) - local new = {} - if type(zone) == 'table' and zone.point then - new.x = zone.point.x - new.y = zone.point.y - new.z = zone.point.z - return new - elseif type(zone) == 'string' then - zone = trigger.misc.getZone(zone) - if zone then - new.x = zone.point.x - new.y = zone.point.y - new.z = zone.point.z - return new - end - end -end - --- gets heading-error corrected direction from point along vector vec. -function routines.utils.getDir(vec, point) - local dir = math.atan2(vec.z, vec.x) - dir = dir + routines.getNorthCorrection(point) - if dir < 0 then - dir = dir + 2*math.pi -- put dir in range of 0 to 2*pi - end - return dir -end - --- gets distance in meters between two points (2 dimensional) -function routines.utils.get2DDist(point1, point2) - point1 = routines.utils.makeVec3(point1) - point2 = routines.utils.makeVec3(point2) - return routines.vec.mag({x = point1.x - point2.x, y = 0, z = point1.z - point2.z}) -end - --- gets distance in meters between two points (3 dimensional) -function routines.utils.get3DDist(point1, point2) - return routines.vec.mag({x = point1.x - point2.x, y = point1.y - point2.y, z = point1.z - point2.z}) -end - - - --- From http://lua-users.org/wiki/SimpleRound --- use negative idp for rounding ahead of decimal place, positive for rounding after decimal place -routines.utils.round = function(num, idp) - local mult = 10^(idp or 0) - return math.floor(num * mult + 0.5) / mult -end - --- porting in Slmod's dostring -routines.utils.dostring = function(s) - local f, err = loadstring(s) - if f then - return true, f() - else - return false, err - end -end - - ---3D Vector manipulation -routines.vec = {} - -routines.vec.add = function(vec1, vec2) - return {x = vec1.x + vec2.x, y = vec1.y + vec2.y, z = vec1.z + vec2.z} -end - -routines.vec.sub = function(vec1, vec2) - return {x = vec1.x - vec2.x, y = vec1.y - vec2.y, z = vec1.z - vec2.z} -end - -routines.vec.scalarMult = function(vec, mult) - return {x = vec.x*mult, y = vec.y*mult, z = vec.z*mult} -end - -routines.vec.scalar_mult = routines.vec.scalarMult - -routines.vec.dp = function(vec1, vec2) - return vec1.x*vec2.x + vec1.y*vec2.y + vec1.z*vec2.z -end - -routines.vec.cp = function(vec1, vec2) - return { x = vec1.y*vec2.z - vec1.z*vec2.y, y = vec1.z*vec2.x - vec1.x*vec2.z, z = vec1.x*vec2.y - vec1.y*vec2.x} -end - -routines.vec.mag = function(vec) - return (vec.x^2 + vec.y^2 + vec.z^2)^0.5 -end - -routines.vec.getUnitVec = function(vec) - local mag = routines.vec.mag(vec) - return { x = vec.x/mag, y = vec.y/mag, z = vec.z/mag } -end - -routines.vec.rotateVec2 = function(vec2, theta) - return { x = vec2.x*math.cos(theta) - vec2.y*math.sin(theta), y = vec2.x*math.sin(theta) + vec2.y*math.cos(theta)} -end ---------------------------------------------------------------------------------------------------------------------------- - - - - --- acc- the accuracy of each easting/northing. 0, 1, 2, 3, 4, or 5. -routines.tostringMGRS = function(MGRS, acc) - if acc == 0 then - return MGRS.UTMZone .. ' ' .. MGRS.MGRSDigraph - else - return MGRS.UTMZone .. ' ' .. MGRS.MGRSDigraph .. ' ' .. string.format('%0' .. acc .. 'd', routines.utils.round(MGRS.Easting/(10^(5-acc)), 0)) - .. ' ' .. string.format('%0' .. acc .. 'd', routines.utils.round(MGRS.Northing/(10^(5-acc)), 0)) - end -end - ---[[acc: -in DM: decimal point of minutes. -In DMS: decimal point of seconds. -position after the decimal of the least significant digit: -So: -42.32 - acc of 2. -]] -routines.tostringLL = function(lat, lon, acc, DMS) - - local latHemi, lonHemi - if lat > 0 then - latHemi = 'N' - else - latHemi = 'S' - end - - if lon > 0 then - lonHemi = 'E' - else - lonHemi = 'W' - end - - lat = math.abs(lat) - lon = math.abs(lon) - - local latDeg = math.floor(lat) - local latMin = (lat - latDeg)*60 - - local lonDeg = math.floor(lon) - local lonMin = (lon - lonDeg)*60 - - if DMS then -- degrees, minutes, and seconds. - local oldLatMin = latMin - latMin = math.floor(latMin) - local latSec = routines.utils.round((oldLatMin - latMin)*60, acc) - - local oldLonMin = lonMin - lonMin = math.floor(lonMin) - local lonSec = routines.utils.round((oldLonMin - lonMin)*60, acc) - - if latSec == 60 then - latSec = 0 - latMin = latMin + 1 - end - - if lonSec == 60 then - lonSec = 0 - lonMin = lonMin + 1 - end - - local secFrmtStr -- create the formatting string for the seconds place - if acc <= 0 then -- no decimal place. - secFrmtStr = '%02d' - else - local width = 3 + acc -- 01.310 - that's a width of 6, for example. - secFrmtStr = '%0' .. width .. '.' .. acc .. 'f' - end - - return string.format('%02d', latDeg) .. ' ' .. string.format('%02d', latMin) .. '\' ' .. string.format(secFrmtStr, latSec) .. '"' .. latHemi .. ' ' - .. string.format('%02d', lonDeg) .. ' ' .. string.format('%02d', lonMin) .. '\' ' .. string.format(secFrmtStr, lonSec) .. '"' .. lonHemi - - else -- degrees, decimal minutes. - latMin = routines.utils.round(latMin, acc) - lonMin = routines.utils.round(lonMin, acc) - - if latMin == 60 then - latMin = 0 - latDeg = latDeg + 1 - end - - if lonMin == 60 then - lonMin = 0 - lonDeg = lonDeg + 1 - end - - local minFrmtStr -- create the formatting string for the minutes place - if acc <= 0 then -- no decimal place. - minFrmtStr = '%02d' - else - local width = 3 + acc -- 01.310 - that's a width of 6, for example. - minFrmtStr = '%0' .. width .. '.' .. acc .. 'f' - end - - return string.format('%02d', latDeg) .. ' ' .. string.format(minFrmtStr, latMin) .. '\'' .. latHemi .. ' ' - .. string.format('%02d', lonDeg) .. ' ' .. string.format(minFrmtStr, lonMin) .. '\'' .. lonHemi - - end -end - ---[[ required: az - radian - required: dist - meters - optional: alt - meters (set to false or nil if you don't want to use it). - optional: metric - set true to get dist and alt in km and m. - precision will always be nearest degree and NM or km.]] -routines.tostringBR = function(az, dist, alt, metric) - az = routines.utils.round(routines.utils.toDegree(az), 0) - - if metric then - dist = routines.utils.round(dist/1000, 2) - else - dist = routines.utils.round(routines.utils.metersToNM(dist), 2) - end - - local s = string.format('%03d', az) .. ' for ' .. dist - - if alt then - if metric then - s = s .. ' at ' .. routines.utils.round(alt, 0) - else - s = s .. ' at ' .. routines.utils.round(routines.utils.metersToFeet(alt), 0) - end - end - return s -end - -routines.getNorthCorrection = function(point) --gets the correction needed for true north - if not point.z then --Vec2; convert to Vec3 - point.z = point.y - point.y = 0 - end - local lat, lon = coord.LOtoLL(point) - local north_posit = coord.LLtoLO(lat + 1, lon) - return math.atan2(north_posit.z - point.z, north_posit.x - point.x) -end - - --- the main area -do - -- THE MAIN FUNCTION -- Accessed 100 times/sec. - routines.main = function() - timer.scheduleFunction(routines.main, {}, timer.getTime() + 2) --reschedule first in case of Lua error - ---------------------------------------------------------------------------------------------------------- - --area to add new stuff in - - routines.do_scheduled_functions() - end -- end of routines.main - - timer.scheduleFunction(routines.main, {}, timer.getTime() + 2) - -end - - -do - local idNum = 0 - - --Simplified event handler - routines.addEventHandler = function(f) --id is optional! - local handler = {} - idNum = idNum + 1 - handler.id = idNum - handler.f = f - handler.onEvent = function(self, event) - self.f(event) - end - world.addEventHandler(handler) - end - - routines.removeEventHandler = function(id) - for key, handler in pairs(world.eventHandlers) do - if handler.id and handler.id == id then - world.eventHandlers[key] = nil - return true - end - end - return false - end -end - --- need to return a Vec3 or Vec2? -function routines.getRandPointInCircle(point, radius, innerRadius) - local theta = 2*math.pi*math.random() - local rad = math.random() + math.random() - if rad > 1 then - rad = 2 - rad - end - - local radMult - if innerRadius and innerRadius <= radius then - radMult = (radius - innerRadius)*rad + innerRadius - else - radMult = radius*rad - end - - if not point.z then --might as well work with vec2/3 - point.z = point.y - end - - local rndCoord - if radius > 0 then - rndCoord = {x = math.cos(theta)*radMult + point.x, y = math.sin(theta)*radMult + point.z} - else - rndCoord = {x = point.x, y = point.z} - end - return rndCoord -end - -routines.goRoute = function(group, path) - local misTask = { - id = 'Mission', - params = { - route = { - points = routines.utils.deepCopy(path), - }, - }, - } - if type(group) == 'string' then - group = Group.getByName(group) - end - local groupCon = group:getController() - if groupCon then - groupCon:setTask(misTask) - return true - end - - Controller.setTask(groupCon, misTask) - return false -end - - --- Useful atomic functions from mist, ported. - -routines.ground = {} -routines.fixedWing = {} -routines.heli = {} - -routines.ground.buildWP = function(point, overRideForm, overRideSpeed) - - local wp = {} - wp.x = point.x - - if point.z then - wp.y = point.z - else - wp.y = point.y - end - local form, speed - - if point.speed and not overRideSpeed then - wp.speed = point.speed - elseif type(overRideSpeed) == 'number' then - wp.speed = overRideSpeed - else - wp.speed = routines.utils.kmphToMps(20) - end - - if point.form and not overRideForm then - form = point.form - else - form = overRideForm - end - - if not form then - wp.action = 'Cone' - else - form = string.lower(form) - if form == 'off_road' or form == 'off road' then - wp.action = 'Off Road' - elseif form == 'on_road' or form == 'on road' then - wp.action = 'On Road' - elseif form == 'rank' or form == 'line_abrest' or form == 'line abrest' or form == 'lineabrest'then - wp.action = 'Rank' - elseif form == 'cone' then - wp.action = 'Cone' - elseif form == 'diamond' then - wp.action = 'Diamond' - elseif form == 'vee' then - wp.action = 'Vee' - elseif form == 'echelon_left' or form == 'echelon left' or form == 'echelonl' then - wp.action = 'EchelonL' - elseif form == 'echelon_right' or form == 'echelon right' or form == 'echelonr' then - wp.action = 'EchelonR' - else - wp.action = 'Cone' -- if nothing matched - end - end - - wp.type = 'Turning Point' - - return wp - -end - -routines.fixedWing.buildWP = function(point, WPtype, speed, alt, altType) - - local wp = {} - wp.x = point.x - - if point.z then - wp.y = point.z - else - wp.y = point.y - end - - if alt and type(alt) == 'number' then - wp.alt = alt - else - wp.alt = 2000 - end - - if altType then - altType = string.lower(altType) - if altType == 'radio' or 'agl' then - wp.alt_type = 'RADIO' - elseif altType == 'baro' or 'asl' then - wp.alt_type = 'BARO' - end - else - wp.alt_type = 'RADIO' - end - - if point.speed then - speed = point.speed - end - - if point.type then - WPtype = point.type - end - - if not speed then - wp.speed = routines.utils.kmphToMps(500) - else - wp.speed = speed - end - - if not WPtype then - wp.action = 'Turning Point' - else - WPtype = string.lower(WPtype) - if WPtype == 'flyover' or WPtype == 'fly over' or WPtype == 'fly_over' then - wp.action = 'Fly Over Point' - elseif WPtype == 'turningpoint' or WPtype == 'turning point' or WPtype == 'turning_point' then - wp.action = 'Turning Point' - else - wp.action = 'Turning Point' - end - end - - wp.type = 'Turning Point' - return wp -end - -routines.heli.buildWP = function(point, WPtype, speed, alt, altType) - - local wp = {} - wp.x = point.x - - if point.z then - wp.y = point.z - else - wp.y = point.y - end - - if alt and type(alt) == 'number' then - wp.alt = alt - else - wp.alt = 500 - end - - if altType then - altType = string.lower(altType) - if altType == 'radio' or 'agl' then - wp.alt_type = 'RADIO' - elseif altType == 'baro' or 'asl' then - wp.alt_type = 'BARO' - end - else - wp.alt_type = 'RADIO' - end - - if point.speed then - speed = point.speed - end - - if point.type then - WPtype = point.type - end - - if not speed then - wp.speed = routines.utils.kmphToMps(200) - else - wp.speed = speed - end - - if not WPtype then - wp.action = 'Turning Point' - else - WPtype = string.lower(WPtype) - if WPtype == 'flyover' or WPtype == 'fly over' or WPtype == 'fly_over' then - wp.action = 'Fly Over Point' - elseif WPtype == 'turningpoint' or WPtype == 'turning point' or WPtype == 'turning_point' then - wp.action = 'Turning Point' - else - wp.action = 'Turning Point' - end - end - - wp.type = 'Turning Point' - return wp -end - -routines.groupToRandomPoint = function(vars) - local group = vars.group --Required - local point = vars.point --required - local radius = vars.radius or 0 - local innerRadius = vars.innerRadius - local form = vars.form or 'Cone' - local heading = vars.heading or math.random()*2*math.pi - local headingDegrees = vars.headingDegrees - local speed = vars.speed or routines.utils.kmphToMps(20) - - - local useRoads - if not vars.disableRoads then - useRoads = true - else - useRoads = false - end - - local path = {} - - if headingDegrees then - heading = headingDegrees*math.pi/180 - end - - if heading >= 2*math.pi then - heading = heading - 2*math.pi - end - - local rndCoord = routines.getRandPointInCircle(point, radius, innerRadius) - - local offset = {} - local posStart = routines.getLeadPos(group) - - offset.x = routines.utils.round(math.sin(heading - (math.pi/2)) * 50 + rndCoord.x, 3) - offset.z = routines.utils.round(math.cos(heading + (math.pi/2)) * 50 + rndCoord.y, 3) - path[#path + 1] = routines.ground.buildWP(posStart, form, speed) - - - if useRoads == true and ((point.x - posStart.x)^2 + (point.z - posStart.z)^2)^0.5 > radius * 1.3 then - path[#path + 1] = routines.ground.buildWP({['x'] = posStart.x + 11, ['z'] = posStart.z + 11}, 'off_road', speed) - path[#path + 1] = routines.ground.buildWP(posStart, 'on_road', speed) - path[#path + 1] = routines.ground.buildWP(offset, 'on_road', speed) - else - path[#path + 1] = routines.ground.buildWP({['x'] = posStart.x + 25, ['z'] = posStart.z + 25}, form, speed) - end - - path[#path + 1] = routines.ground.buildWP(offset, form, speed) - path[#path + 1] = routines.ground.buildWP(rndCoord, form, speed) - - routines.goRoute(group, path) - - return -end - -routines.groupRandomDistSelf = function(gpData, dist, form, heading, speed) - local pos = routines.getLeadPos(gpData) - local fakeZone = {} - fakeZone.radius = dist or math.random(300, 1000) - fakeZone.point = {x = pos.x, y, pos.y, z = pos.z} - routines.groupToRandomZone(gpData, fakeZone, form, heading, speed) - - return -end - -routines.groupToRandomZone = function(gpData, zone, form, heading, speed) - if type(gpData) == 'string' then - gpData = Group.getByName(gpData) - end - - if type(zone) == 'string' then - zone = trigger.misc.getZone(zone) - elseif type(zone) == 'table' and not zone.radius then - zone = trigger.misc.getZone(zone[math.random(1, #zone)]) - end - - if speed then - speed = routines.utils.kmphToMps(speed) - end - - local vars = {} - vars.group = gpData - vars.radius = zone.radius - vars.form = form - vars.headingDegrees = heading - vars.speed = speed - vars.point = routines.utils.zoneToVec3(zone) - - routines.groupToRandomPoint(vars) - - return -end - -routines.isTerrainValid = function(coord, terrainTypes) -- vec2/3 and enum or table of acceptable terrain types - if coord.z then - coord.y = coord.z - end - local typeConverted = {} - - if type(terrainTypes) == 'string' then -- if its a string it does this check - for constId, constData in pairs(land.SurfaceType) do - if string.lower(constId) == string.lower(terrainTypes) or string.lower(constData) == string.lower(terrainTypes) then - table.insert(typeConverted, constId) - end - end - elseif type(terrainTypes) == 'table' then -- if its a table it does this check - for typeId, typeData in pairs(terrainTypes) do - for constId, constData in pairs(land.SurfaceType) do - if string.lower(constId) == string.lower(typeData) or string.lower(constData) == string.lower(typeId) then - table.insert(typeConverted, constId) - end - end - end - end - for validIndex, validData in pairs(typeConverted) do - if land.getSurfaceType(coord) == land.SurfaceType[validData] then - return true - end - end - return false -end - -routines.groupToPoint = function(gpData, point, form, heading, speed, useRoads) - if type(point) == 'string' then - point = trigger.misc.getZone(point) - end - if speed then - speed = routines.utils.kmphToMps(speed) - end - - local vars = {} - vars.group = gpData - vars.form = form - vars.headingDegrees = heading - vars.speed = speed - vars.disableRoads = useRoads - vars.point = routines.utils.zoneToVec3(point) - routines.groupToRandomPoint(vars) - - return -end - - -routines.getLeadPos = function(group) - if type(group) == 'string' then -- group name - group = Group.getByName(group) - end - - local units = group:getUnits() - - local leader = units[1] - if not leader then -- SHOULD be good, but if there is a bug, this code future-proofs it then. - local lowestInd = math.huge - for ind, unit in pairs(units) do - if ind < lowestInd then - lowestInd = ind - leader = unit - end - end - end - if leader and Unit.isExist(leader) then -- maybe a little too paranoid now... - return leader:getPosition().p - end -end - ---[[ vars for routines.getMGRSString: -vars.units - table of unit names (NOT unitNameTable- maybe this should change). -vars.acc - integer between 0 and 5, inclusive -]] -routines.getMGRSString = function(vars) - local units = vars.units - local acc = vars.acc or 5 - local avgPos = routines.getAvgPos(units) - if avgPos then - return routines.tostringMGRS(coord.LLtoMGRS(coord.LOtoLL(avgPos)), acc) - end -end - ---[[ vars for routines.getLLString -vars.units - table of unit names (NOT unitNameTable- maybe this should change). -vars.acc - integer, number of numbers after decimal place -vars.DMS - if true, output in degrees, minutes, seconds. Otherwise, output in degrees, minutes. - - -]] -routines.getLLString = function(vars) - local units = vars.units - local acc = vars.acc or 3 - local DMS = vars.DMS - local avgPos = routines.getAvgPos(units) - if avgPos then - local lat, lon = coord.LOtoLL(avgPos) - return routines.tostringLL(lat, lon, acc, DMS) - end -end - ---[[ -vars.zone - table of a zone name. -vars.ref - vec3 ref point, maybe overload for vec2 as well? -vars.alt - boolean, if used, includes altitude in string -vars.metric - boolean, gives distance in km instead of NM. -]] -routines.getBRStringZone = function(vars) - local zone = trigger.misc.getZone( vars.zone ) - local ref = routines.utils.makeVec3(vars.ref, 0) -- turn it into Vec3 if it is not already. - local alt = vars.alt - local metric = vars.metric - if zone then - local vec = {x = zone.point.x - ref.x, y = zone.point.y - ref.y, z = zone.point.z - ref.z} - local dir = routines.utils.getDir(vec, ref) - local dist = routines.utils.get2DDist(zone.point, ref) - if alt then - alt = zone.y - end - return routines.tostringBR(dir, dist, alt, metric) - else - env.info( 'routines.getBRStringZone: error: zone is nil' ) - end -end - ---[[ -vars.units- table of unit names (NOT unitNameTable- maybe this should change). -vars.ref - vec3 ref point, maybe overload for vec2 as well? -vars.alt - boolean, if used, includes altitude in string -vars.metric - boolean, gives distance in km instead of NM. -]] -routines.getBRString = function(vars) - local units = vars.units - local ref = routines.utils.makeVec3(vars.ref, 0) -- turn it into Vec3 if it is not already. - local alt = vars.alt - local metric = vars.metric - local avgPos = routines.getAvgPos(units) - if avgPos then - local vec = {x = avgPos.x - ref.x, y = avgPos.y - ref.y, z = avgPos.z - ref.z} - local dir = routines.utils.getDir(vec, ref) - local dist = routines.utils.get2DDist(avgPos, ref) - if alt then - alt = avgPos.y - end - return routines.tostringBR(dir, dist, alt, metric) - end -end - - --- Returns the Vec3 coordinates of the average position of the concentration of units most in the heading direction. ---[[ vars for routines.getLeadingPos: -vars.units - table of unit names -vars.heading - direction -vars.radius - number -vars.headingDegrees - boolean, switches heading to degrees -]] -routines.getLeadingPos = function(vars) - local units = vars.units - local heading = vars.heading - local radius = vars.radius - if vars.headingDegrees then - heading = routines.utils.toRadian(vars.headingDegrees) - end - - local unitPosTbl = {} - for i = 1, #units do - local unit = Unit.getByName(units[i]) - if unit and unit:isExist() then - unitPosTbl[#unitPosTbl + 1] = unit:getPosition().p - end - end - if #unitPosTbl > 0 then -- one more more units found. - -- first, find the unit most in the heading direction - local maxPos = -math.huge - - local maxPosInd -- maxPos - the furthest in direction defined by heading; maxPosInd = - for i = 1, #unitPosTbl do - local rotatedVec2 = routines.vec.rotateVec2(routines.utils.makeVec2(unitPosTbl[i]), heading) - if (not maxPos) or maxPos < rotatedVec2.x then - maxPos = rotatedVec2.x - maxPosInd = i - end - end - - --now, get all the units around this unit... - local avgPos - if radius then - local maxUnitPos = unitPosTbl[maxPosInd] - local avgx, avgy, avgz, totNum = 0, 0, 0, 0 - for i = 1, #unitPosTbl do - if routines.utils.get2DDist(maxUnitPos, unitPosTbl[i]) <= radius then - avgx = avgx + unitPosTbl[i].x - avgy = avgy + unitPosTbl[i].y - avgz = avgz + unitPosTbl[i].z - totNum = totNum + 1 - end - end - avgPos = { x = avgx/totNum, y = avgy/totNum, z = avgz/totNum} - else - avgPos = unitPosTbl[maxPosInd] - end - - return avgPos - end -end - - ---[[ vars for routines.getLeadingMGRSString: -vars.units - table of unit names -vars.heading - direction -vars.radius - number -vars.headingDegrees - boolean, switches heading to degrees -vars.acc - number, 0 to 5. -]] -routines.getLeadingMGRSString = function(vars) - local pos = routines.getLeadingPos(vars) - if pos then - local acc = vars.acc or 5 - return routines.tostringMGRS(coord.LLtoMGRS(coord.LOtoLL(pos)), acc) - end -end - ---[[ vars for routines.getLeadingLLString: -vars.units - table of unit names -vars.heading - direction, number -vars.radius - number -vars.headingDegrees - boolean, switches heading to degrees -vars.acc - number of digits after decimal point (can be negative) -vars.DMS - boolean, true if you want DMS. -]] -routines.getLeadingLLString = function(vars) - local pos = routines.getLeadingPos(vars) - if pos then - local acc = vars.acc or 3 - local DMS = vars.DMS - local lat, lon = coord.LOtoLL(pos) - return routines.tostringLL(lat, lon, acc, DMS) - end -end - - - ---[[ vars for routines.getLeadingBRString: -vars.units - table of unit names -vars.heading - direction, number -vars.radius - number -vars.headingDegrees - boolean, switches heading to degrees -vars.metric - boolean, if true, use km instead of NM. -vars.alt - boolean, if true, include altitude. -vars.ref - vec3/vec2 reference point. -]] -routines.getLeadingBRString = function(vars) - local pos = routines.getLeadingPos(vars) - if pos then - local ref = vars.ref - local alt = vars.alt - local metric = vars.metric - - local vec = {x = pos.x - ref.x, y = pos.y - ref.y, z = pos.z - ref.z} - local dir = routines.utils.getDir(vec, ref) - local dist = routines.utils.get2DDist(pos, ref) - if alt then - alt = pos.y - end - return routines.tostringBR(dir, dist, alt, metric) - end -end - ---[[ vars for routines.message.add - vars.text = 'Hello World' - vars.displayTime = 20 - vars.msgFor = {coa = {'red'}, countries = {'Ukraine', 'Georgia'}, unitTypes = {'A-10C'}} - -]] - ---[[ vars for routines.msgMGRS -vars.units - table of unit names (NOT unitNameTable- maybe this should change). -vars.acc - integer between 0 and 5, inclusive -vars.text - text in the message -vars.displayTime - self explanatory -vars.msgFor - scope -]] -routines.msgMGRS = function(vars) - local units = vars.units - local acc = vars.acc - local text = vars.text - local displayTime = vars.displayTime - local msgFor = vars.msgFor - - local s = routines.getMGRSString{units = units, acc = acc} - local newText - if string.find(text, '%%s') then -- look for %s - newText = string.format(text, s) -- insert the coordinates into the message - else -- else, just append to the end. - newText = text .. s - end - - routines.message.add{ - text = newText, - displayTime = displayTime, - msgFor = msgFor - } -end - ---[[ vars for routines.msgLL -vars.units - table of unit names (NOT unitNameTable- maybe this should change) (Yes). -vars.acc - integer, number of numbers after decimal place -vars.DMS - if true, output in degrees, minutes, seconds. Otherwise, output in degrees, minutes. -vars.text - text in the message -vars.displayTime - self explanatory -vars.msgFor - scope -]] -routines.msgLL = function(vars) - local units = vars.units -- technically, I don't really need to do this, but it helps readability. - local acc = vars.acc - local DMS = vars.DMS - local text = vars.text - local displayTime = vars.displayTime - local msgFor = vars.msgFor - - local s = routines.getLLString{units = units, acc = acc, DMS = DMS} - local newText - if string.find(text, '%%s') then -- look for %s - newText = string.format(text, s) -- insert the coordinates into the message - else -- else, just append to the end. - newText = text .. s - end - - routines.message.add{ - text = newText, - displayTime = displayTime, - msgFor = msgFor - } - -end - - ---[[ -vars.units- table of unit names (NOT unitNameTable- maybe this should change). -vars.ref - vec3 ref point, maybe overload for vec2 as well? -vars.alt - boolean, if used, includes altitude in string -vars.metric - boolean, gives distance in km instead of NM. -vars.text - text of the message -vars.displayTime -vars.msgFor - scope -]] -routines.msgBR = function(vars) - local units = vars.units -- technically, I don't really need to do this, but it helps readability. - local ref = vars.ref -- vec2/vec3 will be handled in routines.getBRString - local alt = vars.alt - local metric = vars.metric - local text = vars.text - local displayTime = vars.displayTime - local msgFor = vars.msgFor - - local s = routines.getBRString{units = units, ref = ref, alt = alt, metric = metric} - local newText - if string.find(text, '%%s') then -- look for %s - newText = string.format(text, s) -- insert the coordinates into the message - else -- else, just append to the end. - newText = text .. s - end - - routines.message.add{ - text = newText, - displayTime = displayTime, - msgFor = msgFor - } - -end - - --------------------------------------------------------------------------------------------- --- basically, just sub-types of routines.msgBR... saves folks the work of getting the ref point. ---[[ -vars.units- table of unit names (NOT unitNameTable- maybe this should change). -vars.ref - string red, blue -vars.alt - boolean, if used, includes altitude in string -vars.metric - boolean, gives distance in km instead of NM. -vars.text - text of the message -vars.displayTime -vars.msgFor - scope -]] -routines.msgBullseye = function(vars) - if string.lower(vars.ref) == 'red' then - vars.ref = routines.DBs.missionData.bullseye.red - routines.msgBR(vars) - elseif string.lower(vars.ref) == 'blue' then - vars.ref = routines.DBs.missionData.bullseye.blue - routines.msgBR(vars) - end -end - ---[[ -vars.units- table of unit names (NOT unitNameTable- maybe this should change). -vars.ref - unit name of reference point -vars.alt - boolean, if used, includes altitude in string -vars.metric - boolean, gives distance in km instead of NM. -vars.text - text of the message -vars.displayTime -vars.msgFor - scope -]] - -routines.msgBRA = function(vars) - if Unit.getByName(vars.ref) then - vars.ref = Unit.getByName(vars.ref):getPosition().p - if not vars.alt then - vars.alt = true - end - routines.msgBR(vars) - end -end --------------------------------------------------------------------------------------------- - ---[[ vars for routines.msgLeadingMGRS: -vars.units - table of unit names -vars.heading - direction -vars.radius - number -vars.headingDegrees - boolean, switches heading to degrees (optional) -vars.acc - number, 0 to 5. -vars.text - text of the message -vars.displayTime -vars.msgFor - scope -]] -routines.msgLeadingMGRS = function(vars) - local units = vars.units -- technically, I don't really need to do this, but it helps readability. - local heading = vars.heading - local radius = vars.radius - local headingDegrees = vars.headingDegrees - local acc = vars.acc - local text = vars.text - local displayTime = vars.displayTime - local msgFor = vars.msgFor - - local s = routines.getLeadingMGRSString{units = units, heading = heading, radius = radius, headingDegrees = headingDegrees, acc = acc} - local newText - if string.find(text, '%%s') then -- look for %s - newText = string.format(text, s) -- insert the coordinates into the message - else -- else, just append to the end. - newText = text .. s - end - - routines.message.add{ - text = newText, - displayTime = displayTime, - msgFor = msgFor - } - - -end ---[[ vars for routines.msgLeadingLL: -vars.units - table of unit names -vars.heading - direction, number -vars.radius - number -vars.headingDegrees - boolean, switches heading to degrees (optional) -vars.acc - number of digits after decimal point (can be negative) -vars.DMS - boolean, true if you want DMS. (optional) -vars.text - text of the message -vars.displayTime -vars.msgFor - scope -]] -routines.msgLeadingLL = function(vars) - local units = vars.units -- technically, I don't really need to do this, but it helps readability. - local heading = vars.heading - local radius = vars.radius - local headingDegrees = vars.headingDegrees - local acc = vars.acc - local DMS = vars.DMS - local text = vars.text - local displayTime = vars.displayTime - local msgFor = vars.msgFor - - local s = routines.getLeadingLLString{units = units, heading = heading, radius = radius, headingDegrees = headingDegrees, acc = acc, DMS = DMS} - local newText - if string.find(text, '%%s') then -- look for %s - newText = string.format(text, s) -- insert the coordinates into the message - else -- else, just append to the end. - newText = text .. s - end - - routines.message.add{ - text = newText, - displayTime = displayTime, - msgFor = msgFor - } - -end - ---[[ -vars.units - table of unit names -vars.heading - direction, number -vars.radius - number -vars.headingDegrees - boolean, switches heading to degrees (optional) -vars.metric - boolean, if true, use km instead of NM. (optional) -vars.alt - boolean, if true, include altitude. (optional) -vars.ref - vec3/vec2 reference point. -vars.text - text of the message -vars.displayTime -vars.msgFor - scope -]] -routines.msgLeadingBR = function(vars) - local units = vars.units -- technically, I don't really need to do this, but it helps readability. - local heading = vars.heading - local radius = vars.radius - local headingDegrees = vars.headingDegrees - local metric = vars.metric - local alt = vars.alt - local ref = vars.ref -- vec2/vec3 will be handled in routines.getBRString - local text = vars.text - local displayTime = vars.displayTime - local msgFor = vars.msgFor - - local s = routines.getLeadingBRString{units = units, heading = heading, radius = radius, headingDegrees = headingDegrees, metric = metric, alt = alt, ref = ref} - local newText - if string.find(text, '%%s') then -- look for %s - newText = string.format(text, s) -- insert the coordinates into the message - else -- else, just append to the end. - newText = text .. s - end - - routines.message.add{ - text = newText, - displayTime = displayTime, - msgFor = msgFor - } -end - - -function spairs(t, order) - -- collect the keys - local keys = {} - for k in pairs(t) do keys[#keys+1] = k end - - -- if order function given, sort by it by passing the table and keys a, b, - -- otherwise just sort the keys - if order then - table.sort(keys, function(a,b) return order(t, a, b) end) - else - table.sort(keys) - end - - -- return the iterator function - local i = 0 - return function() - i = i + 1 - if keys[i] then - return keys[i], t[keys[i]] - end - end -end - - -function routines.IsPartOfGroupInZones( CargoGroup, LandingZones ) ---trace.f() - - local CurrentZoneID = nil - - if CargoGroup then - local CargoUnits = CargoGroup:getUnits() - for CargoUnitID, CargoUnit in pairs( CargoUnits ) do - if CargoUnit and CargoUnit:getLife() >= 1.0 then - CurrentZoneID = routines.IsUnitInZones( CargoUnit, LandingZones ) - if CurrentZoneID then - break - end - end - end - end - ---trace.r( "", "", { CurrentZoneID } ) - return CurrentZoneID -end - - - -function routines.IsUnitInZones( TransportUnit, LandingZones ) ---trace.f("", "routines.IsUnitInZones" ) - - local TransportZoneResult = nil - local TransportZonePos = nil - local TransportZone = nil - - -- fill-up some local variables to support further calculations to determine location of units within the zone. - if TransportUnit then - local TransportUnitPos = TransportUnit:getPosition().p - if type( LandingZones ) == "table" then - for LandingZoneID, LandingZoneName in pairs( LandingZones ) do - TransportZone = trigger.misc.getZone( LandingZoneName ) - if TransportZone then - TransportZonePos = {radius = TransportZone.radius, x = TransportZone.point.x, y = TransportZone.point.y, z = TransportZone.point.z} - if ((( TransportUnitPos.x - TransportZonePos.x)^2 + (TransportUnitPos.z - TransportZonePos.z)^2)^0.5 <= TransportZonePos.radius) then - TransportZoneResult = LandingZoneID - break - end - end - end - else - TransportZone = trigger.misc.getZone( LandingZones ) - TransportZonePos = {radius = TransportZone.radius, x = TransportZone.point.x, y = TransportZone.point.y, z = TransportZone.point.z} - if ((( TransportUnitPos.x - TransportZonePos.x)^2 + (TransportUnitPos.z - TransportZonePos.z)^2)^0.5 <= TransportZonePos.radius) then - TransportZoneResult = 1 - end - end - if TransportZoneResult then - --trace.i( "routines", "TransportZone:" .. TransportZoneResult ) - else - --trace.i( "routines", "TransportZone:nil logic" ) - end - return TransportZoneResult - else - --trace.i( "routines", "TransportZone:nil hard" ) - return nil - end -end - -function routines.IsUnitNearZonesRadius( TransportUnit, LandingZones, ZoneRadius ) ---trace.f("", "routines.IsUnitInZones" ) - - local TransportZoneResult = nil - local TransportZonePos = nil - local TransportZone = nil - - -- fill-up some local variables to support further calculations to determine location of units within the zone. - if TransportUnit then - local TransportUnitPos = TransportUnit:getPosition().p - if type( LandingZones ) == "table" then - for LandingZoneID, LandingZoneName in pairs( LandingZones ) do - TransportZone = trigger.misc.getZone( LandingZoneName ) - if TransportZone then - TransportZonePos = {radius = TransportZone.radius, x = TransportZone.point.x, y = TransportZone.point.y, z = TransportZone.point.z} - if ((( TransportUnitPos.x - TransportZonePos.x)^2 + (TransportUnitPos.z - TransportZonePos.z)^2)^0.5 <= ZoneRadius ) then - TransportZoneResult = LandingZoneID - break - end - end - end - else - TransportZone = trigger.misc.getZone( LandingZones ) - TransportZonePos = {radius = TransportZone.radius, x = TransportZone.point.x, y = TransportZone.point.y, z = TransportZone.point.z} - if ((( TransportUnitPos.x - TransportZonePos.x)^2 + (TransportUnitPos.z - TransportZonePos.z)^2)^0.5 <= ZoneRadius ) then - TransportZoneResult = 1 - end - end - if TransportZoneResult then - --trace.i( "routines", "TransportZone:" .. TransportZoneResult ) - else - --trace.i( "routines", "TransportZone:nil logic" ) - end - return TransportZoneResult - else - --trace.i( "routines", "TransportZone:nil hard" ) - return nil - end -end - - -function routines.IsStaticInZones( TransportStatic, LandingZones ) ---trace.f() - - local TransportZoneResult = nil - local TransportZonePos = nil - local TransportZone = nil - - -- fill-up some local variables to support further calculations to determine location of units within the zone. - local TransportStaticPos = TransportStatic:getPosition().p - if type( LandingZones ) == "table" then - for LandingZoneID, LandingZoneName in pairs( LandingZones ) do - TransportZone = trigger.misc.getZone( LandingZoneName ) - if TransportZone then - TransportZonePos = {radius = TransportZone.radius, x = TransportZone.point.x, y = TransportZone.point.y, z = TransportZone.point.z} - if ((( TransportStaticPos.x - TransportZonePos.x)^2 + (TransportStaticPos.z - TransportZonePos.z)^2)^0.5 <= TransportZonePos.radius) then - TransportZoneResult = LandingZoneID - break - end - end - end - else - TransportZone = trigger.misc.getZone( LandingZones ) - TransportZonePos = {radius = TransportZone.radius, x = TransportZone.point.x, y = TransportZone.point.y, z = TransportZone.point.z} - if ((( TransportStaticPos.x - TransportZonePos.x)^2 + (TransportStaticPos.z - TransportZonePos.z)^2)^0.5 <= TransportZonePos.radius) then - TransportZoneResult = 1 - end - end - ---trace.r( "", "", { TransportZoneResult } ) - return TransportZoneResult -end - - -function routines.IsUnitInRadius( CargoUnit, ReferencePosition, Radius ) ---trace.f() - - local Valid = true - - -- fill-up some local variables to support further calculations to determine location of units within the zone. - local CargoPos = CargoUnit:getPosition().p - local ReferenceP = ReferencePosition.p - - if (((CargoPos.x - ReferenceP.x)^2 + (CargoPos.z - ReferenceP.z)^2)^0.5 <= Radius) then - else - Valid = false - end - - return Valid -end - -function routines.IsPartOfGroupInRadius( CargoGroup, ReferencePosition, Radius ) ---trace.f() - - local Valid = true - - Valid = routines.ValidateGroup( CargoGroup, "CargoGroup", Valid ) - - -- fill-up some local variables to support further calculations to determine location of units within the zone - local CargoUnits = CargoGroup:getUnits() - for CargoUnitId, CargoUnit in pairs( CargoUnits ) do - local CargoUnitPos = CargoUnit:getPosition().p --- env.info( 'routines.IsPartOfGroupInRadius: CargoUnitPos.x = ' .. CargoUnitPos.x .. ' CargoUnitPos.z = ' .. CargoUnitPos.z ) - local ReferenceP = ReferencePosition.p --- env.info( 'routines.IsPartOfGroupInRadius: ReferenceGroupPos.x = ' .. ReferenceGroupPos.x .. ' ReferenceGroupPos.z = ' .. ReferenceGroupPos.z ) - - if ((( CargoUnitPos.x - ReferenceP.x)^2 + (CargoUnitPos.z - ReferenceP.z)^2)^0.5 <= Radius) then - else - Valid = false - break - end - end - - return Valid -end - - -function routines.ValidateString( Variable, VariableName, Valid ) ---trace.f() - - if type( Variable ) == "string" then - if Variable == "" then - error( "routines.ValidateString: error: " .. VariableName .. " must be filled out!" ) - Valid = false - end - else - error( "routines.ValidateString: error: " .. VariableName .. " is not a string." ) - Valid = false - end - ---trace.r( "", "", { Valid } ) - return Valid -end - -function routines.ValidateNumber( Variable, VariableName, Valid ) ---trace.f() - - if type( Variable ) == "number" then - else - error( "routines.ValidateNumber: error: " .. VariableName .. " is not a number." ) - Valid = false - end - ---trace.r( "", "", { Valid } ) - return Valid - -end - -function routines.ValidateGroup( Variable, VariableName, Valid ) ---trace.f() - - if Variable == nil then - error( "routines.ValidateGroup: error: " .. VariableName .. " is a nil value!" ) - Valid = false - end - ---trace.r( "", "", { Valid } ) - return Valid -end - -function routines.ValidateZone( LandingZones, VariableName, Valid ) ---trace.f() - - if LandingZones == nil then - error( "routines.ValidateGroup: error: " .. VariableName .. " is a nil value!" ) - Valid = false - end - - if type( LandingZones ) == "table" then - for LandingZoneID, LandingZoneName in pairs( LandingZones ) do - if trigger.misc.getZone( LandingZoneName ) == nil then - error( "routines.ValidateGroup: error: Zone " .. LandingZoneName .. " does not exist!" ) - Valid = false - break - end - end - else - if trigger.misc.getZone( LandingZones ) == nil then - error( "routines.ValidateGroup: error: Zone " .. LandingZones .. " does not exist!" ) - Valid = false - end - end - ---trace.r( "", "", { Valid } ) - return Valid -end - -function routines.ValidateEnumeration( Variable, VariableName, Enum, Valid ) ---trace.f() - - local ValidVariable = false - - for EnumId, EnumData in pairs( Enum ) do - if Variable == EnumData then - ValidVariable = true - break - end - end - - if ValidVariable then - else - error( 'TransportValidateEnum: " .. VariableName .. " is not a valid type.' .. Variable ) - Valid = false - end - ---trace.r( "", "", { Valid } ) - return Valid -end - -function routines.getGroupRoute(groupIdent, task) -- same as getGroupPoints but returns speed and formation type along with vec2 of point} - -- refactor to search by groupId and allow groupId and groupName as inputs - local gpId = groupIdent - if type(groupIdent) == 'string' and not tonumber(groupIdent) then - gpId = _DATABASE.Templates.Groups[groupIdent].groupId - end - - for coa_name, coa_data in pairs(env.mission.coalition) do - if (coa_name == 'red' or coa_name == 'blue') and type(coa_data) == 'table' then - if coa_data.country then --there is a country table - for cntry_id, cntry_data in pairs(coa_data.country) do - for obj_type_name, obj_type_data in pairs(cntry_data) do - if obj_type_name == "helicopter" or obj_type_name == "ship" or obj_type_name == "plane" or obj_type_name == "vehicle" then -- only these types have points - if ((type(obj_type_data) == 'table') and obj_type_data.group and (type(obj_type_data.group) == 'table') and (#obj_type_data.group > 0)) then --there's a group! - for group_num, group_data in pairs(obj_type_data.group) do - if group_data and group_data.groupId == gpId then -- this is the group we are looking for - if group_data.route and group_data.route.points and #group_data.route.points > 0 then - local points = {} - - for point_num, point in pairs(group_data.route.points) do - local routeData = {} - if not point.point then - routeData.x = point.x - routeData.y = point.y - else - routeData.point = point.point --it's possible that the ME could move to the point = Vec2 notation. - end - routeData.form = point.action - routeData.speed = point.speed - routeData.alt = point.alt - routeData.alt_type = point.alt_type - routeData.airdromeId = point.airdromeId - routeData.helipadId = point.helipadId - routeData.type = point.type - routeData.action = point.action - if task then - routeData.task = point.task - end - points[point_num] = routeData - end - - return points - end - return - end --if group_data and group_data.name and group_data.name == 'groupname' - end --for group_num, group_data in pairs(obj_type_data.group) do - end --if ((type(obj_type_data) == 'table') and obj_type_data.group and (type(obj_type_data.group) == 'table') and (#obj_type_data.group > 0)) then - end --if obj_type_name == "helicopter" or obj_type_name == "ship" or obj_type_name == "plane" or obj_type_name == "vehicle" or obj_type_name == "static" then - end --for obj_type_name, obj_type_data in pairs(cntry_data) do - end --for cntry_id, cntry_data in pairs(coa_data.country) do - end --if coa_data.country then --there is a country table - end --if coa_name == 'red' or coa_name == 'blue' and type(coa_data) == 'table' then - end --for coa_name, coa_data in pairs(mission.coalition) do -end - -routines.ground.patrolRoute = function(vars) - - - local tempRoute = {} - local useRoute = {} - local gpData = vars.gpData - if type(gpData) == 'string' then - gpData = Group.getByName(gpData) - end - - local useGroupRoute - if not vars.useGroupRoute then - useGroupRoute = vars.gpData - else - useGroupRoute = vars.useGroupRoute - end - local routeProvided = false - if not vars.route then - if useGroupRoute then - tempRoute = routines.getGroupRoute(useGroupRoute) - end - else - useRoute = vars.route - local posStart = routines.getLeadPos(gpData) - useRoute[1] = routines.ground.buildWP(posStart, useRoute[1].action, useRoute[1].speed) - routeProvided = true - end - - - local overRideSpeed = vars.speed or 'default' - local pType = vars.pType - local offRoadForm = vars.offRoadForm or 'default' - local onRoadForm = vars.onRoadForm or 'default' - - if routeProvided == false and #tempRoute > 0 then - local posStart = routines.getLeadPos(gpData) - - - useRoute[#useRoute + 1] = routines.ground.buildWP(posStart, offRoadForm, overRideSpeed) - for i = 1, #tempRoute do - local tempForm = tempRoute[i].action - local tempSpeed = tempRoute[i].speed - - if offRoadForm == 'default' then - tempForm = tempRoute[i].action - end - if onRoadForm == 'default' then - onRoadForm = 'On Road' - end - if (string.lower(tempRoute[i].action) == 'on road' or string.lower(tempRoute[i].action) == 'onroad' or string.lower(tempRoute[i].action) == 'on_road') then - tempForm = onRoadForm - else - tempForm = offRoadForm - end - - if type(overRideSpeed) == 'number' then - tempSpeed = overRideSpeed - end - - - useRoute[#useRoute + 1] = routines.ground.buildWP(tempRoute[i], tempForm, tempSpeed) - end - - if pType and string.lower(pType) == 'doubleback' then - local curRoute = routines.utils.deepCopy(useRoute) - for i = #curRoute, 2, -1 do - useRoute[#useRoute + 1] = routines.ground.buildWP(curRoute[i], curRoute[i].action, curRoute[i].speed) - end - end - - useRoute[1].action = useRoute[#useRoute].action -- make it so the first WP matches the last WP - end - - local cTask3 = {} - local newPatrol = {} - newPatrol.route = useRoute - newPatrol.gpData = gpData:getName() - cTask3[#cTask3 + 1] = 'routines.ground.patrolRoute(' - cTask3[#cTask3 + 1] = routines.utils.oneLineSerialize(newPatrol) - cTask3[#cTask3 + 1] = ')' - cTask3 = table.concat(cTask3) - local tempTask = { - id = 'WrappedAction', - params = { - action = { - id = 'Script', - params = { - command = cTask3, - - }, - }, - }, - } - - - useRoute[#useRoute].task = tempTask - routines.goRoute(gpData, useRoute) - - return -end - -routines.ground.patrol = function(gpData, pType, form, speed) - local vars = {} - - if type(gpData) == 'table' and gpData:getName() then - gpData = gpData:getName() - end - - vars.useGroupRoute = gpData - vars.gpData = gpData - vars.pType = pType - vars.offRoadForm = form - vars.speed = speed - - routines.ground.patrolRoute(vars) - - return -end - -function routines.GetUnitHeight( CheckUnit ) ---trace.f( "routines" ) - - local UnitPoint = CheckUnit:getPoint() - local UnitPosition = { x = UnitPoint.x, y = UnitPoint.z } - local UnitHeight = UnitPoint.y - - local LandHeight = land.getHeight( UnitPosition ) - - --env.info(( 'CarrierHeight: LandHeight = ' .. LandHeight .. ' CarrierHeight = ' .. CarrierHeight )) - - --trace.f( "routines", "Unit Height = " .. UnitHeight - LandHeight ) - - return UnitHeight - LandHeight - -end - - - -Su34Status = { status = {} } -boardMsgRed = { statusMsg = "" } -boardMsgAll = { timeMsg = "" } -SpawnSettings = {} -Su34MenuPath = {} -Su34Menus = 0 - - -function Su34AttackCarlVinson(groupName) ---trace.menu("", "Su34AttackCarlVinson") - local groupSu34 = Group.getByName( groupName ) - local controllerSu34 = groupSu34.getController(groupSu34) - local groupCarlVinson = Group.getByName("US Carl Vinson #001") - controllerSu34.setOption( controllerSu34, AI.Option.Air.id.ROE, AI.Option.Air.val.ROE.OPEN_FIRE ) - controllerSu34.setOption( controllerSu34, AI.Option.Air.id.REACTION_ON_THREAT, AI.Option.Air.val.REACTION_ON_THREAT.EVADE_FIRE ) - if groupCarlVinson ~= nil then - controllerSu34.pushTask(controllerSu34,{id = 'AttackGroup', params = { groupId = groupCarlVinson:getID(), expend = AI.Task.WeaponExpend.ALL, attackQtyLimit = true}}) - end - Su34Status.status[groupName] = 1 - MessageToRed( string.format('%s: ',groupName) .. 'Attacking carrier Carl Vinson. ', 10, 'RedStatus' .. groupName ) -end - -function Su34AttackWest(groupName) ---trace.f("","Su34AttackWest") - local groupSu34 = Group.getByName( groupName ) - local controllerSu34 = groupSu34.getController(groupSu34) - local groupShipWest1 = Group.getByName("US Ship West #001") - local groupShipWest2 = Group.getByName("US Ship West #002") - controllerSu34.setOption( controllerSu34, AI.Option.Air.id.ROE, AI.Option.Air.val.ROE.OPEN_FIRE ) - controllerSu34.setOption( controllerSu34, AI.Option.Air.id.REACTION_ON_THREAT, AI.Option.Air.val.REACTION_ON_THREAT.EVADE_FIRE ) - if groupShipWest1 ~= nil then - controllerSu34.pushTask(controllerSu34,{id = 'AttackGroup', params = { groupId = groupShipWest1:getID(), expend = AI.Task.WeaponExpend.ALL, attackQtyLimit = true}}) - end - if groupShipWest2 ~= nil then - controllerSu34.pushTask(controllerSu34,{id = 'AttackGroup', params = { groupId = groupShipWest2:getID(), expend = AI.Task.WeaponExpend.ALL, attackQtyLimit = true}}) - end - Su34Status.status[groupName] = 2 - MessageToRed( string.format('%s: ',groupName) .. 'Attacking invading ships in the west. ', 10, 'RedStatus' .. groupName ) -end - -function Su34AttackNorth(groupName) ---trace.menu("","Su34AttackNorth") - local groupSu34 = Group.getByName( groupName ) - local controllerSu34 = groupSu34.getController(groupSu34) - local groupShipNorth1 = Group.getByName("US Ship North #001") - local groupShipNorth2 = Group.getByName("US Ship North #002") - local groupShipNorth3 = Group.getByName("US Ship North #003") - controllerSu34.setOption( controllerSu34, AI.Option.Air.id.ROE, AI.Option.Air.val.ROE.OPEN_FIRE ) - controllerSu34.setOption( controllerSu34, AI.Option.Air.id.REACTION_ON_THREAT, AI.Option.Air.val.REACTION_ON_THREAT.EVADE_FIRE ) - if groupShipNorth1 ~= nil then - controllerSu34.pushTask(controllerSu34,{id = 'AttackGroup', params = { groupId = groupShipNorth1:getID(), expend = AI.Task.WeaponExpend.ALL, attackQtyLimit = false}}) - end - if groupShipNorth2 ~= nil then - controllerSu34.pushTask(controllerSu34,{id = 'AttackGroup', params = { groupId = groupShipNorth2:getID(), expend = AI.Task.WeaponExpend.ALL, attackQtyLimit = false}}) - end - if groupShipNorth3 ~= nil then - controllerSu34.pushTask(controllerSu34,{id = 'AttackGroup', params = { groupId = groupShipNorth3:getID(), expend = AI.Task.WeaponExpend.ALL, attackQtyLimit = false}}) - end - Su34Status.status[groupName] = 3 - MessageToRed( string.format('%s: ',groupName) .. 'Attacking invading ships in the north. ', 10, 'RedStatus' .. groupName ) -end - -function Su34Orbit(groupName) ---trace.menu("","Su34Orbit") - local groupSu34 = Group.getByName( groupName ) - local controllerSu34 = groupSu34:getController() - controllerSu34.setOption( controllerSu34, AI.Option.Air.id.ROE, AI.Option.Air.val.ROE.WEAPON_HOLD ) - controllerSu34.setOption( controllerSu34, AI.Option.Air.id.REACTION_ON_THREAT, AI.Option.Air.val.REACTION_ON_THREAT.EVADE_FIRE ) - controllerSu34:pushTask( {id = 'ControlledTask', params = { task = { id = 'Orbit', params = { pattern = AI.Task.OrbitPattern.RACE_TRACK } }, stopCondition = { duration = 600 } } } ) - Su34Status.status[groupName] = 4 - MessageToRed( string.format('%s: ',groupName) .. 'In orbit and awaiting further instructions. ', 10, 'RedStatus' .. groupName ) -end - -function Su34TakeOff(groupName) ---trace.menu("","Su34TakeOff") - local groupSu34 = Group.getByName( groupName ) - local controllerSu34 = groupSu34:getController() - controllerSu34.setOption( controllerSu34, AI.Option.Air.id.ROE, AI.Option.Air.val.ROE.WEAPON_HOLD ) - controllerSu34.setOption( controllerSu34, AI.Option.Air.id.REACTION_ON_THREAT, AI.Option.Air.val.REACTION_ON_THREAT.BYPASS_AND_ESCAPE ) - Su34Status.status[groupName] = 8 - MessageToRed( string.format('%s: ',groupName) .. 'Take-Off. ', 10, 'RedStatus' .. groupName ) -end - -function Su34Hold(groupName) ---trace.menu("","Su34Hold") - local groupSu34 = Group.getByName( groupName ) - local controllerSu34 = groupSu34:getController() - controllerSu34.setOption( controllerSu34, AI.Option.Air.id.ROE, AI.Option.Air.val.ROE.WEAPON_HOLD ) - controllerSu34.setOption( controllerSu34, AI.Option.Air.id.REACTION_ON_THREAT, AI.Option.Air.val.REACTION_ON_THREAT.BYPASS_AND_ESCAPE ) - Su34Status.status[groupName] = 5 - MessageToRed( string.format('%s: ',groupName) .. 'Holding Weapons. ', 10, 'RedStatus' .. groupName ) -end - -function Su34RTB(groupName) ---trace.menu("","Su34RTB") - Su34Status.status[groupName] = 6 - MessageToRed( string.format('%s: ',groupName) .. 'Return to Krasnodar. ', 10, 'RedStatus' .. groupName ) -end - -function Su34Destroyed(groupName) ---trace.menu("","Su34Destroyed") - Su34Status.status[groupName] = 7 - MessageToRed( string.format('%s: ',groupName) .. 'Destroyed. ', 30, 'RedStatus' .. groupName ) -end - -function GroupAlive( groupName ) ---trace.menu("","GroupAlive") - local groupTest = Group.getByName( groupName ) - - local groupExists = false - - if groupTest then - groupExists = groupTest:isExist() - end - - --trace.r( "", "", { groupExists } ) - return groupExists -end - -function Su34IsDead() ---trace.f() - -end - -function Su34OverviewStatus() ---trace.menu("","Su34OverviewStatus") - local msg = "" - local currentStatus = 0 - local Exists = false - - for groupName, currentStatus in pairs(Su34Status.status) do - - env.info(('Su34 Overview Status: GroupName = ' .. groupName )) - Alive = GroupAlive( groupName ) - - if Alive then - if currentStatus == 1 then - msg = msg .. string.format("%s: ",groupName) - msg = msg .. "Attacking carrier Carl Vinson. " - elseif currentStatus == 2 then - msg = msg .. string.format("%s: ",groupName) - msg = msg .. "Attacking supporting ships in the west. " - elseif currentStatus == 3 then - msg = msg .. string.format("%s: ",groupName) - msg = msg .. "Attacking invading ships in the north. " - elseif currentStatus == 4 then - msg = msg .. string.format("%s: ",groupName) - msg = msg .. "In orbit and awaiting further instructions. " - elseif currentStatus == 5 then - msg = msg .. string.format("%s: ",groupName) - msg = msg .. "Holding Weapons. " - elseif currentStatus == 6 then - msg = msg .. string.format("%s: ",groupName) - msg = msg .. "Return to Krasnodar. " - elseif currentStatus == 7 then - msg = msg .. string.format("%s: ",groupName) - msg = msg .. "Destroyed. " - elseif currentStatus == 8 then - msg = msg .. string.format("%s: ",groupName) - msg = msg .. "Take-Off. " - end - else - if currentStatus == 7 then - msg = msg .. string.format("%s: ",groupName) - msg = msg .. "Destroyed. " - else - Su34Destroyed(groupName) - end - end - end - - boardMsgRed.statusMsg = msg -end - - -function UpdateBoardMsg() ---trace.f() - Su34OverviewStatus() - MessageToRed( boardMsgRed.statusMsg, 15, 'RedStatus' ) -end - -function MusicReset( flg ) ---trace.f() - trigger.action.setUserFlag(95,flg) -end - -function PlaneActivate(groupNameFormat, flg) ---trace.f() - local groupName = groupNameFormat .. string.format("#%03d", trigger.misc.getUserFlag(flg)) - --trigger.action.outText(groupName,10) - trigger.action.activateGroup(Group.getByName(groupName)) -end - -function Su34Menu(groupName) ---trace.f() - - --env.info(( 'Su34Menu(' .. groupName .. ')' )) - local groupSu34 = Group.getByName( groupName ) - - if Su34Status.status[groupName] == 1 or - Su34Status.status[groupName] == 2 or - Su34Status.status[groupName] == 3 or - Su34Status.status[groupName] == 4 or - Su34Status.status[groupName] == 5 then - if Su34MenuPath[groupName] == nil then - if planeMenuPath == nil then - planeMenuPath = missionCommands.addSubMenuForCoalition( - coalition.side.RED, - "SU-34 anti-ship flights", - nil - ) - end - Su34MenuPath[groupName] = missionCommands.addSubMenuForCoalition( - coalition.side.RED, - "Flight " .. groupName, - planeMenuPath - ) - - missionCommands.addCommandForCoalition( - coalition.side.RED, - "Attack carrier Carl Vinson", - Su34MenuPath[groupName], - Su34AttackCarlVinson, - groupName - ) - - missionCommands.addCommandForCoalition( - coalition.side.RED, - "Attack ships in the west", - Su34MenuPath[groupName], - Su34AttackWest, - groupName - ) - - missionCommands.addCommandForCoalition( - coalition.side.RED, - "Attack ships in the north", - Su34MenuPath[groupName], - Su34AttackNorth, - groupName - ) - - missionCommands.addCommandForCoalition( - coalition.side.RED, - "Hold position and await instructions", - Su34MenuPath[groupName], - Su34Orbit, - groupName - ) - - missionCommands.addCommandForCoalition( - coalition.side.RED, - "Report status", - Su34MenuPath[groupName], - Su34OverviewStatus - ) - end - else - if Su34MenuPath[groupName] then - missionCommands.removeItemForCoalition(coalition.side.RED, Su34MenuPath[groupName]) - end - end -end - ---- Obsolete function, but kept to rework in framework. - -function ChooseInfantry ( TeleportPrefixTable, TeleportMax ) ---trace.f("Spawn") - --env.info(( 'ChooseInfantry: ' )) - - TeleportPrefixTableCount = #TeleportPrefixTable - TeleportPrefixTableIndex = math.random( 1, TeleportPrefixTableCount ) - - --env.info(( 'ChooseInfantry: TeleportPrefixTableIndex = ' .. TeleportPrefixTableIndex .. ' TeleportPrefixTableCount = ' .. TeleportPrefixTableCount .. ' TeleportMax = ' .. TeleportMax )) - - local TeleportFound = false - local TeleportLoop = true - local Index = TeleportPrefixTableIndex - local TeleportPrefix = '' - - while TeleportLoop do - TeleportPrefix = TeleportPrefixTable[Index] - if SpawnSettings[TeleportPrefix] then - if SpawnSettings[TeleportPrefix]['SpawnCount'] - 1 < TeleportMax then - SpawnSettings[TeleportPrefix]['SpawnCount'] = SpawnSettings[TeleportPrefix]['SpawnCount'] + 1 - TeleportFound = true - else - TeleportFound = false - end - else - SpawnSettings[TeleportPrefix] = {} - SpawnSettings[TeleportPrefix]['SpawnCount'] = 0 - TeleportFound = true - end - if TeleportFound then - TeleportLoop = false - else - if Index < TeleportPrefixTableCount then - Index = Index + 1 - else - TeleportLoop = false - end - end - --env.info(( 'ChooseInfantry: Loop 1 - TeleportPrefix = ' .. TeleportPrefix .. ' Index = ' .. Index )) - end - - if TeleportFound == false then - TeleportLoop = true - Index = 1 - while TeleportLoop do - TeleportPrefix = TeleportPrefixTable[Index] - if SpawnSettings[TeleportPrefix] then - if SpawnSettings[TeleportPrefix]['SpawnCount'] - 1 < TeleportMax then - SpawnSettings[TeleportPrefix]['SpawnCount'] = SpawnSettings[TeleportPrefix]['SpawnCount'] + 1 - TeleportFound = true - else - TeleportFound = false - end - else - SpawnSettings[TeleportPrefix] = {} - SpawnSettings[TeleportPrefix]['SpawnCount'] = 0 - TeleportFound = true - end - if TeleportFound then - TeleportLoop = false - else - if Index < TeleportPrefixTableIndex then - Index = Index + 1 - else - TeleportLoop = false - end - end - --env.info(( 'ChooseInfantry: Loop 2 - TeleportPrefix = ' .. TeleportPrefix .. ' Index = ' .. Index )) - end - end - - local TeleportGroupName = '' - if TeleportFound == true then - TeleportGroupName = TeleportPrefix .. string.format("#%03d", SpawnSettings[TeleportPrefix]['SpawnCount'] ) - else - TeleportGroupName = '' - end - - --env.info(('ChooseInfantry: TeleportGroupName = ' .. TeleportGroupName )) - --env.info(('ChooseInfantry: return')) - - return TeleportGroupName -end - -SpawnedInfantry = 0 - -function LandCarrier ( CarrierGroup, LandingZonePrefix ) ---trace.f() - --env.info(( 'LandCarrier: ' )) - --env.info(( 'LandCarrier: CarrierGroup = ' .. CarrierGroup:getName() )) - --env.info(( 'LandCarrier: LandingZone = ' .. LandingZonePrefix )) - - local controllerGroup = CarrierGroup:getController() - - local LandingZone = trigger.misc.getZone(LandingZonePrefix) - local LandingZonePos = {} - LandingZonePos.x = LandingZone.point.x + math.random(LandingZone.radius * -1, LandingZone.radius) - LandingZonePos.y = LandingZone.point.z + math.random(LandingZone.radius * -1, LandingZone.radius) - - controllerGroup:pushTask( { id = 'Land', params = { point = LandingZonePos, durationFlag = true, duration = 10 } } ) - - --env.info(( 'LandCarrier: end' )) -end - -EscortCount = 0 -function EscortCarrier ( CarrierGroup, EscortPrefix, EscortLastWayPoint, EscortEngagementDistanceMax, EscortTargetTypes ) ---trace.f() - --env.info(( 'EscortCarrier: ' )) - --env.info(( 'EscortCarrier: CarrierGroup = ' .. CarrierGroup:getName() )) - --env.info(( 'EscortCarrier: EscortPrefix = ' .. EscortPrefix )) - - local CarrierName = CarrierGroup:getName() - - local EscortMission = {} - local CarrierMission = {} - - local EscortMission = SpawnMissionGroup( EscortPrefix ) - local CarrierMission = SpawnMissionGroup( CarrierGroup:getName() ) - - if EscortMission ~= nil and CarrierMission ~= nil then - - EscortCount = EscortCount + 1 - EscortMissionName = string.format( EscortPrefix .. '#Escort %s', CarrierName ) - EscortMission.name = EscortMissionName - EscortMission.groupId = nil - EscortMission.lateActivation = false - EscortMission.taskSelected = false - - local EscortUnits = #EscortMission.units - for u = 1, EscortUnits do - EscortMission.units[u].name = string.format( EscortPrefix .. '#Escort %s %02d', CarrierName, u ) - EscortMission.units[u].unitId = nil - end - - - EscortMission.route.points[1].task = { id = "ComboTask", - params = - { - tasks = - { - [1] = - { - enabled = true, - auto = false, - id = "Escort", - number = 1, - params = - { - lastWptIndexFlagChangedManually = false, - groupId = CarrierGroup:getID(), - lastWptIndex = nil, - lastWptIndexFlag = false, - engagementDistMax = EscortEngagementDistanceMax, - targetTypes = EscortTargetTypes, - pos = - { - y = 20, - x = 20, - z = 0, - } -- end of ["pos"] - } -- end of ["params"] - } -- end of [1] - } -- end of ["tasks"] - } -- end of ["params"] - } -- end of ["task"] - - SpawnGroupAdd( EscortPrefix, EscortMission ) - - end -end - -function SendMessageToCarrier( CarrierGroup, CarrierMessage ) ---trace.f() - - if CarrierGroup ~= nil then - MessageToGroup( CarrierGroup, CarrierMessage, 30, 'Carrier/' .. CarrierGroup:getName() ) - end - -end - -function MessageToGroup( MsgGroup, MsgText, MsgTime, MsgName ) ---trace.f() - - if type(MsgGroup) == 'string' then - --env.info( 'MessageToGroup: Converted MsgGroup string "' .. MsgGroup .. '" into a Group structure.' ) - MsgGroup = Group.getByName( MsgGroup ) - end - - if MsgGroup ~= nil then - local MsgTable = {} - MsgTable.text = MsgText - MsgTable.displayTime = MsgTime - MsgTable.msgFor = { units = { MsgGroup:getUnits()[1]:getName() } } - MsgTable.name = MsgName - --routines.message.add( MsgTable ) - --env.info(('MessageToGroup: Message sent to ' .. MsgGroup:getUnits()[1]:getName() .. ' -> ' .. MsgText )) - end -end - -function MessageToUnit( UnitName, MsgText, MsgTime, MsgName ) ---trace.f() - - if UnitName ~= nil then - local MsgTable = {} - MsgTable.text = MsgText - MsgTable.displayTime = MsgTime - MsgTable.msgFor = { units = { UnitName } } - MsgTable.name = MsgName - --routines.message.add( MsgTable ) - end -end - -function MessageToAll( MsgText, MsgTime, MsgName ) ---trace.f() - - MESSAGE:New( MsgText, MsgTime, "Message" ):ToCoalition( coalition.side.RED ):ToCoalition( coalition.side.BLUE ) -end - -function MessageToRed( MsgText, MsgTime, MsgName ) ---trace.f() - - MESSAGE:New( MsgText, MsgTime, "To Red Coalition" ):ToCoalition( coalition.side.RED ) -end - -function MessageToBlue( MsgText, MsgTime, MsgName ) ---trace.f() - - MESSAGE:New( MsgText, MsgTime, "To Blue Coalition" ):ToCoalition( coalition.side.RED ) -end - -function getCarrierHeight( CarrierGroup ) ---trace.f() - - if CarrierGroup ~= nil then - if table.getn(CarrierGroup:getUnits()) == 1 then - local CarrierUnit = CarrierGroup:getUnits()[1] - local CurrentPoint = CarrierUnit:getPoint() - - local CurrentPosition = { x = CurrentPoint.x, y = CurrentPoint.z } - local CarrierHeight = CurrentPoint.y - - local LandHeight = land.getHeight( CurrentPosition ) - - --env.info(( 'CarrierHeight: LandHeight = ' .. LandHeight .. ' CarrierHeight = ' .. CarrierHeight )) - - return CarrierHeight - LandHeight - else - return 999999 - end - else - return 999999 - end - -end - -function GetUnitHeight( CheckUnit ) ---trace.f() - - local UnitPoint = CheckUnit:getPoint() - local UnitPosition = { x = CurrentPoint.x, y = CurrentPoint.z } - local UnitHeight = CurrentPoint.y - - local LandHeight = land.getHeight( CurrentPosition ) - - --env.info(( 'CarrierHeight: LandHeight = ' .. LandHeight .. ' CarrierHeight = ' .. CarrierHeight )) - - return UnitHeight - LandHeight - -end - - -_MusicTable = {} -_MusicTable.Files = {} -_MusicTable.Queue = {} -_MusicTable.FileCnt = 0 - - -function MusicRegister( SndRef, SndFile, SndTime ) ---trace.f() - - env.info(( 'MusicRegister: SndRef = ' .. SndRef )) - env.info(( 'MusicRegister: SndFile = ' .. SndFile )) - env.info(( 'MusicRegister: SndTime = ' .. SndTime )) - - - _MusicTable.FileCnt = _MusicTable.FileCnt + 1 - - _MusicTable.Files[_MusicTable.FileCnt] = {} - _MusicTable.Files[_MusicTable.FileCnt].Ref = SndRef - _MusicTable.Files[_MusicTable.FileCnt].File = SndFile - _MusicTable.Files[_MusicTable.FileCnt].Time = SndTime - - if not _MusicTable.Function then - _MusicTable.Function = routines.scheduleFunction( MusicScheduler, { }, timer.getTime() + 10, 10) - end - -end - -function MusicToPlayer( SndRef, PlayerName, SndContinue ) ---trace.f() - - --env.info(( 'MusicToPlayer: SndRef = ' .. SndRef )) - - local PlayerUnits = AlivePlayerUnits() - for PlayerUnitIdx, PlayerUnit in pairs(PlayerUnits) do - local PlayerUnitName = PlayerUnit:getPlayerName() - --env.info(( 'MusicToPlayer: PlayerUnitName = ' .. PlayerUnitName )) - if PlayerName == PlayerUnitName then - PlayerGroup = PlayerUnit:getGroup() - if PlayerGroup then - --env.info(( 'MusicToPlayer: PlayerGroup = ' .. PlayerGroup:getName() )) - MusicToGroup( SndRef, PlayerGroup, SndContinue ) - end - break - end - end - - --env.info(( 'MusicToPlayer: end' )) - -end - -function MusicToGroup( SndRef, SndGroup, SndContinue ) ---trace.f() - - --env.info(( 'MusicToGroup: SndRef = ' .. SndRef )) - - if SndGroup ~= nil then - if _MusicTable and _MusicTable.FileCnt > 0 then - if SndGroup:isExist() then - if MusicCanStart(SndGroup:getUnit(1):getPlayerName()) then - --env.info(( 'MusicToGroup: OK for Sound.' )) - local SndIdx = 0 - if SndRef == '' then - --env.info(( 'MusicToGroup: SndRef as empty. Queueing at random.' )) - SndIdx = math.random( 1, _MusicTable.FileCnt ) - else - for SndIdx = 1, _MusicTable.FileCnt do - if _MusicTable.Files[SndIdx].Ref == SndRef then - break - end - end - end - --env.info(( 'MusicToGroup: SndIdx = ' .. SndIdx )) - --env.info(( 'MusicToGroup: Queueing Music ' .. _MusicTable.Files[SndIdx].File .. ' for Group ' .. SndGroup:getID() )) - trigger.action.outSoundForGroup( SndGroup:getID(), _MusicTable.Files[SndIdx].File ) - MessageToGroup( SndGroup, 'Playing ' .. _MusicTable.Files[SndIdx].File, 15, 'Music-' .. SndGroup:getUnit(1):getPlayerName() ) - - local SndQueueRef = SndGroup:getUnit(1):getPlayerName() - if _MusicTable.Queue[SndQueueRef] == nil then - _MusicTable.Queue[SndQueueRef] = {} - end - _MusicTable.Queue[SndQueueRef].Start = timer.getTime() - _MusicTable.Queue[SndQueueRef].PlayerName = SndGroup:getUnit(1):getPlayerName() - _MusicTable.Queue[SndQueueRef].Group = SndGroup - _MusicTable.Queue[SndQueueRef].ID = SndGroup:getID() - _MusicTable.Queue[SndQueueRef].Ref = SndIdx - _MusicTable.Queue[SndQueueRef].Continue = SndContinue - _MusicTable.Queue[SndQueueRef].Type = Group - end - end - end - end -end - -function MusicCanStart(PlayerName) ---trace.f() - - --env.info(( 'MusicCanStart:' )) - - local MusicOut = false - - if _MusicTable['Queue'] ~= nil and _MusicTable.FileCnt > 0 then - --env.info(( 'MusicCanStart: PlayerName = ' .. PlayerName )) - local PlayerFound = false - local MusicStart = 0 - local MusicTime = 0 - for SndQueueIdx, SndQueue in pairs( _MusicTable.Queue ) do - if SndQueue.PlayerName == PlayerName then - PlayerFound = true - MusicStart = SndQueue.Start - MusicTime = _MusicTable.Files[SndQueue.Ref].Time - break - end - end - if PlayerFound then - --env.info(( 'MusicCanStart: MusicStart = ' .. MusicStart )) - --env.info(( 'MusicCanStart: MusicTime = ' .. MusicTime )) - --env.info(( 'MusicCanStart: timer.getTime() = ' .. timer.getTime() )) - - if MusicStart + MusicTime <= timer.getTime() then - MusicOut = true - end - else - MusicOut = true - end - end - - if MusicOut then - --env.info(( 'MusicCanStart: true' )) - else - --env.info(( 'MusicCanStart: false' )) - end - - return MusicOut -end - -function MusicScheduler() ---trace.scheduled("", "MusicScheduler") - - --env.info(( 'MusicScheduler:' )) - if _MusicTable['Queue'] ~= nil and _MusicTable.FileCnt > 0 then - --env.info(( 'MusicScheduler: Walking Sound Queue.')) - for SndQueueIdx, SndQueue in pairs( _MusicTable.Queue ) do - if SndQueue.Continue then - if MusicCanStart(SndQueue.PlayerName) then - --env.info(('MusicScheduler: MusicToGroup')) - MusicToPlayer( '', SndQueue.PlayerName, true ) - end - end - end - end - -end - - -env.info(( 'Init: Scripts Loaded v1.1' )) - ---- BASE classes. --- --- @{#BASE} class --- ============== --- The @{#BASE} class is the super class for most of the classes defined within MOOSE. --- --- It handles: --- --- * The construction and inheritance of child classes. --- * The tracing of objects during mission execution within the DCS.log file (under saved games folder). --- --- Note: Normally you would not use the BASE class unless you are extending the MOOSE framework with new classes. --- --- BASE Trace functionality --- ======================== --- The BASE class contains trace methods to trace progress within a mission execution of a certain object. --- Note that these trace methods are inherited by each MOOSE class interiting BASE. --- As such, each object created from derived class from BASE can use the tracing functions to trace its execution. --- --- Trace a function call --- --------------------- --- There are basically 3 types of tracing methods available within BASE: --- --- * @{#BASE.F}: Trace the beginning of a function and its given parameters. --- * @{#BASE.T}: Trace further logic within a function giving optional variables or parameters. --- * @{#BASE.E}: Trace an execption within a function giving optional variables or parameters. An exception will always be traced. --- --- Tracing levels --- -------------- --- There are 3 tracing levels within MOOSE. --- These tracing levels were defined to avoid bulks of tracing to be generated by lots of objects. --- --- As such, the F and T methods have additional variants to trace level 2 and 3 respectively: --- --- * @{#BASE.F2}: Trace the beginning of a function and its given parameters with tracing level 2. --- * @{#BASE.F3}: Trace the beginning of a function and its given parameters with tracing level 3. --- * @{#BASE.T2}: Trace further logic within a function giving optional variables or parameters with tracing level 2. --- * @{#BASE.T3}: Trace further logic within a function giving optional variables or parameters with tracing level 3. --- --- BASE Inheritance support --- ======================== --- The following methods are available to support inheritance: --- --- * @{#BASE.Inherit}: Inherits from a class. --- * @{#BASE.Inherited}: Returns the parent class from the class. --- --- Future --- ====== --- Further methods may be added to BASE whenever there is a need to make "overall" functions available within MOOSE. --- --- ==== --- --- @module Base --- @author FlightControl - - - -local _TraceOn = true -local _TraceLevel = 1 -local _TraceAll = false -local _TraceClass = {} -local _TraceClassMethod = {} - ---- The BASE Class --- @type BASE --- @field ClassName The name of the class. --- @field ClassID The ID number of the class. -BASE = { - ClassName = "BASE", - ClassID = 0, - Events = {}, - States = {} -} - ---- The Formation Class --- @type FORMATION --- @field Cone A cone formation. -FORMATION = { - Cone = "Cone" -} - - - ---- The base constructor. This is the top top class of all classed defined within the MOOSE. --- Any new class needs to be derived from this class for proper inheritance. --- @param #BASE self --- @return #BASE The new instance of the BASE class. --- @usage --- function TASK:New() --- --- local self = BASE:Inherit( self, BASE:New() ) --- --- -- assign Task default values during construction --- self.TaskBriefing = "Task: No Task." --- self.Time = timer.getTime() --- self.ExecuteStage = _TransportExecuteStage.NONE --- --- return self --- end --- @todo need to investigate if the deepCopy is really needed... Don't think so. -function BASE:New() - local Child = routines.utils.deepCopy( self ) - local Parent = {} - setmetatable( Child, Parent ) - Child.__index = Child - self.ClassID = self.ClassID + 1 - Child.ClassID = self.ClassID - --Child.AddEvent( Child, S_EVENT_BIRTH, Child.EventBirth ) - return Child -end - ---- This is the worker method to inherit from a parent class. --- @param #BASE self --- @param Child is the Child class that inherits. --- @param #BASE Parent is the Parent class that the Child inherits from. --- @return #BASE Child -function BASE:Inherit( Child, Parent ) - local Child = routines.utils.deepCopy( Child ) - local Parent = routines.utils.deepCopy( Parent ) - if Child ~= nil then - setmetatable( Child, Parent ) - Child.__index = Child - end - --Child.ClassName = Child.ClassName .. '.' .. Child.ClassID - self:T( 'Inherited from ' .. Parent.ClassName ) - return Child -end - ---- This is the worker method to retrieve the Parent class. --- @param #BASE self --- @param #BASE Child is the Child class from which the Parent class needs to be retrieved. --- @return #BASE -function BASE:Inherited( Child ) - local Parent = getmetatable( Child ) --- env.info('Inherited class of ' .. Child.ClassName .. ' is ' .. Parent.ClassName ) - return Parent -end - ---- Get the ClassName + ClassID of the class instance. --- The ClassName + ClassID is formatted as '%s#%09d'. --- @param #BASE self --- @return #string The ClassName + ClassID of the class instance. -function BASE:GetClassNameAndID() - return string.format( '%s#%09d', self:GetClassName(), self:GetClassID() ) -end - ---- Get the ClassName of the class instance. --- @param #BASE self --- @return #string The ClassName of the class instance. -function BASE:GetClassName() - return self.ClassName -end - ---- Get the ClassID of the class instance. --- @param #BASE self --- @return #string The ClassID of the class instance. -function BASE:GetClassID() - return self.ClassID -end - ---- Set a new listener for the class. --- @param self --- @param DCSTypes#Event Event --- @param #function EventFunction --- @return #BASE -function BASE:AddEvent( Event, EventFunction ) - self:F( Event ) - - self.Events[#self.Events+1] = {} - self.Events[#self.Events].Event = Event - self.Events[#self.Events].EventFunction = EventFunction - self.Events[#self.Events].EventEnabled = false - - return self -end - ---- Returns the event dispatcher --- @param #BASE self --- @return Event#EVENT -function BASE:Event() - - return _EVENTDISPATCHER -end - - - - - ---- Enable the event listeners for the class. --- @param #BASE self --- @return #BASE -function BASE:EnableEvents() - self:F( #self.Events ) - - for EventID, Event in pairs( self.Events ) do - Event.Self = self - Event.EventEnabled = true - end - self.Events.Handler = world.addEventHandler( self ) - - return self -end - - ---- Disable the event listeners for the class. --- @param #BASE self --- @return #BASE -function BASE:DisableEvents() - self:F() - - world.removeEventHandler( self ) - for EventID, Event in pairs( self.Events ) do - Event.Self = nil - Event.EventEnabled = false - end - - return self -end - - -local BaseEventCodes = { - "S_EVENT_SHOT", - "S_EVENT_HIT", - "S_EVENT_TAKEOFF", - "S_EVENT_LAND", - "S_EVENT_CRASH", - "S_EVENT_EJECTION", - "S_EVENT_REFUELING", - "S_EVENT_DEAD", - "S_EVENT_PILOT_DEAD", - "S_EVENT_BASE_CAPTURED", - "S_EVENT_MISSION_START", - "S_EVENT_MISSION_END", - "S_EVENT_TOOK_CONTROL", - "S_EVENT_REFUELING_STOP", - "S_EVENT_BIRTH", - "S_EVENT_HUMAN_FAILURE", - "S_EVENT_ENGINE_STARTUP", - "S_EVENT_ENGINE_SHUTDOWN", - "S_EVENT_PLAYER_ENTER_UNIT", - "S_EVENT_PLAYER_LEAVE_UNIT", - "S_EVENT_PLAYER_COMMENT", - "S_EVENT_SHOOTING_START", - "S_EVENT_SHOOTING_END", - "S_EVENT_MAX", -} - ---onEvent( {[1]="S_EVENT_BIRTH",[2]={["subPlace"]=5,["time"]=0,["initiator"]={["id_"]=16884480,},["place"]={["id_"]=5000040,},["id"]=15,["IniUnitName"]="US F-15C@RAMP-Air Support Mountains#001-01",},} --- Event = { --- id = enum world.event, --- time = Time, --- initiator = Unit, --- target = Unit, --- place = Unit, --- subPlace = enum world.BirthPlace, --- weapon = Weapon --- } - ---- Creation of a Birth Event. --- @param #BASE self --- @param DCSTypes#Time EventTime The time stamp of the event. --- @param DCSObject#Object Initiator The initiating object of the event. --- @param #string IniUnitName The initiating unit name. --- @param place --- @param subplace -function BASE:CreateEventBirth( EventTime, Initiator, IniUnitName, place, subplace ) - self:F( { EventTime, Initiator, IniUnitName, place, subplace } ) - - local Event = { - id = world.event.S_EVENT_BIRTH, - time = EventTime, - initiator = Initiator, - IniUnitName = IniUnitName, - place = place, - subplace = subplace - } - - world.onEvent( Event ) -end - ---- Creation of a Crash Event. --- @param #BASE self --- @param DCSTypes#Time EventTime The time stamp of the event. --- @param DCSObject#Object Initiator The initiating object of the event. -function BASE:CreateEventCrash( EventTime, Initiator ) - self:F( { EventTime, Initiator } ) - - local Event = { - id = world.event.S_EVENT_CRASH, - time = EventTime, - initiator = Initiator, - } - - world.onEvent( Event ) -end - --- TODO: Complete DCSTypes#Event structure. ---- The main event handling function... This function captures all events generated for the class. --- @param #BASE self --- @param DCSTypes#Event event -function BASE:onEvent(event) - --self:F( { BaseEventCodes[event.id], event } ) - - if self then - for EventID, EventObject in pairs( self.Events ) do - if EventObject.EventEnabled then - --env.info( 'onEvent Table EventObject.Self = ' .. tostring(EventObject.Self) ) - --env.info( 'onEvent event.id = ' .. tostring(event.id) ) - --env.info( 'onEvent EventObject.Event = ' .. tostring(EventObject.Event) ) - if event.id == EventObject.Event then - if self == EventObject.Self then - if event.initiator and event.initiator:isExist() then - event.IniUnitName = event.initiator:getName() - end - if event.target and event.target:isExist() then - event.TgtUnitName = event.target:getName() - end - --self:T( { BaseEventCodes[event.id], event } ) - --EventObject.EventFunction( self, event ) - end - end - end - end - end -end - -function BASE:SetState( Object, StateName, State ) - - local ClassNameAndID = Object:GetClassNameAndID() - if not self.States[ClassNameAndID] then - self.States[ClassNameAndID] = {} - end - - self.States[ClassNameAndID][StateName] = State - - return self.States[ClassNameAndID][StateName] -end - -function BASE:GetState( Object, StateName ) - - local ClassNameAndID = Object:GetClassNameAndID() - if self.States[ClassNameAndID] then - return self.States[ClassNameAndID][StateName] - end - - return nil -end - -function BASE:ClearState( Object, StateName ) - - local ClassNameAndID = Object:GetClassNameAndID() - if self.States[ClassNameAndID] then - self.States[ClassNameAndID][StateName] = nil - end -end - --- Trace section - --- Log a trace (only shown when trace is on) --- TODO: Make trace function using variable parameters. - ---- Set trace level --- @param #BASE self --- @param #number Level -function BASE:TraceLevel( Level ) - _TraceLevel = Level - self:E( "Tracing level " .. Level ) -end - ---- Trace all methods in MOOSE --- @param #BASE self --- @param #boolean TraceAll true = trace all methods in MOOSE. -function BASE:TraceAll( TraceAll ) - - _TraceAll = TraceAll - - if _TraceAll then - self:E( "Tracing all methods in MOOSE " ) - else - self:E( "Switched off tracing all methods in MOOSE" ) - end -end - ---- Set tracing for a class --- @param #BASE self --- @param #string Class -function BASE:TraceClass( Class ) - _TraceClass[Class] = true - _TraceClassMethod[Class] = {} - self:E( "Tracing class " .. Class ) -end - ---- Set tracing for a specific method of class --- @param #BASE self --- @param #string Class --- @param #string Method -function BASE:TraceClassMethod( Class, Method ) - if not _TraceClassMethod[Class] then - _TraceClassMethod[Class] = {} - _TraceClassMethod[Class].Method = {} - end - _TraceClassMethod[Class].Method[Method] = true - self:E( "Tracing method " .. Method .. " of class " .. Class ) -end - ---- Trace a function call. Must be at the beginning of the function logic. --- @param #BASE self --- @param Arguments A #table or any field. -function BASE:F( Arguments, DebugInfoCurrentParam, DebugInfoFromParam ) - - if _TraceOn and ( ( _TraceAll == true ) or ( _TraceClass[self.ClassName] or _TraceClassMethod[self.ClassName] ) ) then - - local DebugInfoCurrent = DebugInfoCurrentParam and DebugInfoCurrentParam or debug.getinfo( 2, "nl" ) - local DebugInfoFrom = DebugInfoFromParam and DebugInfoFromParam or debug.getinfo( 3, "l" ) - - local Function = "function" - if DebugInfoCurrent.name then - Function = DebugInfoCurrent.name - end - - if _TraceAll == true or _TraceClass[self.ClassName] or _TraceClassMethod[self.ClassName].Method[Function] then - local LineCurrent = DebugInfoCurrent.currentline - local LineFrom = 0 - if DebugInfoFrom then - LineFrom = DebugInfoFrom.currentline - end - env.info( string.format( "%6d(%6d)/%1s:%20s%05d.%s(%s)" , LineCurrent, LineFrom, "F", self.ClassName, self.ClassID, Function, routines.utils.oneLineSerialize( Arguments ) ) ) - end - end -end - ---- Trace a function call level 2. Must be at the beginning of the function logic. --- @param #BASE self --- @param Arguments A #table or any field. -function BASE:F2( Arguments ) - - local DebugInfoCurrent = debug.getinfo( 2, "nl" ) - local DebugInfoFrom = debug.getinfo( 3, "l" ) - - if _TraceLevel >= 2 then - self:F( Arguments, DebugInfoCurrent, DebugInfoFrom ) - end - -end - ---- Trace a function call level 3. Must be at the beginning of the function logic. --- @param #BASE self --- @param Arguments A #table or any field. -function BASE:F3( Arguments ) - - local DebugInfoCurrent = debug.getinfo( 2, "nl" ) - local DebugInfoFrom = debug.getinfo( 3, "l" ) - - if _TraceLevel >= 3 then - self:F( Arguments, DebugInfoCurrent, DebugInfoFrom ) - end - -end - ---- Trace a function logic. --- @param #BASE self --- @param Arguments A #table or any field. -function BASE:_T( Arguments, DebugInfoCurrentParam, DebugInfoFromParam ) - - if _TraceOn and ( ( _TraceAll == true ) or ( _TraceClass[self.ClassName] or _TraceClassMethod[self.ClassName] ) ) then - - local DebugInfoCurrent = DebugInfoCurrentParam and DebugInfoCurrentParam or debug.getinfo( 2, "nl" ) - local DebugInfoFrom = DebugInfoFromParam and DebugInfoFromParam or debug.getinfo( 3, "l" ) - - local Function = "function" - if DebugInfoCurrent.name then - Function = DebugInfoCurrent.name - end - - if _TraceAll == true or _TraceClass[self.ClassName] or _TraceClassMethod[self.ClassName].Method[Function] then - local LineCurrent = DebugInfoCurrent.currentline - local LineFrom = 0 - if DebugInfoFrom then - LineFrom = DebugInfoFrom.currentline - end - env.info( string.format( "%6d(%6d)/%1s:%20s%05d.%s" , LineCurrent, LineFrom, "T", self.ClassName, self.ClassID, routines.utils.oneLineSerialize( Arguments ) ) ) - end - end -end - ---- Trace a function logic level 1. Can be anywhere within the function logic. --- @param #BASE self --- @param Arguments A #table or any field. -function BASE:T( Arguments ) - - local DebugInfoCurrent = debug.getinfo( 2, "nl" ) - local DebugInfoFrom = debug.getinfo( 3, "l" ) - - if _TraceLevel >= 1 then - self:_T( Arguments, DebugInfoCurrent, DebugInfoFrom ) - end - -end - - ---- Trace a function logic level 2. Can be anywhere within the function logic. --- @param #BASE self --- @param Arguments A #table or any field. -function BASE:T2( Arguments ) - - local DebugInfoCurrent = debug.getinfo( 2, "nl" ) - local DebugInfoFrom = debug.getinfo( 3, "l" ) - - if _TraceLevel >= 2 then - self:_T( Arguments, DebugInfoCurrent, DebugInfoFrom ) - end - -end - ---- Trace a function logic level 3. Can be anywhere within the function logic. --- @param #BASE self --- @param Arguments A #table or any field. -function BASE:T3( Arguments ) - - local DebugInfoCurrent = debug.getinfo( 2, "nl" ) - local DebugInfoFrom = debug.getinfo( 3, "l" ) - - if _TraceLevel >= 3 then - self:_T( Arguments, DebugInfoCurrent, DebugInfoFrom ) - end - -end - ---- Log an exception which will be traced always. Can be anywhere within the function logic. --- @param #BASE self --- @param Arguments A #table or any field. -function BASE:E( Arguments ) - - local DebugInfoCurrent = debug.getinfo( 2, "nl" ) - local DebugInfoFrom = debug.getinfo( 3, "l" ) - - local Function = "function" - if DebugInfoCurrent.name then - Function = DebugInfoCurrent.name - end - - local LineCurrent = DebugInfoCurrent.currentline - local LineFrom = -1 - if DebugInfoFrom then - LineFrom = DebugInfoFrom.currentline - end - - env.info( string.format( "%6d(%6d)/%1s:%20s%05d.%s(%s)" , LineCurrent, LineFrom, "E", self.ClassName, self.ClassID, Function, routines.utils.oneLineSerialize( Arguments ) ) ) -end - - - ---- Models time events calling event handing functions. --- --- @{SCHEDULER} class --- =================== --- The @{SCHEDULER} class models time events calling given event handling functions. --- --- SCHEDULER constructor --- ===================== --- The SCHEDULER class is quite easy to use: --- --- * @{#SCHEDULER.New}: Setup a new scheduler and start it with the specified parameters. --- --- SCHEDULER timer methods --- ======================= --- The SCHEDULER can be stopped and restarted with the following methods: --- --- * @{#SCHEDULER.Start}: (Re-)Start the scheduler. --- * @{#SCHEDULER.Start}: Stop the scheduler. --- --- @module Scheduler --- @author FlightControl - ---- The SCHEDULER class --- @type SCHEDULER --- @extends Base#BASE -SCHEDULER = { - ClassName = "SCHEDULER", -} - - ---- Constructor. --- @param #SCHEDULER self --- @param #table TimeEventObject Specified for which Moose object the timer is setup. If a value of nil is provided, a scheduler will be setup without an object reference. --- @param #function TimeEventFunction The event function to be called when a timer event occurs. The event function needs to accept the parameters specified in TimeEventFunctionArguments. --- @param #table TimeEventFunctionArguments Optional arguments that can be given as part of scheduler. The arguments need to be given as a table { param1, param 2, ... }. --- @param #number StartSeconds Specifies the amount of seconds that will be waited before the scheduling is started, and the event function is called. --- @param #number RepeatSecondsInterval Specifies the interval in seconds when the scheduler will call the event function. --- @param #number RandomizationFactor Specifies a randomization factor between 0 and 1 to randomize the RepeatSecondsInterval. --- @param #number StopSeconds Specifies the amount of seconds when the scheduler will be stopped. --- @return #SCHEDULER self -function SCHEDULER:New( TimeEventObject, TimeEventFunction, TimeEventFunctionArguments, StartSeconds, RepeatSecondsInterval, RandomizationFactor, StopSeconds ) - local self = BASE:Inherit( self, BASE:New() ) - self:F2( { TimeEventObject, TimeEventFunction, TimeEventFunctionArguments, StartSeconds, RepeatSecondsInterval, RandomizationFactor, StopSeconds } ) - - self.TimeEventObject = TimeEventObject - self.TimeEventFunction = TimeEventFunction - self.TimeEventFunctionArguments = TimeEventFunctionArguments - self.StartSeconds = StartSeconds - - if RepeatSecondsInterval then - self.RepeatSecondsInterval = RepeatSecondsInterval - else - self.RepeatSecondsInterval = 0 - end - - if RandomizationFactor then - self.RandomizationFactor = RandomizationFactor - else - self.RandomizationFactor = 0 - end - - if StopSeconds then - self.StopSeconds = StopSeconds - end - - self.Repeat = false - - self.StartTime = timer.getTime() - - self:Start() - - return self -end - ---- (Re-)Starts the scheduler. --- @param #SCHEDULER self --- @return #SCHEDULER self -function SCHEDULER:Start() - self:F2( self.TimeEventObject ) - - self.Repeat = true - timer.scheduleFunction( self._Scheduler, self, timer.getTime() + self.StartSeconds + .01 ) - - return self -end - ---- Stops the scheduler. --- @param #SCHEDULER self --- @return #SCHEDULER self -function SCHEDULER:Stop() - self:F2( self.TimeEventObject ) - - self.Repeat = false - - return self -end - --- Private Functions - -function SCHEDULER:_Scheduler() - self:F2( self.TimeEventFunctionArguments ) - - local ErrorHandler = function( errmsg ) - - env.info( "Error in SCHEDULER function:" .. errmsg ) - env.info( debug.traceback() ) - - return errmsg - end - - local Status, Result - if self.TimeEventObject then - Status, Result = xpcall( function() return self.TimeEventFunction( self.TimeEventObject, unpack( self.TimeEventFunctionArguments ) ) end, ErrorHandler ) - else - Status, Result = xpcall( function() return self.TimeEventFunction( unpack( self.TimeEventFunctionArguments ) ) end, ErrorHandler ) - end - - self:T( { Status, Result } ) - - if Status and ( ( not Result == nil ) or ( Result and Result ~= false ) ) then - if self.Repeat and ( not self.StopSeconds or ( self.StopSeconds and timer.getTime() <= self.StartTime + self.StopSeconds ) ) then - timer.scheduleFunction( - self._Scheduler, - self, - timer.getTime() + self.RepeatSecondsInterval + math.random( - ( self.RandomizationFactor * self.RepeatSecondsInterval / 2 ), ( self.RandomizationFactor * self.RepeatSecondsInterval / 2 ) ) + 0.01 - ) - end - end - -end - - - - - - - - ---- The EVENT class models an efficient event handling process between other classes and its units, weapons. --- @module Event --- @author FlightControl - ---- The EVENT structure --- @type EVENT --- @field #EVENT.Events Events -EVENT = { - ClassName = "EVENT", - ClassID = 0, -} - -local _EVENTCODES = { - "S_EVENT_SHOT", - "S_EVENT_HIT", - "S_EVENT_TAKEOFF", - "S_EVENT_LAND", - "S_EVENT_CRASH", - "S_EVENT_EJECTION", - "S_EVENT_REFUELING", - "S_EVENT_DEAD", - "S_EVENT_PILOT_DEAD", - "S_EVENT_BASE_CAPTURED", - "S_EVENT_MISSION_START", - "S_EVENT_MISSION_END", - "S_EVENT_TOOK_CONTROL", - "S_EVENT_REFUELING_STOP", - "S_EVENT_BIRTH", - "S_EVENT_HUMAN_FAILURE", - "S_EVENT_ENGINE_STARTUP", - "S_EVENT_ENGINE_SHUTDOWN", - "S_EVENT_PLAYER_ENTER_UNIT", - "S_EVENT_PLAYER_LEAVE_UNIT", - "S_EVENT_PLAYER_COMMENT", - "S_EVENT_SHOOTING_START", - "S_EVENT_SHOOTING_END", - "S_EVENT_MAX", -} - ---- The Event structure --- @type EVENTDATA --- @field id --- @field initiator --- @field target --- @field weapon --- @field IniDCSUnit --- @field IniDCSUnitName --- @field IniDCSGroup --- @field IniDCSGroupName --- @field TgtDCSUnit --- @field TgtDCSUnitName --- @field TgtDCSGroup --- @field TgtDCSGroupName --- @field Weapon --- @field WeaponName --- @field WeaponTgtDCSUnit - ---- The Events structure --- @type EVENT.Events --- @field #number IniUnit - -function EVENT:New() - local self = BASE:Inherit( self, BASE:New() ) - self:F2() - self.EventHandler = world.addEventHandler( self ) - return self -end - -function EVENT:EventText( EventID ) - - local EventText = _EVENTCODES[EventID] - - return EventText -end - - ---- Initializes the Events structure for the event --- @param #EVENT self --- @param DCSWorld#world.event EventID --- @param #string EventClass --- @return #EVENT.Events -function EVENT:Init( EventID, EventClass ) - self:F3( { _EVENTCODES[EventID], EventClass } ) - if not self.Events[EventID] then - self.Events[EventID] = {} - end - if not self.Events[EventID][EventClass] then - self.Events[EventID][EventClass] = {} - end - return self.Events[EventID][EventClass] -end - - ---- Create an OnDead event handler for a group --- @param #EVENT self --- @param #table EventTemplate --- @param #function EventFunction The function to be called when the event occurs for the unit. --- @param EventSelf The self instance of the class for which the event is. --- @param #function OnEventFunction --- @return #EVENT -function EVENT:OnEventForTemplate( EventTemplate, EventFunction, EventSelf, OnEventFunction ) - self:F2( EventTemplate.name ) - - for EventUnitID, EventUnit in pairs( EventTemplate.units ) do - OnEventFunction( self, EventUnit.name, EventFunction, EventSelf ) - end - return self -end - ---- Set a new listener for an S_EVENT_X event independent from a unit or a weapon. --- @param #EVENT self --- @param #function EventFunction The function to be called when the event occurs for the unit. --- @param Base#BASE EventSelf The self instance of the class for which the event is. --- @param EventID --- @return #EVENT -function EVENT:OnEventGeneric( EventFunction, EventSelf, EventID ) - self:F2( { EventID } ) - - local Event = self:Init( EventID, EventSelf:GetClassNameAndID() ) - Event.EventFunction = EventFunction - Event.EventSelf = EventSelf - return self -end - - ---- Set a new listener for an S_EVENT_X event --- @param #EVENT self --- @param #string EventDCSUnitName --- @param #function EventFunction The function to be called when the event occurs for the unit. --- @param Base#BASE EventSelf The self instance of the class for which the event is. --- @param EventID --- @return #EVENT -function EVENT:OnEventForUnit( EventDCSUnitName, EventFunction, EventSelf, EventID ) - self:F2( EventDCSUnitName ) - - local Event = self:Init( EventID, EventSelf:GetClassNameAndID() ) - if not Event.IniUnit then - Event.IniUnit = {} - end - Event.IniUnit[EventDCSUnitName] = {} - Event.IniUnit[EventDCSUnitName].EventFunction = EventFunction - Event.IniUnit[EventDCSUnitName].EventSelf = EventSelf - return self -end - - ---- Create an OnBirth event handler for a group --- @param #EVENT self --- @param Group#GROUP EventGroup --- @param #function EventFunction The function to be called when the event occurs for the unit. --- @param EventSelf The self instance of the class for which the event is. --- @return #EVENT -function EVENT:OnBirthForTemplate( EventTemplate, EventFunction, EventSelf ) - self:F2( EventTemplate.name ) - - self:OnEventForTemplate( EventTemplate, EventFunction, EventSelf, self.OnBirthForUnit ) - - return self -end - ---- Set a new listener for an S_EVENT_BIRTH event, and registers the unit born. --- @param #EVENT self --- @param #function EventFunction The function to be called when the event occurs for the unit. --- @param Base#BASE EventSelf --- @return #EVENT -function EVENT:OnBirth( EventFunction, EventSelf ) - self:F2() - - self:OnEventGeneric( EventFunction, EventSelf, world.event.S_EVENT_BIRTH ) - - return self -end - ---- Set a new listener for an S_EVENT_BIRTH event. --- @param #EVENT self --- @param #string EventDCSUnitName The id of the unit for the event to be handled. --- @param #function EventFunction The function to be called when the event occurs for the unit. --- @param Base#BASE EventSelf --- @return #EVENT -function EVENT:OnBirthForUnit( EventDCSUnitName, EventFunction, EventSelf ) - self:F2( EventDCSUnitName ) - - self:OnEventForUnit( EventDCSUnitName, EventFunction, EventSelf, world.event.S_EVENT_BIRTH ) - - return self -end - ---- Create an OnCrash event handler for a group --- @param #EVENT self --- @param Group#GROUP EventGroup --- @param #function EventFunction The function to be called when the event occurs for the unit. --- @param EventSelf The self instance of the class for which the event is. --- @return #EVENT -function EVENT:OnCrashForTemplate( EventTemplate, EventFunction, EventSelf ) - self:F2( EventTemplate.name ) - - self:OnEventForTemplate( EventTemplate, EventFunction, EventSelf, self.OnCrashForUnit ) - - return self -end - ---- Set a new listener for an S_EVENT_CRASH event. --- @param #EVENT self --- @param #function EventFunction The function to be called when the event occurs for the unit. --- @param Base#BASE EventSelf --- @return #EVENT -function EVENT:OnCrash( EventFunction, EventSelf ) - self:F2() - - self:OnEventGeneric( EventFunction, EventSelf, world.event.S_EVENT_CRASH ) - - return self -end - ---- Set a new listener for an S_EVENT_CRASH event. --- @param #EVENT self --- @param #string EventDCSUnitName --- @param #function EventFunction The function to be called when the event occurs for the unit. --- @param Base#BASE EventSelf The self instance of the class for which the event is. --- @return #EVENT -function EVENT:OnCrashForUnit( EventDCSUnitName, EventFunction, EventSelf ) - self:F2( EventDCSUnitName ) - - self:OnEventForUnit( EventDCSUnitName, EventFunction, EventSelf, world.event.S_EVENT_CRASH ) - - return self -end - ---- Create an OnDead event handler for a group --- @param #EVENT self --- @param Group#GROUP EventGroup --- @param #function EventFunction The function to be called when the event occurs for the unit. --- @param EventSelf The self instance of the class for which the event is. --- @return #EVENT -function EVENT:OnDeadForTemplate( EventTemplate, EventFunction, EventSelf ) - self:F2( EventTemplate.name ) - - self:OnEventForTemplate( EventTemplate, EventFunction, EventSelf, self.OnDeadForUnit ) - - return self -end - ---- Set a new listener for an S_EVENT_DEAD event. --- @param #EVENT self --- @param #function EventFunction The function to be called when the event occurs for the unit. --- @param Base#BASE EventSelf --- @return #EVENT -function EVENT:OnDead( EventFunction, EventSelf ) - self:F2() - - self:OnEventGeneric( EventFunction, EventSelf, world.event.S_EVENT_DEAD ) - - return self -end - - ---- Set a new listener for an S_EVENT_DEAD event. --- @param #EVENT self --- @param #string EventDCSUnitName --- @param #function EventFunction The function to be called when the event occurs for the unit. --- @param Base#BASE EventSelf The self instance of the class for which the event is. --- @return #EVENT -function EVENT:OnDeadForUnit( EventDCSUnitName, EventFunction, EventSelf ) - self:F2( EventDCSUnitName ) - - self:OnEventForUnit( EventDCSUnitName, EventFunction, EventSelf, world.event.S_EVENT_DEAD ) - - return self -end - ---- Set a new listener for an S_EVENT_PILOT_DEAD event. --- @param #EVENT self --- @param #string EventDCSUnitName --- @param #function EventFunction The function to be called when the event occurs for the unit. --- @param Base#BASE EventSelf The self instance of the class for which the event is. --- @return #EVENT -function EVENT:OnPilotDeadForUnit( EventDCSUnitName, EventFunction, EventSelf ) - self:F2( EventDCSUnitName ) - - self:OnEventForUnit( EventDCSUnitName, EventFunction, EventSelf, world.event.S_EVENT_PILOT_DEAD ) - - return self -end - ---- Create an OnDead event handler for a group --- @param #EVENT self --- @param #table EventTemplate --- @param #function EventFunction The function to be called when the event occurs for the unit. --- @param EventSelf The self instance of the class for which the event is. --- @return #EVENT -function EVENT:OnLandForTemplate( EventTemplate, EventFunction, EventSelf ) - self:F2( EventTemplate.name ) - - self:OnEventForTemplate( EventTemplate, EventFunction, EventSelf, self.OnLandForUnit ) - - return self -end - ---- Set a new listener for an S_EVENT_LAND event. --- @param #EVENT self --- @param #string EventDCSUnitName --- @param #function EventFunction The function to be called when the event occurs for the unit. --- @param Base#BASE EventSelf The self instance of the class for which the event is. --- @return #EVENT -function EVENT:OnLandForUnit( EventDCSUnitName, EventFunction, EventSelf ) - self:F2( EventDCSUnitName ) - - self:OnEventForUnit( EventDCSUnitName, EventFunction, EventSelf, world.event.S_EVENT_LAND ) - - return self -end - ---- Create an OnDead event handler for a group --- @param #EVENT self --- @param #table EventTemplate --- @param #function EventFunction The function to be called when the event occurs for the unit. --- @param EventSelf The self instance of the class for which the event is. --- @return #EVENT -function EVENT:OnTakeOffForTemplate( EventTemplate, EventFunction, EventSelf ) - self:F2( EventTemplate.name ) - - self:OnEventForTemplate( EventTemplate, EventFunction, EventSelf, self.OnTakeOffForUnit ) - - return self -end - ---- Set a new listener for an S_EVENT_TAKEOFF event. --- @param #EVENT self --- @param #string EventDCSUnitName --- @param #function EventFunction The function to be called when the event occurs for the unit. --- @param Base#BASE EventSelf The self instance of the class for which the event is. --- @return #EVENT -function EVENT:OnTakeOffForUnit( EventDCSUnitName, EventFunction, EventSelf ) - self:F2( EventDCSUnitName ) - - self:OnEventForUnit( EventDCSUnitName, EventFunction, EventSelf, world.event.S_EVENT_TAKEOFF ) - - return self -end - ---- Create an OnDead event handler for a group --- @param #EVENT self --- @param #table EventTemplate --- @param #function EventFunction The function to be called when the event occurs for the unit. --- @param EventSelf The self instance of the class for which the event is. --- @return #EVENT -function EVENT:OnEngineShutDownForTemplate( EventTemplate, EventFunction, EventSelf ) - self:F2( EventTemplate.name ) - - self:OnEventForTemplate( EventTemplate, EventFunction, EventSelf, self.OnEngineShutDownForUnit ) - - return self -end - ---- Set a new listener for an S_EVENT_ENGINE_SHUTDOWN event. --- @param #EVENT self --- @param #string EventDCSUnitName --- @param #function EventFunction The function to be called when the event occurs for the unit. --- @param Base#BASE EventSelf The self instance of the class for which the event is. --- @return #EVENT -function EVENT:OnEngineShutDownForUnit( EventDCSUnitName, EventFunction, EventSelf ) - self:F2( EventDCSUnitName ) - - self:OnEventForUnit( EventDCSUnitName, EventFunction, EventSelf, world.event.S_EVENT_ENGINE_SHUTDOWN ) - - return self -end - ---- Set a new listener for an S_EVENT_ENGINE_STARTUP event. --- @param #EVENT self --- @param #string EventDCSUnitName --- @param #function EventFunction The function to be called when the event occurs for the unit. --- @param Base#BASE EventSelf The self instance of the class for which the event is. --- @return #EVENT -function EVENT:OnEngineStartUpForUnit( EventDCSUnitName, EventFunction, EventSelf ) - self:F2( EventDCSUnitName ) - - self:OnEventForUnit( EventDCSUnitName, EventFunction, EventSelf, world.event.S_EVENT_ENGINE_STARTUP ) - - return self -end - ---- Set a new listener for an S_EVENT_SHOT event. --- @param #EVENT self --- @param #function EventFunction The function to be called when the event occurs for the unit. --- @param Base#BASE EventSelf The self instance of the class for which the event is. --- @return #EVENT -function EVENT:OnShot( EventFunction, EventSelf ) - self:F2() - - self:OnEventGeneric( EventFunction, EventSelf, world.event.S_EVENT_SHOT ) - - return self -end - ---- Set a new listener for an S_EVENT_SHOT event for a unit. --- @param #EVENT self --- @param #string EventDCSUnitName --- @param #function EventFunction The function to be called when the event occurs for the unit. --- @param Base#BASE EventSelf The self instance of the class for which the event is. --- @return #EVENT -function EVENT:OnShotForUnit( EventDCSUnitName, EventFunction, EventSelf ) - self:F2( EventDCSUnitName ) - - self:OnEventForUnit( EventDCSUnitName, EventFunction, EventSelf, world.event.S_EVENT_SHOT ) - - return self -end - ---- Set a new listener for an S_EVENT_HIT event. --- @param #EVENT self --- @param #function EventFunction The function to be called when the event occurs for the unit. --- @param Base#BASE EventSelf The self instance of the class for which the event is. --- @return #EVENT -function EVENT:OnHit( EventFunction, EventSelf ) - self:F2() - - self:OnEventGeneric( EventFunction, EventSelf, world.event.S_EVENT_HIT ) - - return self -end - ---- Set a new listener for an S_EVENT_HIT event. --- @param #EVENT self --- @param #string EventDCSUnitName --- @param #function EventFunction The function to be called when the event occurs for the unit. --- @param Base#BASE EventSelf The self instance of the class for which the event is. --- @return #EVENT -function EVENT:OnHitForUnit( EventDCSUnitName, EventFunction, EventSelf ) - self:F2( EventDCSUnitName ) - - self:OnEventForUnit( EventDCSUnitName, EventFunction, EventSelf, world.event.S_EVENT_HIT ) - - return self -end - ---- Set a new listener for an S_EVENT_PLAYER_ENTER_UNIT event. --- @param #EVENT self --- @param #function EventFunction The function to be called when the event occurs for the unit. --- @param Base#BASE EventSelf The self instance of the class for which the event is. --- @return #EVENT -function EVENT:OnPlayerEnterUnit( EventFunction, EventSelf ) - self:F2() - - self:OnEventGeneric( EventFunction, EventSelf, world.event.S_EVENT_PLAYER_ENTER_UNIT ) - - return self -end - ---- Set a new listener for an S_EVENT_PLAYER_LEAVE_UNIT event. --- @param #EVENT self --- @param #function EventFunction The function to be called when the event occurs for the unit. --- @param Base#BASE EventSelf The self instance of the class for which the event is. --- @return #EVENT -function EVENT:OnPlayerLeaveUnit( EventFunction, EventSelf ) - self:F2() - - self:OnEventGeneric( EventFunction, EventSelf, world.event.S_EVENT_PLAYER_LEAVE_UNIT ) - - return self -end - - - -function EVENT:onEvent( Event ) - self:F2( { _EVENTCODES[Event.id], Event } ) - - if self and self.Events and self.Events[Event.id] then - if Event.initiator and Event.initiator:getCategory() == Object.Category.UNIT then - Event.IniDCSUnit = Event.initiator - Event.IniDCSGroup = Event.IniDCSUnit:getGroup() - Event.IniDCSUnitName = Event.IniDCSUnit:getName() - Event.IniDCSGroupName = "" - if Event.IniDCSGroup and Event.IniDCSGroup:isExist() then - Event.IniDCSGroupName = Event.IniDCSGroup:getName() - end - end - if Event.target then - if Event.target and Event.target:getCategory() == Object.Category.UNIT then - Event.TgtDCSUnit = Event.target - Event.TgtDCSGroup = Event.TgtDCSUnit:getGroup() - Event.TgtDCSUnitName = Event.TgtDCSUnit:getName() - Event.TgtDCSGroupName = "" - if Event.TgtDCSGroup and Event.TgtDCSGroup:isExist() then - Event.TgtDCSGroupName = Event.TgtDCSGroup:getName() - end - end - end - if Event.weapon then - Event.Weapon = Event.weapon - Event.WeaponName = Event.Weapon:getTypeName() - --Event.WeaponTgtDCSUnit = Event.Weapon:getTarget() - end - self:E( { _EVENTCODES[Event.id], Event } ) - for ClassName, EventData in pairs( self.Events[Event.id] ) do - if Event.IniDCSUnitName and EventData.IniUnit and EventData.IniUnit[Event.IniDCSUnitName] then - self:T2( { "Calling event function for class ", ClassName, " unit ", Event.IniDCSUnitName } ) - EventData.IniUnit[Event.IniDCSUnitName].EventFunction( EventData.IniUnit[Event.IniDCSUnitName].EventSelf, Event ) - else - if Event.IniDCSUnit and not EventData.IniUnit then - self:T2( { "Calling event function for class ", ClassName } ) - EventData.EventFunction( EventData.EventSelf, Event ) - end - end - end - end -end - ---- Encapsulation of DCS World Menu system in a set of MENU classes. --- @module Menu - ---- The MENU class --- @type MENU --- @extends Base#BASE -MENU = { - ClassName = "MENU", - MenuPath = nil, - MenuText = "", - MenuParentPath = nil -} - ---- -function MENU:New( MenuText, MenuParentPath ) - - -- Arrange meta tables - local Child = BASE:Inherit( self, BASE:New() ) - - Child.MenuPath = nil - Child.MenuText = MenuText - Child.MenuParentPath = MenuParentPath - return Child -end - ---- The COMMANDMENU class --- @type COMMANDMENU --- @extends Menu#MENU -COMMANDMENU = { - ClassName = "COMMANDMENU", - CommandMenuFunction = nil, - CommandMenuArgument = nil -} - -function COMMANDMENU:New( MenuText, ParentMenu, CommandMenuFunction, CommandMenuArgument ) - - -- Arrange meta tables - - local MenuParentPath = nil - if ParentMenu ~= nil then - MenuParentPath = ParentMenu.MenuPath - end - - local Child = BASE:Inherit( self, MENU:New( MenuText, MenuParentPath ) ) - - Child.MenuPath = missionCommands.addCommand( MenuText, MenuParentPath, CommandMenuFunction, CommandMenuArgument ) - Child.CommandMenuFunction = CommandMenuFunction - Child.CommandMenuArgument = CommandMenuArgument - return Child -end - ---- The SUBMENU class --- @type SUBMENU --- @extends Menu#MENU -SUBMENU = { - ClassName = "SUBMENU" -} - -function SUBMENU:New( MenuText, ParentMenu ) - - -- Arrange meta tables - local MenuParentPath = nil - if ParentMenu ~= nil then - MenuParentPath = ParentMenu.MenuPath - end - - local Child = BASE:Inherit( self, MENU:New( MenuText, MenuParentPath ) ) - - Child.MenuPath = missionCommands.addSubMenu( MenuText, MenuParentPath ) - return Child -end - --- This local variable is used to cache the menus registered under clients. --- Menus don't dissapear when clients are destroyed and restarted. --- So every menu for a client created must be tracked so that program logic accidentally does not create --- the same menus twice during initialization logic. --- These menu classes are handling this logic with this variable. -local _MENUCLIENTS = {} - ---- The MENU_CLIENT class --- @type MENU_CLIENT --- @extends Menu#MENU -MENU_CLIENT = { - ClassName = "MENU_CLIENT" -} - ---- Creates a new menu item for a group --- @param self --- @param Client#CLIENT MenuClient The Client owning the menu. --- @param #string MenuText The text for the menu. --- @param #table ParentMenu The parent menu. --- @return #MENU_CLIENT self -function MENU_CLIENT:New( MenuClient, MenuText, ParentMenu ) - - -- Arrange meta tables - local MenuParentPath = {} - if ParentMenu ~= nil then - MenuParentPath = ParentMenu.MenuPath - end - - local self = BASE:Inherit( self, MENU:New( MenuText, MenuParentPath ) ) - self:F( { MenuClient, MenuText, ParentMenu } ) - - self.MenuClient = MenuClient - self.MenuClientGroupID = MenuClient:GetClientGroupID() - self.MenuParentPath = MenuParentPath - self.MenuText = MenuText - self.ParentMenu = ParentMenu - - self.Menus = {} - - if not _MENUCLIENTS[self.MenuClientGroupID] then - _MENUCLIENTS[self.MenuClientGroupID] = {} - end - - local MenuPath = _MENUCLIENTS[self.MenuClientGroupID] - - self:T( { MenuClient:GetClientGroupName(), MenuPath[table.concat(MenuParentPath)], MenuParentPath, MenuText } ) - - local MenuPathID = table.concat(MenuParentPath) .. "/" .. MenuText - if MenuPath[MenuPathID] then - missionCommands.removeItemForGroup( self.MenuClient:GetClientGroupID(), MenuPath[MenuPathID] ) - end - - self.MenuPath = missionCommands.addSubMenuForGroup( self.MenuClient:GetClientGroupID(), MenuText, MenuParentPath ) - MenuPath[MenuPathID] = self.MenuPath - - self:T( { MenuClient:GetClientGroupName(), self.MenuPath } ) - - if ParentMenu and ParentMenu.Menus then - ParentMenu.Menus[self.MenuPath] = self - end - return self -end - ---- Removes the sub menus recursively of this MENU_CLIENT. --- @param #MENU_CLIENT self --- @return #MENU_CLIENT self -function MENU_CLIENT:RemoveSubMenus() - self:F( self.MenuPath ) - - for MenuID, Menu in pairs( self.Menus ) do - Menu:Remove() - end - -end - ---- Removes the sub menus recursively of this MENU_CLIENT. --- @param #MENU_CLIENT self --- @return #MENU_CLIENT self -function MENU_CLIENT:Remove() - self:F( self.MenuPath ) - - self:RemoveSubMenus() - - if not _MENUCLIENTS[self.MenuClientGroupID] then - _MENUCLIENTS[self.MenuClientGroupID] = {} - end - - local MenuPath = _MENUCLIENTS[self.MenuClientGroupID] - - if MenuPath[table.concat(self.MenuParentPath) .. "/" .. self.MenuText] then - MenuPath[table.concat(self.MenuParentPath) .. "/" .. self.MenuText] = nil - end - - missionCommands.removeItemForGroup( self.MenuClient:GetClientGroupID(), self.MenuPath ) - self.ParentMenu.Menus[self.MenuPath] = nil - return nil -end - - ---- The MENU_CLIENT_COMMAND class --- @type MENU_CLIENT_COMMAND --- @extends Menu#MENU -MENU_CLIENT_COMMAND = { - ClassName = "MENU_CLIENT_COMMAND" -} - ---- Creates a new radio command item for a group --- @param self --- @param Client#CLIENT MenuClient The Client owning the menu. --- @param MenuText The text for the menu. --- @param ParentMenu The parent menu. --- @param CommandMenuFunction A function that is called when the menu key is pressed. --- @param CommandMenuArgument An argument for the function. --- @return Menu#MENU_CLIENT_COMMAND self -function MENU_CLIENT_COMMAND:New( MenuClient, MenuText, ParentMenu, CommandMenuFunction, CommandMenuArgument ) - - -- Arrange meta tables - - local MenuParentPath = {} - if ParentMenu ~= nil then - MenuParentPath = ParentMenu.MenuPath - end - - local self = BASE:Inherit( self, MENU:New( MenuText, MenuParentPath ) ) - - self.MenuClient = MenuClient - self.MenuClientGroupID = MenuClient:GetClientGroupID() - self.MenuParentPath = MenuParentPath - self.MenuText = MenuText - self.ParentMenu = ParentMenu - - if not _MENUCLIENTS[self.MenuClientGroupID] then - _MENUCLIENTS[self.MenuClientGroupID] = {} - end - - local MenuPath = _MENUCLIENTS[self.MenuClientGroupID] - - self:T( { MenuClient:GetClientGroupName(), MenuPath[table.concat(MenuParentPath)], MenuParentPath, MenuText, CommandMenuFunction, CommandMenuArgument } ) - - local MenuPathID = table.concat(MenuParentPath) .. "/" .. MenuText - if MenuPath[MenuPathID] then - missionCommands.removeItemForGroup( self.MenuClient:GetClientGroupID(), MenuPath[MenuPathID] ) - end - - self.MenuPath = missionCommands.addCommandForGroup( self.MenuClient:GetClientGroupID(), MenuText, MenuParentPath, CommandMenuFunction, CommandMenuArgument ) - MenuPath[MenuPathID] = self.MenuPath - - self.CommandMenuFunction = CommandMenuFunction - self.CommandMenuArgument = CommandMenuArgument - - ParentMenu.Menus[self.MenuPath] = self - - return self -end - -function MENU_CLIENT_COMMAND:Remove() - self:F( self.MenuPath ) - - if not _MENUCLIENTS[self.MenuClientGroupID] then - _MENUCLIENTS[self.MenuClientGroupID] = {} - end - - local MenuPath = _MENUCLIENTS[self.MenuClientGroupID] - - if MenuPath[table.concat(self.MenuParentPath) .. "/" .. self.MenuText] then - MenuPath[table.concat(self.MenuParentPath) .. "/" .. self.MenuText] = nil - end - - missionCommands.removeItemForGroup( self.MenuClient:GetClientGroupID(), self.MenuPath ) - self.ParentMenu.Menus[self.MenuPath] = nil - return nil -end - - ---- The MENU_COALITION class --- @type MENU_COALITION --- @extends Menu#MENU -MENU_COALITION = { - ClassName = "MENU_COALITION" -} - ---- Creates a new coalition menu item --- @param #MENU_COALITION self --- @param DCSCoalition#coalition.side MenuCoalition The coalition owning the menu. --- @param #string MenuText The text for the menu. --- @param #table ParentMenu The parent menu. --- @return #MENU_COALITION self -function MENU_COALITION:New( MenuCoalition, MenuText, ParentMenu ) - - -- Arrange meta tables - local MenuParentPath = {} - if ParentMenu ~= nil then - MenuParentPath = ParentMenu.MenuPath - end - - local self = BASE:Inherit( self, MENU:New( MenuText, MenuParentPath ) ) - self:F( { MenuCoalition, MenuText, ParentMenu } ) - - self.MenuCoalition = MenuCoalition - self.MenuParentPath = MenuParentPath - self.MenuText = MenuText - self.ParentMenu = ParentMenu - - self.Menus = {} - - self:T( { MenuParentPath, MenuText } ) - - self.MenuPath = missionCommands.addSubMenuForCoalition( self.MenuCoalition, MenuText, MenuParentPath ) - - self:T( { self.MenuPath } ) - - if ParentMenu and ParentMenu.Menus then - ParentMenu.Menus[self.MenuPath] = self - end - return self -end - ---- Removes the sub menus recursively of this MENU_COALITION. --- @param #MENU_COALITION self --- @return #MENU_COALITION self -function MENU_COALITION:RemoveSubMenus() - self:F( self.MenuPath ) - - for MenuID, Menu in pairs( self.Menus ) do - Menu:Remove() - end - -end - ---- Removes the sub menus recursively of this MENU_COALITION. --- @param #MENU_COALITION self --- @return #MENU_COALITION self -function MENU_COALITION:Remove() - self:F( self.MenuPath ) - - self:RemoveSubMenus() - missionCommands.removeItemForCoalition( self.MenuCoalition, self.MenuPath ) - self.ParentMenu.Menus[self.MenuPath] = nil - - return nil -end - - ---- The MENU_COALITION_COMMAND class --- @type MENU_COALITION_COMMAND --- @extends Menu#MENU -MENU_COALITION_COMMAND = { - ClassName = "MENU_COALITION_COMMAND" -} - ---- Creates a new radio command item for a group --- @param #MENU_COALITION_COMMAND self --- @param DCSCoalition#coalition.side MenuCoalition The coalition owning the menu. --- @param MenuText The text for the menu. --- @param ParentMenu The parent menu. --- @param CommandMenuFunction A function that is called when the menu key is pressed. --- @param CommandMenuArgument An argument for the function. --- @return #MENU_COALITION_COMMAND self -function MENU_COALITION_COMMAND:New( MenuCoalition, MenuText, ParentMenu, CommandMenuFunction, CommandMenuArgument ) - - -- Arrange meta tables - - local MenuParentPath = {} - if ParentMenu ~= nil then - MenuParentPath = ParentMenu.MenuPath - end - - local self = BASE:Inherit( self, MENU:New( MenuText, MenuParentPath ) ) - - self.MenuCoalition = MenuCoalition - self.MenuParentPath = MenuParentPath - self.MenuText = MenuText - self.ParentMenu = ParentMenu - - self:T( { MenuParentPath, MenuText, CommandMenuFunction, CommandMenuArgument } ) - - self.MenuPath = missionCommands.addCommandForCoalition( self.MenuCoalition, MenuText, MenuParentPath, CommandMenuFunction, CommandMenuArgument ) - - self.CommandMenuFunction = CommandMenuFunction - self.CommandMenuArgument = CommandMenuArgument - - ParentMenu.Menus[self.MenuPath] = self - - return self -end - ---- Removes a radio command item for a coalition --- @param #MENU_COALITION_COMMAND self --- @return #MENU_COALITION_COMMAND self -function MENU_COALITION_COMMAND:Remove() - self:F( self.MenuPath ) - - missionCommands.removeItemForCoalition( self.MenuCoalition, self.MenuPath ) - self.ParentMenu.Menus[self.MenuPath] = nil - return nil -end ---- This module contains the GROUP class. --- --- 1) @{Group#GROUP} class, extends @{Base#BASE} --- ============================================= --- The @{Group#GROUP} class is a wrapper class to handle the DCS Group objects: --- --- * Support all DCS Group APIs. --- * Enhance with Group specific APIs not in the DCS Group API set. --- * Handle local Group Controller. --- * Manage the "state" of the DCS Group. --- --- **IMPORTANT: ONE SHOULD NEVER SANATIZE these GROUP OBJECT REFERENCES! (make the GROUP object references nil).** --- --- 1.1) GROUP reference methods --- ----------------------- --- For each DCS Group object alive within a running mission, a GROUP wrapper object (instance) will be created within the _@{DATABASE} object. --- This is done at the beginning of the mission (when the mission starts), and dynamically when new DCS Group objects are spawned (using the @{SPAWN} class). --- --- The GROUP class does not contain a :New() method, rather it provides :Find() methods to retrieve the object reference --- using the DCS Group or the DCS GroupName. --- --- Another thing to know is that GROUP objects do not "contain" the DCS Group object. --- The GROUP methods will reference the DCS Group object by name when it is needed during API execution. --- If the DCS Group object does not exist or is nil, the GROUP methods will return nil and log an exception in the DCS.log file. --- --- The GROUP class provides the following functions to retrieve quickly the relevant GROUP instance: --- --- * @{#GROUP.Find}(): Find a GROUP instance from the _DATABASE object using a DCS Group object. --- * @{#GROUP.FindByName}(): Find a GROUP instance from the _DATABASE object using a DCS Group name. --- --- 1.2) GROUP task methods --- ----------------------- --- Several group task methods are available that help you to prepare tasks. --- These methods return a string consisting of the task description, which can then be given to either a @{Group#GROUP.PushTask} or @{Group#SetTask} method to assign the task to the GROUP. --- Tasks are specific for the category of the GROUP, more specific, for AIR, GROUND or AIR and GROUND. --- Each task description where applicable indicates for which group category the task is valid. --- There are 2 main subdivisions of tasks: Assigned tasks and EnRoute tasks. --- --- ### 1.2.1) Assigned task methods --- --- Assigned task methods make the group execute the task where the location of the (possible) targets of the task are known before being detected. --- This is different from the EnRoute tasks, where the targets of the task need to be detected before the task can be executed. --- --- Find below a list of the **assigned task** methods: --- --- * @{#GROUP.TaskAttackGroup}: (AIR) Attack a Group. --- * @{#GROUP.TaskAttackMapObject}: (AIR) Attacking the map object (building, structure, e.t.c). --- * @{#GROUP.TaskAttackUnit}: (AIR) Attack the Unit. --- * @{#GROUP.TaskBombing}: (AIR) Delivering weapon at the point on the ground. --- * @{#GROUP.TaskBombingRunway}: (AIR) Delivering weapon on the runway. --- * @{#GROUP.TaskEmbarking}: (AIR) Move the group to a Vec2 Point, wait for a defined duration and embark a group. --- * @{#GROUP.TaskEmbarkToTransport}: (GROUND) Embark to a Transport landed at a location. --- * @{#GROUP.TaskEscort}: (AIR) Escort another airborne group. --- * @{#GROUP.TaskFAC_AttackGroup}: (AIR + GROUND) The task makes the group/unit a FAC and orders the FAC to control the target (enemy ground group) destruction. --- * @{#GROUP.TaskFireAtPoint}: (GROUND) Fire at a VEC2 point until ammunition is finished. --- * @{#GROUP.TaskFollow}: (AIR) Following another airborne group. --- * @{#GROUP.TaskHold}: (GROUND) Hold ground group from moving. --- * @{#GROUP.TaskHoldPosition}: (AIR) Hold position at the current position of the first unit of the group. --- * @{#GROUP.TaskLand}: (AIR HELICOPTER) Landing at the ground. For helicopters only. --- * @{#GROUP.TaskLandAtZone}: (AIR) Land the group at a @{Zone#ZONE_RADIUS). --- * @{#GROUP.TaskOrbitCircle}: (AIR) Orbit at the current position of the first unit of the group at a specified alititude. --- * @{#GROUP.TaskOrbitCircleAtVec2}: (AIR) Orbit at a specified position at a specified alititude during a specified duration with a specified speed. --- * @{#GROUP.TaskRefueling}: (AIR) Refueling from the nearest tanker. No parameters. --- * @{#GROUP.TaskRoute}: (AIR + GROUND) Return a Misson task to follow a given route defined by Points. --- * @{#GROUP.TaskRouteToVec2}: (AIR + GROUND) Make the Group move to a given point. --- * @{#GROUP.TaskRouteToVec3}: (AIR + GROUND) Make the Group move to a given point. --- * @{#GROUP.TaskRouteToZone}: (AIR + GROUND) Route the group to a given zone. --- --- ### 1.2.2) EnRoute task methods --- --- EnRoute tasks require the targets of the task need to be detected by the group (using its sensors) before the task can be executed: --- --- * @{#GROUP.EnRouteTaskAWACS}: (AIR) Aircraft will act as an AWACS for friendly units (will provide them with information about contacts). No parameters. --- * @{#GROUP.EnRouteTaskEngageGroup}: (AIR) Engaging a group. The task does not assign the target group to the unit/group to attack now; it just allows the unit/group to engage the target group as well as other assigned targets. --- * @{#GROUP.EnRouteTaskEngageTargets}: (AIR) Engaging targets of defined types. --- * @{#GROUP.EnRouteTaskEWR}: (AIR) Attack the Unit. --- * @{#GROUP.EnRouteTaskFAC}: (AIR + GROUND) The task makes the group/unit a FAC and lets the FAC to choose a targets (enemy ground group) around as well as other assigned targets. --- * @{#GROUP.EnRouteTaskFAC_EngageGroup}: (AIR + GROUND) The task makes the group/unit a FAC and lets the FAC to choose the target (enemy ground group) as well as other assigned targets. --- * @{#GROUP.EnRouteTaskTanker}: (AIR) Aircraft will act as a tanker for friendly units. No parameters. --- --- ### 1.2.3) Preparation task methods --- --- There are certain task methods that allow to tailor the task behaviour: --- --- * @{#GROUP.TaskWrappedAction}: Return a WrappedAction Task taking a Command. --- * @{#GROUP.TaskCombo}: Return a Combo Task taking an array of Tasks. --- * @{#GROUP.TaskCondition}: Return a condition section for a controlled task. --- * @{#GROUP.TaskControlled}: Return a Controlled Task taking a Task and a TaskCondition. --- --- ### 1.2.4) Obtain the mission from group templates --- --- Group templates contain complete mission descriptions. Sometimes you want to copy a complete mission from a group and assign it to another: --- --- * @{#GROUP.TaskMission}: (AIR + GROUND) Return a mission task from a mission template. --- --- 1.3) GROUP Command methods --- -------------------------- --- Group **command methods** prepare the execution of commands using the @{#GROUP.SetCommand} method: --- --- * @{#GROUP.CommandDoScript}: Do Script command. --- * @{#GROUP.CommandSwitchWayPoint}: Perform a switch waypoint command. --- --- 1.4) GROUP Option methods --- ------------------------- --- Group **Option methods** change the behaviour of the Group while being alive. --- --- ### 1.4.1) Rule of Engagement: --- --- * @{#GROUP.OptionROEWeaponFree} --- * @{#GROUP.OptionROEOpenFire} --- * @{#GROUP.OptionROEReturnFire} --- * @{#GROUP.OptionROEEvadeFire} --- --- To check whether an ROE option is valid for a specific group, use: --- --- * @{#GROUP.OptionROEWeaponFreePossible} --- * @{#GROUP.OptionROEOpenFirePossible} --- * @{#GROUP.OptionROEReturnFirePossible} --- * @{#GROUP.OptionROEEvadeFirePossible} --- --- ### 1.4.2) Rule on thread: --- --- * @{#GROUP.OptionROTNoReaction} --- * @{#GROUP.OptionROTPassiveDefense} --- * @{#GROUP.OptionROTEvadeFire} --- * @{#GROUP.OptionROTVertical} --- --- To test whether an ROT option is valid for a specific group, use: --- --- * @{#GROUP.OptionROTNoReactionPossible} --- * @{#GROUP.OptionROTPassiveDefensePossible} --- * @{#GROUP.OptionROTEvadeFirePossible} --- * @{#GROUP.OptionROTVerticalPossible} --- --- 1.5) GROUP Zone validation methods --- ---------------------------------- --- The group can be validated whether it is completely, partly or not within a @{Zone}. --- Use the following Zone validation methods on the group: --- --- * @{#GROUP.IsCompletelyInZone}: Returns true if all units of the group are within a @{Zone}. --- * @{#GROUP.IsPartlyInZone}: Returns true if some units of the group are within a @{Zone}. --- * @{#GROUP.IsNotInZone}: Returns true if none of the group units of the group are within a @{Zone}. --- --- The zone can be of any @{Zone} class derived from @{Zone#ZONE_BASE}. So, these methods are polymorphic to the zones tested on. --- --- @module Group --- @author FlightControl - ---- The GROUP class --- @type GROUP --- @extends Base#BASE --- @field DCSGroup#Group DCSGroup The DCS group class. --- @field #string GroupName The name of the group. -GROUP = { - ClassName = "GROUP", - GroupName = "", - GroupID = 0, - Controller = nil, - DCSGroup = nil, - WayPointFunctions = {}, -} - ---- A DCSGroup --- @type DCSGroup --- @field id_ The ID of the group in DCS - ---- Create a new GROUP from a DCSGroup --- @param #GROUP self --- @param DCSGroup#Group GroupName The DCS Group name --- @return #GROUP self -function GROUP:Register( GroupName ) - local self = BASE:Inherit( self, BASE:New() ) - self:F2( GroupName ) - self.GroupName = GroupName - return self -end - --- Reference methods. - ---- Find the GROUP wrapper class instance using the DCS Group. --- @param #GROUP self --- @param DCSGroup#Group DCSGroup The DCS Group. --- @return #GROUP The GROUP. -function GROUP:Find( DCSGroup ) - - local GroupName = DCSGroup:getName() -- Group#GROUP - local GroupFound = _DATABASE:FindGroup( GroupName ) - return GroupFound -end - ---- Find the created GROUP using the DCS Group Name. --- @param #GROUP self --- @param #string GroupName The DCS Group Name. --- @return #GROUP The GROUP. -function GROUP:FindByName( GroupName ) - - local GroupFound = _DATABASE:FindGroup( GroupName ) - return GroupFound -end - --- DCS Group methods support. - ---- Returns the DCS Group. --- @param #GROUP self --- @return DCSGroup#Group The DCS Group. -function GROUP:GetDCSGroup() - local DCSGroup = Group.getByName( self.GroupName ) - - if DCSGroup then - return DCSGroup - end - - return nil -end - - ---- Returns if the DCS Group is alive. --- When the group exists at run-time, this method will return true, otherwise false. --- @param #GROUP self --- @return #boolean true if the DCS Group is alive. -function GROUP:IsAlive() - self:F2( self.GroupName ) - - local DCSGroup = self:GetDCSGroup() - - if DCSGroup then - local GroupIsAlive = DCSGroup:isExist() - self:T3( GroupIsAlive ) - return GroupIsAlive - end - - return nil -end - ---- Destroys the DCS Group and all of its DCS Units. --- Note that this destroy method also raises a destroy event at run-time. --- So all event listeners will catch the destroy event of this DCS Group. --- @param #GROUP self -function GROUP:Destroy() - self:F2( self.GroupName ) - - local DCSGroup = self:GetDCSGroup() - - if DCSGroup then - for Index, UnitData in pairs( DCSGroup:getUnits() ) do - self:CreateEventCrash( timer.getTime(), UnitData ) - end - DCSGroup:destroy() - DCSGroup = nil - end - - return nil -end - ---- Returns category of the DCS Group. --- @param #GROUP self --- @return DCSGroup#Group.Category The category ID -function GROUP:GetCategory() - self:F2( self.GroupName ) - - local DCSGroup = self:GetDCSGroup() - if DCSGroup then - local GroupCategory = DCSGroup:getCategory() - self:T3( GroupCategory ) - return GroupCategory - end - - return nil -end - ---- Returns the category name of the DCS Group. --- @param #GROUP self --- @return #string Category name = Helicopter, Airplane, Ground Unit, Ship -function GROUP:GetCategoryName() - self:F2( self.GroupName ) - - local DCSGroup = self:GetDCSGroup() - if DCSGroup then - local CategoryNames = { - [Group.Category.AIRPLANE] = "Airplane", - [Group.Category.HELICOPTER] = "Helicopter", - [Group.Category.GROUND] = "Ground Unit", - [Group.Category.SHIP] = "Ship", - } - local GroupCategory = DCSGroup:getCategory() - self:T3( GroupCategory ) - - return CategoryNames[GroupCategory] - end - - return nil -end - - ---- Returns the coalition of the DCS Group. --- @param #GROUP self --- @return DCSCoalitionObject#coalition.side The coalition side of the DCS Group. -function GROUP:GetCoalition() - self:F2( self.GroupName ) - - local DCSGroup = self:GetDCSGroup() - if DCSGroup then - local GroupCoalition = DCSGroup:getCoalition() - self:T3( GroupCoalition ) - return GroupCoalition - end - - return nil -end - ---- Returns the country of the DCS Group. --- @param #GROUP self --- @return DCScountry#country.id The country identifier. --- @return #nil The DCS Group is not existing or alive. -function GROUP:GetCountry() - self:F2( self.GroupName ) - - local DCSGroup = self:GetDCSGroup() - if DCSGroup then - local GroupCountry = DCSGroup:getUnit(1):getCountry() - self:T3( GroupCountry ) - return GroupCountry - end - - return nil -end - ---- Returns the name of the DCS Group. --- @param #GROUP self --- @return #string The DCS Group name. -function GROUP:GetName() - self:F2( self.GroupName ) - - local DCSGroup = self:GetDCSGroup() - - if DCSGroup then - local GroupName = DCSGroup:getName() - self:T3( GroupName ) - return GroupName - end - - return nil -end - ---- Returns the DCS Group identifier. --- @param #GROUP self --- @return #number The identifier of the DCS Group. -function GROUP:GetID() - self:F2( self.GroupName ) - - local DCSGroup = self:GetDCSGroup() - - if DCSGroup then - local GroupID = DCSGroup:getID() - self:T3( GroupID ) - return GroupID - end - - return nil -end - ---- Returns the UNIT wrapper class with number UnitNumber. --- If the underlying DCS Unit does not exist, the method will return nil. . --- @param #GROUP self --- @param #number UnitNumber The number of the UNIT wrapper class to be returned. --- @return Unit#UNIT The UNIT wrapper class. -function GROUP:GetUnit( UnitNumber ) - self:F2( { self.GroupName, UnitNumber } ) - - local DCSGroup = self:GetDCSGroup() - - if DCSGroup then - local UnitFound = UNIT:Find( DCSGroup:getUnit( UnitNumber ) ) - self:T3( UnitFound.UnitName ) - self:T2( UnitFound ) - return UnitFound - end - - return nil -end - ---- Returns the DCS Unit with number UnitNumber. --- If the underlying DCS Unit does not exist, the method will return nil. . --- @param #GROUP self --- @param #number UnitNumber The number of the DCS Unit to be returned. --- @return DCSUnit#Unit The DCS Unit. -function GROUP:GetDCSUnit( UnitNumber ) - self:F2( { self.GroupName, UnitNumber } ) - - local DCSGroup = self:GetDCSGroup() - - if DCSGroup then - local DCSUnitFound = DCSGroup:getUnit( UnitNumber ) - self:T3( DCSUnitFound ) - return DCSUnitFound - end - - return nil -end - ---- Returns current size of the DCS Group. --- If some of the DCS Units of the DCS Group are destroyed the size of the DCS Group is changed. --- @param #GROUP self --- @return #number The DCS Group size. -function GROUP:GetSize() - self:F2( { self.GroupName } ) - local DCSGroup = self:GetDCSGroup() - - if DCSGroup then - local GroupSize = DCSGroup:getSize() - self:T3( GroupSize ) - return GroupSize - end - - return nil -end - ---- ---- Returns the initial size of the DCS Group. --- If some of the DCS Units of the DCS Group are destroyed, the initial size of the DCS Group is unchanged. --- @param #GROUP self --- @return #number The DCS Group initial size. -function GROUP:GetInitialSize() - self:F2( { self.GroupName } ) - local DCSGroup = self:GetDCSGroup() - - if DCSGroup then - local GroupInitialSize = DCSGroup:getInitialSize() - self:T3( GroupInitialSize ) - return GroupInitialSize - end - - return nil -end - ---- Returns the UNITs wrappers of the DCS Units of the DCS Group. --- @param #GROUP self --- @return #table The UNITs wrappers. -function GROUP:GetUnits() - self:F2( { self.GroupName } ) - local DCSGroup = self:GetDCSGroup() - - if DCSGroup then - local DCSUnits = DCSGroup:getUnits() - local Units = {} - for Index, UnitData in pairs( DCSUnits ) do - Units[#Units+1] = UNIT:Find( UnitData ) - end - self:T3( Units ) - return Units - end - - return nil -end - - ---- Returns the DCS Units of the DCS Group. --- @param #GROUP self --- @return #table The DCS Units. -function GROUP:GetDCSUnits() - self:F2( { self.GroupName } ) - local DCSGroup = self:GetDCSGroup() - - if DCSGroup then - local DCSUnits = DCSGroup:getUnits() - self:T3( DCSUnits ) - return DCSUnits - end - - return nil -end - ---- Get the controller for the GROUP. --- @param #GROUP self --- @return DCSController#Controller -function GROUP:_GetController() - self:F2( { self.GroupName } ) - local DCSGroup = self:GetDCSGroup() - - if DCSGroup then - local GroupController = DCSGroup:getController() - self:T3( GroupController ) - return GroupController - end - - return nil -end - - ---- Retrieve the group mission and allow to place function hooks within the mission waypoint plan. --- Use the method @{Group#GROUP:WayPointFunction} to define the hook functions for specific waypoints. --- Use the method @{Group@GROUP:WayPointExecute) to start the execution of the new mission plan. --- Note that when WayPointInitialize is called, the Mission of the group is RESTARTED! --- @param #GROUP self --- @return #GROUP -function GROUP:WayPointInitialize() - - self.WayPoints = self:GetTaskRoute() - - return self -end - - ---- Registers a waypoint function that will be executed when the group moves over the WayPoint. --- @param #GROUP self --- @param #number WayPoint The waypoint number. Note that the start waypoint on the route is WayPoint 1! --- @param #number WayPointIndex When defining multiple WayPoint functions for one WayPoint, use WayPointIndex to set the sequence of actions. --- @param #function WayPointFunction The waypoint function to be called when the group moves over the waypoint. The waypoint function takes variable parameters. --- @return #GROUP -function GROUP:WayPointFunction( WayPoint, WayPointIndex, WayPointFunction, ... ) - self:F2( { WayPoint, WayPointIndex, WayPointFunction } ) - - table.insert( self.WayPoints[WayPoint].task.params.tasks, WayPointIndex ) - self.WayPoints[WayPoint].task.params.tasks[WayPointIndex] = self:TaskFunction( WayPoint, WayPointIndex, WayPointFunction, arg ) - return self -end - - -function GROUP:TaskFunction( WayPoint, WayPointIndex, FunctionString, FunctionArguments ) - - local DCSTask - - local DCSScript = {} - DCSScript[#DCSScript+1] = "local MissionGroup = GROUP:Find( ... ) " - - if FunctionArguments.n > 0 then - DCSScript[#DCSScript+1] = FunctionString .. "( MissionGroup, " .. table.concat( FunctionArguments, "," ) .. ")" - else - DCSScript[#DCSScript+1] = FunctionString .. "( MissionGroup )" - end - - DCSTask = self:TaskWrappedAction( - self:CommandDoScript( - table.concat( DCSScript ) - ), WayPointIndex - ) - - self:T3( DCSTask ) - - return DCSTask - -end - - - ---- Executes the WayPoint plan. --- The function gets a WayPoint parameter, that you can use to restart the mission at a specific WayPoint. --- Note that when the WayPoint parameter is used, the new start mission waypoint of the group will be 1! --- @param #GROUP self --- @param #number WayPoint The WayPoint from where to execute the mission. --- @param #number WaitTime The amount seconds to wait before initiating the mission. --- @return #GROUP -function GROUP:WayPointExecute( WayPoint, WaitTime ) - - if not WayPoint then - WayPoint = 1 - end - - -- When starting the mission from a certain point, the TaskPoints need to be deleted before the given WayPoint. - for TaskPointID = 1, WayPoint - 1 do - table.remove( self.WayPoints, 1 ) - end - - self:T3( self.WayPoints ) - - self:SetTask( self:TaskRoute( self.WayPoints ), WaitTime ) - - return self -end - - ---- Activates a GROUP. --- @param #GROUP self -function GROUP:Activate() - self:F2( { self.GroupName } ) - trigger.action.activateGroup( self:GetDCSGroup() ) - return self:GetDCSGroup() -end - - ---- Gets the type name of the group. --- @param #GROUP self --- @return #string The type name of the group. -function GROUP:GetTypeName() - self:F2( self.GroupName ) - - local DCSGroup = self:GetDCSGroup() - - if DCSGroup then - local GroupTypeName = DCSGroup:getUnit(1):getTypeName() - self:T3( GroupTypeName ) - return( GroupTypeName ) - end - - return nil -end - ---- Gets the CallSign of the first DCS Unit of the DCS Group. --- @param #GROUP self --- @return #string The CallSign of the first DCS Unit of the DCS Group. -function GROUP:GetCallsign() - self:F2( self.GroupName ) - - local DCSGroup = self:GetDCSGroup() - - if DCSGroup then - local GroupCallSign = DCSGroup:getUnit(1):getCallsign() - self:T3( GroupCallSign ) - return GroupCallSign - end - - return nil -end - ---- Returns the current point (Vec2 vector) of the first DCS Unit in the DCS Group. --- @return DCSTypes#Vec2 Current Vec2 point of the first DCS Unit of the DCS Group. -function GROUP:GetPointVec2() - self:F2( self.GroupName ) - - local GroupPointVec2 = self:GetUnit(1):GetPointVec2() - self:T3( GroupPointVec2 ) - return GroupPointVec2 -end - ---- Returns the current point (Vec3 vector) of the first DCS Unit in the DCS Group. --- @return DCSTypes#Vec3 Current Vec3 point of the first DCS Unit of the DCS Group. -function GROUP:GetPointVec3() - self:F2( self.GroupName ) - - local GroupPointVec3 = self:GetUnit(1):GetPointVec3() - self:T3( GroupPointVec3 ) - return GroupPointVec3 -end - - - --- Is Zone Functions - ---- Returns true if all units of the group are within a @{Zone}. --- @param #GROUP self --- @param Zone#ZONE_BASE Zone The zone to test. --- @return #boolean Returns true if the Group is completely within the @{Zone#ZONE_BASE} -function GROUP:IsCompletelyInZone( Zone ) - self:F2( { self.GroupName, Zone } ) - - for UnitID, UnitData in pairs( self:GetUnits() ) do - local Unit = UnitData -- Unit#UNIT - if Zone:IsPointVec3InZone( Unit:GetPointVec3() ) then - else - return false - end - end - - return true -end - ---- Returns true if some units of the group are within a @{Zone}. --- @param #GROUP self --- @param Zone#ZONE_BASE Zone The zone to test. --- @return #boolean Returns true if the Group is completely within the @{Zone#ZONE_BASE} -function GROUP:IsPartlyInZone( Zone ) - self:F2( { self.GroupName, Zone } ) - - for UnitID, UnitData in pairs( self:GetUnits() ) do - local Unit = UnitData -- Unit#UNIT - if Zone:IsPointVec3InZone( Unit:GetPointVec3() ) then - return true - end - end - - return false -end - ---- Returns true if none of the group units of the group are within a @{Zone}. --- @param #GROUP self --- @param Zone#ZONE_BASE Zone The zone to test. --- @return #boolean Returns true if the Group is completely within the @{Zone#ZONE_BASE} -function GROUP:IsNotInZone( Zone ) - self:F2( { self.GroupName, Zone } ) - - for UnitID, UnitData in pairs( self:GetUnits() ) do - local Unit = UnitData -- Unit#UNIT - if Zone:IsPointVec3InZone( Unit:GetPointVec3() ) then - return false - end - end - - return true -end - ---- Returns if the group is of an air category. --- If the group is a helicopter or a plane, then this method will return true, otherwise false. --- @param #GROUP self --- @return #boolean Air category evaluation result. -function GROUP:IsAir() - self:F2( self.GroupName ) - - local DCSGroup = self:GetDCSGroup() - - if DCSGroup then - local IsAirResult = DCSGroup:getCategory() == Group.Category.AIRPLANE or DCSGroup:getCategory() == Group.Category.HELICOPTER - self:T3( IsAirResult ) - return IsAirResult - end - - return nil -end - ---- Returns if the DCS Group contains Helicopters. --- @param #GROUP self --- @return #boolean true if DCS Group contains Helicopters. -function GROUP:IsHelicopter() - self:F2( self.GroupName ) - - local DCSGroup = self:GetDCSGroup() - - if DCSGroup then - local GroupCategory = DCSGroup:getCategory() - self:T2( GroupCategory ) - return GroupCategory == Group.Category.HELICOPTER - end - - return nil -end - ---- Returns if the DCS Group contains AirPlanes. --- @param #GROUP self --- @return #boolean true if DCS Group contains AirPlanes. -function GROUP:IsAirPlane() - self:F2() - - local DCSGroup = self:GetDCSGroup() - - if DCSGroup then - local GroupCategory = DCSGroup:getCategory() - self:T2( GroupCategory ) - return GroupCategory == Group.Category.AIRPLANE - end - - return nil -end - ---- Returns if the DCS Group contains Ground troops. --- @param #GROUP self --- @return #boolean true if DCS Group contains Ground troops. -function GROUP:IsGround() - self:F2() - - local DCSGroup = self:GetDCSGroup() - - if DCSGroup then - local GroupCategory = DCSGroup:getCategory() - self:T2( GroupCategory ) - return GroupCategory == Group.Category.GROUND - end - - return nil -end - ---- Returns if the DCS Group contains Ships. --- @param #GROUP self --- @return #boolean true if DCS Group contains Ships. -function GROUP:IsShip() - self:F2() - - local DCSGroup = self:GetDCSGroup() - - if DCSGroup then - local GroupCategory = DCSGroup:getCategory() - self:T2( GroupCategory ) - return GroupCategory == Group.Category.SHIP - end - - return nil -end - ---- Returns if all units of the group are on the ground or landed. --- If all units of this group are on the ground, this function will return true, otherwise false. --- @param #GROUP self --- @return #boolean All units on the ground result. -function GROUP:AllOnGround() - self:F2() - - local DCSGroup = self:GetDCSGroup() - - if DCSGroup then - local AllOnGroundResult = true - - for Index, UnitData in pairs( DCSGroup:getUnits() ) do - if UnitData:inAir() then - AllOnGroundResult = false - end - end - - self:T3( AllOnGroundResult ) - return AllOnGroundResult - end - - return nil -end - ---- Returns the current maximum velocity of the group. --- Each unit within the group gets evaluated, and the maximum velocity (= the unit which is going the fastest) is returned. --- @param #GROUP self --- @return #number Maximum velocity found. -function GROUP:GetMaxVelocity() - self:F2() - - local DCSGroup = self:GetDCSGroup() - - if DCSGroup then - local MaxVelocity = 0 - - for Index, UnitData in pairs( DCSGroup:getUnits() ) do - - local Velocity = UnitData:getVelocity() - local VelocityTotal = math.abs( Velocity.x ) + math.abs( Velocity.y ) + math.abs( Velocity.z ) - - if VelocityTotal < MaxVelocity then - MaxVelocity = VelocityTotal - end - end - - return MaxVelocity - end - - return nil -end - ---- Returns the current minimum height of the group. --- Each unit within the group gets evaluated, and the minimum height (= the unit which is the lowest elevated) is returned. --- @param #GROUP self --- @return #number Minimum height found. -function GROUP:GetMinHeight() - self:F2() - -end - ---- Returns the current maximum height of the group. --- Each unit within the group gets evaluated, and the maximum height (= the unit which is the highest elevated) is returned. --- @param #GROUP self --- @return #number Maximum height found. -function GROUP:GetMaxHeight() - self:F2() - -end - --- Tasks - ---- Popping current Task from the group. --- @param #GROUP self --- @return Group#GROUP self -function GROUP:PopCurrentTask() - self:F2() - - local DCSGroup = self:GetDCSGroup() - - if DCSGroup then - local Controller = self:_GetController() - Controller:popTask() - return self - end - - return nil -end - ---- Pushing Task on the queue from the group. --- @param #GROUP self --- @return Group#GROUP self -function GROUP:PushTask( DCSTask, WaitTime ) - self:F2() - - local DCSGroup = self:GetDCSGroup() - - if DCSGroup then - local Controller = self:_GetController() - - -- When a group SPAWNs, it takes about a second to get the group in the simulator. Setting tasks to unspawned groups provides unexpected results. - -- Therefore we schedule the functions to set the mission and options for the Group. - -- Controller:pushTask( DCSTask ) - - if WaitTime then - --routines.scheduleFunction( Controller.pushTask, { Controller, DCSTask }, timer.getTime() + WaitTime ) - SCHEDULER:New( Controller, Controller.pushTask, { DCSTask }, WaitTime ) - else - Controller:pushTask( DCSTask ) - end - - return self - end - - return nil -end - ---- Clearing the Task Queue and Setting the Task on the queue from the group. --- @param #GROUP self --- @return Group#GROUP self -function GROUP:SetTask( DCSTask, WaitTime ) - self:F2( { DCSTask } ) - - local DCSGroup = self:GetDCSGroup() - - if DCSGroup then - - local Controller = self:_GetController() - - -- When a group SPAWNs, it takes about a second to get the group in the simulator. Setting tasks to unspawned groups provides unexpected results. - -- Therefore we schedule the functions to set the mission and options for the Group. - -- Controller.setTask( Controller, DCSTask ) - - if not WaitTime then - WaitTime = 1 - end - --routines.scheduleFunction( Controller.setTask, { Controller, DCSTask }, timer.getTime() + WaitTime ) - SCHEDULER:New( Controller, Controller.setTask, { DCSTask }, WaitTime ) - - return self - end - - return nil -end - - ---- Return a condition section for a controlled task. --- @param #GROUP self --- @param DCSTime#Time time --- @param #string userFlag --- @param #boolean userFlagValue --- @param #string condition --- @param DCSTime#Time duration --- @param #number lastWayPoint --- return DCSTask#Task -function GROUP:TaskCondition( time, userFlag, userFlagValue, condition, duration, lastWayPoint ) - self:F2( { time, userFlag, userFlagValue, condition, duration, lastWayPoint } ) - - local DCSStopCondition = {} - DCSStopCondition.time = time - DCSStopCondition.userFlag = userFlag - DCSStopCondition.userFlagValue = userFlagValue - DCSStopCondition.condition = condition - DCSStopCondition.duration = duration - DCSStopCondition.lastWayPoint = lastWayPoint - - self:T3( { DCSStopCondition } ) - return DCSStopCondition -end - ---- Return a Controlled Task taking a Task and a TaskCondition. --- @param #GROUP self --- @param DCSTask#Task DCSTask --- @param #DCSStopCondition DCSStopCondition --- @return DCSTask#Task -function GROUP:TaskControlled( DCSTask, DCSStopCondition ) - self:F2( { DCSTask, DCSStopCondition } ) - - local DCSTaskControlled - - DCSTaskControlled = { - id = 'ControlledTask', - params = { - task = DCSTask, - stopCondition = DCSStopCondition - } - } - - self:T3( { DCSTaskControlled } ) - return DCSTaskControlled -end - ---- Return a Combo Task taking an array of Tasks. --- @param #GROUP self --- @param DCSTask#TaskArray DCSTasks Array of @{DCSTask#Task} --- @return DCSTask#Task -function GROUP:TaskCombo( DCSTasks ) - self:F2( { DCSTasks } ) - - local DCSTaskCombo - - DCSTaskCombo = { - id = 'ComboTask', - params = { - tasks = DCSTasks - } - } - - self:T3( { DCSTaskCombo } ) - return DCSTaskCombo -end - ---- Return a WrappedAction Task taking a Command. --- @param #GROUP self --- @param DCSCommand#Command DCSCommand --- @return DCSTask#Task -function GROUP:TaskWrappedAction( DCSCommand, Index ) - self:F2( { DCSCommand } ) - - local DCSTaskWrappedAction - - DCSTaskWrappedAction = { - id = "WrappedAction", - enabled = true, - number = Index, - auto = false, - params = { - action = DCSCommand, - }, - } - - self:T3( { DCSTaskWrappedAction } ) - return DCSTaskWrappedAction -end - ---- Executes a command action --- @param #GROUP self --- @param DCSCommand#Command DCSCommand --- @return #GROUP self -function GROUP:SetCommand( DCSCommand ) - self:F2( DCSCommand ) - - local DCSGroup = self:GetDCSGroup() - - if DCSGroup then - local Controller = self:_GetController() - Controller:setCommand( DCSCommand ) - return self - end - - return nil -end - ---- Perform a switch waypoint command --- @param #GROUP self --- @param #number FromWayPoint --- @param #number ToWayPoint --- @return DCSTask#Task -function GROUP:CommandSwitchWayPoint( FromWayPoint, ToWayPoint, Index ) - self:F2( { FromWayPoint, ToWayPoint, Index } ) - - local CommandSwitchWayPoint = { - id = 'SwitchWaypoint', - params = { - fromWaypointIndex = FromWayPoint, - goToWaypointIndex = ToWayPoint, - }, - } - - self:T3( { CommandSwitchWayPoint } ) - return CommandSwitchWayPoint -end - - --- TASKS FOR AIR GROUPS - - ---- (AIR) Attack a Group. --- @param #GROUP self --- @param Group#GROUP AttackGroup The Group to be attacked. --- @param #number WeaponType (optional) Bitmask of weapon types those allowed to use. If parameter is not defined that means no limits on weapon usage. --- @param DCSTypes#AI.Task.WeaponExpend WeaponExpend (optional) Determines how much weapon will be released at each attack. If parameter is not defined the unit / group will choose expend on its own discretion. --- @param #number AttackQty (optional) This parameter limits maximal quantity of attack. The aicraft/group will not make more attack than allowed even if the target group not destroyed and the aicraft/group still have ammo. If not defined the aircraft/group will attack target until it will be destroyed or until the aircraft/group will run out of ammo. --- @param DCSTypes#Azimuth Direction (optional) Desired ingress direction from the target to the attacking aircraft. Group/aircraft will make its attacks from the direction. Of course if there is no way to attack from the direction due the terrain group/aircraft will choose another direction. --- @param DCSTypes#Distance Altitude (optional) Desired attack start altitude. Group/aircraft will make its attacks from the altitude. If the altitude is too low or too high to use weapon aircraft/group will choose closest altitude to the desired attack start altitude. If the desired altitude is defined group/aircraft will not attack from safe altitude. --- @param #boolean AttackQtyLimit (optional) The flag determines how to interpret attackQty parameter. If the flag is true then attackQty is a limit on maximal attack quantity for "AttackGroup" and "AttackUnit" tasks. If the flag is false then attackQty is a desired attack quantity for "Bombing" and "BombingRunway" tasks. --- @return DCSTask#Task The DCS task structure. -function GROUP:TaskAttackGroup( AttackGroup, WeaponType, WeaponExpend, AttackQty, Direction, Altitude, AttackQtyLimit ) - self:F2( { self.GroupName, AttackGroup, WeaponType, WeaponExpend, AttackQty, Direction, Altitude, AttackQtyLimit } ) - - -- AttackGroup = { - -- id = 'AttackGroup', - -- params = { - -- groupId = Group.ID, - -- weaponType = number, - -- expend = enum AI.Task.WeaponExpend, - -- attackQty = number, - -- directionEnabled = boolean, - -- direction = Azimuth, - -- altitudeEnabled = boolean, - -- altitude = Distance, - -- attackQtyLimit = boolean, - -- } - -- } - - local DirectionEnabled = nil - if Direction then - DirectionEnabled = true - end - - local AltitudeEnabled = nil - if Altitude then - AltitudeEnabled = true - end - - local DCSTask - DCSTask = { id = 'AttackGroup', - params = { - groupId = AttackGroup:GetID(), - weaponType = WeaponType, - expend = WeaponExpend, - attackQty = AttackQty, - directionEnabled = DirectionEnabled, - direction = Direction, - altitudeEnabled = AltitudeEnabled, - altitude = Altitude, - attackQtyLimit = AttackQtyLimit, - }, - }, - - self:T3( { DCSTask } ) - return DCSTask -end - - ---- (AIR) Attack the Unit. --- @param #GROUP self --- @param Unit#UNIT AttackUnit The unit. --- @param #number WeaponType (optional) Bitmask of weapon types those allowed to use. If parameter is not defined that means no limits on weapon usage. --- @param DCSTypes#AI.Task.WeaponExpend WeaponExpend (optional) Determines how much weapon will be released at each attack. If parameter is not defined the unit / group will choose expend on its own discretion. --- @param #number AttackQty (optional) This parameter limits maximal quantity of attack. The aicraft/group will not make more attack than allowed even if the target group not destroyed and the aicraft/group still have ammo. If not defined the aircraft/group will attack target until it will be destroyed or until the aircraft/group will run out of ammo. --- @param DCSTypes#Azimuth Direction (optional) Desired ingress direction from the target to the attacking aircraft. Group/aircraft will make its attacks from the direction. Of course if there is no way to attack from the direction due the terrain group/aircraft will choose another direction. --- @param #boolean AttackQtyLimit (optional) The flag determines how to interpret attackQty parameter. If the flag is true then attackQty is a limit on maximal attack quantity for "AttackGroup" and "AttackUnit" tasks. If the flag is false then attackQty is a desired attack quantity for "Bombing" and "BombingRunway" tasks. --- @param #boolean GroupAttack (optional) Flag indicates that the target must be engaged by all aircrafts of the group. Has effect only if the task is assigned to a group, not to a single aircraft. --- @return DCSTask#Task The DCS task structure. -function GROUP:TaskAttackUnit( AttackUnit, WeaponType, WeaponExpend, AttackQty, Direction, AttackQtyLimit, GroupAttack ) - self:F2( { self.GroupName, AttackUnit, WeaponType, WeaponExpend, AttackQty, Direction, AttackQtyLimit, GroupAttack } ) - - -- AttackUnit = { - -- id = 'AttackUnit', - -- params = { - -- unitId = Unit.ID, - -- weaponType = number, - -- expend = enum AI.Task.WeaponExpend - -- attackQty = number, - -- direction = Azimuth, - -- attackQtyLimit = boolean, - -- groupAttack = boolean, - -- } - -- } - - local DCSTask - DCSTask = { id = 'AttackUnit', - params = { - unitId = AttackUnit:GetID(), - weaponType = WeaponType, - expend = WeaponExpend, - attackQty = AttackQty, - direction = Direction, - attackQtyLimit = AttackQtyLimit, - groupAttack = GroupAttack, - }, - }, - - self:T3( { DCSTask } ) - return DCSTask -end - - ---- (AIR) Delivering weapon at the point on the ground. --- @param #GROUP self --- @param DCSTypes#Vec2 PointVec2 2D-coordinates of the point to deliver weapon at. --- @param #number WeaponType (optional) Bitmask of weapon types those allowed to use. If parameter is not defined that means no limits on weapon usage. --- @param DCSTypes#AI.Task.WeaponExpend WeaponExpend (optional) Determines how much weapon will be released at each attack. If parameter is not defined the unit / group will choose expend on its own discretion. --- @param #number AttackQty (optional) Desired quantity of passes. The parameter is not the same in AttackGroup and AttackUnit tasks. --- @param DCSTypes#Azimuth Direction (optional) Desired ingress direction from the target to the attacking aircraft. Group/aircraft will make its attacks from the direction. Of course if there is no way to attack from the direction due the terrain group/aircraft will choose another direction. --- @param #boolean GroupAttack (optional) Flag indicates that the target must be engaged by all aircrafts of the group. Has effect only if the task is assigned to a group, not to a single aircraft. --- @return DCSTask#Task The DCS task structure. -function GROUP:TaskBombing( PointVec2, WeaponType, WeaponExpend, AttackQty, Direction, GroupAttack ) - self:F2( { self.GroupName, PointVec2, WeaponType, WeaponExpend, AttackQty, Direction, GroupAttack } ) - --- Bombing = { --- id = 'Bombing', --- params = { --- point = Vec2, --- weaponType = number, --- expend = enum AI.Task.WeaponExpend, --- attackQty = number, --- direction = Azimuth, --- groupAttack = boolean, --- } --- } - - local DCSTask - DCSTask = { id = 'Bombing', - params = { - point = PointVec2, - weaponType = WeaponType, - expend = WeaponExpend, - attackQty = AttackQty, - direction = Direction, - groupAttack = GroupAttack, - }, - }, - - self:T3( { DCSTask } ) - return DCSTask -end - ---- (AIR) Orbit at a specified position at a specified alititude during a specified duration with a specified speed. --- @param #GROUP self --- @param DCSTypes#Vec2 Point The point to hold the position. --- @param #number Altitude The altitude to hold the position. --- @param #number Speed The speed flying when holding the position. --- @return #GROUP self -function GROUP:TaskOrbitCircleAtVec2( Point, Altitude, Speed ) - self:F2( { self.GroupName, Point, Altitude, Speed } ) - - -- pattern = enum AI.Task.OribtPattern, - -- point = Vec2, - -- point2 = Vec2, - -- speed = Distance, - -- altitude = Distance - - local LandHeight = land.getHeight( Point ) - - self:T3( { LandHeight } ) - - local DCSTask = { id = 'Orbit', - params = { pattern = AI.Task.OrbitPattern.CIRCLE, - point = Point, - speed = Speed, - altitude = Altitude + LandHeight - } - } - - - -- local AITask = { id = 'ControlledTask', - -- params = { task = { id = 'Orbit', - -- params = { pattern = AI.Task.OrbitPattern.CIRCLE, - -- point = Point, - -- speed = Speed, - -- altitude = Altitude + LandHeight - -- } - -- }, - -- stopCondition = { duration = Duration - -- } - -- } - -- } - -- ) - - return DCSTask -end - ---- (AIR) Orbit at the current position of the first unit of the group at a specified alititude. --- @param #GROUP self --- @param #number Altitude The altitude to hold the position. --- @param #number Speed The speed flying when holding the position. --- @return #GROUP self -function GROUP:TaskOrbitCircle( Altitude, Speed ) - self:F2( { self.GroupName, Altitude, Speed } ) - - local DCSGroup = self:GetDCSGroup() - - if DCSGroup then - local GroupPoint = self:GetPointVec2() - return self:TaskOrbitCircleAtVec2( GroupPoint, Altitude, Speed ) - end - - return nil -end - - - ---- (AIR) Hold position at the current position of the first unit of the group. --- @param #GROUP self --- @param #number Duration The maximum duration in seconds to hold the position. --- @return #GROUP self -function GROUP:TaskHoldPosition() - self:F2( { self.GroupName } ) - - return self:TaskOrbitCircle( 30, 10 ) -end - - - - ---- (AIR) Attacking the map object (building, structure, e.t.c). --- @param #GROUP self --- @param DCSTypes#Vec2 PointVec2 2D-coordinates of the point the map object is closest to. The distance between the point and the map object must not be greater than 2000 meters. Object id is not used here because Mission Editor doesn't support map object identificators. --- @param #number WeaponType (optional) Bitmask of weapon types those allowed to use. If parameter is not defined that means no limits on weapon usage. --- @param DCSTypes#AI.Task.WeaponExpend WeaponExpend (optional) Determines how much weapon will be released at each attack. If parameter is not defined the unit / group will choose expend on its own discretion. --- @param #number AttackQty (optional) This parameter limits maximal quantity of attack. The aicraft/group will not make more attack than allowed even if the target group not destroyed and the aicraft/group still have ammo. If not defined the aircraft/group will attack target until it will be destroyed or until the aircraft/group will run out of ammo. --- @param DCSTypes#Azimuth Direction (optional) Desired ingress direction from the target to the attacking aircraft. Group/aircraft will make its attacks from the direction. Of course if there is no way to attack from the direction due the terrain group/aircraft will choose another direction. --- @param #boolean GroupAttack (optional) Flag indicates that the target must be engaged by all aircrafts of the group. Has effect only if the task is assigned to a group, not to a single aircraft. --- @return DCSTask#Task The DCS task structure. -function GROUP:TaskAttackMapObject( PointVec2, WeaponType, WeaponExpend, AttackQty, Direction, GroupAttack ) - self:F2( { self.GroupName, PointVec2, WeaponType, WeaponExpend, AttackQty, Direction, GroupAttack } ) - --- AttackMapObject = { --- id = 'AttackMapObject', --- params = { --- point = Vec2, --- weaponType = number, --- expend = enum AI.Task.WeaponExpend, --- attackQty = number, --- direction = Azimuth, --- groupAttack = boolean, --- } --- } - - local DCSTask - DCSTask = { id = 'AttackMapObject', - params = { - point = PointVec2, - weaponType = WeaponType, - expend = WeaponExpend, - attackQty = AttackQty, - direction = Direction, - groupAttack = GroupAttack, - }, - }, - - self:T3( { DCSTask } ) - return DCSTask -end - - ---- (AIR) Delivering weapon on the runway. --- @param #GROUP self --- @param Airbase#AIRBASE Airbase Airbase to attack. --- @param #number WeaponType (optional) Bitmask of weapon types those allowed to use. If parameter is not defined that means no limits on weapon usage. --- @param DCSTypes#AI.Task.WeaponExpend WeaponExpend (optional) Determines how much weapon will be released at each attack. If parameter is not defined the unit / group will choose expend on its own discretion. --- @param #number AttackQty (optional) This parameter limits maximal quantity of attack. The aicraft/group will not make more attack than allowed even if the target group not destroyed and the aicraft/group still have ammo. If not defined the aircraft/group will attack target until it will be destroyed or until the aircraft/group will run out of ammo. --- @param DCSTypes#Azimuth Direction (optional) Desired ingress direction from the target to the attacking aircraft. Group/aircraft will make its attacks from the direction. Of course if there is no way to attack from the direction due the terrain group/aircraft will choose another direction. --- @param #boolean GroupAttack (optional) Flag indicates that the target must be engaged by all aircrafts of the group. Has effect only if the task is assigned to a group, not to a single aircraft. --- @return DCSTask#Task The DCS task structure. -function GROUP:TaskBombingRunway( Airbase, WeaponType, WeaponExpend, AttackQty, Direction, GroupAttack ) - self:F2( { self.GroupName, Airbase, WeaponType, WeaponExpend, AttackQty, Direction, GroupAttack } ) - --- BombingRunway = { --- id = 'BombingRunway', --- params = { --- runwayId = AirdromeId, --- weaponType = number, --- expend = enum AI.Task.WeaponExpend, --- attackQty = number, --- direction = Azimuth, --- groupAttack = boolean, --- } --- } - - local DCSTask - DCSTask = { id = 'BombingRunway', - params = { - point = Airbase:GetID(), - weaponType = WeaponType, - expend = WeaponExpend, - attackQty = AttackQty, - direction = Direction, - groupAttack = GroupAttack, - }, - }, - - self:T3( { DCSTask } ) - return DCSTask -end - - ---- (AIR) Refueling from the nearest tanker. No parameters. --- @param #GROUP self --- @return DCSTask#Task The DCS task structure. -function GROUP:TaskRefueling() - self:F2( { self.GroupName } ) - --- Refueling = { --- id = 'Refueling', --- params = {} --- } - - local DCSTask - DCSTask = { id = 'Refueling', - params = { - }, - }, - - self:T3( { DCSTask } ) - return DCSTask -end - - ---- (AIR HELICOPTER) Landing at the ground. For helicopters only. --- @param #GROUP self --- @param DCSTypes#Vec2 Point The point where to land. --- @param #number Duration The duration in seconds to stay on the ground. --- @return #GROUP self -function GROUP:TaskLandAtVec2( Point, Duration ) - self:F2( { self.GroupName, Point, Duration } ) - --- Land = { --- id= 'Land', --- params = { --- point = Vec2, --- durationFlag = boolean, --- duration = Time --- } --- } - - local DCSTask - if Duration and Duration > 0 then - DCSTask = { id = 'Land', - params = { - point = Point, - durationFlag = true, - duration = Duration, - }, - } - else - DCSTask = { id = 'Land', - params = { - point = Point, - durationFlag = false, - }, - } - end - - self:T3( DCSTask ) - return DCSTask -end - ---- (AIR) Land the group at a @{Zone#ZONE_RADIUS). --- @param #GROUP self --- @param Zone#ZONE Zone The zone where to land. --- @param #number Duration The duration in seconds to stay on the ground. --- @return #GROUP self -function GROUP:TaskLandAtZone( Zone, Duration, RandomPoint ) - self:F2( { self.GroupName, Zone, Duration, RandomPoint } ) - - local Point - if RandomPoint then - Point = Zone:GetRandomPointVec2() - else - Point = Zone:GetPointVec2() - end - - local DCSTask = self:TaskLandAtVec2( Point, Duration ) - - self:T3( DCSTask ) - return DCSTask -end - - - ---- (AIR) Following another airborne group. --- The unit / group will follow lead unit of another group, wingmens of both groups will continue following their leaders. --- If another group is on land the unit / group will orbit around. --- @param #GROUP self --- @param Group#GROUP FollowGroup The group to be followed. --- @param DCSTypes#Vec3 PointVec3 Position of the unit / lead unit of the group relative lead unit of another group in frame reference oriented by course of lead unit of another group. If another group is on land the unit / group will orbit around. --- @param #number LastWaypointIndex Detach waypoint of another group. Once reached the unit / group Follow task is finished. --- @return DCSTask#Task The DCS task structure. -function GROUP:TaskFollow( FollowGroup, PointVec3, LastWaypointIndex ) - self:F2( { self.GroupName, FollowGroup, PointVec3, LastWaypointIndex } ) - --- Follow = { --- id = 'Follow', --- params = { --- groupId = Group.ID, --- pos = Vec3, --- lastWptIndexFlag = boolean, --- lastWptIndex = number --- } --- } - - local LastWaypointIndexFlag = nil - if LastWaypointIndex then - LastWaypointIndexFlag = true - end - - local DCSTask - DCSTask = { id = 'Follow', - params = { - groupId = FollowGroup:GetID(), - pos = PointVec3, - lastWptIndexFlag = LastWaypointIndexFlag, - lastWptIndex = LastWaypointIndex, - }, - }, - - self:T3( { DCSTask } ) - return DCSTask -end - - ---- (AIR) Escort another airborne group. --- The unit / group will follow lead unit of another group, wingmens of both groups will continue following their leaders. --- The unit / group will also protect that group from threats of specified types. --- @param #GROUP self --- @param Group#GROUP EscortGroup The group to be escorted. --- @param DCSTypes#Vec3 PointVec3 Position of the unit / lead unit of the group relative lead unit of another group in frame reference oriented by course of lead unit of another group. If another group is on land the unit / group will orbit around. --- @param #number LastWaypointIndex Detach waypoint of another group. Once reached the unit / group Follow task is finished. --- @param #number EngagementDistanceMax Maximal distance from escorted group to threat. If the threat is already engaged by escort escort will disengage if the distance becomes greater than 1.5 * engagementDistMax. --- @param DCSTypes#AttributeNameArray TargetTypes Array of AttributeName that is contains threat categories allowed to engage. --- @return DCSTask#Task The DCS task structure. -function GROUP:TaskEscort( FollowGroup, PointVec3, LastWaypointIndex, EngagementDistance, TargetTypes ) - self:F2( { self.GroupName, FollowGroup, PointVec3, LastWaypointIndex, EngagementDistance, TargetTypes } ) - --- Escort = { --- id = 'Escort', --- params = { --- groupId = Group.ID, --- pos = Vec3, --- lastWptIndexFlag = boolean, --- lastWptIndex = number, --- engagementDistMax = Distance, --- targetTypes = array of AttributeName, --- } --- } - - local LastWaypointIndexFlag = nil - if LastWaypointIndex then - LastWaypointIndexFlag = true - end - - local DCSTask - DCSTask = { id = 'Follow', - params = { - groupId = FollowGroup:GetID(), - pos = PointVec3, - lastWptIndexFlag = LastWaypointIndexFlag, - lastWptIndex = LastWaypointIndex, - engagementDistMax = EngagementDistance, - targetTypes = TargetTypes, - }, - }, - - self:T3( { DCSTask } ) - return DCSTask -end - - --- GROUND TASKS - ---- (GROUND) Fire at a VEC2 point until ammunition is finished. --- @param #GROUP self --- @param DCSTypes#Vec2 PointVec2 The point to fire at. --- @param DCSTypes#Distance Radius The radius of the zone to deploy the fire at. --- @return DCSTask#Task The DCS task structure. -function GROUP:TaskFireAtPoint( PointVec2, Radius ) - self:F2( { self.GroupName, PointVec2, Radius } ) - - -- FireAtPoint = { - -- id = 'FireAtPoint', - -- params = { - -- point = Vec2, - -- radius = Distance, - -- } - -- } - - local DCSTask - DCSTask = { id = 'FireAtPoint', - params = { - point = PointVec2, - radius = Radius, - } - } - - self:T3( { DCSTask } ) - return DCSTask -end - ---- (GROUND) Hold ground group from moving. --- @param #GROUP self --- @return DCSTask#Task The DCS task structure. -function GROUP:TaskHold() - self:F2( { self.GroupName } ) - --- Hold = { --- id = 'Hold', --- params = { --- } --- } - - local DCSTask - DCSTask = { id = 'Hold', - params = { - } - } - - self:T3( { DCSTask } ) - return DCSTask -end - - --- TASKS FOR AIRBORNE AND GROUND UNITS/GROUPS - ---- (AIR + GROUND) The task makes the group/unit a FAC and orders the FAC to control the target (enemy ground group) destruction. --- The killer is player-controlled allied CAS-aircraft that is in contact with the FAC. --- If the task is assigned to the group lead unit will be a FAC. --- @param #GROUP self --- @param Group#GROUP AttackGroup Target GROUP. --- @param #number WeaponType Bitmask of weapon types those allowed to use. If parameter is not defined that means no limits on weapon usage. --- @param DCSTypes#AI.Task.Designation Designation (optional) Designation type. --- @param #boolean Datalink (optional) Allows to use datalink to send the target information to attack aircraft. Enabled by default. --- @return DCSTask#Task The DCS task structure. -function GROUP:TaskFAC_AttackGroup( AttackGroup, WeaponType, Designation, Datalink ) - self:F2( { self.GroupName, AttackGroup, WeaponType, Designation, Datalink } ) - --- FAC_AttackGroup = { --- id = 'FAC_AttackGroup', --- params = { --- groupId = Group.ID, --- weaponType = number, --- designation = enum AI.Task.Designation, --- datalink = boolean --- } --- } - - local DCSTask - DCSTask = { id = 'FAC_AttackGroup', - params = { - groupId = AttackGroup:GetID(), - weaponType = WeaponType, - designation = Designation, - datalink = Datalink, - } - } - - self:T3( { DCSTask } ) - return DCSTask -end - --- EN-ROUTE TASKS FOR AIRBORNE GROUPS - ---- (AIR) Engaging targets of defined types. --- @param #GROUP self --- @param DCSTypes#Distance Distance Maximal distance from the target to a route leg. If the target is on a greater distance it will be ignored. --- @param DCSTypes#AttributeNameArray TargetTypes Array of target categories allowed to engage. --- @param #number Priority All enroute tasks have the priority parameter. This is a number (less value - higher priority) that determines actions related to what task will be performed first. --- @return DCSTask#Task The DCS task structure. -function GROUP:EnRouteTaskEngageTargets( Distance, TargetTypes, Priority ) - self:F2( { self.GroupName, Distance, TargetTypes, Priority } ) - --- EngageTargets ={ --- id = 'EngageTargets', --- params = { --- maxDist = Distance, --- targetTypes = array of AttributeName, --- priority = number --- } --- } - - local DCSTask - DCSTask = { id = 'EngageTargets', - params = { - maxDist = Distance, - targetTypes = TargetTypes, - priority = Priority - } - } - - self:T3( { DCSTask } ) - return DCSTask -end - - - ---- (AIR) Engaging a targets of defined types at circle-shaped zone. --- @param #GROUP self --- @param DCSTypes#Vec2 PointVec2 2D-coordinates of the zone. --- @param DCSTypes#Distance Radius Radius of the zone. --- @param DCSTypes#AttributeNameArray TargetTypes Array of target categories allowed to engage. --- @param #number Priority All en-route tasks have the priority parameter. This is a number (less value - higher priority) that determines actions related to what task will be performed first. --- @return DCSTask#Task The DCS task structure. -function GROUP:EnRouteTaskEngageTargets( PointVec2, Radius, TargetTypes, Priority ) - self:F2( { self.GroupName, PointVec2, Radius, TargetTypes, Priority } ) - --- EngageTargetsInZone = { --- id = 'EngageTargetsInZone', --- params = { --- point = Vec2, --- zoneRadius = Distance, --- targetTypes = array of AttributeName, --- priority = number --- } --- } - - local DCSTask - DCSTask = { id = 'EngageTargetsInZone', - params = { - point = PointVec2, - zoneRadius = Radius, - targetTypes = TargetTypes, - priority = Priority - } - } - - self:T3( { DCSTask } ) - return DCSTask -end - - ---- (AIR) Engaging a group. The task does not assign the target group to the unit/group to attack now; it just allows the unit/group to engage the target group as well as other assigned targets. --- @param #GROUP self --- @param Group#GROUP AttackGroup The Group to be attacked. --- @param #number Priority All en-route tasks have the priority parameter. This is a number (less value - higher priority) that determines actions related to what task will be performed first. --- @param #number WeaponType (optional) Bitmask of weapon types those allowed to use. If parameter is not defined that means no limits on weapon usage. --- @param DCSTypes#AI.Task.WeaponExpend WeaponExpend (optional) Determines how much weapon will be released at each attack. If parameter is not defined the unit / group will choose expend on its own discretion. --- @param #number AttackQty (optional) This parameter limits maximal quantity of attack. The aicraft/group will not make more attack than allowed even if the target group not destroyed and the aicraft/group still have ammo. If not defined the aircraft/group will attack target until it will be destroyed or until the aircraft/group will run out of ammo. --- @param DCSTypes#Azimuth Direction (optional) Desired ingress direction from the target to the attacking aircraft. Group/aircraft will make its attacks from the direction. Of course if there is no way to attack from the direction due the terrain group/aircraft will choose another direction. --- @param DCSTypes#Distance Altitude (optional) Desired attack start altitude. Group/aircraft will make its attacks from the altitude. If the altitude is too low or too high to use weapon aircraft/group will choose closest altitude to the desired attack start altitude. If the desired altitude is defined group/aircraft will not attack from safe altitude. --- @param #boolean AttackQtyLimit (optional) The flag determines how to interpret attackQty parameter. If the flag is true then attackQty is a limit on maximal attack quantity for "AttackGroup" and "AttackUnit" tasks. If the flag is false then attackQty is a desired attack quantity for "Bombing" and "BombingRunway" tasks. --- @return DCSTask#Task The DCS task structure. -function GROUP:EnRouteTaskEngageGroup( AttackGroup, Priority, WeaponType, WeaponExpend, AttackQty, Direction, Altitude, AttackQtyLimit ) - self:F2( { self.GroupName, AttackGroup, Priority, WeaponType, WeaponExpend, AttackQty, Direction, Altitude, AttackQtyLimit } ) - - -- EngageGroup = { - -- id = 'EngageGroup ', - -- params = { - -- groupId = Group.ID, - -- weaponType = number, - -- expend = enum AI.Task.WeaponExpend, - -- attackQty = number, - -- directionEnabled = boolean, - -- direction = Azimuth, - -- altitudeEnabled = boolean, - -- altitude = Distance, - -- attackQtyLimit = boolean, - -- priority = number, - -- } - -- } - - local DirectionEnabled = nil - if Direction then - DirectionEnabled = true - end - - local AltitudeEnabled = nil - if Altitude then - AltitudeEnabled = true - end - - local DCSTask - DCSTask = { id = 'EngageGroup', - params = { - groupId = AttackGroup:GetID(), - weaponType = WeaponType, - expend = WeaponExpend, - attackQty = AttackQty, - directionEnabled = DirectionEnabled, - direction = Direction, - altitudeEnabled = AltitudeEnabled, - altitude = Altitude, - attackQtyLimit = AttackQtyLimit, - priority = Priority, - }, - }, - - self:T3( { DCSTask } ) - return DCSTask -end - - ---- (AIR) Attack the Unit. --- @param #GROUP self --- @param Unit#UNIT AttackUnit The UNIT. --- @param #number Priority All en-route tasks have the priority parameter. This is a number (less value - higher priority) that determines actions related to what task will be performed first. --- @param #number WeaponType (optional) Bitmask of weapon types those allowed to use. If parameter is not defined that means no limits on weapon usage. --- @param DCSTypes#AI.Task.WeaponExpend WeaponExpend (optional) Determines how much weapon will be released at each attack. If parameter is not defined the unit / group will choose expend on its own discretion. --- @param #number AttackQty (optional) This parameter limits maximal quantity of attack. The aicraft/group will not make more attack than allowed even if the target group not destroyed and the aicraft/group still have ammo. If not defined the aircraft/group will attack target until it will be destroyed or until the aircraft/group will run out of ammo. --- @param DCSTypes#Azimuth Direction (optional) Desired ingress direction from the target to the attacking aircraft. Group/aircraft will make its attacks from the direction. Of course if there is no way to attack from the direction due the terrain group/aircraft will choose another direction. --- @param #boolean AttackQtyLimit (optional) The flag determines how to interpret attackQty parameter. If the flag is true then attackQty is a limit on maximal attack quantity for "AttackGroup" and "AttackUnit" tasks. If the flag is false then attackQty is a desired attack quantity for "Bombing" and "BombingRunway" tasks. --- @param #boolean GroupAttack (optional) Flag indicates that the target must be engaged by all aircrafts of the group. Has effect only if the task is assigned to a group, not to a single aircraft. --- @return DCSTask#Task The DCS task structure. -function GROUP:EnRouteTaskEngageUnit( AttackUnit, Priority, WeaponType, WeaponExpend, AttackQty, Direction, AttackQtyLimit, GroupAttack ) - self:F2( { self.GroupName, AttackUnit, Priority, WeaponType, WeaponExpend, AttackQty, Direction, AttackQtyLimit, GroupAttack } ) - - -- EngageUnit = { - -- id = 'EngageUnit', - -- params = { - -- unitId = Unit.ID, - -- weaponType = number, - -- expend = enum AI.Task.WeaponExpend - -- attackQty = number, - -- direction = Azimuth, - -- attackQtyLimit = boolean, - -- groupAttack = boolean, - -- priority = number, - -- } - -- } - - local DCSTask - DCSTask = { id = 'EngageUnit', - params = { - unitId = AttackUnit:GetID(), - weaponType = WeaponType, - expend = WeaponExpend, - attackQty = AttackQty, - direction = Direction, - attackQtyLimit = AttackQtyLimit, - groupAttack = GroupAttack, - priority = Priority, - }, - }, - - self:T3( { DCSTask } ) - return DCSTask -end - - - ---- (AIR) Aircraft will act as an AWACS for friendly units (will provide them with information about contacts). No parameters. --- @param #GROUP self --- @return DCSTask#Task The DCS task structure. -function GROUP:EnRouteTaskAWACS( ) - self:F2( { self.GroupName } ) - --- AWACS = { --- id = 'AWACS', --- params = { --- } --- } - - local DCSTask - DCSTask = { id = 'AWACS', - params = { - } - } - - self:T3( { DCSTask } ) - return DCSTask -end - - ---- (AIR) Aircraft will act as a tanker for friendly units. No parameters. --- @param #GROUP self --- @return DCSTask#Task The DCS task structure. -function GROUP:EnRouteTaskTanker( ) - self:F2( { self.GroupName } ) - --- Tanker = { --- id = 'Tanker', --- params = { --- } --- } - - local DCSTask - DCSTask = { id = 'Tanker', - params = { - } - } - - self:T3( { DCSTask } ) - return DCSTask -end - - --- En-route tasks for ground units/groups - ---- (GROUND) Ground unit (EW-radar) will act as an EWR for friendly units (will provide them with information about contacts). No parameters. --- @param #GROUP self --- @return DCSTask#Task The DCS task structure. -function GROUP:EnRouteTaskEWR( ) - self:F2( { self.GroupName } ) - --- EWR = { --- id = 'EWR', --- params = { --- } --- } - - local DCSTask - DCSTask = { id = 'EWR', - params = { - } - } - - self:T3( { DCSTask } ) - return DCSTask -end - - --- En-route tasks for airborne and ground units/groups - ---- (AIR + GROUND) The task makes the group/unit a FAC and lets the FAC to choose the target (enemy ground group) as well as other assigned targets. --- The killer is player-controlled allied CAS-aircraft that is in contact with the FAC. --- If the task is assigned to the group lead unit will be a FAC. --- @param #GROUP self --- @param Group#GROUP AttackGroup Target GROUP. --- @param #number Priority All en-route tasks have the priority parameter. This is a number (less value - higher priority) that determines actions related to what task will be performed first. --- @param #number WeaponType Bitmask of weapon types those allowed to use. If parameter is not defined that means no limits on weapon usage. --- @param DCSTypes#AI.Task.Designation Designation (optional) Designation type. --- @param #boolean Datalink (optional) Allows to use datalink to send the target information to attack aircraft. Enabled by default. --- @return DCSTask#Task The DCS task structure. -function GROUP:EnRouteTaskFAC_EngageGroup( AttackGroup, Priority, WeaponType, Designation, Datalink ) - self:F2( { self.GroupName, AttackGroup, WeaponType, Priority, Designation, Datalink } ) - --- FAC_EngageGroup = { --- id = 'FAC_EngageGroup', --- params = { --- groupId = Group.ID, --- weaponType = number, --- designation = enum AI.Task.Designation, --- datalink = boolean, --- priority = number, --- } --- } - - local DCSTask - DCSTask = { id = 'FAC_EngageGroup', - params = { - groupId = AttackGroup:GetID(), - weaponType = WeaponType, - designation = Designation, - datalink = Datalink, - priority = Priority, - } - } - - self:T3( { DCSTask } ) - return DCSTask -end - - ---- (AIR + GROUND) The task makes the group/unit a FAC and lets the FAC to choose a targets (enemy ground group) around as well as other assigned targets. --- The killer is player-controlled allied CAS-aircraft that is in contact with the FAC. --- If the task is assigned to the group lead unit will be a FAC. --- @param #GROUP self --- @param DCSTypes#Distance Radius The maximal distance from the FAC to a target. --- @param #number Priority All en-route tasks have the priority parameter. This is a number (less value - higher priority) that determines actions related to what task will be performed first. --- @return DCSTask#Task The DCS task structure. -function GROUP:EnRouteTaskFAC( Radius, Priority ) - self:F2( { self.GroupName, Radius, Priority } ) - --- FAC = { --- id = 'FAC', --- params = { --- radius = Distance, --- priority = number --- } --- } - - local DCSTask - DCSTask = { id = 'FAC', - params = { - radius = Radius, - priority = Priority - } - } - - self:T3( { DCSTask } ) - return DCSTask -end - - - - ---- (AIR) Move the group to a Vec2 Point, wait for a defined duration and embark a group. --- @param #GROUP self --- @param DCSTypes#Vec2 Point The point where to wait. --- @param #number Duration The duration in seconds to wait. --- @param #GROUP EmbarkingGroup The group to be embarked. --- @return DCSTask#Task The DCS task structure -function GROUP:TaskEmbarking( Point, Duration, EmbarkingGroup ) - self:F2( { self.GroupName, Point, Duration, EmbarkingGroup.DCSGroup } ) - - local DCSTask - DCSTask = { id = 'Embarking', - params = { x = Point.x, - y = Point.y, - duration = Duration, - groupsForEmbarking = { EmbarkingGroup.GroupID }, - durationFlag = true, - distributionFlag = false, - distribution = {}, - } - } - - self:T3( { DCSTask } ) - return DCSTask -end - ---- (GROUND) Embark to a Transport landed at a location. - ---- Move to a defined Vec2 Point, and embark to a group when arrived within a defined Radius. --- @param #GROUP self --- @param DCSTypes#Vec2 Point The point where to wait. --- @param #number Radius The radius of the embarking zone around the Point. --- @return DCSTask#Task The DCS task structure. -function GROUP:TaskEmbarkToTransport( Point, Radius ) - self:F2( { self.GroupName, Point, Radius } ) - - local DCSTask --DCSTask#Task - DCSTask = { id = 'EmbarkToTransport', - params = { x = Point.x, - y = Point.y, - zoneRadius = Radius, - } - } - - self:T3( { DCSTask } ) - return DCSTask -end - - - ---- (AIR + GROUND) Return a mission task from a mission template. --- @param #GROUP self --- @param #table TaskMission A table containing the mission task. --- @return DCSTask#Task -function GROUP:TaskMission( TaskMission ) - self:F2( Points ) - - local DCSTask - DCSTask = { id = 'Mission', params = { TaskMission, }, } - - self:T3( { DCSTask } ) - return DCSTask -end - ---- Return a Misson task to follow a given route defined by Points. --- @param #GROUP self --- @param #table Points A table of route points. --- @return DCSTask#Task -function GROUP:TaskRoute( Points ) - self:F2( Points ) - - local DCSTask - DCSTask = { id = 'Mission', params = { route = { points = Points, }, }, } - - self:T3( { DCSTask } ) - return DCSTask -end - ---- (AIR + GROUND) Make the Group move to fly to a given point. --- @param #GROUP self --- @param DCSTypes#Vec3 Point The destination point in Vec3 format. --- @param #number Speed The speed to travel. --- @return #GROUP self -function GROUP:TaskRouteToVec2( Point, Speed ) - self:F2( { Point, Speed } ) - - local GroupPoint = self:GetUnit( 1 ):GetPointVec2() - - local PointFrom = {} - PointFrom.x = GroupPoint.x - PointFrom.y = GroupPoint.y - PointFrom.type = "Turning Point" - PointFrom.action = "Turning Point" - PointFrom.speed = Speed - PointFrom.speed_locked = true - PointFrom.properties = { - ["vnav"] = 1, - ["scale"] = 0, - ["angle"] = 0, - ["vangle"] = 0, - ["steer"] = 2, - } - - - local PointTo = {} - PointTo.x = Point.x - PointTo.y = Point.y - PointTo.type = "Turning Point" - PointTo.action = "Fly Over Point" - PointTo.speed = Speed - PointTo.speed_locked = true - PointTo.properties = { - ["vnav"] = 1, - ["scale"] = 0, - ["angle"] = 0, - ["vangle"] = 0, - ["steer"] = 2, - } - - - local Points = { PointFrom, PointTo } - - self:T3( Points ) - - self:Route( Points ) - - return self -end - ---- (AIR + GROUND) Make the Group move to a given point. --- @param #GROUP self --- @param DCSTypes#Vec3 Point The destination point in Vec3 format. --- @param #number Speed The speed to travel. --- @return #GROUP self -function GROUP:TaskRouteToVec3( Point, Speed ) - self:F2( { Point, Speed } ) - - local GroupPoint = self:GetUnit( 1 ):GetPointVec3() - - local PointFrom = {} - PointFrom.x = GroupPoint.x - PointFrom.y = GroupPoint.z - PointFrom.alt = GroupPoint.y - PointFrom.alt_type = "BARO" - PointFrom.type = "Turning Point" - PointFrom.action = "Turning Point" - PointFrom.speed = Speed - PointFrom.speed_locked = true - PointFrom.properties = { - ["vnav"] = 1, - ["scale"] = 0, - ["angle"] = 0, - ["vangle"] = 0, - ["steer"] = 2, - } - - - local PointTo = {} - PointTo.x = Point.x - PointTo.y = Point.z - PointTo.alt = Point.y - PointTo.alt_type = "BARO" - PointTo.type = "Turning Point" - PointTo.action = "Fly Over Point" - PointTo.speed = Speed - PointTo.speed_locked = true - PointTo.properties = { - ["vnav"] = 1, - ["scale"] = 0, - ["angle"] = 0, - ["vangle"] = 0, - ["steer"] = 2, - } - - - local Points = { PointFrom, PointTo } - - self:T3( Points ) - - self:Route( Points ) - - return self -end - - - ---- Make the group to follow a given route. --- @param #GROUP self --- @param #table GoPoints A table of Route Points. --- @return #GROUP self -function GROUP:Route( GoPoints ) - self:F2( GoPoints ) - - local DCSGroup = self:GetDCSGroup() - - if DCSGroup then - local Points = routines.utils.deepCopy( GoPoints ) - local MissionTask = { id = 'Mission', params = { route = { points = Points, }, }, } - local Controller = self:_GetController() - --Controller.setTask( Controller, MissionTask ) - --routines.scheduleFunction( Controller.setTask, { Controller, MissionTask}, timer.getTime() + 1 ) - SCHEDULER:New( Controller, Controller.setTask, { MissionTask }, 1 ) - return self - end - - return nil -end - - - ---- (AIR + GROUND) Route the group to a given zone. --- The group final destination point can be randomized. --- A speed can be given in km/h. --- A given formation can be given. --- @param #GROUP self --- @param Zone#ZONE Zone The zone where to route to. --- @param #boolean Randomize Defines whether to target point gets randomized within the Zone. --- @param #number Speed The speed. --- @param Base#FORMATION Formation The formation string. -function GROUP:TaskRouteToZone( Zone, Randomize, Speed, Formation ) - self:F2( Zone ) - - local DCSGroup = self:GetDCSGroup() - - if DCSGroup then - - local GroupPoint = self:GetPointVec2() - - local PointFrom = {} - PointFrom.x = GroupPoint.x - PointFrom.y = GroupPoint.y - PointFrom.type = "Turning Point" - PointFrom.action = "Cone" - PointFrom.speed = 20 / 1.6 - - - local PointTo = {} - local ZonePoint - - if Randomize then - ZonePoint = Zone:GetRandomPointVec2() - else - ZonePoint = Zone:GetPointVec2() - end - - PointTo.x = ZonePoint.x - PointTo.y = ZonePoint.y - PointTo.type = "Turning Point" - - if Formation then - PointTo.action = Formation - else - PointTo.action = "Cone" - end - - if Speed then - PointTo.speed = Speed - else - PointTo.speed = 20 / 1.6 - end - - local Points = { PointFrom, PointTo } - - self:T3( Points ) - - self:Route( Points ) - - return self - end - - return nil -end - --- Commands - ---- Do Script command --- @param #GROUP self --- @param #string DoScript --- @return #DCSCommand -function GROUP:CommandDoScript( DoScript ) - - local DCSDoScript = { - id = "Script", - params = { - command = DoScript, - }, - } - - self:T3( DCSDoScript ) - return DCSDoScript -end - - ---- Return the mission template of the group. --- @param #GROUP self --- @return #table The MissionTemplate -function GROUP:GetTaskMission() - self:F2( self.GroupName ) - - return routines.utils.deepCopy( _DATABASE.Templates.Groups[self.GroupName].Template ) -end - ---- Return the mission route of the group. --- @param #GROUP self --- @return #table The mission route defined by points. -function GROUP:GetTaskRoute() - self:F2( self.GroupName ) - - return routines.utils.deepCopy( _DATABASE.Templates.Groups[self.GroupName].Template.route.points ) -end - ---- Return the route of a group by using the @{Database#DATABASE} class. --- @param #GROUP self --- @param #number Begin The route point from where the copy will start. The base route point is 0. --- @param #number End The route point where the copy will end. The End point is the last point - the End point. The last point has base 0. --- @param #boolean Randomize Randomization of the route, when true. --- @param #number Radius When randomization is on, the randomization is within the radius. -function GROUP:CopyRoute( Begin, End, Randomize, Radius ) - self:F2( { Begin, End } ) - - local Points = {} - - -- Could be a Spawned Group - local GroupName = string.match( self:GetName(), ".*#" ) - if GroupName then - GroupName = GroupName:sub( 1, -2 ) - else - GroupName = self:GetName() - end - - self:T3( { GroupName } ) - - local Template = _DATABASE.Templates.Groups[GroupName].Template - - if Template then - if not Begin then - Begin = 0 - end - if not End then - End = 0 - end - - for TPointID = Begin + 1, #Template.route.points - End do - if Template.route.points[TPointID] then - Points[#Points+1] = routines.utils.deepCopy( Template.route.points[TPointID] ) - if Randomize then - if not Radius then - Radius = 500 - end - Points[#Points].x = Points[#Points].x + math.random( Radius * -1, Radius ) - Points[#Points].y = Points[#Points].y + math.random( Radius * -1, Radius ) - end - end - end - return Points - end - - return nil -end - - -function GROUP:GetDetectedTargets() - self:F2( self.GroupName ) - - local DCSGroup = self:GetDCSGroup() - if DCSGroup then - return self:_GetController():getDetectedTargets() - end - - return nil -end - -function GROUP:IsTargetDetected( DCSObject ) - self:F2( self.GroupName ) - - local DCSGroup = self:GetDCSGroup() - if DCSGroup then - - local TargetIsDetected, TargetIsVisible, TargetLastTime, TargetKnowType, TargetKnowDistance, TargetLastPos, TargetLastVelocity - = self:_GetController().isTargetDetected( self:_GetController(), DCSObject, - Controller.Detection.VISUAL, - Controller.Detection.OPTIC, - Controller.Detection.RADAR, - Controller.Detection.IRST, - Controller.Detection.RWR, - Controller.Detection.DLINK - ) - return TargetIsDetected, TargetIsVisible, TargetLastTime, TargetKnowType, TargetKnowDistance, TargetLastPos, TargetLastVelocity - end - - return nil -end - --- Options - ---- Can the GROUP hold their weapons? --- @param #GROUP self --- @return #boolean -function GROUP:OptionROEHoldFirePossible() - self:F2( { self.GroupName } ) - - local DCSGroup = self:GetDCSGroup() - if DCSGroup then - if self:IsAir() or self:IsGround() or self:IsShip() then - return true - end - - return false - end - - return nil -end - ---- Holding weapons. --- @param Group#GROUP self --- @return Group#GROUP self -function GROUP:OptionROEHoldFire() - self:F2( { self.GroupName } ) - - local DCSGroup = self:GetDCSGroup() - if DCSGroup then - local Controller = self:_GetController() - - if self:IsAir() then - Controller:setOption( AI.Option.Air.id.ROE, AI.Option.Air.val.ROE.WEAPON_HOLD ) - elseif self:IsGround() then - Controller:setOption( AI.Option.Ground.id.ROE, AI.Option.Ground.val.ROE.WEAPON_HOLD ) - elseif self:IsShip() then - Controller:setOption( AI.Option.Naval.id.ROE, AI.Option.Naval.val.ROE.WEAPON_HOLD ) - end - - return self - end - - return nil -end - ---- Can the GROUP attack returning on enemy fire? --- @param #GROUP self --- @return #boolean -function GROUP:OptionROEReturnFirePossible() - self:F2( { self.GroupName } ) - - local DCSGroup = self:GetDCSGroup() - if DCSGroup then - if self:IsAir() or self:IsGround() or self:IsShip() then - return true - end - - return false - end - - return nil -end - ---- Return fire. --- @param #GROUP self --- @return #GROUP self -function GROUP:OptionROEReturnFire() - self:F2( { self.GroupName } ) - - local DCSGroup = self:GetDCSGroup() - if DCSGroup then - local Controller = self:_GetController() - - if self:IsAir() then - Controller:setOption( AI.Option.Air.id.ROE, AI.Option.Air.val.ROE.RETURN_FIRE ) - elseif self:IsGround() then - Controller:setOption( AI.Option.Ground.id.ROE, AI.Option.Ground.val.ROE.RETURN_FIRE ) - elseif self:IsShip() then - Controller:setOption( AI.Option.Naval.id.ROE, AI.Option.Naval.val.ROE.RETURN_FIRE ) - end - - return self - end - - return nil -end - ---- Can the GROUP attack designated targets? --- @param #GROUP self --- @return #boolean -function GROUP:OptionROEOpenFirePossible() - self:F2( { self.GroupName } ) - - local DCSGroup = self:GetDCSGroup() - if DCSGroup then - if self:IsAir() or self:IsGround() or self:IsShip() then - return true - end - - return false - end - - return nil -end - ---- Openfire. --- @param #GROUP self --- @return #GROUP self -function GROUP:OptionROEOpenFire() - self:F2( { self.GroupName } ) - - local DCSGroup = self:GetDCSGroup() - if DCSGroup then - local Controller = self:_GetController() - - if self:IsAir() then - Controller:setOption( AI.Option.Air.id.ROE, AI.Option.Air.val.ROE.OPEN_FIRE ) - elseif self:IsGround() then - Controller:setOption( AI.Option.Ground.id.ROE, AI.Option.Ground.val.ROE.OPEN_FIRE ) - elseif self:IsShip() then - Controller:setOption( AI.Option.Naval.id.ROE, AI.Option.Naval.val.ROE.OPEN_FIRE ) - end - - return self - end - - return nil -end - ---- Can the GROUP attack targets of opportunity? --- @param #GROUP self --- @return #boolean -function GROUP:OptionROEWeaponFreePossible() - self:F2( { self.GroupName } ) - - local DCSGroup = self:GetDCSGroup() - if DCSGroup then - if self:IsAir() then - return true - end - - return false - end - - return nil -end - ---- Weapon free. --- @param #GROUP self --- @return #GROUP self -function GROUP:OptionROEWeaponFree() - self:F2( { self.GroupName } ) - - local DCSGroup = self:GetDCSGroup() - if DCSGroup then - local Controller = self:_GetController() - - if self:IsAir() then - Controller:setOption( AI.Option.Air.id.ROE, AI.Option.Air.val.ROE.WEAPON_FREE ) - end - - return self - end - - return nil -end - ---- Can the GROUP ignore enemy fire? --- @param #GROUP self --- @return #boolean -function GROUP:OptionROTNoReactionPossible() - self:F2( { self.GroupName } ) - - local DCSGroup = self:GetDCSGroup() - if DCSGroup then - if self:IsAir() then - return true - end - - return false - end - - return nil -end - - ---- No evasion on enemy threats. --- @param #GROUP self --- @return #GROUP self -function GROUP:OptionROTNoReaction() - self:F2( { self.GroupName } ) - - local DCSGroup = self:GetDCSGroup() - if DCSGroup then - local Controller = self:_GetController() - - if self:IsAir() then - Controller:setOption( AI.Option.Air.id.REACTION_ON_THREAT, AI.Option.Air.val.REACTION_ON_THREAT.NO_REACTION ) - end - - return self - end - - return nil -end - ---- Can the GROUP evade using passive defenses? --- @param #GROUP self --- @return #boolean -function GROUP:OptionROTPassiveDefensePossible() - self:F2( { self.GroupName } ) - - local DCSGroup = self:GetDCSGroup() - if DCSGroup then - if self:IsAir() then - return true - end - - return false - end - - return nil -end - ---- Evasion passive defense. --- @param #GROUP self --- @return #GROUP self -function GROUP:OptionROTPassiveDefense() - self:F2( { self.GroupName } ) - - local DCSGroup = self:GetDCSGroup() - if DCSGroup then - local Controller = self:_GetController() - - if self:IsAir() then - Controller:setOption( AI.Option.Air.id.REACTION_ON_THREAT, AI.Option.Air.val.REACTION_ON_THREAT.PASSIVE_DEFENCE ) - end - - return self - end - - return nil -end - ---- Can the GROUP evade on enemy fire? --- @param #GROUP self --- @return #boolean -function GROUP:OptionROTEvadeFirePossible() - self:F2( { self.GroupName } ) - - local DCSGroup = self:GetDCSGroup() - if DCSGroup then - if self:IsAir() then - return true - end - - return false - end - - return nil -end - - ---- Evade on fire. --- @param #GROUP self --- @return #GROUP self -function GROUP:OptionROTEvadeFire() - self:F2( { self.GroupName } ) - - local DCSGroup = self:GetDCSGroup() - if DCSGroup then - local Controller = self:_GetController() - - if self:IsAir() then - Controller:setOption( AI.Option.Air.id.REACTION_ON_THREAT, AI.Option.Air.val.REACTION_ON_THREAT.EVADE_FIRE ) - end - - return self - end - - return nil -end - ---- Can the GROUP evade on fire using vertical manoeuvres? --- @param #GROUP self --- @return #boolean -function GROUP:OptionROTVerticalPossible() - self:F2( { self.GroupName } ) - - local DCSGroup = self:GetDCSGroup() - if DCSGroup then - if self:IsAir() then - return true - end - - return false - end - - return nil -end - - ---- Evade on fire using vertical manoeuvres. --- @param #GROUP self --- @return #GROUP self -function GROUP:OptionROTVertical() - self:F2( { self.GroupName } ) - - local DCSGroup = self:GetDCSGroup() - if DCSGroup then - local Controller = self:_GetController() - - if self:IsAir() then - Controller:setOption( AI.Option.Air.id.REACTION_ON_THREAT, AI.Option.Air.val.REACTION_ON_THREAT.BYPASS_AND_ESCAPE ) - end - - return self - end - - return nil -end - --- Message APIs - ---- Returns a message for a coalition or a client. --- @param #GROUP self --- @param #string Message The message text --- @param DCSTypes#Duration Duration The duration of the message. --- @return Message#MESSAGE -function GROUP:Message( Message, Duration ) - self:F2( { Message, Duration } ) - - local DCSGroup = self:GetDCSGroup() - if DCSGroup then - return MESSAGE:New( Message, Duration, self:GetCallsign() .. " (" .. self:GetTypeName() .. ")" ) - end - - return nil -end - ---- Send a message to all coalitions. --- The message will appear in the message area. The message will begin with the callsign of the group and the type of the first unit sending the message. --- @param #GROUP self --- @param #string Message The message text --- @param DCSTypes#Duration Duration The duration of the message. -function GROUP:MessageToAll( Message, Duration ) - self:F2( { Message, Duration } ) - - local DCSGroup = self:GetDCSGroup() - if DCSGroup then - self:Message( Message, Duration ):ToAll() - end - - return nil -end - ---- Send a message to the red coalition. --- The message will appear in the message area. The message will begin with the callsign of the group and the type of the first unit sending the message. --- @param #GROUP self --- @param #string Message The message text --- @param DCSTYpes#Duration Duration The duration of the message. -function GROUP:MessageToRed( Message, Duration ) - self:F2( { Message, Duration } ) - - local DCSGroup = self:GetDCSGroup() - if DCSGroup then - self:Message( Message, Duration ):ToRed() - end - - return nil -end - ---- Send a message to the blue coalition. --- The message will appear in the message area. The message will begin with the callsign of the group and the type of the first unit sending the message. --- @param #GROUP self --- @param #string Message The message text --- @param DCSTypes#Duration Duration The duration of the message. -function GROUP:MessageToBlue( Message, Duration ) - self:F2( { Message, Duration } ) - - local DCSGroup = self:GetDCSGroup() - if DCSGroup then - self:Message( Message, Duration ):ToBlue() - end - - return nil -end - ---- Send a message to a client. --- The message will appear in the message area. The message will begin with the callsign of the group and the type of the first unit sending the message. --- @param #GROUP self --- @param #string Message The message text --- @param DCSTypes#Duration Duration The duration of the message. --- @param Client#CLIENT Client The client object receiving the message. -function GROUP:MessageToClient( Message, Duration, Client ) - self:F2( { Message, Duration } ) - - local DCSGroup = self:GetDCSGroup() - if DCSGroup then - self:Message( Message, Duration ):ToClient( Client ) - end - - return nil -end ---- This module contains the UNIT class. --- --- 1) @{Unit#UNIT} class, extends @{Base#BASE} --- =========================================== --- The @{Unit#UNIT} class is a wrapper class to handle the DCS Unit objects: --- --- * Support all DCS Unit APIs. --- * Enhance with Unit specific APIs not in the DCS Unit API set. --- * Handle local Unit Controller. --- * Manage the "state" of the DCS Unit. --- --- --- 1.1) UNIT reference methods --- ---------------------- --- For each DCS Unit object alive within a running mission, a UNIT wrapper object (instance) will be created within the _@{DATABASE} object. --- This is done at the beginning of the mission (when the mission starts), and dynamically when new DCS Unit objects are spawned (using the @{SPAWN} class). --- --- The UNIT class **does not contain a :New()** method, rather it provides **:Find()** methods to retrieve the object reference --- using the DCS Unit or the DCS UnitName. --- --- Another thing to know is that UNIT objects do not "contain" the DCS Unit object. --- The UNIT methods will reference the DCS Unit object by name when it is needed during API execution. --- If the DCS Unit object does not exist or is nil, the UNIT methods will return nil and log an exception in the DCS.log file. --- --- The UNIT class provides the following functions to retrieve quickly the relevant UNIT instance: --- --- * @{#UNIT.Find}(): Find a UNIT instance from the _DATABASE object using a DCS Unit object. --- * @{#UNIT.FindByName}(): Find a UNIT instance from the _DATABASE object using a DCS Unit name. --- --- IMPORTANT: ONE SHOULD NEVER SANATIZE these UNIT OBJECT REFERENCES! (make the UNIT object references nil). --- --- 1.2) DCS UNIT APIs --- ------------------ --- The DCS Unit APIs are used extensively within MOOSE. The UNIT class has for each DCS Unit API a corresponding method. --- To be able to distinguish easily in your code the difference between a UNIT API call and a DCS Unit API call, --- the first letter of the method is also capitalized. So, by example, the DCS Unit method @{DCSUnit#Unit.getName}() --- is implemented in the UNIT class as @{#UNIT.GetName}(). --- --- 1.3) Smoke, Flare Units --- ----------------------- --- The UNIT class provides methods to smoke or flare units easily. --- The @{#UNIT.SmokeBlue}(), @{#UNIT.SmokeGreen}(),@{#UNIT.SmokeOrange}(), @{#UNIT.SmokeRed}(), @{#UNIT.SmokeRed}() methods --- will smoke the unit in the corresponding color. Note that smoking a unit is done at the current position of the DCS Unit. --- When the DCS Unit moves for whatever reason, the smoking will still continue! --- The @{#UNIT.FlareGreen}(), @{#UNIT.FlareRed}(), @{#UNIT.FlareWhite}(), @{#UNIT.FlareYellow}() --- methods will fire off a flare in the air with the corresponding color. Note that a flare is a one-off shot and its effect is of very short duration. --- --- 1.4) Location Position, Point --- ----------------------------- --- The UNIT class provides methods to obtain the current point or position of the DCS Unit. --- The @{#UNIT.GetPointVec2}(), @{#UNIT.GetPointVec3}() will obtain the current **location** of the DCS Unit in a Vec2 (2D) or a **point** in a Vec3 (3D) vector respectively. --- If you want to obtain the complete **3D position** including oriëntation and direction vectors, consult the @{#UNIT.GetPositionVec3}() method respectively. --- --- 1.5) Test if alive --- ------------------ --- The @{#UNIT.IsAlive}(), @{#UNIT.IsActive}() methods determines if the DCS Unit is alive, meaning, it is existing and active. --- --- 1.6) Test for proximity --- ----------------------- --- The UNIT class contains methods to test the location or proximity against zones or other objects. --- --- ### 1.6.1) Zones --- To test whether the Unit is within a **zone**, use the @{#UNIT.IsInZone}() or the @{#UNIT.IsNotInZone}() methods. Any zone can be tested on, but the zone must be derived from @{Zone#ZONE_BASE}. --- --- ### 1.6.2) Units --- Test if another DCS Unit is within a given radius of the current DCS Unit, use the @{#UNIT.OtherUnitInRadius}() method. --- --- @module Unit --- @author FlightControl - - - - - ---- The UNIT class --- @type UNIT --- @extends Base#BASE --- @field #UNIT.FlareColor FlareColor --- @field #UNIT.SmokeColor SmokeColor -UNIT = { - ClassName="UNIT", - CategoryName = { - [Unit.Category.AIRPLANE] = "Airplane", - [Unit.Category.HELICOPTER] = "Helicoper", - [Unit.Category.GROUND_UNIT] = "Ground Unit", - [Unit.Category.SHIP] = "Ship", - [Unit.Category.STRUCTURE] = "Structure", - }, - FlareColor = { - Green = trigger.flareColor.Green, - Red = trigger.flareColor.Red, - White = trigger.flareColor.White, - Yellow = trigger.flareColor.Yellow - }, - SmokeColor = { - Green = trigger.smokeColor.Green, - Red = trigger.smokeColor.Red, - White = trigger.smokeColor.White, - Orange = trigger.smokeColor.Orange, - Blue = trigger.smokeColor.Blue - }, - } - ---- FlareColor --- @type UNIT.FlareColor --- @field Green --- @field Red --- @field White --- @field Yellow - ---- SmokeColor --- @type UNIT.SmokeColor --- @field Green --- @field Red --- @field White --- @field Orange --- @field Blue - --- Registration. - ---- Create a new UNIT from DCSUnit. --- @param #UNIT self --- @param DCSUnit#Unit DCSUnit --- @param Database#DATABASE Database --- @return Unit#UNIT -function UNIT:Register( UnitName ) - - local self = BASE:Inherit( self, BASE:New() ) - self:F2( UnitName ) - self.UnitName = UnitName - return self -end - --- Reference methods. - ---- Finds a UNIT from the _DATABASE using a DCSUnit object. --- @param #UNIT self --- @param DCSUnit#Unit DCSUnit An existing DCS Unit object reference. --- @return Unit#UNIT self -function UNIT:Find( DCSUnit ) - - local UnitName = DCSUnit:getName() - local UnitFound = _DATABASE:FindUnit( UnitName ) - return UnitFound -end - ---- Find a UNIT in the _DATABASE using the name of an existing DCS Unit. --- @param #UNIT self --- @param #string UnitName The Unit Name. --- @return Unit#UNIT self -function UNIT:FindByName( UnitName ) - - local UnitFound = _DATABASE:FindUnit( UnitName ) - return UnitFound -end - -function UNIT:GetDCSUnit() - local DCSUnit = Unit.getByName( self.UnitName ) - - if DCSUnit then - return DCSUnit - end - - self:E( "Unit " .. self.UnitName .. " not found!" ) - return nil -end - ---- Returns coalition of the Unit. --- @param Unit#UNIT self --- @return DCSCoalitionObject#coalition.side The side of the coalition. --- @return #nil The DCS Unit is not existing or alive. -function UNIT:GetCoalition() - self:F2( self.UnitName ) - - local DCSUnit = self:GetDCSUnit() - - if DCSUnit then - local UnitCoalition = DCSUnit:getCoalition() - self:T3( UnitCoalition ) - return UnitCoalition - end - - return nil -end - ---- Returns country of the Unit. --- @param Unit#UNIT self --- @return DCScountry#country.id The country identifier. --- @return #nil The DCS Unit is not existing or alive. -function UNIT:GetCountry() - self:F2( self.UnitName ) - - local DCSUnit = self:GetDCSUnit() - - if DCSUnit then - local UnitCountry = DCSUnit:getCountry() - self:T3( UnitCountry ) - return UnitCountry - end - - return nil -end - - ---- Returns DCS Unit object name. --- The function provides access to non-activated units too. --- @param Unit#UNIT self --- @return #string The name of the DCS Unit. --- @return #nil The DCS Unit is not existing or alive. -function UNIT:GetName() - self:F2( self.UnitName ) - - local DCSUnit = self:GetDCSUnit() - - if DCSUnit then - local UnitName = self.UnitName - return UnitName - end - - return nil -end - - ---- Returns if the unit is alive. --- @param Unit#UNIT self --- @return #boolean true if Unit is alive. --- @return #nil The DCS Unit is not existing or alive. -function UNIT:IsAlive() - self:F2( self.UnitName ) - - local DCSUnit = self:GetDCSUnit() - - if DCSUnit then - local UnitIsAlive = DCSUnit:isExist() - return UnitIsAlive - end - - return false -end - ---- Returns if the unit is activated. --- @param Unit#UNIT self --- @return #boolean true if Unit is activated. --- @return #nil The DCS Unit is not existing or alive. -function UNIT:IsActive() - self:F2( self.UnitName ) - - local DCSUnit = self:GetDCSUnit() - - if DCSUnit then - - local UnitIsActive = DCSUnit:isActive() - return UnitIsActive - end - - return nil -end - ---- Returns name of the player that control the unit or nil if the unit is controlled by A.I. --- @param Unit#UNIT self --- @return #string Player Name --- @return #nil The DCS Unit is not existing or alive. -function UNIT:GetPlayerName() - self:F2( self.UnitName ) - - local DCSUnit = self:GetDCSUnit() - - if DCSUnit then - - local PlayerName = DCSUnit:getPlayerName() - if PlayerName == nil then - PlayerName = "" - end - return PlayerName - end - - return nil -end - ---- Returns the unit's unique identifier. --- @param Unit#UNIT self --- @return DCSUnit#Unit.ID Unit ID --- @return #nil The DCS Unit is not existing or alive. -function UNIT:GetID() - self:F2( self.UnitName ) - - local DCSUnit = self:GetDCSUnit() - - if DCSUnit then - local UnitID = DCSUnit:getID() - return UnitID - end - - return nil -end - ---- Returns the unit's number in the group. --- The number is the same number the unit has in ME. --- It may not be changed during the mission. --- If any unit in the group is destroyed, the numbers of another units will not be changed. --- @param Unit#UNIT self --- @return #number The Unit number. --- @return #nil The DCS Unit is not existing or alive. -function UNIT:GetNumber() - self:F2( self.UnitName ) - - local DCSUnit = self:GetDCSUnit() - - if DCSUnit then - local UnitNumber = DCSUnit:getNumber() - return UnitNumber - end - - return nil -end - ---- Returns the unit's group if it exist and nil otherwise. --- @param Unit#UNIT self --- @return Group#GROUP The Group of the Unit. --- @return #nil The DCS Unit is not existing or alive. -function UNIT:GetGroup() - self:F2( self.UnitName ) - - local DCSUnit = self:GetDCSUnit() - - if DCSUnit then - local UnitGroup = DCSUnit:getGroup() - return UnitGroup - end - - return nil -end - - ---- Returns the unit's callsign - the localized string. --- @param Unit#UNIT self --- @return #string The Callsign of the Unit. --- @return #nil The DCS Unit is not existing or alive. -function UNIT:GetCallSign() - self:F2( self.UnitName ) - - local DCSUnit = self:GetDCSUnit() - - if DCSUnit then - local UnitCallSign = DCSUnit:getCallsign() - return UnitCallSign - end - - return nil -end - ---- Returns the unit's health. Dead units has health <= 1.0. --- @param Unit#UNIT self --- @return #number The Unit's health value. --- @return #nil The DCS Unit is not existing or alive. -function UNIT:GetLife() - self:F2( self.UnitName ) - - local DCSUnit = self:GetDCSUnit() - - if DCSUnit then - local UnitLife = DCSUnit:getLife() - return UnitLife - end - - return nil -end - ---- Returns the Unit's initial health. --- @param Unit#UNIT self --- @return #number The Unit's initial health value. --- @return #nil The DCS Unit is not existing or alive. -function UNIT:GetLife0() - self:F2( self.UnitName ) - - local DCSUnit = self:GetDCSUnit() - - if DCSUnit then - local UnitLife0 = DCSUnit:getLife0() - return UnitLife0 - end - - return nil -end - ---- Returns relative amount of fuel (from 0.0 to 1.0) the unit has in its internal tanks. If there are additional fuel tanks the value may be greater than 1.0. --- @param Unit#UNIT self --- @return #number The relative amount of fuel (from 0.0 to 1.0). --- @return #nil The DCS Unit is not existing or alive. -function UNIT:GetFuel() - self:F2( self.UnitName ) - - local DCSUnit = self:GetDCSUnit() - - if DCSUnit then - local UnitFuel = DCSUnit:getFuel() - return UnitFuel - end - - return nil -end - ---- Returns the Unit's ammunition. --- @param Unit#UNIT self --- @return DCSUnit#Unit.Ammo --- @return #nil The DCS Unit is not existing or alive. -function UNIT:GetAmmo() - self:F2( self.UnitName ) - - local DCSUnit = self:GetDCSUnit() - - if DCSUnit then - local UnitAmmo = DCSUnit:getAmmo() - return UnitAmmo - end - - return nil -end - ---- Returns the unit sensors. --- @param Unit#UNIT self --- @return DCSUnit#Unit.Sensors --- @return #nil The DCS Unit is not existing or alive. -function UNIT:GetSensors() - self:F2( self.UnitName ) - - local DCSUnit = self:GetDCSUnit() - - if DCSUnit then - local UnitSensors = DCSUnit:getSensors() - return UnitSensors - end - - return nil -end - --- Need to add here a function per sensortype --- unit:hasSensors(Unit.SensorType.RADAR, Unit.RadarType.AS) - ---- Returns two values: --- --- * First value indicates if at least one of the unit's radar(s) is on. --- * Second value is the object of the radar's interest. Not nil only if at least one radar of the unit is tracking a target. --- @param Unit#UNIT self --- @return #boolean Indicates if at least one of the unit's radar(s) is on. --- @return DCSObject#Object The object of the radar's interest. Not nil only if at least one radar of the unit is tracking a target. --- @return #nil The DCS Unit is not existing or alive. -function UNIT:GetRadar() - self:F2( self.UnitName ) - - local DCSUnit = self:GetDCSUnit() - - if DCSUnit then - local UnitRadarOn, UnitRadarObject = DCSUnit:getRadar() - return UnitRadarOn, UnitRadarObject - end - - return nil, nil -end - --- Need to add here functions to check if radar is on and which object etc. - ---- Returns unit descriptor. Descriptor type depends on unit category. --- @param Unit#UNIT self --- @return DCSUnit#Unit.Desc The Unit descriptor. --- @return #nil The DCS Unit is not existing or alive. -function UNIT:GetDesc() - self:F2( self.UnitName ) - - local DCSUnit = self:GetDCSUnit() - - if DCSUnit then - local UnitDesc = DCSUnit:getDesc() - self:T2( UnitDesc ) - return UnitDesc - end - - self:E( "Unit " .. self.UnitName .. "not found!" ) - return nil -end - - ---- Returns the type name of the DCS Unit. --- @param Unit#UNIT self --- @return #string The type name of the DCS Unit. --- @return #nil The DCS Unit is not existing or alive. -function UNIT:GetTypeName() - self:F2( self.UnitName ) - - local DCSUnit = self:GetDCSUnit() - - if DCSUnit then - local UnitTypeName = DCSUnit:getTypeName() - self:T3( UnitTypeName ) - return UnitTypeName - end - - return nil -end - - - ---- Returns the prefix name of the DCS Unit. A prefix name is a part of the name before a '#'-sign. --- DCS Units spawned with the @{SPAWN} class contain a '#'-sign to indicate the end of the (base) DCS Unit name. --- The spawn sequence number and unit number are contained within the name after the '#' sign. --- @param Unit#UNIT self --- @return #string The name of the DCS Unit. --- @return #nil The DCS Unit is not existing or alive. -function UNIT:GetPrefix() - self:F2( self.UnitName ) - - local DCSUnit = self:GetDCSUnit() - - if DCSUnit then - local UnitPrefix = string.match( self.UnitName, ".*#" ):sub( 1, -2 ) - self:T3( UnitPrefix ) - return UnitPrefix - end - - return nil -end - - - ---- Returns the @{DCSTypes#Vec2} vector indicating the point in 2D of the DCS Unit within the mission. --- @param Unit#UNIT self --- @return DCSTypes#Vec2 The 2D point vector of the DCS Unit. --- @return #nil The DCS Unit is not existing or alive. -function UNIT:GetPointVec2() - self:F2( self.UnitName ) - - local DCSUnit = self:GetDCSUnit() - - if DCSUnit then - local UnitPointVec3 = DCSUnit:getPosition().p - - local UnitPointVec2 = {} - UnitPointVec2.x = UnitPointVec3.x - UnitPointVec2.y = UnitPointVec3.z - - self:T2( UnitPointVec2 ) - return UnitPointVec2 - end - - return nil -end - - ---- Returns the @{DCSTypes#Vec3} vector indicating the point in 3D of the DCS Unit within the mission. --- @param Unit#UNIT self --- @return DCSTypes#Vec3 The 3D point vector of the DCS Unit. --- @return #nil The DCS Unit is not existing or alive. -function UNIT:GetPointVec3() - self:F2( self.UnitName ) - - local DCSUnit = self:GetDCSUnit() - - if DCSUnit then - local UnitPointVec3 = DCSUnit:getPosition().p - self:T3( UnitPointVec3 ) - return UnitPointVec3 - end - - return nil -end - ---- Returns the @{DCSTypes#Position3} position vectors indicating the point and direction vectors in 3D of the DCS Unit within the mission. --- @param Unit#UNIT self --- @return DCSTypes#Position The 3D position vectors of the DCS Unit. --- @return #nil The DCS Unit is not existing or alive. -function UNIT:GetPositionVec3() - self:F2( self.UnitName ) - - local DCSUnit = self:GetDCSUnit() - - if DCSUnit then - local UnitPosition = DCSUnit:getPosition() - self:T3( UnitPosition ) - return UnitPosition - end - - return nil -end - ---- Returns the DCS Unit velocity vector. --- @param Unit#UNIT self --- @return DCSTypes#Vec3 The velocity vector --- @return #nil The DCS Unit is not existing or alive. -function UNIT:GetVelocity() - self:F2( self.UnitName ) - - local DCSUnit = self:GetDCSUnit() - - if DCSUnit then - local UnitVelocityVec3 = DCSUnit:getVelocity() - self:T3( UnitVelocityVec3 ) - return UnitVelocityVec3 - end - - return nil -end - --- Is functions - ---- Returns true if the unit is within a @{Zone}. --- @param #UNIT self --- @param Zone#ZONE_BASE Zone The zone to test. --- @return #boolean Returns true if the unit is within the @{Zone#ZONE_BASE} -function UNIT:IsInZone( Zone ) - self:F2( { self.UnitName, Zone } ) - - local IsInZone = Zone:IsPointVec3InZone( self:GetPointVec3() ) - - self:T( { IsInZone } ) - return IsInZone -end - ---- Returns true if the unit is not within a @{Zone}. --- @param #UNIT self --- @param Zone#ZONE_BASE Zone The zone to test. --- @return #boolean Returns true if the unit is not within the @{Zone#ZONE_BASE} -function UNIT:IsNotInZone( Zone ) - self:F2( { self.UnitName, Zone } ) - - local IsInZone = not Zone:IsPointVec3InZone( self:GetPointVec3() ) - - self:T( { IsInZone } ) - return IsInZone -end - ---- Returns true if the DCS Unit is in the air. --- @param Unit#UNIT self --- @return #boolean true if in the air. --- @return #nil The DCS Unit is not existing or alive. -function UNIT:InAir() - self:F2( self.UnitName ) - - local DCSUnit = self:GetDCSUnit() - - if DCSUnit then - local UnitInAir = DCSUnit:inAir() - self:T3( UnitInAir ) - return UnitInAir - end - - return nil -end - ---- Returns the altitude of the DCS Unit. --- @param Unit#UNIT self --- @return DCSTypes#Distance The altitude of the DCS Unit. --- @return #nil The DCS Unit is not existing or alive. -function UNIT:GetAltitude() - self:F2() - - local DCSUnit = self:GetDCSUnit() - - if DCSUnit then - local UnitPointVec3 = DCSUnit:getPoint() --DCSTypes#Vec3 - return UnitPointVec3.y - end - - return nil -end - ---- Returns true if there is an **other** DCS Unit within a radius of the current 2D point of the DCS Unit. --- @param Unit#UNIT self --- @param Unit#UNIT AwaitUnit The other UNIT wrapper object. --- @param Radius The radius in meters with the DCS Unit in the centre. --- @return true If the other DCS Unit is within the radius of the 2D point of the DCS Unit. --- @return #nil The DCS Unit is not existing or alive. -function UNIT:OtherUnitInRadius( AwaitUnit, Radius ) - self:F2( { self.UnitName, AwaitUnit.UnitName, Radius } ) - - local DCSUnit = self:GetDCSUnit() - - if DCSUnit then - local UnitPos = self:GetPointVec3() - local AwaitUnitPos = AwaitUnit:GetPointVec3() - - if (((UnitPos.x - AwaitUnitPos.x)^2 + (UnitPos.z - AwaitUnitPos.z)^2)^0.5 <= Radius) then - self:T3( "true" ) - return true - else - self:T3( "false" ) - return false - end - end - - return nil -end - ---- Returns the DCS Unit category name as defined within the DCS Unit Descriptor. --- @param Unit#UNIT self --- @return #string The DCS Unit Category Name -function UNIT:GetCategoryName() - local DCSUnit = self:GetDCSUnit() - - if DCSUnit then - local UnitCategoryName = self.CategoryName[ self:GetDesc().category ] - return UnitCategoryName - end - - return nil -end - ---- Signal a flare at the position of the UNIT. --- @param #UNIT self -function UNIT:Flare( FlareColor ) - self:F2() - trigger.action.signalFlare( self:GetPointVec3(), FlareColor , 0 ) -end - ---- Signal a white flare at the position of the UNIT. --- @param #UNIT self -function UNIT:FlareWhite() - self:F2() - trigger.action.signalFlare( self:GetPointVec3(), trigger.flareColor.White , 0 ) -end - ---- Signal a yellow flare at the position of the UNIT. --- @param #UNIT self -function UNIT:FlareYellow() - self:F2() - trigger.action.signalFlare( self:GetPointVec3(), trigger.flareColor.Yellow , 0 ) -end - ---- Signal a green flare at the position of the UNIT. --- @param #UNIT self -function UNIT:FlareGreen() - self:F2() - trigger.action.signalFlare( self:GetPointVec3(), trigger.flareColor.Green , 0 ) -end - ---- Signal a red flare at the position of the UNIT. --- @param #UNIT self -function UNIT:FlareRed() - self:F2() - trigger.action.signalFlare( self:GetPointVec3(), trigger.flareColor.Red, 0 ) -end - ---- Smoke the UNIT. --- @param #UNIT self -function UNIT:Smoke( SmokeColor ) - self:F2() - trigger.action.smoke( self:GetPointVec3(), SmokeColor ) -end - ---- Smoke the UNIT Green. --- @param #UNIT self -function UNIT:SmokeGreen() - self:F2() - trigger.action.smoke( self:GetPointVec3(), trigger.smokeColor.Green ) -end - ---- Smoke the UNIT Red. --- @param #UNIT self -function UNIT:SmokeRed() - self:F2() - trigger.action.smoke( self:GetPointVec3(), trigger.smokeColor.Red ) -end - ---- Smoke the UNIT White. --- @param #UNIT self -function UNIT:SmokeWhite() - self:F2() - trigger.action.smoke( self:GetPointVec3(), trigger.smokeColor.White ) -end - ---- Smoke the UNIT Orange. --- @param #UNIT self -function UNIT:SmokeOrange() - self:F2() - trigger.action.smoke( self:GetPointVec3(), trigger.smokeColor.Orange ) -end - ---- Smoke the UNIT Blue. --- @param #UNIT self -function UNIT:SmokeBlue() - self:F2() - trigger.action.smoke( self:GetPointVec3(), trigger.smokeColor.Blue ) -end - --- Is methods - ---- Returns if the unit is of an air category. --- If the unit is a helicopter or a plane, then this method will return true, otherwise false. --- @param #UNIT self --- @return #boolean Air category evaluation result. -function UNIT:IsAir() - self:F2() - - local UnitDescriptor = self.DCSUnit:getDesc() - self:T3( { UnitDescriptor.category, Unit.Category.AIRPLANE, Unit.Category.HELICOPTER } ) - - local IsAirResult = ( UnitDescriptor.category == Unit.Category.AIRPLANE ) or ( UnitDescriptor.category == Unit.Category.HELICOPTER ) - - self:T3( IsAirResult ) - return IsAirResult -end - ---- This module contains the ZONE classes, inherited from @{Zone#ZONE_BASE}. --- There are essentially two core functions that zones accomodate: --- --- * Test if an object is within the zone boundaries. --- * Provide the zone behaviour. Some zones are static, while others are moveable. --- --- The object classes are using the zone classes to test the zone boundaries, which can take various forms: --- --- * Test if completely within the zone. --- * Test if partly within the zone (for @{Group#GROUP} objects). --- * Test if not in the zone. --- * Distance to the nearest intersecting point of the zone. --- * Distance to the center of the zone. --- * ... --- --- Each of these ZONE classes have a zone name, and specific parameters defining the zone type: --- --- * @{Zone#ZONE_BASE}: The ZONE_BASE class defining the base for all other zone classes. --- * @{Zone#ZONE_RADIUS}: The ZONE_RADIUS class defined by a zone name, a location and a radius. --- * @{Zone#ZONE}: The ZONE class, defined by the zone name as defined within the Mission Editor. --- * @{Zone#ZONE_UNIT}: The ZONE_UNIT class defined by a zone around a @{Unit#UNIT} with a radius. --- * @{Zone#ZONE_POLYGON}: The ZONE_POLYGON class defined by a sequence of @{Group#GROUP} waypoints within the Mission Editor, forming a polygon. --- --- Each zone implements two polymorphic functions defined in @{Zone#ZONE_BASE}: --- --- * @{#ZONE_BASE.IsPointVec2InZone}: Returns if a location is within the zone. --- * @{#ZONE_BASE.IsPointVec3InZone}: Returns if a point is within the zone. --- --- === --- --- 1) @{Zone#ZONE_BASE} class, extends @{Base#BASE} --- ================================================ --- The ZONE_BASE class defining the base for all other zone classes. --- --- === --- --- 2) @{Zone#ZONE_RADIUS} class, extends @{Zone#ZONE_BASE} --- ======================================================= --- The ZONE_RADIUS class defined by a zone name, a location and a radius. --- --- === --- --- 3) @{Zone#ZONE} class, extends @{Zone#ZONE_RADIUS} --- ========================================== --- The ZONE class, defined by the zone name as defined within the Mission Editor. --- --- === --- --- 4) @{Zone#ZONE_UNIT} class, extends @{Zone#ZONE_RADIUS} --- ======================================================= --- The ZONE_UNIT class defined by a zone around a @{Unit#UNIT} with a radius. --- --- === --- --- 5) @{Zone#ZONE_POLYGON} class, extends @{Zone#ZONE_BASE} --- ======================================================== --- The ZONE_POLYGON class defined by a sequence of @{Group#GROUP} waypoints within the Mission Editor, forming a polygon. --- --- === --- --- @module Zone --- @author FlightControl - - - - - - - - - ---- The ZONE_BASE class --- @type ZONE_BASE --- @extends Base#BASE -ZONE_BASE = { - ClassName = "ZONE_BASE", - } - ---- ZONE_BASE constructor --- @param #ZONE_BASE self --- @param #string ZoneName Name of the zone. --- @return #ZONE_BASE self -function ZONE_BASE:New( ZoneName ) - local self = BASE:Inherit( self, BASE:New() ) - self:F( ZoneName ) - - self.ZoneName = ZoneName - - return self -end - ---- Returns if a location is within the zone. --- @param #ZONE_RADIUS self --- @param DCSTypes#Vec2 PointVec2 The location to test. --- @return #boolean true if the location is within the zone. -function ZONE_BASE:IsPointVec2InZone( PointVec2 ) - self:F2( PointVec2 ) - - return false -end - ---- Returns if a point is within the zone. --- @param #ZONE_RADIUS self --- @param DCSTypes#Vec3 PointVec3 The point to test. --- @return #boolean true if the point is within the zone. -function ZONE_BASE:IsPointVec3InZone( PointVec3 ) - self:F2( PointVec3 ) - - local InZone = self:IsPointVec2InZone( { x = PointVec3.x, y = PointVec3.z } ) - - return InZone -end - ---- Smokes the zone boundaries in a color. --- @param #ZONE_BASE self --- @param SmokeColor The smoke color. -function ZONE_BASE:SmokeZone( SmokeColor ) - self:F2( SmokeColor ) - -end - - ---- The ZONE_RADIUS class, defined by a zone name, a location and a radius. --- @type ZONE_RADIUS --- @field DCSTypes#Vec2 PointVec2 The current location of the zone. --- @field DCSTypes#Distance Radius The radius of the zone. --- @extends Zone#ZONE_BASE -ZONE_RADIUS = { - ClassName="ZONE_RADIUS", - } - ---- Constructor of ZONE_RADIUS, taking the zone name, the zone location and a radius. --- @param #ZONE_RADIUS self --- @param #string ZoneName Name of the zone. --- @param DCSTypes#Vec2 PointVec2 The location of the zone. --- @param DCSTypes#Distance Radius The radius of the zone. --- @return #ZONE_RADIUS self -function ZONE_RADIUS:New( ZoneName, PointVec2, Radius ) - local self = BASE:Inherit( self, ZONE_BASE:New( ZoneName ) ) - self:F( { ZoneName, PointVec2, Radius } ) - - self.Radius = Radius - self.PointVec2 = PointVec2 - - return self -end - ---- Smokes the zone boundaries in a color. --- @param #ZONE_RADIUS self --- @param #POINT_VEC3.SmokeColor SmokeColor The smoke color. --- @param #number Points (optional) The amount of points in the circle. --- @return #ZONE_RADIUS self -function ZONE_RADIUS:SmokeZone( SmokeColor, Points ) - self:F2( SmokeColor ) - - local Point = {} - local PointVec2 = self:GetPointVec2() - - Points = Points and Points or 360 - - local Angle - local RadialBase = math.pi*2 - - for Angle = 0, 360, 360 / Points do - local Radial = Angle * RadialBase / 360 - Point.x = PointVec2.x + math.cos( Radial ) * self:GetRadius() - Point.y = PointVec2.y + math.sin( Radial ) * self:GetRadius() - POINT_VEC2:New( Point.x, Point.y ):Smoke( SmokeColor ) - end - - return self -end - - ---- Flares the zone boundaries in a color. --- @param #ZONE_RADIUS self --- @param #POINT_VEC3.FlareColor FlareColor The flare color. --- @param #number Points (optional) The amount of points in the circle. --- @param DCSTypes#Azimuth Azimuth (optional) Azimuth The azimuth of the flare. --- @return #ZONE_RADIUS self -function ZONE_RADIUS:FlareZone( FlareColor, Points, Azimuth ) - self:F2( { FlareColor, Azimuth } ) - - local Point = {} - local PointVec2 = self:GetPointVec2() - - Points = Points and Points or 360 - - local Angle - local RadialBase = math.pi*2 - - for Angle = 0, 360, 360 / Points do - local Radial = Angle * RadialBase / 360 - Point.x = PointVec2.x + math.cos( Radial ) * self:GetRadius() - Point.y = PointVec2.y + math.sin( Radial ) * self:GetRadius() - POINT_VEC2:New( Point.x, Point.y ):Flare( FlareColor, Azimuth ) - end - - return self -end - ---- Returns the radius of the zone. --- @param #ZONE_RADIUS self --- @return DCSTypes#Distance The radius of the zone. -function ZONE_RADIUS:GetRadius() - self:F2( self.ZoneName ) - - self:T2( { self.Radius } ) - - return self.Radius -end - ---- Sets the radius of the zone. --- @param #ZONE_RADIUS self --- @param DCSTypes#Distance Radius The radius of the zone. --- @return DCSTypes#Distance The radius of the zone. -function ZONE_RADIUS:SetRadius( Radius ) - self:F2( self.ZoneName ) - - self.Radius = Radius - self:T2( { self.Radius } ) - - return self.Radius -end - ---- Returns the location of the zone. --- @param #ZONE_RADIUS self --- @return DCSTypes#Vec2 The location of the zone. -function ZONE_RADIUS:GetPointVec2() - self:F2( self.ZoneName ) - - self:T2( { self.PointVec2 } ) - - return self.PointVec2 -end - ---- Sets the location of the zone. --- @param #ZONE_RADIUS self --- @param DCSTypes#Vec2 PointVec2 The new location of the zone. --- @return DCSTypes#Vec2 The new location of the zone. -function ZONE_RADIUS:SetPointVec2( PointVec2 ) - self:F2( self.ZoneName ) - - self.PointVec2 = PointVec2 - - self:T2( { self.PointVec2 } ) - - return self.PointVec2 -end - ---- Returns the point of the zone. --- @param #ZONE_RADIUS self --- @param DCSTypes#Distance Height The height to add to the land height where the center of the zone is located. --- @return DCSTypes#Vec3 The point of the zone. -function ZONE_RADIUS:GetPointVec3( Height ) - self:F2( self.ZoneName ) - - local PointVec2 = self:GetPointVec2() - - local PointVec3 = { x = PointVec2.x, y = land.getHeight( self:GetPointVec2() ) + Height, z = PointVec2.y } - - self:T2( { PointVec3 } ) - - return PointVec3 -end - - ---- Returns if a location is within the zone. --- @param #ZONE_RADIUS self --- @param DCSTypes#Vec2 PointVec2 The location to test. --- @return #boolean true if the location is within the zone. -function ZONE_RADIUS:IsPointVec2InZone( PointVec2 ) - self:F2( PointVec2 ) - - local ZonePointVec2 = self:GetPointVec2() - - if (( PointVec2.x - ZonePointVec2.x )^2 + ( PointVec2.y - ZonePointVec2.y ) ^2 ) ^ 0.5 <= self:GetRadius() then - return true - end - - return false -end - ---- Returns if a point is within the zone. --- @param #ZONE_RADIUS self --- @param DCSTypes#Vec3 PointVec3 The point to test. --- @return #boolean true if the point is within the zone. -function ZONE_RADIUS:IsPointVec3InZone( PointVec3 ) - self:F2( PointVec3 ) - - local InZone = self:IsPointVec2InZone( { x = PointVec3.x, y = PointVec3.z } ) - - return InZone -end - ---- Returns a random location within the zone. --- @param #ZONE_RADIUS self --- @return DCSTypes#Vec2 The random location within the zone. -function ZONE_RADIUS:GetRandomPointVec2() - self:F( self.ZoneName ) - - local Point = {} - local PointVec2 = self:GetPointVec2() - - local angle = math.random() * math.pi*2; - Point.x = PointVec2.x + math.cos( angle ) * math.random() * self:GetRadius(); - Point.y = PointVec2.y + math.sin( angle ) * math.random() * self:GetRadius(); - - self:T( { Point } ) - - return Point -end - - - ---- The ZONE class, defined by the zone name as defined within the Mission Editor. The location and the radius are automatically collected from the mission settings. --- @type ZONE --- @extends Zone#ZONE_RADIUS -ZONE = { - ClassName="ZONE", - } - - ---- Constructor of ZONE, taking the zone name. --- @param #ZONE self --- @param #string ZoneName The name of the zone as defined within the mission editor. --- @return #ZONE -function ZONE:New( ZoneName ) - - local Zone = trigger.misc.getZone( ZoneName ) - - if not Zone then - error( "Zone " .. ZoneName .. " does not exist." ) - return nil - end - - local self = BASE:Inherit( self, ZONE_RADIUS:New( ZoneName, { x = Zone.point.x, y = Zone.point.z }, Zone.radius ) ) - self:F( ZoneName ) - - self.Zone = Zone - - return self -end - - ---- The ZONE_UNIT class defined by a zone around a @{Unit#UNIT} with a radius. --- @type ZONE_UNIT --- @field Unit#UNIT ZoneUNIT --- @extends Zone#ZONE_RADIUS -ZONE_UNIT = { - ClassName="ZONE_UNIT", - } - ---- Constructor to create a ZONE_UNIT instance, taking the zone name, a zone unit and a radius. --- @param #ZONE_UNIT self --- @param #string ZoneName Name of the zone. --- @param Unit#UNIT ZoneUNIT The unit as the center of the zone. --- @param DCSTypes#Distance Radius The radius of the zone. --- @return #ZONE_UNIT self -function ZONE_UNIT:New( ZoneName, ZoneUNIT, Radius ) - local self = BASE:Inherit( self, ZONE_RADIUS:New( ZoneName, ZoneUNIT:GetPointVec2(), Radius ) ) - self:F( { ZoneName, ZoneUNIT:GetPointVec2(), Radius } ) - - self.ZoneUNIT = ZoneUNIT - - return self -end - - ---- Returns the current location of the @{Unit#UNIT}. --- @param #ZONE_UNIT self --- @return DCSTypes#Vec2 The location of the zone based on the @{Unit#UNIT}location. -function ZONE_UNIT:GetPointVec2() - self:F( self.ZoneName ) - - local ZonePointVec2 = self.ZoneUNIT:GetPointVec2() - - self:T( { ZonePointVec2 } ) - - return ZonePointVec2 -end - - ---- The ZONE_POLYGON class defined by a sequence of @{Group#GROUP} waypoints within the Mission Editor, forming a polygon. --- @type ZONE_POLYGON --- @extends Zone#ZONE_BASE -ZONE_POLYGON = { - ClassName="ZONE_POLYGON", - } - ---- Constructor to create a ZONE_POLYGON instance, taking the zone name and the name of the @{Group#GROUP} defined within the Mission Editor. --- The @{Group#GROUP} waypoints define the polygon corners. The first and the last point are automatically connected by ZONE_POLYGON. --- @param #ZONE_POLYGON self --- @param #string ZoneName Name of the zone. --- @param Group#GROUP ZoneGroup The GROUP waypoints as defined within the Mission Editor define the polygon shape. --- @return #ZONE_POLYGON self -function ZONE_POLYGON:New( ZoneName, ZoneGroup ) - local self = BASE:Inherit( self, ZONE_BASE:New( ZoneName ) ) - self:F( { ZoneName, ZoneGroup } ) - - local GroupPoints = ZoneGroup:GetTaskRoute() - local i = 0 - - self.Polygon = {} - - for i = 1, #GroupPoints do - self.Polygon[i] = {} - self.Polygon[i].x = GroupPoints[i].x - self.Polygon[i].y = GroupPoints[i].y - end - - return self -end - ---- Smokes the zone boundaries in a color. --- @param #ZONE_POLYGON self --- @param #POINT_VEC3.SmokeColor SmokeColor The smoke color. --- @return #ZONE_POLYGON self -function ZONE_POLYGON:SmokeZone( SmokeColor ) - self:F2( SmokeColor ) - - local i - local j - local Segments = 10 - - i = 1 - j = #self.Polygon - - while i <= #self.Polygon do - self:T( { i, j, self.Polygon[i], self.Polygon[j] } ) - - local DeltaX = self.Polygon[j].x - self.Polygon[i].x - local DeltaY = self.Polygon[j].y - self.Polygon[i].y - - for Segment = 0, Segments do -- We divide each line in 5 segments and smoke a point on the line. - local PointX = self.Polygon[i].x + ( Segment * DeltaX / Segments ) - local PointY = self.Polygon[i].y + ( Segment * DeltaY / Segments ) - POINT_VEC2:New( PointX, PointY ):Smoke( SmokeColor ) - end - j = i - i = i + 1 - end - - return self -end - - - - ---- Returns if a location is within the zone. --- @param #ZONE_POLYGON self --- @param DCSTypes#Vec2 PointVec2 The location to test. --- @return #boolean true if the location is within the zone. -function ZONE_POLYGON:IsPointVec2InZone( PointVec2 ) - self:F2( PointVec2 ) - - local i - local j - local c = false - - i = 1 - j = #self.Polygon - - while i < #self.Polygon do - j = i - i = i + 1 - self:T( { i, j, self.Polygon[i], self.Polygon[j] } ) - if ( ( ( self.Polygon[i].y > PointVec2.y ) ~= ( self.Polygon[j].y > PointVec2.y ) ) and - ( PointVec2.x < ( self.Polygon[j].x - self.Polygon[i].x ) * ( PointVec2.y - self.Polygon[i].y ) / ( self.Polygon[j].y - self.Polygon[i].y ) + self.Polygon[i].x ) - ) then - c = not c - end - self:T2( { "c = ", c } ) - end - - self:T( { "c = ", c } ) - return c -end - ---- This module contains the CLIENT class. --- --- 1) @{Client#CLIENT} class, extends @{Unit#UNIT} --- =============================================== --- Clients are those **Units** defined within the Mission Editor that have the skillset defined as __Client__ or __Player__. --- Note that clients are NOT the same as Units, they are NOT necessarily alive. --- The @{Client#CLIENT} class is a wrapper class to handle the DCS Unit objects that have the skillset defined as __Client__ or __Player__: --- --- * Wraps the DCS Unit objects with skill level set to Player or Client. --- * Support all DCS Unit APIs. --- * Enhance with Unit specific APIs not in the DCS Group API set. --- * When player joins Unit, execute alive init logic. --- * Handles messages to players. --- * Manage the "state" of the DCS Unit. --- --- Clients are being used by the @{MISSION} class to follow players and register their successes. --- --- 1.1) CLIENT reference methods --- ----------------------------- --- For each DCS Unit having skill level Player or Client, a CLIENT wrapper object (instance) will be created within the _@{DATABASE} object. --- This is done at the beginning of the mission (when the mission starts). --- --- The CLIENT class does not contain a :New() method, rather it provides :Find() methods to retrieve the object reference --- using the DCS Unit or the DCS UnitName. --- --- Another thing to know is that CLIENT objects do not "contain" the DCS Unit object. --- The CLIENT methods will reference the DCS Unit object by name when it is needed during API execution. --- If the DCS Unit object does not exist or is nil, the CLIENT methods will return nil and log an exception in the DCS.log file. --- --- The CLIENT class provides the following functions to retrieve quickly the relevant CLIENT instance: --- --- * @{#CLIENT.Find}(): Find a CLIENT instance from the _DATABASE object using a DCS Unit object. --- * @{#CLIENT.FindByName}(): Find a CLIENT instance from the _DATABASE object using a DCS Unit name. --- --- IMPORTANT: ONE SHOULD NEVER SANATIZE these CLIENT OBJECT REFERENCES! (make the CLIENT object references nil). --- --- @module Client --- @author FlightControl - - - - - - - ---- The CLIENT class --- @type CLIENT --- @extends Unit#UNIT -CLIENT = { - ONBOARDSIDE = { - NONE = 0, - LEFT = 1, - RIGHT = 2, - BACK = 3, - FRONT = 4 - }, - ClassName = "CLIENT", - ClientName = nil, - ClientAlive = false, - ClientTransport = false, - ClientBriefingShown = false, - _Menus = {}, - _Tasks = {}, - Messages = { - } -} - - ---- Finds a CLIENT from the _DATABASE using the relevant DCS Unit. --- @param #CLIENT self --- @param #string ClientName Name of the DCS **Unit** as defined within the Mission Editor. --- @param #string ClientBriefing Text that describes the briefing of the mission when a Player logs into the Client. --- @return #CLIENT --- @usage --- -- Create new Clients. --- local Mission = MISSIONSCHEDULER.AddMission( 'Russia Transport Troops SA-6', 'Operational', 'Transport troops from the control center to one of the SA-6 SAM sites to activate their operation.', 'Russia' ) --- Mission:AddGoal( DeploySA6TroopsGoal ) --- --- Mission:AddClient( CLIENT:FindByName( 'RU MI-8MTV2*HOT-Deploy Troops 1' ):Transport() ) --- Mission:AddClient( CLIENT:FindByName( 'RU MI-8MTV2*RAMP-Deploy Troops 3' ):Transport() ) --- Mission:AddClient( CLIENT:FindByName( 'RU MI-8MTV2*HOT-Deploy Troops 2' ):Transport() ) --- Mission:AddClient( CLIENT:FindByName( 'RU MI-8MTV2*RAMP-Deploy Troops 4' ):Transport() ) -function CLIENT:Find( DCSUnit ) - local ClientName = DCSUnit:getName() - local ClientFound = _DATABASE:FindClient( ClientName ) - - if ClientFound then - ClientFound:F( ClientName ) - return ClientFound - end - - error( "CLIENT not found for: " .. ClientName ) -end - - ---- Finds a CLIENT from the _DATABASE using the relevant Client Unit Name. --- As an optional parameter, a briefing text can be given also. --- @param #CLIENT self --- @param #string ClientName Name of the DCS **Unit** as defined within the Mission Editor. --- @param #string ClientBriefing Text that describes the briefing of the mission when a Player logs into the Client. --- @return #CLIENT --- @usage --- -- Create new Clients. --- local Mission = MISSIONSCHEDULER.AddMission( 'Russia Transport Troops SA-6', 'Operational', 'Transport troops from the control center to one of the SA-6 SAM sites to activate their operation.', 'Russia' ) --- Mission:AddGoal( DeploySA6TroopsGoal ) --- --- Mission:AddClient( CLIENT:FindByName( 'RU MI-8MTV2*HOT-Deploy Troops 1' ):Transport() ) --- Mission:AddClient( CLIENT:FindByName( 'RU MI-8MTV2*RAMP-Deploy Troops 3' ):Transport() ) --- Mission:AddClient( CLIENT:FindByName( 'RU MI-8MTV2*HOT-Deploy Troops 2' ):Transport() ) --- Mission:AddClient( CLIENT:FindByName( 'RU MI-8MTV2*RAMP-Deploy Troops 4' ):Transport() ) -function CLIENT:FindByName( ClientName, ClientBriefing ) - local ClientFound = _DATABASE:FindClient( ClientName ) - - if ClientFound then - ClientFound:F( { ClientName, ClientBriefing } ) - ClientFound:AddBriefing( ClientBriefing ) - ClientFound.MessageSwitch = true - - return ClientFound - end - - error( "CLIENT not found for: " .. ClientName ) -end - -function CLIENT:Register( ClientName ) - local self = BASE:Inherit( self, UNIT:Register( ClientName ) ) - - self:F( ClientName ) - self.ClientName = ClientName - self.MessageSwitch = true - self.ClientAlive2 = false - - --self.AliveCheckScheduler = routines.scheduleFunction( self._AliveCheckScheduler, { self }, timer.getTime() + 1, 5 ) - self.AliveCheckScheduler = SCHEDULER:New( self, self._AliveCheckScheduler, {}, 1, 5 ) - - return self -end - - ---- Transport defines that the Client is a Transport. Transports show cargo. --- @param #CLIENT self --- @return #CLIENT -function CLIENT:Transport() - self:F() - - self.ClientTransport = true - return self -end - ---- AddBriefing adds a briefing to a CLIENT when a player joins a mission. --- @param #CLIENT self --- @param #string ClientBriefing is the text defining the Mission briefing. --- @return #CLIENT self -function CLIENT:AddBriefing( ClientBriefing ) - self:F( ClientBriefing ) - self.ClientBriefing = ClientBriefing - self.ClientBriefingShown = false - - return self -end - ---- Show the briefing of a CLIENT. --- @param #CLIENT self --- @return #CLIENT self -function CLIENT:ShowBriefing() - self:F( { self.ClientName, self.ClientBriefingShown } ) - - if not self.ClientBriefingShown then - self.ClientBriefingShown = true - local Briefing = "" - if self.ClientBriefing then - Briefing = Briefing .. self.ClientBriefing - end - Briefing = Briefing .. " Press [LEFT ALT]+[B] to view the complete mission briefing." - self:Message( Briefing, 60, self.ClientName .. '/ClientBriefing', "Briefing" ) - end - - return self -end - ---- Show the mission briefing of a MISSION to the CLIENT. --- @param #CLIENT self --- @param #string MissionBriefing --- @return #CLIENT self -function CLIENT:ShowMissionBriefing( MissionBriefing ) - self:F( { self.ClientName } ) - - if MissionBriefing then - self:Message( MissionBriefing, 60, self.ClientName .. '/MissionBriefing', "Mission Briefing" ) - end - - return self -end - - - ---- Resets a CLIENT. --- @param #CLIENT self --- @param #string ClientName Name of the Group as defined within the Mission Editor. The Group must have a Unit with the type Client. -function CLIENT:Reset( ClientName ) - self:F() - self._Menus = {} -end - --- Is Functions - ---- Checks if the CLIENT is a multi-seated UNIT. --- @param #CLIENT self --- @return #boolean true if multi-seated. -function CLIENT:IsMultiSeated() - self:F( self.ClientName ) - - local ClientMultiSeatedTypes = { - ["Mi-8MT"] = "Mi-8MT", - ["UH-1H"] = "UH-1H", - ["P-51B"] = "P-51B" - } - - if self:IsAlive() then - local ClientTypeName = self:GetClientGroupUnit():GetTypeName() - if ClientMultiSeatedTypes[ClientTypeName] then - return true - end - end - - return false -end - ---- Checks for a client alive event and calls a function on a continuous basis. --- @param #CLIENT self --- @param #function CallBack Function. --- @return #CLIENT -function CLIENT:Alive( CallBack, ... ) - self:F() - - self.ClientCallBack = CallBack - self.ClientParameters = arg - - return self -end - ---- @param #CLIENT self -function CLIENT:_AliveCheckScheduler() - self:F( { self.ClientName, self.ClientAlive2, self.ClientBriefingShown } ) - - if self:IsAlive() then -- Polymorphic call of UNIT - if self.ClientAlive2 == false then - self:ShowBriefing() - if self.ClientCallBack then - self:T("Calling Callback function") - self.ClientCallBack( self, unpack( self.ClientParameters ) ) - end - self.ClientAlive2 = true - end - else - if self.ClientAlive2 == true then - self.ClientAlive2 = false - end - end - - return true -end - ---- Return the DCSGroup of a Client. --- This function is modified to deal with a couple of bugs in DCS 1.5.3 --- @param #CLIENT self --- @return DCSGroup#Group -function CLIENT:GetDCSGroup() - self:F3() - --- local ClientData = Group.getByName( self.ClientName ) --- if ClientData and ClientData:isExist() then --- self:T( self.ClientName .. " : group found!" ) --- return ClientData --- else --- return nil --- end - - local ClientUnit = Unit.getByName( self.ClientName ) - - local CoalitionsData = { AlivePlayersRed = coalition.getPlayers( coalition.side.RED ), AlivePlayersBlue = coalition.getPlayers( coalition.side.BLUE ) } - for CoalitionId, CoalitionData in pairs( CoalitionsData ) do - self:T3( { "CoalitionData:", CoalitionData } ) - for UnitId, UnitData in pairs( CoalitionData ) do - self:T3( { "UnitData:", UnitData } ) - if UnitData and UnitData:isExist() then - - --self:E(self.ClientName) - if ClientUnit then - local ClientGroup = ClientUnit:getGroup() - if ClientGroup then - self:T3( "ClientGroup = " .. self.ClientName ) - if ClientGroup:isExist() and UnitData:getGroup():isExist() then - if ClientGroup:getID() == UnitData:getGroup():getID() then - self:T3( "Normal logic" ) - self:T3( self.ClientName .. " : group found!" ) - self.ClientGroupID = ClientGroup:getID() - self.ClientGroupName = ClientGroup:getName() - return ClientGroup - end - else - -- Now we need to resolve the bugs in DCS 1.5 ... - -- Consult the database for the units of the Client Group. (ClientGroup:getUnits() returns nil) - self:T3( "Bug 1.5 logic" ) - local ClientGroupTemplate = _DATABASE.Templates.Units[self.ClientName].GroupTemplate - self.ClientGroupID = ClientGroupTemplate.groupId - self.ClientGroupName = _DATABASE.Templates.Units[self.ClientName].GroupName - self:T3( self.ClientName .. " : group found in bug 1.5 resolvement logic!" ) - return ClientGroup - end - -- else - -- error( "Client " .. self.ClientName .. " not found!" ) - end - else - --self:E( { "Client not found!", self.ClientName } ) - end - end - end - end - - -- For non player clients - if ClientUnit then - local ClientGroup = ClientUnit:getGroup() - if ClientGroup then - self:T3( "ClientGroup = " .. self.ClientName ) - if ClientGroup:isExist() then - self:T3( "Normal logic" ) - self:T3( self.ClientName .. " : group found!" ) - return ClientGroup - end - end - end - - self.ClientGroupID = nil - self.ClientGroupUnit = nil - - return nil -end - - --- TODO: Check DCSTypes#Group.ID ---- Get the group ID of the client. --- @param #CLIENT self --- @return DCSTypes#Group.ID -function CLIENT:GetClientGroupID() - - local ClientGroup = self:GetDCSGroup() - - --self:E( self.ClientGroupID ) -- Determined in GetDCSGroup() - return self.ClientGroupID -end - - ---- Get the name of the group of the client. --- @param #CLIENT self --- @return #string -function CLIENT:GetClientGroupName() - - local ClientGroup = self:GetDCSGroup() - - self:T( self.ClientGroupName ) -- Determined in GetDCSGroup() - return self.ClientGroupName -end - ---- Returns the UNIT of the CLIENT. --- @param #CLIENT self --- @return Unit#UNIT -function CLIENT:GetClientGroupUnit() - self:F2() - - local ClientDCSUnit = Unit.getByName( self.ClientName ) - - self:T( self.ClientDCSUnit ) - if ClientDCSUnit and ClientDCSUnit:isExist() then - local ClientUnit = _DATABASE:FindUnit( self.ClientName ) - self:T2( ClientUnit ) - return ClientUnit - end -end - ---- Returns the DCSUnit of the CLIENT. --- @param #CLIENT self --- @return DCSTypes#Unit -function CLIENT:GetClientGroupDCSUnit() - self:F2() - - local ClientDCSUnit = Unit.getByName( self.ClientName ) - - if ClientDCSUnit and ClientDCSUnit:isExist() then - self:T2( ClientDCSUnit ) - return ClientDCSUnit - end -end - - ---- Evaluates if the CLIENT is a transport. --- @param #CLIENT self --- @return #boolean true is a transport. -function CLIENT:IsTransport() - self:F() - return self.ClientTransport -end - ---- Shows the @{Cargo#CARGO} contained within the CLIENT to the player as a message. --- The @{Cargo#CARGO} is shown using the @{Message#MESSAGE} distribution system. --- @param #CLIENT self -function CLIENT:ShowCargo() - self:F() - - local CargoMsg = "" - - for CargoName, Cargo in pairs( CARGOS ) do - if self == Cargo:IsLoadedInClient() then - CargoMsg = CargoMsg .. Cargo.CargoName .. " Type:" .. Cargo.CargoType .. " Weight: " .. Cargo.CargoWeight .. "\n" - end - end - - if CargoMsg == "" then - CargoMsg = "empty" - end - - self:Message( CargoMsg, 15, self.ClientName .. "/Cargo", "Co-Pilot: Cargo Status", 30 ) - -end - --- TODO (1) I urgently need to revise this. ---- A local function called by the DCS World Menu system to switch off messages. -function CLIENT.SwitchMessages( PrmTable ) - PrmTable[1].MessageSwitch = PrmTable[2] -end - ---- The main message driver for the CLIENT. --- This function displays various messages to the Player logged into the CLIENT through the DCS World Messaging system. --- @param #CLIENT self --- @param #string Message is the text describing the message. --- @param #number MessageDuration is the duration in seconds that the Message should be displayed. --- @param #string MessageId is a text identifying the Message in the MessageQueue. The Message system overwrites Messages with the same MessageId --- @param #string MessageCategory is the category of the message (the title). --- @param #number MessageInterval is the interval in seconds between the display of the @{Message#MESSAGE} when the CLIENT is in the air. -function CLIENT:Message( Message, MessageDuration, MessageId, MessageCategory, MessageInterval ) - self:F( { Message, MessageDuration, MessageId, MessageCategory, MessageInterval } ) - - if not self.MenuMessages then - if self:GetClientGroupID() then - self.MenuMessages = MENU_CLIENT:New( self, 'Messages' ) - self.MenuRouteMessageOn = MENU_CLIENT_COMMAND:New( self, 'Messages On', self.MenuMessages, CLIENT.SwitchMessages, { self, true } ) - self.MenuRouteMessageOff = MENU_CLIENT_COMMAND:New( self,'Messages Off', self.MenuMessages, CLIENT.SwitchMessages, { self, false } ) - end - end - - if self.MessageSwitch == true then - if MessageCategory == nil then - MessageCategory = "Messages" - end - if self.Messages[MessageId] == nil then - self.Messages[MessageId] = {} - self.Messages[MessageId].MessageId = MessageId - self.Messages[MessageId].MessageTime = timer.getTime() - self.Messages[MessageId].MessageDuration = MessageDuration - if MessageInterval == nil then - self.Messages[MessageId].MessageInterval = 600 - else - self.Messages[MessageId].MessageInterval = MessageInterval - end - MESSAGE:New( Message, MessageDuration, MessageCategory ):ToClient( self ) - else - if self:GetClientGroupDCSUnit() and not self:GetClientGroupDCSUnit():inAir() then - if timer.getTime() - self.Messages[MessageId].MessageTime >= self.Messages[MessageId].MessageDuration + 10 then - MESSAGE:New( Message, MessageDuration , MessageCategory):ToClient( self ) - self.Messages[MessageId].MessageTime = timer.getTime() - end - else - if timer.getTime() - self.Messages[MessageId].MessageTime >= self.Messages[MessageId].MessageDuration + self.Messages[MessageId].MessageInterval then - MESSAGE:New( Message, MessageDuration, MessageCategory ):ToClient( self ) - self.Messages[MessageId].MessageTime = timer.getTime() - end - end - end - end -end ---- This module contains the STATIC class. --- --- 1) @{Static#STATIC} class, extends @{Unit#UNIT} --- =============================================== --- Statics are **Static Units** defined within the Mission Editor. --- Note that Statics are almost the same as Units, but they don't have a controller. --- The @{Static#STATIC} class is a wrapper class to handle the DCS Static objects: --- --- * Wraps the DCS Static objects. --- * Support all DCS Static APIs. --- * Enhance with Static specific APIs not in the DCS API set. --- --- 1.1) STATIC reference methods --- ----------------------------- --- For each DCS Static will have a STATIC wrapper object (instance) within the _@{DATABASE} object. --- This is done at the beginning of the mission (when the mission starts). --- --- The STATIC class does not contain a :New() method, rather it provides :Find() methods to retrieve the object reference --- using the Static Name. --- --- Another thing to know is that STATIC objects do not "contain" the DCS Static object. --- The STATIc methods will reference the DCS Static object by name when it is needed during API execution. --- If the DCS Static object does not exist or is nil, the STATIC methods will return nil and log an exception in the DCS.log file. --- --- The STATIc class provides the following functions to retrieve quickly the relevant STATIC instance: --- --- * @{#STATIC.FindByName}(): Find a STATIC instance from the _DATABASE object using a DCS Static name. --- --- IMPORTANT: ONE SHOULD NEVER SANATIZE these STATIC OBJECT REFERENCES! (make the STATIC object references nil). --- --- @module Static --- @author FlightControl - - - - - - ---- The STATIC class --- @type STATIC --- @extends Unit#UNIT -STATIC = { - ClassName = "STATIC", -} - - ---- Finds a STATIC from the _DATABASE using the relevant Static Name. --- As an optional parameter, a briefing text can be given also. --- @param #STATIC self --- @param #string StaticName Name of the DCS **Static** as defined within the Mission Editor. --- @return #STATIC -function STATIC:FindByName( StaticName ) - local StaticFound = _DATABASE:FindStatic( StaticName ) - - if StaticFound then - StaticFound:F( { StaticName } ) - - return StaticFound - end - - error( "STATIC not found for: " .. StaticName ) -end - -function STATIC:Register( StaticName ) - local self = BASE:Inherit( self, UNIT:Register( StaticName ) ) - - self:F( StaticName ) - - return self -end - - -function STATIC:GetDCSUnit() - local DCSStatic = StaticObject.getByName( self.UnitName ) - - if DCSStatic then - return DCSStatic - end - - return nil -end ---- Manage the mission database. --- --- @{#DATABASE} class --- ================== --- Mission designers can use the DATABASE class to refer to: --- --- * UNITS --- * GROUPS --- * players --- * alive players --- * CLIENTS --- * alive CLIENTS --- --- On top, for internal MOOSE administration purposes, the DATBASE administers the Unit and Gruop templates as defined within the Mission Editor. --- --- Moose will automatically create one instance of the DATABASE class into the **global** object _DATABASE. --- Moose refers to _DATABASE within the framework extensively, but you can also refer to the _DATABASE object within your missions if required. --- --- DATABASE iterators: --- =================== --- You can iterate the database with the available iterator methods. --- The iterator methods will walk the DATABASE set, and call for each element within the set a function that you provide. --- The following iterator methods are currently available within the DATABASE: --- --- * @{#DATABASE.ForEachUnit}: Calls a function for each @{UNIT} it finds within the DATABASE. --- * @{#DATABASE.ForEachGroup}: Calls a function for each @{GROUP} it finds within the DATABASE. --- * @{#DATABASE.ForEachPlayer}: Calls a function for each player it finds within the DATABASE. --- * @{#DATABASE.ForEachPlayerAlive}: Calls a function for each alive player it finds within the DATABASE. --- * @{#DATABASE.ForEachClient}: Calls a function for each @{CLIENT} it finds within the DATABASE. --- * @{#DATABASE.ForEachClientAlive}: Calls a function for each alive @{CLIENT} it finds within the DATABASE. --- --- @module Database --- @author FlightControl - - - - - - - - - - - - ---- DATABASE class --- @type DATABASE --- @extends Base#BASE -DATABASE = { - ClassName = "DATABASE", - Templates = { - Units = {}, - Groups = {}, - ClientsByName = {}, - ClientsByID = {}, - }, - DCSUnits = {}, - DCSGroups = {}, - DCSStatics = {}, - UNITS = {}, - STATICS = {}, - GROUPS = {}, - PLAYERS = {}, - PLAYERSALIVE = {}, - CLIENTS = {}, - CLIENTSALIVE = {}, - NavPoints = {}, -} - -local _DATABASECoalition = - { - [1] = "Red", - [2] = "Blue", - } - -local _DATABASECategory = - { - [Unit.Category.AIRPLANE] = "Plane", - [Unit.Category.HELICOPTER] = "Helicopter", - [Unit.Category.GROUND_UNIT] = "Vehicle", - [Unit.Category.SHIP] = "Ship", - [Unit.Category.STRUCTURE] = "Structure", - } - - ---- Creates a new DATABASE object, building a set of units belonging to a coalitions, categories, countries, types or with defined prefix names. --- @param #DATABASE self --- @return #DATABASE --- @usage --- -- Define a new DATABASE Object. This DBObject will contain a reference to all Group and Unit Templates defined within the ME and the DCSRTE. --- DBObject = DATABASE:New() -function DATABASE:New() - - -- Inherits from BASE - local self = BASE:Inherit( self, BASE:New() ) - - _EVENTDISPATCHER:OnBirth( self._EventOnBirth, self ) - _EVENTDISPATCHER:OnDead( self._EventOnDeadOrCrash, self ) - _EVENTDISPATCHER:OnCrash( self._EventOnDeadOrCrash, self ) - - - -- Follow alive players and clients - _EVENTDISPATCHER:OnPlayerEnterUnit( self._EventOnPlayerEnterUnit, self ) - _EVENTDISPATCHER:OnPlayerLeaveUnit( self._EventOnPlayerLeaveUnit, self ) - - self:_RegisterTemplates() - self:_RegisterGroupsAndUnits() - self:_RegisterClients() - self:_RegisterStatics() - self:_RegisterPlayers() - - return self -end - ---- Finds a Unit based on the Unit Name. --- @param #DATABASE self --- @param #string UnitName --- @return Unit#UNIT The found Unit. -function DATABASE:FindUnit( UnitName ) - - local UnitFound = self.UNITS[UnitName] - return UnitFound -end - - ---- Adds a Unit based on the Unit Name in the DATABASE. --- @param #DATABASE self -function DATABASE:AddUnit( DCSUnit, DCSUnitName ) - - self.DCSUnits[DCSUnitName] = DCSUnit - self.UNITS[DCSUnitName] = UNIT:Register( DCSUnitName ) -end - - ---- Deletes a Unit from the DATABASE based on the Unit Name. --- @param #DATABASE self -function DATABASE:DeleteUnit( DCSUnitName ) - - self.DCSUnits[DCSUnitName] = nil -end - ---- Adds a Static based on the Static Name in the DATABASE. --- @param #DATABASE self -function DATABASE:AddStatic( DCSStatic, DCSStaticName ) - - self.DCSStatics[DCSStaticName] = DCSStatic - self.STATICS[DCSStaticName] = STATIC:Register( DCSStaticName ) -end - - ---- Deletes a Static from the DATABASE based on the Static Name. --- @param #DATABASE self -function DATABASE:DeleteStatic( DCSStaticName ) - - self.DCSStatics[DCSStaticName] = nil -end - ---- Finds a STATIC based on the StaticName. --- @param #DATABASE self --- @param #string StaticName --- @return Static#STATIC The found STATIC. -function DATABASE:FindStatic( StaticName ) - - local StaticFound = self.STATICS[StaticName] - return StaticFound -end - - ---- Finds a CLIENT based on the ClientName. --- @param #DATABASE self --- @param #string ClientName --- @return Client#CLIENT The found CLIENT. -function DATABASE:FindClient( ClientName ) - - local ClientFound = self.CLIENTS[ClientName] - return ClientFound -end - - ---- Adds a CLIENT based on the ClientName in the DATABASE. --- @param #DATABASE self -function DATABASE:AddClient( ClientName ) - - self.CLIENTS[ClientName] = CLIENT:Register( ClientName ) - self:E( self.CLIENTS[ClientName]:GetClassNameAndID() ) -end - - ---- Finds a GROUP based on the GroupName. --- @param #DATABASE self --- @param #string GroupName --- @return Group#GROUP The found GROUP. -function DATABASE:FindGroup( GroupName ) - - local GroupFound = self.GROUPS[GroupName] - return GroupFound -end - - ---- Adds a GROUP based on the GroupName in the DATABASE. --- @param #DATABASE self -function DATABASE:AddGroup( DCSGroup, GroupName ) - - self.DCSGroups[GroupName] = DCSGroup - self.GROUPS[GroupName] = GROUP:Register( GroupName ) -end - ---- Adds a player based on the Player Name in the DATABASE. --- @param #DATABASE self -function DATABASE:AddPlayer( UnitName, PlayerName ) - - if PlayerName then - self:E( { "Add player for unit:", UnitName, PlayerName } ) - self.PLAYERS[PlayerName] = PlayerName - self.PLAYERSALIVE[PlayerName] = PlayerName - self.CLIENTSALIVE[PlayerName] = self:FindClient( UnitName ) - end -end - ---- Deletes a player from the DATABASE based on the Player Name. --- @param #DATABASE self -function DATABASE:DeletePlayer( PlayerName ) - - if PlayerName then - self:E( { "Clean player:", PlayerName } ) - self.PLAYERSALIVE[PlayerName] = nil - self.CLIENTSALIVE[PlayerName] = nil - end -end - - ---- Instantiate new Groups within the DCSRTE. --- This method expects EXACTLY the same structure as a structure within the ME, and needs 2 additional fields defined: --- SpawnCountryID, SpawnCategoryID --- This method is used by the SPAWN class. --- @param #DATABASE self --- @param #table SpawnTemplate --- @return #DATABASE self -function DATABASE:Spawn( SpawnTemplate ) - self:F2( SpawnTemplate.name ) - - self:T2( { SpawnTemplate.SpawnCountryID, SpawnTemplate.SpawnCategoryID } ) - - -- Copy the spawn variables of the template in temporary storage, nullify, and restore the spawn variables. - local SpawnCoalitionID = SpawnTemplate.SpawnCoalitionID - local SpawnCountryID = SpawnTemplate.SpawnCountryID - local SpawnCategoryID = SpawnTemplate.SpawnCategoryID - - -- Nullify - SpawnTemplate.SpawnCoalitionID = nil - SpawnTemplate.SpawnCountryID = nil - SpawnTemplate.SpawnCategoryID = nil - - self:_RegisterTemplate( SpawnTemplate ) - - self:T3( SpawnTemplate ) - coalition.addGroup( SpawnCountryID, SpawnCategoryID, SpawnTemplate ) - - -- Restore - SpawnTemplate.SpawnCoalitionID = SpawnCoalitionID - SpawnTemplate.SpawnCountryID = SpawnCountryID - SpawnTemplate.SpawnCategoryID = SpawnCategoryID - - local SpawnGroup = GROUP:Register( SpawnTemplate.name ) - return SpawnGroup -end - ---- Set a status to a Group within the Database, this to check crossing events for example. -function DATABASE:SetStatusGroup( GroupName, Status ) - self:F2( Status ) - - self.Templates.Groups[GroupName].Status = Status -end - ---- Get a status to a Group within the Database, this to check crossing events for example. -function DATABASE:GetStatusGroup( GroupName ) - self:F2( Status ) - - if self.Templates.Groups[GroupName] then - return self.Templates.Groups[GroupName].Status - else - return "" - end -end - - ---- Private method that registers new Group Templates within the DATABASE Object. --- @param #DATABASE self --- @param #table GroupTemplate --- @return #DATABASE self -function DATABASE:_RegisterTemplate( GroupTemplate, CoalitionName, CategoryName, CountryName ) - - local GroupTemplateName = env.getValueDictByKey(GroupTemplate.name) - - if not self.Templates.Groups[GroupTemplateName] then - self.Templates.Groups[GroupTemplateName] = {} - self.Templates.Groups[GroupTemplateName].Status = nil - end - - -- Delete the spans from the route, it is not needed and takes memory. - if GroupTemplate.route and GroupTemplate.route.spans then - GroupTemplate.route.spans = nil - end - - self.Templates.Groups[GroupTemplateName].GroupName = GroupTemplateName - self.Templates.Groups[GroupTemplateName].Template = GroupTemplate - self.Templates.Groups[GroupTemplateName].groupId = GroupTemplate.groupId - self.Templates.Groups[GroupTemplateName].UnitCount = #GroupTemplate.units - self.Templates.Groups[GroupTemplateName].Units = GroupTemplate.units - self.Templates.Groups[GroupTemplateName].CategoryName = CategoryName - self.Templates.Groups[GroupTemplateName].CoalitionName = CoalitionName - self.Templates.Groups[GroupTemplateName].CountryName = CountryName - - self:T2( { "Group", self.Templates.Groups[GroupTemplateName].GroupName, self.Templates.Groups[GroupTemplateName].UnitCount } ) - - for unit_num, UnitTemplate in pairs( GroupTemplate.units ) do - - local UnitTemplateName = env.getValueDictByKey(UnitTemplate.name) - self.Templates.Units[UnitTemplateName] = {} - self.Templates.Units[UnitTemplateName].UnitName = UnitTemplateName - self.Templates.Units[UnitTemplateName].Template = UnitTemplate - self.Templates.Units[UnitTemplateName].GroupName = GroupTemplateName - self.Templates.Units[UnitTemplateName].GroupTemplate = GroupTemplate - self.Templates.Units[UnitTemplateName].GroupId = GroupTemplate.groupId - self.Templates.Units[UnitTemplateName].CategoryName = CategoryName - self.Templates.Units[UnitTemplateName].CoalitionName = CoalitionName - self.Templates.Units[UnitTemplateName].CountryName = CountryName - self:E( {"skill",UnitTemplate.skill}) - if UnitTemplate.skill and (UnitTemplate.skill == "Client" or UnitTemplate.skill == "Player") then - self.Templates.ClientsByName[UnitTemplateName] = UnitTemplate - self.Templates.ClientsByName[UnitTemplateName].CategoryName = CategoryName - self.Templates.ClientsByName[UnitTemplateName].CoalitionName = CoalitionName - self.Templates.ClientsByName[UnitTemplateName].CountryName = CountryName - self.Templates.ClientsByID[UnitTemplate.unitId] = UnitTemplate - end - self:E( { "Unit", self.Templates.Units[UnitTemplateName].UnitName } ) - end -end - - ---- Private method that registers all alive players in the mission. --- @param #DATABASE self --- @return #DATABASE self -function DATABASE:_RegisterPlayers() - - local CoalitionsData = { AlivePlayersRed = coalition.getPlayers( coalition.side.RED ), AlivePlayersBlue = coalition.getPlayers( coalition.side.BLUE ) } - for CoalitionId, CoalitionData in pairs( CoalitionsData ) do - for UnitId, UnitData in pairs( CoalitionData ) do - self:T3( { "UnitData:", UnitData } ) - if UnitData and UnitData:isExist() then - local UnitName = UnitData:getName() - local PlayerName = UnitData:getPlayerName() - if not self.PLAYERS[PlayerName] then - self:E( { "Add player for unit:", UnitName, PlayerName } ) - self:AddPlayer( UnitName, PlayerName ) - end - end - end - end - - return self -end - - ---- Private method that registers all Groups and Units within in the mission. --- @param #DATABASE self --- @return #DATABASE self -function DATABASE:_RegisterGroupsAndUnits() - - local CoalitionsData = { GroupsRed = coalition.getGroups( coalition.side.RED ), GroupsBlue = coalition.getGroups( coalition.side.BLUE ) } - for CoalitionId, CoalitionData in pairs( CoalitionsData ) do - for DCSGroupId, DCSGroup in pairs( CoalitionData ) do - - if DCSGroup:isExist() then - local DCSGroupName = DCSGroup:getName() - - self:E( { "Register Group:", DCSGroup, DCSGroupName } ) - self:AddGroup( DCSGroup, DCSGroupName ) - - for DCSUnitId, DCSUnit in pairs( DCSGroup:getUnits() ) do - - local DCSUnitName = DCSUnit:getName() - self:E( { "Register Unit:", DCSUnit, DCSUnitName } ) - self:AddUnit( DCSUnit, DCSUnitName ) - end - else - self:E( { "Group does not exist: ", DCSGroup } ) - end - - end - end - - return self -end - ---- Private method that registers all Units of skill Client or Player within in the mission. --- @param #DATABASE self --- @return #DATABASE self -function DATABASE:_RegisterClients() - - for ClientName, ClientTemplate in pairs( self.Templates.ClientsByName ) do - self:E( { "Register Client:", ClientName } ) - self:AddClient( ClientName ) - end - - return self -end - -function DATABASE:_RegisterStatics() - - local CoalitionsData = { GroupsRed = coalition.getStaticObjects( coalition.side.RED ), GroupsBlue = coalition.getStaticObjects( coalition.side.BLUE ) } - for CoalitionId, CoalitionData in pairs( CoalitionsData ) do - for DCSStaticId, DCSStatic in pairs( CoalitionData ) do - - if DCSStatic:isExist() then - local DCSStaticName = DCSStatic:getName() - - self:E( { "Register Static:", DCSStatic, DCSStaticName } ) - self:AddStatic( DCSStatic, DCSStaticName ) - else - self:E( { "Static does not exist: ", DCSStatic } ) - end - end - end - - return self -end - - ---- Events - ---- Handles the OnBirth event for the alive units set. --- @param #DATABASE self --- @param Event#EVENTDATA Event -function DATABASE:_EventOnBirth( Event ) - self:F2( { Event } ) - - if Event.IniDCSUnit then - self:AddUnit( Event.IniDCSUnit, Event.IniDCSUnitName ) - self:AddGroup( Event.IniDCSGroup, Event.IniDCSGroupName ) - self:_EventOnPlayerEnterUnit( Event ) - end -end - - ---- Handles the OnDead or OnCrash event for alive units set. --- @param #DATABASE self --- @param Event#EVENTDATA Event -function DATABASE:_EventOnDeadOrCrash( Event ) - self:F2( { Event } ) - - if Event.IniDCSUnit then - if self.DCSUnits[Event.IniDCSUnitName] then - self:DeleteUnit( Event.IniDCSUnitName ) - -- add logic to correctly remove a group once all units are destroyed... - end - end -end - - ---- Handles the OnPlayerEnterUnit event to fill the active players table (with the unit filter applied). --- @param #DATABASE self --- @param Event#EVENTDATA Event -function DATABASE:_EventOnPlayerEnterUnit( Event ) - self:F2( { Event } ) - - if Event.IniDCSUnit then - local PlayerName = Event.IniDCSUnit:getPlayerName() - if not self.PLAYERSALIVE[PlayerName] then - self:AddPlayer( Event.IniDCSUnitName, PlayerName ) - end - end -end - - ---- Handles the OnPlayerLeaveUnit event to clean the active players table. --- @param #DATABASE self --- @param Event#EVENTDATA Event -function DATABASE:_EventOnPlayerLeaveUnit( Event ) - self:F2( { Event } ) - - if Event.IniDCSUnit then - local PlayerName = Event.IniDCSUnit:getPlayerName() - if self.PLAYERSALIVE[PlayerName] then - self:DeletePlayer( PlayerName ) - end - end -end - ---- Iterators - ---- Iterate the DATABASE and call an iterator function for the given set, providing the Object for each element within the set and optional parameters. --- @param #DATABASE self --- @param #function IteratorFunction The function that will be called when there is an alive player in the database. --- @return #DATABASE self -function DATABASE:ForEach( IteratorFunction, arg, Set ) - self:F2( arg ) - - local function CoRoutine() - local Count = 0 - for ObjectID, Object in pairs( Set ) do - self:T2( Object ) - IteratorFunction( Object, unpack( arg ) ) - Count = Count + 1 - if Count % 10 == 0 then - coroutine.yield( false ) - end - end - return true - end - - local co = coroutine.create( CoRoutine ) - - local function Schedule() - - local status, res = coroutine.resume( co ) - self:T2( { status, res } ) - - if status == false then - error( res ) - end - if res == false then - return true -- resume next time the loop - end - - return false - end - - local Scheduler = SCHEDULER:New( self, Schedule, {}, 0.001, 0.001, 0 ) - - return self -end - - ---- Iterate the DATABASE and call an iterator function for each **alive** unit, providing the DCSUnit and optional parameters. --- @param #DATABASE self --- @param #function IteratorFunction The function that will be called when there is an alive unit in the database. The function needs to accept a DCSUnit parameter. --- @return #DATABASE self -function DATABASE:ForEachDCSUnit( IteratorFunction, ... ) - self:F2( arg ) - - self:ForEach( IteratorFunction, arg, self.DCSUnits ) - - return self -end - - ---- Iterate the DATABASE and call an iterator function for each **alive** UNIT, providing the UNIT and optional parameters. --- @param #DATABASE self --- @param #function IteratorFunction The function that will be called when there is an alive UNIT in the database. The function needs to accept a UNIT parameter. --- @return #DATABASE self -function DATABASE:ForEachUnit( IteratorFunction, ... ) - self:F2( arg ) - - self:ForEach( IteratorFunction, arg, self.UNITS ) - - return self -end - ---- Iterate the DATABASE and call an iterator function for each **alive** GROUP, providing the GROUP and optional parameters. --- @param #DATABASE self --- @param #function IteratorFunction The function that will be called when there is an alive GROUP in the database. The function needs to accept a GROUP parameter. --- @return #DATABASE self -function DATABASE:ForEachGroup( IteratorFunction, ... ) - self:F2( arg ) - - self:ForEach( IteratorFunction, arg, self.GROUPS ) - - return self -end - - ---- Iterate the DATABASE and call an iterator function for each player, providing the player name and optional parameters. --- @param #DATABASE self --- @param #function IteratorFunction The function that will be called when there is an player in the database. The function needs to accept the player name. --- @return #DATABASE self -function DATABASE:ForEachPlayer( IteratorFunction, ... ) - self:F2( arg ) - - self:ForEach( IteratorFunction, arg, self.PLAYERS ) - - return self -end - - ---- Iterate the DATABASE and call an iterator function for each **alive** player, providing the Unit of the player and optional parameters. --- @param #DATABASE self --- @param #function IteratorFunction The function that will be called when there is an alive player in the database. The function needs to accept a UNIT parameter. --- @return #DATABASE self -function DATABASE:ForEachPlayerAlive( IteratorFunction, ... ) - self:F2( arg ) - - self:ForEach( IteratorFunction, arg, self.PLAYERSALIVE ) - - return self -end - ---- Iterate the DATABASE and call an iterator function for each CLIENT, providing the CLIENT to the function and optional parameters. --- @param #DATABASE self --- @param #function IteratorFunction The function that will be called when there is an alive player in the database. The function needs to accept a CLIENT parameter. --- @return #DATABASE self -function DATABASE:ForEachClient( IteratorFunction, ... ) - self:F2( arg ) - - self:ForEach( IteratorFunction, arg, self.CLIENTS ) - - return self -end - ---- Iterate the DATABASE and call an iterator function for each **ALIVE** CLIENT, providing the CLIENT to the function and optional parameters. --- @param #DATABASE self --- @param #function IteratorFunction The function that will be called when there is an alive CLIENT in the database. The function needs to accept a CLIENT parameter. --- @return #DATABASE self -function DATABASE:ForEachClientAlive( IteratorFunction, ... ) - self:F2( arg ) - - self:ForEach( IteratorFunction, arg, self.CLIENTSALIVE ) - - return self -end - - -function DATABASE:_RegisterTemplates() - self:F2() - - self.Navpoints = {} - self.UNITS = {} - --Build routines.db.units and self.Navpoints - for CoalitionName, coa_data in pairs(env.mission.coalition) do - - if (CoalitionName == 'red' or CoalitionName == 'blue') and type(coa_data) == 'table' then - --self.Units[coa_name] = {} - - ---------------------------------------------- - -- build nav points DB - self.Navpoints[CoalitionName] = {} - if coa_data.nav_points then --navpoints - for nav_ind, nav_data in pairs(coa_data.nav_points) do - - if type(nav_data) == 'table' then - self.Navpoints[CoalitionName][nav_ind] = routines.utils.deepCopy(nav_data) - - self.Navpoints[CoalitionName][nav_ind]['name'] = nav_data.callsignStr -- name is a little bit more self-explanatory. - self.Navpoints[CoalitionName][nav_ind]['point'] = {} -- point is used by SSE, support it. - self.Navpoints[CoalitionName][nav_ind]['point']['x'] = nav_data.x - self.Navpoints[CoalitionName][nav_ind]['point']['y'] = 0 - self.Navpoints[CoalitionName][nav_ind]['point']['z'] = nav_data.y - end - end - end - ------------------------------------------------- - if coa_data.country then --there is a country table - for cntry_id, cntry_data in pairs(coa_data.country) do - - local CountryName = string.upper(cntry_data.name) - --self.Units[coa_name][countryName] = {} - --self.Units[coa_name][countryName]["countryId"] = cntry_data.id - - if type(cntry_data) == 'table' then --just making sure - - for obj_type_name, obj_type_data in pairs(cntry_data) do - - if obj_type_name == "helicopter" or obj_type_name == "ship" or obj_type_name == "plane" or obj_type_name == "vehicle" or obj_type_name == "static" then --should be an unncessary check - - local CategoryName = obj_type_name - - if ((type(obj_type_data) == 'table') and obj_type_data.group and (type(obj_type_data.group) == 'table') and (#obj_type_data.group > 0)) then --there's a group! - - --self.Units[coa_name][countryName][category] = {} - - for group_num, GroupTemplate in pairs(obj_type_data.group) do - - if GroupTemplate and GroupTemplate.units and type(GroupTemplate.units) == 'table' then --making sure again- this is a valid group - self:_RegisterTemplate( GroupTemplate, CoalitionName, CategoryName, CountryName ) - end --if GroupTemplate and GroupTemplate.units then - end --for group_num, GroupTemplate in pairs(obj_type_data.group) do - end --if ((type(obj_type_data) == 'table') and obj_type_data.group and (type(obj_type_data.group) == 'table') and (#obj_type_data.group > 0)) then - end --if obj_type_name == "helicopter" or obj_type_name == "ship" or obj_type_name == "plane" or obj_type_name == "vehicle" or obj_type_name == "static" then - end --for obj_type_name, obj_type_data in pairs(cntry_data) do - end --if type(cntry_data) == 'table' then - end --for cntry_id, cntry_data in pairs(coa_data.country) do - end --if coa_data.country then --there is a country table - end --if coa_name == 'red' or coa_name == 'blue' and type(coa_data) == 'table' then - end --for coa_name, coa_data in pairs(mission.coalition) do - - return self -end - - - - ---- This module contains the SET classes. --- --- === --- --- 1) @{Set#SET_BASE} class, extends @{Base#BASE} --- ================================================ --- The @{Set#SET_BASE} class defines the core functions that define a collection of objects. --- A SET provides iterators to iterate the SET, but will **temporarily** yield the ForEach interator loop at defined **"intervals"** to the mail simulator loop. --- In this way, large loops can be done while not blocking the simulator main processing loop. --- The default **"yield interval"** is after 10 objects processed. --- The default **"time interval"** is after 0.001 seconds. --- --- 1.1) Add or remove objects from the SET --- --------------------------------------- --- Some key core functions are @{Set#SET_BASE.Add} and @{Set#SET_BASE.Remove} to add or remove objects from the SET in your logic. --- --- 1.2) Define the SET iterator **"yield interval"** and the **"time interval"**. --- ------------------------------------------------------------------------------------- --- Modify the iterator intervals with the @{Set#SET_BASE.SetInteratorIntervals} method. --- You can set the **"yield interval"**, and the **"time interval"**. (See above). --- --- === --- --- 2) @{Set#SET_GROUP} class, extends @{Set#SET_BASE} --- ==================================================== --- Mission designers can use the @{Set#SET_GROUP} class to build sets of groups belonging to certain: --- --- * Coalitions --- * Categories --- * Countries --- * Starting with certain prefix strings. --- --- 2.1) SET_GROUP construction method: --- ----------------------------------- --- Create a new SET_GROUP object with the @{#SET_GROUP.New} method: --- --- * @{#SET_GROUP.New}: Creates a new SET_GROUP object. --- --- 2.2) Add or Remove GROUP(s) from SET_GROUP: --- ------------------------------------------- --- GROUPS can be added and removed using the @{Set#SET_GROUP.AddGroupsByName} and @{Set#SET_GROUP.RemoveGroupsByName} respectively. --- These methods take a single GROUP name or an array of GROUP names to be added or removed from SET_GROUP. --- --- 2.3) SET_GROUP filter criteria: --- ------------------------------- --- You can set filter criteria to define the set of groups within the SET_GROUP. --- Filter criteria are defined by: --- --- * @{#SET_GROUP.FilterCoalitions}: Builds the SET_GROUP with the groups belonging to the coalition(s). --- * @{#SET_GROUP.FilterCategories}: Builds the SET_GROUP with the groups belonging to the category(ies). --- * @{#SET_GROUP.FilterCountries}: Builds the SET_GROUP with the gruops belonging to the country(ies). --- * @{#SET_GROUP.FilterPrefixes}: Builds the SET_GROUP with the groups starting with the same prefix string(s). --- --- Once the filter criteria have been set for the SET_GROUP, you can start filtering using: --- --- * @{#SET_GROUP.FilterStart}: Starts the filtering of the groups within the SET_GROUP and add or remove GROUP objects **dynamically**. --- --- Planned filter criteria within development are (so these are not yet available): --- --- * @{#SET_GROUP.FilterZones}: Builds the SET_GROUP with the groups within a @{Zone#ZONE}. --- --- 2.4) SET_GROUP iterators: --- ------------------------- --- Once the filters have been defined and the SET_GROUP has been built, you can iterate the SET_GROUP with the available iterator methods. --- The iterator methods will walk the SET_GROUP set, and call for each element within the set a function that you provide. --- The following iterator methods are currently available within the SET_GROUP: --- --- * @{#SET_GROUP.ForEachGroup}: Calls a function for each alive group it finds within the SET_GROUP. --- * @{#SET_GROUP.ForEachGroupCompletelyInZone}: Iterate the SET_GROUP and call an iterator function for each **alive** GROUP presence completely in a @{Zone}, providing the GROUP and optional parameters to the called function. --- * @{#SET_GROUP.ForEachGroupPartlyInZone}: Iterate the SET_GROUP and call an iterator function for each **alive** GROUP presence partly in a @{Zone}, providing the GROUP and optional parameters to the called function. --- * @{#SET_GROUP.ForEachGroupNotInZone}: Iterate the SET_GROUP and call an iterator function for each **alive** GROUP presence not in a @{Zone}, providing the GROUP and optional parameters to the called function. --- --- ==== --- --- 3) @{Set#SET_UNIT} class, extends @{Set#SET_BASE} --- =================================================== --- Mission designers can use the @{Set#SET_UNIT} class to build sets of units belonging to certain: --- --- * Coalitions --- * Categories --- * Countries --- * Unit types --- * Starting with certain prefix strings. --- --- 3.1) SET_UNIT construction method: --- ---------------------------------- --- Create a new SET_UNIT object with the @{#SET_UNIT.New} method: --- --- * @{#SET_UNIT.New}: Creates a new SET_UNIT object. --- --- 3.2) Add or Remove UNIT(s) from SET_UNIT: --- ----------------------------------------- --- UNITs can be added and removed using the @{Set#SET_UNIT.AddUnitsByName} and @{Set#SET_UNIT.RemoveUnitsByName} respectively. --- These methods take a single UNIT name or an array of UNIT names to be added or removed from SET_UNIT. --- --- 3.3) SET_UNIT filter criteria: --- ------------------------------ --- You can set filter criteria to define the set of units within the SET_UNIT. --- Filter criteria are defined by: --- --- * @{#SET_UNIT.FilterCoalitions}: Builds the SET_UNIT with the units belonging to the coalition(s). --- * @{#SET_UNIT.FilterCategories}: Builds the SET_UNIT with the units belonging to the category(ies). --- * @{#SET_UNIT.FilterTypes}: Builds the SET_UNIT with the units belonging to the unit type(s). --- * @{#SET_UNIT.FilterCountries}: Builds the SET_UNIT with the units belonging to the country(ies). --- * @{#SET_UNIT.FilterPrefixes}: Builds the SET_UNIT with the units starting with the same prefix string(s). --- --- Once the filter criteria have been set for the SET_UNIT, you can start filtering using: --- --- * @{#SET_UNIT.FilterStart}: Starts the filtering of the units within the SET_UNIT. --- --- Planned filter criteria within development are (so these are not yet available): --- --- * @{#SET_UNIT.FilterZones}: Builds the SET_UNIT with the units within a @{Zone#ZONE}. --- --- 3.4) SET_UNIT iterators: --- ------------------------ --- Once the filters have been defined and the SET_UNIT has been built, you can iterate the SET_UNIT with the available iterator methods. --- The iterator methods will walk the SET_UNIT set, and call for each element within the set a function that you provide. --- The following iterator methods are currently available within the SET_UNIT: --- --- * @{#SET_UNIT.ForEachUnit}: Calls a function for each alive unit it finds within the SET_UNIT. --- * @{#SET_GROUP.ForEachGroupCompletelyInZone}: Iterate the SET_GROUP and call an iterator function for each **alive** GROUP presence completely in a @{Zone}, providing the GROUP and optional parameters to the called function. --- * @{#SET_GROUP.ForEachGroupNotInZone}: Iterate the SET_GROUP and call an iterator function for each **alive** GROUP presence not in a @{Zone}, providing the GROUP and optional parameters to the called function. --- --- Planned iterators methods in development are (so these are not yet available): --- --- * @{#SET_UNIT.ForEachUnitInUnit}: Calls a function for each unit contained within the SET_UNIT. --- * @{#SET_UNIT.ForEachUnitCompletelyInZone}: Iterate and call an iterator function for each **alive** UNIT presence completely in a @{Zone}, providing the UNIT and optional parameters to the called function. --- * @{#SET_UNIT.ForEachUnitNotInZone}: Iterate and call an iterator function for each **alive** UNIT presence not in a @{Zone}, providing the UNIT and optional parameters to the called function. --- --- 4) @{Set#SET_CLIENT} class, extends @{Set#SET_BASE} --- =================================================== --- Mission designers can use the @{Set#SET_CLIENT} class to build sets of units belonging to certain: --- --- * Coalitions --- * Categories --- * Countries --- * Client types --- * Starting with certain prefix strings. --- --- 4.1) SET_CLIENT construction method: --- ---------------------------------- --- Create a new SET_CLIENT object with the @{#SET_CLIENT.New} method: --- --- * @{#SET_CLIENT.New}: Creates a new SET_CLIENT object. --- --- 4.2) Add or Remove CLIENT(s) from SET_CLIENT: --- ----------------------------------------- --- CLIENTs can be added and removed using the @{Set#SET_CLIENT.AddClientsByName} and @{Set#SET_CLIENT.RemoveClientsByName} respectively. --- These methods take a single CLIENT name or an array of CLIENT names to be added or removed from SET_CLIENT. --- --- 4.3) SET_CLIENT filter criteria: --- ------------------------------ --- You can set filter criteria to define the set of clients within the SET_CLIENT. --- Filter criteria are defined by: --- --- * @{#SET_CLIENT.FilterCoalitions}: Builds the SET_CLIENT with the clients belonging to the coalition(s). --- * @{#SET_CLIENT.FilterCategories}: Builds the SET_CLIENT with the clients belonging to the category(ies). --- * @{#SET_CLIENT.FilterTypes}: Builds the SET_CLIENT with the clients belonging to the client type(s). --- * @{#SET_CLIENT.FilterCountries}: Builds the SET_CLIENT with the clients belonging to the country(ies). --- * @{#SET_CLIENT.FilterPrefixes}: Builds the SET_CLIENT with the clients starting with the same prefix string(s). --- --- Once the filter criteria have been set for the SET_CLIENT, you can start filtering using: --- --- * @{#SET_CLIENT.FilterStart}: Starts the filtering of the clients within the SET_CLIENT. --- --- Planned filter criteria within development are (so these are not yet available): --- --- * @{#SET_CLIENT.FilterZones}: Builds the SET_CLIENT with the clients within a @{Zone#ZONE}. --- --- 4.4) SET_CLIENT iterators: --- ------------------------ --- Once the filters have been defined and the SET_CLIENT has been built, you can iterate the SET_CLIENT with the available iterator methods. --- The iterator methods will walk the SET_CLIENT set, and call for each element within the set a function that you provide. --- The following iterator methods are currently available within the SET_CLIENT: --- --- * @{#SET_CLIENT.ForEachClient}: Calls a function for each alive client it finds within the SET_CLIENT. --- --- ==== --- --- @module Set --- @author FlightControl - ---- SET_BASE class --- @type SET_BASE --- @extends Base#BASE -SET_BASE = { - ClassName = "SET_BASE", - Set = {}, - Database = {}, -} - ---- Creates a new SET_BASE object, building a set of units belonging to a coalitions, categories, countries, types or with defined prefix names. --- @param #SET_BASE self --- @return #SET_BASE --- @usage --- -- Define a new SET_BASE Object. This DBObject will contain a reference to all Group and Unit Templates defined within the ME and the DCSRTE. --- DBObject = SET_BASE:New() -function SET_BASE:New( Database ) - - -- Inherits from BASE - local self = BASE:Inherit( self, BASE:New() ) - - self.Database = Database - - self.YieldInterval = 10 - self.TimeInterval = 0.001 - - return self -end - ---- Finds an @{Base#BASE} object based on the object Name. --- @param #SET_BASE self --- @param #string ObjectName --- @return Base#BASE The Object found. -function SET_BASE:_Find( ObjectName ) - - local ObjectFound = self.Set[ObjectName] - return ObjectFound -end - - ---- Adds a @{Base#BASE} object in the @{Set#SET_BASE}, using the Object Name as the index. --- @param #SET_BASE self --- @param #string ObjectName --- @param Base#BASE Object --- @return Base#BASE The added BASE Object. -function SET_BASE:Add( ObjectName, Object ) - - self.Set[ObjectName] = Object -end - ---- Removes a @{Base#BASE} object from the @{Set#SET_BASE} and derived classes, based on the Object Name. --- @param #SET_BASE self --- @param #string ObjectName -function SET_BASE:Remove( ObjectName ) - - self.Set[ObjectName] = nil -end - ---- Define the SET iterator **"yield interval"** and the **"time interval"**. --- @param #SET_BASE self --- @param #number YieldInterval Sets the frequency when the iterator loop will yield after the number of objects processed. The default frequency is 10 objects processed. --- @param #number TimeInterval Sets the time in seconds when the main logic will resume the iterator loop. The default time is 0.001 seconds. --- @return #SET_BASE self -function SET_BASE:SetIteratorIntervals( YieldInterval, TimeInterval ) - - self.YieldInterval = YieldInterval - self.TimeInterval = TimeInterval - - return self -end - - - ---- Starts the filtering for the defined collection. --- @param #SET_BASE self --- @return #SET_BASE self -function SET_BASE:_FilterStart() - - for ObjectName, Object in pairs( self.Database ) do - - if self:IsIncludeObject( Object ) then - self:E( { "Adding Object:", ObjectName } ) - self:Add( ObjectName, Object ) - end - end - - _EVENTDISPATCHER:OnBirth( self._EventOnBirth, self ) - _EVENTDISPATCHER:OnDead( self._EventOnDeadOrCrash, self ) - _EVENTDISPATCHER:OnCrash( self._EventOnDeadOrCrash, self ) - - -- Follow alive players and clients --- _EVENTDISPATCHER:OnPlayerEnterUnit( self._EventOnPlayerEnterUnit, self ) --- _EVENTDISPATCHER:OnPlayerLeaveUnit( self._EventOnPlayerLeaveUnit, self ) - - - return self -end - - - ------ Private method that registers all alive players in the mission. ----- @param #SET_BASE self ----- @return #SET_BASE self ---function SET_BASE:_RegisterPlayers() --- --- local CoalitionsData = { AlivePlayersRed = coalition.getPlayers( coalition.side.RED ), AlivePlayersBlue = coalition.getPlayers( coalition.side.BLUE ) } --- for CoalitionId, CoalitionData in pairs( CoalitionsData ) do --- for UnitId, UnitData in pairs( CoalitionData ) do --- self:T3( { "UnitData:", UnitData } ) --- if UnitData and UnitData:isExist() then --- local UnitName = UnitData:getName() --- if not self.PlayersAlive[UnitName] then --- self:E( { "Add player for unit:", UnitName, UnitData:getPlayerName() } ) --- self.PlayersAlive[UnitName] = UnitData:getPlayerName() --- end --- end --- end --- end --- --- return self ---end - ---- Events - ---- Handles the OnBirth event for the Set. --- @param #SET_BASE self --- @param Event#EVENTDATA Event -function SET_BASE:_EventOnBirth( Event ) - self:F3( { Event } ) - - if Event.IniDCSUnit then - local ObjectName, Object = self:AddInDatabase( Event ) - self:T3( ObjectName, Object ) - if self:IsIncludeObject( Object ) then - self:Add( ObjectName, Object ) - --self:_EventOnPlayerEnterUnit( Event ) - end - end -end - ---- Handles the OnDead or OnCrash event for alive units set. --- @param #SET_BASE self --- @param Event#EVENTDATA Event -function SET_BASE:_EventOnDeadOrCrash( Event ) - self:F3( { Event } ) - - if Event.IniDCSUnit then - local ObjectName, Object = self:FindInDatabase( Event ) - if ObjectName and Object then - self:Remove( ObjectName ) - end - end -end - ------ Handles the OnPlayerEnterUnit event to fill the active players table (with the unit filter applied). ----- @param #SET_BASE self ----- @param Event#EVENTDATA Event ---function SET_BASE:_EventOnPlayerEnterUnit( Event ) --- self:F3( { Event } ) --- --- if Event.IniDCSUnit then --- if self:IsIncludeObject( Event.IniDCSUnit ) then --- if not self.PlayersAlive[Event.IniDCSUnitName] then --- self:E( { "Add player for unit:", Event.IniDCSUnitName, Event.IniDCSUnit:getPlayerName() } ) --- self.PlayersAlive[Event.IniDCSUnitName] = Event.IniDCSUnit:getPlayerName() --- self.ClientsAlive[Event.IniDCSUnitName] = _DATABASE.Clients[ Event.IniDCSUnitName ] --- end --- end --- end ---end --- ------ Handles the OnPlayerLeaveUnit event to clean the active players table. ----- @param #SET_BASE self ----- @param Event#EVENTDATA Event ---function SET_BASE:_EventOnPlayerLeaveUnit( Event ) --- self:F3( { Event } ) --- --- if Event.IniDCSUnit then --- if self:IsIncludeObject( Event.IniDCSUnit ) then --- if self.PlayersAlive[Event.IniDCSUnitName] then --- self:E( { "Cleaning player for unit:", Event.IniDCSUnitName, Event.IniDCSUnit:getPlayerName() } ) --- self.PlayersAlive[Event.IniDCSUnitName] = nil --- self.ClientsAlive[Event.IniDCSUnitName] = nil --- end --- end --- end ---end - --- Iterators - ---- Iterate the SET_BASE and derived classes and call an iterator function for the given SET_BASE, providing the Object for each element within the set and optional parameters. --- @param #SET_BASE self --- @param #function IteratorFunction The function that will be called. --- @return #SET_BASE self -function SET_BASE:ForEach( IteratorFunction, arg, Set, Function, FunctionArguments ) - self:F3( arg ) - - local function CoRoutine() - local Count = 0 - for ObjectID, Object in pairs( Set ) do - self:T2( Object ) - if Function then - if Function( unpack( FunctionArguments ), Object ) == true then - IteratorFunction( Object, unpack( arg ) ) - end - else - IteratorFunction( Object, unpack( arg ) ) - end - Count = Count + 1 - if Count % self.YieldInterval == 0 then - coroutine.yield( false ) - end - end - return true - end - - local co = coroutine.create( CoRoutine ) - - local function Schedule() - - local status, res = coroutine.resume( co ) - self:T3( { status, res } ) - - if status == false then - error( res ) - end - if res == false then - return true -- resume next time the loop - end - - return false - end - - local Scheduler = SCHEDULER:New( self, Schedule, {}, self.TimeInterval, self.TimeInterval, 0 ) - - return self -end - - ------ Interate the SET_BASE and call an interator function for each **alive** unit, providing the Unit and optional parameters. ----- @param #SET_BASE self ----- @param #function IteratorFunction The function that will be called when there is an alive unit in the SET_BASE. The function needs to accept a UNIT parameter. ----- @return #SET_BASE self ---function SET_BASE:ForEachDCSUnitAlive( IteratorFunction, ... ) --- self:F3( arg ) --- --- self:ForEach( IteratorFunction, arg, self.DCSUnitsAlive ) --- --- return self ---end --- ------ Interate the SET_BASE and call an interator function for each **alive** player, providing the Unit of the player and optional parameters. ----- @param #SET_BASE self ----- @param #function IteratorFunction The function that will be called when there is an alive player in the SET_BASE. The function needs to accept a UNIT parameter. ----- @return #SET_BASE self ---function SET_BASE:ForEachPlayer( IteratorFunction, ... ) --- self:F3( arg ) --- --- self:ForEach( IteratorFunction, arg, self.PlayersAlive ) --- --- return self ---end --- --- ------ Interate the SET_BASE and call an interator function for each client, providing the Client to the function and optional parameters. ----- @param #SET_BASE self ----- @param #function IteratorFunction The function that will be called when there is an alive player in the SET_BASE. The function needs to accept a CLIENT parameter. ----- @return #SET_BASE self ---function SET_BASE:ForEachClient( IteratorFunction, ... ) --- self:F3( arg ) --- --- self:ForEach( IteratorFunction, arg, self.Clients ) --- --- return self ---end - - ---- Decides whether to include the Object --- @param #SET_BASE self --- @param #table Object --- @return #SET_BASE self -function SET_BASE:IsIncludeObject( Object ) - self:F3( Object ) - - return true -end - ---- Flushes the current SET_BASE contents in the log ... (for debug reasons). --- @param #SET_BASE self --- @return #string A string with the names of the objects. -function SET_BASE:Flush() - self:F3() - - local ObjectNames = "" - for ObjectName, Object in pairs( self.Set ) do - ObjectNames = ObjectNames .. ObjectName .. ", " - end - self:T( { "Objects in Set:", ObjectNames } ) - - return ObjectNames -end - --- SET_GROUP - ---- SET_GROUP class --- @type SET_GROUP --- @extends Set#SET_BASE -SET_GROUP = { - ClassName = "SET_GROUP", - Filter = { - Coalitions = nil, - Categories = nil, - Countries = nil, - GroupPrefixes = nil, - }, - FilterMeta = { - Coalitions = { - red = coalition.side.RED, - blue = coalition.side.BLUE, - neutral = coalition.side.NEUTRAL, - }, - Categories = { - plane = Group.Category.AIRPLANE, - helicopter = Group.Category.HELICOPTER, - ground = Group.Category.GROUND_UNIT, - ship = Group.Category.SHIP, - structure = Group.Category.STRUCTURE, - }, - }, -} - - ---- Creates a new SET_GROUP object, building a set of groups belonging to a coalitions, categories, countries, types or with defined prefix names. --- @param #SET_GROUP self --- @return #SET_GROUP --- @usage --- -- Define a new SET_GROUP Object. This DBObject will contain a reference to all alive GROUPS. --- DBObject = SET_GROUP:New() -function SET_GROUP:New() - - -- Inherits from BASE - local self = BASE:Inherit( self, SET_BASE:New( _DATABASE.GROUPS ) ) - - return self -end - ---- Add GROUP(s) to SET_GROUP. --- @param Set#SET_GROUP self --- @param #string AddGroupNames A single name or an array of GROUP names. --- @return self -function SET_GROUP:AddGroupsByName( AddGroupNames ) - - local AddGroupNamesArray = ( type( AddGroupNames ) == "table" ) and AddGroupNames or { AddGroupNames } - - for AddGroupID, AddGroupName in pairs( AddGroupNamesArray ) do - self:Add( AddGroupName, GROUP:FindByName( AddGroupName ) ) - end - - return self -end - ---- Remove GROUP(s) from SET_GROUP. --- @param Set#SET_GROUP self --- @param Group#GROUP RemoveGroupNames A single name or an array of GROUP names. --- @return self -function SET_GROUP:RemoveGroupsByName( RemoveGroupNames ) - - local RemoveGroupNamesArray = ( type( RemoveGroupNames ) == "table" ) and RemoveGroupNames or { RemoveGroupNames } - - for RemoveGroupID, RemoveGroupName in pairs( RemoveGroupNamesArray ) do - self:Remove( RemoveGroupName.GroupName ) - end - - return self -end - - - - ---- Finds a Group based on the Group Name. --- @param #SET_GROUP self --- @param #string GroupName --- @return Group#GROUP The found Group. -function SET_GROUP:FindGroup( GroupName ) - - local GroupFound = self.Set[GroupName] - return GroupFound -end - - - ---- Builds a set of groups of coalitions. --- Possible current coalitions are red, blue and neutral. --- @param #SET_GROUP self --- @param #string Coalitions Can take the following values: "red", "blue", "neutral". --- @return #SET_GROUP self -function SET_GROUP:FilterCoalitions( Coalitions ) - if not self.Filter.Coalitions then - self.Filter.Coalitions = {} - end - if type( Coalitions ) ~= "table" then - Coalitions = { Coalitions } - end - for CoalitionID, Coalition in pairs( Coalitions ) do - self.Filter.Coalitions[Coalition] = Coalition - end - return self -end - - ---- Builds a set of groups out of categories. --- Possible current categories are plane, helicopter, ground, ship. --- @param #SET_GROUP self --- @param #string Categories Can take the following values: "plane", "helicopter", "ground", "ship". --- @return #SET_GROUP self -function SET_GROUP:FilterCategories( Categories ) - if not self.Filter.Categories then - self.Filter.Categories = {} - end - if type( Categories ) ~= "table" then - Categories = { Categories } - end - for CategoryID, Category in pairs( Categories ) do - self.Filter.Categories[Category] = Category - end - return self -end - ---- Builds a set of groups of defined countries. --- Possible current countries are those known within DCS world. --- @param #SET_GROUP self --- @param #string Countries Can take those country strings known within DCS world. --- @return #SET_GROUP self -function SET_GROUP:FilterCountries( Countries ) - if not self.Filter.Countries then - self.Filter.Countries = {} - end - if type( Countries ) ~= "table" then - Countries = { Countries } - end - for CountryID, Country in pairs( Countries ) do - self.Filter.Countries[Country] = Country - end - return self -end - - ---- Builds a set of groups of defined GROUP prefixes. --- All the groups starting with the given prefixes will be included within the set. --- @param #SET_GROUP self --- @param #string Prefixes The prefix of which the group name starts with. --- @return #SET_GROUP self -function SET_GROUP:FilterPrefixes( Prefixes ) - if not self.Filter.GroupPrefixes then - self.Filter.GroupPrefixes = {} - end - if type( Prefixes ) ~= "table" then - Prefixes = { Prefixes } - end - for PrefixID, Prefix in pairs( Prefixes ) do - self.Filter.GroupPrefixes[Prefix] = Prefix - end - return self -end - - ---- Starts the filtering. --- @param #SET_GROUP self --- @return #SET_GROUP self -function SET_GROUP:FilterStart() - - if _DATABASE then - self:_FilterStart() - end - - return self -end - ---- Handles the Database to check on an event (birth) that the Object was added in the Database. --- This is required, because sometimes the _DATABASE birth event gets called later than the SET_BASE birth event! --- @param #SET_GROUP self --- @param Event#EVENTDATA Event --- @return #string The name of the GROUP --- @return #table The GROUP -function SET_GROUP:AddInDatabase( Event ) - self:F3( { Event } ) - - if not self.Database[Event.IniDCSGroupName] then - self.Database[Event.IniDCSGroupName] = GROUP:Register( Event.IniDCSGroupName ) - self:T3( self.Database[Event.IniDCSGroupName] ) - end - - return Event.IniDCSGroupName, self.Database[Event.IniDCSGroupName] -end - ---- Handles the Database to check on any event that Object exists in the Database. --- This is required, because sometimes the _DATABASE event gets called later than the SET_BASE event or vise versa! --- @param #SET_GROUP self --- @param Event#EVENTDATA Event --- @return #string The name of the GROUP --- @return #table The GROUP -function SET_GROUP:FindInDatabase( Event ) - self:F3( { Event } ) - - return Event.IniDCSGroupName, self.Database[Event.IniDCSGroupName] -end - ---- Iterate the SET_GROUP and call an iterator function for each **alive** GROUP, providing the GROUP and optional parameters. --- @param #SET_GROUP self --- @param #function IteratorFunction The function that will be called when there is an alive GROUP in the SET_GROUP. The function needs to accept a GROUP parameter. --- @return #SET_GROUP self -function SET_GROUP:ForEachGroup( IteratorFunction, ... ) - self:F2( arg ) - - self:ForEach( IteratorFunction, arg, self.Set ) - - return self -end - ---- Iterate the SET_GROUP and call an iterator function for each **alive** GROUP presence completely in a @{Zone}, providing the GROUP and optional parameters to the called function. --- @param #SET_GROUP self --- @param Zone#ZONE ZoneObject The Zone to be tested for. --- @param #function IteratorFunction The function that will be called when there is an alive GROUP in the SET_GROUP. The function needs to accept a GROUP parameter. --- @return #SET_GROUP self -function SET_GROUP:ForEachGroupCompletelyInZone( ZoneObject, IteratorFunction, ... ) - self:F2( arg ) - - self:ForEach( IteratorFunction, arg, self.Set, - --- @param Zone#ZONE_BASE ZoneObject - -- @param Group#GROUP GroupObject - function( ZoneObject, GroupObject ) - if GroupObject:IsCompletelyInZone( ZoneObject ) then - return true - else - return false - end - end, { ZoneObject } ) - - return self -end - ---- Iterate the SET_GROUP and call an iterator function for each **alive** GROUP presence partly in a @{Zone}, providing the GROUP and optional parameters to the called function. --- @param #SET_GROUP self --- @param Zone#ZONE ZoneObject The Zone to be tested for. --- @param #function IteratorFunction The function that will be called when there is an alive GROUP in the SET_GROUP. The function needs to accept a GROUP parameter. --- @return #SET_GROUP self -function SET_GROUP:ForEachGroupPartlyInZone( ZoneObject, IteratorFunction, ... ) - self:F2( arg ) - - self:ForEach( IteratorFunction, arg, self.Set, - --- @param Zone#ZONE_BASE ZoneObject - -- @param Group#GROUP GroupObject - function( ZoneObject, GroupObject ) - if GroupObject:IsPartlyInZone( ZoneObject ) then - return true - else - return false - end - end, { ZoneObject } ) - - return self -end - ---- Iterate the SET_GROUP and call an iterator function for each **alive** GROUP presence not in a @{Zone}, providing the GROUP and optional parameters to the called function. --- @param #SET_GROUP self --- @param Zone#ZONE ZoneObject The Zone to be tested for. --- @param #function IteratorFunction The function that will be called when there is an alive GROUP in the SET_GROUP. The function needs to accept a GROUP parameter. --- @return #SET_GROUP self -function SET_GROUP:ForEachGroupNotInZone( ZoneObject, IteratorFunction, ... ) - self:F2( arg ) - - self:ForEach( IteratorFunction, arg, self.Set, - --- @param Zone#ZONE_BASE ZoneObject - -- @param Group#GROUP GroupObject - function( ZoneObject, GroupObject ) - if GroupObject:IsNotInZone( ZoneObject ) then - return true - else - return false - end - end, { ZoneObject } ) - - return self -end - - ------ Interate the SET_GROUP and call an interator function for each **alive** player, providing the Group of the player and optional parameters. ----- @param #SET_GROUP self ----- @param #function IteratorFunction The function that will be called when there is an alive player in the SET_GROUP. The function needs to accept a GROUP parameter. ----- @return #SET_GROUP self ---function SET_GROUP:ForEachPlayer( IteratorFunction, ... ) --- self:F2( arg ) --- --- self:ForEach( IteratorFunction, arg, self.PlayersAlive ) --- --- return self ---end --- --- ------ Interate the SET_GROUP and call an interator function for each client, providing the Client to the function and optional parameters. ----- @param #SET_GROUP self ----- @param #function IteratorFunction The function that will be called when there is an alive player in the SET_GROUP. The function needs to accept a CLIENT parameter. ----- @return #SET_GROUP self ---function SET_GROUP:ForEachClient( IteratorFunction, ... ) --- self:F2( arg ) --- --- self:ForEach( IteratorFunction, arg, self.Clients ) --- --- return self ---end - - ---- --- @param #SET_GROUP self --- @param Group#GROUP MooseGroup --- @return #SET_GROUP self -function SET_GROUP:IsIncludeObject( MooseGroup ) - self:F2( MooseGroup ) - local MooseGroupInclude = true - - if self.Filter.Coalitions then - local MooseGroupCoalition = false - for CoalitionID, CoalitionName in pairs( self.Filter.Coalitions ) do - self:T3( { "Coalition:", MooseGroup:GetCoalition(), self.FilterMeta.Coalitions[CoalitionName], CoalitionName } ) - if self.FilterMeta.Coalitions[CoalitionName] and self.FilterMeta.Coalitions[CoalitionName] == MooseGroup:GetCoalition() then - MooseGroupCoalition = true - end - end - MooseGroupInclude = MooseGroupInclude and MooseGroupCoalition - end - - if self.Filter.Categories then - local MooseGroupCategory = false - for CategoryID, CategoryName in pairs( self.Filter.Categories ) do - self:T3( { "Category:", MooseGroup:GetCategory(), self.FilterMeta.Categories[CategoryName], CategoryName } ) - if self.FilterMeta.Categories[CategoryName] and self.FilterMeta.Categories[CategoryName] == MooseGroup:GetCategory() then - MooseGroupCategory = true - end - end - MooseGroupInclude = MooseGroupInclude and MooseGroupCategory - end - - if self.Filter.Countries then - local MooseGroupCountry = false - for CountryID, CountryName in pairs( self.Filter.Countries ) do - self:T3( { "Country:", MooseGroup:GetCountry(), CountryName } ) - if country.id[CountryName] == MooseGroup:GetCountry() then - MooseGroupCountry = true - end - end - MooseGroupInclude = MooseGroupInclude and MooseGroupCountry - end - - if self.Filter.GroupPrefixes then - local MooseGroupPrefix = false - for GroupPrefixId, GroupPrefix in pairs( self.Filter.GroupPrefixes ) do - self:T3( { "Prefix:", string.find( MooseGroup:GetName(), GroupPrefix, 1 ), GroupPrefix } ) - if string.find( MooseGroup:GetName(), GroupPrefix, 1 ) then - MooseGroupPrefix = true - end - end - MooseGroupInclude = MooseGroupInclude and MooseGroupPrefix - end - - self:T2( MooseGroupInclude ) - return MooseGroupInclude -end - ---- SET_UNIT class --- @type SET_UNIT --- @extends Set#SET_BASE -SET_UNIT = { - ClassName = "SET_UNIT", - Units = {}, - Filter = { - Coalitions = nil, - Categories = nil, - Types = nil, - Countries = nil, - UnitPrefixes = nil, - }, - FilterMeta = { - Coalitions = { - red = coalition.side.RED, - blue = coalition.side.BLUE, - neutral = coalition.side.NEUTRAL, - }, - Categories = { - plane = Unit.Category.AIRPLANE, - helicopter = Unit.Category.HELICOPTER, - ground = Unit.Category.GROUND_UNIT, - ship = Unit.Category.SHIP, - structure = Unit.Category.STRUCTURE, - }, - }, -} - - ---- Creates a new SET_UNIT object, building a set of units belonging to a coalitions, categories, countries, types or with defined prefix names. --- @param #SET_UNIT self --- @return #SET_UNIT --- @usage --- -- Define a new SET_UNIT Object. This DBObject will contain a reference to all alive Units. --- DBObject = SET_UNIT:New() -function SET_UNIT:New() - - -- Inherits from BASE - local self = BASE:Inherit( self, SET_BASE:New( _DATABASE.UNITS ) ) - - return self -end - ---- Add UNIT(s) to SET_UNIT. --- @param Set#SET_UNIT self --- @param #string AddUnitNames A single name or an array of UNIT names. --- @return self -function SET_UNIT:AddUnitsByName( AddUnitNames ) - - local AddUnitNamesArray = ( type( AddUnitNames ) == "table" ) and AddUnitNames or { AddUnitNames } - - for AddUnitID, AddUnitName in pairs( AddUnitNamesArray ) do - self:Add( AddUnitName, UNIT:FindByName( AddUnitName ) ) - end - - return self -end - ---- Remove UNIT(s) from SET_UNIT. --- @param Set#SET_UNIT self --- @param Unit#UNIT RemoveUnitNames A single name or an array of UNIT names. --- @return self -function SET_UNIT:RemoveUnitsByName( RemoveUnitNames ) - - local RemoveUnitNamesArray = ( type( RemoveUnitNames ) == "table" ) and RemoveUnitNames or { RemoveUnitNames } - - for RemoveUnitID, RemoveUnitName in pairs( RemoveUnitNamesArray ) do - self:Remove( RemoveUnitName.UnitName ) - end - - return self -end - - ---- Finds a Unit based on the Unit Name. --- @param #SET_UNIT self --- @param #string UnitName --- @return Unit#UNIT The found Unit. -function SET_UNIT:FindUnit( UnitName ) - - local UnitFound = self.Set[UnitName] - return UnitFound -end - - - ---- Builds a set of units of coalitions. --- Possible current coalitions are red, blue and neutral. --- @param #SET_UNIT self --- @param #string Coalitions Can take the following values: "red", "blue", "neutral". --- @return #SET_UNIT self -function SET_UNIT:FilterCoalitions( Coalitions ) - if not self.Filter.Coalitions then - self.Filter.Coalitions = {} - end - if type( Coalitions ) ~= "table" then - Coalitions = { Coalitions } - end - for CoalitionID, Coalition in pairs( Coalitions ) do - self.Filter.Coalitions[Coalition] = Coalition - end - return self -end - - ---- Builds a set of units out of categories. --- Possible current categories are plane, helicopter, ground, ship. --- @param #SET_UNIT self --- @param #string Categories Can take the following values: "plane", "helicopter", "ground", "ship". --- @return #SET_UNIT self -function SET_UNIT:FilterCategories( Categories ) - if not self.Filter.Categories then - self.Filter.Categories = {} - end - if type( Categories ) ~= "table" then - Categories = { Categories } - end - for CategoryID, Category in pairs( Categories ) do - self.Filter.Categories[Category] = Category - end - return self -end - - ---- Builds a set of units of defined unit types. --- Possible current types are those types known within DCS world. --- @param #SET_UNIT self --- @param #string Types Can take those type strings known within DCS world. --- @return #SET_UNIT self -function SET_UNIT:FilterTypes( Types ) - if not self.Filter.Types then - self.Filter.Types = {} - end - if type( Types ) ~= "table" then - Types = { Types } - end - for TypeID, Type in pairs( Types ) do - self.Filter.Types[Type] = Type - end - return self -end - - ---- Builds a set of units of defined countries. --- Possible current countries are those known within DCS world. --- @param #SET_UNIT self --- @param #string Countries Can take those country strings known within DCS world. --- @return #SET_UNIT self -function SET_UNIT:FilterCountries( Countries ) - if not self.Filter.Countries then - self.Filter.Countries = {} - end - if type( Countries ) ~= "table" then - Countries = { Countries } - end - for CountryID, Country in pairs( Countries ) do - self.Filter.Countries[Country] = Country - end - return self -end - - ---- Builds a set of units of defined unit prefixes. --- All the units starting with the given prefixes will be included within the set. --- @param #SET_UNIT self --- @param #string Prefixes The prefix of which the unit name starts with. --- @return #SET_UNIT self -function SET_UNIT:FilterPrefixes( Prefixes ) - if not self.Filter.UnitPrefixes then - self.Filter.UnitPrefixes = {} - end - if type( Prefixes ) ~= "table" then - Prefixes = { Prefixes } - end - for PrefixID, Prefix in pairs( Prefixes ) do - self.Filter.UnitPrefixes[Prefix] = Prefix - end - return self -end - - - - ---- Starts the filtering. --- @param #SET_UNIT self --- @return #SET_UNIT self -function SET_UNIT:FilterStart() - - if _DATABASE then - self:_FilterStart() - end - - return self -end - ---- Handles the Database to check on an event (birth) that the Object was added in the Database. --- This is required, because sometimes the _DATABASE birth event gets called later than the SET_BASE birth event! --- @param #SET_UNIT self --- @param Event#EVENTDATA Event --- @return #string The name of the UNIT --- @return #table The UNIT -function SET_UNIT:AddInDatabase( Event ) - self:F3( { Event } ) - - if not self.Database[Event.IniDCSUnitName] then - self.Database[Event.IniDCSUnitName] = UNIT:Register( Event.IniDCSUnitName ) - self:T3( self.Database[Event.IniDCSUnitName] ) - end - - return Event.IniDCSUnitName, self.Database[Event.IniDCSUnitName] -end - ---- Handles the Database to check on any event that Object exists in the Database. --- This is required, because sometimes the _DATABASE event gets called later than the SET_BASE event or vise versa! --- @param #SET_UNIT self --- @param Event#EVENTDATA Event --- @return #string The name of the UNIT --- @return #table The UNIT -function SET_UNIT:FindInDatabase( Event ) - self:F3( { Event } ) - - return Event.IniDCSUnitName, self.Database[Event.IniDCSUnitName] -end - ---- Interate the SET_UNIT and call an interator function for each **alive** UNIT, providing the UNIT and optional parameters. --- @param #SET_UNIT self --- @param #function IteratorFunction The function that will be called when there is an alive UNIT in the SET_UNIT. The function needs to accept a UNIT parameter. --- @return #SET_UNIT self -function SET_UNIT:ForEachUnit( IteratorFunction, ... ) - self:F2( arg ) - - self:ForEach( IteratorFunction, arg, self.Set ) - - return self -end - ---- Iterate the SET_UNIT and call an iterator function for each **alive** UNIT presence completely in a @{Zone}, providing the UNIT and optional parameters to the called function. --- @param #SET_UNIT self --- @param Zone#ZONE ZoneObject The Zone to be tested for. --- @param #function IteratorFunction The function that will be called when there is an alive UNIT in the SET_UNIT. The function needs to accept a UNIT parameter. --- @return #SET_UNIT self -function SET_UNIT:ForEachUnitCompletelyInZone( ZoneObject, IteratorFunction, ... ) - self:F2( arg ) - - self:ForEach( IteratorFunction, arg, self.Set, - --- @param Zone#ZONE_BASE ZoneObject - -- @param Unit#UNIT UnitObject - function( ZoneObject, UnitObject ) - if UnitObject:IsCompletelyInZone( ZoneObject ) then - return true - else - return false - end - end, { ZoneObject } ) - - return self -end - ---- Iterate the SET_UNIT and call an iterator function for each **alive** UNIT presence not in a @{Zone}, providing the UNIT and optional parameters to the called function. --- @param #SET_UNIT self --- @param Zone#ZONE ZoneObject The Zone to be tested for. --- @param #function IteratorFunction The function that will be called when there is an alive UNIT in the SET_UNIT. The function needs to accept a UNIT parameter. --- @return #SET_UNIT self -function SET_UNIT:ForEachUnitNotInZone( ZoneObject, IteratorFunction, ... ) - self:F2( arg ) - - self:ForEach( IteratorFunction, arg, self.Set, - --- @param Zone#ZONE_BASE ZoneObject - -- @param Unit#UNIT UnitObject - function( ZoneObject, UnitObject ) - if UnitObject:IsNotInZone( ZoneObject ) then - return true - else - return false - end - end, { ZoneObject } ) - - return self -end - - - ------ Interate the SET_UNIT and call an interator function for each **alive** player, providing the Unit of the player and optional parameters. ----- @param #SET_UNIT self ----- @param #function IteratorFunction The function that will be called when there is an alive player in the SET_UNIT. The function needs to accept a UNIT parameter. ----- @return #SET_UNIT self ---function SET_UNIT:ForEachPlayer( IteratorFunction, ... ) --- self:F2( arg ) --- --- self:ForEach( IteratorFunction, arg, self.PlayersAlive ) --- --- return self ---end --- --- ------ Interate the SET_UNIT and call an interator function for each client, providing the Client to the function and optional parameters. ----- @param #SET_UNIT self ----- @param #function IteratorFunction The function that will be called when there is an alive player in the SET_UNIT. The function needs to accept a CLIENT parameter. ----- @return #SET_UNIT self ---function SET_UNIT:ForEachClient( IteratorFunction, ... ) --- self:F2( arg ) --- --- self:ForEach( IteratorFunction, arg, self.Clients ) --- --- return self ---end - - ---- --- @param #SET_UNIT self --- @param Unit#UNIT MUnit --- @return #SET_UNIT self -function SET_UNIT:IsIncludeObject( MUnit ) - self:F2( MUnit ) - local MUnitInclude = true - - if self.Filter.Coalitions then - local MUnitCoalition = false - for CoalitionID, CoalitionName in pairs( self.Filter.Coalitions ) do - self:T3( { "Coalition:", MUnit:GetCoalition(), self.FilterMeta.Coalitions[CoalitionName], CoalitionName } ) - if self.FilterMeta.Coalitions[CoalitionName] and self.FilterMeta.Coalitions[CoalitionName] == MUnit:GetCoalition() then - MUnitCoalition = true - end - end - MUnitInclude = MUnitInclude and MUnitCoalition - end - - if self.Filter.Categories then - local MUnitCategory = false - for CategoryID, CategoryName in pairs( self.Filter.Categories ) do - self:T3( { "Category:", MUnit:GetDesc().category, self.FilterMeta.Categories[CategoryName], CategoryName } ) - if self.FilterMeta.Categories[CategoryName] and self.FilterMeta.Categories[CategoryName] == MUnit:GetDesc().category then - MUnitCategory = true - end - end - MUnitInclude = MUnitInclude and MUnitCategory - end - - if self.Filter.Types then - local MUnitType = false - for TypeID, TypeName in pairs( self.Filter.Types ) do - self:T3( { "Type:", MUnit:GetTypeName(), TypeName } ) - if TypeName == MUnit:GetTypeName() then - MUnitType = true - end - end - MUnitInclude = MUnitInclude and MUnitType - end - - if self.Filter.Countries then - local MUnitCountry = false - for CountryID, CountryName in pairs( self.Filter.Countries ) do - self:T3( { "Country:", MUnit:GetCountry(), CountryName } ) - if country.id[CountryName] == MUnit:GetCountry() then - MUnitCountry = true - end - end - MUnitInclude = MUnitInclude and MUnitCountry - end - - if self.Filter.UnitPrefixes then - local MUnitPrefix = false - for UnitPrefixId, UnitPrefix in pairs( self.Filter.UnitPrefixes ) do - self:T3( { "Prefix:", string.find( MUnit:GetName(), UnitPrefix, 1 ), UnitPrefix } ) - if string.find( MUnit:GetName(), UnitPrefix, 1 ) then - MUnitPrefix = true - end - end - MUnitInclude = MUnitInclude and MUnitPrefix - end - - self:T2( MUnitInclude ) - return MUnitInclude -end - - ---- SET_CLIENT - ---- SET_CLIENT class --- @type SET_CLIENT --- @extends Set#SET_BASE -SET_CLIENT = { - ClassName = "SET_CLIENT", - Clients = {}, - Filter = { - Coalitions = nil, - Categories = nil, - Types = nil, - Countries = nil, - ClientPrefixes = nil, - }, - FilterMeta = { - Coalitions = { - red = coalition.side.RED, - blue = coalition.side.BLUE, - neutral = coalition.side.NEUTRAL, - }, - Categories = { - plane = "plane", - helicopter = "helicopter", - ground = "vehicle", - ship = "ship", - structure = "static", - }, - }, -} - - ---- Creates a new SET_CLIENT object, building a set of clients belonging to a coalitions, categories, countries, types or with defined prefix names. --- @param #SET_CLIENT self --- @return #SET_CLIENT --- @usage --- -- Define a new SET_CLIENT Object. This DBObject will contain a reference to all Clients. --- DBObject = SET_CLIENT:New() -function SET_CLIENT:New() - - -- Inherits from BASE - local self = BASE:Inherit( self, SET_BASE:New( _DATABASE.CLIENTS ) ) - - return self -end - ---- Add CLIENT(s) to SET_CLIENT. --- @param Set#SET_CLIENT self --- @param #string AddClientNames A single name or an array of CLIENT names. --- @return self -function SET_CLIENT:AddClientsByName( AddClientNames ) - - local AddClientNamesArray = ( type( AddClientNames ) == "table" ) and AddClientNames or { AddClientNames } - - for AddClientID, AddClientName in pairs( AddClientNamesArray ) do - self:Add( AddClientName, CLIENT:FindByName( AddClientName ) ) - end - - return self -end - ---- Remove CLIENT(s) from SET_CLIENT. --- @param Set#SET_CLIENT self --- @param Client#CLIENT RemoveClientNames A single name or an array of CLIENT names. --- @return self -function SET_CLIENT:RemoveClientsByName( RemoveClientNames ) - - local RemoveClientNamesArray = ( type( RemoveClientNames ) == "table" ) and RemoveClientNames or { RemoveClientNames } - - for RemoveClientID, RemoveClientName in pairs( RemoveClientNamesArray ) do - self:Remove( RemoveClientName.ClientName ) - end - - return self -end - - ---- Finds a Client based on the Client Name. --- @param #SET_CLIENT self --- @param #string ClientName --- @return Client#CLIENT The found Client. -function SET_CLIENT:FindClient( ClientName ) - - local ClientFound = self.Set[ClientName] - return ClientFound -end - - - ---- Builds a set of clients of coalitions. --- Possible current coalitions are red, blue and neutral. --- @param #SET_CLIENT self --- @param #string Coalitions Can take the following values: "red", "blue", "neutral". --- @return #SET_CLIENT self -function SET_CLIENT:FilterCoalitions( Coalitions ) - if not self.Filter.Coalitions then - self.Filter.Coalitions = {} - end - if type( Coalitions ) ~= "table" then - Coalitions = { Coalitions } - end - for CoalitionID, Coalition in pairs( Coalitions ) do - self.Filter.Coalitions[Coalition] = Coalition - end - return self -end - - ---- Builds a set of clients out of categories. --- Possible current categories are plane, helicopter, ground, ship. --- @param #SET_CLIENT self --- @param #string Categories Can take the following values: "plane", "helicopter", "ground", "ship". --- @return #SET_CLIENT self -function SET_CLIENT:FilterCategories( Categories ) - if not self.Filter.Categories then - self.Filter.Categories = {} - end - if type( Categories ) ~= "table" then - Categories = { Categories } - end - for CategoryID, Category in pairs( Categories ) do - self.Filter.Categories[Category] = Category - end - return self -end - - ---- Builds a set of clients of defined client types. --- Possible current types are those types known within DCS world. --- @param #SET_CLIENT self --- @param #string Types Can take those type strings known within DCS world. --- @return #SET_CLIENT self -function SET_CLIENT:FilterTypes( Types ) - if not self.Filter.Types then - self.Filter.Types = {} - end - if type( Types ) ~= "table" then - Types = { Types } - end - for TypeID, Type in pairs( Types ) do - self.Filter.Types[Type] = Type - end - return self -end - - ---- Builds a set of clients of defined countries. --- Possible current countries are those known within DCS world. --- @param #SET_CLIENT self --- @param #string Countries Can take those country strings known within DCS world. --- @return #SET_CLIENT self -function SET_CLIENT:FilterCountries( Countries ) - if not self.Filter.Countries then - self.Filter.Countries = {} - end - if type( Countries ) ~= "table" then - Countries = { Countries } - end - for CountryID, Country in pairs( Countries ) do - self.Filter.Countries[Country] = Country - end - return self -end - - ---- Builds a set of clients of defined client prefixes. --- All the clients starting with the given prefixes will be included within the set. --- @param #SET_CLIENT self --- @param #string Prefixes The prefix of which the client name starts with. --- @return #SET_CLIENT self -function SET_CLIENT:FilterPrefixes( Prefixes ) - if not self.Filter.ClientPrefixes then - self.Filter.ClientPrefixes = {} - end - if type( Prefixes ) ~= "table" then - Prefixes = { Prefixes } - end - for PrefixID, Prefix in pairs( Prefixes ) do - self.Filter.ClientPrefixes[Prefix] = Prefix - end - return self -end - - - - ---- Starts the filtering. --- @param #SET_CLIENT self --- @return #SET_CLIENT self -function SET_CLIENT:FilterStart() - - if _DATABASE then - self:_FilterStart() - end - - return self -end - ---- Handles the Database to check on an event (birth) that the Object was added in the Database. --- This is required, because sometimes the _DATABASE birth event gets called later than the SET_BASE birth event! --- @param #SET_CLIENT self --- @param Event#EVENTDATA Event --- @return #string The name of the CLIENT --- @return #table The CLIENT -function SET_CLIENT:AddInDatabase( Event ) - self:F3( { Event } ) - - return Event.IniDCSUnitName, self.Database[Event.IniDCSUnitName] -end - ---- Handles the Database to check on any event that Object exists in the Database. --- This is required, because sometimes the _DATABASE event gets called later than the SET_BASE event or vise versa! --- @param #SET_CLIENT self --- @param Event#EVENTDATA Event --- @return #string The name of the CLIENT --- @return #table The CLIENT -function SET_CLIENT:FindInDatabase( Event ) - self:F3( { Event } ) - - return Event.IniDCSUnitName, self.Database[Event.IniDCSUnitName] -end - ---- Interate the SET_CLIENT and call an interator function for each **alive** CLIENT, providing the CLIENT and optional parameters. --- @param #SET_CLIENT self --- @param #function IteratorFunction The function that will be called when there is an alive CLIENT in the SET_CLIENT. The function needs to accept a CLIENT parameter. --- @return #SET_CLIENT self -function SET_CLIENT:ForEachClient( IteratorFunction, ... ) - self:F2( arg ) - - self:ForEach( IteratorFunction, arg, self.Set ) - - return self -end - ---- Iterate the SET_CLIENT and call an iterator function for each **alive** CLIENT presence completely in a @{Zone}, providing the CLIENT and optional parameters to the called function. --- @param #SET_CLIENT self --- @param Zone#ZONE ZoneObject The Zone to be tested for. --- @param #function IteratorFunction The function that will be called when there is an alive CLIENT in the SET_CLIENT. The function needs to accept a CLIENT parameter. --- @return #SET_CLIENT self -function SET_CLIENT:ForEachClientCompletelyInZone( ZoneObject, IteratorFunction, ... ) - self:F2( arg ) - - self:ForEach( IteratorFunction, arg, self.Set, - --- @param Zone#ZONE_BASE ZoneObject - -- @param Client#CLIENT ClientObject - function( ZoneObject, ClientObject ) - if ClientObject:IsCompletelyInZone( ZoneObject ) then - return true - else - return false - end - end, { ZoneObject } ) - - return self -end - ---- Iterate the SET_CLIENT and call an iterator function for each **alive** CLIENT presence not in a @{Zone}, providing the CLIENT and optional parameters to the called function. --- @param #SET_CLIENT self --- @param Zone#ZONE ZoneObject The Zone to be tested for. --- @param #function IteratorFunction The function that will be called when there is an alive CLIENT in the SET_CLIENT. The function needs to accept a CLIENT parameter. --- @return #SET_CLIENT self -function SET_CLIENT:ForEachClientNotInZone( ZoneObject, IteratorFunction, ... ) - self:F2( arg ) - - self:ForEach( IteratorFunction, arg, self.Set, - --- @param Zone#ZONE_BASE ZoneObject - -- @param Client#CLIENT ClientObject - function( ZoneObject, ClientObject ) - if ClientObject:IsNotInZone( ZoneObject ) then - return true - else - return false - end - end, { ZoneObject } ) - - return self -end - ---- --- @param #SET_CLIENT self --- @param Client#CLIENT MClient --- @return #SET_CLIENT self -function SET_CLIENT:IsIncludeObject( MClient ) - self:F2( MClient ) - - local MClientInclude = true - - if MClient then - local MClientName = MClient.UnitName - - if self.Filter.Coalitions then - local MClientCoalition = false - for CoalitionID, CoalitionName in pairs( self.Filter.Coalitions ) do - local ClientCoalitionName = _DATABASE.Templates.ClientsByName[MClientName].CoalitionName - self:T3( { "Coalition:", ClientCoalitionName, self.FilterMeta.Coalitions[CoalitionName], CoalitionName } ) - if self.FilterMeta.Coalitions[CoalitionName] and self.FilterMeta.Coalitions[CoalitionName] == ClientCoalitionName then - MClientCoalition = true - end - end - self:T( { "Evaluated Coalition", MClientCoalition } ) - MClientInclude = MClientInclude and MClientCoalition - end - - if self.Filter.Categories then - local MClientCategory = false - for CategoryID, CategoryName in pairs( self.Filter.Categories ) do - local ClientCategoryName = _DATABASE.Templates.ClientsByName[MClientName].CategoryName - self:T3( { "Category:", ClientCategoryName, self.FilterMeta.Categories[CategoryName], CategoryName } ) - if self.FilterMeta.Categories[CategoryName] and self.FilterMeta.Categories[CategoryName] == ClientCategoryName then - MClientCategory = true - end - end - self:T( { "Evaluated Category", MClientCategory } ) - MClientInclude = MClientInclude and MClientCategory - end - - if self.Filter.Types then - local MClientType = false - for TypeID, TypeName in pairs( self.Filter.Types ) do - self:T3( { "Type:", MClient:GetTypeName(), TypeName } ) - if TypeName == MClient:GetTypeName() then - MClientType = true - end - end - self:T( { "Evaluated Type", MClientType } ) - MClientInclude = MClientInclude and MClientType - end - - if self.Filter.Countries then - local MClientCountry = false - for CountryID, CountryName in pairs( self.Filter.Countries ) do - local ClientCountryName = _DATABASE.Templates.ClientsByName[MClientName].CountryName - self:T3( { "Country:", ClientCountryName, country.id[CountryName], CountryName } ) - if country.id[CountryName] and country.id[ClientCountryName] and country.id[CountryName] == country.id[ClientCountryName] then - MClientCountry = true - end - end - self:T( { "Evaluated Country", MClientCountry } ) - MClientInclude = MClientInclude and MClientCountry - end - - if self.Filter.ClientPrefixes then - local MClientPrefix = false - for ClientPrefixId, ClientPrefix in pairs( self.Filter.ClientPrefixes ) do - self:T3( { "Prefix:", string.find( MClient.UnitName, ClientPrefix, 1 ), ClientPrefix } ) - if string.find( MClient.UnitName, ClientPrefix, 1 ) then - MClientPrefix = true - end - end - self:T( { "Evaluated Prefix", MClientPrefix } ) - MClientInclude = MClientInclude and MClientPrefix - end - end - - self:T2( MClientInclude ) - return MClientInclude -end - ---- This module contains the POINT classes. --- --- 1) @{Point#POINT_VEC3} class, extends @{Base#BASE} --- =============================================== --- The @{Point#POINT_VEC3} class defines a 3D point in the simulator. --- --- 1.1) POINT_VEC3 constructor --- --------------------------- --- --- A new POINT instance can be created with: --- --- * @{#POINT_VEC3.New}(): a 3D point. --- --- 2) @{Point#POINT_VEC2} class, extends @{Point#POINT_VEC3} --- ========================================================= --- The @{Point#POINT_VEC2} class defines a 2D point in the simulator. The height coordinate (if needed) will be the land height + an optional added height specified. --- --- 2.1) POINT_VEC2 constructor --- --------------------------- --- --- A new POINT instance can be created with: --- --- * @{#POINT_VEC2.New}(): a 2D point. --- --- @module Point --- @author FlightControl - ---- The POINT_VEC3 class --- @type POINT_VEC3 --- @extends Base#BASE --- @field #POINT_VEC3.SmokeColor SmokeColor --- @field #POINT_VEC3.FlareColor FlareColor -POINT_VEC3 = { - ClassName = "POINT_VEC3", - SmokeColor = { - Green = trigger.smokeColor.Green, - Red = trigger.smokeColor.Red, - White = trigger.smokeColor.White, - Orange = trigger.smokeColor.Orange, - Blue = trigger.smokeColor.Blue - }, - FlareColor = { - Green = trigger.flareColor.Green, - Red = trigger.flareColor.Red, - White = trigger.flareColor.White, - Yellow = trigger.flareColor.Yellow - }, - } - ---- SmokeColor --- @type POINT_VEC3.SmokeColor --- @field Green --- @field Red --- @field White --- @field Orange --- @field Blue - ---- FlareColor --- @type POINT_VEC3.FlareColor --- @field Green --- @field Red --- @field White --- @field Yellow - --- Constructor. - ---- Create a new POINT_VEC3 object. --- @param #POINT_VEC3 self --- @param DCSTypes#Distance x The x coordinate of the Vec3 point, pointing to the North. --- @param DCSTypes#Distance y The y coordinate of the Vec3 point, pointing Upwards. --- @param DCSTypes#Distance z The z coordinate of the Vec3 point, pointing to the Right. --- @return Point#POINT_VEC3 -function POINT_VEC3:New( x, y, z ) - - local self = BASE:Inherit( self, BASE:New() ) - self:F2( { x, y, z } ) - self.PointVec3 = { x = x, y = y, z = z } - return self -end - ---- Smokes the point in a color. --- @param #POINT_VEC3 self --- @param Point#POINT_VEC3.SmokeColor SmokeColor -function POINT_VEC3:Smoke( SmokeColor ) - self:F2( { SmokeColor, self.PointVec3 } ) - trigger.action.smoke( self.PointVec3, SmokeColor ) -end - ---- Smoke the POINT_VEC3 Green. --- @param #POINT_VEC3 self -function POINT_VEC3:SmokeGreen() - self:F2() - self:Smoke( POINT_VEC3.SmokeColor.Green ) -end - ---- Smoke the POINT_VEC3 Red. --- @param #POINT_VEC3 self -function POINT_VEC3:SmokeRed() - self:F2() - self:Smoke( POINT_VEC3.SmokeColor.Red ) -end - ---- Smoke the POINT_VEC3 White. --- @param #POINT_VEC3 self -function POINT_VEC3:SmokeWhite() - self:F2() - self:Smoke( POINT_VEC3.SmokeColor.White ) -end - ---- Smoke the POINT_VEC3 Orange. --- @param #POINT_VEC3 self -function POINT_VEC3:SmokeOrange() - self:F2() - self:Smoke( POINT_VEC3.SmokeColor.Orange ) -end - ---- Smoke the POINT_VEC3 Blue. --- @param #POINT_VEC3 self -function POINT_VEC3:SmokeBlue() - self:F2() - self:Smoke( POINT_VEC3.SmokeColor.Blue ) -end - ---- Flares the point in a color. --- @param #POINT_VEC3 self --- @param Point#POINT_VEC3.FlareColor --- @param DCSTypes#Azimuth (optional) Azimuth The azimuth of the flare direction. The default azimuth is 0. -function POINT_VEC3:Flare( FlareColor, Azimuth ) - self:F2( { FlareColor, self.PointVec3 } ) - trigger.action.signalFlare( self.PointVec3, FlareColor, Azimuth and Azimuth or 0 ) -end - ---- Flare the POINT_VEC3 White. --- @param #POINT_VEC3 self --- @param DCSTypes#Azimuth (optional) Azimuth The azimuth of the flare direction. The default azimuth is 0. -function POINT_VEC3:FlareWhite( Azimuth ) - self:F2( Azimuth ) - self:Flare( POINT_VEC3.FlareColor.White, Azimuth ) -end - ---- Flare the POINT_VEC3 Yellow. --- @param #POINT_VEC3 self --- @param DCSTypes#Azimuth (optional) Azimuth The azimuth of the flare direction. The default azimuth is 0. -function POINT_VEC3:FlareYellow( Azimuth ) - self:F2( Azimuth ) - self:Flare( POINT_VEC3.FlareColor.Yellow, Azimuth ) -end - ---- Flare the POINT_VEC3 Green. --- @param #POINT_VEC3 self --- @param DCSTypes#Azimuth (optional) Azimuth The azimuth of the flare direction. The default azimuth is 0. -function POINT_VEC3:FlareGreen( Azimuth ) - self:F2( Azimuth ) - self:Flare( POINT_VEC3.FlareColor.Green, Azimuth ) -end - ---- Flare the POINT_VEC3 Red. --- @param #POINT_VEC3 self -function POINT_VEC3:FlareRed( Azimuth ) - self:F2( Azimuth ) - self:Flare( POINT_VEC3.FlareColor.Red, Azimuth ) -end - - ---- The POINT_VEC2 class --- @type POINT_VEC2 --- @extends Point#POINT_VEC3 -POINT_VEC2 = { - ClassName = "POINT_VEC2", - } - ---- Create a new POINT_VEC2 object. --- @param #POINT_VEC2 self --- @param DCSTypes#Distance x The x coordinate of the Vec3 point, pointing to the North. --- @param DCSTypes#Distance y The y coordinate of the Vec3 point, pointing to the Right. --- @param DCSTypes#Distance LandHeightAdd (optional) The default height if required to be evaluated will be the land height of the x, y coordinate. You can specify an extra height to be added to the land height. --- @return Point#POINT_VEC2 -function POINT_VEC2:New( x, y, LandHeightAdd ) - - local LandHeight = land.getHeight( { ["x"] = x, ["y"] = y } ) - if LandHeightAdd then - LandHeight = LandHeight + LandHeightAdd - end - - local self = BASE:Inherit( self, POINT_VEC3:New( x, LandHeight, y ) ) - self:F2( { x, y, LandHeightAdd } ) - - return self -end - - ---- The main include file for the MOOSE system. - -Include.File( "Routines" ) -Include.File( "Base" ) -Include.File( "Scheduler" ) -Include.File( "Event" ) -Include.File( "Menu" ) -Include.File( "Group" ) -Include.File( "Unit" ) -Include.File( "Zone" ) -Include.File( "Client" ) -Include.File( "Static" ) -Include.File( "Database" ) -Include.File( "Set" ) -Include.File( "Point" ) Include.File( "Moose" ) -Include.File( "Scoring" ) -Include.File( "Cargo" ) -Include.File( "Message" ) -Include.File( "Stage" ) -Include.File( "Task" ) -Include.File( "GoHomeTask" ) -Include.File( "DestroyBaseTask" ) -Include.File( "DestroyGroupsTask" ) -Include.File( "DestroyRadarsTask" ) -Include.File( "DestroyUnitTypesTask" ) -Include.File( "PickupTask" ) -Include.File( "DeployTask" ) -Include.File( "NoTask" ) -Include.File( "RouteTask" ) -Include.File( "Mission" ) -Include.File( "CleanUp" ) -Include.File( "Spawn" ) -Include.File( "Movement" ) -Include.File( "Sead" ) -Include.File( "Escort" ) -Include.File( "MissileTrainer" ) -Include.File( "AIBalancer" ) - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - --- The order of the declarations is important here. Don't touch it. - ---- Declare the event dispatcher based on the EVENT class -_EVENTDISPATCHER = EVENT:New() -- #EVENT - ---- Declare the main database object, which is used internally by the MOOSE classes. -_DATABASE = DATABASE:New() -- Database#DATABASE - ---- Scoring system for MOOSE. --- This scoring class calculates the hits and kills that players make within a simulation session. --- Scoring is calculated using a defined algorithm. --- With a small change in MissionScripting.lua, the scoring can also be logged in a CSV file, that can then be uploaded --- to a database or a BI tool to publish the scoring results to the player community. --- @module Scoring --- @author FlightControl - - ---- The Scoring class --- @type SCORING --- @field Players A collection of the current players that have joined the game. --- @extends Base#BASE -SCORING = { - ClassName = "SCORING", - ClassID = 0, - Players = {}, -} - -local _SCORINGCoalition = - { - [1] = "Red", - [2] = "Blue", - } - -local _SCORINGCategory = - { - [Unit.Category.AIRPLANE] = "Plane", - [Unit.Category.HELICOPTER] = "Helicopter", - [Unit.Category.GROUND_UNIT] = "Vehicle", - [Unit.Category.SHIP] = "Ship", - [Unit.Category.STRUCTURE] = "Structure", - } - ---- Creates a new SCORING object to administer the scoring achieved by players. --- @param #SCORING self --- @param #string GameName The name of the game. This name is also logged in the CSV score file. --- @return #SCORING self --- @usage --- -- Define a new scoring object for the mission Gori Valley. --- ScoringObject = SCORING:New( "Gori Valley" ) -function SCORING:New( GameName ) - - -- Inherits from BASE - local self = BASE:Inherit( self, BASE:New() ) - - if GameName then - self.GameName = GameName - else - error( "A game name must be given to register the scoring results" ) - end - - - _EVENTDISPATCHER:OnDead( self._EventOnDeadOrCrash, self ) - _EVENTDISPATCHER:OnCrash( self._EventOnDeadOrCrash, self ) - _EVENTDISPATCHER:OnHit( self._EventOnHit, self ) - - --self.SchedulerId = routines.scheduleFunction( SCORING._FollowPlayersScheduled, { self }, 0, 5 ) - self.SchedulerId = SCHEDULER:New( self, self._FollowPlayersScheduled, {}, 0, 5 ) - - self:ScoreMenu() - - return self - -end - ---- Creates a score radio menu. Can be accessed using Radio -> F10. --- @param #SCORING self --- @return #SCORING self -function SCORING:ScoreMenu() - self.Menu = SUBMENU:New( 'Scoring' ) - self.AllScoresMenu = COMMANDMENU:New( 'Score All Active Players', self.Menu, SCORING.ReportScoreAll, self ) - --- = COMMANDMENU:New('Your Current Score', ReportScore, SCORING.ReportScorePlayer, self ) - return self -end - ---- Follows new players entering Clients within the DCSRTE. --- TODO: Need to see if i can catch this also with an event. It will eliminate the schedule ... -function SCORING:_FollowPlayersScheduled() - self:F3( "_FollowPlayersScheduled" ) - - local ClientUnit = 0 - local CoalitionsData = { AlivePlayersRed = coalition.getPlayers(coalition.side.RED), AlivePlayersBlue = coalition.getPlayers(coalition.side.BLUE) } - local unitId - local unitData - local AlivePlayerUnits = {} - - for CoalitionId, CoalitionData in pairs( CoalitionsData ) do - self:T3( { "_FollowPlayersScheduled", CoalitionData } ) - for UnitId, UnitData in pairs( CoalitionData ) do - self:_AddPlayerFromUnit( UnitData ) - end - end - - return true -end - - ---- Track DEAD or CRASH events for the scoring. --- @param #SCORING self --- @param Event#EVENTDATA Event -function SCORING:_EventOnDeadOrCrash( Event ) - self:F( { Event } ) - - local TargetUnit = nil - local TargetGroup = nil - local TargetUnitName = "" - local TargetGroupName = "" - local TargetPlayerName = "" - local TargetCoalition = nil - local TargetCategory = nil - local TargetType = nil - local TargetUnitCoalition = nil - local TargetUnitCategory = nil - local TargetUnitType = nil - - if Event.IniDCSUnit then - - TargetUnit = Event.IniDCSUnit - TargetUnitName = Event.IniDCSUnitName - TargetGroup = Event.IniDCSGroup - TargetGroupName = Event.IniDCSGroupName - TargetPlayerName = TargetUnit:getPlayerName() - - TargetCoalition = TargetUnit:getCoalition() - --TargetCategory = TargetUnit:getCategory() - TargetCategory = TargetUnit:getDesc().category -- Workaround - TargetType = TargetUnit:getTypeName() - - TargetUnitCoalition = _SCORINGCoalition[TargetCoalition] - TargetUnitCategory = _SCORINGCategory[TargetCategory] - TargetUnitType = TargetType - - self:T( { TargetUnitName, TargetGroupName, TargetPlayerName, TargetCoalition, TargetCategory, TargetType } ) - end - - for PlayerName, PlayerData in pairs( self.Players ) do - if PlayerData then -- This should normally not happen, but i'll test it anyway. - self:T( "Something got killed" ) - - -- Some variables - local InitUnitName = PlayerData.UnitName - local InitUnitType = PlayerData.UnitType - local InitCoalition = PlayerData.UnitCoalition - local InitCategory = PlayerData.UnitCategory - local InitUnitCoalition = _SCORINGCoalition[InitCoalition] - local InitUnitCategory = _SCORINGCategory[InitCategory] - - self:T( { InitUnitName, InitUnitType, InitUnitCoalition, InitCoalition, InitUnitCategory, InitCategory } ) - - -- What is he hitting? - if TargetCategory then - if PlayerData and PlayerData.Hit and PlayerData.Hit[TargetCategory] and PlayerData.Hit[TargetCategory][TargetUnitName] then -- Was there a hit for this unit for this player before registered??? - if not PlayerData.Kill[TargetCategory] then - PlayerData.Kill[TargetCategory] = {} - end - if not PlayerData.Kill[TargetCategory][TargetType] then - PlayerData.Kill[TargetCategory][TargetType] = {} - PlayerData.Kill[TargetCategory][TargetType].Score = 0 - PlayerData.Kill[TargetCategory][TargetType].ScoreKill = 0 - PlayerData.Kill[TargetCategory][TargetType].Penalty = 0 - PlayerData.Kill[TargetCategory][TargetType].PenaltyKill = 0 - end - - if InitCoalition == TargetCoalition then - PlayerData.Penalty = PlayerData.Penalty + 25 - PlayerData.Kill[TargetCategory][TargetType].Penalty = PlayerData.Kill[TargetCategory][TargetType].Penalty + 25 - PlayerData.Kill[TargetCategory][TargetType].PenaltyKill = PlayerData.Kill[TargetCategory][TargetType].PenaltyKill + 1 - MESSAGE:New( "Player '" .. PlayerName .. "' killed a friendly " .. TargetUnitCategory .. " ( " .. TargetType .. " ) " .. - PlayerData.Kill[TargetCategory][TargetType].PenaltyKill .. " times. Penalty: -" .. PlayerData.Kill[TargetCategory][TargetType].Penalty .. - ". Score Total:" .. PlayerData.Score - PlayerData.Penalty, - 5 ):ToAll() - self:ScoreCSV( PlayerName, "KILL_PENALTY", 1, -125, InitUnitName, InitUnitCoalition, InitUnitCategory, InitUnitType, TargetUnitName, TargetUnitCoalition, TargetUnitCategory, TargetUnitType ) - else - PlayerData.Score = PlayerData.Score + 10 - PlayerData.Kill[TargetCategory][TargetType].Score = PlayerData.Kill[TargetCategory][TargetType].Score + 10 - PlayerData.Kill[TargetCategory][TargetType].ScoreKill = PlayerData.Kill[TargetCategory][TargetType].ScoreKill + 1 - MESSAGE:New( "Player '" .. PlayerName .. "' killed an enemy " .. TargetUnitCategory .. " ( " .. TargetType .. " ) " .. - PlayerData.Kill[TargetCategory][TargetType].ScoreKill .. " times. Score: " .. PlayerData.Kill[TargetCategory][TargetType].Score .. - ". Score Total:" .. PlayerData.Score - PlayerData.Penalty, - 5 ):ToAll() - self:ScoreCSV( PlayerName, "KILL_SCORE", 1, 10, InitUnitName, InitUnitCoalition, InitUnitCategory, InitUnitType, TargetUnitName, TargetUnitCoalition, TargetUnitCategory, TargetUnitType ) - end - end - end - end - end -end - - - ---- Add a new player entering a Unit. -function SCORING:_AddPlayerFromUnit( UnitData ) - self:F( UnitData ) - - if UnitData and UnitData:isExist() then - local UnitName = UnitData:getName() - local PlayerName = UnitData:getPlayerName() - local UnitDesc = UnitData:getDesc() - local UnitCategory = UnitDesc.category - local UnitCoalition = UnitData:getCoalition() - local UnitTypeName = UnitData:getTypeName() - - self:T( { PlayerName, UnitName, UnitCategory, UnitCoalition, UnitTypeName } ) - - if self.Players[PlayerName] == nil then -- I believe this is the place where a Player gets a life in a mission when he enters a unit ... - self.Players[PlayerName] = {} - self.Players[PlayerName].Hit = {} - self.Players[PlayerName].Kill = {} - self.Players[PlayerName].Mission = {} - - -- for CategoryID, CategoryName in pairs( SCORINGCategory ) do - -- self.Players[PlayerName].Hit[CategoryID] = {} - -- self.Players[PlayerName].Kill[CategoryID] = {} - -- end - self.Players[PlayerName].HitPlayers = {} - self.Players[PlayerName].HitUnits = {} - self.Players[PlayerName].Score = 0 - self.Players[PlayerName].Penalty = 0 - self.Players[PlayerName].PenaltyCoalition = 0 - self.Players[PlayerName].PenaltyWarning = 0 - end - - if not self.Players[PlayerName].UnitCoalition then - self.Players[PlayerName].UnitCoalition = UnitCoalition - else - if self.Players[PlayerName].UnitCoalition ~= UnitCoalition then - self.Players[PlayerName].Penalty = self.Players[PlayerName].Penalty + 50 - self.Players[PlayerName].PenaltyCoalition = self.Players[PlayerName].PenaltyCoalition + 1 - MESSAGE:New( "Player '" .. PlayerName .. "' changed coalition from " .. _SCORINGCoalition[self.Players[PlayerName].UnitCoalition] .. " to " .. _SCORINGCoalition[UnitCoalition] .. - "(changed " .. self.Players[PlayerName].PenaltyCoalition .. " times the coalition). 50 Penalty points added.", - 2 - ):ToAll() - self:ScoreCSV( PlayerName, "COALITION_PENALTY", 1, -50, self.Players[PlayerName].UnitName, _SCORINGCoalition[self.Players[PlayerName].UnitCoalition], _SCORINGCategory[self.Players[PlayerName].UnitCategory], self.Players[PlayerName].UnitType, - UnitName, _SCORINGCoalition[UnitCoalition], _SCORINGCategory[UnitCategory], UnitData:getTypeName() ) - end - end - self.Players[PlayerName].UnitName = UnitName - self.Players[PlayerName].UnitCoalition = UnitCoalition - self.Players[PlayerName].UnitCategory = UnitCategory - self.Players[PlayerName].UnitType = UnitTypeName - - if self.Players[PlayerName].Penalty > 100 then - if self.Players[PlayerName].PenaltyWarning < 1 then - MESSAGE:New( "Player '" .. PlayerName .. "': WARNING! If you continue to commit FRATRICIDE and have a PENALTY score higher than 150, you will be COURT MARTIALED and DISMISSED from this mission! \nYour total penalty is: " .. self.Players[PlayerName].Penalty, - 30 - ):ToAll() - self.Players[PlayerName].PenaltyWarning = self.Players[PlayerName].PenaltyWarning + 1 - end - end - - if self.Players[PlayerName].Penalty > 150 then - ClientGroup = GROUP:NewFromDCSUnit( UnitData ) - ClientGroup:Destroy() - MESSAGE:New( "Player '" .. PlayerName .. "' committed FRATRICIDE, he will be COURT MARTIALED and is DISMISSED from this mission!", - 10 - ):ToAll() - end - - end -end - - ---- Registers Scores the players completing a Mission Task. -function SCORING:_AddMissionTaskScore( PlayerUnit, MissionName, Score ) - self:F( { PlayerUnit, MissionName, Score } ) - - local PlayerName = PlayerUnit:getPlayerName() - - if not self.Players[PlayerName].Mission[MissionName] then - self.Players[PlayerName].Mission[MissionName] = {} - self.Players[PlayerName].Mission[MissionName].ScoreTask = 0 - self.Players[PlayerName].Mission[MissionName].ScoreMission = 0 - end - - self:T( PlayerName ) - self:T( self.Players[PlayerName].Mission[MissionName] ) - - self.Players[PlayerName].Score = self.Players[PlayerName].Score + Score - self.Players[PlayerName].Mission[MissionName].ScoreTask = self.Players[PlayerName].Mission[MissionName].ScoreTask + Score - - MESSAGE:New( "Player '" .. PlayerName .. "' has finished another Task in Mission '" .. MissionName .. "'. " .. - Score .. " Score points added.", - 20 ):ToAll() - - self:ScoreCSV( PlayerName, "TASK_" .. MissionName:gsub( ' ', '_' ), 1, Score, PlayerUnit:getName() ) -end - - ---- Registers Mission Scores for possible multiple players that contributed in the Mission. -function SCORING:_AddMissionScore( MissionName, Score ) - self:F( { MissionName, Score } ) - - for PlayerName, PlayerData in pairs( self.Players ) do - - if PlayerData.Mission[MissionName] then - PlayerData.Score = PlayerData.Score + Score - PlayerData.Mission[MissionName].ScoreMission = PlayerData.Mission[MissionName].ScoreMission + Score - MESSAGE:New( "Player '" .. PlayerName .. "' has finished Mission '" .. MissionName .. "'. " .. - Score .. " Score points added.", - 20 ):ToAll() - self:ScoreCSV( PlayerName, "MISSION_" .. MissionName:gsub( ' ', '_' ), 1, Score ) - end - end -end - ---- Handles the OnHit event for the scoring. --- @param #SCORING self --- @param Event#EVENTDATA Event -function SCORING:_EventOnHit( Event ) - self:F( { Event } ) - - local InitUnit = nil - local InitUnitName = "" - local InitGroup = nil - local InitGroupName = "" - local InitPlayerName = nil - - local InitCoalition = nil - local InitCategory = nil - local InitType = nil - local InitUnitCoalition = nil - local InitUnitCategory = nil - local InitUnitType = nil - - local TargetUnit = nil - local TargetUnitName = "" - local TargetGroup = nil - local TargetGroupName = "" - local TargetPlayerName = "" - - local TargetCoalition = nil - local TargetCategory = nil - local TargetType = nil - local TargetUnitCoalition = nil - local TargetUnitCategory = nil - local TargetUnitType = nil - - if Event.IniDCSUnit then - - InitUnit = Event.IniDCSUnit - InitUnitName = Event.IniDCSUnitName - InitGroup = Event.IniDCSGroup - InitGroupName = Event.IniDCSGroupName - InitPlayerName = InitUnit:getPlayerName() - - InitCoalition = InitUnit:getCoalition() - --TODO: Workaround Client DCS Bug - --InitCategory = InitUnit:getCategory() - InitCategory = InitUnit:getDesc().category - InitType = InitUnit:getTypeName() - - InitUnitCoalition = _SCORINGCoalition[InitCoalition] - InitUnitCategory = _SCORINGCategory[InitCategory] - InitUnitType = InitType - - self:T( { InitUnitName, InitGroupName, InitPlayerName, InitCoalition, InitCategory, InitType , InitUnitCoalition, InitUnitCategory, InitUnitType } ) - end - - - if Event.TgtDCSUnit then - - TargetUnit = Event.TgtDCSUnit - TargetUnitName = Event.TgtDCSUnitName - TargetGroup = Event.TgtDCSGroup - TargetGroupName = Event.TgtDCSGroupName - TargetPlayerName = TargetUnit:getPlayerName() - - TargetCoalition = TargetUnit:getCoalition() - --TODO: Workaround Client DCS Bug - --TargetCategory = TargetUnit:getCategory() - TargetCategory = TargetUnit:getDesc().category - TargetType = TargetUnit:getTypeName() - - TargetUnitCoalition = _SCORINGCoalition[TargetCoalition] - TargetUnitCategory = _SCORINGCategory[TargetCategory] - TargetUnitType = TargetType - - self:T( { TargetUnitName, TargetGroupName, TargetPlayerName, TargetCoalition, TargetCategory, TargetType, TargetUnitCoalition, TargetUnitCategory, TargetUnitType } ) - end - - if InitPlayerName ~= nil then -- It is a player that is hitting something - self:_AddPlayerFromUnit( InitUnit ) - if self.Players[InitPlayerName] then -- This should normally not happen, but i'll test it anyway. - if TargetPlayerName ~= nil then -- It is a player hitting another player ... - self:_AddPlayerFromUnit( TargetUnit ) - self.Players[InitPlayerName].HitPlayers = self.Players[InitPlayerName].HitPlayers + 1 - end - - self:T( "Hitting Something" ) - -- What is he hitting? - if TargetCategory then - if not self.Players[InitPlayerName].Hit[TargetCategory] then - self.Players[InitPlayerName].Hit[TargetCategory] = {} - end - if not self.Players[InitPlayerName].Hit[TargetCategory][TargetUnitName] then - self.Players[InitPlayerName].Hit[TargetCategory][TargetUnitName] = {} - self.Players[InitPlayerName].Hit[TargetCategory][TargetUnitName].Score = 0 - self.Players[InitPlayerName].Hit[TargetCategory][TargetUnitName].Penalty = 0 - self.Players[InitPlayerName].Hit[TargetCategory][TargetUnitName].ScoreHit = 0 - self.Players[InitPlayerName].Hit[TargetCategory][TargetUnitName].PenaltyHit = 0 - end - local Score = 0 - if InitCoalition == TargetCoalition then - self.Players[InitPlayerName].Penalty = self.Players[InitPlayerName].Penalty + 10 - self.Players[InitPlayerName].Hit[TargetCategory][TargetUnitName].Penalty = self.Players[InitPlayerName].Hit[TargetCategory][TargetUnitName].Penalty + 10 - self.Players[InitPlayerName].Hit[TargetCategory][TargetUnitName].PenaltyHit = self.Players[InitPlayerName].Hit[TargetCategory][TargetUnitName].PenaltyHit + 1 - MESSAGE:New( "Player '" .. InitPlayerName .. "' hit a friendly " .. TargetUnitCategory .. " ( " .. TargetType .. " ) " .. - self.Players[InitPlayerName].Hit[TargetCategory][TargetUnitName].PenaltyHit .. " times. Penalty: -" .. self.Players[InitPlayerName].Hit[TargetCategory][TargetUnitName].Penalty .. - ". Score Total:" .. self.Players[InitPlayerName].Score - self.Players[InitPlayerName].Penalty, - 2 - ):ToAll() - self:ScoreCSV( InitPlayerName, "HIT_PENALTY", 1, -25, InitUnitName, InitUnitCoalition, InitUnitCategory, InitUnitType, TargetUnitName, TargetUnitCoalition, TargetUnitCategory, TargetUnitType ) - else - self.Players[InitPlayerName].Score = self.Players[InitPlayerName].Score + 10 - self.Players[InitPlayerName].Hit[TargetCategory][TargetUnitName].Score = self.Players[InitPlayerName].Hit[TargetCategory][TargetUnitName].Score + 1 - self.Players[InitPlayerName].Hit[TargetCategory][TargetUnitName].ScoreHit = self.Players[InitPlayerName].Hit[TargetCategory][TargetUnitName].ScoreHit + 1 - MESSAGE:New( "Player '" .. InitPlayerName .. "' hit a target " .. TargetUnitCategory .. " ( " .. TargetType .. " ) " .. - self.Players[InitPlayerName].Hit[TargetCategory][TargetUnitName].ScoreHit .. " times. Score: " .. self.Players[InitPlayerName].Hit[TargetCategory][TargetUnitName].Score .. - ". Score Total:" .. self.Players[InitPlayerName].Score - self.Players[InitPlayerName].Penalty, - 2 - ):ToAll() - self:ScoreCSV( InitPlayerName, "HIT_SCORE", 1, 1, InitUnitName, InitUnitCoalition, InitUnitCategory, InitUnitType, TargetUnitName, TargetUnitCoalition, TargetUnitCategory, TargetUnitType ) - end - end - end - elseif InitPlayerName == nil then -- It is an AI hitting a player??? - - end -end - - -function SCORING:ReportScoreAll() - - env.info( "Hello World " ) - - local ScoreMessage = "" - local PlayerMessage = "" - - self:T( "Score Report" ) - - for PlayerName, PlayerData in pairs( self.Players ) do - if PlayerData then -- This should normally not happen, but i'll test it anyway. - self:T( "Score Player: " .. PlayerName ) - - -- Some variables - local InitUnitCoalition = _SCORINGCoalition[PlayerData.UnitCoalition] - local InitUnitCategory = _SCORINGCategory[PlayerData.UnitCategory] - local InitUnitType = PlayerData.UnitType - local InitUnitName = PlayerData.UnitName - - local PlayerScore = 0 - local PlayerPenalty = 0 - - ScoreMessage = ":\n" - - local ScoreMessageHits = "" - - for CategoryID, CategoryName in pairs( _SCORINGCategory ) do - self:T( CategoryName ) - if PlayerData.Hit[CategoryID] then - local Score = 0 - local ScoreHit = 0 - local Penalty = 0 - local PenaltyHit = 0 - self:T( "Hit scores exist for player " .. PlayerName ) - for UnitName, UnitData in pairs( PlayerData.Hit[CategoryID] ) do - Score = Score + UnitData.Score - ScoreHit = ScoreHit + UnitData.ScoreHit - Penalty = Penalty + UnitData.Penalty - PenaltyHit = UnitData.PenaltyHit - end - local ScoreMessageHit = string.format( "%s:%d ", CategoryName, Score - Penalty ) - self:T( ScoreMessageHit ) - ScoreMessageHits = ScoreMessageHits .. ScoreMessageHit - PlayerScore = PlayerScore + Score - PlayerPenalty = PlayerPenalty + Penalty - else - --ScoreMessageHits = ScoreMessageHits .. string.format( "%s:%d ", string.format(CategoryName, 1, 1), 0 ) - end - end - if ScoreMessageHits ~= "" then - ScoreMessage = ScoreMessage .. " Hits: " .. ScoreMessageHits .. "\n" - end - - local ScoreMessageKills = "" - for CategoryID, CategoryName in pairs( _SCORINGCategory ) do - self:T( "Kill scores exist for player " .. PlayerName ) - if PlayerData.Kill[CategoryID] then - local Score = 0 - local ScoreKill = 0 - local Penalty = 0 - local PenaltyKill = 0 - - for UnitName, UnitData in pairs( PlayerData.Kill[CategoryID] ) do - Score = Score + UnitData.Score - ScoreKill = ScoreKill + UnitData.ScoreKill - Penalty = Penalty + UnitData.Penalty - PenaltyKill = PenaltyKill + UnitData.PenaltyKill - end - - local ScoreMessageKill = string.format( " %s:%d ", CategoryName, Score - Penalty ) - self:T( ScoreMessageKill ) - ScoreMessageKills = ScoreMessageKills .. ScoreMessageKill - - PlayerScore = PlayerScore + Score - PlayerPenalty = PlayerPenalty + Penalty - else - --ScoreMessageKills = ScoreMessageKills .. string.format( "%s:%d ", string.format(CategoryName, 1, 1), 0 ) - end - end - if ScoreMessageKills ~= "" then - ScoreMessage = ScoreMessage .. " Kills: " .. ScoreMessageKills .. "\n" - end - - local ScoreMessageCoalitionChangePenalties = "" - if PlayerData.PenaltyCoalition ~= 0 then - ScoreMessageCoalitionChangePenalties = ScoreMessageCoalitionChangePenalties .. string.format( " -%d (%d changed)", PlayerData.Penalty, PlayerData.PenaltyCoalition ) - PlayerPenalty = PlayerPenalty + PlayerData.Penalty - end - if ScoreMessageCoalitionChangePenalties ~= "" then - ScoreMessage = ScoreMessage .. " Coalition Penalties: " .. ScoreMessageCoalitionChangePenalties .. "\n" - end - - local ScoreMessageMission = "" - local ScoreMission = 0 - local ScoreTask = 0 - for MissionName, MissionData in pairs( PlayerData.Mission ) do - ScoreMission = ScoreMission + MissionData.ScoreMission - ScoreTask = ScoreTask + MissionData.ScoreTask - ScoreMessageMission = ScoreMessageMission .. "'" .. MissionName .. "'; " - end - PlayerScore = PlayerScore + ScoreMission + ScoreTask - - if ScoreMessageMission ~= "" then - ScoreMessage = ScoreMessage .. " Tasks: " .. ScoreTask .. " Mission: " .. ScoreMission .. " ( " .. ScoreMessageMission .. ")\n" - end - - PlayerMessage = PlayerMessage .. string.format( "Player '%s' Score:%d (%d Score -%d Penalties)%s", PlayerName, PlayerScore - PlayerPenalty, PlayerScore, PlayerPenalty, ScoreMessage ) - end - end - MESSAGE:New( PlayerMessage, 30, "Player Scores" ):ToAll() -end - - -function SCORING:ReportScorePlayer() - - env.info( "Hello World " ) - - local ScoreMessage = "" - local PlayerMessage = "" - - self:T( "Score Report" ) - - for PlayerName, PlayerData in pairs( self.Players ) do - if PlayerData then -- This should normally not happen, but i'll test it anyway. - self:T( "Score Player: " .. PlayerName ) - - -- Some variables - local InitUnitCoalition = _SCORINGCoalition[PlayerData.UnitCoalition] - local InitUnitCategory = _SCORINGCategory[PlayerData.UnitCategory] - local InitUnitType = PlayerData.UnitType - local InitUnitName = PlayerData.UnitName - - local PlayerScore = 0 - local PlayerPenalty = 0 - - ScoreMessage = "" - - local ScoreMessageHits = "" - - for CategoryID, CategoryName in pairs( _SCORINGCategory ) do - self:T( CategoryName ) - if PlayerData.Hit[CategoryID] then - local Score = 0 - local ScoreHit = 0 - local Penalty = 0 - local PenaltyHit = 0 - self:T( "Hit scores exist for player " .. PlayerName ) - for UnitName, UnitData in pairs( PlayerData.Hit[CategoryID] ) do - Score = Score + UnitData.Score - ScoreHit = ScoreHit + UnitData.ScoreHit - Penalty = Penalty + UnitData.Penalty - PenaltyHit = UnitData.PenaltyHit - end - local ScoreMessageHit = string.format( "\n %s = %d score(%d;-%d) hits(#%d;#-%d)", CategoryName, Score - Penalty, Score, Penalty, ScoreHit, PenaltyHit ) - self:T( ScoreMessageHit ) - ScoreMessageHits = ScoreMessageHits .. ScoreMessageHit - PlayerScore = PlayerScore + Score - PlayerPenalty = PlayerPenalty + Penalty - else - --ScoreMessageHits = ScoreMessageHits .. string.format( "%s:%d ", string.format(CategoryName, 1, 1), 0 ) - end - end - if ScoreMessageHits ~= "" then - ScoreMessage = ScoreMessage .. "\n Hits: " .. ScoreMessageHits .. " " - end - - local ScoreMessageKills = "" - for CategoryID, CategoryName in pairs( _SCORINGCategory ) do - self:T( "Kill scores exist for player " .. PlayerName ) - if PlayerData.Kill[CategoryID] then - local Score = 0 - local ScoreKill = 0 - local Penalty = 0 - local PenaltyKill = 0 - - for UnitName, UnitData in pairs( PlayerData.Kill[CategoryID] ) do - Score = Score + UnitData.Score - ScoreKill = ScoreKill + UnitData.ScoreKill - Penalty = Penalty + UnitData.Penalty - PenaltyKill = PenaltyKill + UnitData.PenaltyKill - end - - local ScoreMessageKill = string.format( "\n %s = %d score(%d;-%d) hits(#%d;#-%d)", CategoryName, Score - Penalty, Score, Penalty, ScoreKill, PenaltyKill ) - self:T( ScoreMessageKill ) - ScoreMessageKills = ScoreMessageKills .. ScoreMessageKill - - PlayerScore = PlayerScore + Score - PlayerPenalty = PlayerPenalty + Penalty - else - --ScoreMessageKills = ScoreMessageKills .. string.format( "%s:%d ", string.format(CategoryName, 1, 1), 0 ) - end - end - if ScoreMessageKills ~= "" then - ScoreMessage = ScoreMessage .. "\n Kills: " .. ScoreMessageKills .. " " - end - - local ScoreMessageCoalitionChangePenalties = "" - if PlayerData.PenaltyCoalition ~= 0 then - ScoreMessageCoalitionChangePenalties = ScoreMessageCoalitionChangePenalties .. string.format( " -%d (%d changed)", PlayerData.Penalty, PlayerData.PenaltyCoalition ) - PlayerPenalty = PlayerPenalty + PlayerData.Penalty - end - if ScoreMessageCoalitionChangePenalties ~= "" then - ScoreMessage = ScoreMessage .. "\n Coalition: " .. ScoreMessageCoalitionChangePenalties .. " " - end - - local ScoreMessageMission = "" - local ScoreMission = 0 - local ScoreTask = 0 - for MissionName, MissionData in pairs( PlayerData.Mission ) do - ScoreMission = ScoreMission + MissionData.ScoreMission - ScoreTask = ScoreTask + MissionData.ScoreTask - ScoreMessageMission = ScoreMessageMission .. "'" .. MissionName .. "'; " - end - PlayerScore = PlayerScore + ScoreMission + ScoreTask - - if ScoreMessageMission ~= "" then - ScoreMessage = ScoreMessage .. "\n Tasks: " .. ScoreTask .. " Mission: " .. ScoreMission .. " ( " .. ScoreMessageMission .. ") " - end - - PlayerMessage = PlayerMessage .. string.format( "Player '%s' Score = %d ( %d Score, -%d Penalties ):%s", PlayerName, PlayerScore - PlayerPenalty, PlayerScore, PlayerPenalty, ScoreMessage ) - end - end - MESSAGE:New( PlayerMessage, 30, "Player Scores" ):ToAll() - -end - - -function SCORING:SecondsToClock(sSeconds) - local nSeconds = sSeconds - if nSeconds == 0 then - --return nil; - return "00:00:00"; - else - nHours = string.format("%02.f", math.floor(nSeconds/3600)); - nMins = string.format("%02.f", math.floor(nSeconds/60 - (nHours*60))); - nSecs = string.format("%02.f", math.floor(nSeconds - nHours*3600 - nMins *60)); - return nHours..":"..nMins..":"..nSecs - end -end - ---- Opens a score CSV file to log the scores. --- @param #SCORING self --- @param #string ScoringCSV --- @return #SCORING self --- @usage --- -- Open a new CSV file to log the scores of the game Gori Valley. Let the name of the CSV file begin with "Player Scores". --- ScoringObject = SCORING:New( "Gori Valley" ) --- ScoringObject:OpenCSV( "Player Scores" ) -function SCORING:OpenCSV( ScoringCSV ) - self:F( ScoringCSV ) - - if lfs and io and os then - if ScoringCSV then - self.ScoringCSV = ScoringCSV - local fdir = lfs.writedir() .. [[Logs\]] .. self.ScoringCSV .. " " .. os.date( "%Y-%m-%d %H-%M-%S" ) .. ".csv" - - self.CSVFile, self.err = io.open( fdir, "w+" ) - if not self.CSVFile then - error( "Error: Cannot open CSV file in " .. lfs.writedir() ) - end - - self.CSVFile:write( '"GameName","RunTime","Time","PlayerName","ScoreType","PlayerUnitCoaltion","PlayerUnitCategory","PlayerUnitType","PlayerUnitName","TargetUnitCoalition","TargetUnitCategory","TargetUnitType","TargetUnitName","Times","Score"\n' ) - - self.RunTime = os.date("%y-%m-%d_%H-%M-%S") - else - error( "A string containing the CSV file name must be given." ) - end - else - self:E( "The MissionScripting.lua file has not been changed to allow lfs, io and os modules to be used..." ) - end - return self -end - - ---- Registers a score for a player. --- @param #SCORING self --- @param #string PlayerName The name of the player. --- @param #string ScoreType The type of the score. --- @param #string ScoreTimes The amount of scores achieved. --- @param #string ScoreAmount The score given. --- @param #string PlayerUnitName The unit name of the player. --- @param #string PlayerUnitCoalition The coalition of the player unit. --- @param #string PlayerUnitCategory The category of the player unit. --- @param #string PlayerUnitType The type of the player unit. --- @param #string TargetUnitName The name of the target unit. --- @param #string TargetUnitCoalition The coalition of the target unit. --- @param #string TargetUnitCategory The category of the target unit. --- @param #string TargetUnitType The type of the target unit. --- @return #SCORING self -function SCORING:ScoreCSV( PlayerName, ScoreType, ScoreTimes, ScoreAmount, PlayerUnitName, PlayerUnitCoalition, PlayerUnitCategory, PlayerUnitType, TargetUnitName, TargetUnitCoalition, TargetUnitCategory, TargetUnitType ) - --write statistic information to file - local ScoreTime = self:SecondsToClock( timer.getTime() ) - PlayerName = PlayerName:gsub( '"', '_' ) - - if PlayerUnitName and PlayerUnitName ~= '' then - local PlayerUnit = Unit.getByName( PlayerUnitName ) - - if PlayerUnit then - if not PlayerUnitCategory then - --PlayerUnitCategory = SCORINGCategory[PlayerUnit:getCategory()] - PlayerUnitCategory = _SCORINGCategory[PlayerUnit:getDesc().category] - end - - if not PlayerUnitCoalition then - PlayerUnitCoalition = _SCORINGCoalition[PlayerUnit:getCoalition()] - end - - if not PlayerUnitType then - PlayerUnitType = PlayerUnit:getTypeName() - end - else - PlayerUnitName = '' - PlayerUnitCategory = '' - PlayerUnitCoalition = '' - PlayerUnitType = '' - end - else - PlayerUnitName = '' - PlayerUnitCategory = '' - PlayerUnitCoalition = '' - PlayerUnitType = '' - end - - if not TargetUnitCoalition then - TargetUnitCoalition = '' - end - - if not TargetUnitCategory then - TargetUnitCategory = '' - end - - if not TargetUnitType then - TargetUnitType = '' - end - - if not TargetUnitName then - TargetUnitName = '' - end - - if lfs and io and os then - self.CSVFile:write( - '"' .. self.GameName .. '"' .. ',' .. - '"' .. self.RunTime .. '"' .. ',' .. - '' .. ScoreTime .. '' .. ',' .. - '"' .. PlayerName .. '"' .. ',' .. - '"' .. ScoreType .. '"' .. ',' .. - '"' .. PlayerUnitCoalition .. '"' .. ',' .. - '"' .. PlayerUnitCategory .. '"' .. ',' .. - '"' .. PlayerUnitType .. '"' .. ',' .. - '"' .. PlayerUnitName .. '"' .. ',' .. - '"' .. TargetUnitCoalition .. '"' .. ',' .. - '"' .. TargetUnitCategory .. '"' .. ',' .. - '"' .. TargetUnitType .. '"' .. ',' .. - '"' .. TargetUnitName .. '"' .. ',' .. - '' .. ScoreTimes .. '' .. ',' .. - '' .. ScoreAmount - ) - - self.CSVFile:write( "\n" ) - end -end - - -function SCORING:CloseCSV() - if lfs and io and os then - self.CSVFile:close() - end -end - ---- CARGO Classes --- @module CARGO - - - - - - - ---- Clients are those Groups defined within the Mission Editor that have the skillset defined as "Client" or "Player". --- These clients are defined within the Mission Orchestration Framework (MOF) - -CARGOS = {} - - -CARGO_ZONE = { - ClassName="CARGO_ZONE", - CargoZoneName = '', - CargoHostUnitName = '', - SIGNAL = { - TYPE = { - SMOKE = { ID = 1, TEXT = "smoke" }, - FLARE = { ID = 2, TEXT = "flare" } - }, - COLOR = { - GREEN = { ID = 1, TRIGGERCOLOR = trigger.smokeColor.Green, TEXT = "A green" }, - RED = { ID = 2, TRIGGERCOLOR = trigger.smokeColor.Red, TEXT = "A red" }, - WHITE = { ID = 3, TRIGGERCOLOR = trigger.smokeColor.White, TEXT = "A white" }, - ORANGE = { ID = 4, TRIGGERCOLOR = trigger.smokeColor.Orange, TEXT = "An orange" }, - BLUE = { ID = 5, TRIGGERCOLOR = trigger.smokeColor.Blue, TEXT = "A blue" }, - YELLOW = { ID = 6, TRIGGERCOLOR = trigger.flareColor.Yellow, TEXT = "A yellow" } - } - } -} - ---- Creates a new zone where cargo can be collected or deployed. --- The zone functionality is useful to smoke or indicate routes for cargo pickups or deployments. --- Provide the zone name as declared in the mission file into the CargoZoneName in the :New method. --- An optional parameter is the CargoHostName, which is a Group declared with Late Activation switched on in the mission file. --- The CargoHostName is the "host" of the cargo zone: --- --- * It will smoke the zone position when a client is approaching the zone. --- * Depending on the cargo type, it will assist in the delivery of the cargo by driving to and from the client. --- --- @param #CARGO_ZONE self --- @param #string CargoZoneName The name of the zone as declared within the mission editor. --- @param #string CargoHostName The name of the Group "hosting" the zone. The Group MUST NOT be a static, and must be a "mobile" unit. -function CARGO_ZONE:New( CargoZoneName, CargoHostName ) local self = BASE:Inherit( self, ZONE:New( CargoZoneName ) ) - self:F( { CargoZoneName, CargoHostName } ) - - self.CargoZoneName = CargoZoneName - self.SignalHeight = 2 - --self.CargoZone = trigger.misc.getZone( CargoZoneName ) - - - if CargoHostName then - self.CargoHostName = CargoHostName - end - - self:T( self.CargoZoneName ) - - return self -end - -function CARGO_ZONE:Spawn() - self:F( self.CargoHostName ) - - if self.CargoHostName then -- Only spawn a host in the zone when there is one given as a parameter in the New function. - if self.CargoHostSpawn then - local CargoHostGroup = self.CargoHostSpawn:GetGroupFromIndex() - if CargoHostGroup and CargoHostGroup:IsAlive() then - else - self.CargoHostSpawn:ReSpawn( 1 ) - end - else - self:T( "Initialize CargoHostSpawn" ) - self.CargoHostSpawn = SPAWN:New( self.CargoHostName ):Limit( 1, 1 ) - self.CargoHostSpawn:ReSpawn( 1 ) - end - end - - return self -end - -function CARGO_ZONE:GetHostUnit() - self:F( self ) - - if self.CargoHostName then - - -- A Host has been given, signal the host - local CargoHostGroup = self.CargoHostSpawn:GetGroupFromIndex() - local CargoHostUnit - if CargoHostGroup and CargoHostGroup:IsAlive() then - CargoHostUnit = CargoHostGroup:GetUnit(1) - else - CargoHostUnit = StaticObject.getByName( self.CargoHostName ) - end - - return CargoHostUnit - end - - return nil -end - -function CARGO_ZONE:ReportCargosToClient( Client, CargoType ) - self:F() - - local SignalUnit = self:GetHostUnit() - - if SignalUnit then - - local SignalUnitTypeName = SignalUnit:getTypeName() - - local HostMessage = "" - - local IsCargo = false - for CargoID, Cargo in pairs( CARGOS ) do - if Cargo.CargoType == Task.CargoType then - if Cargo:IsStatusNone() then - HostMessage = HostMessage .. " - " .. Cargo.CargoName .. " - " .. Cargo.CargoType .. " (" .. Cargo.Weight .. "kg)" .. "\n" - IsCargo = true - end - end - end - - if not IsCargo then - HostMessage = "No Cargo Available." - end - - Client:Message( HostMessage, 20, Mission.Name .. "/StageHosts." .. SignalUnitTypeName, SignalUnitTypeName .. ": Reporting Cargo", 10 ) - end -end - - -function CARGO_ZONE:Signal() - self:F() - - local Signalled = false - - if self.SignalType then - - if self.CargoHostName then - - -- A Host has been given, signal the host - - local SignalUnit = self:GetHostUnit() - - if SignalUnit then - - self:T( 'Signalling Unit' ) - local SignalVehiclePos = SignalUnit:GetPointVec3() - SignalVehiclePos.y = SignalVehiclePos.y + 2 - - if self.SignalType.ID == CARGO_ZONE.SIGNAL.TYPE.SMOKE.ID then - - trigger.action.smoke( SignalVehiclePos, self.SignalColor.TRIGGERCOLOR ) - Signalled = true - - elseif self.SignalType.ID == CARGO_ZONE.SIGNAL.TYPE.FLARE.ID then - - trigger.action.signalFlare( SignalVehiclePos, self.SignalColor.TRIGGERCOLOR , 0 ) - Signalled = false - - end - end - - else - - local ZonePointVec3 = self:GetPointVec3( self.SignalHeight ) -- Get the zone position + the landheight + 2 meters - - if self.SignalType.ID == CARGO_ZONE.SIGNAL.TYPE.SMOKE.ID then - - trigger.action.smoke( ZonePointVec3, self.SignalColor.TRIGGERCOLOR ) - Signalled = true - - elseif self.SignalType.ID == CARGO_ZONE.SIGNAL.TYPE.FLARE.ID then - trigger.action.signalFlare( ZonePointVec3, self.SignalColor.TRIGGERCOLOR, 0 ) - Signalled = false - - end - end - end - - return Signalled - -end - -function CARGO_ZONE:WhiteSmoke( SignalHeight ) - self:F() - - self.SignalType = CARGO_ZONE.SIGNAL.TYPE.SMOKE - self.SignalColor = CARGO_ZONE.SIGNAL.COLOR.WHITE - - if SignalHeight then - self.SignalHeight = SignalHeight - end - - return self -end - -function CARGO_ZONE:BlueSmoke( SignalHeight ) - self:F() - - self.SignalType = CARGO_ZONE.SIGNAL.TYPE.SMOKE - self.SignalColor = CARGO_ZONE.SIGNAL.COLOR.BLUE - - if SignalHeight then - self.SignalHeight = SignalHeight - end - - return self -end - -function CARGO_ZONE:RedSmoke( SignalHeight ) - self:F() - - self.SignalType = CARGO_ZONE.SIGNAL.TYPE.SMOKE - self.SignalColor = CARGO_ZONE.SIGNAL.COLOR.RED - - if SignalHeight then - self.SignalHeight = SignalHeight - end - - return self -end - -function CARGO_ZONE:OrangeSmoke( SignalHeight ) - self:F() - - self.SignalType = CARGO_ZONE.SIGNAL.TYPE.SMOKE - self.SignalColor = CARGO_ZONE.SIGNAL.COLOR.ORANGE - - if SignalHeight then - self.SignalHeight = SignalHeight - end - - return self -end - -function CARGO_ZONE:GreenSmoke( SignalHeight ) - self:F() - - self.SignalType = CARGO_ZONE.SIGNAL.TYPE.SMOKE - self.SignalColor = CARGO_ZONE.SIGNAL.COLOR.GREEN - - if SignalHeight then - self.SignalHeight = SignalHeight - end - - return self -end - - -function CARGO_ZONE:WhiteFlare( SignalHeight ) - self:F() - - self.SignalType = CARGO_ZONE.SIGNAL.TYPE.FLARE - self.SignalColor = CARGO_ZONE.SIGNAL.COLOR.WHITE - - if SignalHeight then - self.SignalHeight = SignalHeight - end - - return self -end - -function CARGO_ZONE:RedFlare( SignalHeight ) - self:F() - - self.SignalType = CARGO_ZONE.SIGNAL.TYPE.FLARE - self.SignalColor = CARGO_ZONE.SIGNAL.COLOR.RED - - if SignalHeight then - self.SignalHeight = SignalHeight - end - - return self -end - -function CARGO_ZONE:GreenFlare( SignalHeight ) - self:F() - - self.SignalType = CARGO_ZONE.SIGNAL.TYPE.FLARE - self.SignalColor = CARGO_ZONE.SIGNAL.COLOR.GREEN - - if SignalHeight then - self.SignalHeight = SignalHeight - end - - return self -end - -function CARGO_ZONE:YellowFlare( SignalHeight ) - self:F() - - self.SignalType = CARGO_ZONE.SIGNAL.TYPE.FLARE - self.SignalColor = CARGO_ZONE.SIGNAL.COLOR.YELLOW - - if SignalHeight then - self.SignalHeight = SignalHeight - end - - return self -end - - -function CARGO_ZONE:GetCargoHostUnit() - self:F( self ) - - if self.CargoHostSpawn then - local CargoHostGroup = self.CargoHostSpawn:GetGroupFromIndex(1) - if CargoHostGroup and CargoHostGroup:IsAlive() then - local CargoHostUnit = CargoHostGroup:GetUnit(1) - if CargoHostUnit and CargoHostUnit:IsAlive() then - return CargoHostUnit - end - end - end - - return nil -end - -function CARGO_ZONE:GetCargoZoneName() - self:F() - - return self.CargoZoneName -end - -CARGO = { - ClassName = "CARGO", - STATUS = { - NONE = 0, - LOADED = 1, - UNLOADED = 2, - LOADING = 3 - }, - CargoClient = nil -} - ---- Add Cargo to the mission... Cargo functionality needs to be reworked a bit, so this is still under construction. I need to make a CARGO Class... -function CARGO:New( CargoType, CargoName, CargoWeight ) local self = BASE:Inherit( self, BASE:New() ) - self:F( { CargoType, CargoName, CargoWeight } ) - - - self.CargoType = CargoType - self.CargoName = CargoName - self.CargoWeight = CargoWeight - - self:StatusNone() - - return self -end - -function CARGO:Spawn( Client ) - self:F() - - return self - -end - -function CARGO:IsNear( Client, LandingZone ) - self:F() - - local Near = true - - return Near - -end - - -function CARGO:IsLoadingToClient() - self:F() - - if self:IsStatusLoading() then - return self.CargoClient - end - - return nil - -end - - -function CARGO:IsLoadedInClient() - self:F() - - if self:IsStatusLoaded() then - return self.CargoClient - end - - return nil - -end - - -function CARGO:UnLoad( Client, TargetZoneName ) - self:F() - - self:StatusUnLoaded() - - return self -end - -function CARGO:OnBoard( Client, LandingZone ) - self:F() - - local Valid = true - - self.CargoClient = Client - local ClientUnit = Client:GetClientGroupDCSUnit() - - return Valid -end - -function CARGO:OnBoarded( Client, LandingZone ) - self:F() - - local OnBoarded = true - - return OnBoarded -end - -function CARGO:Load( Client ) - self:F() - - self:StatusLoaded( Client ) - - return self -end - -function CARGO:IsLandingRequired() - self:F() - return true -end - -function CARGO:IsSlingLoad() - self:F() - return false -end - - -function CARGO:StatusNone() - self:F() - - self.CargoClient = nil - self.CargoStatus = CARGO.STATUS.NONE - - return self -end - -function CARGO:StatusLoading( Client ) - self:F() - - self.CargoClient = Client - self.CargoStatus = CARGO.STATUS.LOADING - self:T( "Cargo " .. self.CargoName .. " loading to Client: " .. self.CargoClient:GetClientGroupName() ) - - return self -end - -function CARGO:StatusLoaded( Client ) - self:F() - - self.CargoClient = Client - self.CargoStatus = CARGO.STATUS.LOADED - self:T( "Cargo " .. self.CargoName .. " loaded in Client: " .. self.CargoClient:GetClientGroupName() ) - - return self -end - -function CARGO:StatusUnLoaded() - self:F() - - self.CargoClient = nil - self.CargoStatus = CARGO.STATUS.UNLOADED - - return self -end - - -function CARGO:IsStatusNone() - self:F() - - return self.CargoStatus == CARGO.STATUS.NONE -end - -function CARGO:IsStatusLoading() - self:F() - - return self.CargoStatus == CARGO.STATUS.LOADING -end - -function CARGO:IsStatusLoaded() - self:F() - - return self.CargoStatus == CARGO.STATUS.LOADED -end - -function CARGO:IsStatusUnLoaded() - self:F() - - return self.CargoStatus == CARGO.STATUS.UNLOADED -end - - -CARGO_GROUP = { - ClassName = "CARGO_GROUP" -} - - -function CARGO_GROUP:New( CargoType, CargoName, CargoWeight, CargoGroupTemplate, CargoZone ) local self = BASE:Inherit( self, CARGO:New( CargoType, CargoName, CargoWeight ) ) - self:F( { CargoType, CargoName, CargoWeight, CargoGroupTemplate, CargoZone } ) - - self.CargoSpawn = SPAWN:NewWithAlias( CargoGroupTemplate, CargoName ) - self.CargoZone = CargoZone - - CARGOS[self.CargoName] = self - - return self - -end - -function CARGO_GROUP:Spawn( Client ) - self:F( { Client } ) - - local SpawnCargo = true - - if self:IsStatusNone() then - local CargoGroup = Group.getByName( self.CargoName ) - if CargoGroup and CargoGroup:isExist() then - SpawnCargo = false - end - - elseif self:IsStatusLoading() then - - local Client = self:IsLoadingToClient() - if Client and Client:GetDCSGroup() then - SpawnCargo = false - else - local CargoGroup = Group.getByName( self.CargoName ) - if CargoGroup and CargoGroup:isExist() then - SpawnCargo = false - end - end - - elseif self:IsStatusLoaded() then - - local ClientLoaded = self:IsLoadedInClient() - -- Now test if another Client is alive (not this one), and it has the CARGO, then this cargo does not need to be initialized and spawned. - if ClientLoaded and ClientLoaded ~= Client then - local ClientGroup = Client:GetDCSGroup() - if ClientLoaded:GetClientGroupDCSUnit() and ClientLoaded:GetClientGroupDCSUnit():isExist() then - SpawnCargo = false - else - self:StatusNone() - end - else - -- Same Client, but now in initialize, so set back the status to None. - self:StatusNone() - end - - elseif self:IsStatusUnLoaded() then - - SpawnCargo = false - - end - - if SpawnCargo then - if self.CargoZone:GetCargoHostUnit() then - --- ReSpawn the Cargo from the CargoHost - self.CargoGroupName = self.CargoSpawn:SpawnFromUnit( self.CargoZone:GetCargoHostUnit(), 60, 30, 1 ):GetName() - else - --- ReSpawn the Cargo in the CargoZone without a host ... - self:T( self.CargoZone ) - self.CargoGroupName = self.CargoSpawn:SpawnInZone( self.CargoZone, true, 1 ):GetName() - end - self:StatusNone() - end - - self:T( { self.CargoGroupName, CARGOS[self.CargoName].CargoGroupName } ) - - return self -end - -function CARGO_GROUP:IsNear( Client, LandingZone ) - self:F() - - local Near = false - - if self.CargoGroupName then - local CargoGroup = Group.getByName( self.CargoGroupName ) - if routines.IsPartOfGroupInRadius( CargoGroup, Client:GetPositionVec3(), 250 ) then - Near = true - end - end - - return Near - -end - - -function CARGO_GROUP:OnBoard( Client, LandingZone, OnBoardSide ) - self:F() - - local Valid = true - - local ClientUnit = Client:GetClientGroupDCSUnit() - - local CarrierPos = ClientUnit:getPoint() - local CarrierPosMove = ClientUnit:getPoint() - local CarrierPosOnBoard = ClientUnit:getPoint() - - local CargoGroup = Group.getByName( self.CargoGroupName ) - - local CargoUnit = CargoGroup:getUnit(1) - local CargoPos = CargoUnit:getPoint() - - self.CargoInAir = CargoUnit:inAir() - - self:T( self.CargoInAir ) - - -- Only move the group to the carrier when the cargo is not in the air - -- (eg. cargo can be on a oil derrick, moving the cargo on the oil derrick will drop the cargo on the sea). - if not self.CargoInAir then - - local Points = {} - - self:T( 'CargoPos x = ' .. CargoPos.x .. " z = " .. CargoPos.z ) - self:T( 'CarrierPosMove x = ' .. CarrierPosMove.x .. " z = " .. CarrierPosMove.z ) - - Points[#Points+1] = routines.ground.buildWP( CargoPos, "Cone", 10 ) - - self:T( 'Points[1] x = ' .. Points[1].x .. " y = " .. Points[1].y ) - - if OnBoardSide == nil then - OnBoardSide = CLIENT.ONBOARDSIDE.NONE - end - - if OnBoardSide == CLIENT.ONBOARDSIDE.LEFT then - - self:T( "TransportCargoOnBoard: Onboarding LEFT" ) - CarrierPosMove.z = CarrierPosMove.z - 25 - CarrierPosOnBoard.z = CarrierPosOnBoard.z - 5 - Points[#Points+1] = routines.ground.buildWP( CarrierPosMove, "Cone", 10 ) - Points[#Points+1] = routines.ground.buildWP( CarrierPosOnBoard, "Cone", 10 ) - - elseif OnBoardSide == CLIENT.ONBOARDSIDE.RIGHT then - - self:T( "TransportCargoOnBoard: Onboarding RIGHT" ) - CarrierPosMove.z = CarrierPosMove.z + 25 - CarrierPosOnBoard.z = CarrierPosOnBoard.z + 5 - Points[#Points+1] = routines.ground.buildWP( CarrierPosMove, "Cone", 10 ) - Points[#Points+1] = routines.ground.buildWP( CarrierPosOnBoard, "Cone", 10 ) - - elseif OnBoardSide == CLIENT.ONBOARDSIDE.BACK then - - self:T( "TransportCargoOnBoard: Onboarding BACK" ) - CarrierPosMove.x = CarrierPosMove.x - 25 - CarrierPosOnBoard.x = CarrierPosOnBoard.x - 5 - Points[#Points+1] = routines.ground.buildWP( CarrierPosMove, "Cone", 10 ) - Points[#Points+1] = routines.ground.buildWP( CarrierPosOnBoard, "Cone", 10 ) - - elseif OnBoardSide == CLIENT.ONBOARDSIDE.FRONT then - - self:T( "TransportCargoOnBoard: Onboarding FRONT" ) - CarrierPosMove.x = CarrierPosMove.x + 25 - CarrierPosOnBoard.x = CarrierPosOnBoard.x + 5 - Points[#Points+1] = routines.ground.buildWP( CarrierPosMove, "Cone", 10 ) - Points[#Points+1] = routines.ground.buildWP( CarrierPosOnBoard, "Cone", 10 ) - - elseif OnBoardSide == CLIENT.ONBOARDSIDE.NONE then - - self:T( "TransportCargoOnBoard: Onboarding CENTRAL" ) - Points[#Points+1] = routines.ground.buildWP( CarrierPos, "Cone", 10 ) - - end - self:T( "TransportCargoOnBoard: Routing " .. self.CargoGroupName ) - - --routines.scheduleFunction( routines.goRoute, { self.CargoGroupName, Points}, timer.getTime() + 4 ) - SCHEDULER:New( self, routines.goRoute, { self.CargoGroupName, Points}, 4 ) - end - - self:StatusLoading( Client ) - - return Valid - -end - - -function CARGO_GROUP:OnBoarded( Client, LandingZone ) - self:F() - - local OnBoarded = false - - local CargoGroup = Group.getByName( self.CargoGroupName ) - - if not self.CargoInAir then - if routines.IsPartOfGroupInRadius( CargoGroup, Client:GetPositionVec3(), 25 ) then - CargoGroup:destroy() - self:StatusLoaded( Client ) - OnBoarded = true - end - else - CargoGroup:destroy() - self:StatusLoaded( Client ) - OnBoarded = true - end - - return OnBoarded -end - - -function CARGO_GROUP:UnLoad( Client, TargetZoneName ) - self:F() - - self:T( 'self.CargoName = ' .. self.CargoName ) - - local CargoGroup = self.CargoSpawn:SpawnFromUnit( Client:GetClientGroupUnit(), 60, 30 ) - - self.CargoGroupName = CargoGroup:GetName() - self:T( 'self.CargoGroupName = ' .. self.CargoGroupName ) - - CargoGroup:TaskRouteToZone( ZONE:New( TargetZoneName ), true ) - - self:StatusUnLoaded() - - return self -end - - -CARGO_PACKAGE = { - ClassName = "CARGO_PACKAGE" -} - - -function CARGO_PACKAGE:New( CargoType, CargoName, CargoWeight, CargoClient ) local self = BASE:Inherit( self, CARGO:New( CargoType, CargoName, CargoWeight ) ) - self:F( { CargoType, CargoName, CargoWeight, CargoClient } ) - - self.CargoClient = CargoClient - - CARGOS[self.CargoName] = self - - return self - -end - - -function CARGO_PACKAGE:Spawn( Client ) - self:F( { self, Client } ) - - -- this needs to be checked thoroughly - - local CargoClientGroup = self.CargoClient:GetDCSGroup() - if not CargoClientGroup then - if not self.CargoClientSpawn then - self.CargoClientSpawn = SPAWN:New( self.CargoClient:GetClientGroupName() ):Limit( 1, 1 ) - end - self.CargoClientSpawn:ReSpawn( 1 ) - end - - local SpawnCargo = true - - if self:IsStatusNone() then - - elseif self:IsStatusLoading() or self:IsStatusLoaded() then - - local CargoClientLoaded = self:IsLoadedInClient() - if CargoClientLoaded and CargoClientLoaded:GetDCSGroup() then - SpawnCargo = false - end - - elseif self:IsStatusUnLoaded() then - - SpawnCargo = false - - else - - end - - if SpawnCargo then - self:StatusLoaded( self.CargoClient ) - end - - return self -end - - -function CARGO_PACKAGE:IsNear( Client, LandingZone ) - self:F() - - local Near = false - - if self.CargoClient and self.CargoClient:GetDCSGroup() then - self:T( self.CargoClient.ClientName ) - self:T( 'Client Exists.' ) - - if routines.IsUnitInRadius( self.CargoClient:GetClientGroupDCSUnit(), Client:GetPositionVec3(), 150 ) then - Near = true - end - end - - return Near - -end - - -function CARGO_PACKAGE:OnBoard( Client, LandingZone, OnBoardSide ) - self:F() - - local Valid = true - - local ClientUnit = Client:GetClientGroupDCSUnit() - - local CarrierPos = ClientUnit:getPoint() - local CarrierPosMove = ClientUnit:getPoint() - local CarrierPosOnBoard = ClientUnit:getPoint() - local CarrierPosMoveAway = ClientUnit:getPoint() - - local CargoHostGroup = self.CargoClient:GetDCSGroup() - local CargoHostName = self.CargoClient:GetDCSGroup():getName() - - local CargoHostUnits = CargoHostGroup:getUnits() - local CargoPos = CargoHostUnits[1]:getPoint() - - local Points = {} - - self:T( 'CargoPos x = ' .. CargoPos.x .. " z = " .. CargoPos.z ) - self:T( 'CarrierPosMove x = ' .. CarrierPosMove.x .. " z = " .. CarrierPosMove.z ) - - Points[#Points+1] = routines.ground.buildWP( CargoPos, "Cone", 10 ) - - self:T( 'Points[1] x = ' .. Points[1].x .. " y = " .. Points[1].y ) - - if OnBoardSide == nil then - OnBoardSide = CLIENT.ONBOARDSIDE.NONE - end - - if OnBoardSide == CLIENT.ONBOARDSIDE.LEFT then - - self:T( "TransportCargoOnBoard: Onboarding LEFT" ) - CarrierPosMove.z = CarrierPosMove.z - 25 - CarrierPosOnBoard.z = CarrierPosOnBoard.z - 5 - CarrierPosMoveAway.z = CarrierPosMoveAway.z - 20 - Points[#Points+1] = routines.ground.buildWP( CarrierPosMove, "Cone", 10 ) - Points[#Points+1] = routines.ground.buildWP( CarrierPosOnBoard, "Cone", 10 ) - Points[#Points+1] = routines.ground.buildWP( CarrierPosMoveAway, "Cone", 10 ) - - elseif OnBoardSide == CLIENT.ONBOARDSIDE.RIGHT then - - self:T( "TransportCargoOnBoard: Onboarding RIGHT" ) - CarrierPosMove.z = CarrierPosMove.z + 25 - CarrierPosOnBoard.z = CarrierPosOnBoard.z + 5 - CarrierPosMoveAway.z = CarrierPosMoveAway.z + 20 - Points[#Points+1] = routines.ground.buildWP( CarrierPosMove, "Cone", 10 ) - Points[#Points+1] = routines.ground.buildWP( CarrierPosOnBoard, "Cone", 10 ) - Points[#Points+1] = routines.ground.buildWP( CarrierPosMoveAway, "Cone", 10 ) - - elseif OnBoardSide == CLIENT.ONBOARDSIDE.BACK then - - self:T( "TransportCargoOnBoard: Onboarding BACK" ) - CarrierPosMove.x = CarrierPosMove.x - 25 - CarrierPosOnBoard.x = CarrierPosOnBoard.x - 5 - CarrierPosMoveAway.x = CarrierPosMoveAway.x - 20 - Points[#Points+1] = routines.ground.buildWP( CarrierPosMove, "Cone", 10 ) - Points[#Points+1] = routines.ground.buildWP( CarrierPosOnBoard, "Cone", 10 ) - Points[#Points+1] = routines.ground.buildWP( CarrierPosMoveAway, "Cone", 10 ) - - elseif OnBoardSide == CLIENT.ONBOARDSIDE.FRONT then - - self:T( "TransportCargoOnBoard: Onboarding FRONT" ) - CarrierPosMove.x = CarrierPosMove.x + 25 - CarrierPosOnBoard.x = CarrierPosOnBoard.x + 5 - CarrierPosMoveAway.x = CarrierPosMoveAway.x + 20 - Points[#Points+1] = routines.ground.buildWP( CarrierPosMove, "Cone", 10 ) - Points[#Points+1] = routines.ground.buildWP( CarrierPosOnBoard, "Cone", 10 ) - Points[#Points+1] = routines.ground.buildWP( CarrierPosMoveAway, "Cone", 10 ) - - elseif OnBoardSide == CLIENT.ONBOARDSIDE.NONE then - - self:T( "TransportCargoOnBoard: Onboarding FRONT" ) - CarrierPosMove.x = CarrierPosMove.x + 25 - CarrierPosOnBoard.x = CarrierPosOnBoard.x + 5 - CarrierPosMoveAway.x = CarrierPosMoveAway.x + 20 - Points[#Points+1] = routines.ground.buildWP( CarrierPosMove, "Cone", 10 ) - Points[#Points+1] = routines.ground.buildWP( CarrierPosOnBoard, "Cone", 10 ) - Points[#Points+1] = routines.ground.buildWP( CarrierPosMoveAway, "Cone", 10 ) - - end - self:T( "Routing " .. CargoHostName ) - - --routines.scheduleFunction( routines.goRoute, { CargoHostName, Points}, timer.getTime() + 4 ) - SCHEDULER:New( self, routines.goRoute, { CargoHostName, Points }, 4 ) - - return Valid - -end - - -function CARGO_PACKAGE:OnBoarded( Client, LandingZone ) - self:F() - - local OnBoarded = false - - if self.CargoClient and self.CargoClient:GetDCSGroup() then - if routines.IsUnitInRadius( self.CargoClient:GetClientGroupDCSUnit(), self.CargoClient:GetPositionVec3(), 10 ) then - - -- Switch Cargo from self.CargoClient to Client ... Each cargo can have only one client. So assigning the new client for the cargo is enough. - self:StatusLoaded( Client ) - - -- All done, onboarded the Cargo to the new Client. - OnBoarded = true - end - end - - return OnBoarded -end - - -function CARGO_PACKAGE:UnLoad( Client, TargetZoneName ) - self:F() - - self:T( 'self.CargoName = ' .. self.CargoName ) - --self:T( 'self.CargoHostName = ' .. self.CargoHostName ) - - --self.CargoSpawn:FromCarrier( Client:GetDCSGroup(), TargetZoneName, self.CargoHostName ) - self:StatusUnLoaded() - - return Cargo -end - - -CARGO_SLINGLOAD = { - ClassName = "CARGO_SLINGLOAD" -} - - -function CARGO_SLINGLOAD:New( CargoType, CargoName, CargoWeight, CargoZone, CargoHostName, CargoCountryID ) - local self = BASE:Inherit( self, CARGO:New( CargoType, CargoName, CargoWeight ) ) - self:F( { CargoType, CargoName, CargoWeight, CargoZone, CargoHostName, CargoCountryID } ) - - self.CargoHostName = CargoHostName - - -- Cargo will be initialized around the CargoZone position. - self.CargoZone = CargoZone - - self.CargoCount = 0 - self.CargoStaticName = string.format( "%s#%03d", self.CargoName, self.CargoCount ) - - -- The country ID needs to be correctly set. - self.CargoCountryID = CargoCountryID - - CARGOS[self.CargoName] = self - - return self - -end - - -function CARGO_SLINGLOAD:IsLandingRequired() - self:F() - return false -end - - -function CARGO_SLINGLOAD:IsSlingLoad() - self:F() - return true -end - - -function CARGO_SLINGLOAD:Spawn( Client ) - self:F( { self, Client } ) - - local Zone = trigger.misc.getZone( self.CargoZone ) - - local ZonePos = {} - ZonePos.x = Zone.point.x + math.random( Zone.radius / 2 * -1, Zone.radius / 2 ) - ZonePos.y = Zone.point.z + math.random( Zone.radius / 2 * -1, Zone.radius / 2 ) - - self:T( "Cargo Location = " .. ZonePos.x .. ", " .. ZonePos.y ) - - --[[ - -- This does not work in 1.5.2. - CargoStatic = StaticObject.getByName( self.CargoName ) - if CargoStatic then - CargoStatic:destroy() - end - --]] - - CargoStatic = StaticObject.getByName( self.CargoStaticName ) - - if CargoStatic and CargoStatic:isExist() then - CargoStatic:destroy() - end - - -- I need to make every time a new cargo due to bugs in 1.5.2. - - self.CargoCount = self.CargoCount + 1 - self.CargoStaticName = string.format( "%s#%03d", self.CargoName, self.CargoCount ) - - local CargoTemplate = { - ["category"] = "Cargo", - ["shape_name"] = "ab-212_cargo", - ["type"] = "Cargo1", - ["x"] = ZonePos.x, - ["y"] = ZonePos.y, - ["mass"] = self.CargoWeight, - ["name"] = self.CargoStaticName, - ["canCargo"] = true, - ["heading"] = 0, - } - - coalition.addStaticObject( self.CargoCountryID, CargoTemplate ) - --- end - - return self -end - - -function CARGO_SLINGLOAD:IsNear( Client, LandingZone ) - self:F() - - local Near = false - - return Near -end - - -function CARGO_SLINGLOAD:IsInLandingZone( Client, LandingZone ) - self:F() - - local Near = false - - local CargoStaticUnit = StaticObject.getByName( self.CargoName ) - if CargoStaticUnit then - if routines.IsStaticInZones( CargoStaticUnit, LandingZone ) then - Near = true - end - end - - return Near -end - - -function CARGO_SLINGLOAD:OnBoard( Client, LandingZone, OnBoardSide ) - self:F() - - local Valid = true - - - return Valid -end - - -function CARGO_SLINGLOAD:OnBoarded( Client, LandingZone ) - self:F() - - local OnBoarded = false - - local CargoStaticUnit = StaticObject.getByName( self.CargoName ) - if CargoStaticUnit then - if not routines.IsStaticInZones( CargoStaticUnit, LandingZone ) then - OnBoarded = true - end - end - - return OnBoarded -end - - -function CARGO_SLINGLOAD:UnLoad( Client, TargetZoneName ) - self:F() - - self:T( 'self.CargoName = ' .. self.CargoName ) - self:T( 'self.CargoGroupName = ' .. self.CargoGroupName ) - - self:StatusUnLoaded() - - return Cargo -end ---- This module contains the MESSAGE class. --- --- 1) @{Message#MESSAGE} class, extends @{Base#BASE} --- ================================================= --- Message System to display Messages to Clients, Coalitions or All. --- Messages are shown on the display panel for an amount of seconds, and will then disappear. --- Messages can contain a category which is indicating the category of the message. --- --- 1.1) MESSAGE construction methods --- --------------------------------- --- Messages are created with @{Message#MESSAGE.New}. Note that when the MESSAGE object is created, no message is sent yet. --- To send messages, you need to use the To functions. --- --- 1.2) Send messages with MESSAGE To methods --- ------------------------------------------ --- Messages are sent to: --- --- * Clients with @{Message#MESSAGE.ToClient}. --- * Coalitions with @{Message#MESSAGE.ToCoalition}. --- * All Players with @{Message#MESSAGE.ToAll}. --- --- @module Message --- @author FlightControl - ---- The MESSAGE class --- @type MESSAGE --- @extends Base#BASE -MESSAGE = { - ClassName = "MESSAGE", - MessageCategory = 0, - MessageID = 0, -} - - ---- Creates a new MESSAGE object. Note that these MESSAGE objects are not yet displayed on the display panel. You must use the functions @{ToClient} or @{ToCoalition} or @{ToAll} to send these Messages to the respective recipients. --- @param self --- @param #string MessageText is the text of the Message. --- @param #number MessageDuration is a number in seconds of how long the MESSAGE should be shown on the display panel. --- @param #string MessageCategory (optional) is a string expressing the "category" of the Message. The category will be shown as the first text in the message followed by a ": ". --- @return #MESSAGE --- @usage --- -- Create a series of new Messages. --- -- MessageAll is meant to be sent to all players, for 25 seconds, and is classified as "Score". --- -- MessageRED is meant to be sent to the RED players only, for 10 seconds, and is classified as "End of Mission", with ID "Win". --- -- MessageClient1 is meant to be sent to a Client, for 25 seconds, and is classified as "Score", with ID "Score". --- -- MessageClient1 is meant to be sent to a Client, for 25 seconds, and is classified as "Score", with ID "Score". --- MessageAll = MESSAGE:New( "To all Players: BLUE has won! Each player of BLUE wins 50 points!", 25, "End of Mission" ) --- MessageRED = MESSAGE:New( "To the RED Players: You receive a penalty because you've killed one of your own units", 25, "Penalty" ) --- MessageClient1 = MESSAGE:New( "Congratulations, you've just hit a target", 25, "Score" ) --- MessageClient2 = MESSAGE:New( "Congratulations, you've just killed a target", 25, "Score") -function MESSAGE:New( MessageText, MessageDuration, MessageCategory ) - local self = BASE:Inherit( self, BASE:New() ) - self:F( { MessageText, MessageDuration, MessageCategory } ) - - -- When no MessageCategory is given, we don't show it as a title... - if MessageCategory and MessageCategory ~= "" then - self.MessageCategory = MessageCategory .. ": " - else - self.MessageCategory = "" - end - - self.MessageDuration = MessageDuration - self.MessageTime = timer.getTime() - self.MessageText = MessageText - - self.MessageSent = false - self.MessageGroup = false - self.MessageCoalition = false - - return self -end - ---- Sends a MESSAGE to a Client Group. Note that the Group needs to be defined within the ME with the skillset "Client" or "Player". --- @param #MESSAGE self --- @param Client#CLIENT Client is the Group of the Client. --- @return #MESSAGE --- @usage --- -- Send the 2 messages created with the @{New} method to the Client Group. --- -- Note that the Message of MessageClient2 is overwriting the Message of MessageClient1. --- ClientGroup = Group.getByName( "ClientGroup" ) --- --- MessageClient1 = MESSAGE:New( "Congratulations, you've just hit a target", "Score", 25, "Score" ):ToClient( ClientGroup ) --- MessageClient2 = MESSAGE:New( "Congratulations, you've just killed a target", "Score", 25, "Score" ):ToClient( ClientGroup ) --- or --- MESSAGE:New( "Congratulations, you've just hit a target", "Score", 25, "Score" ):ToClient( ClientGroup ) --- MESSAGE:New( "Congratulations, you've just killed a target", "Score", 25, "Score" ):ToClient( ClientGroup ) --- or --- MessageClient1 = MESSAGE:New( "Congratulations, you've just hit a target", "Score", 25, "Score" ) --- MessageClient2 = MESSAGE:New( "Congratulations, you've just killed a target", "Score", 25, "Score" ) --- MessageClient1:ToClient( ClientGroup ) --- MessageClient2:ToClient( ClientGroup ) -function MESSAGE:ToClient( Client ) - self:F( Client ) - - if Client and Client:GetClientGroupID() then - - local ClientGroupID = Client:GetClientGroupID() - self:T( self.MessageCategory .. self.MessageText:gsub("\n$",""):gsub("\n$","") .. " / " .. self.MessageDuration ) - trigger.action.outTextForGroup( ClientGroupID, self.MessageCategory .. self.MessageText:gsub("\n$",""):gsub("\n$",""), self.MessageDuration ) - end - - return self -end - ---- Sends a MESSAGE to the Blue coalition. --- @param #MESSAGE self --- @return #MESSAGE --- @usage --- -- Send a message created with the @{New} method to the BLUE coalition. --- MessageBLUE = MESSAGE:New( "To the BLUE Players: You receive a penalty because you've killed one of your own units", "Penalty", 25, "Score" ):ToBlue() --- or --- MESSAGE:New( "To the BLUE Players: You receive a penalty because you've killed one of your own units", "Penalty", 25, "Score" ):ToBlue() --- or --- MessageBLUE = MESSAGE:New( "To the BLUE Players: You receive a penalty because you've killed one of your own units", "Penalty", 25, "Score" ) --- MessageBLUE:ToBlue() -function MESSAGE:ToBlue() - self:F() - - self:ToCoalition( coalition.side.BLUE ) - - return self -end - ---- Sends a MESSAGE to the Red Coalition. --- @param #MESSAGE self --- @return #MESSAGE --- @usage --- -- Send a message created with the @{New} method to the RED coalition. --- MessageRED = MESSAGE:New( "To the RED Players: You receive a penalty because you've killed one of your own units", "Penalty", 25, "Score" ):ToRed() --- or --- MESSAGE:New( "To the RED Players: You receive a penalty because you've killed one of your own units", "Penalty", 25, "Score" ):ToRed() --- or --- MessageRED = MESSAGE:New( "To the RED Players: You receive a penalty because you've killed one of your own units", "Penalty", 25, "Score" ) --- MessageRED:ToRed() -function MESSAGE:ToRed( ) - self:F() - - self:ToCoalition( coalition.side.RED ) - - return self -end - ---- Sends a MESSAGE to a Coalition. --- @param #MESSAGE self --- @param CoalitionSide needs to be filled out by the defined structure of the standard scripting engine @{coalition.side}. --- @return #MESSAGE --- @usage --- -- Send a message created with the @{New} method to the RED coalition. --- MessageRED = MESSAGE:New( "To the RED Players: You receive a penalty because you've killed one of your own units", "Penalty", 25, "Score" ):ToCoalition( coalition.side.RED ) --- or --- MESSAGE:New( "To the RED Players: You receive a penalty because you've killed one of your own units", "Penalty", 25, "Score" ):ToCoalition( coalition.side.RED ) --- or --- MessageRED = MESSAGE:New( "To the RED Players: You receive a penalty because you've killed one of your own units", "Penalty", 25, "Score" ) --- MessageRED:ToCoalition( coalition.side.RED ) -function MESSAGE:ToCoalition( CoalitionSide ) - self:F( CoalitionSide ) - - if CoalitionSide then - self:T( self.MessageCategory .. self.MessageText:gsub("\n$",""):gsub("\n$","") .. " / " .. self.MessageDuration ) - trigger.action.outTextForCoalition( CoalitionSide, self.MessageCategory .. self.MessageText:gsub("\n$",""):gsub("\n$",""), self.MessageDuration ) - end - - return self -end - ---- Sends a MESSAGE to all players. --- @param #MESSAGE self --- @return #MESSAGE --- @usage --- -- Send a message created to all players. --- MessageAll = MESSAGE:New( "To all Players: BLUE has won! Each player of BLUE wins 50 points!", "End of Mission", 25, "Win" ):ToAll() --- or --- MESSAGE:New( "To all Players: BLUE has won! Each player of BLUE wins 50 points!", "End of Mission", 25, "Win" ):ToAll() --- or --- MessageAll = MESSAGE:New( "To all Players: BLUE has won! Each player of BLUE wins 50 points!", "End of Mission", 25, "Win" ) --- MessageAll:ToAll() -function MESSAGE:ToAll() - self:F() - - self:ToCoalition( coalition.side.RED ) - self:ToCoalition( coalition.side.BLUE ) - - return self -end - - - ------ The MESSAGEQUEUE class ----- @type MESSAGEQUEUE ---MESSAGEQUEUE = { --- ClientGroups = {}, --- CoalitionSides = {} ---} --- ---function MESSAGEQUEUE:New( RefreshInterval ) --- local self = BASE:Inherit( self, BASE:New() ) --- self:F( { RefreshInterval } ) --- --- self.RefreshInterval = RefreshInterval --- --- --self.DisplayFunction = routines.scheduleFunction( self._DisplayMessages, { self }, 0, RefreshInterval ) --- self.DisplayFunction = SCHEDULER:New( self, self._DisplayMessages, {}, 0, RefreshInterval ) --- --- return self ---end --- ------ This function is called automatically by the MESSAGEQUEUE scheduler. ---function MESSAGEQUEUE:_DisplayMessages() --- --- -- First we display all messages that a coalition needs to receive... Also those who are not in a client (CA module clients...). --- for CoalitionSideID, CoalitionSideData in pairs( self.CoalitionSides ) do --- for MessageID, MessageData in pairs( CoalitionSideData.Messages ) do --- if MessageData.MessageSent == false then --- --trigger.action.outTextForCoalition( CoalitionSideID, MessageData.MessageCategory .. '\n' .. MessageData.MessageText:gsub("\n$",""):gsub("\n$",""), MessageData.MessageDuration ) --- MessageData.MessageSent = true --- end --- local MessageTimeLeft = ( MessageData.MessageTime + MessageData.MessageDuration ) - timer.getTime() --- if MessageTimeLeft <= 0 then --- MessageData = nil --- end --- end --- end --- --- -- Then we send the messages for each individual client, but also to be included are those Coalition messages for the Clients who belong to a coalition. --- -- Because the Client messages will overwrite the Coalition messages (for that Client). --- for ClientGroupName, ClientGroupData in pairs( self.ClientGroups ) do --- for MessageID, MessageData in pairs( ClientGroupData.Messages ) do --- if MessageData.MessageGroup == false then --- trigger.action.outTextForGroup( Group.getByName(ClientGroupName):getID(), MessageData.MessageCategory .. '\n' .. MessageData.MessageText:gsub("\n$",""):gsub("\n$",""), MessageData.MessageDuration ) --- MessageData.MessageGroup = true --- end --- local MessageTimeLeft = ( MessageData.MessageTime + MessageData.MessageDuration ) - timer.getTime() --- if MessageTimeLeft <= 0 then --- MessageData = nil --- end --- end --- --- -- Now check if the Client also has messages that belong to the Coalition of the Client... --- for CoalitionSideID, CoalitionSideData in pairs( self.CoalitionSides ) do --- for MessageID, MessageData in pairs( CoalitionSideData.Messages ) do --- local CoalitionGroup = Group.getByName( ClientGroupName ) --- if CoalitionGroup and CoalitionGroup:getCoalition() == CoalitionSideID then --- if MessageData.MessageCoalition == false then --- trigger.action.outTextForGroup( Group.getByName(ClientGroupName):getID(), MessageData.MessageCategory .. '\n' .. MessageData.MessageText:gsub("\n$",""):gsub("\n$",""), MessageData.MessageDuration ) --- MessageData.MessageCoalition = true --- end --- end --- local MessageTimeLeft = ( MessageData.MessageTime + MessageData.MessageDuration ) - timer.getTime() --- if MessageTimeLeft <= 0 then --- MessageData = nil --- end --- end --- end --- end --- --- return true ---end --- ------ The _MessageQueue object is created when the MESSAGE class module is loaded. -----_MessageQueue = MESSAGEQUEUE:New( 0.5 ) --- ---- Stages within a @{TASK} within a @{MISSION}. All of the STAGE functionality is considered internally administered and not to be used by any Mission designer. --- @module STAGE --- @author Flightcontrol - - - - - - - ---- The STAGE class --- @type -STAGE = { - ClassName = "STAGE", - MSG = { ID = "None", TIME = 10 }, - FREQUENCY = { NONE = 0, ONCE = 1, REPEAT = -1 }, - - Name = "NoStage", - StageType = '', - WaitTime = 1, - Frequency = 1, - MessageCount = 0, - MessageInterval = 15, - MessageShown = {}, - MessageShow = false, - MessageFlash = false -} - - -function STAGE:New() - local self = BASE:Inherit( self, BASE:New() ) - self:F() - return self -end - -function STAGE:Execute( Mission, Client, Task ) - - local Valid = true - - return Valid -end - -function STAGE:Executing( Mission, Client, Task ) - -end - -function STAGE:Validate( Mission, Client, Task ) - local Valid = true - - return Valid -end - - -STAGEBRIEF = { - ClassName = "BRIEF", - MSG = { ID = "Brief", TIME = 1 }, - Name = "Brief", - StageBriefingTime = 0, - StageBriefingDuration = 1 -} - -function STAGEBRIEF:New() - local self = BASE:Inherit( self, STAGE:New() ) - self:F() - self.StageType = 'CLIENT' - return self -end - ---- Execute --- @param #STAGEBRIEF self --- @param Mission#MISSION Mission --- @param Client#CLIENT Client --- @param Task#TASK Task --- @return #boolean -function STAGEBRIEF:Execute( Mission, Client, Task ) - local Valid = BASE:Inherited(self):Execute( Mission, Client, Task ) - self:F() - Client:ShowMissionBriefing( Mission.MissionBriefing ) - self.StageBriefingTime = timer.getTime() - return Valid -end - -function STAGEBRIEF:Validate( Mission, Client, Task ) - local Valid = STAGE:Validate( Mission, Client, Task ) - self:T() - - if timer.getTime() - self.StageBriefingTime <= self.StageBriefingDuration then - return 0 - else - self.StageBriefingTime = timer.getTime() - return 1 - end - -end - - -STAGESTART = { - ClassName = "START", - MSG = { ID = "Start", TIME = 1 }, - Name = "Start", - StageStartTime = 0, - StageStartDuration = 1 -} - -function STAGESTART:New() - local self = BASE:Inherit( self, STAGE:New() ) - self:F() - self.StageType = 'CLIENT' - return self -end - -function STAGESTART:Execute( Mission, Client, Task ) - self:F() - local Valid = BASE:Inherited(self):Execute( Mission, Client, Task ) - if Task.TaskBriefing then - Client:Message( Task.TaskBriefing, 30, Mission.Name .. "/Stage", "Command" ) - else - Client:Message( 'Task ' .. Task.TaskNumber .. '.', 30, Mission.Name .. "/Stage", "Command" ) - end - self.StageStartTime = timer.getTime() - return Valid -end - -function STAGESTART:Validate( Mission, Client, Task ) - self:F() - local Valid = STAGE:Validate( Mission, Client, Task ) - - if timer.getTime() - self.StageStartTime <= self.StageStartDuration then - return 0 - else - self.StageStartTime = timer.getTime() - return 1 - end - - return 1 - -end - -STAGE_CARGO_LOAD = { - ClassName = "STAGE_CARGO_LOAD" -} - -function STAGE_CARGO_LOAD:New() - local self = BASE:Inherit( self, STAGE:New() ) - self:F() - self.StageType = 'CLIENT' - return self -end - -function STAGE_CARGO_LOAD:Execute( Mission, Client, Task ) - self:F() - local Valid = BASE:Inherited(self):Execute( Mission, Client, Task ) - - for LoadCargoID, LoadCargo in pairs( Task.Cargos.LoadCargos ) do - LoadCargo:Load( Client ) - end - - if Mission.MissionReportFlash and Client:IsTransport() then - Client:ShowCargo() - end - - return Valid -end - -function STAGE_CARGO_LOAD:Validate( Mission, Client, Task ) - self:F() - local Valid = STAGE:Validate( Mission, Client, Task ) - - return 1 -end - - -STAGE_CARGO_INIT = { - ClassName = "STAGE_CARGO_INIT" -} - -function STAGE_CARGO_INIT:New() - local self = BASE:Inherit( self, STAGE:New() ) - self:F() - self.StageType = 'CLIENT' - return self -end - -function STAGE_CARGO_INIT:Execute( Mission, Client, Task ) - self:F() - local Valid = BASE:Inherited(self):Execute( Mission, Client, Task ) - - for InitLandingZoneID, InitLandingZone in pairs( Task.LandingZones.LandingZones ) do - self:T( InitLandingZone ) - InitLandingZone:Spawn() - end - - - self:T( Task.Cargos.InitCargos ) - for InitCargoID, InitCargoData in pairs( Task.Cargos.InitCargos ) do - self:T( { InitCargoData } ) - InitCargoData:Spawn( Client ) - end - - return Valid -end - - -function STAGE_CARGO_INIT:Validate( Mission, Client, Task ) - self:F() - local Valid = STAGE:Validate( Mission, Client, Task ) - - return 1 -end - - - -STAGEROUTE = { - ClassName = "STAGEROUTE", - MSG = { ID = "Route", TIME = 5 }, - Frequency = STAGE.FREQUENCY.REPEAT, - Name = "Route" -} - -function STAGEROUTE:New() - local self = BASE:Inherit( self, STAGE:New() ) - self:F() - self.StageType = 'CLIENT' - self.MessageSwitch = true - return self -end - - ---- Execute the routing. --- @param #STAGEROUTE self --- @param Mission#MISSION Mission --- @param Client#CLIENT Client --- @param Task#TASK Task -function STAGEROUTE:Execute( Mission, Client, Task ) - self:F() - local Valid = BASE:Inherited(self):Execute( Mission, Client, Task ) - - local RouteMessage = "Fly to: " - self:T( Task.LandingZones ) - for LandingZoneID, LandingZoneName in pairs( Task.LandingZones.LandingZoneNames ) do - RouteMessage = RouteMessage .. "\n " .. LandingZoneName .. ' at ' .. routines.getBRStringZone( { zone = LandingZoneName, ref = Client:GetClientGroupDCSUnit():getPoint(), true, true } ) .. ' km.' - end - - if Client:IsMultiSeated() then - Client:Message( RouteMessage, self.MSG.TIME, Mission.Name .. "/StageRoute", "Co-Pilot", 20 ) - else - Client:Message( RouteMessage, self.MSG.TIME, Mission.Name .. "/StageRoute", "Command", 20 ) - end - - - if Mission.MissionReportFlash and Client:IsTransport() then - Client:ShowCargo() - end - - return Valid -end - -function STAGEROUTE:Validate( Mission, Client, Task ) - self:F() - local Valid = STAGE:Validate( Mission, Client, Task ) - - -- check if the Client is in the landing zone - self:T( Task.LandingZones.LandingZoneNames ) - Task.CurrentLandingZoneName = routines.IsUnitNearZonesRadius( Client:GetClientGroupDCSUnit(), Task.LandingZones.LandingZoneNames, 500 ) - - if Task.CurrentLandingZoneName then - - Task.CurrentLandingZone = Task.LandingZones.LandingZones[Task.CurrentLandingZoneName].CargoZone - Task.CurrentCargoZone = Task.LandingZones.LandingZones[Task.CurrentLandingZoneName] - - if Task.CurrentCargoZone then - if not Task.Signalled then - Task.Signalled = Task.CurrentCargoZone:Signal() - end - end - - self:T( 1 ) - return 1 - end - - self:T( 0 ) - return 0 -end - - - -STAGELANDING = { - ClassName = "STAGELANDING", - MSG = { ID = "Landing", TIME = 10 }, - Name = "Landing", - Signalled = false -} - -function STAGELANDING:New() - local self = BASE:Inherit( self, STAGE:New() ) - self:F() - self.StageType = 'CLIENT' - return self -end - ---- Execute the landing coordination. --- @param #STAGELANDING self --- @param Mission#MISSION Mission --- @param Client#CLIENT Client --- @param Task#TASK Task -function STAGELANDING:Execute( Mission, Client, Task ) - self:F() - - if Client:IsMultiSeated() then - Client:Message( "We have arrived at the landing zone.", self.MSG.TIME, Mission.Name .. "/StageArrived", "Co-Pilot", 10 ) - else - Client:Message( "You have arrived at the landing zone.", self.MSG.TIME, Mission.Name .. "/StageArrived", "Command", 10 ) - end - - Task.HostUnit = Task.CurrentCargoZone:GetHostUnit() - - self:T( { Task.HostUnit } ) - - if Task.HostUnit then - - Task.HostUnitName = Task.HostUnit:GetPrefix() - Task.HostUnitTypeName = Task.HostUnit:GetTypeName() - - local HostMessage = "" - Task.CargoNames = "" - - local IsFirst = true - - for CargoID, Cargo in pairs( CARGOS ) do - if Cargo.CargoType == Task.CargoType then - - if Cargo:IsLandingRequired() then - self:T( "Task for cargo " .. Cargo.CargoType .. " requires landing.") - Task.IsLandingRequired = true - end - - if Cargo:IsSlingLoad() then - self:T( "Task for cargo " .. Cargo.CargoType .. " is a slingload.") - Task.IsSlingLoad = true - end - - if IsFirst then - IsFirst = false - Task.CargoNames = Task.CargoNames .. Cargo.CargoName .. "( " .. Cargo.CargoWeight .. " )" - else - Task.CargoNames = Task.CargoNames .. "; " .. Cargo.CargoName .. "( " .. Cargo.CargoWeight .. " )" - end - end - end - - if Task.IsLandingRequired then - HostMessage = "Land the helicopter to " .. Task.TEXT[1] .. " " .. Task.CargoNames .. "." - else - HostMessage = "Use the Radio menu and F6 to find the cargo, then fly or land near the cargo and " .. Task.TEXT[1] .. " " .. Task.CargoNames .. "." - end - - local Host = "Command" - if Task.HostUnitName then - Host = Task.HostUnitName .. " (" .. Task.HostUnitTypeName .. ")" - else - if Client:IsMultiSeated() then - Host = "Co-Pilot" - end - end - - Client:Message( HostMessage, self.MSG.TIME, Mission.Name .. "/STAGELANDING.EXEC." .. Host, Host, 10 ) - - end -end - -function STAGELANDING:Validate( Mission, Client, Task ) - self:F() - - Task.CurrentLandingZoneName = routines.IsUnitNearZonesRadius( Client:GetClientGroupDCSUnit(), Task.LandingZones.LandingZoneNames, 500 ) - if Task.CurrentLandingZoneName then - - -- Client is in de landing zone. - self:T( Task.CurrentLandingZoneName ) - - Task.CurrentLandingZone = Task.LandingZones.LandingZones[Task.CurrentLandingZoneName].CargoZone - Task.CurrentCargoZone = Task.LandingZones.LandingZones[Task.CurrentLandingZoneName] - - if Task.CurrentCargoZone then - if not Task.Signalled then - Task.Signalled = Task.CurrentCargoZone:Signal() - end - end - else - if Task.CurrentLandingZone then - Task.CurrentLandingZone = nil - end - if Task.CurrentCargoZone then - Task.CurrentCargoZone = nil - end - Task.Signalled = false - Task:RemoveCargoMenus( Client ) - self:T( -1 ) - return -1 - end - - - local DCSUnitVelocityVec3 = Client:GetClientGroupDCSUnit():getVelocity() - local DCSUnitVelocity = ( DCSUnitVelocityVec3.x ^2 + DCSUnitVelocityVec3.y ^2 + DCSUnitVelocityVec3.z ^2 ) ^ 0.5 - - local DCSUnitPointVec3 = Client:GetClientGroupDCSUnit():getPoint() - local LandHeight = land.getHeight( { x = DCSUnitPointVec3.x, y = DCSUnitPointVec3.z } ) - local DCSUnitHeight = DCSUnitPointVec3.y - LandHeight - - self:T( { Task.IsLandingRequired, Client:GetClientGroupDCSUnit():inAir() } ) - if Task.IsLandingRequired and not Client:GetClientGroupDCSUnit():inAir() then - self:T( 1 ) - Task.IsInAirTestRequired = true - return 1 - end - - self:T( { DCSUnitVelocity, DCSUnitHeight, LandHeight, Task.CurrentCargoZone.SignalHeight } ) - if Task.IsLandingRequired and DCSUnitVelocity <= 0.05 and DCSUnitHeight <= Task.CurrentCargoZone.SignalHeight then - self:T( 1 ) - Task.IsInAirTestRequired = false - return 1 - end - - self:T( 0 ) - return 0 -end - -STAGELANDED = { - ClassName = "STAGELANDED", - MSG = { ID = "Land", TIME = 10 }, - Name = "Landed", - MenusAdded = false -} - -function STAGELANDED:New() - local self = BASE:Inherit( self, STAGE:New() ) - self:F() - self.StageType = 'CLIENT' - return self -end - -function STAGELANDED:Execute( Mission, Client, Task ) - self:F() - - if Task.IsLandingRequired then - - local Host = "Command" - if Task.HostUnitName then - Host = Task.HostUnitName .. " (" .. Task.HostUnitTypeName .. ")" - else - if Client:IsMultiSeated() then - Host = "Co-Pilot" - end - end - - Client:Message( 'You have landed within the landing zone. Use the radio menu (F10) to ' .. Task.TEXT[1] .. ' the ' .. Task.CargoType .. '.', - self.MSG.TIME, Mission.Name .. "/STAGELANDED.EXEC" .. Host, Host ) - - if not self.MenusAdded then - Task.Cargo = nil - Task:RemoveCargoMenus( Client ) - Task:AddCargoMenus( Client, CARGOS, 250 ) - end - end -end - - - -function STAGELANDED:Validate( Mission, Client, Task ) - self:F() - - if not routines.IsUnitNearZonesRadius( Client:GetClientGroupDCSUnit(), Task.CurrentLandingZoneName, 500 ) then - self:T( "Client is not anymore in the landing zone, go back to stage Route, and remove cargo menus." ) - Task.Signalled = false - Task:RemoveCargoMenus( Client ) - self:T( -2 ) - return -2 - end - - local DCSUnitVelocityVec3 = Client:GetClientGroupDCSUnit():getVelocity() - local DCSUnitVelocity = ( DCSUnitVelocityVec3.x ^2 + DCSUnitVelocityVec3.y ^2 + DCSUnitVelocityVec3.z ^2 ) ^ 0.5 - - local DCSUnitPointVec3 = Client:GetClientGroupDCSUnit():getPoint() - local LandHeight = land.getHeight( { x = DCSUnitPointVec3.x, y = DCSUnitPointVec3.z } ) - local DCSUnitHeight = DCSUnitPointVec3.y - LandHeight - - self:T( { Task.IsLandingRequired, Client:GetClientGroupDCSUnit():inAir() } ) - if Task.IsLandingRequired and Task.IsInAirTestRequired == true and Client:GetClientGroupDCSUnit():inAir() then - self:T( "Client went back in the air. Go back to stage Landing." ) - self:T( -1 ) - return -1 - end - - self:T( { DCSUnitVelocity, DCSUnitHeight, LandHeight, Task.CurrentCargoZone.SignalHeight } ) - if Task.IsLandingRequired and Task.IsInAirTestRequired == false and DCSUnitVelocity >= 2 and DCSUnitHeight >= Task.CurrentCargoZone.SignalHeight then - self:T( "It seems the Client went back in the air and over the boundary limits. Go back to stage Landing." ) - self:T( -1 ) - return -1 - end - - -- Wait until cargo is selected from the menu. - if Task.IsLandingRequired then - if not Task.Cargo then - self:T( 0 ) - return 0 - end - end - - self:T( 1 ) - return 1 -end - -STAGEUNLOAD = { - ClassName = "STAGEUNLOAD", - MSG = { ID = "Unload", TIME = 10 }, - Name = "Unload" -} - -function STAGEUNLOAD:New() - local self = BASE:Inherit( self, STAGE:New() ) - self:F() - self.StageType = 'CLIENT' - return self -end - ---- Coordinate UnLoading --- @param #STAGEUNLOAD self --- @param Mission#MISSION Mission --- @param Client#CLIENT Client --- @param Task#TASK Task -function STAGEUNLOAD:Execute( Mission, Client, Task ) - self:F() - - if Client:IsMultiSeated() then - Client:Message( 'The ' .. Task.CargoType .. ' are being ' .. Task.TEXT[2] .. ' within the landing zone. Wait until the helicopter is ' .. Task.TEXT[3] .. '.', - self.MSG.TIME, Mission.Name .. "/StageUnLoad", "Co-Pilot" ) - else - Client:Message( 'You are unloading the ' .. Task.CargoType .. ' ' .. Task.TEXT[2] .. ' within the landing zone. Wait until the helicopter is ' .. Task.TEXT[3] .. '.', - self.MSG.TIME, Mission.Name .. "/StageUnLoad", "Command" ) - end - Task:RemoveCargoMenus( Client ) -end - -function STAGEUNLOAD:Executing( Mission, Client, Task ) - self:F() - env.info( 'STAGEUNLOAD:Executing() Task.Cargo.CargoName = ' .. Task.Cargo.CargoName ) - - local TargetZoneName - - if Task.TargetZoneName then - TargetZoneName = Task.TargetZoneName - else - TargetZoneName = Task.CurrentLandingZoneName - end - - if Task.Cargo:UnLoad( Client, TargetZoneName ) then - Task.ExecuteStage = _TransportExecuteStage.SUCCESS - if Mission.MissionReportFlash then - Client:ShowCargo() - end - end -end - ---- Validate UnLoading --- @param #STAGEUNLOAD self --- @param Mission#MISSION Mission --- @param Client#CLIENT Client --- @param Task#TASK Task -function STAGEUNLOAD:Validate( Mission, Client, Task ) - self:F() - env.info( 'STAGEUNLOAD:Validate()' ) - - if routines.IsUnitNearZonesRadius( Client:GetClientGroupDCSUnit(), Task.CurrentLandingZoneName, 500 ) then - else - Task.ExecuteStage = _TransportExecuteStage.FAILED - Task:RemoveCargoMenus( Client ) - if Client:IsMultiSeated() then - Client:Message( 'The ' .. Task.CargoType .. " haven't been successfully " .. Task.TEXT[3] .. ' within the landing zone. Task and mission has failed.', - _TransportStageMsgTime.DONE, Mission.Name .. "/StageFailure", "Co-Pilot" ) - else - Client:Message( 'The ' .. Task.CargoType .. " haven't been successfully " .. Task.TEXT[3] .. ' within the landing zone. Task and mission has failed.', - _TransportStageMsgTime.DONE, Mission.Name .. "/StageFailure", "Command" ) - end - return 1 - end - - if not Client:GetClientGroupDCSUnit():inAir() then - else - Task.ExecuteStage = _TransportExecuteStage.FAILED - Task:RemoveCargoMenus( Client ) - if Client:IsMultiSeated() then - Client:Message( 'The ' .. Task.CargoType .. " haven't been successfully " .. Task.TEXT[3] .. ' within the landing zone. Task and mission has failed.', - _TransportStageMsgTime.DONE, Mission.Name .. "/StageFailure", "Co-Pilot" ) - else - Client:Message( 'The ' .. Task.CargoType .. " haven't been successfully " .. Task.TEXT[3] .. ' within the landing zone. Task and mission has failed.', - _TransportStageMsgTime.DONE, Mission.Name .. "/StageFailure", "Command" ) - end - return 1 - end - - if Task.ExecuteStage == _TransportExecuteStage.SUCCESS then - if Client:IsMultiSeated() then - Client:Message( 'The ' .. Task.CargoType .. ' have been sucessfully ' .. Task.TEXT[3] .. ' within the landing zone.', _TransportStageMsgTime.DONE, Mission.Name .. "/Stage", "Co-Pilot" ) - else - Client:Message( 'The ' .. Task.CargoType .. ' have been sucessfully ' .. Task.TEXT[3] .. ' within the landing zone.', _TransportStageMsgTime.DONE, Mission.Name .. "/Stage", "Command" ) - end - Task:RemoveCargoMenus( Client ) - Task.MissionTask:AddGoalCompletion( Task.MissionTask.GoalVerb, Task.CargoName, 1 ) -- We set the cargo as one more goal completed in the mission. - return 1 - end - - return 1 -end - -STAGELOAD = { - ClassName = "STAGELOAD", - MSG = { ID = "Load", TIME = 10 }, - Name = "Load" -} - -function STAGELOAD:New() - local self = BASE:Inherit( self, STAGE:New() ) - self:F() - self.StageType = 'CLIENT' - return self -end - -function STAGELOAD:Execute( Mission, Client, Task ) - self:F() - - if not Task.IsSlingLoad then - - local Host = "Command" - if Task.HostUnitName then - Host = Task.HostUnitName .. " (" .. Task.HostUnitTypeName .. ")" - else - if Client:IsMultiSeated() then - Host = "Co-Pilot" - end - end - - Client:Message( 'The ' .. Task.CargoType .. ' are being ' .. Task.TEXT[2] .. ' within the landing zone. Wait until the helicopter is ' .. Task.TEXT[3] .. '.', - _TransportStageMsgTime.EXECUTING, Mission.Name .. "/STAGELOAD.EXEC." .. Host, Host ) - - -- Route the cargo to the Carrier - - Task.Cargo:OnBoard( Client, Task.CurrentCargoZone, Task.OnBoardSide ) - Task.ExecuteStage = _TransportExecuteStage.EXECUTING - else - Task.ExecuteStage = _TransportExecuteStage.EXECUTING - end -end - -function STAGELOAD:Executing( Mission, Client, Task ) - self:F() - - -- If the Cargo is ready to be loaded, load it into the Client. - - local Host = "Command" - if Task.HostUnitName then - Host = Task.HostUnitName .. " (" .. Task.HostUnitTypeName .. ")" - else - if Client:IsMultiSeated() then - Host = "Co-Pilot" - end - end - - if not Task.IsSlingLoad then - self:T( Task.Cargo.CargoName) - - if Task.Cargo:OnBoarded( Client, Task.CurrentCargoZone ) then - - -- Load the Cargo onto the Client - Task.Cargo:Load( Client ) - - -- Message to the pilot that cargo has been loaded. - Client:Message( "The cargo " .. Task.Cargo.CargoName .. " has been loaded in our helicopter.", - 20, Mission.Name .. "/STAGELANDING.LOADING1." .. Host, Host ) - Task.ExecuteStage = _TransportExecuteStage.SUCCESS - - Client:ShowCargo() - end - else - Client:Message( "Hook the " .. Task.CargoNames .. " onto the helicopter " .. Task.TEXT[3] .. " within the landing zone.", - _TransportStageMsgTime.EXECUTING, Mission.Name .. "/STAGELOAD.LOADING.1." .. Host, Host , 10 ) - for CargoID, Cargo in pairs( CARGOS ) do - self:T( "Cargo.CargoName = " .. Cargo.CargoName ) - - if Cargo:IsSlingLoad() then - local CargoStatic = StaticObject.getByName( Cargo.CargoStaticName ) - if CargoStatic then - self:T( "Cargo is found in the DCS simulator.") - local CargoStaticPosition = CargoStatic:getPosition().p - self:T( "Cargo Position x = " .. CargoStaticPosition.x .. ", y = " .. CargoStaticPosition.y .. ", z = " .. CargoStaticPosition.z ) - local CargoStaticHeight = routines.GetUnitHeight( CargoStatic ) - if CargoStaticHeight > 5 then - self:T( "Cargo is airborne.") - Cargo:StatusLoaded() - Task.Cargo = Cargo - Client:Message( 'The Cargo has been successfully hooked onto the helicopter and is now being sling loaded. Fly outside the landing zone.', - self.MSG.TIME, Mission.Name .. "/STAGELANDING.LOADING.2." .. Host, Host ) - Task.ExecuteStage = _TransportExecuteStage.SUCCESS - break - end - else - self:T( "Cargo not found in the DCS simulator." ) - end - end - end - end - -end - -function STAGELOAD:Validate( Mission, Client, Task ) - self:F() - - self:T( "Task.CurrentLandingZoneName = " .. Task.CurrentLandingZoneName ) - - local Host = "Command" - if Task.HostUnitName then - Host = Task.HostUnitName .. " (" .. Task.HostUnitTypeName .. ")" - else - if Client:IsMultiSeated() then - Host = "Co-Pilot" - end - end - - if not Task.IsSlingLoad then - if not routines.IsUnitNearZonesRadius( Client:GetClientGroupDCSUnit(), Task.CurrentLandingZoneName, 500 ) then - Task:RemoveCargoMenus( Client ) - Task.ExecuteStage = _TransportExecuteStage.FAILED - Task.CargoName = nil - Client:Message( "The " .. Task.CargoType .. " loading has been aborted. You flew outside the pick-up zone while loading. ", - self.MSG.TIME, Mission.Name .. "/STAGELANDING.VALIDATE.1." .. Host, Host ) - self:T( -1 ) - return -1 - end - - local DCSUnitVelocityVec3 = Client:GetClientGroupDCSUnit():getVelocity() - local DCSUnitVelocity = ( DCSUnitVelocityVec3.x ^2 + DCSUnitVelocityVec3.y ^2 + DCSUnitVelocityVec3.z ^2 ) ^ 0.5 - - local DCSUnitPointVec3 = Client:GetClientGroupDCSUnit():getPoint() - local LandHeight = land.getHeight( { x = DCSUnitPointVec3.x, y = DCSUnitPointVec3.z } ) - local DCSUnitHeight = DCSUnitPointVec3.y - LandHeight - - self:T( { Task.IsLandingRequired, Client:GetClientGroupDCSUnit():inAir() } ) - if Task.IsLandingRequired and Task.IsInAirTestRequired == true and Client:GetClientGroupDCSUnit():inAir() then - Task:RemoveCargoMenus( Client ) - Task.ExecuteStage = _TransportExecuteStage.FAILED - Task.CargoName = nil - Client:Message( "The " .. Task.CargoType .. " loading has been aborted. Re-start the " .. Task.TEXT[3] .. " process. Don't fly outside the pick-up zone.", - self.MSG.TIME, Mission.Name .. "/STAGELANDING.VALIDATE.1." .. Host, Host ) - self:T( -1 ) - return -1 - end - - self:T( { DCSUnitVelocity, DCSUnitHeight, LandHeight, Task.CurrentCargoZone.SignalHeight } ) - if Task.IsLandingRequired and Task.IsInAirTestRequired == false and DCSUnitVelocity >= 2 and DCSUnitHeight >= Task.CurrentCargoZone.SignalHeight then - Task:RemoveCargoMenus( Client ) - Task.ExecuteStage = _TransportExecuteStage.FAILED - Task.CargoName = nil - Client:Message( "The " .. Task.CargoType .. " loading has been aborted. Re-start the " .. Task.TEXT[3] .. " process. Don't fly outside the pick-up zone.", - self.MSG.TIME, Mission.Name .. "/STAGELANDING.VALIDATE.1." .. Host, Host ) - self:T( -1 ) - return -1 - end - - if Task.ExecuteStage == _TransportExecuteStage.SUCCESS then - Task:RemoveCargoMenus( Client ) - Client:Message( "Good Job. The " .. Task.CargoType .. " has been sucessfully " .. Task.TEXT[3] .. " within the landing zone.", - self.MSG.TIME, Mission.Name .. "/STAGELANDING.VALIDATE.3." .. Host, Host ) - Task.MissionTask:AddGoalCompletion( Task.MissionTask.GoalVerb, Task.CargoName, 1 ) - self:T( 1 ) - return 1 - end - - else - if Task.ExecuteStage == _TransportExecuteStage.SUCCESS then - CargoStatic = StaticObject.getByName( Task.Cargo.CargoStaticName ) - if CargoStatic and not routines.IsStaticInZones( CargoStatic, Task.CurrentLandingZoneName ) then - Client:Message( "Good Job. The " .. Task.CargoType .. " has been sucessfully " .. Task.TEXT[3] .. " and flown outside of the landing zone.", - self.MSG.TIME, Mission.Name .. "/STAGELANDING.VALIDATE.4." .. Host, Host ) - Task.MissionTask:AddGoalCompletion( Task.MissionTask.GoalVerb, Task.Cargo.CargoName, 1 ) - self:T( 1 ) - return 1 - end - end - - end - - - self:T( 0 ) - return 0 -end - - -STAGEDONE = { - ClassName = "STAGEDONE", - MSG = { ID = "Done", TIME = 10 }, - Name = "Done" -} - -function STAGEDONE:New() - local self = BASE:Inherit( self, STAGE:New() ) - self:F() - self.StageType = 'AI' - return self -end - -function STAGEDONE:Execute( Mission, Client, Task ) - self:F() - -end - -function STAGEDONE:Validate( Mission, Client, Task ) - self:F() - - Task:Done() - - return 0 -end - -STAGEARRIVE = { - ClassName = "STAGEARRIVE", - MSG = { ID = "Arrive", TIME = 10 }, - Name = "Arrive" -} - -function STAGEARRIVE:New() - local self = BASE:Inherit( self, STAGE:New() ) - self:F() - self.StageType = 'CLIENT' - return self -end - - ---- Execute Arrival --- @param #STAGEARRIVE self --- @param Mission#MISSION Mission --- @param Client#CLIENT Client --- @param Task#TASK Task -function STAGEARRIVE:Execute( Mission, Client, Task ) - self:F() - - if Client:IsMultiSeated() then - Client:Message( 'We have arrived at ' .. Task.CurrentLandingZoneName .. ".", self.MSG.TIME, Mission.Name .. "/Stage", "Co-Pilot" ) - else - Client:Message( 'We have arrived at ' .. Task.CurrentLandingZoneName .. ".", self.MSG.TIME, Mission.Name .. "/Stage", "Command" ) - end - -end - -function STAGEARRIVE:Validate( Mission, Client, Task ) - self:F() - - Task.CurrentLandingZoneID = routines.IsUnitInZones( Client:GetClientGroupDCSUnit(), Task.LandingZones ) - if ( Task.CurrentLandingZoneID ) then - else - return -1 - end - - return 1 -end - -STAGEGROUPSDESTROYED = { - ClassName = "STAGEGROUPSDESTROYED", - DestroyGroupSize = -1, - Frequency = STAGE.FREQUENCY.REPEAT, - MSG = { ID = "DestroyGroup", TIME = 10 }, - Name = "GroupsDestroyed" -} - -function STAGEGROUPSDESTROYED:New() - local self = BASE:Inherit( self, STAGE:New() ) - self:F() - self.StageType = 'AI' - return self -end - ---function STAGEGROUPSDESTROYED:Execute( Mission, Client, Task ) --- --- Client:Message( 'Task: Still ' .. DestroyGroupSize .. " of " .. Task.DestroyGroupCount .. " " .. Task.DestroyGroupType .. " to be destroyed!", self.MSG.TIME, Mission.Name .. "/Stage" ) --- ---end - -function STAGEGROUPSDESTROYED:Validate( Mission, Client, Task ) - self:F() - - if Task.MissionTask:IsGoalReached() then - return 1 - else - return 0 - end -end - -function STAGEGROUPSDESTROYED:Execute( Mission, Client, Task ) - self:F() - self:T( { Task.ClassName, Task.Destroyed } ) - --env.info( 'Event Table Task = ' .. tostring(Task) ) - -end - - - - - - - - - - - - - ---[[ - _TransportStage: Defines the different stages of which of transport missions can be in. This table is internal and is used to control the sequence of messages, actions and flow. - - - _TransportStage.START - - _TransportStage.ROUTE - - _TransportStage.LAND - - _TransportStage.EXECUTE - - _TransportStage.DONE - - _TransportStage.REMOVE ---]] -_TransportStage = { - HOLD = "HOLD", - START = "START", - ROUTE = "ROUTE", - LANDING = "LANDING", - LANDED = "LANDED", - EXECUTING = "EXECUTING", - LOAD = "LOAD", - UNLOAD = "UNLOAD", - DONE = "DONE", - NEXT = "NEXT" -} - -_TransportStageMsgTime = { - HOLD = 10, - START = 60, - ROUTE = 5, - LANDING = 10, - LANDED = 30, - EXECUTING = 30, - LOAD = 30, - UNLOAD = 30, - DONE = 30, - NEXT = 0 -} - -_TransportStageTime = { - HOLD = 10, - START = 5, - ROUTE = 5, - LANDING = 1, - LANDED = 1, - EXECUTING = 5, - LOAD = 5, - UNLOAD = 5, - DONE = 1, - NEXT = 0 -} - -_TransportStageAction = { - REPEAT = -1, - NONE = 0, - ONCE = 1 -} ---- The TASK Classes define major end-to-end activities within a MISSION. The TASK Class is the Master Class to orchestrate these activities. From this class, many concrete TASK classes are inherited. --- @module TASK - - - - - - - ---- The TASK class --- @type TASK --- @extends Base#BASE -TASK = { - - -- Defines the different signal types with a Task. - SIGNAL = { - COLOR = { - RED = { ID = 1, COLOR = trigger.smokeColor.Red, TEXT = "A red" }, - GREEN = { ID = 2, COLOR = trigger.smokeColor.Green, TEXT = "A green" }, - BLUE = { ID = 3, COLOR = trigger.smokeColor.Blue, TEXT = "A blue" }, - WHITE = { ID = 4, COLOR = trigger.smokeColor.White, TEXT = "A white" }, - ORANGE = { ID = 5, COLOR = trigger.smokeColor.Orange, TEXT = "An orange" } - }, - TYPE = { - SMOKE = { ID = 1, TEXT = "smoke" }, - FLARE = { ID = 2, TEXT = "flare" } - } - }, - ClassName = "TASK", - Mission = {}, -- Owning mission of the Task - Name = '', - Stages = {}, - Stage = {}, - Cargos = { - InitCargos = {}, - LoadCargos = {} - }, - LandingZones = { - LandingZoneNames = {}, - LandingZones = {} - }, - ActiveStage = 0, - TaskDone = false, - TaskFailed = false, - GoalTasks = {} -} - ---- Instantiates a new TASK Base. Should never be used. Interface Class. --- @return TASK -function TASK:New() - local self = BASE:Inherit( self, BASE:New() ) - self:F() - - -- assign Task default values during construction - self.TaskBriefing = "Task: No Task." - self.Time = timer.getTime() - self.ExecuteStage = _TransportExecuteStage.NONE - - return self -end - -function TASK:SetStage( StageSequenceIncrement ) - self:F( { StageSequenceIncrement } ) - - local Valid = false - if StageSequenceIncrement ~= 0 then - self.ActiveStage = self.ActiveStage + StageSequenceIncrement - if 1 <= self.ActiveStage and self.ActiveStage <= #self.Stages then - self.Stage = self.Stages[self.ActiveStage] - self:T( { self.Stage.Name } ) - self.Frequency = self.Stage.Frequency - Valid = true - else - Valid = false - env.info( "TASK:SetStage() self.ActiveStage is smaller or larger than self.Stages array. self.ActiveStage = " .. self.ActiveStage ) - end - end - self.Time = timer.getTime() - return Valid -end - -function TASK:Init() - self:F() - self.ActiveStage = 0 - self:SetStage(1) - self.TaskDone = false - self.TaskFailed = false -end - - ---- Get progress of a TASK. --- @return string GoalsText -function TASK:GetGoalProgress() - self:F2() - - local GoalsText = "" - for GoalVerb, GoalVerbData in pairs( self.GoalTasks ) do - local Goals = self:GetGoalCompletion( GoalVerb ) - if Goals and Goals ~= "" then - Goals = '(' .. Goals .. ')' - else - Goals = '( - )' - end - GoalsText = GoalsText .. GoalVerb .. ': ' .. self:GetGoalCount(GoalVerb) .. ' goals ' .. Goals .. ' of ' .. self:GetGoalTotal(GoalVerb) .. ' goals completed (' .. self:GetGoalPercentage(GoalVerb) .. '%); ' - end - - if GoalsText == "" then - GoalsText = "( - )" - end - - return GoalsText -end - ---- Show progress of a TASK. --- @param MISSION Mission Group structure describing the Mission. --- @param CLIENT Client Group structure describing the Client. -function TASK:ShowGoalProgress( Mission, Client ) - self:F2() - - local GoalsText = "" - for GoalVerb, GoalVerbData in pairs( self.GoalTasks ) do - if Mission:IsCompleted() then - else - local Goals = self:GetGoalCompletion( GoalVerb ) - if Goals and Goals ~= "" then - else - Goals = "-" - end - GoalsText = GoalsText .. self:GetGoalProgress() - end - end - - if Mission.MissionReportFlash or Mission.MissionReportShow then - Client:Message( GoalsText, 10, "/TASKPROGRESS" .. self.ClassName, "Mission Command: Task Status", 30 ) - end -end - ---- Sets a TASK to status Done. -function TASK:Done() - self:F2() - self.TaskDone = true -end - ---- Returns if a TASK is done. --- @return bool -function TASK:IsDone() - self:F2( self.TaskDone ) - return self.TaskDone -end - ---- Sets a TASK to status failed. -function TASK:Failed() - self:F() - self.TaskFailed = true -end - ---- Returns if a TASk has failed. --- @return bool -function TASK:IsFailed() - self:F2( self.TaskFailed ) - return self.TaskFailed -end - -function TASK:Reset( Mission, Client ) - self:F2() - self.ExecuteStage = _TransportExecuteStage.NONE -end - ---- Returns the Goals of a TASK --- @return @table Goals -function TASK:GetGoals() - return self.GoalTasks -end - ---- Returns if a TASK has Goal(s). --- @param #TASK self --- @param #string GoalVerb is the name of the Goal of the TASK. --- @return bool -function TASK:Goal( GoalVerb ) - self:F2( { GoalVerb } ) - if not GoalVerb then - GoalVerb = self.GoalVerb - end - self:T2( {self.GoalTasks[GoalVerb] } ) - if self.GoalTasks[GoalVerb] and self.GoalTasks[GoalVerb].GoalTotal > 0 then - return true - else - return false - end -end - ---- Sets the total Goals to be achieved of the Goal Name --- @param number GoalTotal is the number of times the GoalVerb needs to be achieved. --- @param ?string GoalVerb is the name of the Goal of the TASK. If the GoalVerb is not given, then the default TASK Goals will be used. -function TASK:SetGoalTotal( GoalTotal, GoalVerb ) - self:F2( { GoalTotal, GoalVerb } ) - - if not GoalVerb then - GoalVerb = self.GoalVerb - end - self.GoalTasks[GoalVerb] = {} - self.GoalTasks[GoalVerb].Goals = {} - self.GoalTasks[GoalVerb].GoalTotal = GoalTotal - self.GoalTasks[GoalVerb].GoalCount = 0 - return self -end - ---- Gets the total of Goals to be achieved within the TASK of the GoalVerb. --- @param ?string GoalVerb is the name of the Goal of the TASK. If the GoalVerb is not given, then the default TASK Goals will be used. -function TASK:GetGoalTotal( GoalVerb ) - self:F2( { GoalVerb } ) - if not GoalVerb then - GoalVerb = self.GoalVerb - end - if self:Goal( GoalVerb ) then - return self.GoalTasks[GoalVerb].GoalTotal - else - return 0 - end -end - ---- Sets the total of Goals currently achieved within the TASK of the GoalVerb. --- @param number GoalCount is the total number of Goals achieved within the TASK. --- @param ?string GoalVerb is the name of the Goal of the TASK. If the GoalVerb is not given, then the default TASK Goals will be used. --- @return TASK -function TASK:SetGoalCount( GoalCount, GoalVerb ) - self:F2() - if not GoalVerb then - GoalVerb = self.GoalVerb - end - if self:Goal( GoalVerb) then - self.GoalTasks[GoalVerb].GoalCount = GoalCount - end - return self -end - ---- Increments the total of Goals currently achieved within the TASK of the GoalVerb, with the given GoalCountIncrease. --- @param number GoalCountIncrease is the number of new Goals achieved within the TASK. --- @param ?string GoalVerb is the name of the Goal of the TASK. If the GoalVerb is not given, then the default TASK Goals will be used. --- @return TASK -function TASK:IncreaseGoalCount( GoalCountIncrease, GoalVerb ) - self:F2( { GoalCountIncrease, GoalVerb } ) - if not GoalVerb then - GoalVerb = self.GoalVerb - end - if self:Goal( GoalVerb) then - self.GoalTasks[GoalVerb].GoalCount = self.GoalTasks[GoalVerb].GoalCount + GoalCountIncrease - end - return self -end - ---- Gets the total of Goals currently achieved within the TASK of the GoalVerb. --- @param ?string GoalVerb is the name of the Goal of the TASK. If the GoalVerb is not given, then the default TASK Goals will be used. --- @return TASK -function TASK:GetGoalCount( GoalVerb ) - self:F2() - if not GoalVerb then - GoalVerb = self.GoalVerb - end - if self:Goal( GoalVerb ) then - return self.GoalTasks[GoalVerb].GoalCount - else - return 0 - end -end - ---- Gets the percentage of Goals currently achieved within the TASK of the GoalVerb. --- @param ?string GoalVerb is the name of the Goal of the TASK. If the GoalVerb is not given, then the default TASK Goals will be used. --- @return TASK -function TASK:GetGoalPercentage( GoalVerb ) - self:F2() - if not GoalVerb then - GoalVerb = self.GoalVerb - end - if self:Goal( GoalVerb ) then - return math.floor( self:GetGoalCount( GoalVerb ) / self:GetGoalTotal( GoalVerb ) * 100 + .5 ) - else - return 100 - end -end - ---- Returns if all the Goals of the TASK were achieved. --- @return bool -function TASK:IsGoalReached() - self:F2() - - local GoalReached = true - - for GoalVerb, Goals in pairs( self.GoalTasks ) do - self:T2( { "GoalVerb", GoalVerb } ) - if self:Goal( GoalVerb ) then - local GoalToDo = self:GetGoalTotal( GoalVerb ) - self:GetGoalCount( GoalVerb ) - self:T2( "GoalToDo = " .. GoalToDo ) - if GoalToDo <= 0 then - else - GoalReached = false - break - end - else - break - end - end - - self:T( { GoalReached, self.GoalTasks } ) - return GoalReached -end - ---- Adds an Additional Goal for the TASK to be achieved. --- @param string GoalVerb is the name of the Goal of the TASK. --- @param string GoalTask is a text describing the Goal of the TASK to be achieved. --- @param number GoalIncrease is a number by which the Goal achievement is increasing. -function TASK:AddGoalCompletion( GoalVerb, GoalTask, GoalIncrease ) - self:F2( { GoalVerb, GoalTask, GoalIncrease } ) - - if self:Goal( GoalVerb ) then - self.GoalTasks[GoalVerb].Goals[#self.GoalTasks[GoalVerb].Goals+1] = GoalTask - self.GoalTasks[GoalVerb].GoalCount = self.GoalTasks[GoalVerb].GoalCount + GoalIncrease - end - return self -end - ---- Returns if the additional Goal for the TASK was completed. --- @param ?string GoalVerb is the name of the Goal of the TASK. If the GoalVerb is not given, then the default TASK Goals will be used. --- @return string Goals -function TASK:GetGoalCompletion( GoalVerb ) - self:F2( { GoalVerb } ) - - if self:Goal( GoalVerb ) then - local Goals = "" - for GoalID, GoalName in pairs( self.GoalTasks[GoalVerb].Goals ) do Goals = Goals .. GoalName .. " + " end - return Goals:gsub(" + $", ""), self.GoalTasks[GoalVerb].GoalCount - end -end - -function TASK.MenuAction( Parameter ) - Parameter.ReferenceTask.ExecuteStage = _TransportExecuteStage.EXECUTING - Parameter.ReferenceTask.Cargo = Parameter.CargoTask -end - -function TASK:StageExecute() - self:F() - - local Execute = false - - if self.Frequency == STAGE.FREQUENCY.REPEAT then - Execute = true - elseif self.Frequency == STAGE.FREQUENCY.NONE then - Execute = false - elseif self.Frequency >= 0 then - Execute = true - self.Frequency = self.Frequency - 1 - end - - return Execute - -end - ---- Work function to set signal events within a TASK. -function TASK:AddSignal( SignalUnitNames, SignalType, SignalColor, SignalHeight ) - self:F() - - local Valid = true - - if Valid then - if type( SignalUnitNames ) == "table" then - self.LandingZoneSignalUnitNames = SignalUnitNames - else - self.LandingZoneSignalUnitNames = { SignalUnitNames } - end - self.LandingZoneSignalType = SignalType - self.LandingZoneSignalColor = SignalColor - self.Signalled = false - if SignalHeight ~= nil then - self.LandingZoneSignalHeight = SignalHeight - else - self.LandingZoneSignalHeight = 0 - end - - if self.TaskBriefing then - self.TaskBriefing = self.TaskBriefing .. " " .. SignalColor.TEXT .. " " .. SignalType.TEXT .. " will be fired when entering the landing zone." - end - end - - return Valid -end - ---- When the CLIENT is approaching the landing zone, a RED SMOKE will be fired by an optional SignalUnitNames. --- @param table|string SignalUnitNames Name of the Group that will fire the signal. If this parameter is NIL, the signal will be fired from the center of the landing zone. --- @param number SignalHeight Altitude that the Signal should be fired... -function TASK:AddSmokeRed( SignalUnitNames, SignalHeight ) - self:F() - self:AddSignal( SignalUnitNames, TASK.SIGNAL.TYPE.SMOKE, TASK.SIGNAL.COLOR.RED, SignalHeight ) -end - ---- When the CLIENT is approaching the landing zone, a GREEN SMOKE will be fired by an optional SignalUnitNames. --- @param table|string SignalUnitNames Name of the Group that will fire the signal. If this parameter is NIL, the signal will be fired from the center of the landing zone. --- @param number SignalHeight Altitude that the Signal should be fired... -function TASK:AddSmokeGreen( SignalUnitNames, SignalHeight ) - self:F() - self:AddSignal( SignalUnitNames, TASK.SIGNAL.TYPE.SMOKE, TASK.SIGNAL.COLOR.GREEN, SignalHeight ) -end - ---- When the CLIENT is approaching the landing zone, a BLUE SMOKE will be fired by an optional SignalUnitNames. --- @param table|string SignalUnitNames Name of the Group that will fire the signal. If this parameter is NIL, the signal will be fired from the center of the landing zone. --- @param number SignalHeight Altitude that the Signal should be fired... -function TASK:AddSmokeBlue( SignalUnitNames, SignalHeight ) - self:F() - self:AddSignal( SignalUnitNames, TASK.SIGNAL.TYPE.SMOKE, TASK.SIGNAL.COLOR.BLUE, SignalHeight ) -end - ---- When the CLIENT is approaching the landing zone, a WHITE SMOKE will be fired by an optional SignalUnitNames. --- @param table|string SignalUnitNames Name of the Group that will fire the signal. If this parameter is NIL, the signal will be fired from the center of the landing zone. --- @param number SignalHeight Altitude that the Signal should be fired... -function TASK:AddSmokeWhite( SignalUnitNames, SignalHeight ) - self:F() - self:AddSignal( SignalUnitNames, TASK.SIGNAL.TYPE.SMOKE, TASK.SIGNAL.COLOR.WHITE, SignalHeight ) -end - ---- When the CLIENT is approaching the landing zone, an ORANGE SMOKE will be fired by an optional SignalUnitNames. --- @param table|string SignalUnitNames Name of the Group that will fire the signal. If this parameter is NIL, the signal will be fired from the center of the landing zone. --- @param number SignalHeight Altitude that the Signal should be fired... -function TASK:AddSmokeOrange( SignalUnitNames, SignalHeight ) - self:F() - self:AddSignal( SignalUnitNames, TASK.SIGNAL.TYPE.SMOKE, TASK.SIGNAL.COLOR.ORANGE, SignalHeight ) -end - ---- When the CLIENT is approaching the landing zone, a RED FLARE will be fired by an optional SignalUnitNames. --- @param table|string SignalUnitNames Name of the Group that will fire the signal. If this parameter is NIL, the signal will be fired from the center of the landing zone. --- @param number SignalHeight Altitude that the Signal should be fired... -function TASK:AddFlareRed( SignalUnitNames, SignalHeight ) - self:F() - self:AddSignal( SignalUnitNames, TASK.SIGNAL.TYPE.FLARE, TASK.SIGNAL.COLOR.RED, SignalHeight ) -end - ---- When the CLIENT is approaching the landing zone, a GREEN FLARE will be fired by an optional SignalUnitNames. --- @param table|string SignalUnitNames Name of the Group that will fire the signal. If this parameter is NIL, the signal will be fired from the center of the landing zone. --- @param number SignalHeight Altitude that the Signal should be fired... -function TASK:AddFlareGreen( SignalUnitNames, SignalHeight ) - self:F() - self:AddSignal( SignalUnitNames, TASK.SIGNAL.TYPE.FLARE, TASK.SIGNAL.COLOR.GREEN, SignalHeight ) -end - ---- When the CLIENT is approaching the landing zone, a BLUE FLARE will be fired by an optional SignalUnitNames. --- @param table|string SignalUnitNames Name of the Group that will fire the signal. If this parameter is NIL, the signal will be fired from the center of the landing zone. --- @param number SignalHeight Altitude that the Signal should be fired... -function TASK:AddFlareBlue( SignalUnitNames, SignalHeight ) - self:F() - self:AddSignal( SignalUnitNames, TASK.SIGNAL.TYPE.FLARE, TASK.SIGNAL.COLOR.BLUE, SignalHeight ) -end - ---- When the CLIENT is approaching the landing zone, a WHITE FLARE will be fired by an optional SignalUnitNames. --- @param table|string SignalUnitNames Name of the Group that will fire the signal. If this parameter is NIL, the signal will be fired from the center of the landing zone. --- @param number SignalHeight Altitude that the Signal should be fired... -function TASK:AddFlareWhite( SignalUnitNames, SignalHeight ) - self:F() - self:AddSignal( SignalUnitNames, TASK.SIGNAL.TYPE.FLARE, TASK.SIGNAL.COLOR.WHITE, SignalHeight ) -end - ---- When the CLIENT is approaching the landing zone, an ORANGE FLARE will be fired by an optional SignalUnitNames. --- @param table|string SignalUnitNames Name of the Group that will fire the signal. If this parameter is NIL, the signal will be fired from the center of the landing zone. --- @param number SignalHeight Altitude that the Signal should be fired... -function TASK:AddFlareOrange( SignalUnitNames, SignalHeight ) - self:F() - self:AddSignal( SignalUnitNames, TASK.SIGNAL.TYPE.FLARE, TASK.SIGNAL.COLOR.ORANGE, SignalHeight ) -end ---- A GOHOMETASK orchestrates the travel back to the home base, which is a specific zone defined within the ME. --- @module GOHOMETASK - ---- The GOHOMETASK class --- @type -GOHOMETASK = { - ClassName = "GOHOMETASK", -} - ---- Creates a new GOHOMETASK. --- @param table{string,...}|string LandingZones Table of Landing Zone names where Home(s) are located. --- @return GOHOMETASK -function GOHOMETASK:New( LandingZones ) - local self = BASE:Inherit( self, TASK:New() ) - self:F( { LandingZones } ) - local Valid = true - - Valid = routines.ValidateZone( LandingZones, "LandingZones", Valid ) - - if Valid then - self.Name = 'Fly Home' - self.TaskBriefing = "Task: Fly back to your home base. Your co-pilot will provide you with the directions (required flight angle in degrees) and the distance (in km) to your home base." - if type( LandingZones ) == "table" then - self.LandingZones = LandingZones - else - self.LandingZones = { LandingZones } - end - self.Stages = { STAGEBRIEF:New(), STAGESTART:New(), STAGEROUTE:New(), STAGEARRIVE:New(), STAGEDONE:New() } - self.SetStage( self, 1 ) - end - - return self -end ---- A DESTROYBASETASK will monitor the destruction of Groups and Units. This is a BASE class, other classes are derived from this class. --- @module DESTROYBASETASK --- @see DESTROYGROUPSTASK --- @see DESTROYUNITTYPESTASK --- @see DESTROY_RADARS_TASK - - - ---- The DESTROYBASETASK class --- @type DESTROYBASETASK -DESTROYBASETASK = { - ClassName = "DESTROYBASETASK", - Destroyed = 0, - GoalVerb = "Destroy", - DestroyPercentage = 100, -} - ---- Creates a new DESTROYBASETASK. --- @param #DESTROYBASETASK self --- @param #string DestroyGroupType Text describing the group to be destroyed. f.e. "Radar Installations", "Ships", "Vehicles", "Command Centers". --- @param #string DestroyUnitType Text describing the unit types to be destroyed. f.e. "SA-6", "Row Boats", "Tanks", "Tents". --- @param #list<#string> DestroyGroupPrefixes Table of Prefixes of the Groups to be destroyed before task is completed. --- @param #number DestroyPercentage defines the %-tage that needs to be destroyed to achieve mission success. eg. If in the Group there are 10 units, then a value of 75 would require 8 units to be destroyed from the Group to complete the @{TASK}. --- @return DESTROYBASETASK -function DESTROYBASETASK:New( DestroyGroupType, DestroyUnitType, DestroyGroupPrefixes, DestroyPercentage ) - local self = BASE:Inherit( self, TASK:New() ) - self:F() - - self.Name = 'Destroy' - self.Destroyed = 0 - self.DestroyGroupPrefixes = DestroyGroupPrefixes - self.DestroyGroupType = DestroyGroupType - self.DestroyUnitType = DestroyUnitType - if DestroyPercentage then - self.DestroyPercentage = DestroyPercentage - end - self.TaskBriefing = "Task: Destroy " .. DestroyGroupType .. "." - self.Stages = { STAGEBRIEF:New(), STAGESTART:New(), STAGEGROUPSDESTROYED:New(), STAGEDONE:New() } - self.SetStage( self, 1 ) - - return self -end - ---- Handle the S_EVENT_DEAD events to validate the destruction of units for the task monitoring. --- @param #DESTROYBASETASK self --- @param Event#EVENTDATA Event structure of MOOSE. -function DESTROYBASETASK:EventDead( Event ) - self:F( { Event } ) - - if Event.IniDCSUnit then - local DestroyUnit = Event.IniDCSUnit - local DestroyUnitName = Event.IniDCSUnitName - local DestroyGroup = Event.IniDCSGroup - local DestroyGroupName = Event.IniDCSGroupName - - --TODO: I need to fix here if 2 groups in the mission have a similar name with GroupPrefix equal, then i should differentiate for which group the goal was reached! - --I may need to test if for the goalverb that group goal was reached or something. Need to think about it a bit more ... - local UnitsDestroyed = 0 - for DestroyGroupPrefixID, DestroyGroupPrefix in pairs( self.DestroyGroupPrefixes ) do - self:T( DestroyGroupPrefix ) - if string.find( DestroyGroupName, DestroyGroupPrefix, 1, true ) then - self:T( BASE:Inherited(self).ClassName ) - UnitsDestroyed = self:ReportGoalProgress( DestroyGroup, DestroyUnit ) - self:T( UnitsDestroyed ) - end - end - - self:T( { UnitsDestroyed } ) - self:IncreaseGoalCount( UnitsDestroyed, self.GoalVerb ) - end - -end - ---- Validate task completeness of DESTROYBASETASK. --- @param DestroyGroup Group structure describing the group to be evaluated. --- @param DestroyUnit Unit structure describing the Unit to be evaluated. -function DESTROYBASETASK:ReportGoalProgress( DestroyGroup, DestroyUnit ) - self:F() - - return 0 -end ---- DESTROYGROUPSTASK --- @module DESTROYGROUPSTASK - - - ---- The DESTROYGROUPSTASK class --- @type -DESTROYGROUPSTASK = { - ClassName = "DESTROYGROUPSTASK", - GoalVerb = "Destroy Groups", -} - ---- Creates a new DESTROYGROUPSTASK. --- @param #DESTROYGROUPSTASK self --- @param #string DestroyGroupType String describing the group to be destroyed. --- @param #string DestroyUnitType String describing the unit to be destroyed. --- @param #list<#string> DestroyGroupNames Table of string containing the name of the groups to be destroyed before task is completed. --- @param #number DestroyPercentage defines the %-tage that needs to be destroyed to achieve mission success. eg. If in the Group there are 10 units, then a value of 75 would require 8 units to be destroyed from the Group to complete the @{TASK}. ----@return DESTROYGROUPSTASK -function DESTROYGROUPSTASK:New( DestroyGroupType, DestroyUnitType, DestroyGroupNames, DestroyPercentage ) - local self = BASE:Inherit( self, DESTROYBASETASK:New( DestroyGroupType, DestroyUnitType, DestroyGroupNames, DestroyPercentage ) ) - self:F() - - self.Name = 'Destroy Groups' - self.GoalVerb = "Destroy " .. DestroyGroupType - - _EVENTDISPATCHER:OnDead( self.EventDead , self ) - _EVENTDISPATCHER:OnCrash( self.EventDead , self ) - - return self -end - ---- Report Goal Progress. --- @param #DESTROYGROUPSTASK self --- @param DCSGroup#Group DestroyGroup Group structure describing the group to be evaluated. --- @param DCSUnit#Unit DestroyUnit Unit structure describing the Unit to be evaluated. --- @return #number The DestroyCount reflecting the amount of units destroyed within the group. -function DESTROYGROUPSTASK:ReportGoalProgress( DestroyGroup, DestroyUnit ) - self:F( { DestroyGroup, DestroyUnit, self.DestroyPercentage } ) - - local DestroyGroupSize = DestroyGroup:getSize() - 1 -- When a DEAD event occurs, the getSize is still one larger than the destroyed unit. - local DestroyGroupInitialSize = DestroyGroup:getInitialSize() - self:T( { DestroyGroupSize, DestroyGroupInitialSize - ( DestroyGroupInitialSize * self.DestroyPercentage / 100 ) } ) - - local DestroyCount = 0 - if DestroyGroup then - if DestroyGroupSize <= DestroyGroupInitialSize - ( DestroyGroupInitialSize * self.DestroyPercentage / 100 ) then - DestroyCount = 1 - end - else - DestroyCount = 1 - end - - self:T( DestroyCount ) - - return DestroyCount -end ---- Task class to destroy radar installations. --- @module DESTROYRADARSTASK - - - ---- The DESTROYRADARS class --- @type -DESTROYRADARSTASK = { - ClassName = "DESTROYRADARSTASK", - GoalVerb = "Destroy Radars" -} - ---- Creates a new DESTROYRADARSTASK. --- @param table{string,...} DestroyGroupNames Table of string containing the group names of which the radars are be destroyed. --- @return DESTROYRADARSTASK -function DESTROYRADARSTASK:New( DestroyGroupNames ) - local self = BASE:Inherit( self, DESTROYGROUPSTASK:New( 'radar installations', 'radars', DestroyGroupNames ) ) - self:F() - - self.Name = 'Destroy Radars' - - _EVENTDISPATCHER:OnDead( self.EventDead , self ) - - return self -end - ---- Report Goal Progress. --- @param Group DestroyGroup Group structure describing the group to be evaluated. --- @param Unit DestroyUnit Unit structure describing the Unit to be evaluated. -function DESTROYRADARSTASK:ReportGoalProgress( DestroyGroup, DestroyUnit ) - self:F( { DestroyGroup, DestroyUnit } ) - - local DestroyCount = 0 - if DestroyUnit and DestroyUnit:hasSensors( Unit.SensorType.RADAR, Unit.RadarType.AS ) then - if DestroyUnit and DestroyUnit:getLife() <= 1.0 then - self:T( 'Destroyed a radar' ) - DestroyCount = 1 - end - end - return DestroyCount -end ---- Set TASK to destroy certain unit types. --- @module DESTROYUNITTYPESTASK - - - ---- The DESTROYUNITTYPESTASK class --- @type -DESTROYUNITTYPESTASK = { - ClassName = "DESTROYUNITTYPESTASK", - GoalVerb = "Destroy", -} - ---- Creates a new DESTROYUNITTYPESTASK. --- @param string DestroyGroupType String describing the group to be destroyed. f.e. "Radar Installations", "Fleet", "Batallion", "Command Centers". --- @param string DestroyUnitType String describing the unit to be destroyed. f.e. "radars", "ships", "tanks", "centers". --- @param table{string,...} DestroyGroupNames Table of string containing the group names of which the radars are be destroyed. --- @param string DestroyUnitTypes Table of string containing the type names of the units to achieve mission success. --- @return DESTROYUNITTYPESTASK -function DESTROYUNITTYPESTASK:New( DestroyGroupType, DestroyUnitType, DestroyGroupNames, DestroyUnitTypes ) - local self = BASE:Inherit( self, DESTROYBASETASK:New( DestroyGroupType, DestroyUnitType, DestroyGroupNames ) ) - self:F( { DestroyGroupType, DestroyUnitType, DestroyGroupNames, DestroyUnitTypes } ) - - if type(DestroyUnitTypes) == 'table' then - self.DestroyUnitTypes = DestroyUnitTypes - else - self.DestroyUnitTypes = { DestroyUnitTypes } - end - - self.Name = 'Destroy Unit Types' - self.GoalVerb = "Destroy " .. DestroyGroupType - - _EVENTDISPATCHER:OnDead( self.EventDead , self ) - - return self -end - ---- Report Goal Progress. --- @param Group DestroyGroup Group structure describing the group to be evaluated. --- @param Unit DestroyUnit Unit structure describing the Unit to be evaluated. -function DESTROYUNITTYPESTASK:ReportGoalProgress( DestroyGroup, DestroyUnit ) - self:F( { DestroyGroup, DestroyUnit } ) - - local DestroyCount = 0 - for UnitTypeID, UnitType in pairs( self.DestroyUnitTypes ) do - if DestroyUnit and DestroyUnit:getTypeName() == UnitType then - if DestroyUnit and DestroyUnit:getLife() <= 1.0 then - DestroyCount = DestroyCount + 1 - end - end - end - return DestroyCount -end ---- A PICKUPTASK orchestrates the loading of CARGO at a specific landing zone. --- @module PICKUPTASK --- @parent TASK - ---- The PICKUPTASK class --- @type -PICKUPTASK = { - ClassName = "PICKUPTASK", - TEXT = { "Pick-Up", "picked-up", "loaded" }, - GoalVerb = "Pick-Up" -} - ---- Creates a new PICKUPTASK. --- @param table{string,...}|string LandingZones Table of Zone names where Cargo is to be loaded. --- @param CARGO_TYPE CargoType Type of the Cargo. The type must be of the following Enumeration:.. --- @param number OnBoardSide Reflects from which side the cargo Group will be on-boarded on the Carrier. -function PICKUPTASK:New( CargoType, OnBoardSide ) - local self = BASE:Inherit( self, TASK:New() ) - self:F() - - -- self holds the inherited instance of the PICKUPTASK Class to the BASE class. - - local Valid = true - - if Valid then - self.Name = 'Pickup Cargo' - self.TaskBriefing = "Task: Fly to the indicated landing zones and pickup " .. CargoType .. ". Your co-pilot will provide you with the directions (required flight angle in degrees) and the distance (in km) to the pickup zone." - self.CargoType = CargoType - self.GoalVerb = CargoType .. " " .. self.GoalVerb - self.OnBoardSide = OnBoardSide - self.IsLandingRequired = true -- required to decide whether the client needs to land or not - self.IsSlingLoad = false -- Indicates whether the cargo is a sling load cargo - self.Stages = { STAGE_CARGO_INIT:New(), STAGE_CARGO_LOAD:New(), STAGEBRIEF:New(), STAGESTART:New(), STAGEROUTE:New(), STAGELANDING:New(), STAGELANDED:New(), STAGELOAD:New(), STAGEDONE:New() } - self.SetStage( self, 1 ) - end - - return self -end - -function PICKUPTASK:FromZone( LandingZone ) - self:F() - - self.LandingZones.LandingZoneNames[LandingZone.CargoZoneName] = LandingZone.CargoZoneName - self.LandingZones.LandingZones[LandingZone.CargoZoneName] = LandingZone - - return self -end - -function PICKUPTASK:InitCargo( InitCargos ) - self:F( { InitCargos } ) - - if type( InitCargos ) == "table" then - self.Cargos.InitCargos = InitCargos - else - self.Cargos.InitCargos = { InitCargos } - end - - return self -end - -function PICKUPTASK:LoadCargo( LoadCargos ) - self:F( { LoadCargos } ) - - if type( LoadCargos ) == "table" then - self.Cargos.LoadCargos = LoadCargos - else - self.Cargos.LoadCargos = { LoadCargos } - end - - return self -end - -function PICKUPTASK:AddCargoMenus( Client, Cargos, TransportRadius ) - self:F() - - for CargoID, Cargo in pairs( Cargos ) do - - self:T( { Cargo.ClassName, Cargo.CargoName, Cargo.CargoType, Cargo:IsStatusNone(), Cargo:IsStatusLoaded(), Cargo:IsStatusLoading(), Cargo:IsStatusUnLoaded() } ) - - -- If the Cargo has no status, allow the menu option. - if Cargo:IsStatusNone() or ( Cargo:IsStatusLoading() and Client == Cargo:IsLoadingToClient() ) then - - local MenuAdd = false - if Cargo:IsNear( Client, self.CurrentCargoZone ) then - MenuAdd = true - end - - if MenuAdd then - if Client._Menus[Cargo.CargoType] == nil then - Client._Menus[Cargo.CargoType] = {} - end - - if not Client._Menus[Cargo.CargoType].PickupMenu then - Client._Menus[Cargo.CargoType].PickupMenu = missionCommands.addSubMenuForGroup( - Client:GetClientGroupID(), - self.TEXT[1] .. " " .. Cargo.CargoType, - nil - ) - self:T( 'Added PickupMenu: ' .. self.TEXT[1] .. " " .. Cargo.CargoType ) - end - - if Client._Menus[Cargo.CargoType].PickupSubMenus == nil then - Client._Menus[Cargo.CargoType].PickupSubMenus = {} - end - - Client._Menus[Cargo.CargoType].PickupSubMenus[ #Client._Menus[Cargo.CargoType].PickupSubMenus + 1 ] = missionCommands.addCommandForGroup( - Client:GetClientGroupID(), - Cargo.CargoName .. " ( " .. Cargo.CargoWeight .. "kg )", - Client._Menus[Cargo.CargoType].PickupMenu, - self.MenuAction, - { ReferenceTask = self, CargoTask = Cargo } - ) - self:T( 'Added PickupSubMenu' .. Cargo.CargoType .. ":" .. Cargo.CargoName .. " ( " .. Cargo.CargoWeight .. "kg )" ) - end - end - end - -end - -function PICKUPTASK:RemoveCargoMenus( Client ) - self:F() - - for MenuID, MenuData in pairs( Client._Menus ) do - for SubMenuID, SubMenuData in pairs( MenuData.PickupSubMenus ) do - missionCommands.removeItemForGroup( Client:GetClientGroupID(), SubMenuData ) - self:T( "Removed PickupSubMenu " ) - SubMenuData = nil - end - if MenuData.PickupMenu then - missionCommands.removeItemForGroup( Client:GetClientGroupID(), MenuData.PickupMenu ) - self:T( "Removed PickupMenu " ) - MenuData.PickupMenu = nil - end - end - - for CargoID, Cargo in pairs( CARGOS ) do - self:T( { Cargo.ClassName, Cargo.CargoName, Cargo.CargoType, Cargo:IsStatusNone(), Cargo:IsStatusLoaded(), Cargo:IsStatusLoading(), Cargo:IsStatusUnLoaded() } ) - if Cargo:IsStatusLoading() and Client == Cargo:IsLoadingToClient() then - Cargo:StatusNone() - end - end - -end - - - -function PICKUPTASK:HasFailed( ClientDead ) - self:F() - - local TaskHasFailed = self.TaskFailed - return TaskHasFailed -end - ---- A DEPLOYTASK orchestrates the deployment of CARGO within a specific landing zone. --- @module DEPLOYTASK - - - ---- A DeployTask --- @type DEPLOYTASK -DEPLOYTASK = { - ClassName = "DEPLOYTASK", - TEXT = { "Deploy", "deployed", "unloaded" }, - GoalVerb = "Deployment" -} - - ---- Creates a new DEPLOYTASK object, which models the sequence of STAGEs to unload a cargo. --- @function [parent=#DEPLOYTASK] New --- @param #string CargoType Type of the Cargo. --- @return #DEPLOYTASK The created DeployTask -function DEPLOYTASK:New( CargoType ) - local self = BASE:Inherit( self, TASK:New() ) - self:F() - - local Valid = true - - if Valid then - self.Name = 'Deploy Cargo' - self.TaskBriefing = "Fly to one of the indicated landing zones and deploy " .. CargoType .. ". Your co-pilot will provide you with the directions (required flight angle in degrees) and the distance (in km) to the deployment zone." - self.CargoType = CargoType - self.GoalVerb = CargoType .. " " .. self.GoalVerb - self.Stages = { STAGE_CARGO_INIT:New(), STAGE_CARGO_LOAD:New(), STAGEBRIEF:New(), STAGESTART:New(), STAGEROUTE:New(), STAGELANDING:New(), STAGELANDED:New(), STAGEUNLOAD:New(), STAGEDONE:New() } - self.SetStage( self, 1 ) - end - - return self -end - -function DEPLOYTASK:ToZone( LandingZone ) - self:F() - - self.LandingZones.LandingZoneNames[LandingZone.CargoZoneName] = LandingZone.CargoZoneName - self.LandingZones.LandingZones[LandingZone.CargoZoneName] = LandingZone - - return self -end - - -function DEPLOYTASK:InitCargo( InitCargos ) - self:F( { InitCargos } ) - - if type( InitCargos ) == "table" then - self.Cargos.InitCargos = InitCargos - else - self.Cargos.InitCargos = { InitCargos } - end - - return self -end - - -function DEPLOYTASK:LoadCargo( LoadCargos ) - self:F( { LoadCargos } ) - - if type( LoadCargos ) == "table" then - self.Cargos.LoadCargos = LoadCargos - else - self.Cargos.LoadCargos = { LoadCargos } - end - - return self -end - - ---- When the cargo is unloaded, it will move to the target zone name. --- @param string TargetZoneName Name of the Zone to where the Cargo should move after unloading. -function DEPLOYTASK:SetCargoTargetZoneName( TargetZoneName ) - self:F() - - local Valid = true - - Valid = routines.ValidateString( TargetZoneName, "TargetZoneName", Valid ) - - if Valid then - self.TargetZoneName = TargetZoneName - end - - return Valid - -end - -function DEPLOYTASK:AddCargoMenus( Client, Cargos, TransportRadius ) - self:F() - - local ClientGroupID = Client:GetClientGroupID() - - self:T( ClientGroupID ) - - for CargoID, Cargo in pairs( Cargos ) do - - self:T( { Cargo.ClassName, Cargo.CargoName, Cargo.CargoType, Cargo.CargoWeight } ) - - if Cargo:IsStatusLoaded() and Client == Cargo:IsLoadedInClient() then - - if Client._Menus[Cargo.CargoType] == nil then - Client._Menus[Cargo.CargoType] = {} - end - - if not Client._Menus[Cargo.CargoType].DeployMenu then - Client._Menus[Cargo.CargoType].DeployMenu = missionCommands.addSubMenuForGroup( - ClientGroupID, - self.TEXT[1] .. " " .. Cargo.CargoType, - nil - ) - self:T( 'Added DeployMenu ' .. self.TEXT[1] ) - end - - if Client._Menus[Cargo.CargoType].DeploySubMenus == nil then - Client._Menus[Cargo.CargoType].DeploySubMenus = {} - end - - if Client._Menus[Cargo.CargoType].DeployMenu == nil then - self:T( 'deploymenu is nil' ) - end - - Client._Menus[Cargo.CargoType].DeploySubMenus[ #Client._Menus[Cargo.CargoType].DeploySubMenus + 1 ] = missionCommands.addCommandForGroup( - ClientGroupID, - Cargo.CargoName .. " ( " .. Cargo.CargoWeight .. "kg )", - Client._Menus[Cargo.CargoType].DeployMenu, - self.MenuAction, - { ReferenceTask = self, CargoTask = Cargo } - ) - self:T( 'Added DeploySubMenu ' .. Cargo.CargoType .. ":" .. Cargo.CargoName .. " ( " .. Cargo.CargoWeight .. "kg )" ) - end - end - -end - -function DEPLOYTASK:RemoveCargoMenus( Client ) - self:F() - - local ClientGroupID = Client:GetClientGroupID() - self:T( ClientGroupID ) - - for MenuID, MenuData in pairs( Client._Menus ) do - if MenuData.DeploySubMenus ~= nil then - for SubMenuID, SubMenuData in pairs( MenuData.DeploySubMenus ) do - missionCommands.removeItemForGroup( ClientGroupID, SubMenuData ) - self:T( "Removed DeploySubMenu " ) - SubMenuData = nil - end - end - if MenuData.DeployMenu then - missionCommands.removeItemForGroup( ClientGroupID, MenuData.DeployMenu ) - self:T( "Removed DeployMenu " ) - MenuData.DeployMenu = nil - end - end - -end ---- A NOTASK is a dummy activity... But it will show a Mission Briefing... --- @module NOTASK - ---- The NOTASK class --- @type -NOTASK = { - ClassName = "NOTASK", -} - ---- Creates a new NOTASK. -function NOTASK:New() - local self = BASE:Inherit( self, TASK:New() ) - self:F() - - local Valid = true - - if Valid then - self.Name = 'Nothing' - self.TaskBriefing = "Task: Execute your mission." - self.Stages = { STAGEBRIEF:New(), STAGESTART:New(), STAGEDONE:New() } - self.SetStage( self, 1 ) - end - - return self -end ---- A ROUTETASK orchestrates the travel to a specific zone defined within the ME. --- @module ROUTETASK - ---- The ROUTETASK class --- @type -ROUTETASK = { - ClassName = "ROUTETASK", - GoalVerb = "Route", -} - ---- Creates a new ROUTETASK. --- @param table{sring,...}|string LandingZones Table of Zone Names where the target is located. --- @param string TaskBriefing (optional) Defines a text describing the briefing of the task. --- @return ROUTETASK -function ROUTETASK:New( LandingZones, TaskBriefing ) - local self = BASE:Inherit( self, TASK:New() ) - self:F( { LandingZones, TaskBriefing } ) - - local Valid = true - - Valid = routines.ValidateZone( LandingZones, "LandingZones", Valid ) - - if Valid then - self.Name = 'Route To Zone' - if TaskBriefing then - self.TaskBriefing = TaskBriefing .. " Your co-pilot will provide you with the directions (required flight angle in degrees) and the distance (in km) to the target objective." - else - self.TaskBriefing = "Task: Fly to specified zone(s). Your co-pilot will provide you with the directions (required flight angle in degrees) and the distance (in km) to the target objective." - end - if type( LandingZones ) == "table" then - self.LandingZones = LandingZones - else - self.LandingZones = { LandingZones } - end - self.Stages = { STAGEBRIEF:New(), STAGESTART:New(), STAGEROUTE:New(), STAGEARRIVE:New(), STAGEDONE:New() } - self.SetStage( self, 1 ) - end - - return self -end - ---- A MISSION is the main owner of a Mission orchestration within MOOSE . The Mission framework orchestrates @{CLIENT}s, @{TASK}s, @{STAGE}s etc. --- A @{CLIENT} needs to be registered within the @{MISSION} through the function @{AddClient}. A @{TASK} needs to be registered within the @{MISSION} through the function @{AddTask}. --- @module Mission - ---- The MISSION class --- @type MISSION --- @extends Base#BASE --- @field #MISSION.Clients _Clients --- @field #string MissionBriefing -MISSION = { - ClassName = "MISSION", - Name = "", - MissionStatus = "PENDING", - _Clients = {}, - _Tasks = {}, - _ActiveTasks = {}, - GoalFunction = nil, - MissionReportTrigger = 0, - MissionProgressTrigger = 0, - MissionReportShow = false, - MissionReportFlash = false, - MissionTimeInterval = 0, - MissionCoalition = "", - SUCCESS = 1, - FAILED = 2, - REPEAT = 3, - _GoalTasks = {} -} - ---- @type MISSION.Clients --- @list - -function MISSION:Meta() - - local self = BASE:Inherit( self, BASE:New() ) - self:F() - - return self -end - ---- This is the main MISSION declaration method. Each Mission is like the master or a Mission orchestration between, Clients, Tasks, Stages etc. --- @param string MissionName is the name of the mission. This name will be used to reference the status of each mission by the players. --- @param string MissionPriority is a string indicating the "priority" of the Mission. f.e. "Primary", "Secondary" or "First", "Second". It is free format and up to the Mission designer to choose. There are no rules behind this field. --- @param string MissionBriefing is a string indicating the mission briefing to be shown when a player joins a @{CLIENT}. --- @param string MissionCoalition is a string indicating the coalition or party to which this mission belongs to. It is free format and can be chosen freely by the mission designer. Note that this field is not to be confused with the coalition concept of the ME. Examples of a Mission Coalition could be "NATO", "CCCP", "Intruders", "Terrorists"... --- @return MISSION --- @usage --- -- Declare a few missions. --- local Mission = MISSIONSCHEDULER.AddMission( 'Russia Transport Troops SA-6', 'Operational', 'Transport troops from the control center to one of the SA-6 SAM sites to activate their operation.', 'Russia' ) --- local Mission = MISSIONSCHEDULER.AddMission( 'Patriots', 'Primary', 'Our intelligence reports that 3 Patriot SAM defense batteries are located near Ruisi, Kvarhiti and Gori.', 'Russia' ) --- local Mission = MISSIONSCHEDULER.AddMission( 'Package Delivery', 'Operational', 'In order to be in full control of the situation, we need you to deliver a very important package at a secret location. Fly undetected through the NATO defenses and deliver the secret package. The secret agent is located at waypoint 4.', 'Russia' ) --- local Mission = MISSIONSCHEDULER.AddMission( 'Rescue General', 'Tactical', 'Our intelligence has received a remote signal behind Gori. We believe it is a very important Russian General that was captured by Georgia. Go out there and rescue him! Ensure you stay out of the battle zone, keep south. Waypoint 4 is the location of our Russian General.', 'Russia' ) --- local Mission = MISSIONSCHEDULER.AddMission( 'NATO Transport Troops', 'Operational', 'Transport 3 groups of air defense engineers from our barracks "Gold" and "Titan" to each patriot battery control center to activate our air defenses.', 'NATO' ) --- local Mission = MISSIONSCHEDULER.AddMission( 'SA-6 SAMs', 'Primary', 'Our intelligence reports that 3 SA-6 SAM defense batteries are located near Didmukha, Khetagurov and Berula. Eliminate the Russian SAMs.', 'NATO' ) --- local Mission = MISSIONSCHEDULER.AddMission( 'NATO Sling Load', 'Operational', 'Fly to the cargo pickup zone at Dzegvi or Kaspi, and sling the cargo to Soganlug airbase.', 'NATO' ) --- local Mission = MISSIONSCHEDULER.AddMission( 'Rescue secret agent', 'Tactical', 'In order to be in full control of the situation, we need you to rescue a secret agent from the woods behind enemy lines. Avoid the Russian defenses and rescue the agent. Keep south until Khasuri, and keep your eyes open for any SAM presence. The agent is located at waypoint 4 on your kneeboard.', 'NATO' ) -function MISSION:New( MissionName, MissionPriority, MissionBriefing, MissionCoalition ) - - self = MISSION:Meta() - self:T({ MissionName, MissionPriority, MissionBriefing, MissionCoalition }) - - local Valid = true - - Valid = routines.ValidateString( MissionName, "MissionName", Valid ) - Valid = routines.ValidateString( MissionPriority, "MissionPriority", Valid ) - Valid = routines.ValidateString( MissionBriefing, "MissionBriefing", Valid ) - Valid = routines.ValidateString( MissionCoalition, "MissionCoalition", Valid ) - - if Valid then - self.Name = MissionName - self.MissionPriority = MissionPriority - self.MissionBriefing = MissionBriefing - self.MissionCoalition = MissionCoalition - end - - return self -end - ---- Returns if a Mission has completed. --- @return bool -function MISSION:IsCompleted() - self:F() - return self.MissionStatus == "ACCOMPLISHED" -end - ---- Set a Mission to completed. -function MISSION:Completed() - self:F() - self.MissionStatus = "ACCOMPLISHED" - self:StatusToClients() -end - ---- Returns if a Mission is ongoing. --- treturn bool -function MISSION:IsOngoing() - self:F() - return self.MissionStatus == "ONGOING" -end - ---- Set a Mission to ongoing. -function MISSION:Ongoing() - self:F() - self.MissionStatus = "ONGOING" - --self:StatusToClients() -end - ---- Returns if a Mission is pending. --- treturn bool -function MISSION:IsPending() - self:F() - return self.MissionStatus == "PENDING" -end - ---- Set a Mission to pending. -function MISSION:Pending() - self:F() - self.MissionStatus = "PENDING" - self:StatusToClients() -end - ---- Returns if a Mission has failed. --- treturn bool -function MISSION:IsFailed() - self:F() - return self.MissionStatus == "FAILED" -end - ---- Set a Mission to failed. -function MISSION:Failed() - self:F() - self.MissionStatus = "FAILED" - self:StatusToClients() -end - ---- Send the status of the MISSION to all Clients. -function MISSION:StatusToClients() - self:F() - if self.MissionReportFlash then - for ClientID, Client in pairs( self._Clients ) do - Client:Message( self.MissionCoalition .. ' "' .. self.Name .. '": ' .. self.MissionStatus .. '! ( ' .. self.MissionPriority .. ' mission ) ', 10, self.Name .. '/Status', "Mission Command: Mission Status") - end - end -end - ---- Handles the reporting. After certain time intervals, a MISSION report MESSAGE will be shown to All Players. -function MISSION:ReportTrigger() - self:F() - - if self.MissionReportShow == true then - self.MissionReportShow = false - return true - else - if self.MissionReportFlash == true then - if timer.getTime() >= self.MissionReportTrigger then - self.MissionReportTrigger = timer.getTime() + self.MissionTimeInterval - return true - else - return false - end - else - return false - end - end -end - ---- Report the status of all MISSIONs to all active Clients. -function MISSION:ReportToAll() - self:F() - - local AlivePlayers = '' - for ClientID, Client in pairs( self._Clients ) do - if Client:GetDCSGroup() then - if Client:GetClientGroupDCSUnit() then - if Client:GetClientGroupDCSUnit():getLife() > 0.0 then - if AlivePlayers == '' then - AlivePlayers = ' Players: ' .. Client:GetClientGroupDCSUnit():getPlayerName() - else - AlivePlayers = AlivePlayers .. ' / ' .. Client:GetClientGroupDCSUnit():getPlayerName() - end - end - end - end - end - local Tasks = self:GetTasks() - local TaskText = "" - for TaskID, TaskData in pairs( Tasks ) do - TaskText = TaskText .. " - Task " .. TaskID .. ": " .. TaskData.Name .. ": " .. TaskData:GetGoalProgress() .. "\n" - end - MESSAGE:New( self.MissionCoalition .. ' "' .. self.Name .. '": ' .. self.MissionStatus .. ' ( ' .. self.MissionPriority .. ' mission )' .. AlivePlayers .. "\n" .. TaskText:gsub("\n$",""), 10, "Mission Command: Mission Report" ):ToAll() -end - - ---- Add a goal function to a MISSION. Goal functions are called when a @{TASK} within a mission has been completed. --- @param function GoalFunction is the function defined by the mission designer to evaluate whether a certain goal has been reached after a @{TASK} finishes within the @{MISSION}. A GoalFunction must accept 2 parameters: Mission, Client, which contains the current MISSION object and the current CLIENT object respectively. --- @usage --- PatriotActivation = { --- { "US SAM Patriot Zerti", false }, --- { "US SAM Patriot Zegduleti", false }, --- { "US SAM Patriot Gvleti", false } --- } --- --- function DeployPatriotTroopsGoal( Mission, Client ) --- --- --- -- Check if the cargo is all deployed for mission success. --- for CargoID, CargoData in pairs( Mission._Cargos ) do --- if Group.getByName( CargoData.CargoGroupName ) then --- CargoGroup = Group.getByName( CargoData.CargoGroupName ) --- if CargoGroup then --- -- Check if the cargo is ready to activate --- CurrentLandingZoneID = routines.IsUnitInZones( CargoGroup:getUnits()[1], Mission:GetTask( 2 ).LandingZones ) -- The second task is the Deploytask to measure mission success upon --- if CurrentLandingZoneID then --- if PatriotActivation[CurrentLandingZoneID][2] == false then --- -- Now check if this is a new Mission Task to be completed... --- trigger.action.setGroupAIOn( Group.getByName( PatriotActivation[CurrentLandingZoneID][1] ) ) --- PatriotActivation[CurrentLandingZoneID][2] = true --- MessageToBlue( "Mission Command: Message to all airborne units! The " .. PatriotActivation[CurrentLandingZoneID][1] .. " is armed. Our air defenses are now stronger.", 60, "BLUE/PatriotDefense" ) --- MessageToRed( "Mission Command: Our satellite systems are detecting additional NATO air defenses. To all airborne units: Take care!!!", 60, "RED/PatriotDefense" ) --- Mission:GetTask( 2 ):AddGoalCompletion( "Patriots activated", PatriotActivation[CurrentLandingZoneID][1], 1 ) -- Register Patriot activation as part of mission goal. --- end --- end --- end --- end --- end --- end --- --- local Mission = MISSIONSCHEDULER.AddMission( 'NATO Transport Troops', 'Operational', 'Transport 3 groups of air defense engineers from our barracks "Gold" and "Titan" to each patriot battery control center to activate our air defenses.', 'NATO' ) --- Mission:AddGoalFunction( DeployPatriotTroopsGoal ) -function MISSION:AddGoalFunction( GoalFunction ) - self:F() - self.GoalFunction = GoalFunction -end - ---- Register a new @{CLIENT} to participate within the mission. --- @param CLIENT Client is the @{CLIENT} object. The object must have been instantiated with @{CLIENT:New}. --- @return CLIENT --- @usage --- Add a number of Client objects to the Mission. --- Mission:AddClient( CLIENT:FindByName( 'US UH-1H*HOT-Deploy Troops 1', 'Transport 3 groups of air defense engineers from our barracks "Gold" and "Titan" to each patriot battery control center to activate our air defenses.' ):Transport() ) --- Mission:AddClient( CLIENT:FindByName( 'US UH-1H*RAMP-Deploy Troops 3', 'Transport 3 groups of air defense engineers from our barracks "Gold" and "Titan" to each patriot battery control center to activate our air defenses.' ):Transport() ) --- Mission:AddClient( CLIENT:FindByName( 'US UH-1H*HOT-Deploy Troops 2', 'Transport 3 groups of air defense engineers from our barracks "Gold" and "Titan" to each patriot battery control center to activate our air defenses.' ):Transport() ) --- Mission:AddClient( CLIENT:FindByName( 'US UH-1H*RAMP-Deploy Troops 4', 'Transport 3 groups of air defense engineers from our barracks "Gold" and "Titan" to each patriot battery control center to activate our air defenses.' ):Transport() ) -function MISSION:AddClient( Client ) - self:F( { Client } ) - - local Valid = true - - if Valid then - self._Clients[Client.ClientName] = Client - end - - return Client -end - ---- Find a @{CLIENT} object within the @{MISSION} by its ClientName. --- @param CLIENT ClientName is a string defining the Client Group as defined within the ME. --- @return CLIENT --- @usage --- -- Seach for Client "Bomber" within the Mission. --- local BomberClient = Mission:FindClient( "Bomber" ) -function MISSION:FindClient( ClientName ) - self:F( { self._Clients[ClientName] } ) - return self._Clients[ClientName] -end - - ---- Register a @{TASK} to be completed within the @{MISSION}. Note that there can be multiple @{TASK}s registered to be completed. Each TASK can be set a certain Goal. The MISSION will not be completed until all Goals are reached. --- @param TASK Task is the @{TASK} object. The object must have been instantiated with @{TASK:New} or any of its inherited @{TASK}s. --- @param number TaskNumber is the sequence number of the TASK within the MISSION. This number does have to be chronological. --- @return TASK --- @usage --- -- Define a few tasks for the Mission. --- PickupZones = { "NATO Gold Pickup Zone", "NATO Titan Pickup Zone" } --- PickupSignalUnits = { "NATO Gold Coordination Center", "NATO Titan Coordination Center" } --- --- -- Assign the Pickup Task --- local PickupTask = PICKUPTASK:New( PickupZones, CARGO_TYPE.ENGINEERS, CLIENT.ONBOARDSIDE.LEFT ) --- PickupTask:AddSmokeBlue( PickupSignalUnits ) --- PickupTask:SetGoalTotal( 3 ) --- Mission:AddTask( PickupTask, 1 ) --- --- -- Assign the Deploy Task --- local PatriotActivationZones = { "US Patriot Battery 1 Activation", "US Patriot Battery 2 Activation", "US Patriot Battery 3 Activation" } --- local PatriotActivationZonesSmokeUnits = { "US SAM Patriot - Battery 1 Control", "US SAM Patriot - Battery 2 Control", "US SAM Patriot - Battery 3 Control" } --- local DeployTask = DEPLOYTASK:New( PatriotActivationZones, CARGO_TYPE.ENGINEERS ) --- --DeployTask:SetCargoTargetZoneName( 'US Troops Attack ' .. math.random(2) ) --- DeployTask:AddSmokeBlue( PatriotActivationZonesSmokeUnits ) --- DeployTask:SetGoalTotal( 3 ) --- DeployTask:SetGoalTotal( 3, "Patriots activated" ) --- Mission:AddTask( DeployTask, 2 ) - -function MISSION:AddTask( Task, TaskNumber ) - self:F() - - self._Tasks[TaskNumber] = Task - self._Tasks[TaskNumber]:EnableEvents() - self._Tasks[TaskNumber].ID = TaskNumber - - return Task - end - ---- Get the TASK idenified by the TaskNumber from the Mission. This function is useful in GoalFunctions. --- @param number TaskNumber is the number of the @{TASK} within the @{MISSION}. --- @return TASK --- @usage --- -- Get Task 2 from the Mission. --- Task2 = Mission:GetTask( 2 ) - -function MISSION:GetTask( TaskNumber ) - self:F() - - local Valid = true - - local Task = nil - - if type(TaskNumber) ~= "number" then - Valid = false - end - - if Valid then - Task = self._Tasks[TaskNumber] - end - - return Task -end - ---- Get all the TASKs from the Mission. This function is useful in GoalFunctions. --- @return {TASK,...} Structure of TASKS with the @{TASK} number as the key. --- @usage --- -- Get Tasks from the Mission. --- Tasks = Mission:GetTasks() --- env.info( "Task 2 Completion = " .. Tasks[2]:GetGoalPercentage() .. "%" ) -function MISSION:GetTasks() - self:F() - - return self._Tasks -end - - ---[[ - _TransportExecuteStage: Defines the different stages of Transport unload/load execution. This table is internal and is used to control the validity of Transport load/unload timing. - - - _TransportExecuteStage.EXECUTING - - _TransportExecuteStage.SUCCESS - - _TransportExecuteStage.FAILED - ---]] -_TransportExecuteStage = { - NONE = 0, - EXECUTING = 1, - SUCCESS = 2, - FAILED = 3 -} - - ---- The MISSIONSCHEDULER is an OBJECT and is the main scheduler of ALL active MISSIONs registered within this scheduler. It's workings are considered internal and is automatically created when the Mission.lua file is included. --- @type MISSIONSCHEDULER --- @field #MISSIONSCHEDULER.MISSIONS Missions -MISSIONSCHEDULER = { - Missions = {}, - MissionCount = 0, - TimeIntervalCount = 0, - TimeIntervalShow = 150, - TimeSeconds = 14400, - TimeShow = 5 -} - ---- @type MISSIONSCHEDULER.MISSIONS --- @list <#MISSION> Mission - ---- This is the main MISSIONSCHEDULER Scheduler function. It is considered internal and is automatically created when the Mission.lua file is included. -function MISSIONSCHEDULER.Scheduler() - - - -- loop through the missions in the TransportTasks - for MissionName, MissionData in pairs( MISSIONSCHEDULER.Missions ) do - - local Mission = MissionData -- #MISSION - - if not Mission:IsCompleted() then - - -- This flag will monitor if for this mission, there are clients alive. If this flag is still false at the end of the loop, the mission status will be set to Pending (if not Failed or Completed). - local ClientsAlive = false - - for ClientID, ClientData in pairs( Mission._Clients ) do - - local Client = ClientData -- Client#CLIENT - - if Client:IsAlive() then - - -- There is at least one Client that is alive... So the Mission status is set to Ongoing. - ClientsAlive = true - - -- If this Client was not registered as Alive before: - -- 1. We register the Client as Alive. - -- 2. We initialize the Client Tasks and make a link to the original Mission Task. - -- 3. We initialize the Cargos. - -- 4. We flag the Mission as Ongoing. - if not Client.ClientAlive then - Client.ClientAlive = true - Client.ClientBriefingShown = false - for TaskNumber, Task in pairs( Mission._Tasks ) do - -- Note that this a deepCopy. Each client must have their own Tasks with own Stages!!! - Client._Tasks[TaskNumber] = routines.utils.deepCopy( Mission._Tasks[TaskNumber] ) - -- Each MissionTask must point to the original Mission. - Client._Tasks[TaskNumber].MissionTask = Mission._Tasks[TaskNumber] - Client._Tasks[TaskNumber].Cargos = Mission._Tasks[TaskNumber].Cargos - Client._Tasks[TaskNumber].LandingZones = Mission._Tasks[TaskNumber].LandingZones - end - - Mission:Ongoing() - end - - - -- For each Client, check for each Task the state and evolve the mission. - -- This flag will indicate if the Task of the Client is Complete. - local TaskComplete = false - - for TaskNumber, Task in pairs( Client._Tasks ) do - - if not Task.Stage then - Task:SetStage( 1 ) - end - - - local TransportTime = timer.getTime() - - if not Task:IsDone() then - - if Task:Goal() then - Task:ShowGoalProgress( Mission, Client ) - end - - --env.info( 'Scheduler: Mission = ' .. Mission.Name .. ' / Client = ' .. Client.ClientName .. ' / Task = ' .. Task.Name .. ' / Stage = ' .. Task.ActiveStage .. ' - ' .. Task.Stage.Name .. ' - ' .. Task.Stage.StageType ) - - -- Action - if Task:StageExecute() then - Task.Stage:Execute( Mission, Client, Task ) - end - - -- Wait until execution is finished - if Task.ExecuteStage == _TransportExecuteStage.EXECUTING then - Task.Stage:Executing( Mission, Client, Task ) - end - - -- Validate completion or reverse to earlier stage - if Task.Time + Task.Stage.WaitTime <= TransportTime then - Task:SetStage( Task.Stage:Validate( Mission, Client, Task ) ) - end - - if Task:IsDone() then - --env.info( 'Scheduler: Mission '.. Mission.Name .. ' Task ' .. Task.Name .. ' Stage ' .. Task.Stage.Name .. ' done. TaskComplete = ' .. string.format ( "%s", TaskComplete and "true" or "false" ) ) - TaskComplete = true -- when a task is not yet completed, a mission cannot be completed - - else - -- break only if this task is not yet done, so that future task are not yet activated. - TaskComplete = false -- when a task is not yet completed, a mission cannot be completed - --env.info( 'Scheduler: Mission "'.. Mission.Name .. '" Task "' .. Task.Name .. '" Stage "' .. Task.Stage.Name .. '" break. TaskComplete = ' .. string.format ( "%s", TaskComplete and "true" or "false" ) ) - break - end - - if TaskComplete then - - if Mission.GoalFunction ~= nil then - Mission.GoalFunction( Mission, Client ) - end - if MISSIONSCHEDULER.Scoring then - MISSIONSCHEDULER.Scoring:_AddMissionTaskScore( Client:GetClientGroupDCSUnit(), Mission.Name, 25 ) - end - --- if not Mission:IsCompleted() then --- end - end - end - end - - local MissionComplete = true - for TaskNumber, Task in pairs( Mission._Tasks ) do - if Task:Goal() then --- Task:ShowGoalProgress( Mission, Client ) - if Task:IsGoalReached() then - else - MissionComplete = false - end - else - MissionComplete = false -- If there is no goal, the mission should never be ended. The goal status will be set somewhere else. - end - end - - if MissionComplete then - Mission:Completed() - if MISSIONSCHEDULER.Scoring then - MISSIONSCHEDULER.Scoring:_AddMissionScore( Mission.Name, 100 ) - end - else - if TaskComplete then - -- Reset for new tasking of active client - Client.ClientAlive = false -- Reset the client tasks. - end - end - - - else - if Client.ClientAlive then - env.info( 'Scheduler: Client "' .. Client.ClientName .. '" is inactive.' ) - Client.ClientAlive = false - - -- This is tricky. If we sanitize Client._Tasks before sanitizing Client._Tasks[TaskNumber].MissionTask, then the original MissionTask will be sanitized, and will be lost within the garbage collector. - -- So first sanitize Client._Tasks[TaskNumber].MissionTask, after that, sanitize only the whole _Tasks structure... - --Client._Tasks[TaskNumber].MissionTask = nil - --Client._Tasks = nil - end - end - end - - -- If all Clients of this Mission are not activated, then the Mission status needs to be put back into Pending status. - -- But only if the Mission was Ongoing. In case the Mission is Completed or Failed, the Mission status may not be changed. In these cases, this will be the last run of this Mission in the Scheduler. - if ClientsAlive == false then - if Mission:IsOngoing() then - -- Mission status back to pending... - Mission:Pending() - end - end - end - - Mission:StatusToClients() - - if Mission:ReportTrigger() then - Mission:ReportToAll() - end - end - - return true -end - ---- Start the MISSIONSCHEDULER. -function MISSIONSCHEDULER.Start() - if MISSIONSCHEDULER ~= nil then - --MISSIONSCHEDULER.SchedulerId = routines.scheduleFunction( MISSIONSCHEDULER.Scheduler, { }, 0, 2 ) - MISSIONSCHEDULER.SchedulerId = SCHEDULER:New( nil, MISSIONSCHEDULER.Scheduler, { }, 0, 2 ) - end -end - ---- Stop the MISSIONSCHEDULER. -function MISSIONSCHEDULER.Stop() - if MISSIONSCHEDULER.SchedulerId then - routines.removeFunction(MISSIONSCHEDULER.SchedulerId) - MISSIONSCHEDULER.SchedulerId = nil - end -end - ---- This is the main MISSION declaration method. Each Mission is like the master or a Mission orchestration between, Clients, Tasks, Stages etc. --- @param Mission is the MISSION object instantiated by @{MISSION:New}. --- @return MISSION --- @usage --- -- Declare a mission. --- Mission = MISSION:New( 'Russia Transport Troops SA-6', --- 'Operational', --- 'Transport troops from the control center to one of the SA-6 SAM sites to activate their operation.', --- 'Russia' ) --- MISSIONSCHEDULER:AddMission( Mission ) -function MISSIONSCHEDULER.AddMission( Mission ) - MISSIONSCHEDULER.Missions[Mission.Name] = Mission - MISSIONSCHEDULER.MissionCount = MISSIONSCHEDULER.MissionCount + 1 - -- Add an overall AI Client for the AI tasks... This AI Client will facilitate the Events in the background for each Task. - --MissionAdd:AddClient( CLIENT:Register( 'AI' ) ) - - return Mission -end - ---- Remove a MISSION from the MISSIONSCHEDULER. --- @param MissionName is the name of the MISSION given at declaration using @{AddMission}. --- @usage --- -- Declare a mission. --- Mission = MISSION:New( 'Russia Transport Troops SA-6', --- 'Operational', --- 'Transport troops from the control center to one of the SA-6 SAM sites to activate their operation.', --- 'Russia' ) --- MISSIONSCHEDULER:AddMission( Mission ) --- --- -- Now remove the Mission. --- MISSIONSCHEDULER:RemoveMission( 'Russia Transport Troops SA-6' ) -function MISSIONSCHEDULER.RemoveMission( MissionName ) - MISSIONSCHEDULER.Missions[MissionName] = nil - MISSIONSCHEDULER.MissionCount = MISSIONSCHEDULER.MissionCount - 1 -end - ---- Find a MISSION within the MISSIONSCHEDULER. --- @param MissionName is the name of the MISSION given at declaration using @{AddMission}. --- @return MISSION --- @usage --- -- Declare a mission. --- Mission = MISSION:New( 'Russia Transport Troops SA-6', --- 'Operational', --- 'Transport troops from the control center to one of the SA-6 SAM sites to activate their operation.', --- 'Russia' ) --- MISSIONSCHEDULER:AddMission( Mission ) --- --- -- Now find the Mission. --- MissionFind = MISSIONSCHEDULER:FindMission( 'Russia Transport Troops SA-6' ) -function MISSIONSCHEDULER.FindMission( MissionName ) - return MISSIONSCHEDULER.Missions[MissionName] -end - --- Internal function used by the MISSIONSCHEDULER menu. -function MISSIONSCHEDULER.ReportMissionsShow( ) - for MissionName, Mission in pairs( MISSIONSCHEDULER.Missions ) do - Mission.MissionReportShow = true - Mission.MissionReportFlash = false - end -end - --- Internal function used by the MISSIONSCHEDULER menu. -function MISSIONSCHEDULER.ReportMissionsFlash( TimeInterval ) - local Count = 0 - for MissionName, Mission in pairs( MISSIONSCHEDULER.Missions ) do - Mission.MissionReportShow = false - Mission.MissionReportFlash = true - Mission.MissionReportTrigger = timer.getTime() + Count * TimeInterval - Mission.MissionTimeInterval = MISSIONSCHEDULER.MissionCount * TimeInterval - env.info( "TimeInterval = " .. Mission.MissionTimeInterval ) - Count = Count + 1 - end -end - --- Internal function used by the MISSIONSCHEDULER menu. -function MISSIONSCHEDULER.ReportMissionsHide( Prm ) - for MissionName, Mission in pairs( MISSIONSCHEDULER.Missions ) do - Mission.MissionReportShow = false - Mission.MissionReportFlash = false - end -end - ---- Enables a MENU option in the communications menu under F10 to control the status of the active missions. --- This function should be called only once when starting the MISSIONSCHEDULER. -function MISSIONSCHEDULER.ReportMenu() - local ReportMenu = SUBMENU:New( 'Status' ) - local ReportMenuShow = COMMANDMENU:New( 'Show Report Missions', ReportMenu, MISSIONSCHEDULER.ReportMissionsShow, 0 ) - local ReportMenuFlash = COMMANDMENU:New('Flash Report Missions', ReportMenu, MISSIONSCHEDULER.ReportMissionsFlash, 120 ) - local ReportMenuHide = COMMANDMENU:New( 'Hide Report Missions', ReportMenu, MISSIONSCHEDULER.ReportMissionsHide, 0 ) -end - ---- Show the remaining mission time. -function MISSIONSCHEDULER:TimeShow() - self.TimeIntervalCount = self.TimeIntervalCount + 1 - if self.TimeIntervalCount >= self.TimeTriggerShow then - local TimeMsg = string.format("%00d", ( self.TimeSeconds / 60 ) - ( timer.getTime() / 60 )) .. ' minutes left until mission reload.' - MESSAGE:New( TimeMsg, self.TimeShow, "Mission time" ):ToAll() - self.TimeIntervalCount = 0 - end -end - -function MISSIONSCHEDULER:Time( TimeSeconds, TimeIntervalShow, TimeShow ) - - self.TimeIntervalCount = 0 - self.TimeSeconds = TimeSeconds - self.TimeIntervalShow = TimeIntervalShow - self.TimeShow = TimeShow -end - ---- Adds a mission scoring to the game. -function MISSIONSCHEDULER:Scoring( Scoring ) - - self.Scoring = Scoring -end - ---- The CLEANUP class keeps an area clean of crashing or colliding airplanes. It also prevents airplanes from firing within this area. --- @module CleanUp --- @author Flightcontrol - - - - - - - ---- The CLEANUP class. --- @type CLEANUP --- @extends Base#BASE -CLEANUP = { - ClassName = "CLEANUP", - ZoneNames = {}, - TimeInterval = 300, - CleanUpList = {}, -} - ---- Creates the main object which is handling the cleaning of the debris within the given Zone Names. --- @param #CLEANUP self --- @param #table ZoneNames Is a table of zone names where the debris should be cleaned. Also a single string can be passed with one zone name. --- @param #number TimeInterval The interval in seconds when the clean activity takes place. The default is 300 seconds, thus every 5 minutes. --- @return #CLEANUP --- @usage --- -- Clean these Zones. --- CleanUpAirports = CLEANUP:New( { 'CLEAN Tbilisi', 'CLEAN Kutaisi' }, 150 ) --- or --- CleanUpTbilisi = CLEANUP:New( 'CLEAN Tbilisi', 150 ) --- CleanUpKutaisi = CLEANUP:New( 'CLEAN Kutaisi', 600 ) -function CLEANUP:New( ZoneNames, TimeInterval ) local self = BASE:Inherit( self, BASE:New() ) - self:F( { ZoneNames, TimeInterval } ) - - if type( ZoneNames ) == 'table' then - self.ZoneNames = ZoneNames - else - self.ZoneNames = { ZoneNames } - end - if TimeInterval then - self.TimeInterval = TimeInterval - end - - _EVENTDISPATCHER:OnBirth( self._OnEventBirth, self ) - - --self.CleanUpScheduler = routines.scheduleFunction( self._CleanUpScheduler, { self }, timer.getTime() + 1, TimeInterval ) - self.CleanUpScheduler = SCHEDULER:New( self, self._CleanUpScheduler, {}, 1, TimeInterval ) - - return self -end - - ---- Destroys a group from the simulator, but checks first if it is still existing! --- @param #CLEANUP self --- @param DCSGroup#Group GroupObject The object to be destroyed. --- @param #string CleanUpGroupName The groupname... -function CLEANUP:_DestroyGroup( GroupObject, CleanUpGroupName ) - self:F( { GroupObject, CleanUpGroupName } ) - - if GroupObject then -- and GroupObject:isExist() then - trigger.action.deactivateGroup(GroupObject) - self:T( { "GroupObject Destroyed", GroupObject } ) - end -end - ---- Destroys a @{DCSUnit#Unit} from the simulator, but checks first if it is still existing! --- @param #CLEANUP self --- @param DCSUnit#Unit CleanUpUnit The object to be destroyed. --- @param #string CleanUpUnitName The Unit name ... -function CLEANUP:_DestroyUnit( CleanUpUnit, CleanUpUnitName ) - self:F( { CleanUpUnit, CleanUpUnitName } ) - - if CleanUpUnit then - local CleanUpGroup = Unit.getGroup(CleanUpUnit) - -- TODO Client bug in 1.5.3 - if CleanUpGroup and CleanUpGroup:isExist() then - local CleanUpGroupUnits = CleanUpGroup:getUnits() - if #CleanUpGroupUnits == 1 then - local CleanUpGroupName = CleanUpGroup:getName() - --self:CreateEventCrash( timer.getTime(), CleanUpUnit ) - CleanUpGroup:destroy() - self:T( { "Destroyed Group:", CleanUpGroupName } ) - else - CleanUpUnit:destroy() - self:T( { "Destroyed Unit:", CleanUpUnitName } ) - end - self.CleanUpList[CleanUpUnitName] = nil -- Cleaning from the list - CleanUpUnit = nil - end - end -end - --- TODO check DCSTypes#Weapon ---- Destroys a missile from the simulator, but checks first if it is still existing! --- @param #CLEANUP self --- @param DCSTypes#Weapon MissileObject -function CLEANUP:_DestroyMissile( MissileObject ) - self:F( { MissileObject } ) - - if MissileObject and MissileObject:isExist() then - MissileObject:destroy() - self:T( "MissileObject Destroyed") - end -end - -function CLEANUP:_OnEventBirth( Event ) - self:F( { Event } ) - - self.CleanUpList[Event.IniDCSUnitName] = {} - self.CleanUpList[Event.IniDCSUnitName].CleanUpUnit = Event.IniDCSUnit - self.CleanUpList[Event.IniDCSUnitName].CleanUpGroup = Event.IniDCSGroup - self.CleanUpList[Event.IniDCSUnitName].CleanUpGroupName = Event.IniDCSGroupName - self.CleanUpList[Event.IniDCSUnitName].CleanUpUnitName = Event.IniDCSUnitName - - _EVENTDISPATCHER:OnEngineShutDownForUnit( Event.IniDCSUnitName, self._EventAddForCleanUp, self ) - _EVENTDISPATCHER:OnEngineStartUpForUnit( Event.IniDCSUnitName, self._EventAddForCleanUp, self ) - _EVENTDISPATCHER:OnHitForUnit( Event.IniDCSUnitName, self._EventAddForCleanUp, self ) - _EVENTDISPATCHER:OnPilotDeadForUnit( Event.IniDCSUnitName, self._EventCrash, self ) - _EVENTDISPATCHER:OnDeadForUnit( Event.IniDCSUnitName, self._EventCrash, self ) - _EVENTDISPATCHER:OnCrashForUnit( Event.IniDCSUnitName, self._EventCrash, self ) - _EVENTDISPATCHER:OnShotForUnit( Event.IniDCSUnitName, self._EventShot, self ) - - --self:AddEvent( world.event.S_EVENT_ENGINE_SHUTDOWN, self._EventAddForCleanUp ) - --self:AddEvent( world.event.S_EVENT_ENGINE_STARTUP, self._EventAddForCleanUp ) --- self:AddEvent( world.event.S_EVENT_HIT, self._EventAddForCleanUp ) -- , self._EventHitCleanUp ) --- self:AddEvent( world.event.S_EVENT_CRASH, self._EventCrash ) -- , self._EventHitCleanUp ) --- --self:AddEvent( world.event.S_EVENT_DEAD, self._EventCrash ) --- self:AddEvent( world.event.S_EVENT_SHOT, self._EventShot ) --- --- self:EnableEvents() - - -end - ---- Detects if a crash event occurs. --- Crashed units go into a CleanUpList for removal. --- @param #CLEANUP self --- @param DCSTypes#Event event -function CLEANUP:_EventCrash( Event ) - self:F( { Event } ) - - --TODO: This stuff is not working due to a DCS bug. Burning units cannot be destroyed. - -- self:T("before getGroup") - -- local _grp = Unit.getGroup(event.initiator)-- Identify the group that fired - -- self:T("after getGroup") - -- _grp:destroy() - -- self:T("after deactivateGroup") - -- event.initiator:destroy() - - self.CleanUpList[Event.IniDCSUnitName] = {} - self.CleanUpList[Event.IniDCSUnitName].CleanUpUnit = Event.IniDCSUnit - self.CleanUpList[Event.IniDCSUnitName].CleanUpGroup = Event.IniDCSGroup - self.CleanUpList[Event.IniDCSUnitName].CleanUpGroupName = Event.IniDCSGroupName - self.CleanUpList[Event.IniDCSUnitName].CleanUpUnitName = Event.IniDCSUnitName - -end - ---- Detects if a unit shoots a missile. --- If this occurs within one of the zones, then the weapon used must be destroyed. --- @param #CLEANUP self --- @param DCSTypes#Event event -function CLEANUP:_EventShot( Event ) - self:F( { Event } ) - - -- Test if the missile was fired within one of the CLEANUP.ZoneNames. - local CurrentLandingZoneID = 0 - CurrentLandingZoneID = routines.IsUnitInZones( Event.IniDCSUnit, self.ZoneNames ) - if ( CurrentLandingZoneID ) then - -- Okay, the missile was fired within the CLEANUP.ZoneNames, destroy the fired weapon. - --_SEADmissile:destroy() - --routines.scheduleFunction( CLEANUP._DestroyMissile, { self, Event.Weapon }, timer.getTime() + 0.1) - SCHEDULER:New( self, CLEANUP._DestroyMissile, { Event.Weapon }, 0.1 ) - end -end - - ---- Detects if the Unit has an S_EVENT_HIT within the given ZoneNames. If this is the case, destroy the unit. --- @param #CLEANUP self --- @param DCSTypes#Event event -function CLEANUP:_EventHitCleanUp( Event ) - self:F( { Event } ) - - if Event.IniDCSUnit then - if routines.IsUnitInZones( Event.IniDCSUnit, self.ZoneNames ) ~= nil then - self:T( { "Life: ", Event.IniDCSUnitName, ' = ', Event.IniDCSUnit:getLife(), "/", Event.IniDCSUnit:getLife0() } ) - if Event.IniDCSUnit:getLife() < Event.IniDCSUnit:getLife0() then - self:T( "CleanUp: Destroy: " .. Event.IniDCSUnitName ) - --routines.scheduleFunction( CLEANUP._DestroyUnit, { self, Event.IniDCSUnit }, timer.getTime() + 0.1) - SCHEDULER:New( self, CLEANUP._DestroyUnit, { Event.IniDCSUnit }, 0.1 ) - end - end - end - - if Event.TgtDCSUnit then - if routines.IsUnitInZones( Event.TgtDCSUnit, self.ZoneNames ) ~= nil then - self:T( { "Life: ", Event.TgtDCSUnitName, ' = ', Event.TgtDCSUnit:getLife(), "/", Event.TgtDCSUnit:getLife0() } ) - if Event.TgtDCSUnit:getLife() < Event.TgtDCSUnit:getLife0() then - self:T( "CleanUp: Destroy: " .. Event.TgtDCSUnitName ) - --routines.scheduleFunction( CLEANUP._DestroyUnit, { self, Event.TgtDCSUnit }, timer.getTime() + 0.1 ) - SCHEDULER:New( self, CLEANUP._DestroyUnit, { Event.TgtDCSUnit }, 0.1 ) - end - end - end -end - ---- Add the @{DCSUnit#Unit} to the CleanUpList for CleanUp. -function CLEANUP:_AddForCleanUp( CleanUpUnit, CleanUpUnitName ) - self:F( { CleanUpUnit, CleanUpUnitName } ) - - self.CleanUpList[CleanUpUnitName] = {} - self.CleanUpList[CleanUpUnitName].CleanUpUnit = CleanUpUnit - self.CleanUpList[CleanUpUnitName].CleanUpUnitName = CleanUpUnitName - self.CleanUpList[CleanUpUnitName].CleanUpGroup = Unit.getGroup(CleanUpUnit) - self.CleanUpList[CleanUpUnitName].CleanUpGroupName = Unit.getGroup(CleanUpUnit):getName() - self.CleanUpList[CleanUpUnitName].CleanUpTime = timer.getTime() - self.CleanUpList[CleanUpUnitName].CleanUpMoved = false - - self:T( { "CleanUp: Add to CleanUpList: ", Unit.getGroup(CleanUpUnit):getName(), CleanUpUnitName } ) - -end - ---- Detects if the Unit has an S_EVENT_ENGINE_SHUTDOWN or an S_EVENT_HIT within the given ZoneNames. If this is the case, add the Group to the CLEANUP List. --- @param #CLEANUP self --- @param DCSTypes#Event event -function CLEANUP:_EventAddForCleanUp( Event ) - - if Event.IniDCSUnit then - if self.CleanUpList[Event.IniDCSUnitName] == nil then - if routines.IsUnitInZones( Event.IniDCSUnit, self.ZoneNames ) ~= nil then - self:_AddForCleanUp( Event.IniDCSUnit, Event.IniDCSUnitName ) - end - end - end - - if Event.TgtDCSUnit then - if self.CleanUpList[Event.TgtDCSUnitName] == nil then - if routines.IsUnitInZones( Event.TgtDCSUnit, self.ZoneNames ) ~= nil then - self:_AddForCleanUp( Event.TgtDCSUnit, Event.TgtDCSUnitName ) - end - end - end - -end - -local CleanUpSurfaceTypeText = { - "LAND", - "SHALLOW_WATER", - "WATER", - "ROAD", - "RUNWAY" - } - ---- At the defined time interval, CleanUp the Groups within the CleanUpList. --- @param #CLEANUP self -function CLEANUP:_CleanUpScheduler() - self:F( { "CleanUp Scheduler" } ) - - local CleanUpCount = 0 - for CleanUpUnitName, UnitData in pairs( self.CleanUpList ) do - CleanUpCount = CleanUpCount + 1 - - self:T( { CleanUpUnitName, UnitData } ) - local CleanUpUnit = Unit.getByName(UnitData.CleanUpUnitName) - local CleanUpGroupName = UnitData.CleanUpGroupName - local CleanUpUnitName = UnitData.CleanUpUnitName - if CleanUpUnit then - self:T( { "CleanUp Scheduler", "Checking:", CleanUpUnitName } ) - if _DATABASE:GetStatusGroup( CleanUpGroupName ) ~= "ReSpawn" then - local CleanUpUnitVec3 = CleanUpUnit:getPoint() - --self:T( CleanUpUnitVec3 ) - local CleanUpUnitVec2 = {} - CleanUpUnitVec2.x = CleanUpUnitVec3.x - CleanUpUnitVec2.y = CleanUpUnitVec3.z - --self:T( CleanUpUnitVec2 ) - local CleanUpSurfaceType = land.getSurfaceType(CleanUpUnitVec2) - --self:T( CleanUpSurfaceType ) - - if CleanUpUnit and CleanUpUnit:getLife() <= CleanUpUnit:getLife0() * 0.95 then - if CleanUpSurfaceType == land.SurfaceType.RUNWAY then - if CleanUpUnit:inAir() then - local CleanUpLandHeight = land.getHeight(CleanUpUnitVec2) - local CleanUpUnitHeight = CleanUpUnitVec3.y - CleanUpLandHeight - self:T( { "CleanUp Scheduler", "Height = " .. CleanUpUnitHeight } ) - if CleanUpUnitHeight < 30 then - self:T( { "CleanUp Scheduler", "Destroy " .. CleanUpUnitName .. " because below safe height and damaged." } ) - self:_DestroyUnit(CleanUpUnit, CleanUpUnitName) - end - else - self:T( { "CleanUp Scheduler", "Destroy " .. CleanUpUnitName .. " because on runway and damaged." } ) - self:_DestroyUnit(CleanUpUnit, CleanUpUnitName) - end - end - end - -- Clean Units which are waiting for a very long time in the CleanUpZone. - if CleanUpUnit then - local CleanUpUnitVelocity = CleanUpUnit:getVelocity() - local CleanUpUnitVelocityTotal = math.abs(CleanUpUnitVelocity.x) + math.abs(CleanUpUnitVelocity.y) + math.abs(CleanUpUnitVelocity.z) - if CleanUpUnitVelocityTotal < 1 then - if UnitData.CleanUpMoved then - if UnitData.CleanUpTime + 180 <= timer.getTime() then - self:T( { "CleanUp Scheduler", "Destroy due to not moving anymore " .. CleanUpUnitName } ) - self:_DestroyUnit(CleanUpUnit, CleanUpUnitName) - end - end - else - UnitData.CleanUpTime = timer.getTime() - UnitData.CleanUpMoved = true - end - end - - else - -- Do nothing ... - self.CleanUpList[CleanUpUnitName] = nil -- Not anymore in the DCSRTE - end - else - self:T( "CleanUp: Group " .. CleanUpUnitName .. " cannot be found in DCS RTE, removing ..." ) - self.CleanUpList[CleanUpUnitName] = nil -- Not anymore in the DCSRTE - end - end - self:T(CleanUpCount) - - return true -end - ---- This module contains the SPAWN class. --- --- 1) @{Spawn#SPAWN} class, extends @{Base#BASE} --- ============================================= --- The @{#SPAWN} class allows to spawn dynamically new groups, based on pre-defined initialization settings, modifying the behaviour when groups are spawned. --- For each group to be spawned, within the mission editor, a group has to be created with the "late activation flag" set. We call this group the *"Spawn Template"* of the SPAWN object. --- A reference to this Spawn Template needs to be provided when constructing the SPAWN object, by indicating the name of the group within the mission editor in the constructor methods. --- --- Within the SPAWN object, there is an internal index that keeps track of which group from the internal group list was spawned. --- When new groups get spawned by using the SPAWN functions (see below), it will be validated whether the Limits (@{#SPAWN.Limit}) of the SPAWN object are not reached. --- When all is valid, a new group will be created by the spawning methods, and the internal index will be increased with 1. --- --- Regarding the name of new spawned groups, a _SpawnPrefix_ will be assigned for each new group created. --- If you want to have the Spawn Template name to be used as the _SpawnPrefix_ name, use the @{#SPAWN.New} constructor. --- However, when the @{#SPAWN.NewWithAlias} constructor was used, the Alias name will define the _SpawnPrefix_ name. --- Groups will follow the following naming structure when spawned at run-time: --- --- 1. Spawned groups will have the name _SpawnPrefix_#ggg, where ggg is a counter from 0 to 999. --- 2. Spawned units will have the name _SpawnPrefix_#ggg-uu, where uu is a counter from 0 to 99 for each new spawned unit belonging to the group. --- --- Some additional notes that need to be remembered: --- --- * Templates are actually groups defined within the mission editor, with the flag "Late Activation" set. As such, these groups are never used within the mission, but are used by the @{#SPAWN} module. --- * It is important to defined BEFORE you spawn new groups, a proper initialization of the SPAWN instance is done with the options you want to use. --- * When designing a mission, NEVER name groups using a "#" within the name of the group Spawn Template(s), or the SPAWN module logic won't work anymore. --- --- 1.1) SPAWN construction methods --- ------------------------------- --- Create a new SPAWN object with the @{#SPAWN.New} or the @{#SPAWN.NewWithAlias} methods: --- --- * @{#SPAWN.New}: Creates a new SPAWN object taking the name of the group that functions as the Template. --- --- It is important to understand how the SPAWN class works internally. The SPAWN object created will contain internally a list of groups that will be spawned and that are already spawned. --- The initialization functions will modify this list of groups so that when a group gets spawned, ALL information is already prepared when spawning. This is done for performance reasons. --- So in principle, the group list will contain all parameters and configurations after initialization, and when groups get actually spawned, this spawning can be done quickly and efficient. --- --- 1.2) SPAWN initialization methods --- --------------------------------- --- A spawn object will behave differently based on the usage of initialization methods: --- --- * @{#SPAWN.Limit}: Limits the amount of groups that can be alive at the same time and that can be dynamically spawned. --- * @{#SPAWN.RandomizeRoute}: Randomize the routes of spawned groups. --- * @{#SPAWN.RandomizeTemplate}: Randomize the group templates so that when a new group is spawned, a random group template is selected from one of the templates defined. --- * @{#SPAWN.Uncontrolled}: Spawn plane groups uncontrolled. --- * @{#SPAWN.Array}: Make groups visible before they are actually activated, and order these groups like a batallion in an array. --- * @{#SPAWN.InitRepeat}: Re-spawn groups when they land at the home base. Similar functions are @{#SPAWN.InitRepeatOnLanding} and @{#SPAWN.InitRepeatOnEngineShutDown}. --- --- 1.3) SPAWN spawning methods --- --------------------------- --- Groups can be spawned at different times and methods: --- --- * @{#SPAWN.Spawn}: Spawn one new group based on the last spawned index. --- * @{#SPAWN.ReSpawn}: Re-spawn a group based on a given index. --- * @{#SPAWN.SpawnScheduled}: Spawn groups at scheduled but randomized intervals. You can use @{#SPAWN.SpawnScheduleStart} and @{#SPAWN.SpawnScheduleStop} to start and stop the schedule respectively. --- * @{#SPAWN.SpawnFromUnit}: Spawn a new group taking the position of a @{UNIT}. --- * @{#SPAWN.SpawnInZone}: Spawn a new group in a @{ZONE}. --- --- Note that @{#SPAWN.Spawn} and @{#SPAWN.ReSpawn} return a @{GROUP#GROUP.New} object, that contains a reference to the DCSGroup object. --- You can use the @{GROUP} object to do further actions with the DCSGroup. --- --- 1.4) SPAWN object cleaning --- -------------------------- --- Sometimes, it will occur during a mission run-time, that ground or especially air objects get damaged, and will while being damged stop their activities, while remaining alive. --- In such cases, the SPAWN object will just sit there and wait until that group gets destroyed, but most of the time it won't, --- and it may occur that no new groups are or can be spawned as limits are reached. --- To prevent this, a @{#SPAWN.CleanUp} initialization method has been defined that will silently monitor the status of each spawned group. --- Once a group has a velocity = 0, and has been waiting for a defined interval, that group will be cleaned or removed from run-time. --- There is a catch however :-) If a damaged group has returned to an airbase within the coalition, that group will not be considered as "lost"... --- In such a case, when the inactive group is cleaned, a new group will Re-spawned automatically. --- This models AI that has succesfully returned to their airbase, to restart their combat activities. --- Check the @{#SPAWN.CleanUp} for further info. --- --- --- @module Spawn --- @author FlightControl - ---- SPAWN Class --- @type SPAWN --- @extends Base#BASE --- @field ClassName --- @field #string SpawnTemplatePrefix --- @field #string SpawnAliasPrefix -SPAWN = { - ClassName = "SPAWN", - SpawnTemplatePrefix = nil, - SpawnAliasPrefix = nil, -} - - - ---- Creates the main object to spawn a GROUP defined in the DCS ME. --- @param #SPAWN self --- @param #string SpawnTemplatePrefix is the name of the Group in the ME that defines the Template. Each new group will have the name starting with SpawnTemplatePrefix. --- @return #SPAWN --- @usage --- -- NATO helicopters engaging in the battle field. --- Spawn_BE_KA50 = SPAWN:New( 'BE KA-50@RAMP-Ground Defense' ) --- @usage local Plane = SPAWN:New( "Plane" ) -- Creates a new local variable that can initiate new planes with the name "Plane#ddd" using the template "Plane" as defined within the ME. -function SPAWN:New( SpawnTemplatePrefix ) - local self = BASE:Inherit( self, BASE:New() ) - self:F( { SpawnTemplatePrefix } ) - - local TemplateGroup = Group.getByName( SpawnTemplatePrefix ) - if TemplateGroup then - self.SpawnTemplatePrefix = SpawnTemplatePrefix - self.SpawnIndex = 0 - self.SpawnCount = 0 -- The internal counter of the amount of spawning the has happened since SpawnStart. - self.AliveUnits = 0 -- Contains the counter how many units are currently alive - self.SpawnIsScheduled = false -- Reflects if the spawning for this SpawnTemplatePrefix is going to be scheduled or not. - self.SpawnTemplate = self._GetTemplate( self, SpawnTemplatePrefix ) -- Contains the template structure for a Group Spawn from the Mission Editor. Note that this group must have lateActivation always on!!! - self.Repeat = false -- Don't repeat the group from Take-Off till Landing and back Take-Off by ReSpawning. - self.UnControlled = false -- When working in UnControlled mode, all planes are Spawned in UnControlled mode before the scheduler starts. - self.SpawnMaxUnitsAlive = 0 -- The maximum amount of groups that can be alive of SpawnTemplatePrefix at the same time. - self.SpawnMaxGroups = 0 -- The maximum amount of groups that can be spawned. - self.SpawnRandomize = false -- Sets the randomization flag of new Spawned units to false. - self.SpawnVisible = false -- Flag that indicates if all the Groups of the SpawnGroup need to be visible when Spawned. - - self.SpawnGroups = {} -- Array containing the descriptions of each Group to be Spawned. - else - error( "SPAWN:New: There is no group declared in the mission editor with SpawnTemplatePrefix = '" .. SpawnTemplatePrefix .. "'" ) - end - - return self -end - ---- Creates a new SPAWN instance to create new groups based on the defined template and using a new alias for each new group. --- @param #SPAWN self --- @param #string SpawnTemplatePrefix is the name of the Group in the ME that defines the Template. --- @param #string SpawnAliasPrefix is the name that will be given to the Group at runtime. --- @return #SPAWN --- @usage --- -- NATO helicopters engaging in the battle field. --- Spawn_BE_KA50 = SPAWN:NewWithAlias( 'BE KA-50@RAMP-Ground Defense', 'Helicopter Attacking a City' ) --- @usage local PlaneWithAlias = SPAWN:NewWithAlias( "Plane", "Bomber" ) -- Creates a new local variable that can instantiate new planes with the name "Bomber#ddd" using the template "Plane" as defined within the ME. -function SPAWN:NewWithAlias( SpawnTemplatePrefix, SpawnAliasPrefix ) - local self = BASE:Inherit( self, BASE:New() ) - self:F( { SpawnTemplatePrefix, SpawnAliasPrefix } ) - - local TemplateGroup = Group.getByName( SpawnTemplatePrefix ) - if TemplateGroup then - self.SpawnTemplatePrefix = SpawnTemplatePrefix - self.SpawnAliasPrefix = SpawnAliasPrefix - self.SpawnIndex = 0 - self.SpawnCount = 0 -- The internal counter of the amount of spawning the has happened since SpawnStart. - self.AliveUnits = 0 -- Contains the counter how many units are currently alive - self.SpawnIsScheduled = false -- Reflects if the spawning for this SpawnTemplatePrefix is going to be scheduled or not. - self.SpawnTemplate = self._GetTemplate( self, SpawnTemplatePrefix ) -- Contains the template structure for a Group Spawn from the Mission Editor. Note that this group must have lateActivation always on!!! - self.Repeat = false -- Don't repeat the group from Take-Off till Landing and back Take-Off by ReSpawning. - self.UnControlled = false -- When working in UnControlled mode, all planes are Spawned in UnControlled mode before the scheduler starts. - self.SpawnMaxUnitsAlive = 0 -- The maximum amount of groups that can be alive of SpawnTemplatePrefix at the same time. - self.SpawnMaxGroups = 0 -- The maximum amount of groups that can be spawned. - self.SpawnRandomize = false -- Sets the randomization flag of new Spawned units to false. - self.SpawnVisible = false -- Flag that indicates if all the Groups of the SpawnGroup need to be visible when Spawned. - - self.SpawnGroups = {} -- Array containing the descriptions of each Group to be Spawned. - else - error( "SPAWN:New: There is no group declared in the mission editor with SpawnTemplatePrefix = '" .. SpawnTemplatePrefix .. "'" ) - end - - return self -end - - ---- Limits the Maximum amount of Units that can be alive at the same time, and the maximum amount of groups that can be spawned. --- Note that this method is exceptionally important to balance the performance of the mission. Depending on the machine etc, a mission can only process a maximum amount of units. --- If the time interval must be short, but there should not be more Units or Groups alive than a maximum amount of units, then this function should be used... --- When a @{#SPAWN.New} is executed and the limit of the amount of units alive is reached, then no new spawn will happen of the group, until some of these units of the spawn object will be destroyed. --- @param #SPAWN self --- @param #number SpawnMaxUnitsAlive The maximum amount of units that can be alive at runtime. --- @param #number SpawnMaxGroups The maximum amount of groups that can be spawned. When the limit is reached, then no more actual spawns will happen of the group. --- This parameter is useful to define a maximum amount of airplanes, ground troops, helicopters, ships etc within a supply area. --- This parameter accepts the value 0, which defines that there are no maximum group limits, but there are limits on the maximum of units that can be alive at the same time. --- @return #SPAWN self --- @usage --- -- NATO helicopters engaging in the battle field. --- -- This helicopter group consists of one Unit. So, this group will SPAWN maximum 2 groups simultaneously within the DCSRTE. --- -- There will be maximum 24 groups spawned during the whole mission lifetime. --- Spawn_BE_KA50 = SPAWN:New( 'BE KA-50@RAMP-Ground Defense' ):Limit( 2, 24 ) -function SPAWN:Limit( SpawnMaxUnitsAlive, SpawnMaxGroups ) - self:F( { self.SpawnTemplatePrefix, SpawnMaxUnitsAlive, SpawnMaxGroups } ) - - self.SpawnMaxUnitsAlive = SpawnMaxUnitsAlive -- The maximum amount of groups that can be alive of SpawnTemplatePrefix at the same time. - self.SpawnMaxGroups = SpawnMaxGroups -- The maximum amount of groups that can be spawned. - - for SpawnGroupID = 1, self.SpawnMaxGroups do - self:_InitializeSpawnGroups( SpawnGroupID ) - end - - return self -end - - ---- Randomizes the defined route of the SpawnTemplatePrefix group in the ME. This is very useful to define extra variation of the behaviour of groups. --- @param #SPAWN self --- @param #number SpawnStartPoint is the waypoint where the randomization begins. --- Note that the StartPoint = 0 equaling the point where the group is spawned. --- @param #number SpawnEndPoint is the waypoint where the randomization ends counting backwards. --- This parameter is useful to avoid randomization to end at a waypoint earlier than the last waypoint on the route. --- @param #number SpawnRadius is the radius in meters in which the randomization of the new waypoints, with the original waypoint of the original template located in the middle ... --- @return #SPAWN --- @usage --- -- NATO helicopters engaging in the battle field. --- -- The KA-50 has waypoints Start point ( =0 or SP ), 1, 2, 3, 4, End point (= 5 or DP). --- -- Waypoints 2 and 3 will only be randomized. The others will remain on their original position with each new spawn of the helicopter. --- -- The randomization of waypoint 2 and 3 will take place within a radius of 2000 meters. --- Spawn_BE_KA50 = SPAWN:New( 'BE KA-50@RAMP-Ground Defense' ):RandomizeRoute( 2, 2, 2000 ) -function SPAWN:RandomizeRoute( SpawnStartPoint, SpawnEndPoint, SpawnRadius ) - self:F( { self.SpawnTemplatePrefix, SpawnStartPoint, SpawnEndPoint, SpawnRadius } ) - - self.SpawnRandomizeRoute = true - self.SpawnRandomizeRouteStartPoint = SpawnStartPoint - self.SpawnRandomizeRouteEndPoint = SpawnEndPoint - self.SpawnRandomizeRouteRadius = SpawnRadius - - for GroupID = 1, self.SpawnMaxGroups do - self:_RandomizeRoute( GroupID ) - end - - return self -end - - ---- This function is rather complicated to understand. But I'll try to explain. --- This function becomes useful when you need to spawn groups with random templates of groups defined within the mission editor, --- but they will all follow the same Template route and have the same prefix name. --- In other words, this method randomizes between a defined set of groups the template to be used for each new spawn of a group. --- @param #SPAWN self --- @param #string SpawnTemplatePrefixTable A table with the names of the groups defined within the mission editor, from which one will be choosen when a new group will be spawned. --- @return #SPAWN --- @usage --- -- NATO Tank Platoons invading Gori. --- -- Choose between 13 different 'US Tank Platoon' configurations for each new SPAWN the Group to be spawned for the --- -- 'US Tank Platoon Left', 'US Tank Platoon Middle' and 'US Tank Platoon Right' SpawnTemplatePrefixes. --- -- Each new SPAWN will randomize the route, with a defined time interval of 200 seconds with 40% time variation (randomization) and --- -- with a limit set of maximum 12 Units alive simulteneously and 150 Groups to be spawned during the whole mission. --- Spawn_US_Platoon = { 'US Tank Platoon 1', 'US Tank Platoon 2', 'US Tank Platoon 3', 'US Tank Platoon 4', 'US Tank Platoon 5', --- 'US Tank Platoon 6', 'US Tank Platoon 7', 'US Tank Platoon 8', 'US Tank Platoon 9', 'US Tank Platoon 10', --- 'US Tank Platoon 11', 'US Tank Platoon 12', 'US Tank Platoon 13' } --- Spawn_US_Platoon_Left = SPAWN:New( 'US Tank Platoon Left' ):Limit( 12, 150 ):Schedule( 200, 0.4 ):RandomizeTemplate( Spawn_US_Platoon ):RandomizeRoute( 3, 3, 2000 ) --- Spawn_US_Platoon_Middle = SPAWN:New( 'US Tank Platoon Middle' ):Limit( 12, 150 ):Schedule( 200, 0.4 ):RandomizeTemplate( Spawn_US_Platoon ):RandomizeRoute( 3, 3, 2000 ) --- Spawn_US_Platoon_Right = SPAWN:New( 'US Tank Platoon Right' ):Limit( 12, 150 ):Schedule( 200, 0.4 ):RandomizeTemplate( Spawn_US_Platoon ):RandomizeRoute( 3, 3, 2000 ) -function SPAWN:RandomizeTemplate( SpawnTemplatePrefixTable ) - self:F( { self.SpawnTemplatePrefix, SpawnTemplatePrefixTable } ) - - self.SpawnTemplatePrefixTable = SpawnTemplatePrefixTable - self.SpawnRandomizeTemplate = true - - for SpawnGroupID = 1, self.SpawnMaxGroups do - self:_RandomizeTemplate( SpawnGroupID ) - end - - return self -end - - - - - ---- For planes and helicopters, when these groups go home and land on their home airbases and farps, they normally would taxi to the parking spot, shut-down their engines and wait forever until the Group is removed by the runtime environment. --- This function is used to re-spawn automatically (so no extra call is needed anymore) the same group after it has landed. --- This will enable a spawned group to be re-spawned after it lands, until it is destroyed... --- Note: When the group is respawned, it will re-spawn from the original airbase where it took off. --- So ensure that the routes for groups that respawn, always return to the original airbase, or players may get confused ... --- @param #SPAWN self --- @return #SPAWN self --- @usage --- -- RU Su-34 - AI Ship Attack --- -- Re-SPAWN the Group(s) after each landing and Engine Shut-Down automatically. --- SpawnRU_SU34 = SPAWN:New( 'TF1 RU Su-34 Krymsk@AI - Attack Ships' ):Schedule( 2, 3, 1800, 0.4 ):SpawnUncontrolled():RandomizeRoute( 1, 1, 3000 ):RepeatOnEngineShutDown() -function SPAWN:InitRepeat() - self:F( { self.SpawnTemplatePrefix, self.SpawnIndex } ) - - self.Repeat = true - self.RepeatOnEngineShutDown = false - self.RepeatOnLanding = true - - return self -end - ---- Respawn group after landing. --- @param #SPAWN self --- @return #SPAWN self -function SPAWN:InitRepeatOnLanding() - self:F( { self.SpawnTemplatePrefix } ) - - self:InitRepeat() - self.RepeatOnEngineShutDown = false - self.RepeatOnLanding = true - - return self -end - - ---- Respawn after landing when its engines have shut down. --- @param #SPAWN self --- @return #SPAWN self -function SPAWN:InitRepeatOnEngineShutDown() - self:F( { self.SpawnTemplatePrefix } ) - - self:InitRepeat() - self.RepeatOnEngineShutDown = true - self.RepeatOnLanding = false - - return self -end - - ---- CleanUp groups when they are still alive, but inactive. --- When groups are still alive and have become inactive due to damage and are unable to contribute anything, then this group will be removed at defined intervals in seconds. --- @param #SPAWN self --- @param #string SpawnCleanUpInterval The interval to check for inactive groups within seconds. --- @return #SPAWN self --- @usage Spawn_Helicopter:CleanUp( 20 ) -- CleanUp the spawning of the helicopters every 20 seconds when they become inactive. -function SPAWN:CleanUp( SpawnCleanUpInterval ) - self:F( { self.SpawnTemplatePrefix, SpawnCleanUpInterval } ) - - self.SpawnCleanUpInterval = SpawnCleanUpInterval - self.SpawnCleanUpTimeStamps = {} - --self.CleanUpFunction = routines.scheduleFunction( self._SpawnCleanUpScheduler, { self }, timer.getTime() + 1, SpawnCleanUpInterval ) - self.CleanUpScheduler = SCHEDULER:New( self, self._SpawnCleanUpScheduler, {}, 1, SpawnCleanUpInterval, 0.2 ) - return self -end - - - ---- Makes the groups visible before start (like a batallion). --- The method will take the position of the group as the first position in the array. --- @param #SPAWN self --- @param #number SpawnAngle The angle in degrees how the groups and each unit of the group will be positioned. --- @param #number SpawnWidth The amount of Groups that will be positioned on the X axis. --- @param #number SpawnDeltaX The space between each Group on the X-axis. --- @param #number SpawnDeltaY The space between each Group on the Y-axis. --- @return #SPAWN self --- @usage --- -- Define an array of Groups. --- Spawn_BE_Ground = SPAWN:New( 'BE Ground' ):Limit( 2, 24 ):Visible( 90, "Diamond", 10, 100, 50 ) -function SPAWN:Array( SpawnAngle, SpawnWidth, SpawnDeltaX, SpawnDeltaY ) - self:F( { self.SpawnTemplatePrefix, SpawnAngle, SpawnWidth, SpawnDeltaX, SpawnDeltaY } ) - - self.SpawnVisible = true -- When the first Spawn executes, all the Groups need to be made visible before start. - - local SpawnX = 0 - local SpawnY = 0 - local SpawnXIndex = 0 - local SpawnYIndex = 0 - - for SpawnGroupID = 1, self.SpawnMaxGroups do - self:T( { SpawnX, SpawnY, SpawnXIndex, SpawnYIndex } ) - - self.SpawnGroups[SpawnGroupID].Visible = true - self.SpawnGroups[SpawnGroupID].Spawned = false - - SpawnXIndex = SpawnXIndex + 1 - if SpawnWidth and SpawnWidth ~= 0 then - if SpawnXIndex >= SpawnWidth then - SpawnXIndex = 0 - SpawnYIndex = SpawnYIndex + 1 - end - end - - local SpawnRootX = self.SpawnGroups[SpawnGroupID].SpawnTemplate.x - local SpawnRootY = self.SpawnGroups[SpawnGroupID].SpawnTemplate.y - - self:_TranslateRotate( SpawnGroupID, SpawnRootX, SpawnRootY, SpawnX, SpawnY, SpawnAngle ) - - self.SpawnGroups[SpawnGroupID].SpawnTemplate.lateActivation = true - self.SpawnGroups[SpawnGroupID].SpawnTemplate.visible = true - - self.SpawnGroups[SpawnGroupID].Visible = true - - _EVENTDISPATCHER:OnBirthForTemplate( self.SpawnGroups[SpawnGroupID].SpawnTemplate, self._OnBirth, self ) - _EVENTDISPATCHER:OnCrashForTemplate( self.SpawnGroups[SpawnGroupID].SpawnTemplate, self._OnDeadOrCrash, self ) - _EVENTDISPATCHER:OnDeadForTemplate( self.SpawnGroups[SpawnGroupID].SpawnTemplate, self._OnDeadOrCrash, self ) - - if self.Repeat then - _EVENTDISPATCHER:OnTakeOffForTemplate( self.SpawnGroups[SpawnGroupID].SpawnTemplate, self._OnTakeOff, self ) - _EVENTDISPATCHER:OnLandForTemplate( self.SpawnGroups[SpawnGroupID].SpawnTemplate, self._OnLand, self ) - end - if self.RepeatOnEngineShutDown then - _EVENTDISPATCHER:OnEngineShutDownForTemplate( self.SpawnGroups[SpawnGroupID].SpawnTemplate, self._OnEngineShutDown, self ) - end - - self.SpawnGroups[SpawnGroupID].Group = _DATABASE:Spawn( self.SpawnGroups[SpawnGroupID].SpawnTemplate ) - - SpawnX = SpawnXIndex * SpawnDeltaX - SpawnY = SpawnYIndex * SpawnDeltaY - end - - return self -end - - - ---- Will spawn a group based on the internal index. --- Note: Uses @{DATABASE} module defined in MOOSE. --- @param #SPAWN self --- @return Group#GROUP The group that was spawned. You can use this group for further actions. -function SPAWN:Spawn() - self:F( { self.SpawnTemplatePrefix, self.SpawnIndex } ) - - return self:SpawnWithIndex( self.SpawnIndex + 1 ) -end - ---- Will re-spawn a group based on a given index. --- Note: Uses @{DATABASE} module defined in MOOSE. --- @param #SPAWN self --- @param #string SpawnIndex The index of the group to be spawned. --- @return Group#GROUP The group that was spawned. You can use this group for further actions. -function SPAWN:ReSpawn( SpawnIndex ) - self:F( { self.SpawnTemplatePrefix, SpawnIndex } ) - - if not SpawnIndex then - SpawnIndex = 1 - end - --- TODO: This logic makes DCS crash and i don't know why (yet). - local SpawnGroup = self:GetGroupFromIndex( SpawnIndex ) - if SpawnGroup then - local SpawnDCSGroup = SpawnGroup:GetDCSGroup() - if SpawnDCSGroup then - SpawnGroup:Destroy() - end - end - - return self:SpawnWithIndex( SpawnIndex ) -end - ---- Will spawn a group with a specified index number. --- Uses @{DATABASE} global object defined in MOOSE. --- @param #SPAWN self --- @return Group#GROUP The group that was spawned. You can use this group for further actions. -function SPAWN:SpawnWithIndex( SpawnIndex ) - self:F( { self.SpawnTemplatePrefix, SpawnIndex, self.SpawnMaxGroups } ) - - if self:_GetSpawnIndex( SpawnIndex ) then - - if self.SpawnGroups[self.SpawnIndex].Visible then - self.SpawnGroups[self.SpawnIndex].Group:Activate() - else - self:T( self.SpawnGroups[self.SpawnIndex].SpawnTemplate ) - _EVENTDISPATCHER:OnBirthForTemplate( self.SpawnGroups[self.SpawnIndex].SpawnTemplate, self._OnBirth, self ) - _EVENTDISPATCHER:OnCrashForTemplate( self.SpawnGroups[self.SpawnIndex].SpawnTemplate, self._OnDeadOrCrash, self ) - _EVENTDISPATCHER:OnDeadForTemplate( self.SpawnGroups[self.SpawnIndex].SpawnTemplate, self._OnDeadOrCrash, self ) - - if self.Repeat then - _EVENTDISPATCHER:OnTakeOffForTemplate( self.SpawnGroups[self.SpawnIndex].SpawnTemplate, self._OnTakeOff, self ) - _EVENTDISPATCHER:OnLandForTemplate( self.SpawnGroups[self.SpawnIndex].SpawnTemplate, self._OnLand, self ) - end - if self.RepeatOnEngineShutDown then - _EVENTDISPATCHER:OnEngineShutDownForTemplate( self.SpawnGroups[self.SpawnIndex].SpawnTemplate, self._OnEngineShutDown, self ) - end - - self:T( self.SpawnGroups[self.SpawnIndex].SpawnTemplate ) - - self.SpawnGroups[self.SpawnIndex].Group = _DATABASE:Spawn( self.SpawnGroups[self.SpawnIndex].SpawnTemplate ) - - -- If there is a SpawnFunction hook defined, call it. - if self.SpawnFunctionHook then - self.SpawnFunctionHook( self.SpawnGroups[self.SpawnIndex].Group, unpack( self.SpawnFunctionArguments ) ) - end - -- TODO: Need to fix this by putting an "R" in the name of the group when the group repeats. - --if self.Repeat then - -- _DATABASE:SetStatusGroup( SpawnTemplate.name, "ReSpawn" ) - --end - end - - self.SpawnGroups[self.SpawnIndex].Spawned = true - return self.SpawnGroups[self.SpawnIndex].Group - else - --self:E( { self.SpawnTemplatePrefix, "No more Groups to Spawn:", SpawnIndex, self.SpawnMaxGroups } ) - end - - return nil -end - ---- Spawns new groups at varying time intervals. --- This is useful if you want to have continuity within your missions of certain (AI) groups to be present (alive) within your missions. --- @param #SPAWN self --- @param #number SpawnTime The time interval defined in seconds between each new spawn of new groups. --- @param #number SpawnTimeVariation The variation to be applied on the defined time interval between each new spawn. --- The variation is a number between 0 and 1, representing the %-tage of variation to be applied on the time interval. --- @return #SPAWN self --- @usage --- -- NATO helicopters engaging in the battle field. --- -- The time interval is set to SPAWN new helicopters between each 600 seconds, with a time variation of 50%. --- -- The time variation in this case will be between 450 seconds and 750 seconds. --- -- This is calculated as follows: --- -- Low limit: 600 * ( 1 - 0.5 / 2 ) = 450 --- -- High limit: 600 * ( 1 + 0.5 / 2 ) = 750 --- -- Between these two values, a random amount of seconds will be choosen for each new spawn of the helicopters. --- Spawn_BE_KA50 = SPAWN:New( 'BE KA-50@RAMP-Ground Defense' ):Schedule( 600, 0.5 ) -function SPAWN:SpawnScheduled( SpawnTime, SpawnTimeVariation ) - self:F( { SpawnTime, SpawnTimeVariation } ) - - if SpawnTime ~= nil and SpawnTimeVariation ~= nil then - self.SpawnScheduler = SCHEDULER:New( self, self._Scheduler, {}, 1, SpawnTime, SpawnTimeVariation ) - end - - return self -end - ---- Will re-start the spawning scheduler. --- Note: This function is only required to be called when the schedule was stopped. -function SPAWN:SpawnScheduleStart() - self:F( { self.SpawnTemplatePrefix } ) - - self.SpawnScheduler:Start() -end - ---- Will stop the scheduled spawning scheduler. -function SPAWN:SpawnScheduleStop() - self:F( { self.SpawnTemplatePrefix } ) - - self.SpawnScheduler:Stop() -end - - ---- Allows to place a CallFunction hook when a new group spawns. --- The provided function will be called when a new group is spawned, including its given parameters. --- The first parameter of the SpawnFunction is the @{Group#GROUP} that was spawned. --- @param #SPAWN self --- @param #function SpawnFunctionHook The function to be called when a group spawns. --- @param SpawnFunctionArguments A random amount of arguments to be provided to the function when the group spawns. --- @return #SPAWN -function SPAWN:SpawnFunction( SpawnFunctionHook, ... ) - self:F( SpawnFunction ) - - self.SpawnFunctionHook = SpawnFunctionHook - self.SpawnFunctionArguments = {} - if arg then - self.SpawnFunctionArguments = arg - end - - return self -end - - - - ---- Will spawn a group from a hosting unit. This function is mostly advisable to be used if you want to simulate spawning from air units, like helicopters, which are dropping infantry into a defined Landing Zone. --- Note that each point in the route assigned to the spawning group is reset to the point of the spawn. --- You can use the returned group to further define the route to be followed. --- @param #SPAWN self --- @param Unit#UNIT HostUnit The air or ground unit dropping or unloading the group. --- @param #number OuterRadius The outer radius in meters where the new group will be spawned. --- @param #number InnerRadius The inner radius in meters where the new group will NOT be spawned. --- @param #number SpawnIndex (Optional) The index which group to spawn within the given zone. --- @return Group#GROUP that was spawned. --- @return #nil Nothing was spawned. -function SPAWN:SpawnFromUnit( HostUnit, OuterRadius, InnerRadius, SpawnIndex ) - self:F( { self.SpawnTemplatePrefix, HostUnit, OuterRadius, InnerRadius, SpawnIndex } ) - - if HostUnit and HostUnit:IsAlive() then -- and HostUnit:getUnit(1):inAir() == false then - - if SpawnIndex then - else - SpawnIndex = self.SpawnIndex + 1 - end - - if self:_GetSpawnIndex( SpawnIndex ) then - - local SpawnTemplate = self.SpawnGroups[self.SpawnIndex].SpawnTemplate - - if SpawnTemplate then - - local UnitPoint = HostUnit:GetPointVec2() - - self:T( { "Current point of ", self.SpawnTemplatePrefix, UnitPoint } ) - - --for PointID, Point in pairs( SpawnTemplate.route.points ) do - --Point.x = UnitPoint.x - --Point.y = UnitPoint.y - --Point.alt = nil - --Point.alt_type = nil - --end - - SpawnTemplate.route.points[1].x = UnitPoint.x - SpawnTemplate.route.points[1].y = UnitPoint.y - - if not InnerRadius then - InnerRadius = 10 - end - - if not OuterRadius then - OuterRadius = 50 - end - - -- Apply SpawnFormation - for UnitID = 1, #SpawnTemplate.units do - if InnerRadius == 0 then - SpawnTemplate.units[UnitID].x = UnitPoint.x - SpawnTemplate.units[UnitID].y = UnitPoint.y - else - local CirclePos = routines.getRandPointInCircle( UnitPoint, OuterRadius, InnerRadius ) - SpawnTemplate.units[UnitID].x = CirclePos.x - SpawnTemplate.units[UnitID].y = CirclePos.y - end - self:T( 'SpawnTemplate.units['..UnitID..'].x = ' .. SpawnTemplate.units[UnitID].x .. ', SpawnTemplate.units['..UnitID..'].y = ' .. SpawnTemplate.units[UnitID].y ) - end - - local SpawnPos = routines.getRandPointInCircle( UnitPoint, OuterRadius, InnerRadius ) - local Point = {} - Point.type = "Turning Point" - Point.x = SpawnPos.x - Point.y = SpawnPos.y - Point.action = "Cone" - Point.speed = 5 - - table.insert( SpawnTemplate.route.points, 2, Point ) - - return self:SpawnWithIndex( self.SpawnIndex ) - end - end - end - - return nil -end - ---- Will spawn a Group within a given @{Zone#ZONE}. --- Once the group is spawned within the zone, it will continue on its route. --- The first waypoint (where the group is spawned) is replaced with the zone coordinates. --- @param #SPAWN self --- @param Zone#ZONE Zone The zone where the group is to be spawned. --- @param #number ZoneRandomize (Optional) Set to true if you want to randomize the starting point in the zone. --- @param #number SpawnIndex (Optional) The index which group to spawn within the given zone. --- @return Group#GROUP that was spawned. --- @return #nil when nothing was spawned. -function SPAWN:SpawnInZone( Zone, ZoneRandomize, SpawnIndex ) - self:F( { self.SpawnTemplatePrefix, Zone, ZoneRandomize, SpawnIndex } ) - - if Zone then - - if SpawnIndex then - else - SpawnIndex = self.SpawnIndex + 1 - end - - if self:_GetSpawnIndex( SpawnIndex ) then - - local SpawnTemplate = self.SpawnGroups[self.SpawnIndex].SpawnTemplate - - if SpawnTemplate then - - local ZonePoint - - if ZoneRandomize == true then - ZonePoint = Zone:GetRandomPointVec2() - else - ZonePoint = Zone:GetPointVec2() - end - - SpawnTemplate.route.points[1].x = ZonePoint.x - SpawnTemplate.route.points[1].y = ZonePoint.y - - -- Apply SpawnFormation - for UnitID = 1, #SpawnTemplate.units do - local ZonePointUnit = Zone:GetRandomPointVec2() - SpawnTemplate.units[UnitID].x = ZonePointUnit.x - SpawnTemplate.units[UnitID].y = ZonePointUnit.y - self:T( 'SpawnTemplate.units['..UnitID..'].x = ' .. SpawnTemplate.units[UnitID].x .. ', SpawnTemplate.units['..UnitID..'].y = ' .. SpawnTemplate.units[UnitID].y ) - end - - return self:SpawnWithIndex( self.SpawnIndex ) - end - end - end - - return nil -end - - - - ---- Will spawn a plane group in uncontrolled mode... --- This will be similar to the uncontrolled flag setting in the ME. --- @return #SPAWN self -function SPAWN:UnControlled() - self:F( { self.SpawnTemplatePrefix } ) - - self.SpawnUnControlled = true - - for SpawnGroupID = 1, self.SpawnMaxGroups do - self.SpawnGroups[SpawnGroupID].UnControlled = true - end - - return self -end - - - ---- Will return the SpawnGroupName either with with a specific count number or without any count. --- @param #SPAWN self --- @param #number SpawnIndex Is the number of the Group that is to be spawned. --- @return #string SpawnGroupName -function SPAWN:SpawnGroupName( SpawnIndex ) - self:F( { self.SpawnTemplatePrefix, SpawnIndex } ) - - local SpawnPrefix = self.SpawnTemplatePrefix - if self.SpawnAliasPrefix then - SpawnPrefix = self.SpawnAliasPrefix - end - - if SpawnIndex then - local SpawnName = string.format( '%s#%03d', SpawnPrefix, SpawnIndex ) - self:T( SpawnName ) - return SpawnName - else - self:T( SpawnPrefix ) - return SpawnPrefix - end - -end - ---- Find the first alive group. --- @param #SPAWN self --- @param #number SpawnCursor A number holding the index from where to find the first group from. --- @return Group#GROUP, #number The group found, the new index where the group was found. --- @return #nil, #nil When no group is found, #nil is returned. -function SPAWN:GetFirstAliveGroup( SpawnCursor ) - self:F( { self.SpawnTemplatePrefix, self.SpawnAliasPrefix, SpawnCursor } ) - - for SpawnIndex = 1, self.SpawnCount do - local SpawnGroup = self:GetGroupFromIndex( SpawnIndex ) - if SpawnGroup and SpawnGroup:IsAlive() then - SpawnCursor = SpawnIndex - return SpawnGroup, SpawnCursor - end - end - - return nil, nil -end - - ---- Find the next alive group. --- @param #SPAWN self --- @param #number SpawnCursor A number holding the last found previous index. --- @return Group#GROUP, #number The group found, the new index where the group was found. --- @return #nil, #nil When no group is found, #nil is returned. -function SPAWN:GetNextAliveGroup( SpawnCursor ) - self:F( { self.SpawnTemplatePrefix, self.SpawnAliasPrefix, SpawnCursor } ) - - SpawnCursor = SpawnCursor + 1 - for SpawnIndex = SpawnCursor, self.SpawnCount do - local SpawnGroup = self:GetGroupFromIndex( SpawnIndex ) - if SpawnGroup and SpawnGroup:IsAlive() then - SpawnCursor = SpawnIndex - return SpawnGroup, SpawnCursor - end - end - - return nil, nil -end - ---- Find the last alive group during runtime. -function SPAWN:GetLastAliveGroup() - self:F( { self.SpawnTemplatePrefixself.SpawnAliasPrefix } ) - - self.SpawnIndex = self:_GetLastIndex() - for SpawnIndex = self.SpawnIndex, 1, -1 do - local SpawnGroup = self:GetGroupFromIndex( SpawnIndex ) - if SpawnGroup and SpawnGroup:IsAlive() then - self.SpawnIndex = SpawnIndex - return SpawnGroup - end - end - - self.SpawnIndex = nil - return nil -end - - - ---- Get the group from an index. --- Returns the group from the SpawnGroups list. --- If no index is given, it will return the first group in the list. --- @param #SPAWN self --- @param #number SpawnIndex The index of the group to return. --- @return Group#GROUP self -function SPAWN:GetGroupFromIndex( SpawnIndex ) - self:F( { self.SpawnTemplatePrefix, self.SpawnAliasPrefix, SpawnIndex } ) - - if not SpawnIndex then - SpawnIndex = 1 - end - - if self.SpawnGroups and self.SpawnGroups[SpawnIndex] then - local SpawnGroup = self.SpawnGroups[SpawnIndex].Group - return SpawnGroup - else - return nil - end -end - ---- Get the group index from a DCSUnit. --- The method will search for a #-mark, and will return the index behind the #-mark of the DCSUnit. --- It will return nil of no prefix was found. --- @param #SPAWN self --- @param DCSUnit The DCS unit to be searched. --- @return #string The prefix --- @return #nil Nothing found -function SPAWN:_GetGroupIndexFromDCSUnit( DCSUnit ) - self:F( { self.SpawnTemplatePrefix, self.SpawnAliasPrefix, DCSUnit } ) - - if DCSUnit and DCSUnit:getName() then - local IndexString = string.match( DCSUnit:getName(), "#.*-" ):sub( 2, -2 ) - self:T( IndexString ) - - if IndexString then - local Index = tonumber( IndexString ) - self:T( { "Index:", IndexString, Index } ) - return Index - end - end - - return nil -end - ---- Return the prefix of a DCSUnit. --- The method will search for a #-mark, and will return the text before the #-mark. --- It will return nil of no prefix was found. --- @param #SPAWN self --- @param DCSUnit The DCS unit to be searched. --- @return #string The prefix --- @return #nil Nothing found -function SPAWN:_GetPrefixFromDCSUnit( DCSUnit ) - self:F( { self.SpawnTemplatePrefix, self.SpawnAliasPrefix, DCSUnit } ) - - if DCSUnit and DCSUnit:getName() then - local SpawnPrefix = string.match( DCSUnit:getName(), ".*#" ) - if SpawnPrefix then - SpawnPrefix = SpawnPrefix:sub( 1, -2 ) - end - self:T( SpawnPrefix ) - return SpawnPrefix - end - - return nil -end - ---- Return the group within the SpawnGroups collection with input a DCSUnit. -function SPAWN:_GetGroupFromDCSUnit( DCSUnit ) - self:F( { self.SpawnTemplatePrefix, self.SpawnAliasPrefix, DCSUnit } ) - - if DCSUnit then - local SpawnPrefix = self:_GetPrefixFromDCSUnit( DCSUnit ) - - if self.SpawnTemplatePrefix == SpawnPrefix or ( self.SpawnAliasPrefix and self.SpawnAliasPrefix == SpawnPrefix ) then - local SpawnGroupIndex = self:_GetGroupIndexFromDCSUnit( DCSUnit ) - local SpawnGroup = self.SpawnGroups[SpawnGroupIndex].Group - self:T( SpawnGroup ) - return SpawnGroup - end - end - - return nil -end - - ---- Get the index from a given group. --- The function will search the name of the group for a #, and will return the number behind the #-mark. -function SPAWN:GetSpawnIndexFromGroup( SpawnGroup ) - self:F( { self.SpawnTemplatePrefix, self.SpawnAliasPrefix, SpawnGroup } ) - - local IndexString = string.match( SpawnGroup:GetName(), "#.*$" ):sub( 2 ) - local Index = tonumber( IndexString ) - - self:T( IndexString, Index ) - return Index - -end - ---- Return the last maximum index that can be used. -function SPAWN:_GetLastIndex() - self:F( { self.SpawnTemplatePrefix, self.SpawnAliasPrefix } ) - - return self.SpawnMaxGroups -end - ---- Initalize the SpawnGroups collection. -function SPAWN:_InitializeSpawnGroups( SpawnIndex ) - self:F( { self.SpawnTemplatePrefix, self.SpawnAliasPrefix, SpawnIndex } ) - - if not self.SpawnGroups[SpawnIndex] then - self.SpawnGroups[SpawnIndex] = {} - self.SpawnGroups[SpawnIndex].Visible = false - self.SpawnGroups[SpawnIndex].Spawned = false - self.SpawnGroups[SpawnIndex].UnControlled = false - self.SpawnGroups[SpawnIndex].SpawnTime = 0 - - self.SpawnGroups[SpawnIndex].SpawnTemplatePrefix = self.SpawnTemplatePrefix - self.SpawnGroups[SpawnIndex].SpawnTemplate = self:_Prepare( self.SpawnGroups[SpawnIndex].SpawnTemplatePrefix, SpawnIndex ) - end - - self:_RandomizeTemplate( SpawnIndex ) - self:_RandomizeRoute( SpawnIndex ) - --self:_TranslateRotate( SpawnIndex ) - - return self.SpawnGroups[SpawnIndex] -end - - - ---- Gets the CategoryID of the Group with the given SpawnPrefix -function SPAWN:_GetGroupCategoryID( SpawnPrefix ) - local TemplateGroup = Group.getByName( SpawnPrefix ) - - if TemplateGroup then - return TemplateGroup:getCategory() - else - return nil - end -end - ---- Gets the CoalitionID of the Group with the given SpawnPrefix -function SPAWN:_GetGroupCoalitionID( SpawnPrefix ) - local TemplateGroup = Group.getByName( SpawnPrefix ) - - if TemplateGroup then - return TemplateGroup:getCoalition() - else - return nil - end -end - ---- Gets the CountryID of the Group with the given SpawnPrefix -function SPAWN:_GetGroupCountryID( SpawnPrefix ) - self:F( { self.SpawnTemplatePrefix, self.SpawnAliasPrefix, SpawnPrefix } ) - - local TemplateGroup = Group.getByName( SpawnPrefix ) - - if TemplateGroup then - local TemplateUnits = TemplateGroup:getUnits() - return TemplateUnits[1]:getCountry() - else - return nil - end -end - ---- Gets the Group Template from the ME environment definition. --- This method used the @{DATABASE} object, which contains ALL initial and new spawned object in MOOSE. --- @param #SPAWN self --- @param #string SpawnTemplatePrefix --- @return @SPAWN self -function SPAWN:_GetTemplate( SpawnTemplatePrefix ) - self:F( { self.SpawnTemplatePrefix, self.SpawnAliasPrefix, SpawnTemplatePrefix } ) - - local SpawnTemplate = nil - - SpawnTemplate = routines.utils.deepCopy( _DATABASE.Templates.Groups[SpawnTemplatePrefix].Template ) - - if SpawnTemplate == nil then - error( 'No Template returned for SpawnTemplatePrefix = ' .. SpawnTemplatePrefix ) - end - - SpawnTemplate.SpawnCoalitionID = self:_GetGroupCoalitionID( SpawnTemplatePrefix ) - SpawnTemplate.SpawnCategoryID = self:_GetGroupCategoryID( SpawnTemplatePrefix ) - SpawnTemplate.SpawnCountryID = self:_GetGroupCountryID( SpawnTemplatePrefix ) - - self:T( { SpawnTemplate } ) - return SpawnTemplate -end - ---- Prepares the new Group Template. --- @param #SPAWN self --- @param #string SpawnTemplatePrefix --- @param #number SpawnIndex --- @return #SPAWN self -function SPAWN:_Prepare( SpawnTemplatePrefix, SpawnIndex ) - self:F( { self.SpawnTemplatePrefix, self.SpawnAliasPrefix } ) - - local SpawnTemplate = self:_GetTemplate( SpawnTemplatePrefix ) - SpawnTemplate.name = self:SpawnGroupName( SpawnIndex ) - - SpawnTemplate.groupId = nil - --SpawnTemplate.lateActivation = false - SpawnTemplate.lateActivation = false -- TODO BUGFIX - - if SpawnTemplate.SpawnCategoryID == Group.Category.GROUND then - self:T( "For ground units, visible needs to be false..." ) - SpawnTemplate.visible = false -- TODO BUGFIX - end - - if SpawnTemplate.SpawnCategoryID == Group.Category.HELICOPTER or SpawnTemplate.SpawnCategoryID == Group.Category.AIRPLANE then - SpawnTemplate.uncontrolled = false - end - - for UnitID = 1, #SpawnTemplate.units do - SpawnTemplate.units[UnitID].name = string.format( SpawnTemplate.name .. '-%02d', UnitID ) - SpawnTemplate.units[UnitID].unitId = nil - SpawnTemplate.units[UnitID].x = SpawnTemplate.route.points[1].x - SpawnTemplate.units[UnitID].y = SpawnTemplate.route.points[1].y - end - - self:T( { "Template:", SpawnTemplate } ) - return SpawnTemplate - -end - ---- Private method randomizing the routes. --- @param #SPAWN self --- @param #number SpawnIndex The index of the group to be spawned. --- @return #SPAWN -function SPAWN:_RandomizeRoute( SpawnIndex ) - self:F( { self.SpawnTemplatePrefix, SpawnIndex, self.SpawnRandomizeRoute, self.SpawnRandomizeRouteStartPoint, self.SpawnRandomizeRouteEndPoint, self.SpawnRandomizeRouteRadius } ) - - if self.SpawnRandomizeRoute then - local SpawnTemplate = self.SpawnGroups[SpawnIndex].SpawnTemplate - local RouteCount = #SpawnTemplate.route.points - - for t = self.SpawnRandomizeRouteStartPoint + 1, ( RouteCount - self.SpawnRandomizeRouteEndPoint ) do - SpawnTemplate.route.points[t].x = SpawnTemplate.route.points[t].x + math.random( self.SpawnRandomizeRouteRadius * -1, self.SpawnRandomizeRouteRadius ) - SpawnTemplate.route.points[t].y = SpawnTemplate.route.points[t].y + math.random( self.SpawnRandomizeRouteRadius * -1, self.SpawnRandomizeRouteRadius ) - -- TODO: manage altitude for airborne units ... - SpawnTemplate.route.points[t].alt = nil - --SpawnGroup.route.points[t].alt_type = nil - self:T( 'SpawnTemplate.route.points[' .. t .. '].x = ' .. SpawnTemplate.route.points[t].x .. ', SpawnTemplate.route.points[' .. t .. '].y = ' .. SpawnTemplate.route.points[t].y ) - end - end - - return self -end - ---- Private method that randomizes the template of the group. --- @param #SPAWN self --- @param #number SpawnIndex --- @return #SPAWN self -function SPAWN:_RandomizeTemplate( SpawnIndex ) - self:F( { self.SpawnTemplatePrefix, SpawnIndex, self.SpawnRandomizeTemplate } ) - - if self.SpawnRandomizeTemplate then - self.SpawnGroups[SpawnIndex].SpawnTemplatePrefix = self.SpawnTemplatePrefixTable[ math.random( 1, #self.SpawnTemplatePrefixTable ) ] - self.SpawnGroups[SpawnIndex].SpawnTemplate = self:_Prepare( self.SpawnGroups[SpawnIndex].SpawnTemplatePrefix, SpawnIndex ) - self.SpawnGroups[SpawnIndex].SpawnTemplate.route = routines.utils.deepCopy( self.SpawnTemplate.route ) - self.SpawnGroups[SpawnIndex].SpawnTemplate.x = self.SpawnTemplate.x - self.SpawnGroups[SpawnIndex].SpawnTemplate.y = self.SpawnTemplate.y - self.SpawnGroups[SpawnIndex].SpawnTemplate.start_time = self.SpawnTemplate.start_time - for UnitID = 1, #self.SpawnGroups[SpawnIndex].SpawnTemplate.units do - self.SpawnGroups[SpawnIndex].SpawnTemplate.units[UnitID].heading = self.SpawnTemplate.units[1].heading - end - end - - self:_RandomizeRoute( SpawnIndex ) - - return self -end - -function SPAWN:_TranslateRotate( SpawnIndex, SpawnRootX, SpawnRootY, SpawnX, SpawnY, SpawnAngle ) - self:F( { self.SpawnTemplatePrefix, SpawnIndex, SpawnRootX, SpawnRootY, SpawnX, SpawnY, SpawnAngle } ) - - -- Translate - local TranslatedX = SpawnX - local TranslatedY = SpawnY - - -- Rotate - -- From Wikipedia: https://en.wikipedia.org/wiki/Rotation_matrix#Common_rotations - -- x' = x \cos \theta - y \sin \theta\ - -- y' = x \sin \theta + y \cos \theta\ - local RotatedX = - TranslatedX * math.cos( math.rad( SpawnAngle ) ) - + TranslatedY * math.sin( math.rad( SpawnAngle ) ) - local RotatedY = TranslatedX * math.sin( math.rad( SpawnAngle ) ) - + TranslatedY * math.cos( math.rad( SpawnAngle ) ) - - -- Assign - self.SpawnGroups[SpawnIndex].SpawnTemplate.x = SpawnRootX - RotatedX - self.SpawnGroups[SpawnIndex].SpawnTemplate.y = SpawnRootY + RotatedY - - - local SpawnUnitCount = table.getn( self.SpawnGroups[SpawnIndex].SpawnTemplate.units ) - for u = 1, SpawnUnitCount do - - -- Translate - local TranslatedX = SpawnX - local TranslatedY = SpawnY - 10 * ( u - 1 ) - - -- Rotate - local RotatedX = - TranslatedX * math.cos( math.rad( SpawnAngle ) ) - + TranslatedY * math.sin( math.rad( SpawnAngle ) ) - local RotatedY = TranslatedX * math.sin( math.rad( SpawnAngle ) ) - + TranslatedY * math.cos( math.rad( SpawnAngle ) ) - - -- Assign - self.SpawnGroups[SpawnIndex].SpawnTemplate.units[u].x = SpawnRootX - RotatedX - self.SpawnGroups[SpawnIndex].SpawnTemplate.units[u].y = SpawnRootY + RotatedY - self.SpawnGroups[SpawnIndex].SpawnTemplate.units[u].heading = self.SpawnGroups[SpawnIndex].SpawnTemplate.units[u].heading + math.rad( SpawnAngle ) - end - - return self -end - ---- Get the next index of the groups to be spawned. This function is complicated, as it is used at several spaces. -function SPAWN:_GetSpawnIndex( SpawnIndex ) - self:F( { self.SpawnTemplatePrefix, SpawnIndex, self.SpawnMaxGroups, self.SpawnMaxUnitsAlive, self.AliveUnits, #self.SpawnTemplate.units } ) - - - if ( self.SpawnMaxGroups == 0 ) or ( SpawnIndex <= self.SpawnMaxGroups ) then - if ( self.SpawnMaxUnitsAlive == 0 ) or ( self.AliveUnits < self.SpawnMaxUnitsAlive * #self.SpawnTemplate.units ) or self.UnControlled then - if SpawnIndex and SpawnIndex >= self.SpawnCount + 1 then - self.SpawnCount = self.SpawnCount + 1 - SpawnIndex = self.SpawnCount - end - self.SpawnIndex = SpawnIndex - if not self.SpawnGroups[self.SpawnIndex] then - self:_InitializeSpawnGroups( self.SpawnIndex ) - end - else - return nil - end - else - return nil - end - - return self.SpawnIndex -end - - --- TODO Need to delete this... _DATABASE does this now ... -function SPAWN:_OnBirth( event ) - - if timer.getTime0() < timer.getAbsTime() then -- dont need to add units spawned in at the start of the mission if mist is loaded in init line - if event.initiator and event.initiator:getName() then - local EventPrefix = self:_GetPrefixFromDCSUnit( event.initiator ) - if EventPrefix == self.SpawnTemplatePrefix or ( self.SpawnAliasPrefix and EventPrefix == self.SpawnAliasPrefix ) then - self:T( { "Birth event: " .. event.initiator:getName(), event } ) - --MessageToAll( "Mission command: unit " .. SpawnTemplatePrefix .. " spawned." , 5, EventPrefix .. '/Event') - self.AliveUnits = self.AliveUnits + 1 - self:T( "Alive Units: " .. self.AliveUnits ) - end - end - end - -end - ---- Obscolete --- @todo Need to delete this... _DATABASE does this now ... -function SPAWN:_OnDeadOrCrash( event ) - self:F( self.SpawnTemplatePrefix, event ) - - if event.initiator and event.initiator:getName() then - local EventPrefix = self:_GetPrefixFromDCSUnit( event.initiator ) - if EventPrefix == self.SpawnTemplatePrefix or ( self.SpawnAliasPrefix and EventPrefix == self.SpawnAliasPrefix ) then - self:T( { "Dead event: " .. event.initiator:getName(), event } ) --- local DestroyedUnit = Unit.getByName( EventPrefix ) --- if DestroyedUnit and DestroyedUnit.getLife() <= 1.0 then - --MessageToAll( "Mission command: unit " .. SpawnTemplatePrefix .. " crashed." , 5, EventPrefix .. '/Event') - self.AliveUnits = self.AliveUnits - 1 - self:T( "Alive Units: " .. self.AliveUnits ) --- end - end - end -end - ---- Will detect AIR Units taking off... When the event takes place, the spawned Group is registered as airborne... --- This is needed to ensure that Re-SPAWNing only is done for landed AIR Groups. --- @todo Need to test for AIR Groups only... -function SPAWN:_OnTakeOff( event ) - self:F( self.SpawnTemplatePrefix, event ) - - if event.initiator and event.initiator:getName() then - local SpawnGroup = self:_GetGroupFromDCSUnit( event.initiator ) - if SpawnGroup then - self:T( { "TakeOff event: " .. event.initiator:getName(), event } ) - self:T( "self.Landed = false" ) - self.Landed = false - end - end -end - ---- Will detect AIR Units landing... When the event takes place, the spawned Group is registered as landed. --- This is needed to ensure that Re-SPAWNing is only done for landed AIR Groups. --- @todo Need to test for AIR Groups only... -function SPAWN:_OnLand( event ) - self:F( self.SpawnTemplatePrefix, event ) - - local SpawnUnit = event.initiator - if SpawnUnit and SpawnUnit:isExist() and Object.getCategory(SpawnUnit) == Object.Category.UNIT then - local SpawnGroup = self:_GetGroupFromDCSUnit( SpawnUnit ) - if SpawnGroup then - self:T( { "Landed event:" .. SpawnUnit:getName(), event } ) - self.Landed = true - self:T( "self.Landed = true" ) - if self.Landed and self.RepeatOnLanding then - local SpawnGroupIndex = self:GetSpawnIndexFromGroup( SpawnGroup ) - self:T( { "Landed:", "ReSpawn:", SpawnGroup:GetName(), SpawnGroupIndex } ) - self:ReSpawn( SpawnGroupIndex ) - end - end - end -end - ---- Will detect AIR Units shutting down their engines ... --- When the event takes place, and the method @{RepeatOnEngineShutDown} was called, the spawned Group will Re-SPAWN. --- But only when the Unit was registered to have landed. --- @param #SPAWN self --- @see _OnTakeOff --- @see _OnLand --- @todo Need to test for AIR Groups only... -function SPAWN:_OnEngineShutDown( event ) - self:F( self.SpawnTemplatePrefix, event ) - - local SpawnUnit = event.initiator - if SpawnUnit and SpawnUnit:isExist() and Object.getCategory(SpawnUnit) == Object.Category.UNIT then - local SpawnGroup = self:_GetGroupFromDCSUnit( SpawnUnit ) - if SpawnGroup then - self:T( { "EngineShutDown event: " .. SpawnUnit:getName(), event } ) - if self.Landed and self.RepeatOnEngineShutDown then - local SpawnGroupIndex = self:GetSpawnIndexFromGroup( SpawnGroup ) - self:T( { "EngineShutDown: ", "ReSpawn:", SpawnGroup:GetName(), SpawnGroupIndex } ) - self:ReSpawn( SpawnGroupIndex ) - end - end - end -end - ---- This function is called automatically by the Spawning scheduler. --- It is the internal worker method SPAWNing new Groups on the defined time intervals. -function SPAWN:_Scheduler() - self:F( { "_Scheduler", self.SpawnTemplatePrefix, self.SpawnAliasPrefix, self.SpawnIndex, self.SpawnMaxGroups, self.SpawnMaxUnitsAlive } ) - - -- Validate if there are still groups left in the batch... - self:Spawn() - - return true -end - -function SPAWN:_SpawnCleanUpScheduler() - self:F( { "CleanUp Scheduler:", self.SpawnTemplatePrefix } ) - - local SpawnCursor - local SpawnGroup, SpawnCursor = self:GetFirstAliveGroup( SpawnCursor ) - - self:T( { "CleanUp Scheduler:", SpawnGroup } ) - - while SpawnGroup do - - if SpawnGroup:AllOnGround() and SpawnGroup:GetMaxVelocity() < 1 then - if not self.SpawnCleanUpTimeStamps[SpawnGroup:GetName()] then - self.SpawnCleanUpTimeStamps[SpawnGroup:GetName()] = timer.getTime() - else - if self.SpawnCleanUpTimeStamps[SpawnGroup:GetName()] + self.SpawnCleanUpInterval < timer.getTime() then - self:T( { "CleanUp Scheduler:", "Cleaning:", SpawnGroup } ) - SpawnGroup:Destroy() - end - end - else - self.SpawnCleanUpTimeStamps[SpawnGroup:GetName()] = nil - end - - SpawnGroup, SpawnCursor = self:GetNextAliveGroup( SpawnCursor ) - - self:T( { "CleanUp Scheduler:", SpawnGroup } ) - - end - - return true -- Repeat - -end ---- Limit the simultaneous movement of Groups within a running Mission. --- This module is defined to improve the performance in missions, and to bring additional realism for GROUND vehicles. --- Performance: If in a DCSRTE there are a lot of moving GROUND units, then in a multi player mission, this WILL create lag if --- the main DCS execution core of your CPU is fully utilized. So, this class will limit the amount of simultaneous moving GROUND units --- on defined intervals (currently every minute). --- @module MOVEMENT - ---- the MOVEMENT class --- @type -MOVEMENT = { - ClassName = "MOVEMENT", -} - ---- Creates the main object which is handling the GROUND forces movement. --- @param table{string,...}|string MovePrefixes is a table of the Prefixes (names) of the GROUND Groups that need to be controlled by the MOVEMENT Object. --- @param number MoveMaximum is a number that defines the maximum amount of GROUND Units to be moving during one minute. --- @return MOVEMENT --- @usage --- -- Limit the amount of simultaneous moving units on the ground to prevent lag. --- Movement_US_Platoons = MOVEMENT:New( { 'US Tank Platoon Left', 'US Tank Platoon Middle', 'US Tank Platoon Right', 'US CH-47D Troops' }, 15 ) - -function MOVEMENT:New( MovePrefixes, MoveMaximum ) - local self = BASE:Inherit( self, BASE:New() ) - self:F( { MovePrefixes, MoveMaximum } ) - - if type( MovePrefixes ) == 'table' then - self.MovePrefixes = MovePrefixes - else - self.MovePrefixes = { MovePrefixes } - end - self.MoveCount = 0 -- The internal counter of the amount of Moveing the has happened since MoveStart. - self.MoveMaximum = MoveMaximum -- Contains the Maximum amount of units that are allowed to move... - self.AliveUnits = 0 -- Contains the counter how many units are currently alive - self.MoveUnits = {} -- Reflects if the Moving for this MovePrefixes is going to be scheduled or not. - - _EVENTDISPATCHER:OnBirth( self.OnBirth, self ) - --- self:AddEvent( world.event.S_EVENT_BIRTH, self.OnBirth ) --- --- self:EnableEvents() - - self:ScheduleStart() - - return self -end - ---- Call this function to start the MOVEMENT scheduling. -function MOVEMENT:ScheduleStart() - self:F() - --self.MoveFunction = routines.scheduleFunction( self._Scheduler, { self }, timer.getTime() + 1, 120 ) - self.MoveFunction = SCHEDULER:New( self, self._Scheduler, {}, 1, 120 ) -end - ---- Call this function to stop the MOVEMENT scheduling. --- @todo need to implement it ... Forgot. -function MOVEMENT:ScheduleStop() - self:F() - -end - ---- Captures the birth events when new Units were spawned. --- @todo This method should become obsolete. The new @{DATABASE} class will handle the collection administration. -function MOVEMENT:OnBirth( Event ) - self:F( { Event } ) - - if timer.getTime0() < timer.getAbsTime() then -- dont need to add units spawned in at the start of the mission if mist is loaded in init line - if Event.IniDCSUnit then - self:T( "Birth object : " .. Event.IniDCSUnitName ) - if Event.IniDCSGroup and Event.IniDCSGroup:isExist() then - for MovePrefixID, MovePrefix in pairs( self.MovePrefixes ) do - if string.find( Event.IniDCSUnitName, MovePrefix, 1, true ) then - self.AliveUnits = self.AliveUnits + 1 - self.MoveUnits[Event.IniDCSUnitName] = Event.IniDCSGroupName - self:T( self.AliveUnits ) - end - end - end - end - _EVENTDISPATCHER:OnCrashForUnit( Event.IniDCSUnitName, self.OnDeadOrCrash, self ) - _EVENTDISPATCHER:OnDeadForUnit( Event.IniDCSUnitName, self.OnDeadOrCrash, self ) - end - -end - ---- Captures the Dead or Crash events when Units crash or are destroyed. --- @todo This method should become obsolete. The new @{DATABASE} class will handle the collection administration. -function MOVEMENT:OnDeadOrCrash( Event ) - self:F( { Event } ) - - if Event.IniDCSUnit then - self:T( "Dead object : " .. Event.IniDCSUnitName ) - for MovePrefixID, MovePrefix in pairs( self.MovePrefixes ) do - if string.find( Event.IniDCSUnitName, MovePrefix, 1, true ) then - self.AliveUnits = self.AliveUnits - 1 - self.MoveUnits[Event.IniDCSUnitName] = nil - self:T( self.AliveUnits ) - end - end - end -end - ---- This function is called automatically by the MOVEMENT scheduler. A new function is scheduled when MoveScheduled is true. -function MOVEMENT:_Scheduler() - self:F( { self.MovePrefixes, self.MoveMaximum, self.AliveUnits, self.MovementGroups } ) - - if self.AliveUnits > 0 then - local MoveProbability = ( self.MoveMaximum * 100 ) / self.AliveUnits - self:T( 'Move Probability = ' .. MoveProbability ) - - for MovementUnitName, MovementGroupName in pairs( self.MoveUnits ) do - local MovementGroup = Group.getByName( MovementGroupName ) - if MovementGroup and MovementGroup:isExist() then - local MoveOrStop = math.random( 1, 100 ) - self:T( 'MoveOrStop = ' .. MoveOrStop ) - if MoveOrStop <= MoveProbability then - self:T( 'Group continues moving = ' .. MovementGroupName ) - trigger.action.groupContinueMoving( MovementGroup ) - else - self:T( 'Group stops moving = ' .. MovementGroupName ) - trigger.action.groupStopMoving( MovementGroup ) - end - else - self.MoveUnits[MovementUnitName] = nil - end - end - end - return true -end ---- Provides defensive behaviour to a set of SAM sites within a running Mission. --- @module Sead --- @author to be searched on the forum --- @author (co) Flightcontrol (Modified and enriched with functionality) - ---- The SEAD class --- @type SEAD --- @extends Base#BASE -SEAD = { - ClassName = "SEAD", - TargetSkill = { - Average = { Evade = 50, DelayOff = { 10, 25 }, DelayOn = { 10, 30 } } , - Good = { Evade = 30, DelayOff = { 8, 20 }, DelayOn = { 20, 40 } } , - High = { Evade = 15, DelayOff = { 5, 17 }, DelayOn = { 30, 50 } } , - Excellent = { Evade = 10, DelayOff = { 3, 10 }, DelayOn = { 30, 60 } } - }, - SEADGroupPrefixes = {} -} - ---- Creates the main object which is handling defensive actions for SA sites or moving SA vehicles. --- When an anti radiation missile is fired (KH-58, KH-31P, KH-31A, KH-25MPU, HARM missiles), the SA will shut down their radars and will take evasive actions... --- Chances are big that the missile will miss. --- @param table{string,...}|string SEADGroupPrefixes which is a table of Prefixes of the SA Groups in the DCSRTE on which evasive actions need to be taken. --- @return SEAD --- @usage --- -- CCCP SEAD Defenses --- -- Defends the Russian SA installations from SEAD attacks. --- SEAD_RU_SAM_Defenses = SEAD:New( { 'RU SA-6 Kub', 'RU SA-6 Defenses', 'RU MI-26 Troops', 'RU Attack Gori' } ) -function SEAD:New( SEADGroupPrefixes ) - local self = BASE:Inherit( self, BASE:New() ) - self:F( SEADGroupPrefixes ) - if type( SEADGroupPrefixes ) == 'table' then - for SEADGroupPrefixID, SEADGroupPrefix in pairs( SEADGroupPrefixes ) do - self.SEADGroupPrefixes[SEADGroupPrefix] = SEADGroupPrefix - end - else - self.SEADGroupNames[SEADGroupPrefixes] = SEADGroupPrefixes - end - _EVENTDISPATCHER:OnShot( self.EventShot, self ) - - return self -end - ---- Detects if an SA site was shot with an anti radiation missile. In this case, take evasive actions based on the skill level set within the ME. --- @see SEAD -function SEAD:EventShot( Event ) - self:F( { Event } ) - - local SEADUnit = Event.IniDCSUnit - local SEADUnitName = Event.IniDCSUnitName - local SEADWeapon = Event.Weapon -- Identify the weapon fired - local SEADWeaponName = Event.WeaponName -- return weapon type - --trigger.action.outText( string.format("Alerte, depart missile " ..string.format(SEADWeaponName)), 20) --debug message - -- Start of the 2nd loop - self:T( "Missile Launched = " .. SEADWeaponName ) - if SEADWeaponName == "KH-58" or SEADWeaponName == "KH-25MPU" or SEADWeaponName == "AGM-88" or SEADWeaponName == "KH-31A" or SEADWeaponName == "KH-31P" then -- Check if the missile is a SEAD - local _evade = math.random (1,100) -- random number for chance of evading action - local _targetMim = Event.Weapon:getTarget() -- Identify target - local _targetMimname = Unit.getName(_targetMim) - local _targetMimgroup = Unit.getGroup(Weapon.getTarget(SEADWeapon)) - local _targetMimgroupName = _targetMimgroup:getName() - local _targetMimcont= _targetMimgroup:getController() - local _targetskill = _DATABASE.Templates.Units[_targetMimname].Template.skill - self:T( self.SEADGroupPrefixes ) - self:T( _targetMimgroupName ) - local SEADGroupFound = false - for SEADGroupPrefixID, SEADGroupPrefix in pairs( self.SEADGroupPrefixes ) do - if string.find( _targetMimgroupName, SEADGroupPrefix, 1, true ) then - SEADGroupFound = true - self:T( 'Group Found' ) - break - end - end - if SEADGroupFound == true then - if _targetskill == "Random" then -- when skill is random, choose a skill - local Skills = { "Average", "Good", "High", "Excellent" } - _targetskill = Skills[ math.random(1,4) ] - end - self:T( _targetskill ) -- debug message for skill check - if self.TargetSkill[_targetskill] then - if (_evade > self.TargetSkill[_targetskill].Evade) then - self:T( string.format("Evading, target skill " ..string.format(_targetskill)) ) --debug message - local _targetMim = Weapon.getTarget(SEADWeapon) - local _targetMimname = Unit.getName(_targetMim) - local _targetMimgroup = Unit.getGroup(Weapon.getTarget(SEADWeapon)) - local _targetMimcont= _targetMimgroup:getController() - routines.groupRandomDistSelf(_targetMimgroup,300,'Diamond',250,20) -- move randomly - local SuppressedGroups1 = {} -- unit suppressed radar off for a random time - local function SuppressionEnd1(id) - id.ctrl:setOption(AI.Option.Ground.id.ALARM_STATE,AI.Option.Ground.val.ALARM_STATE.GREEN) - SuppressedGroups1[id.groupName] = nil - end - local id = { - groupName = _targetMimgroup, - ctrl = _targetMimcont - } - local delay1 = math.random(self.TargetSkill[_targetskill].DelayOff[1], self.TargetSkill[_targetskill].DelayOff[2]) - if SuppressedGroups1[id.groupName] == nil then - SuppressedGroups1[id.groupName] = { - SuppressionEndTime1 = timer.getTime() + delay1, - SuppressionEndN1 = SuppressionEndCounter1 --Store instance of SuppressionEnd() scheduled function - } - Controller.setOption(_targetMimcont, AI.Option.Ground.id.ALARM_STATE,AI.Option.Ground.val.ALARM_STATE.GREEN) - timer.scheduleFunction(SuppressionEnd1, id, SuppressedGroups1[id.groupName].SuppressionEndTime1) --Schedule the SuppressionEnd() function - --trigger.action.outText( string.format("Radar Off " ..string.format(delay1)), 20) - end - - local SuppressedGroups = {} - local function SuppressionEnd(id) - id.ctrl:setOption(AI.Option.Ground.id.ALARM_STATE,AI.Option.Ground.val.ALARM_STATE.RED) - SuppressedGroups[id.groupName] = nil - end - local id = { - groupName = _targetMimgroup, - ctrl = _targetMimcont - } - local delay = math.random(self.TargetSkill[_targetskill].DelayOn[1], self.TargetSkill[_targetskill].DelayOn[2]) - if SuppressedGroups[id.groupName] == nil then - SuppressedGroups[id.groupName] = { - SuppressionEndTime = timer.getTime() + delay, - SuppressionEndN = SuppressionEndCounter --Store instance of SuppressionEnd() scheduled function - } - timer.scheduleFunction(SuppressionEnd, id, SuppressedGroups[id.groupName].SuppressionEndTime) --Schedule the SuppressionEnd() function - --trigger.action.outText( string.format("Radar On " ..string.format(delay)), 20) - end - end - end - end - end -end ---- Taking the lead of AI escorting your flight. --- --- @{#ESCORT} class --- ================ --- The @{#ESCORT} class allows you to interact with escorting AI on your flight and take the lead. --- Each escorting group can be commanded with a whole set of radio commands (radio menu in your flight, and then F10). --- --- The radio commands will vary according the category of the group. The richest set of commands are with Helicopters and AirPlanes. --- Ships and Ground troops will have a more limited set, but they can provide support through the bombing of targets designated by the other escorts. --- --- RADIO MENUs that can be created: --- ================================ --- Find a summary below of the current available commands: --- --- Navigation ...: --- --------------- --- Escort group navigation functions: --- --- * **"Join-Up and Follow at x meters":** The escort group fill follow you at about x meters, and they will follow you. --- * **"Flare":** Provides menu commands to let the escort group shoot a flare in the air in a color. --- * **"Smoke":** Provides menu commands to let the escort group smoke the air in a color. Note that smoking is only available for ground and naval troops. --- --- Hold position ...: --- ------------------ --- Escort group navigation functions: --- --- * **"At current location":** Stops the escort group and they will hover 30 meters above the ground at the position they stopped. --- * **"At client location":** Stops the escort group and they will hover 30 meters above the ground at the position they stopped. --- --- Report targets ...: --- ------------------- --- Report targets will make the escort group to report any target that it identifies within a 8km range. Any detected target can be attacked using the 4. Attack nearby targets function. (see below). --- --- * **"Report now":** Will report the current detected targets. --- * **"Report targets on":** Will make the escort group to report detected targets and will fill the "Attack nearby targets" menu list. --- * **"Report targets off":** Will stop detecting targets. --- --- Scan targets ...: --- ----------------- --- Menu items to pop-up the escort group for target scanning. After scanning, the escort group will resume with the mission or defined task. --- --- * **"Scan targets 30 seconds":** Scan 30 seconds for targets. --- * **"Scan targets 60 seconds":** Scan 60 seconds for targets. --- --- Attack targets ...: --- ------------------- --- This menu item will list all detected targets within a 15km range. Depending on the level of detection (known/unknown) and visuality, the targets type will also be listed. --- --- Request assistance from ...: --- ---------------------------- --- This menu item will list all detected targets within a 15km range, as with the menu item **Attack Targets**. --- This menu item allows to request attack support from other escorts supporting the current client group. --- eg. the function allows a player to request support from the Ship escort to attack a target identified by the Plane escort with its Tomahawk missiles. --- eg. the function allows a player to request support from other Planes escorting to bomb the unit with illumination missiles or bombs, so that the main plane escort can attack the area. --- --- ROE ...: --- -------- --- Sets the Rules of Engagement (ROE) of the escort group when in flight. --- --- * **"Hold Fire":** The escort group will hold fire. --- * **"Return Fire":** The escort group will return fire. --- * **"Open Fire":** The escort group will open fire on designated targets. --- * **"Weapon Free":** The escort group will engage with any target. --- --- Evasion ...: --- ------------ --- Will define the evasion techniques that the escort group will perform during flight or combat. --- --- * **"Fight until death":** The escort group will have no reaction to threats. --- * **"Use flares, chaff and jammers":** The escort group will use passive defense using flares and jammers. No evasive manoeuvres are executed. --- * **"Evade enemy fire":** The rescort group will evade enemy fire before firing. --- * **"Go below radar and evade fire":** The escort group will perform evasive vertical manoeuvres. --- --- Resume Mission ...: --- ------------------- --- Escort groups can have their own mission. This menu item will allow the escort group to resume their Mission from a given waypoint. --- Note that this is really fantastic, as you now have the dynamic of taking control of the escort groups, and allowing them to resume their path or mission. --- --- ESCORT construction methods. --- ============================ --- Create a new SPAWN object with the @{#ESCORT.New} method: --- --- * @{#ESCORT.New}: Creates a new ESCORT object from a @{Group#GROUP} for a @{Client#CLIENT}, with an optional briefing text. --- --- ESCORT initialization methods. --- ============================== --- The following menus are created within the RADIO MENU of an active unit hosted by a player: --- --- * @{#ESCORT.MenuFollowAt}: Creates a menu to make the escort follow the client. --- * @{#ESCORT.MenuHoldAtEscortPosition}: Creates a menu to hold the escort at its current position. --- * @{#ESCORT.MenuHoldAtLeaderPosition}: Creates a menu to hold the escort at the client position. --- * @{#ESCORT.MenuScanForTargets}: Creates a menu so that the escort scans targets. --- * @{#ESCORT.MenuFlare}: Creates a menu to disperse flares. --- * @{#ESCORT.MenuSmoke}: Creates a menu to disparse smoke. --- * @{#ESCORT.MenuReportTargets}: Creates a menu so that the escort reports targets. --- * @{#ESCORT.MenuReportPosition}: Creates a menu so that the escort reports its current position from bullseye. --- * @{#ESCORT.MenuAssistedAttack: Creates a menu so that the escort supportes assisted attack from other escorts with the client. --- * @{#ESCORT.MenuROE: Creates a menu structure to set the rules of engagement of the escort. --- * @{#ESCORT.MenuEvasion: Creates a menu structure to set the evasion techniques when the escort is under threat. --- * @{#ESCORT.MenuResumeMission}: Creates a menu structure so that the escort can resume from a waypoint. --- --- @module Escort --- @author FlightControl - - - - - - - ---- --- @type ESCORT --- @extends Base#BASE --- @field Client#CLIENT EscortClient --- @field Group#GROUP EscortGroup --- @field #string EscortName --- @field #ESCORT.MODE EscortMode The mode the escort is in. --- @field #number FollowScheduler The id of the _FollowScheduler function. --- @field #boolean ReportTargets If true, nearby targets are reported. --- @Field DCSTypes#AI.Option.Air.val.ROE OptionROE Which ROE is set to the EscortGroup. --- @field DCSTypes#AI.Option.Air.val.REACTION_ON_THREAT OptionReactionOnThreat Which REACTION_ON_THREAT is set to the EscortGroup. --- @field Menu#MENU_CLIENT EscortMenuResumeMission -ESCORT = { - ClassName = "ESCORT", - EscortName = nil, -- The Escort Name - EscortClient = nil, - EscortGroup = nil, - EscortMode = nil, - MODE = { - FOLLOW = 1, - MISSION = 2, - }, - Targets = {}, -- The identified targets - FollowScheduler = nil, - ReportTargets = true, - OptionROE = AI.Option.Air.val.ROE.OPEN_FIRE, - OptionReactionOnThreat = AI.Option.Air.val.REACTION_ON_THREAT.ALLOW_ABORT_MISSION, - TaskPoints = {} -} - ---- ESCORT.Mode class --- @type ESCORT.MODE --- @field #number FOLLOW --- @field #number MISSION - ---- MENUPARAM type --- @type MENUPARAM --- @field #ESCORT ParamSelf --- @field #Distance ParamDistance --- @field #function ParamFunction --- @field #string ParamMessage - ---- ESCORT class constructor for an AI group --- @param #ESCORT self --- @param Client#CLIENT EscortClient The client escorted by the EscortGroup. --- @param Group#GROUP EscortGroup The group AI escorting the EscortClient. --- @param #string EscortName Name of the escort. --- @return #ESCORT self -function ESCORT:New( EscortClient, EscortGroup, EscortName, EscortBriefing ) - local self = BASE:Inherit( self, BASE:New() ) - self:F( { EscortClient, EscortGroup, EscortName } ) - - self.EscortClient = EscortClient -- Client#CLIENT - self.EscortGroup = EscortGroup -- Group#GROUP - self.EscortName = EscortName - self.EscortBriefing = EscortBriefing - - self:T( EscortGroup:GetClassNameAndID() ) - - -- Set EscortGroup known at EscortClient. - if not self.EscortClient._EscortGroups then - self.EscortClient._EscortGroups = {} - end - - if not self.EscortClient._EscortGroups[EscortGroup:GetName()] then - self.EscortClient._EscortGroups[EscortGroup:GetName()] = {} - self.EscortClient._EscortGroups[EscortGroup:GetName()].EscortGroup = self.EscortGroup - self.EscortClient._EscortGroups[EscortGroup:GetName()].EscortName = self.EscortName - self.EscortClient._EscortGroups[EscortGroup:GetName()].Targets = {} - self.EscortMode = ESCORT.MODE.FOLLOW - end - - - self.EscortMenu = MENU_CLIENT:New( self.EscortClient, self.EscortName ) - - self.EscortGroup:WayPointInitialize(1) - - self.EscortGroup:OptionROTVertical() - self.EscortGroup:OptionROEOpenFire() - - EscortGroup:MessageToClient( EscortGroup:GetCategoryName() .. " '" .. EscortName .. "' (" .. EscortGroup:GetCallsign() .. ") reporting! " .. - "We're escorting your flight. " .. - "Use the Radio Menu and F10 and use the options under + " .. EscortName .. "\n", - 60, EscortClient - ) - - return self -end - - ---- Defines the default menus --- @param #ESCORT self --- @return #ESCORT -function ESCORT:Menus() - self:F() - - self:MenuFollowAt( 100 ) - self:MenuFollowAt( 200 ) - self:MenuFollowAt( 300 ) - self:MenuFollowAt( 400 ) - - self:MenuScanForTargets( 100, 60 ) - - self:MenuHoldAtEscortPosition( 30 ) - self:MenuHoldAtLeaderPosition( 30 ) - - self:MenuFlare() - self:MenuSmoke() - - self:MenuReportTargets( 60 ) - self:MenuAssistedAttack() - self:MenuROE() - self:MenuEvasion() - self:MenuResumeMission() - - return self -end - - - ---- Defines a menu slot to let the escort Join and Follow you at a certain distance. --- This menu will appear under **Navigation**. --- @param #ESCORT self --- @param DCSTypes#Distance Distance The distance in meters that the escort needs to follow the client. --- @return #ESCORT -function ESCORT:MenuFollowAt( Distance ) - self:F(Distance) - - if self.EscortGroup:IsAir() then - if not self.EscortMenuReportNavigation then - self.EscortMenuReportNavigation = MENU_CLIENT:New( self.EscortClient, "Navigation", self.EscortMenu ) - end - - if not self.EscortMenuJoinUpAndFollow then - self.EscortMenuJoinUpAndFollow = {} - end - - self.EscortMenuJoinUpAndFollow[#self.EscortMenuJoinUpAndFollow+1] = MENU_CLIENT_COMMAND:New( self.EscortClient, "Join-Up and Follow at " .. Distance, self.EscortMenuReportNavigation, ESCORT._JoinUpAndFollow, { ParamSelf = self, ParamDistance = Distance } ) - - self.EscortMode = ESCORT.MODE.FOLLOW - end - - return self -end - ---- Defines a menu slot to let the escort hold at their current position and stay low with a specified height during a specified time in seconds. --- This menu will appear under **Hold position**. --- @param #ESCORT self --- @param DCSTypes#Distance Height Optional parameter that sets the height in meters to let the escort orbit at the current location. The default value is 30 meters. --- @param DCSTypes#Time Seconds Optional parameter that lets the escort orbit at the current position for a specified time. (not implemented yet). The default value is 0 seconds, meaning, that the escort will orbit forever until a sequent command is given. --- @param #string MenuTextFormat Optional parameter that shows the menu option text. The text string is formatted, and should contain two %d tokens in the string. The first for the Height, the second for the Time (if given). If no text is given, the default text will be displayed. --- @return #ESCORT --- TODO: Implement Seconds parameter. Challenge is to first develop the "continue from last activity" function. -function ESCORT:MenuHoldAtEscortPosition( Height, Seconds, MenuTextFormat ) - self:F( { Height, Seconds, MenuTextFormat } ) - - if self.EscortGroup:IsAir() then - - if not self.EscortMenuHold then - self.EscortMenuHold = MENU_CLIENT:New( self.EscortClient, "Hold position", self.EscortMenu ) - end - - if not Height then - Height = 30 - end - - if not Seconds then - Seconds = 0 - end - - local MenuText = "" - if not MenuTextFormat then - if Seconds == 0 then - MenuText = string.format( "Hold at %d meter", Height ) - else - MenuText = string.format( "Hold at %d meter for %d seconds", Height, Seconds ) - end - else - if Seconds == 0 then - MenuText = string.format( MenuTextFormat, Height ) - else - MenuText = string.format( MenuTextFormat, Height, Seconds ) - end - end - - if not self.EscortMenuHoldPosition then - self.EscortMenuHoldPosition = {} - end - - self.EscortMenuHoldPosition[#self.EscortMenuHoldPosition+1] = MENU_CLIENT_COMMAND - :New( - self.EscortClient, - MenuText, - self.EscortMenuHold, - ESCORT._HoldPosition, - { ParamSelf = self, - ParamOrbitGroup = self.EscortGroup, - ParamHeight = Height, - ParamSeconds = Seconds - } - ) - end - - return self -end - - ---- Defines a menu slot to let the escort hold at the client position and stay low with a specified height during a specified time in seconds. --- This menu will appear under **Navigation**. --- @param #ESCORT self --- @param DCSTypes#Distance Height Optional parameter that sets the height in meters to let the escort orbit at the current location. The default value is 30 meters. --- @param DCSTypes#Time Seconds Optional parameter that lets the escort orbit at the current position for a specified time. (not implemented yet). The default value is 0 seconds, meaning, that the escort will orbit forever until a sequent command is given. --- @param #string MenuTextFormat Optional parameter that shows the menu option text. The text string is formatted, and should contain one or two %d tokens in the string. The first for the Height, the second for the Time (if given). If no text is given, the default text will be displayed. --- @return #ESCORT --- TODO: Implement Seconds parameter. Challenge is to first develop the "continue from last activity" function. -function ESCORT:MenuHoldAtLeaderPosition( Height, Seconds, MenuTextFormat ) - self:F( { Height, Seconds, MenuTextFormat } ) - - if self.EscortGroup:IsAir() then - - if not self.EscortMenuHold then - self.EscortMenuHold = MENU_CLIENT:New( self.EscortClient, "Hold position", self.EscortMenu ) - end - - if not Height then - Height = 30 - end - - if not Seconds then - Seconds = 0 - end - - local MenuText = "" - if not MenuTextFormat then - if Seconds == 0 then - MenuText = string.format( "Rejoin and hold at %d meter", Height ) - else - MenuText = string.format( "Rejoin and hold at %d meter for %d seconds", Height, Seconds ) - end - else - if Seconds == 0 then - MenuText = string.format( MenuTextFormat, Height ) - else - MenuText = string.format( MenuTextFormat, Height, Seconds ) - end - end - - if not self.EscortMenuHoldAtLeaderPosition then - self.EscortMenuHoldAtLeaderPosition = {} - end - - self.EscortMenuHoldAtLeaderPosition[#self.EscortMenuHoldAtLeaderPosition+1] = MENU_CLIENT_COMMAND - :New( - self.EscortClient, - MenuText, - self.EscortMenuHold, - ESCORT._HoldPosition, - { ParamSelf = self, - ParamOrbitGroup = self.EscortClient, - ParamHeight = Height, - ParamSeconds = Seconds - } - ) - end - - return self -end - ---- Defines a menu slot to let the escort scan for targets at a certain height for a certain time in seconds. --- This menu will appear under **Scan targets**. --- @param #ESCORT self --- @param DCSTypes#Distance Height Optional parameter that sets the height in meters to let the escort orbit at the current location. The default value is 30 meters. --- @param DCSTypes#Time Seconds Optional parameter that lets the escort orbit at the current position for a specified time. (not implemented yet). The default value is 0 seconds, meaning, that the escort will orbit forever until a sequent command is given. --- @param #string MenuTextFormat Optional parameter that shows the menu option text. The text string is formatted, and should contain one or two %d tokens in the string. The first for the Height, the second for the Time (if given). If no text is given, the default text will be displayed. --- @return #ESCORT -function ESCORT:MenuScanForTargets( Height, Seconds, MenuTextFormat ) - self:F( { Height, Seconds, MenuTextFormat } ) - - if self.EscortGroup:IsAir() then - if not self.EscortMenuScan then - self.EscortMenuScan = MENU_CLIENT:New( self.EscortClient, "Scan for targets", self.EscortMenu ) - end - - if not Height then - Height = 100 - end - - if not Seconds then - Seconds = 30 - end - - local MenuText = "" - if not MenuTextFormat then - if Seconds == 0 then - MenuText = string.format( "At %d meter", Height ) - else - MenuText = string.format( "At %d meter for %d seconds", Height, Seconds ) - end - else - if Seconds == 0 then - MenuText = string.format( MenuTextFormat, Height ) - else - MenuText = string.format( MenuTextFormat, Height, Seconds ) - end - end - - if not self.EscortMenuScanForTargets then - self.EscortMenuScanForTargets = {} - end - - self.EscortMenuScanForTargets[#self.EscortMenuScanForTargets+1] = MENU_CLIENT_COMMAND - :New( - self.EscortClient, - MenuText, - self.EscortMenuScan, - ESCORT._ScanTargets, - { ParamSelf = self, - ParamScanDuration = 30 - } - ) - end - - return self -end - - - ---- Defines a menu slot to let the escort disperse a flare in a certain color. --- This menu will appear under **Navigation**. --- The flare will be fired from the first unit in the group. --- @param #ESCORT self --- @param #string MenuTextFormat Optional parameter that shows the menu option text. If no text is given, the default text will be displayed. --- @return #ESCORT -function ESCORT:MenuFlare( MenuTextFormat ) - self:F() - - if not self.EscortMenuReportNavigation then - self.EscortMenuReportNavigation = MENU_CLIENT:New( self.EscortClient, "Navigation", self.EscortMenu ) - end - - local MenuText = "" - if not MenuTextFormat then - MenuText = "Flare" - else - MenuText = MenuTextFormat - end - - if not self.EscortMenuFlare then - self.EscortMenuFlare = MENU_CLIENT:New( self.EscortClient, MenuText, self.EscortMenuReportNavigation, ESCORT._Flare, { ParamSelf = self } ) - self.EscortMenuFlareGreen = MENU_CLIENT_COMMAND:New( self.EscortClient, "Release green flare", self.EscortMenuFlare, ESCORT._Flare, { ParamSelf = self, ParamColor = UNIT.FlareColor.Green, ParamMessage = "Released a green flare!" } ) - self.EscortMenuFlareRed = MENU_CLIENT_COMMAND:New( self.EscortClient, "Release red flare", self.EscortMenuFlare, ESCORT._Flare, { ParamSelf = self, ParamColor = UNIT.FlareColor.Red, ParamMessage = "Released a red flare!" } ) - self.EscortMenuFlareWhite = MENU_CLIENT_COMMAND:New( self.EscortClient, "Release white flare", self.EscortMenuFlare, ESCORT._Flare, { ParamSelf = self, ParamColor = UNIT.FlareColor.White, ParamMessage = "Released a white flare!" } ) - self.EscortMenuFlareYellow = MENU_CLIENT_COMMAND:New( self.EscortClient, "Release yellow flare", self.EscortMenuFlare, ESCORT._Flare, { ParamSelf = self, ParamColor = UNIT.FlareColor.Yellow, ParamMessage = "Released a yellow flare!" } ) - end - - return self -end - ---- Defines a menu slot to let the escort disperse a smoke in a certain color. --- This menu will appear under **Navigation**. --- Note that smoke menu options will only be displayed for ships and ground units. Not for air units. --- The smoke will be fired from the first unit in the group. --- @param #ESCORT self --- @param #string MenuTextFormat Optional parameter that shows the menu option text. If no text is given, the default text will be displayed. --- @return #ESCORT -function ESCORT:MenuSmoke( MenuTextFormat ) - self:F() - - if not self.EscortGroup:IsAir() then - if not self.EscortMenuReportNavigation then - self.EscortMenuReportNavigation = MENU_CLIENT:New( self.EscortClient, "Navigation", self.EscortMenu ) - end - - local MenuText = "" - if not MenuTextFormat then - MenuText = "Smoke" - else - MenuText = MenuTextFormat - end - - if not self.EscortMenuSmoke then - self.EscortMenuSmoke = MENU_CLIENT:New( self.EscortClient, "Smoke", self.EscortMenuReportNavigation, ESCORT._Smoke, { ParamSelf = self } ) - self.EscortMenuSmokeGreen = MENU_CLIENT_COMMAND:New( self.EscortClient, "Release green smoke", self.EscortMenuSmoke, ESCORT._Smoke, { ParamSelf = self, ParamColor = UNIT.SmokeColor.Green, ParamMessage = "Releasing green smoke!" } ) - self.EscortMenuSmokeRed = MENU_CLIENT_COMMAND:New( self.EscortClient, "Release red smoke", self.EscortMenuSmoke, ESCORT._Smoke, { ParamSelf = self, ParamColor = UNIT.SmokeColor.Red, ParamMessage = "Releasing red smoke!" } ) - self.EscortMenuSmokeWhite = MENU_CLIENT_COMMAND:New( self.EscortClient, "Release white smoke", self.EscortMenuSmoke, ESCORT._Smoke, { ParamSelf = self, ParamColor = UNIT.SmokeColor.White, ParamMessage = "Releasing white smoke!" } ) - self.EscortMenuSmokeOrange = MENU_CLIENT_COMMAND:New( self.EscortClient, "Release orange smoke", self.EscortMenuSmoke, ESCORT._Smoke, { ParamSelf = self, ParamColor = UNIT.SmokeColor.Orange, ParamMessage = "Releasing orange smoke!" } ) - self.EscortMenuSmokeBlue = MENU_CLIENT_COMMAND:New( self.EscortClient, "Release blue smoke", self.EscortMenuSmoke, ESCORT._Smoke, { ParamSelf = self, ParamColor = UNIT.SmokeColor.Blue, ParamMessage = "Releasing blue smoke!" } ) - end - end - - return self -end - ---- Defines a menu slot to let the escort report their current detected targets with a specified time interval in seconds. --- This menu will appear under **Report targets**. --- Note that if a report targets menu is not specified, no targets will be detected by the escort, and the attack and assisted attack menus will not be displayed. --- @param #ESCORT self --- @param DCSTypes#Time Seconds Optional parameter that lets the escort report their current detected targets after specified time interval in seconds. The default time is 30 seconds. --- @return #ESCORT -function ESCORT:MenuReportTargets( Seconds ) - self:F( { Seconds } ) - - if not self.EscortMenuReportNearbyTargets then - self.EscortMenuReportNearbyTargets = MENU_CLIENT:New( self.EscortClient, "Report targets", self.EscortMenu ) - end - - if not Seconds then - Seconds = 30 - end - - -- Report Targets - self.EscortMenuReportNearbyTargetsNow = MENU_CLIENT_COMMAND:New( self.EscortClient, "Report targets now!", self.EscortMenuReportNearbyTargets, ESCORT._ReportNearbyTargetsNow, { ParamSelf = self } ) - self.EscortMenuReportNearbyTargetsOn = MENU_CLIENT_COMMAND:New( self.EscortClient, "Report targets on", self.EscortMenuReportNearbyTargets, ESCORT._SwitchReportNearbyTargets, { ParamSelf = self, ParamReportTargets = true } ) - self.EscortMenuReportNearbyTargetsOff = MENU_CLIENT_COMMAND:New( self.EscortClient, "Report targets off", self.EscortMenuReportNearbyTargets, ESCORT._SwitchReportNearbyTargets, { ParamSelf = self, ParamReportTargets = false, } ) - - -- Attack Targets - self.EscortMenuAttackNearbyTargets = MENU_CLIENT:New( self.EscortClient, "Attack targets", self.EscortMenu ) - - - --self.ReportTargetsScheduler = routines.scheduleFunction( self._ReportTargetsScheduler, { self }, timer.getTime() + 1, Seconds ) - self.ReportTargetsScheduler = SCHEDULER:New( self, self._ReportTargetsScheduler, {}, 1, Seconds ) - - return self -end - ---- Defines a menu slot to let the escort attack its detected targets using assisted attack from another escort joined also with the client. --- This menu will appear under **Request assistance from**. --- Note that this method needs to be preceded with the method MenuReportTargets. --- @param #ESCORT self --- @return #ESCORT -function ESCORT:MenuAssistedAttack() - self:F() - - -- Request assistance from other escorts. - -- This is very useful to let f.e. an escorting ship attack a target detected by an escorting plane... - self.EscortMenuTargetAssistance = MENU_CLIENT:New( self.EscortClient, "Request assistance from", self.EscortMenu ) - - return self -end - ---- Defines a menu to let the escort set its rules of engagement. --- All rules of engagement will appear under the menu **ROE**. --- @param #ESCORT self --- @return #ESCORT -function ESCORT:MenuROE( MenuTextFormat ) - self:F( MenuTextFormat ) - - if not self.EscortMenuROE then - -- Rules of Engagement - self.EscortMenuROE = MENU_CLIENT:New( self.EscortClient, "ROE", self.EscortMenu ) - if self.EscortGroup:OptionROEHoldFirePossible() then - self.EscortMenuROEHoldFire = MENU_CLIENT_COMMAND:New( self.EscortClient, "Hold Fire", self.EscortMenuROE, ESCORT._ROE, { ParamSelf = self, ParamFunction = self.EscortGroup:OptionROEHoldFire(), ParamMessage = "Holding weapons!" } ) - end - if self.EscortGroup:OptionROEReturnFirePossible() then - self.EscortMenuROEReturnFire = MENU_CLIENT_COMMAND:New( self.EscortClient, "Return Fire", self.EscortMenuROE, ESCORT._ROE, { ParamSelf = self, ParamFunction = self.EscortGroup:OptionROEReturnFire(), ParamMessage = "Returning fire!" } ) - end - if self.EscortGroup:OptionROEOpenFirePossible() then - self.EscortMenuROEOpenFire = MENU_CLIENT_COMMAND:New( self.EscortClient, "Open Fire", self.EscortMenuROE, ESCORT._ROE, { ParamSelf = self, ParamFunction = self.EscortGroup:OptionROEOpenFire(), ParamMessage = "Opening fire on designated targets!!" } ) - end - if self.EscortGroup:OptionROEWeaponFreePossible() then - self.EscortMenuROEWeaponFree = MENU_CLIENT_COMMAND:New( self.EscortClient, "Weapon Free", self.EscortMenuROE, ESCORT._ROE, { ParamSelf = self, ParamFunction = self.EscortGroup:OptionROEWeaponFree(), ParamMessage = "Opening fire on targets of opportunity!" } ) - end - end - - return self -end - - ---- Defines a menu to let the escort set its evasion when under threat. --- All rules of engagement will appear under the menu **Evasion**. --- @param #ESCORT self --- @return #ESCORT -function ESCORT:MenuEvasion( MenuTextFormat ) - self:F( MenuTextFormat ) - - if self.EscortGroup:IsAir() then - if not self.EscortMenuEvasion then - -- Reaction to Threats - self.EscortMenuEvasion = MENU_CLIENT:New( self.EscortClient, "Evasion", self.EscortMenu ) - if self.EscortGroup:OptionROTNoReactionPossible() then - self.EscortMenuEvasionNoReaction = MENU_CLIENT_COMMAND:New( self.EscortClient, "Fight until death", self.EscortMenuEvasion, ESCORT._ROT, { ParamSelf = self, ParamFunction = self.EscortGroup:OptionROTNoReaction(), ParamMessage = "Fighting until death!" } ) - end - if self.EscortGroup:OptionROTPassiveDefensePossible() then - self.EscortMenuEvasionPassiveDefense = MENU_CLIENT_COMMAND:New( self.EscortClient, "Use flares, chaff and jammers", self.EscortMenuEvasion, ESCORT._ROT, { ParamSelf = self, ParamFunction = self.EscortGroup:OptionROTPassiveDefense(), ParamMessage = "Defending using jammers, chaff and flares!" } ) - end - if self.EscortGroup:OptionROTEvadeFirePossible() then - self.EscortMenuEvasionEvadeFire = MENU_CLIENT_COMMAND:New( self.EscortClient, "Evade enemy fire", self.EscortMenuEvasion, ESCORT._ROT, { ParamSelf = self, ParamFunction = self.EscortGroup:OptionROTEvadeFire(), ParamMessage = "Evading on enemy fire!" } ) - end - if self.EscortGroup:OptionROTVerticalPossible() then - self.EscortMenuOptionEvasionVertical = MENU_CLIENT_COMMAND:New( self.EscortClient, "Go below radar and evade fire", self.EscortMenuEvasion, ESCORT._ROT, { ParamSelf = self, ParamFunction = self.EscortGroup:OptionROTVertical(), ParamMessage = "Evading on enemy fire with vertical manoeuvres!" } ) - end - end - end - - return self -end - ---- Defines a menu to let the escort resume its mission from a waypoint on its route. --- All rules of engagement will appear under the menu **Resume mission from**. --- @param #ESCORT self --- @return #ESCORT -function ESCORT:MenuResumeMission() - self:F() - - if not self.EscortMenuResumeMission then - -- Mission Resume Menu Root - self.EscortMenuResumeMission = MENU_CLIENT:New( self.EscortClient, "Resume mission from", self.EscortMenu ) - end - - return self -end - - ---- @param #MENUPARAM MenuParam -function ESCORT._HoldPosition( MenuParam ) - - local self = MenuParam.ParamSelf - local EscortGroup = self.EscortGroup - local EscortClient = self.EscortClient - - local OrbitGroup = MenuParam.ParamOrbitGroup -- Group#GROUP - local OrbitUnit = OrbitGroup:GetUnit(1) -- Unit#UNIT - local OrbitHeight = MenuParam.ParamHeight - local OrbitSeconds = MenuParam.ParamSeconds -- Not implemented yet - - routines.removeFunction( self.FollowScheduler ) - - local PointFrom = {} - local GroupPoint = EscortGroup:GetUnit(1):GetPointVec3() - PointFrom = {} - PointFrom.x = GroupPoint.x - PointFrom.y = GroupPoint.z - PointFrom.speed = 250 - PointFrom.type = AI.Task.WaypointType.TURNING_POINT - PointFrom.alt = GroupPoint.y - PointFrom.alt_type = AI.Task.AltitudeType.BARO - - local OrbitPoint = OrbitUnit:GetPointVec2() - local PointTo = {} - PointTo.x = OrbitPoint.x - PointTo.y = OrbitPoint.y - PointTo.speed = 250 - PointTo.type = AI.Task.WaypointType.TURNING_POINT - PointTo.alt = OrbitHeight - PointTo.alt_type = AI.Task.AltitudeType.BARO - PointTo.task = EscortGroup:TaskOrbitCircleAtVec2( OrbitPoint, OrbitHeight, 0 ) - - local Points = { PointFrom, PointTo } - - EscortGroup:OptionROEHoldFire() - EscortGroup:OptionROTPassiveDefense() - - EscortGroup:SetTask( EscortGroup:TaskRoute( Points ) ) - EscortGroup:MessageToClient( "Orbiting at location.", 10, EscortClient ) -end - ---- @param #MENUPARAM MenuParam -function ESCORT._JoinUpAndFollow( MenuParam ) - - local self = MenuParam.ParamSelf - local EscortGroup = self.EscortGroup - local EscortClient = self.EscortClient - - self.Distance = MenuParam.ParamDistance - - self:JoinUpAndFollow( EscortGroup, EscortClient, self.Distance ) -end - ---- JoinsUp and Follows a CLIENT. --- @param Escort#ESCORT self --- @param Group#GROUP EscortGroup --- @param Client#CLIENT EscortClient --- @param DCSTypes#Distance Distance -function ESCORT:JoinUpAndFollow( EscortGroup, EscortClient, Distance ) - self:F( { EscortGroup, EscortClient, Distance } ) - - if self.FollowScheduler then - routines.removeFunction( self.FollowScheduler ) - end - - EscortGroup:OptionROEHoldFire() - EscortGroup:OptionROTPassiveDefense() - - self.EscortMode = ESCORT.MODE.FOLLOW - - self.CT1 = 0 - self.GT1 = 0 - --self.FollowScheduler = routines.scheduleFunction( self._FollowScheduler, { self, Distance }, timer.getTime() + 1, .5 ) - self.FollowScheduler = SCHEDULER:New( self, self._FollowScheduler, { Distance }, 1, .5, .1 ) - EscortGroup:MessageToClient( "Rejoining and Following at " .. Distance .. "!", 30, EscortClient ) -end - ---- @param #MENUPARAM MenuParam -function ESCORT._Flare( MenuParam ) - - local self = MenuParam.ParamSelf - local EscortGroup = self.EscortGroup - local EscortClient = self.EscortClient - - local Color = MenuParam.ParamColor - local Message = MenuParam.ParamMessage - - EscortGroup:GetUnit(1):Flare( Color ) - EscortGroup:MessageToClient( Message, 10, EscortClient ) -end - ---- @param #MENUPARAM MenuParam -function ESCORT._Smoke( MenuParam ) - - local self = MenuParam.ParamSelf - local EscortGroup = self.EscortGroup - local EscortClient = self.EscortClient - - local Color = MenuParam.ParamColor - local Message = MenuParam.ParamMessage - - EscortGroup:GetUnit(1):Smoke( Color ) - EscortGroup:MessageToClient( Message, 10, EscortClient ) -end - - ---- @param #MENUPARAM MenuParam -function ESCORT._ReportNearbyTargetsNow( MenuParam ) - - local self = MenuParam.ParamSelf - local EscortGroup = self.EscortGroup - local EscortClient = self.EscortClient - - self:_ReportTargetsScheduler() - -end - -function ESCORT._SwitchReportNearbyTargets( MenuParam ) - - local self = MenuParam.ParamSelf - local EscortGroup = self.EscortGroup - local EscortClient = self.EscortClient - - self.ReportTargets = MenuParam.ParamReportTargets - - if self.ReportTargets then - if not self.ReportTargetsScheduler then - --self.ReportTargetsScheduler = routines.scheduleFunction( self._ReportTargetsScheduler, { self }, timer.getTime() + 1, 30 ) - self.ReportTargetsScheduler = SCHEDULER:New( self, self._ReportTargetsScheduler, {}, 1, 30 ) - end - else - routines.removeFunction( self.ReportTargetsScheduler ) - self.ReportTargetsScheduler = nil - end -end - ---- @param #MENUPARAM MenuParam -function ESCORT._ScanTargets( MenuParam ) - - local self = MenuParam.ParamSelf - local EscortGroup = self.EscortGroup - local EscortClient = self.EscortClient - - local ScanDuration = MenuParam.ParamScanDuration - - if self.FollowScheduler then - routines.removeFunction( self.FollowScheduler ) - end - - self:T( { "FollowScheduler after removefunction: ", self.FollowScheduler } ) - - if EscortGroup:IsHelicopter() then - SCHEDULER:New( EscortGroup, EscortGroup.PushTask, - { EscortGroup:TaskControlled( - EscortGroup:TaskOrbitCircle( 200, 20 ), - EscortGroup:TaskCondition( nil, nil, nil, nil, ScanDuration, nil ) - ) - }, - 1 - ) - elseif EscortGroup:IsAirPlane() then - SCHEDULER:New( EscortGroup, EscortGroup.PushTask, - { EscortGroup:TaskControlled( - EscortGroup:TaskOrbitCircle( 1000, 500 ), - EscortGroup:TaskCondition( nil, nil, nil, nil, ScanDuration, nil ) - ) - }, - 1 - ) - end - - EscortGroup:MessageToClient( "Scanning targets for " .. ScanDuration .. " seconds.", ScanDuration, EscortClient ) - - if self.EscortMode == ESCORT.MODE.FOLLOW then - --self.FollowScheduler = routines.scheduleFunction( self._FollowScheduler, { self, Distance }, timer.getTime() + ScanDuration, 1 ) - self.FollowScheduler:Start() - end - -end - -function _Resume( EscortGroup ) - env.info( '_Resume' ) - - local Escort = EscortGroup.Escort -- #ESCORT - env.info( "EscortMode = " .. Escort.EscortMode ) - if Escort.EscortMode == ESCORT.MODE.FOLLOW then - Escort:JoinUpAndFollow( EscortGroup, Escort.EscortClient, Escort.Distance ) - end - -end - ---- @param #MENUPARAM MenuParam -function ESCORT._AttackTarget( MenuParam ) - - local self = MenuParam.ParamSelf - local EscortGroup = self.EscortGroup - local EscortClient = self.EscortClient - local AttackUnit = MenuParam.ParamUnit -- Unit#UNIT - - if self.FollowScheduler then - routines.removeFunction( self.FollowScheduler ) - end - - self:T( AttackUnit ) - - if EscortGroup:IsAir() then - EscortGroup:OptionROEOpenFire() - EscortGroup:OptionROTPassiveDefense() - EscortGroup.Escort = self -- Need to do this trick to get the reference for the escort in the _Resume function. --- routines.scheduleFunction( --- EscortGroup.PushTask, --- { EscortGroup, --- EscortGroup:TaskCombo( --- { EscortGroup:TaskAttackUnit( AttackUnit ), --- EscortGroup:TaskFunction( 1, 2, "_Resume", {"''"} ) --- } --- ) --- }, timer.getTime() + 10 --- ) - SCHEDULER:New( EscortGroup, - EscortGroup.PushTask, - { EscortGroup:TaskCombo( - { EscortGroup:TaskAttackUnit( AttackUnit ), - EscortGroup:TaskFunction( 1, 2, "_Resume", {"''"} ) - } - ) - }, 10 - ) - else --- routines.scheduleFunction( --- EscortGroup.PushTask, --- { EscortGroup, --- EscortGroup:TaskCombo( --- { EscortGroup:TaskFireAtPoint( AttackUnit:GetPointVec2(), 50 ) --- } --- ) --- }, timer.getTime() + 10 --- ) - SCHEDULER:New( EscortGroup, - EscortGroup.PushTask, - { EscortGroup:TaskCombo( - { EscortGroup:TaskFireAtPoint( AttackUnit:GetPointVec2(), 50 ) - } - ) - }, 10 - ) - end - EscortGroup:MessageToClient( "Engaging Designated Unit!", 10, EscortClient ) - - -end - ---- @param #MENUPARAM MenuParam -function ESCORT._AssistTarget( MenuParam ) - - local self = MenuParam.ParamSelf - local EscortGroup = self.EscortGroup - local EscortClient = self.EscortClient - local EscortGroupAttack = MenuParam.ParamEscortGroup - local AttackUnit = MenuParam.ParamUnit -- Unit#UNIT - - if self.FollowScheduler then - routines.removeFunction( self.FollowScheduler ) - end - - - self:T( AttackUnit ) - - if EscortGroupAttack:IsAir() then - EscortGroupAttack:OptionROEOpenFire() - EscortGroupAttack:OptionROTVertical() --- routines.scheduleFunction( --- EscortGroupAttack.PushTask, --- { EscortGroupAttack, --- EscortGroupAttack:TaskCombo( --- { EscortGroupAttack:TaskAttackUnit( AttackUnit ), --- EscortGroupAttack:TaskOrbitCircle( 500, 350 ) --- } --- ) --- }, timer.getTime() + 10 --- ) - SCHDULER:New( EscortGroupAttack, - EscortGroupAttack.PushTask, - { EscortGroupAttack:TaskCombo( - { EscortGroupAttack:TaskAttackUnit( AttackUnit ), - EscortGroupAttack:TaskOrbitCircle( 500, 350 ) - } - ) - }, 10 - ) - else --- routines.scheduleFunction( --- EscortGroupAttack.PushTask, --- { EscortGroupAttack, --- EscortGroupAttack:TaskCombo( --- { EscortGroupAttack:TaskFireAtPoint( AttackUnit:GetPointVec2(), 50 ) --- } --- ) --- }, timer.getTime() + 10 --- ) - SCHEDULER:New( EscortGroupAttack, - EscortGroupAttack.PushTask, - { EscortGroupAttack:TaskCombo( - { EscortGroupAttack:TaskFireAtPoint( AttackUnit:GetPointVec2(), 50 ) - } - ) - }, 10 - ) - end - EscortGroupAttack:MessageToClient( "Assisting with the destroying the enemy unit!", 10, EscortClient ) - -end - ---- @param #MENUPARAM MenuParam -function ESCORT._ROE( MenuParam ) - - local self = MenuParam.ParamSelf - local EscortGroup = self.EscortGroup - local EscortClient = self.EscortClient - - local EscortROEFunction = MenuParam.ParamFunction - local EscortROEMessage = MenuParam.ParamMessage - - pcall( function() EscortROEFunction() end ) - EscortGroup:MessageToClient( EscortROEMessage, 10, EscortClient ) -end - ---- @param #MENUPARAM MenuParam -function ESCORT._ROT( MenuParam ) - - local self = MenuParam.ParamSelf - local EscortGroup = self.EscortGroup - local EscortClient = self.EscortClient - - local EscortROTFunction = MenuParam.ParamFunction - local EscortROTMessage = MenuParam.ParamMessage - - pcall( function() EscortROTFunction() end ) - EscortGroup:MessageToClient( EscortROTMessage, 10, EscortClient ) -end - ---- @param #MENUPARAM MenuParam -function ESCORT._ResumeMission( MenuParam ) - - local self = MenuParam.ParamSelf - local EscortGroup = self.EscortGroup - local EscortClient = self.EscortClient - - local WayPoint = MenuParam.ParamWayPoint - - routines.removeFunction( self.FollowScheduler ) - self.FollowScheduler = nil - - local WayPoints = EscortGroup:GetTaskRoute() - self:T( WayPoint, WayPoints ) - - for WayPointIgnore = 1, WayPoint do - table.remove( WayPoints, 1 ) - end - - --routines.scheduleFunction( EscortGroup.SetTask, {EscortGroup, EscortGroup:TaskRoute( WayPoints ) }, timer.getTime() + 1 ) - SCHEDULER:New( EscortGroup, EscortGroup.SetTask, { EscortGroup:TaskRoute( WayPoints ) }, 1 ) - - EscortGroup:MessageToClient( "Resuming mission from waypoint " .. WayPoint .. ".", 10, EscortClient ) -end - ---- Registers the waypoints --- @param #ESCORT self --- @return #table -function ESCORT:RegisterRoute() - self:F() - - local EscortGroup = self.EscortGroup -- Group#GROUP - - local TaskPoints = EscortGroup:GetTaskRoute() - - self:T( TaskPoints ) - - return TaskPoints -end - ---- @param Escort#ESCORT self -function ESCORT:_FollowScheduler( FollowDistance ) - self:F( { FollowDistance }) - - if self.EscortGroup:IsAlive() and self.EscortClient:IsAlive() then - - local ClientUnit = self.EscortClient:GetClientGroupUnit() - local GroupUnit = self.EscortGroup:GetUnit( 1 ) - - if self.CT1 == 0 and self.GT1 == 0 then - self.CV1 = ClientUnit:GetPointVec3() - self.CT1 = timer.getTime() - self.GV1 = GroupUnit:GetPointVec3() - self.GT1 = timer.getTime() - else - local CT1 = self.CT1 - local CT2 = timer.getTime() - local CV1 = self.CV1 - local CV2 = ClientUnit:GetPointVec3() - self.CT1 = CT2 - self.CV1 = CV2 - - local CD = ( ( CV2.x - CV1.x )^2 + ( CV2.y - CV1.y )^2 + ( CV2.z - CV1.z )^2 ) ^ 0.5 - local CT = CT2 - CT1 - - local CS = ( 3600 / CT ) * ( CD / 1000 ) - - self:T2( { "Client:", CS, CD, CT, CV2, CV1, CT2, CT1 } ) - - local GT1 = self.GT1 - local GT2 = timer.getTime() - local GV1 = self.GV1 - local GV2 = GroupUnit:GetPointVec3() - self.GT1 = GT2 - self.GV1 = GV2 - - local GD = ( ( GV2.x - GV1.x )^2 + ( GV2.y - GV1.y )^2 + ( GV2.z - GV1.z )^2 ) ^ 0.5 - local GT = GT2 - GT1 - - local GS = ( 3600 / GT ) * ( GD / 1000 ) - - self:T2( { "Group:", GS, GD, GT, GV2, GV1, GT2, GT1 } ) - - -- Calculate the group direction vector - local GV = { x = GV2.x - CV2.x, y = GV2.y - CV2.y, z = GV2.z - CV2.z } - - -- Calculate GH2, GH2 with the same height as CV2. - local GH2 = { x = GV2.x, y = CV2.y, z = GV2.z } - - -- Calculate the angle of GV to the orthonormal plane - local alpha = math.atan2( GV.z, GV.x ) - - -- Now we calculate the intersecting vector between the circle around CV2 with radius FollowDistance and GH2. - -- From the GeoGebra model: CVI = (x(CV2) + FollowDistance cos(alpha), y(GH2) + FollowDistance sin(alpha), z(CV2)) - local CVI = { x = CV2.x + FollowDistance * math.cos(alpha), - y = GH2.y, - z = CV2.z + FollowDistance * math.sin(alpha), - } - - -- Calculate the direction vector DV of the escort group. We use CVI as the base and CV2 as the direction. - local DV = { x = CV2.x - CVI.x, y = CV2.y - CVI.y, z = CV2.z - CVI.z } - - -- We now calculate the unary direction vector DVu, so that we can multiply DVu with the speed, which is expressed in meters / s. - -- We need to calculate this vector to predict the point the escort group needs to fly to according its speed. - -- The distance of the destination point should be far enough not to have the aircraft starting to swipe left to right... - local DVu = { x = DV.x / FollowDistance, y = DV.y / FollowDistance, z = DV.z / FollowDistance } - - -- Now we can calculate the group destination vector GDV. - local GDV = { x = DVu.x * CS * 8 + CVI.x, y = CVI.y, z = DVu.z * CS * 8 + CVI.z } - - --trigger.action.smoke( GDV, trigger.smokeColor.Red ) - self:T2( { "CV2:", CV2 } ) - self:T2( { "CVI:", CVI } ) - self:T2( { "GDV:", GDV } ) - - -- Measure distance between client and group - local CatchUpDistance = ( ( GDV.x - GV2.x )^2 + ( GDV.y - GV2.y )^2 + ( GDV.z - GV2.z )^2 ) ^ 0.5 - - -- The calculation of the Speed would simulate that the group would take 30 seconds to overcome - -- the requested Distance). - local Time = 10 - local CatchUpSpeed = ( CatchUpDistance - ( CS * 8.4 ) ) / Time - - local Speed = CS + CatchUpSpeed - if Speed < 0 then - Speed = 0 - end - - self:T( { "Client Speed, Escort Speed, Speed, FlyDistance, Time:", CS, GS, Speed, Distance, Time } ) - - -- Now route the escort to the desired point with the desired speed. - self.EscortGroup:TaskRouteToVec3( GDV, Speed / 3.6 ) -- DCS models speed in Mps (Miles per second) - end - return true - end - - return false -end - - ---- Report Targets Scheduler. --- @param #ESCORT self -function ESCORT:_ReportTargetsScheduler() - self:F( self.EscortGroup:GetName() ) - - if self.EscortGroup:IsAlive() and self.EscortClient:IsAlive() then - local EscortGroupName = self.EscortGroup:GetName() - local EscortTargets = self.EscortGroup:GetDetectedTargets() - - local ClientEscortTargets = self.EscortClient._EscortGroups[EscortGroupName].Targets - - local EscortTargetMessages = "" - for EscortTargetID, EscortTarget in pairs( EscortTargets ) do - local EscortObject = EscortTarget.object - self:T( EscortObject ) - if EscortObject and EscortObject:isExist() and EscortObject.id_ < 50000000 then - - local EscortTargetUnit = UNIT:Find( EscortObject ) - local EscortTargetUnitName = EscortTargetUnit:GetName() - - - - -- local EscortTargetIsDetected, - -- EscortTargetIsVisible, - -- EscortTargetLastTime, - -- EscortTargetKnowType, - -- EscortTargetKnowDistance, - -- EscortTargetLastPos, - -- EscortTargetLastVelocity - -- = self.EscortGroup:IsTargetDetected( EscortObject ) - -- - -- self:T( { EscortTargetIsDetected, - -- EscortTargetIsVisible, - -- EscortTargetLastTime, - -- EscortTargetKnowType, - -- EscortTargetKnowDistance, - -- EscortTargetLastPos, - -- EscortTargetLastVelocity } ) - - - local EscortTargetUnitPositionVec3 = EscortTargetUnit:GetPointVec3() - local EscortPositionVec3 = self.EscortGroup:GetPointVec3() - local Distance = ( ( EscortTargetUnitPositionVec3.x - EscortPositionVec3.x )^2 + - ( EscortTargetUnitPositionVec3.y - EscortPositionVec3.y )^2 + - ( EscortTargetUnitPositionVec3.z - EscortPositionVec3.z )^2 - ) ^ 0.5 / 1000 - - self:T( { self.EscortGroup:GetName(), EscortTargetUnit:GetName(), Distance, EscortTarget } ) - - if Distance <= 15 then - - if not ClientEscortTargets[EscortTargetUnitName] then - ClientEscortTargets[EscortTargetUnitName] = {} - end - ClientEscortTargets[EscortTargetUnitName].AttackUnit = EscortTargetUnit - ClientEscortTargets[EscortTargetUnitName].visible = EscortTarget.visible - ClientEscortTargets[EscortTargetUnitName].type = EscortTarget.type - ClientEscortTargets[EscortTargetUnitName].distance = EscortTarget.distance - else - if ClientEscortTargets[EscortTargetUnitName] then - ClientEscortTargets[EscortTargetUnitName] = nil - end - end - end - end - - self:T( { "Sorting Targets Table:", ClientEscortTargets } ) - table.sort( ClientEscortTargets, function( a, b ) return a.Distance < b.Distance end ) - self:T( { "Sorted Targets Table:", ClientEscortTargets } ) - - -- Remove the sub menus of the Attack menu of the Escort for the EscortGroup. - self.EscortMenuAttackNearbyTargets:RemoveSubMenus() - - if self.EscortMenuTargetAssistance then - self.EscortMenuTargetAssistance:RemoveSubMenus() - end - - --for MenuIndex = 1, #self.EscortMenuAttackTargets do - -- self:T( { "Remove Menu:", self.EscortMenuAttackTargets[MenuIndex] } ) - -- self.EscortMenuAttackTargets[MenuIndex] = self.EscortMenuAttackTargets[MenuIndex]:Remove() - --end - - - if ClientEscortTargets then - for ClientEscortTargetUnitName, ClientEscortTargetData in pairs( ClientEscortTargets ) do - - for ClientEscortGroupName, EscortGroupData in pairs( self.EscortClient._EscortGroups ) do - - if ClientEscortTargetData and ClientEscortTargetData.AttackUnit:IsAlive() then - - local EscortTargetMessage = "" - local EscortTargetCategoryName = ClientEscortTargetData.AttackUnit:GetCategoryName() - local EscortTargetCategoryType = ClientEscortTargetData.AttackUnit:GetTypeName() - if ClientEscortTargetData.type then - EscortTargetMessage = EscortTargetMessage .. EscortTargetCategoryName .. " (" .. EscortTargetCategoryType .. ") at " - else - EscortTargetMessage = EscortTargetMessage .. "Unknown target at " - end - - local EscortTargetUnitPositionVec3 = ClientEscortTargetData.AttackUnit:GetPointVec3() - local EscortPositionVec3 = self.EscortGroup:GetPointVec3() - local Distance = ( ( EscortTargetUnitPositionVec3.x - EscortPositionVec3.x )^2 + - ( EscortTargetUnitPositionVec3.y - EscortPositionVec3.y )^2 + - ( EscortTargetUnitPositionVec3.z - EscortPositionVec3.z )^2 - ) ^ 0.5 / 1000 - - self:T( { self.EscortGroup:GetName(), ClientEscortTargetData.AttackUnit:GetName(), Distance, ClientEscortTargetData.AttackUnit } ) - if ClientEscortTargetData.visible == false then - EscortTargetMessage = EscortTargetMessage .. string.format( "%.2f", Distance ) .. " estimated km" - else - EscortTargetMessage = EscortTargetMessage .. string.format( "%.2f", Distance ) .. " km" - end - - if ClientEscortTargetData.visible then - EscortTargetMessage = EscortTargetMessage .. ", visual" - end - - if ClientEscortGroupName == EscortGroupName then - - MENU_CLIENT_COMMAND:New( self.EscortClient, - EscortTargetMessage, - self.EscortMenuAttackNearbyTargets, - ESCORT._AttackTarget, - { ParamSelf = self, - ParamUnit = ClientEscortTargetData.AttackUnit - } - ) - EscortTargetMessages = EscortTargetMessages .. "\n - " .. EscortTargetMessage - else - if self.EscortMenuTargetAssistance then - local MenuTargetAssistance = MENU_CLIENT:New( self.EscortClient, EscortGroupData.EscortName, self.EscortMenuTargetAssistance ) - MENU_CLIENT_COMMAND:New( self.EscortClient, - EscortTargetMessage, - MenuTargetAssistance, - ESCORT._AssistTarget, - { ParamSelf = self, - ParamEscortGroup = EscortGroupData.EscortGroup, - ParamUnit = ClientEscortTargetData.AttackUnit - } - ) - end - end - else - ClientEscortTargetData = nil - end - end - end - - if EscortTargetMessages ~= "" and self.ReportTargets == true then - self.EscortGroup:MessageToClient( "Detected targets within 15 km range:" .. EscortTargetMessages:gsub("\n$",""), 20, self.EscortClient ) - else - self.EscortGroup:MessageToClient( "No targets detected!", 20, self.EscortClient ) - end - end - - if self.EscortMenuResumeMission then - self.EscortMenuResumeMission:RemoveSubMenus() - - -- if self.EscortMenuResumeWayPoints then - -- for MenuIndex = 1, #self.EscortMenuResumeWayPoints do - -- self:T( { "Remove Menu:", self.EscortMenuResumeWayPoints[MenuIndex] } ) - -- self.EscortMenuResumeWayPoints[MenuIndex] = self.EscortMenuResumeWayPoints[MenuIndex]:Remove() - -- end - -- end - - local TaskPoints = self:RegisterRoute() - for WayPointID, WayPoint in pairs( TaskPoints ) do - local EscortPositionVec3 = self.EscortGroup:GetPointVec3() - local Distance = ( ( WayPoint.x - EscortPositionVec3.x )^2 + - ( WayPoint.y - EscortPositionVec3.z )^2 - ) ^ 0.5 / 1000 - MENU_CLIENT_COMMAND:New( self.EscortClient, "Waypoint " .. WayPointID .. " at " .. string.format( "%.2f", Distance ).. "km", self.EscortMenuResumeMission, ESCORT._ResumeMission, { ParamSelf = self, ParamWayPoint = WayPointID } ) - end - end - return true - end - - return false -end ---- Provides missile training functions. --- --- @{#MISSILETRAINER} class --- ======================== --- The @{#MISSILETRAINER} class uses the DCS world messaging system to be alerted of any missiles fired, and when a missile would hit your aircraft, --- the class will destroy the missile within a certain range, to avoid damage to your aircraft. --- It suports the following functionality: --- --- * Track the missiles fired at you and other players, providing bearing and range information of the missiles towards the airplanes. --- * Provide alerts of missile launches, including detailed information of the units launching, including bearing, range … --- * Provide alerts when a missile would have killed your aircraft. --- * Provide alerts when the missile self destructs. --- * Enable / Disable and Configure the Missile Trainer using the various menu options. --- --- When running a mission where MISSILETRAINER is used, the following radio menu structure ( 'Radio Menu' -> 'Other (F10)' -> 'MissileTrainer' ) options are available for the players: --- --- * **Messages**: Menu to configure all messages. --- * **Messages On**: Show all messages. --- * **Messages Off**: Disable all messages. --- * **Tracking**: Menu to configure missile tracking messages. --- * **To All**: Shows missile tracking messages to all players. --- * **To Target**: Shows missile tracking messages only to the player where the missile is targetted at. --- * **Tracking On**: Show missile tracking messages. --- * **Tracking Off**: Disable missile tracking messages. --- * **Frequency Increase**: Increases the missile tracking message frequency with one second. --- * **Frequency Decrease**: Decreases the missile tracking message frequency with one second. --- * **Alerts**: Menu to configure alert messages. --- * **To All**: Shows alert messages to all players. --- * **To Target**: Shows alert messages only to the player where the missile is (was) targetted at. --- * **Hits On**: Show missile hit alert messages. --- * **Hits Off**: Disable missile hit alert messages. --- * **Launches On**: Show missile launch messages. --- * **Launches Off**: Disable missile launch messages. --- * **Details**: Menu to configure message details. --- * **Range On**: Shows range information when a missile is fired to a target. --- * **Range Off**: Disable range information when a missile is fired to a target. --- * **Bearing On**: Shows bearing information when a missile is fired to a target. --- * **Bearing Off**: Disable bearing information when a missile is fired to a target. --- * **Distance**: Menu to configure the distance when a missile needs to be destroyed when near to a player, during tracking. This will improve/influence hit calculation accuracy, but has the risk of damaging the aircraft when the missile reaches the aircraft before the distance is measured. --- * **50 meter**: Destroys the missile when the distance to the aircraft is below or equal to 50 meter. --- * **100 meter**: Destroys the missile when the distance to the aircraft is below or equal to 100 meter. --- * **150 meter**: Destroys the missile when the distance to the aircraft is below or equal to 150 meter. --- * **200 meter**: Destroys the missile when the distance to the aircraft is below or equal to 200 meter. --- --- --- MISSILETRAINER construction methods: --- ==================================== --- Create a new MISSILETRAINER object with the @{#MISSILETRAINER.New} method: --- --- * @{#MISSILETRAINER.New}: Creates a new MISSILETRAINER object taking the maximum distance to your aircraft to evaluate when a missile needs to be destroyed. --- --- MISSILETRAINER will collect each unit declared in the mission with a skill level "Client" and "Player", and will monitor the missiles shot at those. --- --- MISSILETRAINER initialization methods: --- ====================================== --- A MISSILETRAINER object will behave differently based on the usage of initialization methods: --- --- * @{#MISSILETRAINER.InitMessagesOnOff}: Sets by default the display of any message to be ON or OFF. --- * @{#MISSILETRAINER.InitTrackingToAll}: Sets by default the missile tracking report for all players or only for those missiles targetted to you. --- * @{#MISSILETRAINER.InitTrackingOnOff}: Sets by default the display of missile tracking report to be ON or OFF. --- * @{#MISSILETRAINER.InitTrackingFrequency}: Increases, decreases the missile tracking message display frequency with the provided time interval in seconds. --- * @{#MISSILETRAINER.InitAlertsToAll}: Sets by default the display of alerts to be shown to all players or only to you. --- * @{#MISSILETRAINER.InitAlertsHitsOnOff}: Sets by default the display of hit alerts ON or OFF. --- * @{#MISSILETRAINER.InitAlertsLaunchesOnOff}: Sets by default the display of launch alerts ON or OFF. --- * @{#MISSILETRAINER.InitRangeOnOff}: Sets by default the display of range information of missiles ON of OFF. --- * @{#MISSILETRAINER.InitBearingOnOff}: Sets by default the display of bearing information of missiles ON of OFF. --- * @{#MISSILETRAINER.InitMenusOnOff}: Allows to configure the options through the radio menu. --- --- @module MissileTrainer --- @author FlightControl - - ---- The MISSILETRAINER class --- @type MISSILETRAINER --- @extends Base#BASE -MISSILETRAINER = { - ClassName = "MISSILETRAINER", -} - ---- Creates the main object which is handling missile tracking. --- When a missile is fired a SCHEDULER is set off that follows the missile. When near a certain a client player, the missile will be destroyed. --- @param #MISSILETRAINER self --- @param #number Distance The distance in meters when a tracked missile needs to be destroyed when close to a player. --- @param #string Briefing (Optional) Will show a text to the players when starting their mission. Can be used for briefing purposes. --- @return #MISSILETRAINER -function MISSILETRAINER:New( Distance, Briefing ) - local self = BASE:Inherit( self, BASE:New() ) - self:F( Distance ) - - if Briefing then - self.Briefing = Briefing - end - - self.Schedulers = {} - self.SchedulerID = 0 - - self.MessageInterval = 2 - self.MessageLastTime = timer.getTime() - - self.Distance = Distance / 1000 - - _EVENTDISPATCHER:OnShot( self._EventShot, self ) - - self.DB = DATABASE:New():FilterStart() - self.DBClients = self.DB.Clients - self.DBUnits = self.DB.Units - - for ClientID, Client in pairs( self.DBClients ) do - - local function _Alive( Client ) - - if self.Briefing then - Client:Message( self.Briefing, 15, "HELLO WORLD", "Trainer" ) - end - - if self.MenusOnOff == true then - Client:Message( "Use the 'Radio Menu' -> 'Other (F10)' -> 'Missile Trainer' menu options to change the Missile Trainer settings (for all players).", 15, "MENU", "Trainer" ) - - Client.MainMenu = MENU_CLIENT:New( Client, "Missile Trainer", nil ) -- Menu#MENU_CLIENT - - Client.MenuMessages = MENU_CLIENT:New( Client, "Messages", Client.MainMenu ) - Client.MenuOn = MENU_CLIENT_COMMAND:New( Client, "Messages On", Client.MenuMessages, self._MenuMessages, { MenuSelf = self, MessagesOnOff = true } ) - Client.MenuOff = MENU_CLIENT_COMMAND:New( Client, "Messages Off", Client.MenuMessages, self._MenuMessages, { MenuSelf = self, MessagesOnOff = false } ) - - Client.MenuTracking = MENU_CLIENT:New( Client, "Tracking", Client.MainMenu ) - Client.MenuTrackingToAll = MENU_CLIENT_COMMAND:New( Client, "To All", Client.MenuTracking, self._MenuMessages, { MenuSelf = self, TrackingToAll = true } ) - Client.MenuTrackingToTarget = MENU_CLIENT_COMMAND:New( Client, "To Target", Client.MenuTracking, self._MenuMessages, { MenuSelf = self, TrackingToAll = false } ) - Client.MenuTrackOn = MENU_CLIENT_COMMAND:New( Client, "Tracking On", Client.MenuTracking, self._MenuMessages, { MenuSelf = self, TrackingOnOff = true } ) - Client.MenuTrackOff = MENU_CLIENT_COMMAND:New( Client, "Tracking Off", Client.MenuTracking, self._MenuMessages, { MenuSelf = self, TrackingOnOff = false } ) - Client.MenuTrackIncrease = MENU_CLIENT_COMMAND:New( Client, "Frequency Increase", Client.MenuTracking, self._MenuMessages, { MenuSelf = self, TrackingFrequency = -1 } ) - Client.MenuTrackDecrease = MENU_CLIENT_COMMAND:New( Client, "Frequency Decrease", Client.MenuTracking, self._MenuMessages, { MenuSelf = self, TrackingFrequency = 1 } ) - - Client.MenuAlerts = MENU_CLIENT:New( Client, "Alerts", Client.MainMenu ) - Client.MenuAlertsToAll = MENU_CLIENT_COMMAND:New( Client, "To All", Client.MenuAlerts, self._MenuMessages, { MenuSelf = self, AlertsToAll = true } ) - Client.MenuAlertsToTarget = MENU_CLIENT_COMMAND:New( Client, "To Target", Client.MenuAlerts, self._MenuMessages, { MenuSelf = self, AlertsToAll = false } ) - Client.MenuHitsOn = MENU_CLIENT_COMMAND:New( Client, "Hits On", Client.MenuAlerts, self._MenuMessages, { MenuSelf = self, AlertsHitsOnOff = true } ) - Client.MenuHitsOff = MENU_CLIENT_COMMAND:New( Client, "Hits Off", Client.MenuAlerts, self._MenuMessages, { MenuSelf = self, AlertsHitsOnOff = false } ) - Client.MenuLaunchesOn = MENU_CLIENT_COMMAND:New( Client, "Launches On", Client.MenuAlerts, self._MenuMessages, { MenuSelf = self, AlertsLaunchesOnOff = true } ) - Client.MenuLaunchesOff = MENU_CLIENT_COMMAND:New( Client, "Launches Off", Client.MenuAlerts, self._MenuMessages, { MenuSelf = self, AlertsLaunchesOnOff = false } ) - - Client.MenuDetails = MENU_CLIENT:New( Client, "Details", Client.MainMenu ) - Client.MenuDetailsDistanceOn = MENU_CLIENT_COMMAND:New( Client, "Range On", Client.MenuDetails, self._MenuMessages, { MenuSelf = self, DetailsRangeOnOff = true } ) - Client.MenuDetailsDistanceOff = MENU_CLIENT_COMMAND:New( Client, "Range Off", Client.MenuDetails, self._MenuMessages, { MenuSelf = self, DetailsRangeOnOff = false } ) - Client.MenuDetailsBearingOn = MENU_CLIENT_COMMAND:New( Client, "Bearing On", Client.MenuDetails, self._MenuMessages, { MenuSelf = self, DetailsBearingOnOff = true } ) - Client.MenuDetailsBearingOff = MENU_CLIENT_COMMAND:New( Client, "Bearing Off", Client.MenuDetails, self._MenuMessages, { MenuSelf = self, DetailsBearingOnOff = false } ) - - Client.MenuDistance = MENU_CLIENT:New( Client, "Set distance to plane", Client.MainMenu ) - Client.MenuDistance50 = MENU_CLIENT_COMMAND:New( Client, "50 meter", Client.MenuDistance, self._MenuMessages, { MenuSelf = self, Distance = 50 / 1000 } ) - Client.MenuDistance100 = MENU_CLIENT_COMMAND:New( Client, "100 meter", Client.MenuDistance, self._MenuMessages, { MenuSelf = self, Distance = 100 / 1000 } ) - Client.MenuDistance150 = MENU_CLIENT_COMMAND:New( Client, "150 meter", Client.MenuDistance, self._MenuMessages, { MenuSelf = self, Distance = 150 / 1000 } ) - Client.MenuDistance200 = MENU_CLIENT_COMMAND:New( Client, "200 meter", Client.MenuDistance, self._MenuMessages, { MenuSelf = self, Distance = 200 / 1000 } ) - else - if Client.MainMenu then - Client.MainMenu:Remove() - end - end - - - local ClientID = Client:GetID() - self:T( ClientID ) - if not self.TrackingMissiles[ClientID] then - self.TrackingMissiles[ClientID] = {} - end - self.TrackingMissiles[ClientID].Client = Client - if not self.TrackingMissiles[ClientID].MissileData then - self.TrackingMissiles[ClientID].MissileData = {} - end - end - - Client:Alive( _Alive ) - - end - --- self.DB:ForEachClient( --- --- @param Client#CLIENT Client --- function( Client ) --- --- ... actions ... --- --- end --- ) - - self.MessagesOnOff = true - - self.TrackingToAll = false - self.TrackingOnOff = true - self.TrackingFrequency = 3 - - self.AlertsToAll = true - self.AlertsHitsOnOff = true - self.AlertsLaunchesOnOff = true - - self.DetailsRangeOnOff = true - self.DetailsBearingOnOff = true - - self.MenusOnOff = true - - self.TrackingMissiles = {} - - self.TrackingScheduler = SCHEDULER:New( self, self._TrackMissiles, {}, 0.5, 0.05, 0 ) - - return self -end - --- Initialization methods. - - ---- Sets by default the display of any message to be ON or OFF. --- @param #MISSILETRAINER self --- @param #boolean MessagesOnOff true or false --- @return #MISSILETRAINER self -function MISSILETRAINER:InitMessagesOnOff( MessagesOnOff ) - self:F( MessagesOnOff ) - - self.MessagesOnOff = MessagesOnOff - if self.MessagesOnOff == true then - MESSAGE:New( "Messages ON", 15, "Menu" ):ToAll() - else - MESSAGE:New( "Messages OFF", 15, "Menu" ):ToAll() - end - - return self -end - ---- Sets by default the missile tracking report for all players or only for those missiles targetted to you. --- @param #MISSILETRAINER self --- @param #boolean TrackingToAll true or false --- @return #MISSILETRAINER self -function MISSILETRAINER:InitTrackingToAll( TrackingToAll ) - self:F( TrackingToAll ) - - self.TrackingToAll = TrackingToAll - if self.TrackingToAll == true then - MESSAGE:New( "Missile tracking to all players ON", 15, "Menu" ):ToAll() - else - MESSAGE:New( "Missile tracking to all players OFF", 15, "Menu" ):ToAll() - end - - return self -end - ---- Sets by default the display of missile tracking report to be ON or OFF. --- @param #MISSILETRAINER self --- @param #boolean TrackingOnOff true or false --- @return #MISSILETRAINER self -function MISSILETRAINER:InitTrackingOnOff( TrackingOnOff ) - self:F( TrackingOnOff ) - - self.TrackingOnOff = TrackingOnOff - if self.TrackingOnOff == true then - MESSAGE:New( "Missile tracking ON", 15, "Menu" ):ToAll() - else - MESSAGE:New( "Missile tracking OFF", 15, "Menu" ):ToAll() - end - - return self -end - ---- Increases, decreases the missile tracking message display frequency with the provided time interval in seconds. --- The default frequency is a 3 second interval, so the Tracking Frequency parameter specifies the increase or decrease from the default 3 seconds or the last frequency update. --- @param #MISSILETRAINER self --- @param #number TrackingFrequency Provide a negative or positive value in seconds to incraese or decrease the display frequency. --- @return #MISSILETRAINER self -function MISSILETRAINER:InitTrackingFrequency( TrackingFrequency ) - self:F( TrackingFrequency ) - - self.TrackingFrequency = self.TrackingFrequency + TrackingFrequency - if self.TrackingFrequency < 0.5 then - self.TrackingFrequency = 0.5 - end - if self.TrackingFrequency then - MESSAGE:New( "Missile tracking frequency is " .. self.TrackingFrequency .. " seconds.", 15, "Menu" ):ToAll() - end - - return self -end - ---- Sets by default the display of alerts to be shown to all players or only to you. --- @param #MISSILETRAINER self --- @param #boolean AlertsToAll true or false --- @return #MISSILETRAINER self -function MISSILETRAINER:InitAlertsToAll( AlertsToAll ) - self:F( AlertsToAll ) - - self.AlertsToAll = AlertsToAll - if self.AlertsToAll == true then - MESSAGE:New( "Alerts to all players ON", 15, "Menu" ):ToAll() - else - MESSAGE:New( "Alerts to all players OFF", 15, "Menu" ):ToAll() - end - - return self -end - ---- Sets by default the display of hit alerts ON or OFF. --- @param #MISSILETRAINER self --- @param #boolean AlertsHitsOnOff true or false --- @return #MISSILETRAINER self -function MISSILETRAINER:InitAlertsHitsOnOff( AlertsHitsOnOff ) - self:F( AlertsHitsOnOff ) - - self.AlertsHitsOnOff = AlertsHitsOnOff - if self.AlertsHitsOnOff == true then - MESSAGE:New( "Alerts Hits ON", 15, "Menu" ):ToAll() - else - MESSAGE:New( "Alerts Hits OFF", 15, "Menu" ):ToAll() - end - - return self -end - ---- Sets by default the display of launch alerts ON or OFF. --- @param #MISSILETRAINER self --- @param #boolean AlertsLaunchesOnOff true or false --- @return #MISSILETRAINER self -function MISSILETRAINER:InitAlertsLaunchesOnOff( AlertsLaunchesOnOff ) - self:F( AlertsLaunchesOnOff ) - - self.AlertsLaunchesOnOff = AlertsLaunchesOnOff - if self.AlertsLaunchesOnOff == true then - MESSAGE:New( "Alerts Launches ON", 15, "Menu" ):ToAll() - else - MESSAGE:New( "Alerts Launches OFF", 15, "Menu" ):ToAll() - end - - return self -end - ---- Sets by default the display of range information of missiles ON of OFF. --- @param #MISSILETRAINER self --- @param #boolean DetailsRangeOnOff true or false --- @return #MISSILETRAINER self -function MISSILETRAINER:InitRangeOnOff( DetailsRangeOnOff ) - self:F( DetailsRangeOnOff ) - - self.DetailsRangeOnOff = DetailsRangeOnOff - if self.DetailsRangeOnOff == true then - MESSAGE:New( "Range display ON", 15, "Menu" ):ToAll() - else - MESSAGE:New( "Range display OFF", 15, "Menu" ):ToAll() - end - - return self -end - ---- Sets by default the display of bearing information of missiles ON of OFF. --- @param #MISSILETRAINER self --- @param #boolean DetailsBearingOnOff true or false --- @return #MISSILETRAINER self -function MISSILETRAINER:InitBearingOnOff( DetailsBearingOnOff ) - self:F( DetailsBearingOnOff ) - - self.DetailsBearingOnOff = DetailsBearingOnOff - if self.DetailsBearingOnOff == true then - MESSAGE:New( "Bearing display OFF", 15, "Menu" ):ToAll() - else - MESSAGE:New( "Bearing display OFF", 15, "Menu" ):ToAll() - end - - return self -end - ---- Enables / Disables the menus. --- @param #MISSILETRAINER self --- @param #boolean MenusOnOff true or false --- @return #MISSILETRAINER self -function MISSILETRAINER:InitMenusOnOff( MenusOnOff ) - self:F( MenusOnOff ) - - self.MenusOnOff = MenusOnOff - if self.MenusOnOff == true then - MESSAGE:New( "Menus are ENABLED (only when a player rejoins a slot)", 15, "Menu" ):ToAll() - else - MESSAGE:New( "Menus are DISABLED", 15, "Menu" ):ToAll() - end - - return self -end - - --- Menu functions - -function MISSILETRAINER._MenuMessages( MenuParameters ) - - local self = MenuParameters.MenuSelf - - if MenuParameters.MessagesOnOff ~= nil then - self:InitMessagesOnOff( MenuParameters.MessagesOnOff ) - end - - if MenuParameters.TrackingToAll ~= nil then - self:InitTrackingToAll( MenuParameters.TrackingToAll ) - end - - if MenuParameters.TrackingOnOff ~= nil then - self:InitTrackingOnOff( MenuParameters.TrackingOnOff ) - end - - if MenuParameters.TrackingFrequency ~= nil then - self:InitTrackingFrequency( MenuParameters.TrackingFrequency ) - end - - if MenuParameters.AlertsToAll ~= nil then - self:InitAlertsToAll( MenuParameters.AlertsToAll ) - end - - if MenuParameters.AlertsHitsOnOff ~= nil then - self:InitAlertsHitsOnOff( MenuParameters.AlertsHitsOnOff ) - end - - if MenuParameters.AlertsLaunchesOnOff ~= nil then - self:InitAlertsLaunchesOnOff( MenuParameters.AlertsLaunchesOnOff ) - end - - if MenuParameters.DetailsRangeOnOff ~= nil then - self:InitRangeOnOff( MenuParameters.DetailsRangeOnOff ) - end - - if MenuParameters.DetailsBearingOnOff ~= nil then - self:InitBearingOnOff( MenuParameters.DetailsBearingOnOff ) - end - - if MenuParameters.Distance ~= nil then - self.Distance = MenuParameters.Distance - MESSAGE:New( "Hit detection distance set to " .. self.Distance .. " meters", 15, "Menu" ):ToAll() - end - -end - ---- Detects if an SA site was shot with an anti radiation missile. In this case, take evasive actions based on the skill level set within the ME. --- @param #MISSILETRAINER self --- @param Event#EVENTDATA Event -function MISSILETRAINER:_EventShot( Event ) - self:F( { Event } ) - - local TrainerSourceDCSUnit = Event.IniDCSUnit - local TrainerSourceDCSUnitName = Event.IniDCSUnitName - local TrainerWeapon = Event.Weapon -- Identify the weapon fired - local TrainerWeaponName = Event.WeaponName -- return weapon type - - self:T( "Missile Launched = " .. TrainerWeaponName ) - - local TrainerTargetDCSUnit = TrainerWeapon:getTarget() -- Identify target - local TrainerTargetDCSUnitName = Unit.getName( TrainerTargetDCSUnit ) - local TrainerTargetSkill = _DATABASE.Templates.Units[TrainerTargetDCSUnitName].Template.skill - - self:T(TrainerTargetDCSUnitName ) - - local Client = self.DBClients[TrainerTargetDCSUnitName] - if Client then - - local TrainerSourceUnit = UNIT:Find( TrainerSourceDCSUnit ) - local TrainerTargetUnit = UNIT:Find( TrainerTargetDCSUnit ) - - if self.MessagesOnOff == true and self.AlertsLaunchesOnOff == true then - - local Message = MESSAGE:New( - string.format( "%s launched a %s", - TrainerSourceUnit:GetTypeName(), - TrainerWeaponName - ) .. self:_AddRange( Client, TrainerWeapon ) .. self:_AddBearing( Client, TrainerWeapon ), 5, "Launch Alert" ) - - if self.AlertsToAll then - Message:ToAll() - else - Message:ToClient( Client ) - end - end - - local ClientID = Client:GetID() - local MissileData = {} - MissileData.TrainerSourceUnit = TrainerSourceUnit - MissileData.TrainerWeapon = TrainerWeapon - MissileData.TrainerTargetUnit = TrainerTargetUnit - MissileData.TrainerWeaponTypeName = TrainerWeapon:getTypeName() - MissileData.TrainerWeaponLaunched = true - table.insert( self.TrackingMissiles[ClientID].MissileData, MissileData ) - --self:T( self.TrackingMissiles ) - end -end - -function MISSILETRAINER:_AddRange( Client, TrainerWeapon ) - - local RangeText = "" - - if self.DetailsRangeOnOff then - - local PositionMissile = TrainerWeapon:getPoint() - local PositionTarget = Client:GetPointVec3() - - local Range = ( ( PositionMissile.x - PositionTarget.x )^2 + - ( PositionMissile.y - PositionTarget.y )^2 + - ( PositionMissile.z - PositionTarget.z )^2 - ) ^ 0.5 / 1000 - - RangeText = string.format( ", at %4.2fkm", Range ) - end - - return RangeText -end - -function MISSILETRAINER:_AddBearing( Client, TrainerWeapon ) - - local BearingText = "" - - if self.DetailsBearingOnOff then - - local PositionMissile = TrainerWeapon:getPoint() - local PositionTarget = Client:GetPointVec3() - - self:T2( { PositionTarget, PositionMissile }) - - local DirectionVector = { x = PositionMissile.x - PositionTarget.x, y = PositionMissile.y - PositionTarget.y, z = PositionMissile.z - PositionTarget.z } - local DirectionRadians = math.atan2( DirectionVector.z, DirectionVector.x ) - --DirectionRadians = DirectionRadians + routines.getNorthCorrection( PositionTarget ) - if DirectionRadians < 0 then - DirectionRadians = DirectionRadians + 2 * math.pi - end - local DirectionDegrees = DirectionRadians * 180 / math.pi - - BearingText = string.format( ", %d degrees", DirectionDegrees ) - end - - return BearingText -end - - -function MISSILETRAINER:_TrackMissiles() - self:F2() - - - local ShowMessages = false - if self.MessagesOnOff and self.MessageLastTime + self.TrackingFrequency <= timer.getTime() then - self.MessageLastTime = timer.getTime() - ShowMessages = true - end - - -- ALERTS PART - - -- Loop for all Player Clients to check the alerts and deletion of missiles. - for ClientDataID, ClientData in pairs( self.TrackingMissiles ) do - - local Client = ClientData.Client - self:T2( { Client:GetName() } ) - - for MissileDataID, MissileData in pairs( ClientData.MissileData ) do - self:T3( MissileDataID ) - - local TrainerSourceUnit = MissileData.TrainerSourceUnit - local TrainerWeapon = MissileData.TrainerWeapon - local TrainerTargetUnit = MissileData.TrainerTargetUnit - local TrainerWeaponTypeName = MissileData.TrainerWeaponTypeName - local TrainerWeaponLaunched = MissileData.TrainerWeaponLaunched - - if Client and Client:IsAlive() and TrainerSourceUnit and TrainerSourceUnit:IsAlive() and TrainerWeapon and TrainerWeapon:isExist() and TrainerTargetUnit and TrainerTargetUnit:IsAlive() then - local PositionMissile = TrainerWeapon:getPosition().p - local PositionTarget = Client:GetPointVec3() - - local Distance = ( ( PositionMissile.x - PositionTarget.x )^2 + - ( PositionMissile.y - PositionTarget.y )^2 + - ( PositionMissile.z - PositionTarget.z )^2 - ) ^ 0.5 / 1000 - - if Distance <= self.Distance then - -- Hit alert - TrainerWeapon:destroy() - if self.MessagesOnOff == true and self.AlertsHitsOnOff == true then - - self:T( "killed" ) - - local Message = MESSAGE:New( - string.format( "%s launched by %s killed %s", - TrainerWeapon:getTypeName(), - TrainerSourceUnit:GetTypeName(), - TrainerTargetUnit:GetPlayerName() - ), 15, "Hit Alert" ) - - if self.AlertsToAll == true then - Message:ToAll() - else - Message:ToClient( Client ) - end - - MissileData = nil - table.remove( ClientData.MissileData, MissileDataID ) - self:T(ClientData.MissileData) - end - end - else - if not ( TrainerWeapon and TrainerWeapon:isExist() ) then - if self.MessagesOnOff == true and self.AlertsLaunchesOnOff == true then - -- Weapon does not exist anymore. Delete from Table - local Message = MESSAGE:New( - string.format( "%s launched by %s self destructed!", - TrainerWeaponTypeName, - TrainerSourceUnit:GetTypeName() - ), 5, "Tracking" ) - - if self.AlertsToAll == true then - Message:ToAll() - else - Message:ToClient( Client ) - end - end - MissileData = nil - table.remove( ClientData.MissileData, MissileDataID ) - self:T( ClientData.MissileData ) - end - end - end - end - - if ShowMessages == true and self.MessagesOnOff == true and self.TrackingOnOff == true then -- Only do this when tracking information needs to be displayed. - - -- TRACKING PART - - -- For the current client, the missile range and bearing details are displayed To the Player Client. - -- For the other clients, the missile range and bearing details are displayed To the other Player Clients. - -- To achieve this, a cross loop is done for each Player Client <-> Other Player Client missile information. - - -- Main Player Client loop - for ClientDataID, ClientData in pairs( self.TrackingMissiles ) do - - local Client = ClientData.Client - self:T2( { Client:GetName() } ) - - - ClientData.MessageToClient = "" - ClientData.MessageToAll = "" - - -- Other Players Client loop - for TrackingDataID, TrackingData in pairs( self.TrackingMissiles ) do - - for MissileDataID, MissileData in pairs( TrackingData.MissileData ) do - self:T3( MissileDataID ) - - local TrainerSourceUnit = MissileData.TrainerSourceUnit - local TrainerWeapon = MissileData.TrainerWeapon - local TrainerTargetUnit = MissileData.TrainerTargetUnit - local TrainerWeaponTypeName = MissileData.TrainerWeaponTypeName - local TrainerWeaponLaunched = MissileData.TrainerWeaponLaunched - - if Client and Client:IsAlive() and TrainerSourceUnit and TrainerSourceUnit:IsAlive() and TrainerWeapon and TrainerWeapon:isExist() and TrainerTargetUnit and TrainerTargetUnit:IsAlive() then - - if ShowMessages == true then - local TrackingTo - TrackingTo = string.format( " -> %s", - TrainerWeaponTypeName - ) - - if ClientDataID == TrackingDataID then - if ClientData.MessageToClient == "" then - ClientData.MessageToClient = "Missiles to You:\n" - end - ClientData.MessageToClient = ClientData.MessageToClient .. TrackingTo .. self:_AddRange( ClientData.Client, TrainerWeapon ) .. self:_AddBearing( ClientData.Client, TrainerWeapon ) .. "\n" - else - if self.TrackingToAll == true then - if ClientData.MessageToAll == "" then - ClientData.MessageToAll = "Missiles to other Players:\n" - end - ClientData.MessageToAll = ClientData.MessageToAll .. TrackingTo .. self:_AddRange( ClientData.Client, TrainerWeapon ) .. self:_AddBearing( ClientData.Client, TrainerWeapon ) .. " ( " .. TrainerTargetUnit:GetPlayerName() .. " )\n" - end - end - end - end - end - end - - -- Once the Player Client and the Other Player Client tracking messages are prepared, show them. - if ClientData.MessageToClient ~= "" or ClientData.MessageToAll ~= "" then - local Message = MESSAGE:New( ClientData.MessageToClient .. ClientData.MessageToAll, 1, "Tracking" ):ToClient( Client ) - end - end - end - - return true -end ---- This module contains the AIBALANCER class. --- --- === --- --- 1) @{AIBalancer#AIBALANCER} class, extends @{Base#BASE} --- ================================================ --- The @{AIBalancer#AIBALANCER} class controls the dynamic spawning of AI GROUPS depending on a SET_CLIENT. --- There will be as many AI GROUPS spawned as there at CLIENTS in SET_CLIENT not spawned. --- --- 1.1) AIBALANCER construction method: --- ------------------------------------ --- Create a new AIBALANCER object with the @{#AIBALANCER.New} method: --- --- * @{#AIBALANCER.New}: Creates a new AIBALANCER object. --- --- --- === --- @module AIBalancer --- @author FlightControl - ---- AIBALANCER class --- @type AIBALANCER --- @field Set#SET_CLIENT SetClient --- @field Spawn#SPAWN SpawnAI --- @extends Base#BASE -AIBALANCER = { - ClassName = "AIBALANCER", -} - ---- Creates a new AIBALANCER object, building a set of units belonging to a coalitions, categories, countries, types or with defined prefix names. --- @param #AIBALANCER self --- @param SetClient A SET_CLIENT object that will contain the CLIENT objects to be monitored if they are alive or not (joined by a player). --- @param SpawnAI A SPAWN object that will spawn the AI units required, balancing the SetClient. --- @return #AIBALANCER self -function AIBALANCER:New( SetClient, SpawnAI ) - - -- Inherits from BASE - local self = BASE:Inherit( self, BASE:New() ) - - self.SetClient = SetClient - self.SpawnAI = SpawnAI - - self.AIMonitorSchedule = SCHEDULER:New( self, self._ClientAliveMonitorScheduler, {}, 1, 10, 0 ) - - return self -end - ---- @param #AIBALANCER self -function AIBALANCER:_ClientAliveMonitorScheduler() - - self.SetClient:ForEachClient( - --- @param Client#CLIENT Client - function( Client ) - local ClientAIAliveState = Client:GetState( self, 'AIAlive' ) - self:T( ClientAIAliveState ) - if Client:IsAlive() then - if ClientAIAliveState == true then - Client:SetState( self, 'AIAlive', false ) - local AIGroup = Client:GetState( self, 'AIGroup' ) -- Group#GROUP - AIGroup:Destroy() - end - else - if not ClientAIAliveState or ClientAIAliveState == false then - Client:SetState( self, 'AIAlive', true ) - Client:SetState( self, 'AIGroup', self.SpawnAI:Spawn() ) - end - end - end - ) - return true -end - - - env.info( '*** MOOSE INCLUDE END *** ' ) diff --git a/Moose Test Missions/Moose_Test_AIBALANCER/Moose_Test_AIBALANCER.miz b/Moose Test Missions/Moose_Test_AIBALANCER/Moose_Test_AIBALANCER.miz index ac1d065956997c51f087a0868609de707c1c6127..2a3b8714b2886345f4408dddf4bbc7d50992fc81 100644 GIT binary patch delta 854 zcmbPojbr&j#toTb+e)k(Do}E5<-u|-WnrqkhUw`mNykX&G zz9zAtEH-l=16N-?)-|7-GM&4R*GsrHKfL-N%c4f2X8)cwO4hl0!lx3QbFWCq<=wd$ zqq4_m?%yvmH=c-_T364Qs#LgA`A#OY!&C?9)L6~iQ=&Je9$PK>m0_)bTGTYHM7cFH zG^ZB4*s(zErmKe1T{}06YfsgrzU}KR*i*Xy#XG*Q0rH9Au~MskOe_{#)o|m8kpXhPVz3;7vnpVBZuJ_xW<*)8=4mH)2DLF2XCw67V zFXz2Ka^F<%;{W}6X206y^^3MIH(S5{`2DiW_wKwueX~d^=d^f$H#3U}0|NsG126$F z7-~Lyx(-NB?`CIuwf!6ylZw>lhZ+Tpn={2Kgr>7jqC;;&m ziRlyBnM5=|>5mI60y0#BA@!h<^OD0C8C$RTZ8AWjr`KvSX)&FW0_oD2{#66$z#J_m zDds)W4AVQcn2ea4^%YIJG#yo0Scuo)-xFm>C$DeL*|``}$0q delta 123197 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
0I1i@1Y*4&oP7 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 G<9`8Onu*f@ delta 119028 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
55Q{%?OIVDD$~Xzz+P-^*vM%ATo>$;% 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

3|+7EL>y`hP~v@0zIX8E{>8|KIj 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%0A2n>5TD#2P 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 #w;fs(As! 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 DanN2{ delta 118790 zcmV(oK=Hqi&I6C(3b4Lz56yGRNG&CNU1G}t0QI8^lg(}$f9xG=Qya{OOh-S zKS#qT4e~e{e~ROH5M_BV7_Ey=d-ccmkE`v|)!(eOIcGoV27PfBK%Nb8`t$eSegECg zu-hMp`2P9UdiUQ2`2_%b<6##GH(TF-Cxl=ES)M{t7@dvJ{qra%SvsCrK3Z=1Su#$$ z5h15hK2C>-y*>!??nQIC=|6wjT5hdp@B}sZeiI%TZ%Vv zKeD9|GJ)XL=$S0a%F2rPB}n6BoQX6UgOpK*Q1Pch5{@Ce3k=5jMUsj){rLPM?L{U~hqf_@f(9L#R}I!}XcE|Q+u+c`ScVrRa? zrauV&nWVo&X$Ev5+nSve59^Z7#&JIc zSf@ig9{cCZGbP2n&*Of!BB1szSqq-n9S35JU{6GO*SA!HP^Eax-Aj{!xXAO-`pcL7 zaj-JZfQFx>=P$3~Pw~sw$!Kznm0l#_hfy@be^lE}le2$D-5d;Ki9M#DB%j8k(;Nv9 zPnDvxh|@06ure;iJ&{jFkphW-Z-`|gu#84AM3g1zVvK^22<#Cu+Wby9^y!U~W zCx!`_`d|An1un zIHN>JAtf#k$Ahyd)&7k?kj8THgOTf`F#{t{xYmjMENUM&h#UtHD9vD;<>D*?lVc*^ z-&dM~KR_QO?rPIoP(-eEqgkktvSyo2(k-O1fwFEJEdkY7NIFZBeiRHFt(L8MNM=Fk zp{!TRKLfYnk<9h>#U9~9lhqCKf2J&QYmq#_QRUI$-z^@C+nA?pQ)}rd7Pz{^!?>?Q zk+`DnR0LfDaS@D05%daD?BxA%YEhWVlPC@0JJkm$z>7l0=_xgtPRv+YspD<%XQM(@ z3T&2kfOI_kgugQZ|44bB*b)E47!ibF6hg!Uda3~AoKsbMTCk}y`u!!De^33Y$`;CG z)tQV(Q)*8&g{lH)Rgi8vmxb@UL40QByC{ll42a^79$GfWG{OP?rd{K%92HMAK)4yv zLaU(#xR4>pxl0I-#e%iU0?6Sd4ydBDp!=!W!mfu=w`%{VH{Q1mtHbM7qC{<}UbBU$ zg+nCM`INtF`;ofnm~DDbe-g`E(T!Zrf?mX|mj$U)Yrj11p!CWPWrobb5HmDDh+@+6 zbn%w|4*x*}(B(GGWmeZ%W^PkiPLbTJl1T3ra2#TV&{u~f)$*3>fJ)=~R#wxl;c$+D zK6KUwP|1y7|Eu8%qF{y&PKD|UDd{&)wxaViax@!Y_uHykdVjw9f4lZe;CA7UVnwb@ z>@W!9U^ttYB=i!9))9jd4vbBYll?uL978R73;;qubY@X{6GizvwA%h!`!~O2M8qO-sEe40ExkfVwQ!YwNJ`h2=9gAo+#&%-2l=m69r18>jQer&f%Mbill zMi(>a_&?TB_=HkGf2l@}C~1m7v)Vh9OSpzKyWAK%83Q1=4OU zs*NHo7s05=qHll&r4)2=12ZYd32MW30EB`%%$$`P3(6*g5S-pL2q+NfkCJ$pYwbW* zAB8nZ{ zfomnM71@@#x`hOD26-}Z0j3O+uS7T}4pUHR3f&v%QHC)*kp0qJDv<`uPoR%;2?>A; zfBbqg2jW|C+5{wzGwT{f(jYN4jnH2hb`Z(G@rd9xf1)u0{(hmz62X1wWL>;Q5!p~Q z-MB~Ce-Le@ONT~BwZr7aqj65~7-Xhd`J{*W5McNH&4}6XKM>+a(PyzzB*VihKP;2AR@D9)Xpr_j%is8 zA}Aivf6m#nnIf3s3O{N$Z-Zl-^c$5Bf7H-WDyx&-vj?-SDP|VW8UKZ7`#-eA zOL`-v)K8;_vd>?VP9?ab95Y)Dt2-$;FUT2$jHw4fy<*Fkr(@7muh}X$WVD<|w4Bh# z0GY;p>C zf1`jmw?_D<3D>0B`A3IKf9p^5)6G9Rt$%=XSJK4z`+gYb;4%f$#%-Bx zQ4+){>4s!@38|KW(5tZzd=)hXOcPiWq@hkhn2v|xArDFnSzp`>=q6c{v9vRA0xZYL z1SOWqWYVFsK0LB@j_)2a;P8x3*c)yaqcr0A?~nJe`^)o(4fw-g z{IwOIr@`n##_+{6nxxW{Q5&Hs7~zC4fmGF2Hi_c4R7?{a#UEC%Twn|B7IoGI{X7sS z>d98JDs|IOP9Smp`|qG--P&7Me+@tPO|VK~qsTZ19&MKa`G z1Xh#620VK0qjkX2^!YIE#ob_tedY5w2LX-}`1PBPzt$0CU6=#M`5!-4Sjz6MZ70yW zdeEE?$yPj+63VF~2c*7@1~Fma1KAQn#ZQ(gNi3WQ-fu`tDZq~!N_#{Cf9W|S;9a3^ zD-s3x2a5!f)&rHZ3`@b`ZfHZ{wNRL?2qU5CK*@{-VJ}7s2o@_cL+kmEZ9@emFH(_= z41%PB;;i7iq#_HCN~VI-m?xyk&&*TS;?a=V*o9nt#f=8LQa&jtrty<24Z%ntQ?4Uy z9;&UrX(+Eq$|$S~9}E-qt?Xm6l=1ZM$q_?t8(PQh$UkYLNG;DtQs9G zso4An;B1Uyn7G3TpM)~(&>w!??t~3%RYeJP6^FE?a80~G%0#cdf9kKTwgt92K@J0e zfUz)6{OFNv(RBa=qbf!+d{Pb$=e`q8dkw7_(>xSHFbnG`k20aU8c)_96G~;6bE1H%cHMRuC$IA!PGx724mkyz zQ_HRez@keqRJ()@f1mtN<60GT6x6sD)8U6I*W&Uo>RPO_ySWzReH_;UMqkIZ4CA7E z)p^W)oW*b}I!wU_%6%%B=J?kbrZ~fO5#aDFr3F3O=`2hdO=CeS&tRdn$tb6}D#+G1 zDWZvU^?AZ`4$yt3g<7zTNivo@fUklfV$f7joVR?37?6R2e|3Q#(4jdEM1?^Y34m=i zv5Rpvh~5U2f0Tla;oKS2ZNCpFSHT44*>J8YNMY$&Iy~jr-vhBAyI}cM(EayvXE!

3|+7EL>y`hP~v@0zIX8E{>8|KIj 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%0A2n>5TD#2P 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 #w;fs(As! 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 P0+a6M8wP5q0ssI2F{i*y diff --git a/Moose Test Missions/Moose_Test_MISSILETRAINER/Moose_Test_MISSILETRAINER.miz b/Moose Test Missions/Moose_Test_MISSILETRAINER/Moose_Test_MISSILETRAINER.miz index 8c8eb9cdd4816ceb3f053ed494030ec8d1d98f5d..03f135f9b28c5b017ae3c569b0da449ba98176eb 100644 GIT binary patch delta 125050 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∨=FUh$zGseBpsv)ibC< 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%0DEL-S_6d+J!oWlW!z zTv%S!+kW+<)YbEKPOidz;`ON@3oHIF&B8(aJSYK&UZF-ADXG4-r#Uqj&qrW67#;2E zg7I9Jbqw?7NbVf%3n@&yb3PqyzR*U5^83+gPkNAMRI0?}S72PXQ#Uy~Xreq3_H;&B zYiMDI@M0h!^q^1Rbj)ywou{e1Tpt8n51{jXu~alOyd;_#W4IjZJ#nft0kwK5 z!B8o&Ga$2R3FNJ5xTjI(`@V2-xXaB%x z@gJ^y9l{7N0JF{Cxja++q^OTg}aiH(W$^$ zL+8mx_kQDsuYHo5VCjLn$N0u4=KL3xs_*KIM+~J8J5YUIT0oRu30TkS!DfP^>kt@O z@OQZG8=eO`hg0aE=%+8O*@ymx5qShxDkU_Ge^kByH8|ns%CaEjK$IhoNg|-5v>vRbFegh}^9;i-@i)1D5ZFU72ItkqhtivfT1=4vdn-XrI-;9Gs-DS?71rDme;^V+~yZ}!Ym_KXDG3TyU zlswkk)%13+y*W{>IHxp2V z%c)OHJtd`62x^7K*A|;#UcT&(!x~#)jV~0qt)k+3upUE|x`o)c`zl0?;fvse`uyh$*)(u@c9S)`#6lxG*C*d*DwLzcUcUHK zVDtGtcQkJ)DIwQ))EUm@^En~<^wzsVsw#zsayUremvs|aI7|4vxDJzcDvWhY;U-`r ztE<_9`BcxGYUDHjYN1>l32>gHRl(X}23R|s_dY=3WyF?bOpGZ7ytvr-(nrw~{(+fw zR<~#8I@~4n*MrXy-MiZZ_OO`Bp6F&|uMLQ^W=qZE!{@{6J!>atUy+SC{1cGuiVglD zyQb3am3vqrkT$6RJw|Wh_%@?g8{TUOw61z+ZkO3-odndR|JQw36h>Fc48qbUqc6NQ$j&>Qv%UV`Z_LWFwN^}u~J6bmcl@; zi+vPLt}QSTIc^nVnxzRYuZMZNc!%6BaaD8zZB1_ z0ed<*iJN|GSUzOOr%Xivm7#ZftZE^O%?mA!jrZi2Xt@?_K__yZcK-*)t-q z8AGytEmvY+?>D@&hIzOgpQg?ON3I@TULJnCjTeBnIz9n41Og$3Tme68-0}H59-!EK z@Fjp-k3JWj9Xj8~+oQLruY2=cVQR3i#4p=4J5)6t3SjDwPUoWo0e5*?MZWLVKFenb z0C*QeVwUo)9cB)^;%)fbW{VKBO*85#(8=%okuP8LS;43tQdynANqc`e)Xsn zU>8Xyh_rl^llV>FL1_OQRT*ENE5Ykn>vx^^figX!?bqcVPLsE%*)#9X$6k_>7-b_L zkxQUV$)rhbHjTYq+*zTS)U~EH=O2YnRBMf1qmg zq5ZX?*FL~$oRCtU+t&He)jp!$ZMY=<10XMOJ5%7B5bs&Om&byEVE9v)8ky-5HtvT( ziVl|H&lR_5iQzrMjM-xjS}%DfKa1))P_xs>ZQt(=55&P6H;sG=)}A`qH~RCP7xQAE zeRVD-_nG_F2X;EfEFYk$a$mo9jwji1udo!HO}K4qyXCAQK}7Xr#wDNj<{LcDczqx} zVf+n$5RyjcnniF=E|lswot=>BA~TfDj4QWvg#v8W>OXnXv z=9nT|=!>y&yk7kyJRbfQ-rB@h^eQ45emx~XH12n#XV@Eg%(4MB(%8-^=1^9jyY?

`t(zL50!_ zzEg#y?;{#$bkM-o5k{?i&o&`5tpZ_I>hX$i(4Ec{U6J6n3@Z_S_RCi2MuBJguK>J4Bc~YAx1zDe5 z>G#_6rsK7mQ)KMLKpD~f3{uj*(u)htos#0-ACm&GUw*`ueaOek>tBkvOYzhh8r+Gd zkI*D5#J?Q7d8mMJ-@5-fH$wPxSwR|xV%*j0BpEma2blRin1HcE19&g3x z>8Xt*(2ptWtyAeiRacEWN8wT?7c-iE(2C&HjeV!%A%Jje^2g78-2p*$s!!=}v)u5; zy6ahP6za8Ge|$^Oc5Rljkv}LI&x_-U76bbCc1uoOM9TZ~oPt52rSef-wUnqRzqiF^ zH=K8lJL6RvW#T%#N5Y2~3(a}4Ks}u_TUZuT+3Q~KSG#i)o<(T+Qti&{4&}jBMdJrL z0$nBW&1~_8V+qEkf!gTKsKH`!8RyM~J&lJ;BmSK)rW3h&k~@}b;&w~4C-NmnNt$25lx>U+>XpZv)k5A1W7P=3_udHKnv*L#FX`pNoE!&c=M9QQ18 z;*kE)Kxtf`&b3-f%(H8QPd1DMhA5c^J>0As8x7ofJG?s9_2FBR&w8FQc9vVx85}p5 zstV|~e#5wF3c<;o;3Z-p6!Er@DIflBj0=Bb?NOmZ`?c<8#zUg-%bh_&j*s+MiXXd} zRNlcyXt#cx-kdcje4K()-m}|z^^CM+SL5Wu1qx4DI5oH}!&*sM4QEl!ljr=FCTAmw zfQ-BPLEMhn^6d31DIR^3uk8vtr4kH$;v`~7E`lKXtsFKN&hR0M9RcjV*23SBQ7O!& zY=}uZ@I_MPKdagIiXs6xT2P5-lYEEHnj@Vrv;}V>0LZ^lf&0nHUKAb#0$PKRfGFW* z;c9J%^l-CwTc3Ocn-HYGI_npx80(f`LPWy!z}@8DZI7ha?bp(I9L%<2Ih#D&#aaOb zpdx?L#(y=FQgLA7nGaa@M+mdfl;2y}&b^O&vB<(yEq#5;YKqHwEurn> zPvV{yq_H{d?h7AReqmXmY?tZ=^7*?aEQNiV=dqZ2+D zz;{d2XYar5+S2iN8_m%w;A?_1L=yJ+sBKEb+sCJ-=pe-t_6+Xn<} zPM#^$L^qi<9!`JsP-^pI$?Qvws~RmZ8k^ua+-wW9jf_v!6!+>GxQ%yANsRZ1jo8Y$ z$~wrOr~fuV@I&wy;|XWuGzFf1s{i_Who_(VPg8=R!u3kN{#X)svLH4}u)&C@Dedo1 zB<^@YY}zow+D`xwB&#rpd%faD5|9Ri?KjQH;nVz%C2np1#}+)u)jjOtO;8u8p{#PE z?BPuw%ANi{|EFmYe(|vjl@=jbDR_7U-Gl6>8{38QiR>*G$fnYv+_r>80_`XhZxfRT zo^(+(1d{8sF}$`RmRI=GGfA4TtLeb4;D0ndvI}Js`7?-Iy&yaK#M@-#e=M$mGNA`l zp`m}q>cRa1*3vKA{Ev)<9jk@ipRQ@=;2Bu_o|?`_eD%tYUtz7A@!T&(awPwjj!s{H zxy!1peg)jC|DV&Sl|}I^6GBk^vG}5Q{zG(NsVy-_;9h3^0D-VU{=WVYAP9sR#TAFo zOZ0yYQ6_QtjCgufD6cqtmb?Fv?jdQbe|Q4|aSet*82%Rii#|ahrnIQFm-tMmJ`_Ij zKRR?!_>B02To4ozh0kXHA0+}Wp>7MH&1ZxV2<^X=DDXfaPWJ^}ppO-m9vNupLp6~| zH){bW4~zdDn*nO*A`#R!MZ6N0)S5Hj$^15S|q%AZ#M4`I3ibN~PV literal 235549 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 #w;fs(As!_<e*;@|>utw@o{cx# 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 z

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

3|+7EL>y`hP~v@0zIX8E{>8|KIj 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%0A2n>5TD#2P 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 #w;fs(As! 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 diff --git a/Moose Test Missions/Moose_Test_SPAWN/MOOSE_Test_SPAWN.miz b/Moose Test Missions/Moose_Test_SPAWN/MOOSE_Test_SPAWN.miz index d85f80c1b6fe7f7576fd0151e026436ed13b246b..bc6277e00a4ff97c46db2c0bafbe09dda4dac135 100644 GIT binary patch delta 683 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

7Tk4x!tBaMq9v60Ay_lM9Ja!Ob+i<%Vrt&t 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

7Tk4x!tBaMq9v60Ay_lM9Ja!Ob+i<%Vrt&t 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 F001Qcitqpc diff --git a/Moose Test Missions/Moose_Test_TASK_Pickup_and_Deploy/MOOSE_Test_TASK_Pickup_and_Deploy.miz b/Moose Test Missions/Moose_Test_TASK_Pickup_and_Deploy/MOOSE_Test_TASK_Pickup_and_Deploy.miz index fe2291f9f1b93a7cbcf28c4f5dfd0ecbd295304a..629470dc493427682b63c38d9f3995601eb85f3a 100644 GIT binary patch delta 727 zcmbQLZHc7XzsWHv zMory$+qt`M-@eMTtbY3S?w>5rPMs&qIQ;E*GS0v=}?p%yf+2b?!?-!XHPsB~F zt7lAADqN|2CzIJ>s)KZDtmf@0(VJ3_t(N@CuvS1VYMNG}+?pAhQwv_~SfF;(RYU2n zotwqAr)pB)_VpI*Dc%3#9pBdg`NZ&8sZ~EF7K^QFxb^V7?w+aX3QOu61=jzUUHI49%M1qFl-&FNGK-o)_!R=MBFwToKw70Pz5T9!JkCF|^z z&Of{YdYQ9s+5`rt2#Y^db#15(ir#VBf^FjG>rDHXR87pzwcZn6+xEuli^@&kU2_YT zE@|TMO*t7{zqoJNypA)ePV<+n%SwHI>+T)P*a8_H+m(`Qe;K9+rv5IEnmF(J&#uo? z(u-XpjeosQ^tk8V_f|wrtKMYS`|Zy1S9dsvn(E1v92dwFyE5aK^WGo1Z>o3k|9(BQ zU+wbxMcbE~tzUoqe%a-Fcix}AStONnT70|SQ^pyw=YmYC@aRGDO^Z*gJLV)o8unEud($&qP)(e!8=Cduixu0YXk z#SGK4T$!Ai-AWjyZvZk>?v*ewlqVLYX5^O^rxpizv$8P&fe;YBWMN>KQ4Zn(02;GA AI{*Lx delta 118754 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

3|+7EL>y`hP~v@0zIX8E{>8|KIj zjatIwR23jR)kig&(%n(J@COTH>4b^gQ+Yr_RXA6#+8`Y6j|XhCROPfJ07L31#NCU~ z7FU)A@KNIp=JDK@l+ z+-yKHBw3tE`l#RYSbW}ug8;wRln}EL4|~M>VX-((Nm++ryXa{&NG_wg(#K&-9YpvP zO*~azvvZpnMppJro=TwLY!w}z?AHxcg|(Tlg3t-D{3vMe72-Hc4`$;U{VA?KlsX<1 ze<;zM)h;0leb_Q%O#Gv>0A|ASAxQEL!^_U_b)0tl5l1+WdM)G313kc*u|s;%VUMRm z#fDk^)-G+Tx5I?melZ+GKH_p0e5kVhuR&f7p=a zunEi6hNeteaf`bi-G4O%EEOdvm3lD}XUYUM^vK-Zy}eLH0y4ke9W>q7rf2}!= z)g*QvA>YCu`PL)$vq-AeLpz()3FSlR~ZbNQexXyMz%$tpbJxS4xYeMBA`4 z74`x-S)GlyRdfutp;SPr+bh`YwAp40CBY)9f;h_8{0U>jLYIt9nv<^_e>D-wE={0@ z2@SB>s8Jwi23Gy#3S0+aYTpy5Lq^!=cACOMe*+pp2Pz1vxE0tPK>8u3t8tSY^n z>t$5S?w6>VThxUR0b1`ze?2O8DMi$#^y_$SbNcR7hIkaBhGTtFI)mk*W?7?f98Hiz z&=MZD&p37{4753(VPwF3#}L2~mwItP-$eDRksd)*#o{UP^}{=)E`u6P)zGhF06t=T z)srC@dN>loOKto^#0^9@gbla@vpo)7RUS=2z852lDfW_;OFC~Ded+L&o}lm}^EV6htoz#`Lg zQ-II8{p-3_e@{I@XiC;pO6tIY?dQ&=;ZWsUe~hQr5zb-UhY(kHnT%>@7o%3K zip~#Js-T2hx0031Eo3iT1c%UK2B&PbY;a4(Iq$+mw{FF1nlNs_@QBh8EQ&c3=A$iG zO6DCEim&u2BY+7C)$u@5F_=9#)`h#GRZvmyzG~QrU$Ko@!|fEfsiI|PA*V4b1{tjv zc=%)ve??`yZcyEBBNbgvMYg)EbEwj$TBXRFdg5k1Kw?)f2yj|yML=b;jq_oSdZK?# zJH1NH?Tx9vxrv|HwF`0R8Bzb}mY~r8p4s^(gwjqK>JBJ#GhHx%u+}708=zetl_on& z_(y?CT^tFJ>2AMY0=31~o+nnChYVA?n$*9Xe{PYm3H#RNAP;p z5joHt{dE-Q@Q_Nohqf0`x0GZtRZ}svk{8l4>bInB{!Qh*MBmz>D<=8bDY8qN%S)wI z7ZX_8Ag|;i7Zr7)DVJ`~RD&2JSYg?VT7t_?mgYFwc9JoP~E~%Qgth! z^0CxkA=*DwM0bXn8(Ks22YlAUUE}@t-&J(FO4}YG^1fM4fSl-zX_E9Zh-yU2Iw6F?033U$_Y7T(&+S`cJrc_JF22d&X70NCgCS$Z z6N@xrG0-V%O$H(0JUQ2F`J;;cxZJK?%>eX!cWjd`Ef1fy+yLxta zx%`h(H=f|N2_P(=vZ}irWL7-AhkXor!2t+88lzX0Px9$gd_o+cTVKW5)C{y0$XJ8X z#e>?ynofg~s5E%IuZc|A_-*W9nk@lV`7~;k$xuab3uD_vK*Jic3RTT%)B_Cc_pb?f zmQ6pK2dxX>MHXm$G&E4Ve+>U9bMrY8zKRb-;#sdydTt1&2MBQvPgt3mZLjLkh{=2o zj_%&Q@@W9Svs_*T7@6KvWn_=?tieDVNbG#o-YJ3d>Ym)Nsi2 z0H6ta&#+xncW(KbJTKoV4Qep!M5XW>Bo=O3lF0IokK&C>Vg-e#e@PHGWx^>mDdMKw za0<_n*w-9QxfTgCvIL7+u*r#i_`_A287Vk9gpnV(*jkvj>Rn#wlgGh9fekSx(4U z58#G{i;Kh|Q6a5SfBkU_7!Lzz+tnow0hoLMH=C*J9uypJ%Z*^uaUg-xt_BGm_(2pk zRx|g%`BQsPgpDPgqk}6k^eUC%Ayd?5f7w3*Xn8nkJ6m=YT)s}IRj>{an{^0+pNf4J!FJ(9iR2(fSm_p@PaeKe^d@R05kZI_#XaP<53<= z#vheY<2w!`=wV%rr>qGe!}jEvc~(m>2q_Jm%HuXW=TG(#YHUgdNh*JFA$qi!!w19o zoSFxJXb{OL(@ohr_#IrcA*@(q*kUq_L{Sojyuv5L$0__FCWbIr9f$#w8fO#5_4gK$ z4Ww+U#4a<}e~aSFHyefWYNMJNklSfHqzM)lLrm?U>9S~6p|waj zA7atF_VD+Fe&2WyByxE)&r|;Ze?|qNIQ30}k;oHne=U?xH{lNo1)S*53pa;e5=R%8AJ9E3=VX_3tNmFh;a+kc-R@2_K(Up8TW8}CBuuTG@@)g0 zqtM*V(eNxZ!ScB6j~WeYavt9@`h#EFHqA35V^)aE4I87Xt$Nzx>L+aOHR&?C%Zv-l zy1V-Tf0d>tR34@BKq$Tlt2k-H6VuHu+y;MUF8ORZ(>R(b&F08^A^1iJK&ZEe*>f@v zX$@qw-*IR2~VA9%mRhnmq;_J@f#u z#ytl7DN8tTub0#E=o%$xyoGs=M0~(g?G0cWx>4{!cK#-zO9Z+}fPWgW zVYYFLYq{egh!bT5eE$g-t)m9)B>OpnE05yMufyaW&!eJ3eYwWUW)hmR4;g_mN1?=%K= zW3~p%y4EGo32sFf3!u?-y<5_|7v$6|YJFC+(qE6|!{4{|?fu6rlG&YrBeo_A3KsP1 zUuO-oI7c4`Bm?<14FP2C;tf4AbH+1Tf4u(yY1mUCG{NQ8pt%SQA3XW}q|pd(29db% z=(~)O72P~#jk>EGj}EfSnvl6Y1i5u!y-})GJwE{GcBZpu(40QBzli2vqwLAATRozW z?(Qz)p**t+=Szn%AoQUj+L70Or4hcXYd-);+L!C_IrJd4`thf7#1j zv#%8cc6Vn)0FMR5-`|44eS(1u2j3P@OmDdy2q0m4AehtZUmbpJuXlUTdOImr3}5nh z7Rl?2Lex#wD$>1{ZXP*~kj&*cBGo|aR{Hp+rzPiyZ@r9%3oKvm2dU%N57|YeI^a_l zE41$!9oKb0AGHAMSJ><6f1<%9f8ED~nCB5)$%-%&rToVTjBFUd6t~d9cQgOz0^hg~ z#yY9m|54gjtn|WrA3-H%qpC`>y?pBxaNwJuaNnqZCRqU<4T|0BXRgwVrgO%6xFc)K zTEqMCcP%I~NV7PF^S@wc#U^&M+Q^E_k*2cCRa}c(vEb+&W_2cMG-SixfB!v~U95b; zpBZC6vs7@eInaln`xH%eGi7Va>c;~cS6MX+Pp^E5Zrt5=3*6z%_tTgXlA5od87iH= z_OuS=9aoMm3X3ixTUqB`PyWIY@9WRMJzB)8orNpU+enxmXS5b}pl!6SYXaXsrhI^J1J-t^BoK~2Q9 zg=Jw?QH9qMV;r~Sk|GHgL-!V!H8oFL%Q5b8C4kCez8a!A5>`yRLJg?L+K)dLifTwH z1n4H8$j6V2r{&cTe`TZ5R=ShDgByYldUQ5=XZW`SfKBl_NY4`jd15!9&t6lCXklxf zr}#mwo^vAl^*DuwicX{LY^iTGuxA@$?nWg}crW9S!7@j#)i);$=FXO9UW~!or0k>4 z1{Dfn-jKs?+`})3`~=&L{kF9=xKI#VQ<&9N5kiU@(wmhXe@gb|<1=XZKFzw8!6-Uy zisfaG{{LJcdMnKJ^lp-=^m4VA3v&#|uQR-;9--5!oCK++vW%FP^&6s?d>Cc$$prlo zj|vQ!HJp|#(~J}LpuJrIo5~W1p8Cdw7~MC+ke!W3m{*<`NChBtNU)!qBo}LSA5_fgjkfI0vh} zp-4|}pf~!Qa+I`0))=&t-!|xqdi<<=4^E=5`V!Zr6!W2s>Ll7-SWYru)R0ob^>hV; zR!7*1V(L5VO4v75*yb9$KWvmzWx@1ZIsH_6fLo1>e`;ca2@2)tzzx-1Dw4eT302fn zs;25nS}lcTlDY!fkWyhXZkia0@zTk(z6?FaN;>)zbPEuJkO<-HJnlmDE$?$Jb1_#i zFT&v>NJC^`CzgW5;fqnU+pB`q)7mV>YB5H# z+2U+=!!^&a_$Y_i+%1og7(R1Y{69Jj(#0w&e}u#?0?RGWB4eKWHaU0cD67_{e!%mj z#yc`R74<%UfMWdlLew06=>Uc3UDXtEioa@{MSa$IZH3P^ zv%T5)bJ?qS>9`3w*fTu!MExe^RAmPyZBW0@X&Is@T0;pTw)S|WGUgkZeC1zx7e|r}Q z%1X|C+BNf_mB<@$xT5CN7E3X=wwS}iYikaDk#jGut|iBgY1F2>VM;62yyj3!K;$k1 zI7RU*IWb$%$kLn&Sz6F~%H8cn6k_N5ib{FpQE1$oJ!;{BXHh3}YXwQLY79-I9sDo? zds2i~$SLiV^rOdRb;Ggw%90fee{#=qWc7t8mSMhu%suRX8zND}*EiP31VoaKFsnPO zGMWO&E*}xu37MGtH3kAn^D4KPI)mMAy3Du_Jx><_NV{3tN?CQL?XeROIkjPUezj^F?1X|@am$5Yn|nZ9O_(SF8M-Un(ve`HTP(U1ui z3$nqjOXoBS;KSRAJUB@c1hkz9zK{WXh-jPv%VpgQ+&9I75J8{-=kII?KkrMS;^Am) z-BNOnNE^bG#EN(d=zi%!e*y_a;HK6_)LtwJpKfg)Z@$_*+V+p50c=^ryCFy^*@?;Z z(dTD#*ChPoPpbr{Lv#~*e+nJThQ7QyFX%&RpSt?i_ePp3vpM-_Q8b4VTjs;Gib?4c zG7vgcbXGV%-?KAO-;uCB(x6g^0OjMtAn-H}J$@<_r$|?pL}gCS{z+emWp(J+0ue)4 zXD6xM?9_DO$Ai1Drx^QUMf%*^zKBOPNq9d;RFifYUBq40C@#^}f1rI*QWo*olVGa- zQtnaCSUxEy*IJWmLeVW$hpH_nnT?0wGIKe#OrrU$0u3)UZOLt z54ERQk-&>xu~^h<_zp*op4AdyL!$(cp9-!+Eq_|NmTJ(~f2G3bDQKtmr>8ZbHbb0- zDa^0!7E)&MIQ4pFu3R0iN5o(G+Qe#sU826|bFx|uuLs6lZ85PLJf1=$5cUNm_ zfLfo`eo~u8LsZk1pe-Wk|S%SeEePY=V1)2{MK$+B2YB@+YBih$# zeXEJm`j8&4e;OI@*TY~M_vqpu>@x!+8b=oxP z)7YWv=oJ1lCw>Mah4}f_{_J-dDnIh3j`#4}1Akm~$riy3fkff^<4&Sx;y{aHQoC7; zI;#9ieItZXD6G~tH2w&06IFQpVt-E^zYh4u z`t-g9s-~9=OIe0>IhMG}3uTk$z#Um#ySnRomwJ)^oBDaCt9-yJYQ zyPq9Ef3Q@H#yE*p%@+`fasg9y=**zjt)dO1U8|*-gDsemCODi$&#B?Y!BF69qe!Re ze$}+hn4=m^(F7dv#k^Tmj=3|OQjS)&QcQU;iGo5I$EevUDE`vX+A#`d&C@JyZJ4@s zGB|YAue+G6tp`sV9X}a+HJqpb==tPwu1*Qee?XJblNr`f2^R<385zu$$|qbQA`J9QH^wMbJqw+wlB5Jg zS%1A>n|t|_!==t<@ss%_ODc6hOBl9^m%Df>t(S%CA?Ote`6fHd{8L-l(I#e-6Vy zy*<$Z+z1mcjC>Bt#K=J_Z3;zw(OZ?t;Vq?KSc=h!CjYQjun}HyhXj9C9tb} zFFQYsLMs^nD9W;pvDxnvMh*x1f9>?6QE)Xp;+r&?F7w=rhGU3~7X=Wav zp~VHo^?!j|4#2_nl8|M610cYMr>e3n8ylm{h*L3av=*C81_;OKGyN##T!sSXe63TP z8eU*##He7o{QgKFf{+-`+U-@6)@AEwQGPJu#aK7R6Pr6eC;6Lk>c^pfe|WH6gu>b* zg8hSc+xw?)b`H12eR*tezCPYL*gu7T$8X{7xQb;N%isQGb8Fj(5cf(-`nR*9UKDaP z&MvS8X%IVZnk^6SZjZ3V!-60S|3egvlHoRi{mtE7 zxKe@0|0SR7#)DX0=XiT-f8xFIDW4tYMBCIyxdC~P@5?w&z_Xf#J3Sh|hTVG&&saG4 zyet$gjC47C*d_z%o>*g59RR}U>D#njkB7`4HLQaf|y@6_gBn=Aj?|7&<64Lo9e zB7XM_P&kuoe7dSYj~Jqe-#ug0>;kPla)H(!xIi8 zoCrhtctht^5aak?pC^llKx0gXo88&kk72U;px2vi?-KEwf5qS1;$Qvs-R9BJ>E`~{ z>Gsj<&3D`L7|`$TWI$MHD^P29HjlSSKb&nFi1p1dzK&u1a3{ln8l!d-+w}W{kHh0v zv&{pLmggwRk9R7`p}bf#5r0mDY?y>Wdgsz?MZhtcM01$DMxCc*zr9n*Gz%)v+JfaF z$J^}3mj$0Ie;3DK7Jc{_B$(;LZkBC4Xp^a~pgcKcsOf&JgKW~*-4|7YbiRln|6%V)dmAUBpZhOHS)nG7 zhIW@*6j9nN6k578Sq@cb=l{3#MG_&i!B&|4c6Xq9g4VyWKVpj3Vn*nssr8)O}6vzD=ccZ2M0!?KL& zdmCixx}vS<0i_R8Xa=ln`fHC_-tuO2b;vz6%wne^Jio=gjh|?wpyk<$H8eq&A<7f_ zId6-8L98oqIxn)(d0M1pTU}1BRKVYC&rJxve+Piii*)vMl3calf4d7P5u(p<`S}4n z{{%&IN_$Es=^`J=#&r|C7N>$1G3}$*cAtz}-RcfvCm=HFa3?{QBA=IdYQ7V#ySEz_ zmVSP+d-khc9p?-Y6`1Mvnn}Od(g%wo+gj@Hb-;M*d_-{8@Ct1+Yv@mwgk#zDY|K~Vyw?GOew0NAQzE4^a>kk@7vc;&)i{t^Me6%Wla{J$R`?gO0Vn~SsdsnfJMtOOL0%= zahcwTazsi{N81Pz+?~6l&R!PzBrQ|B5|nRY`XRk7vC}$B@p5PMx64^_LoYqie=r_i z=XsGHPcIYNqt#Z!bV3SzHcKzFU+Avgu1!2meyN}BCF@O?)B-$nce!k8osbs-R_XR=?iwolMy{<=M zq2z@Gx3y_G2feBC=X)Q$SLna5D-p@(z{sr>c=5_*@yKm?@VGGl7Cr^j#xcA`K`C4e_|8zp4yQD z)zoXQj-ul8OUE1MtSZRuUbAJ3Rzq80DrjwOTDdwcttCdR2B0fcs1;pr6=-&ag;mPA zNqwcVp2E-#;sDjF25>bMt6p4|qo!^x^LBn%TD>UC5Uj0Vj$S=aEAT3H?D0nGnCt08 z+B`7`z8$TJtaGb{7^W1be|{`uC711Z{lvJqu2e#swLOtw#6QgFbe0k0xt8sYzw0F= zWIL5qq;zcX*|A-Rkv3N7{T!;T^iz159IGfCzmi_$5u+~RVhF)at3;%^tw>8rd7^4c zq4Y!~nE7`6C2KkR?GPQ^`V-Cr)}0vkv)pdq5~+O9txa+#o2xfOe-GJ*(1)eJu6Cf? z9Ad@;FvC-W%i+~n8M+yv; zH;mXXMo?EwcYfEa4V+U~A2^pSYTizgqWmVgqm5c7tv|hj!DE=EERV9HOs1psG_eT7 zWCm`6o8gLO)rk@Oe+sn}=6+R55)n)wHKHNA`gj`qtAQoPnSe;td-bzwKslzU??JQtI55AUkcnK6CPEotqvm1#`NNmB_ z(#ss9B#v*X75_{iT^;kc)lu*drC*ERJ$T|DXl`Au_vFlntzwVdd;+XtC;u;*m$|MH z_a((1#QwI9fBX1cR~uK*Y(*CyF(i&&TW2gr`wR@ z;UBu!HGEk9WCYMdLJc+ZCfz9qJ4WV%)e$f2TCXidI-I8jX1Fd_>SjCvHli-v59Y zpVLBwR(C&x`S8{=l5EOKi}eP_v$R)J)@gq*IQX>x!I$aJG0c`G-BO(ohPj)@SK&PV z5{OSup7&#G|NJ$C8?R8<@;>|b}Tls!3H=I(eT-GsG+exLq=6+be&zQfS$u&~V?5Z2JTjzYz-tDY3b zSPyns*a}B{y`VMJu2~Z)y{FkEEh6b(f6dc*9sHpg_Kz*qzRHRcyS#(x_&mMr;xFRR z!!V1-LSJcu%mebQGhwh(Plcdt>Mx z>w{I%9E%lVbkQ7-HKLUPc^}pYJi~o*f3Lc9 zn%oTQ9WrlsP_esR__yFwg&F71piAcaA-_|n5!2u^0t5jUU%KwyqgU&Yaw3O8^{_ne zF7uL*3606SwBzwFMnHMdsZFz&hXgEmp2H?^$aIAzZi`DKX_=DAR4O4i{*E@b@e<56 z_>|6VdmtU9vS5xNC0hJOA`^;~e>a??V`>_ova3EpiP9;=f_J_oPAtS&?j|&43he7W zR0>1hg8deA4%gyF^+{NA{Sk!*L!=ImLxCw+7|9u5Hx;I>5M_2=EiX}VkNniY6joSv zI(`L>G(fe=q-4UcFAcqMM+tRABp3yGirE6kJ=|GEE(4$AT>S#n?lJ+GaySU*>hCss zG?c1IdGszgg4rSX2DJobf2g`Usgms7go3LTL8tG+BUat6M1M;#xHIGYrvXk+Utdsd z?wcXIa;;SMB~*!uN3a>z@e!a%mukw8ZO6XR48t@MjAq`N;p#)BNzTafM*686RFYAh zRoiF_p+Nj#TlShL^K4#ilq-be?E3Gq3m&0*VFp4 z8zMAFO3x$1g9YIQ90AKDfepw9i zBm}F!OjmRo#robQhH)}#!}uwkPD29T_nb>;gkA|nnn*R7NNLmf0>0sK`!I-Wo{5~- zvwgyS41Ufh|5xVbazHzrfvwrG7iIp{GjuVTrGz9;$ZRdukxk5z1@vP zmo6_K?<{U5#E_G((PRARQ+&@vp-%Dy?>72rueZlGr_J8YekFsZ93CQXs(;QC{<1!VZ%+0)5~m{j_JbU44n4tY|!^a zI4;#S_z{G?4_u;BuM^i%?zVoCw`J4obe7Qy4&*a}{VZc!E`f>_0Uax+yYVE4 zNHLqJRr*Uhf0`3z7LBAnIvn&S`IWlFo@g6<63SO3KY{#LU@9!-1d=*l0lv)3^aJ>R zc0=oR?((_%IiFAX{^L1s(DC%I=2IwZL2$_|1u4pu78N5LYsYP!B+2lOme6)gatNh# zTQPCE;x4daXip&!tus%uDOi+<-K6DpK8CkkC*02Rf2$dYY}AxQG?-sP@+h4lA+7J8 z(T=;cv`8fnRDdyQI>uY7(`0nbN-&N#Eio7LLn1TLg91EnblqieW~WBbI3ktHS$?C& zfCNTkBAmn}PNr-V=OI>mUXio1aD{U^*Xm9z3ecNOC}$`3XS6*_siZFx2nXaOPxL*< z`K6JLRG z3+N3EJ$nETRE2D0Bylv67BRYIw^KjyE$djM*+Le5%OYX_Aqw~4pbn7EC^d8@&@4@U zPVNfzQhVFDVn8H2Nq>TNnUWTn3=JhPWE4}He<*r(00<;(>??DyYo39N&nG|lW``V< z^D3RDvqaZ{NnRFS*kb90-;=qYl3|C&arn;cWIWD%g-uK6)hwBMOn6TeROwrwpF!Fk z`B&&(kMHGQq${TuX5I_AJlQyxClS|vylLNVSiIqrzk>0TYQu2s8cK8cShI!!8n{XR zf3t{4v($@9Wp3#Cjd4wY(o%p1^plRo2?yq09YQ(=6g~-yI~unMP6m46+;uU$l0TgT zM(UN5Q(5h{JU7XmdP!AWqynQSO=&O@HT!)$CX|*!u!s4 zFuilVMDp8$TNc|9;yMG|TyGsacF=wItFbl|#TrF5QWfdsl2iG6l#{VI#1Z<9wl^+2 zx|-G;$8hn{#kt|Z;0s!o)A5=ef2GJHiJ#i%UXP9jZA$D?8sjO#R2CI}fMa$Av~lB# zzDpDW=wzOne!uvbFqlNShe)5yGE_00$cgXRr6+2=mH?*Vm~bRj!t|-{n1Tyl0W8(B zX@N1*&**)5_GMp|gH`NwjvsvNo%uMo@hF1@nnjsifq$!v)o!l8L|>Yvf7r()=ycrc z_0&;5-7XdS%@3-`du{~5Y1G?+MxRvm_iM6&9Q-qi%w|x!NJ|K_39VmhGp()$AskBS zy?BxF9s!1cbkdru(f%vX^)qG-2#sbiz`=M-fxt2!yy$=3|8n@^ljHN@XI;fm1oBA+ z?SgkYEai#AZbbFO?=jPgf3O+YJ9UdDny9*Zrjj-it(Xvb03s*U!M!>WF4n4p3|TuS!8@>z$$C|ruKEI zEsh*1;rK{9i8pEEf!paCdhHFU^G^UaQ5uIogKe|!k?MU$(+D#Ffo2t&jYK=EPB%T* zTD!6ukFw%V)+2KW6@STr0bW^rKE*Lsf_v*1`c*b9?)$9YdQDLqPXif*ewdHb!h8m+ zmg#d3K06z>x-#vv;~;5x@J0XZ>C;>r$%e=l!S8`zOa= zep<~q>K_D@pBDM7y#=RgWQuOJmGT|U)K z({HfBWxuMfi+{)8@BenuD&{X?;&qg^zTbbl3)@q(8+_b_$84IFSyJY+76E4C7x1w6 z&U^2@_11g4-B$o{%ZM)b?OphL3o|hV!I37+$C}l;kc8JtKHb@S`|#uQgVSd_2iZ&w z^zi9vKIe%yyz6oYuDb+6uPA(&Chs?VGbbpdFjA%?8-K;6uFfoZJOYOyOp+}NU(#+t zd3$>$k&0DGGis7->4TZl4cyOkKLS8~Ll2Z{huRKjY2qda37JdQ;9JJ_V6a$>g-<-Q ziw{Ma+}r|X7pHp_{4<(9dBi{J*r)_a7zNR2JLT6>vRyvUtW^?oc%(s3ACdLyC7@C% zt=b-to_|s|B++)|?K-);z64#S-nBGE*Xy@+2)y#|>+wBsYYW}a_q?7QQ$Y}RLdTa9 zJvVe>P>!$6eP1rhH6Dq-oMNTiw*q4_xSDM)ZS|)g_w5q8BD^KVKgShoodt_g<17u_ zVJ(AW^ShS88(K;Y&yLP;3;NA1oiQyxWW4R=Du4dxhT3l+u(Aqyd5J&K-|O+fyFZP8 zi)0HNa%Zf<&B?CN?TdYWF}BL^=*yb_wGnQB&Z6jLBGt9+oAb6F^vk z*?*BFeM3ODdgB51k_0zO$y3-@^NAA^aISw(dla^xNZ$(@^jWGxaF^BrE5 zj<3L5$W(jtu(3BAv_Ro*0~=B_IE=w8S6p39^$*5ZXo9e1i!F_KumfuSo|H=5LqitsbCnZ zR&DpzS2JC$SPY>!#>KDS8mBm%q{-}I%h#-6<{Mrq=izRF8W5pE>9mvlN+o&;P&=Pa z?o@G||2(B74>~z3R6gx^E$}HWdEh*&qIm(4(=JL8tGwKxrN7i@c}w|7&;FkU zTjJ1W0EMcQOCLDH)QS)KZPgM>yy%V_gY6V$G==TGT^C~3Z!{45WuAkpOqE@30UZ;X z6s{#2bmR2+kX({*x|2R8^X3)xH zJ1{stwLrTIEmXHGm-eHSw9=~#Ru*D{1?L5M4LbG*v#a?H^_&mXqmrT^b${jV6s;5r z>iE;PL+Prc^yU2O7<#JaXbYt2B|n|zH zAhb^a)KT33W8S)*3xrnt@p7Pm@f_qn#td96!yWa?VWKO{&n7bZLj#?wa2@~ zYrAicd#@Gk*NRR{b^Wq+Eq5?IOeH9(D*qk7jg7{-)io*kG(|##bbpp5lkC^jtHD%5 zI-Y^)XL%qpYlHs|0qLT#t5vm{`4EBrcM`_tGA zPyP;Oc=ES0!;`7k^F69{#OD_Fgq)zZl*>W;Zax;|Dgv-@N~_2`enM!IKBJ!QZ^|vMC$Tu&KAV zl-Ewv4pXDgaz)IAk=O_Jh zd3r?s&e9M?-PDRe`+UU=ew`$isK2w$2vaYP!*fSk{5a1_5F{z?a4*EX@VB+{CRK~n zgI!avKEScz`G2imsBI2i;mO^Cj;YB?iUjClX4E(xha2Q&K~NudSBTMT6qsc6P8&6<|BxhMK6Ntwi+cPXjr+pu0D8`B#X#m zLs~D?^nU_qb!N8ICnkya%5i1Uu_h@{5L|!d)Ja8fSY`{RKuQ$z|BcJB*X3VqTXCh) zt6przld8uc9p&Jj)+azJU<<-aRmmg(L06OH^Z%{I;n{YRcoHa#x&jaich`Bl{aK7N~JO8-~J}Wpp`{NvR*Y5?^mS^A-x`IkY=Il%K>Qh znST~v#DaZMbo12{*FbgMNE~QCj%*eJG{E1r-$*P?Oz~A&Vj%l5L?g#i+^Q75rK{Zi ztbHF)eC>&1yS*>cFm?O=9f1!J&hFW&+cM_5PlX5^4LTGn#1Ixm)W*2;cOoiqv-4cs z@DO>1e&J4$r-aBc@}Xx#T5orc`7Y2C8Gq}~)lhzW4+W8rEG~n3Hp81|Q~R+7UKbU` z=}`)_G^|+J^y2N=ET6gUZ1=jWTyYSTQ>`t+QJE)>#ruF3S~y&Z$pZp3{P8jw z{lKwbEY4$0ThpwZw3cp8;k=knO0%9Rs(x3Yt62N$ms{*rv|Twnnsbfb;s)-j`G52l z3eZ5?s)Hrz3O&1(R2!3W6Y{vw=GNaz(YR5x%I8cw?={U!1IH&*n|UuzL^$*KyRHm& zM$690xEezUOg0G2L^nu9gdm)JxL*y(Z-j_ajM@-pvQ-evWR80cquZk9QeIE5An?~W zYOgOM^rm{OI^DI=8DF8ayAXJFX@6o17=rD@^3)>Q`XL5vXk7I2G8<*!kCibR{45=% zMPWPUIi9Fx&aX7bxbZb@UA=*<=!ww)a{Fc@0VJE-7ve?&ILAN6=@F&qtq;rt;xZ*h zhXN=kcGT1>?{qE#Iy^h-5B}f%`v30NhuQsVYXduVeQh{87#{dFA{%>eZhzCLpU68s z{1mRSUJCB?f*nt|NhF?%6)Mc3qmpZqs~E5cMbnC>#^ITROs?a=`&Yx1IGp1gXuqgY zzY9GcIWzKLc0l^wM8=`7>-&9-+ZX2F_>_dOcN-CpQ1NEPw%KKYFrWV|FeZuU@MxrH@_#s#`z8to~f_1bMtzv54;EFwr zv*}TqjQ#F~J_IM>tLz(?nMa0=TfwGMAl={~9IDRsgWaeUG0<(?kAHeK{>Lhl#r=Rt zlEe#6OyrK0n+$Novm!c1kD3wUMqD!RMT3&hj2_xjEnTUCt`ogmSb4*xI;EMYYAM?G`8Owi%iGqEnvd4Ira|) zRtT+I#$FS*{IlK8&VP4p)B$zvUBTTxMP+8AcD-*IqSXOpoBk@&py(rlWPtUk#&+Qm z0|r@gP?QAY-OP@5+>usxr6ykDw>_?>^VbHjzl$e9;KK5^18sCy_N^*~jXIcaSNr~+ zZP$p(blG55GB2uPa{JlM4B$bTnLRsWEf&Z4@Qe!ob8!_%uoia*=jYu9R2%Yy`M)L^_~sz2El|Hf~P zMrK|ks6K4)wm#A{bl-av?LQN_QB&*0(?)??sf~tilyzf~8z=r&2o`^~wbu^ZsFa6@ z+o(ULe&6At6)o{!4BKerHKJ*QsQstK?B)K^%sX(J{(pZTY2YKzvPoY410BUP@L$=& z|4Zh{mU+cVGX3+~_l>shDCq{r+F&u!{}H2+Z>(C4A2L{gRsRnYe}XFvlONKv%gc2t z@LwM(w6Gid6wu2N|Bn_8U1Zg&{Ez{|*!KUJv2lm!Pp@$I{q?*&%731&Q=|X-&>>~s zV0WXksDJkVShAYytXkP0GNe>Yy-Dxk1>65SPZQ_CeKF5(*Rbl}!FSlun{XZ6atgI>a&?0|BDqLY`soRe8~E~DM$J2_`h7qKg%AVj(>Li z0G9hNR_o8Qb?Vzg*6IzpMrEhnN{;exbAo4+E zc9@juRX)3GchtVQsi|iYdsKQyR%r@u1FPDv5|xnN&Q$`H*eC$ywL3KoI7WwDOb3DZOQ$Xo1#kcW2?J62&HiYXG-FrAU!?a)>Gf@TEJ z+0LbfwyWhpDv0A!Rvl_+Kc^K3<}Bz^ms+rvQJ5~Jv{r0jP~PqqsW{(o#=Z|11!0*) z5{iR&XG)QFc6=D8;utbnnNV43|DLO6aeoQGDY&~cSalyMDU0;yS|R+`RJzKwjjN$~ z8@CK=cgjwkT3LD1ybO6+|Gc-Zj4lFg)Rs3aQL{=`Jr=(|9VNHLd}6OKhEglqzJIPx z)9G9lcSV`rplc>jyb>YctcmAbhEyJ|LKxnu1q>;VQRT$i6I3xXdSVJ@&@mOnz;utd65WIpv81U{I}lIc~7$J*+1ISYGw^x<_j z88v!#85;7K7cu^+XI%ai6I7LPbt!_->I z%h#vd!83BIrMWqwbk^fdBzPLNwpYp<9|m|mpS#| z`6p3_=Ja}JhWuJb)_JX}BSQLOCsd81#lO+72J@E)u!vf{CHc;DlG)t?3n}x0&qN+2 zqia5L_XcPdc0VWN&ZlEK11xiAH=h#BIG=8pY7CMlw`nq?&vpZ+Kq@s(i*lCVRZlW! z8iO30?%5qN2458Q!F zX`!aMp@E#JR7G-QidO!djX<_JjZbFgaGFHi^1z;7Fp6%AsZ8#uv=S7`@N`f&y<64x z>>*?51cxWb&}|*i9`I`O{em+ql}qH+Rxl4HTFJb8tY~tHNWmjMTz|q0`XDuHLxS;~ zLo(7Mrc2^*3KdB|!dy7(h&9-Y3=JDMX1o#}P=Fc~s@`6OB%E7%WoS8a;}yJmmZ+EI z>LyFw-DJQ4OD~Q$O05-eusHXOH(TbOxZjo+ULL~iz(EA}66W)V_wkVc!-E$@t~=gp zdB2O{VtqH8=foDe#D9E&Uug5VBOgRHy@(gZ8@*}<9=ZM9`3je^5g`)Pod{a5Q2y@j zTKX5{qrFiMpCDyhDzx)`)i<02u+c+#$()O5(v`n&w&2IoVjVk?%!ANp(Av$?oBXHr z7=jYabWqv!C;LKY>c-i)Q-rkZH*05C=Um$+$HW5OLY9@SEPt?_$z;fZGF78W;q)G4 zT?nE^MytQAy7_~1vX?&idH&M&A#mJ2`zf8=@#uS2_~F-&@L|YaE1U32iv)$Fn|5;>_e}O^CYZHGFeI1VJuV!f=c2HxOK8~t| zO*^bHT({#|=d+?xQ|9Cg^qaS{|dH*)t@K@cfex*i;0iM-e z{pSH{{a^L8mFnkfo8QChzWchWQvKX=+mb;muvlQw0xbNydFaLjhK(KZ_4c^GH~7kQ z=zEv%Ie)l($9rEN;d=y;w{lqoBuU~)T@t=;G3+>8 zTX}UzO+wl8( zP~MdN-HQ!!F;i;6BZ=X~cu?tuN$IcjSf=YS(0}?xE!V_Rf(>gIvLs#q#sZX5+ggFL zeQ4azrrfG~zKW|+FODxg_>o+h+Bl@HRq#6xqXP%h&gByc)^i2Lg7;WNv7p;rN7+fE zej#J;fH8ODVEYoUxvXcgBQ6cq+aVY>Q(Esjyvpvw%j6668}tWAZistees8v(Tbg?# zS${(()k+PWRil81_!xa0jJ(rcdP6qMW^SeD_a0OK#i27XaK3FLlT3gsOuE~=DA`}3 zOG|m+WFtxcdv8~L_IGfr=?z0<%8Z(j>*8H+sKlco|Jc}{WF@LV1$b8H@J4uTlG@5# zu7WgEbT5@NPxdz-Awoi`-c)DH#iFWP1%E?I0J(Q^)Qm02VF}o#nqrDL-#)89B|uu8 zDQGB?C@^~1Vc`eC*i;%2^8n*q*AD8Nyv(04-4B{JZ}kK41|{aPBmd1ekG?rMKAr5r z-l97G_E5oz;P1aaP~SpK{;4|K`*v?~^wS}hZmj5zKgZ_{6+8-fczXEl{^8l{YJYSE zm+yG#8ZLoiTdc=ykm;(f6?3BU3roX@zZzjqG`{UHfFbjaFk^ESO(E`y1cuBNa3y$36enPWFEM)+qL_m-9sSJQq>NeUq5QvDQWi85l%*CA6Txyr;zs;6Hj?lrsl{odo-S zUFfGI{7CFnvm-8SMJ*H1$@R4El@;V72$ihV?`8E2_)E^4&@gNVwc>$k#(#rkcO6R> zSo%rUp4wzlb$+c%ppIoxkndP(J<~H2Ye=0`{|Qqs@Ae&CByoABYdj-_Tqvk#WU5Wm z<}EAg2F4}AUno7*3#=`$7-P)4DCW9To+15q43gsfV_8gppI;*^B+m8I zytJ&heI>Mkpm=Oj$EYGVqkr9x6#h{8N*Q{hi#wC;N|rgSCwVNqWEG!Zqt0xpqEe{e zd*k=5X=?N4_uf|N3DIZv=eQR=Pv)4Z6Yf6Z!qspkuIT`hs@IN`wQ43%ldN(8DB z0;>qQGHaDnkQbK)5fJfvXSzX9T@>bed5% z_)Gjry?|2;n+{w6|jMcpBGbNIjBg16$fX8Sx$}|-x><|ofk9H5=I68y|1po z!r*$#taw^9)Mcs*7Ju4DYL9rLXZ+1a$I8=c*)rD9*V)F(M(;N;vYdcuwA9R)wHuFjz*SL#5ccSQDsPk>rqWl%O_mIGEs;7ZslciBV=;{0F1PKI%$_slD(M(?yB@e=+;nd+Y zVYF*pYpb196Il0X&~L};*{19&&g7aMfSLnxJwtBgu1j@cZ>CVfwTM4~xQY#KQRDkr z+7Q^GjgR;Ce~mR#y`?Ob6VpG)5;UG;@6f@~Tmb^&M}Jk%%-datq12LHy^~2%*`$n^tWs4rn)fLc(DA9a?_=@II&$`f) zf8zMapQvDIR(4?dvYO9A>hN2%lx-Kxl>zk{94A#ngj;$T(SlNaH-go7vWJ}Rt?orp zgMGrbbAQTun(@|SEAlVl)%E@3lgS}eiRr|EHteP}7rN9i&Q*&Rgou77+MlXY zGk$~AQ$&J;G6=Hs6U+vGJ>5Gv`u?oTG9B0FMY~_r)49h;X}9DE)o+~u>~M1^)h=gx zbNzcQ8VX5;L?`5xuEx6bKGPc*nh1&<_|>Vtr+@llspp|>b18nfEOm~jrxZA>zr*}p zeOoD7UD7DX4#YIT#unk!`iI{XO;eT5En_!d<;L}^v9zn)wKv8~nO@aGoPR+9LMgnn_jiRq6FFxh7d>>CG7WWiu026^ z7Jpwrxki^wRX4kv{Gl$F#!yDi!;gFWXWnmszEbBGEzd4hE5nX zZmQQ9*E?}PaTC%XPY1Y!wjg^LxA!XMx|Ke~WmPp=<+c%Nk0Ph9yRs2oBWC3tU88g( zHu^<(B!5DdenWRO<3XZ3CcBm}S`T;C2`wgY*NhF9oYGEp-R6aW<5f29AIKQUpMO`i zH$mt6GJjfB%bJW&+7SOptE;oUDf>)*bP^c~K>;aElXAP)(_z~o_q+;GQG!GP$*`G; z3k#IqbfN-BYL&97O$6iXt{mZXUSH?wWEV;Y72@=%l1~20Y1K*)lo03#;LDtY48)2t zxe(Uknajlk`F=G~hg%sU7G=Jfe3Fy{Y1sYIX>4ui2p5^@hEBKYyDz{}N3D!b$ zTi7HQSju|o>*n0wFrsc>##Tj)r}})FZJk)Q1LY_5R+aj!+`&JdXRvrMl||ot(=X0l znt|6kvIeyAE8M<;XSy{+*mbimRv55@>WoAI>^P_t|F$)ZJ4>CxU_8D2F@L|d^RN?L z;LT+)9&3}tq@Z^4!;l&LDnt8&jdHtGefO|H(4>UDj0LPMi-%1h< zSgrHfrshq)txk2$BgY!3lf1!5w*!3vzOr5iX{lTb^aBipxalSZ3C6RPa-3{WjzL3v zFk3dbk9fG@J!R<_AYiSX_|V!3oLX_a^Zo`yT8@eJ$apg2(CL}wG=J~1xe;f6ouSXu zVo+mE&OdL-x|NC>HXz?OTJCIhQ5!CFF1n<2)a<+Zk4nVkM)pR*(wJ7o1v*LWn60d0 z)Hk+ zNlc0YI4QN`o;6N}wV(M+*~=Pt=>P5$G2;jGkFk$~a`v!+-}a^wCHz=j8zf4Sp`et* z7lnx%D>=y@CVZE^eT0a=Ld?_alh}*!x8`x!dKLtj?zv)~VSggYHnN!gO3eZ)ggO-^ zg3EYS4p(Kq8z&Ee;`fXRA`VKGa*%A5JG>$;%c7HESd{qDsktR-6rkJf6{F~{tdp1T zN<^GK4rJ%^yMxu#>1v$Jm@{}Y%)~8?ZNG^Io8~QFZ7-47vp#(~+lpjOYhQ$9ah`Mp+vtC0#5s9$ zv#|5T*wL=Ix0&ir`-LLcJa-@)NHFoexfn!5}dgZohU%@PF@~R`$M?*{(5965b zZ0g+g>1gvj=A(m@(KE1HlvL_DPvHgykZ93|+e0@!pQZ`vTP? z^`+ZJ&v0oT))z~i5#Dk}nw6=u%VM!kCcyeF+R62D3F{`=a!aQeCY=R+1ViELkjNBK%RUp*8|ku)Tw2 zHsyEB-*GWhlK?Hto6W>uP(ipBb%Is1*+SRr{(hMT-U@? zU$mbcIy!j4>^(XV%w-BBYb~H;tW6!tR($G4F1B!RjA0r*qd`B#sSvt&dwvb7YNrva z2SYN16LUXL%vkkWX%Hkh5mG9PFHJtjCvk0hCafFb+MzO&WZ{$&uptS^h~A`f)e@?6RTGA$731WM^Yrn`vHhlGM_$F&8(KZQp#m(U#C(CL|R3F zlb}@BV$aK?PLL63)CM(@N+inKOwW;9>4^=rZHm9ThR-A3P+ApG6M@T1{xL6&Ruzre z?w<`FOdJwIofP*OWQ^9!7iGFNiGNZmRw~44>5wAyz*2rLz0VLG^>q7e!E=yewi!RY z8&Td}pkXCx$AAI;75Un_V==p&SlXg!EOe3GQ}&S`(b&PX*(}(4V*7`$c#F$tA;h&~Fl>dGp%fReyu+3Dsfh z8Y^E)k*ROho_Bws1jS1s5p zX_7pS3MQ;p(BQthTo+oL(xZq>K7i+=hGB_u8oUF1SyjLD*>eR1)aX%B} zD}jr$(RDjo=>|XBUw^-hDe#|~*U;}~r3xZtK=GeN>0fMz!`^l)ZotVCwcFi2CFA>6 zV?oYnRn>pnd$^itI*o`|k~ogtI&VJZ=N|T8da961jR{hs&6raj8C4 z@4C@*U2U>$bno*>)SamZkSgzLk81>|?19>)^1DD8zlwY3%6}E&@`JHutyPogfXyfv z_E%05m@Fk*;)$~^!S0IqA(h1|JT@jn3n4z@XR&aeth~RZ#c?;mWUY+Xdt9s?u;U0rIYS z2jF|8PkN-@6Dn>(qKM&+JbBW{omC?lu#8ai*xbtFwR0^m6XA2dp-#{=(wC>LgZDB| zAVj^>{L%LvzEN*=l*jKU1GbUR-dZao6(1Dfx3;8f~=|u}7gby9&4Dq0&qfqX?dLR4V z43nej>6>vz@^slRP^`m)?cX18!egUs?|&{Q5c>&s(CtadVob`&W=aXY(h{*S-)oRFw!(R7u~IM;H2>u!jpL)O~qh5-C=`Mi5yP>FLv*z@Zd7`EnwDc0;teScJx z=v7H~RHf<Ew5mO3fNY(*K*z4U7AnwH8T#M zPaAR8@x-k#b3bs5b@a$xo@wsWM{TX_=FLUk;Dl%wQo5eTQf9OviF$mNXxgnHgeWn6b<{Dle` z^afeUCxQW@V@TG>a_O!i6yKK~d|1q>d{L6FTxz`QXG;n%aHiFrpICSXdam$^6hv?b zg_jj}t2+RGNidPJZ)Q~f=k^(u|JjRCmyo?BPUV004p_XeW)qi3EHq3Es zV(*?DxCKewe%+=kRAg5Ev5Mzsw?yD5B1lHEssQezMYZrWiJjX%9TXptK@K7c>pnmb z+fqLtHkv1ETzpEfW&W@76yaT9gS#k|Ugv5uRkR#FXD-jqO~i(3E9__D$}IY5K;h?k zTh(KArdtk?K()mJ%hEgq#(zcpLr;*S|6K4@Y98t=YK4)2oVhGivGJ=r_Us!jG#mq<}uUXO=#ULfMmeYaoF z<(j%X?k)Ns^}t)+9KP|YJ)~*}|3@51-5$4Wbp3dqKM{Fm;_fnk05>gF+Ed$AuY2$$ z6>B)po7RS>QND}<-G9OVMb<%Fan5%(WscBHlAL)0Ge=1#>RmM{cSji8qO-PIIFfDn za+EP{xfkG{WWJ>YVC>H%oS+zh#dosAG$79XPC`K%l9HBzjekdlk%PXo zMA_lUb?4jhH}@c`i1tGii%4HhVCVsQZ5rVRzX)ZdvE7idDu2paC^Js>w?7s5`wgFi zaBpOsM=TIGMYR-H?&z_}ja2`L%;3JJn@Bk#;-q%O`JsB;;(dqy3bBW!ZAzo|3^Lej z520>`Y5>qVa#*`$-K0g!#VK8+L;}Uc&9a09S7ARP0a_^^krj&O7O!}06pex2F@J-k zVM37SAp$fRFMrNOQt=RJxk!wZpUhd2(*u$DAhYffMv%|Ua*xh zo%WL^#ukcednD>dI#Z92Pw`b`mcf~yo5%-j z`-JFIvY6;|X@3zj|KbxiIpyhD@;nkhPl5r?YQ)phe7>tbFWM_wi@2~)#I^u|E5lWz z`P?`i;D15icMMyh@>o_`wf0>!KE`#W^AeNQytv|RN`n^4=TF3Lrw_N@JEDh&#!TTM z%)_BSijRQc1FZWBYHZYH1*f~0(@R?gANk^U(es8MhSfRbGhfz{?-$442@a6i=f^aY z0d-)b@FC_|(M&-tx(tJf|g)DI#$qIWbb&Y zkZyWMjUVS`VB~*k1x6PTgW-&x%fq7n_8HzQi0WustOOnj()c!Pg?tmN;u3X478Ant z*~euIf4g@sU{61&lGq+wZ^wDED+g~ zkbf_2#bnr*p&dbE?pyEJZz7HPj&kDyjl<`w7^`D^g=$$hHmbDNtZq0w_?Hh8Mb&Jn znK)h7c&hG+AVDaldCSWePP6HtFz*cP&G|Le6q}eJbFeZufI}Hz%b~)E1lnqzbuwnfc3-IoqN&q4{J-&(S)t7mT;65z*ixmCcg+8ms;QP{rzj~ z)UwlSb%ARQGikWm3Um`v7PY3@xVSeDOuZ>g46Io-N)L_6IolDiP0o^VzB4Ga?)4xT zHy&WWw<&ZXFi%pVD$(Cf)+rbtRb?I{H`R!z$!$%Y9*n(1hv58E?D00@%Jc9e6@PqW z!C;q(ktFky%DmyoT;Ir6B)Ktm`}x%B{3+m4SOxk;ob24FAoq=o^PC$cz!mHI(ab%- z0P*EP?lVU`0PrvtWb+V+Wi{lf)Q}xOdv!_S@)qmR&A?1YNTKA5ay{V_H@O!U$1b+eI?SlW=G2BI$ylY z8K*&n+$jVPeDOZccn@#fK!5k}#@9L8J-uXf4?V|X2=7S4kAZHfZ1Wf-xu79Wu6v*3IR)lCkRHVahv6{DmIxAG|%Ss(MzGWb>*E zUkhCh%5*p)?w!$>(-}1ml5jg0FvRGF+|GzLqN#x-Ral?GKh@_usec`=?>)BLdu;z# zXT!K-BX4Ym5BNhIi!D_{Hkvq~ObckN!xZm9n4C8>a)fZ1!k0S|CPzwmEwXTUKg_5=ckcv%r#_t*~=ZyNg313wo`kNcRpemGZK z8PEM_eq5gyt+--S&wqdyO@ZXBrswm*EN0D?=m3aJ8-z#)j6@Fn(tQJmRy_eV3CH}) zYR+R8QFW%9}-FLKo^t&F?=8F*{j5q zgGYxI_^q7FQYyY#GC<&5r^Er%uCdP}ib&pkv#nI7FM;8X)3;QrA-ZFGoSOK<(!NI) zrN6A3)#(nJfK59wC3{`wymB#ftWFQ#&D4AEs$Id$cz>(VUD=&4R7I~DtI_$gAkEJF zG%Hhj+>WQaeb{%azsVPDXkX#wxRsV9mgQC;?w9Apj6G)1{W9Ig zZ8!U{83h&e@x1nm`W!~x9l(b-58H41*PFe2@8sS)x%W=)y_5g7cOqi8M%GB)&1Kl& znQW($z%LPPNO&b8f0Iwb1I-Z>L^@}nd-`bh|9@~!1fMpzCRT_xis=91pq%Q9rJe(q zyjd!BUeh8?UjEMSw3^|o_r2@4?!Athp37xWr*A=`r?|XiFF{or7MkYp#oDxG$tZs( z`z~#2&=}QQqRN1h#Q*5%_X?4|Z zw13Ad@S(CGT9lSo6Obwb@sEg_`QfRNt9b2PQKvV$J`9oBdJS|E1aN#1$W+i4&Fvpm(G*sTO^W`(F-c9 zz_QHj&X+}FeQHE~rOO7h&LM}>8!As1-xcLj8$@PrsHh1ej_6$Zk;KaH^OUHXU4OIW zinoFLhYW}JSujideHKsLeHNBb8GIyP>0=r3FR?{v=@jhp-53`MK&Vgk8g^p$x2-&%M`$E?b@u@e~h>b>kS{m7OVL@O9p_;-V8=70LbOGbu8Tk@{K#l#c5)LU8jn zd@sKNz%5P182cy`b>;<^#qHT>Vt@K$@wjjy(6}>q z(#Bm=-o0`EmyNru{gBrCK<8Q;_X&6Pt8dI2^~|J^nm7S^sj}j@Gno8|b>?&UHMHn(yQBi#pHz6Iw{*< zIw|0wB5HttUy0jf-vTV4q<`NeF|>@;c7{#vJOhT!EFr!uY~}XG)y-7}11~ou9(XzZ z}4R?i|=CfkiP=Cpqe)0h8U)7!I z#k{(vB*wU{eH-M=9?jcDLx6|SEN!Z z)!v#)ss5^kVU{!&GJliM3Y*M}^aRAzMpQ^zm=WD3iHDn9JYpT@fL*iERQ4V((`)cW z*LysGU9WI5fZ!E}0$6&8aM%W9Qywew#eTSUvCU@w*k-SZ7pEMMY|#O(-7{cYpL$U(SUJZ1XYyj09F% zf&2>o9S2=pP2#!EcKj<0=s@8DW3P9zW6yw{-<3?+^&0WRSC%0EI&}3Zvmcms-+dqg zk8%|-gAI~O5TRt^N{K&#r3#{cLH-p@E)F@ z7)F)Vsvp4eWhsG3iao1aFh(_YCa$$K3OB*%GTKgl5nt&st_&O9-CXSg8DUk87OV6} zlZKnNGCQxZnF-e8ceOW-5!D%VM5u?sxcdQaYyYUIwa}g}Rr4;&HCB ztpFWY43huS$b_xmhE-ZHJ|pof-*KvWUB&CgFh;&e-5Cl8rTaAsw7dBL-I-rzdBN5o z4}h(02rOIe#y#Ujr_M(9s~JLTBwH$Ee{u39xk-Jq8C~o-ZOc4&*a~p z41c;+7dqUa^iJ;TH;meO;A9Q`i+pFLk*kUWx^nfK509O+{@6*ya-;idy@bLVwvmnJ zR{s#D6faA6|%Avu`cDYw_j5z&tQg_*MC?w|7D| z^(;%EZ6^)G;l*iC zXsA8Ne;^(nD(lxkcmJ{=4>ovaai3uM$`yY~8-eue_>}p;*Xl1B{dxsHXtlw%{Axz! zeF4u+$HxE9H?KWo++kL(5(67FkOs5bMlP|7;g!|fOx3+CRcM`Rud3Etj8+VWT=ssQ z8fEj*p2`QOcVUk{DcG-ee#y9;l}}&3h%@+>H-CesVd6#X_|ECzxN%5JAF0K2jhcV7 zEL44m+)tJF?ObO;Hnr{oAxo8iN&Cn?c7(!Ts+CSH9gAtOlU`rfqy?#cl%A&r@ZXfqRbc*Z?)+Vw3Q=8 z#T&l>Yp9bp4qf~#8m5lZW;U&s6~RGQPY~F8w*=N(@qm(hOdGmK(0-1B8i(+hp<{K) zZ$1&@$zds%=}Yj=ibnUC9u>G?Q`onCMyjW%%w`KRDY-Qa71j%xNUe?m#f_O#{dF z^vvMAqVg44O}?3B=URA7#L?fFKszULVE4V5zM$@3V^l)nu7q5&@x>Po;SVbUqN7oO zR7GAk_C0i7B)kMJ$d@s|%Hs09RRhrL!W@B|rVgt?Oxgz4a56ywkNsIq*VL*%Mb5PtSjYvg@kCywEzM zvZq~R^8*$SQ_o=j9hJT?<>Jyurd(Xj&@zN)=X01Jhu1m_fh0F&MaWBE{V(Dq5#VLq zwIl|1N0>V#cGqNt{*bltqzH|atUtB$>eJrw;nsr6BV` z1&OYa8)lB#cxMy++=!r~LVR7IxdtPUT_l$PiWlhNFP&}pqP~A)`#IVByubg=SN-E> z2l_@(Ro#oA6;K;QLXlT_uG@dzNfV{MJ4N>?L58jxR(tWJ;*&j!rxdDB?>i)a*bT@Y zf1YhM<4vaO*UPsrECd(2<5dCMWST8~mcyJ(q}Aub$ChNZPixs68y3(OoAUXG86*5H zcO&#WS^!HuH}QW{1k9)S93*6o`noq993H6WmIDOt`H>eHXJoARUrMij`0*HLrRxz3 zgTe4E7>m_jrbp;{_h*>{v}_&L%!{e^V_@cKs;+Wio<31;L(1y+?boT&Kk((mTdHGl zq2f}e7c*#`nzHp`I=yHE|#EsAEnIB*1t9URmCK0?XLPF8Y2YF&^zCuC*o4OU|>y}SgyaIt~=sX7^D$rTu1u4!N^ zAF(lkw%k;@9x$;@CxNjs<+feNVF(O}t#D2wfBUz%bgT9dkp}^w4z-Mbmad-YNo=n9 za>G2auStKp8EhDv^MEENfZUDSKEBZI+iY+Jtb>VJ-V2sCSZ?)8|FqucI^FLLd-#fQ zWP8mSN&cfm_>%=7)Xa`*W>9bU#G6T@ZbeP>I-Uurao^Je?u###7OpC|P7FK>T@(;W1Enwr&My%WJoGFZ zCAoT1^F+ir=%ETZaDh-`1Ba7fU{uy4+EGOr0vgEri#TV}o-Fab+}~pNOo*kiOUH<` zI=$_1?>hv_1QtqY*+oo2McH@D2tlZvs8Ot$ESN41RQOlb$9EoDY!u0li7{tn)@PG3 zhxLD)T*WsyV@OMVD?bZ9vd$oUKt~rH=V4(b#DS@;=<%a1rYAY`?fhp_;BtR|md{>v zU_q~To+|Mon}nCWRX@)6r*E-1cxQ<|x^0?P%uwfenu79p61vJtEEjGEm*7r=`>u-y zARGaXza=pJmEuN*B(}jm05I0KkXMhY4ak2Ep&F;$T#zjQf3#SC@^r9&!qt!X&$r(B z>6XR!Qq;x|yww5qTrmnA)GFl;df$8U#MOAVR@43yI-6k`un*MtBH}sOvA7?rop;2P zs>6z2YFM@+Rw7*dmHs09GRFP-(sgzCQNv5^qe72Ow!TK6wni(kaQ!7HuG|lKc3yu? zQ2nUFF%5ET>G6>Nb@<{J_@UN1xUwtGBn)y(MAwyko8$>NA+`V>8o^B$_xsCfdILuf z;9HC4CY6eR(3D&e}GXI-y|9wMUl6m;|L;N+X$SIeN_RpG(j zG9Y;0w0FD=XmETo>@Gv}-BL9BUk!f_zBDj$hw7!uZppgpkgfx`Wz}BHZUMV$7wKfo z53`x*>ipwIPOFYR_Z8_U_6mkH38OzrwyopoI+@NwflQ+ZM<{Q*i!jONA_VCYg zUGRW9cx{3I8bOOF8AmY2?m{WVQDbrRUB7p9cyRjp;aB^rw11SGNr|u6FE_GX2NlhG zN99_v?}Hey`>tjAtvyf2ciM7UGzNU@$H1cMg2vJP0(wNLCBwjL&R5$sFb{~U&GsOg z7z0N7s+xo2{_vaQgVX1Ojwz~NE$^}&9x@4$0&^_2?>mUP7>YhPMVE}cmus9Ls)s>DjMUg6%`qdLitsYW|E!TppoP zsV5xJr^jAbUNKeqzD-p**5iM>ssM@iQI!{ynSNz;rB$=?>16g&KU+R*@$vgmd^Asw(2BP z4u{-!*)K(NzTV^O*RdXkje6Ylmz&)u|E%Bbx6li04Bn8qi)q2cX zFo8IlGWvHtnt2y!a8`-Ravi{v963P9l1Wz;m4tcQ#>slqbNCY)k2LKklqPS4b!W*$ z*Gt_=k=k%h1|;8pBcvpMn5hFMW`NsLCn0uzo^(X zkqL7B1s2O1R**Q5TNVCK=cp{L^a7F3@vd{wHs!4yIgo0u81E37jXVHH1&Mksty`WvYL( ze@3R#ShF>l<$BEDD?Fo_%&p=2`tT6$2rVcA-6}hiHk6UkPEeNV{3>PVh_%t!Ieu3E z1%8}T%CQL$vn0O&Jb40rLVxpgmH`TWBm-d1%%GuVaicMrr5h!BZLHQ_9Im`eJ$jFA zqKiUj)|fI?^!=RVDKxlBig-dv6V!i6+JzYlyoljqkM7E8$PGc4poBih_&>}rVf2Z5 zMQe_2FZC2Y0W`-X`{LYb<7c+16zJ}@I=M`L)m?lLEz{JwkZLH}`srFWv^io$yKzQ% zXNcFZ-&;6G9nkDifzS;Cfkagx!L zZo*2_l-)~U;tt}=FVcc0TT*|xH}w*Vx&ofeu{tZhTX=6hJN3l+@kuupJrY}#J%Z$x*b$Tlx_=jlGhaK_Mp z$OLFxyQ@08P(IX@i7d}5AEceg&ZPFa~ZnM8+O?rmNA3yHW zJ1d1?_+X02{^GD=Sp`OcYRjyTz_p$ettL?rb+5;C)%(Sa21?cLwa&4o1k~hK0dkiv z=#Gf?4<%6W%(zOT`pjjn(m05)!kuD3*8YrLF#OSmha z;d|*^5BDt!mi1A{Xy1e6HgBO>^peq@L$?0exlI@%p`N3GEvEt@v{)lp@7U`biGv!s zfl|dsDw`s<6hGpU7Y+5-oSJyThStl0Un}#D_kVvDhuJ!NWXF7-fly^hm?G%NZY3Dv zSm8qolQY{U2pRDc+ojTQ6RO`)Ths`nLnLkr453}cGbH~F2oYI&Gc@;Sw#M5EBq`(& zK2*AA+jByONB#^rPsS`?{ENlzt7Xs_kSDjalF|k#FL`)15Ghq55uzdt*$shFgK7Ln3UHj;TAWSx;b5z$D7GjLt!ca)%M{mA?oC6w37AqC-0iv&J! zS=%Bb{F@aRbt%MU3#*02by8I2nx%qL3$hA69B5EWTXvRBes?4ujWnMKPSfcQEqCKW z^GkMEoHiA;wY@`U#^r*$UGbv)HYr>FSjvAsgw$-|QjtlCxqXRQc~7D-&pEW119btD z+}UW6P8Sbrc@N$&{ww2@p?nGFo$lYC`xaBX5*QU55J4aY z?pMlzi=-eVbd%s6BL`tE_|;C{VKz^9dLgA5;#iQI1v9Vu_M$;!`5B9K#C;+M+mnA6 zu$%F2!cvumW_y*+eMk)=62KoJb44(^K()11nSIRzExim-lDQM$n>qgR+f0`nfu`~k zr)z_K7SUk8RT&QU*DX6S+4hCZ;CIy=+qZUZRZg2soXOOOuX*3V)pC^$z}l~pv$gvyCDBlSLM&7wMdAQg7l+|j0)Hg&#PIDNj5mnZEPyAQmcWxx z1W%+4Jm_jdz$f5oSrA|1#s+`dm9v?is19waKZ%~GBE`wD9k?1vfqxV_n*yOlJpDC~ zOw?lr*zmvc827ZGnou$f*0Wg9KcQD@@Mwe=7Sp>`!O{l}JT! zfUD_&pNzo6%h{A9*Hje3-S1sqrmb=r5pI&p*q`7sl}Ii-z}2~I@1B3;X_nuK!6)3d zRUR9hn`E=;QgGT9N@kbAoA6s5@OzeMffSpg()Oy(4EOO|n7~OS&%mtN-b-vA0+7i7 zt*98nOkytWooom4y-C@)E!@<2jxnrU12%J!^3IU|6ulsxyBW8rrp}QcItJP&OdR(V058J zzrqk$7A$sJt=?QDqYEouU5uiI>BaII>zv*u!kE{6_jkJF2X%i}Km{UX*pUezYO1}$ z&LVR5Ek(C2pN3&Co74^LPv`-a$U`uo!GQ|>aK(2yp>A?O9egfPuED9*N(Y^8`P=|m zOEUF28{n{`UaYURDOcO4kgY4NI^=YfQpTdn$r-2(#8oY@t4yCIzgKfv^+YuVsDl8l zG3U}3`Yfey_M3l?-rT_r01}QvlG~ea6gw*Jy~zmP5(Y3k?z>AZfPUL&2ZN-xE&AYG zmO2Bz!AAIWEOP|*eN#weJEn&j&0ZGZ6;>>D#!A2k}o1^Ra)i&sf`Bu**=45?P@BdC7Vf! z1=UTYrUtoR@&rNH-2)g0zkngLyO?Fghb@P%}dLh48V|EJWzcWBN<1EnP85r->*)!T&|#0BTkg z3G9BgC>7}crAww{e*A6d#x^eq1#~Fd+{hVBd&x$(_^88jpQ;i#-Vqm7I&l}<+BL0C78R{{aJq* z1+YEXSi!e<8--;wd$vzhkqUcg>v@a#zFJcPj%+C@3hzzwVBPq&P%tDdOs>LJ|V z_2YI2LN}T_EsUV<8vJeJnbT$Mb_ajN7r@svB1V4Okk0W2dAlQ`OX+JG5aGUUJeeN1 zJDOuXUej0rb2t#X=f5hU)Tl#k8&7eBt)^AtsV7d6FjgV4sbdpoh1-(n?F0ls}g0jYl^Qw>~_ zrrR$N@?8~N@-IY$3?x{rE;!Fkp)*eJMOkuy8qO=1*#7vgOUa+?`fC>CElO@J+nVT= z2vZtEyJBK!rZJOO6mIean++BD54;O${jbWH59j*+xzNgaWL;IAPDqrCtU7yUUjSPOkr}XRT_VKYLFH&(h@OpOUjoUEnAXH8u#Hi=0N9Nm2g^=`aD@2 zQ{dvGH8h(R38wnRz(GJQBc(24$|%M+!BglzE=0;z^|+K-%Pgkl;+C4L7Z`IBXNk@u z*YJohnU{d{MSPv4vkVhxUUH$yGmPoxMqTtnCuS{86_i>LlYvH_CLe#E$82E~E{h1G zwN-Xow2IQM2?iVC#$Eg?hKy%G9c6O7%&WQJ^5;$Fi#&(|Sd2Oe;Zz6kgXBtAplqt= zd^G@%kvC2|PA z9ei_Q(fg8e2Ykg?4$o!l!;#wkuIfHY$Qf(5gx2xlwx#>mCYyJEoPc4f9tc`*-xL3? z9Yo9t)MAl1o_f4}D5pn3_9~ss z&(rCGHqu~xK3$5DCeX_?yMj6HES{$;nO5i)WA)?pb&)@tcxsXzJ}Wx{UJoj)W3&wA zZZ%3`Of5e9NI?08fnZFnJ~QCn8fa+_h9h{oT{S7gF?f)>52Q4nHYa^Js9iCrU^L-? zR~-+6ufw#2LwSF9JFqot7|%cK9cy#rMC>#F!h~U(mNdK>raXpT8z8{7r7h3Gbkf8< z3~5~KS%JSN=leD~sW4McVwOXyD)xNaapmFzY&BBJgxm{)69#-?H`oG#W*P2qhFd^+)#8jpopadvmYrF5 zL)obwKN&+cmk1t6s^5?;XBfxYnps0{y=ep5NQ12q`nA5d>5;m}ZLOC@VtpdQgK$&U znrSocp{-U*!`RV<%#MlDd!QB?>ngzYa0xE6M`eGS|E%U+`_9(0!LC2j-GoaGzHU#&;RP?!`3J$^Ybd zcyxaG<>26T8wWkK86j$k1HiQBQ8&Hipaa`fN&^D$RLuK~B-wbnrhF@nQ_m4lYov@3 zXJCK2uwc_z5~0I|_fq0oL{>R=Ir#~7y#CfJ#ai}fPo}Z|B*BlSIIDy5H>3Fv{o7>c zH8(@SnJ5*&%vXAVivNmU7W|VG!7MU>@Qptuthc`|E*LNx3(>PuDwXd7NX?*hs>JF8!2XMSl_;MuCM3iIq9dR-L#-|rr< z-x=2$BfSD7 zHnb_X&OEoI)|Ol=Ph{?an_h+5%pqGUQ7|cO!<4e^d9I!vlxbV-i(@75^O}RRqQuZkgO`64ac-d?i^BcHrw|Oi;owD&Lydl4R|NA(`jX+}D z5A;)FaLiMdFN|4|^9vqB*PJazNzQ*5tVfxC9DNF}R=`|8m?T*5rp+BQ1K5ic`%2G5jtVe+nPl6L^KdF8-psGvm@ z^cuw1yo^{4pP%@6yBkb*DAk7cxc6gNYf^#a;&hyRrx)`S+T$K`A7dQ+v3Q5s2jJs5 zIs^r~%@w=6W)m7d^f=D$@alg#T>b8D<+g6v8Csmo+2AycEM%f-bIeQ(_Xli$sW`JU zqeSr~IzT96s_&4q(g&gOE$Ca|2UttSrHZwJ$yl;41a&LQFx{+)Ow%i zRX>UX)u-@t@)RGHFz?3K9dvM`*-g0qh{NM+?l4OaI6}UVP`LKIFlT?rQ;sVCZl6(7 zTu-N*JG4Anw_PE`7)B!E3PQF2eTAaWg1*5Tj)+{D;x4HKn!zp*7XK!2Ev+g{xT7y0c$uIR9QF5)h2LlK6LQ=};fb7Cl=$OE`0+xK z@dCluMUv>30$M0qIuy1M|#?$%eYapTojXOc1>I5afsVI3@ zQSwe}CS4Y;(2*T~ur@~^x3A)8lF;><7#-lJU@1^<-i&ewhendc?RSHCFelhP*J8Fa zp@m^y?>Az4p-;eA@?H}(Um_-zV z!G9xCIr(GuiJ@)Xb~Xd|rA*mM`v6ccN8NU|1dkRf>+!_$ZnOU!yGUGP)052kLkD3x zJpg@Xj?I4sD1_0DHg0#@@!+%J;K*$W^h-Be4yFm%i5D0obj{Z#%35CeREDeItu^p_ z&tr&fglO}fofZ=|yiG}0;3zZyDVai#nEQgGJi5H(8ZIxRG=ndGJ@N9An|hSaV@5JA z&~bEp&iLG}A<@&rq&uHKi}4v>m_1DII3$ptYS(}8jcy|QAW57wPl5Q^WJ=_hpAybD zXq|nh;wz{$udISt%b25S{4~btD4jAeB1Fm+=tC8Y+uJmo<1Hh_wtq6rJ;Y%41FmWa zHD&wThy>@aS28&~mBSpYy6;Jbjv{Z9{s?`Pg@C#jk71_DERPbzK24t_V_)!N;wPv& zO6Pw`Ogv^hO5x+t46=xV4&H-}JJnIK0tLN_acQ#1-R?5U`tk7WY$z93sJiQvB8zaX zJS)iJCrR$2g(q2*FUI3oZ)Le2*M~mGDg*G>afT~kxd~4YyUYF%#D{4{vlD3usSnUx z6mcNiUNn+=Z49rdD@)XEz8ZfO^HSFK$;*EaewWAipPA@iWOEXnKh1p1kt^WDj4rLE z*JkUu`wNKNq(Ie~UeI+It-;cLT#XLT*E$^IdQmo_yKu=|pWxp6Fqus}2+9m?W|qX< z(_9-=2vjxScD9`;GvBxZD=5xBJ)?;rR4|Qxnt@g%+^wY*Toty1TG4UM=v4LAe!zbN z*8mcZl3P_ax^fY!h|4arSsYLN>!H*Gxpx8YHI71v%I=*L7m}PG44K!Ern~Cc8?eX1 zzfgP}lh0wn9P}~o8s;g>r0yk2rMSCc6J!o%CHnIs8UHlp?wZBW1x7Q^e$j7ZFY(SO z=l4-jo^`kPBK#4J%Ek21=TdrrFo}QFWfaJ;x{gN_1?!$_0y!J@4IiHzpPug@o$p0> z?sN9>@fV*RMn{7$2dB~5{?Y#V@Y?~R&OMipAAK@7IFC*T9}Z3jM+bwm=cDco-q%+F z2c3jeV7njQY-1zS{%+f@mAJjsCdqc=PUazy%-QaO#PQLiur96Lk1T3KC z9e#W^_z*!~rH|9$M<3(YYxMPK|KL;jc%42zJUu3yZ{W=eOflEwxXKQub6YtB`Jrj_ zUb@WLHTgUn&2k)2!>mW3zSkhyvmer5X2tBw$MI~D(_RXF;{J_(KIVas5+c3{q6dbg zUAd}Ps8y^^rn6MXie&YzKNWu|u;R$RaN%ZnJ3Fm5<@!~~Er+6WPy{xs{GQL1GYwY= z5RNr$1V?TlM012YKqG+UiAH$1o_5*gYFR6>fh{a9)n`HoF`p z&C|luT!an&dK~4+oMuM;;e0nQNu`=T*1|+>McdpWN9`UE{!u!bcB8}icADOu?Z3su zVj{x^@XVU7)4Dyic-ZtWfH%8uKR*BRwVjWT&vzNCFyK|Fe$O`-{kPUee!Bnoq=fzT z`@&1Go?AQ20Hy5r|l5_qgntyeaBe zy~WhM4^3Hf{$7MLzF2y&@2ro1eG0el_V}dVVui9Bnm@+JW2?^b_9+mrT$<28D=?c@ zyE8|_GzK_)5jA;=R%e>0|J%{FcJ#Ubni+j=H7oku8pfin5nX==cWWEE4)V4pbRFCq zSWv;I9kEyLHyfGERSf3u%c$V(KU)ZSBmmuj>;Sy)W{+oJM#eut1K1muf+RnfX)ZJU z)NPgsy(@%ufHgo}d2>T27<)LqZw5yFko-#a*up%~f33Vbzq?BylzD(JWuA?Hh;ez8 z0c4gg=3u<@e(rw~KXe@FGUCgMVm)_X0X@g&$xWQ0kKB2J<2UZx_o6plv+Aq$MwE6; zn1f3zgsK>E)742etUN67o`((#9F|eR`ua1Ea#-&~<5BjcX`Hl!N~lL3r}2tG;;qCy zoEK>Q8FHaJ;T??J4ECwcEO=zJJD4LGH`f^deWm<1Fin3fZ2Tu@6g@d+wVon&AMqYK(V+5hbP`Tku8(rewa`cj zBu?kaZcaxpG|6dc?@E3Q22VwchWTRzIHUXuUsBuD@}##=7X2=$&F=8~0yG6@;+^j! zNR^MC&;8=#-B&+`Ov>dC%{b24 zVIO~b77JU`!V8P{d#%^rC-YXd?ZqNgXM>LpXySD?kqm_kJiPimK94V{n> zg%=I|!6caoo+dDIJ>u3L$SyYE>JZcI>`6SD%I%pk6raY3;A%nJWQY{b{NL=q-pYTJ z3kmFI8>ls!EdeQN^XvG5h^!?%9L-1KMvDta-s1?ZJny#v@3k1&9{t=)@&O(LJMAWT zcabkZ$5Y3>=m}QKdjrpRTpeb6fiP1tDgfu}88T;x0BytE`$qUreY@<{%YzgwD~-dB zE5ApiIJ~QwpT-kN8w(I(bvfNaYMy^g;{NI2Fxu{!()hYT+v1Nt`vL>v;|)+S{7Tnw z($f#55w+)blmLn{@!RCg=U=`e_b^j*uT#dwmn^YH;u=&&|JK!GsxkFoDXu~=D0WmK zPGbdcnDBn{wmN&wrPWD#Zj8wjHc{31^q9CY2R}r`^S}2 zT8D?gr;v7Ar!9i@g@rKH6f^dMz zZ;$42anrdkiFu!DyeLWa`@Sh^DF~$)R@Q$)xy0;RVXi}xY`U(jl_ZRH`GNg>CSiTo7^#y;Wo5~1k`A42I zWS>C5CEk?c=n8q&)^kPESz|ZXGny7zl|5`>$5zl5kxZ>NsK9jID6tB{E<%%&Fbmnn znOwB$!B?J49v>d>@!C%>FR%$29`dC0qnIS+8UdBEy>U`)w<{2!uAEJpw%JfTMxcb> zPCpq|b-IFA+mIa{;`)E!MjnSSD3ncMVSCts<;*=v&z^O7<2IO@ID-1L4o~dF*y7uO zCs@2L7!@rnffenyG`SLWs%v5f0-C61W_FEm*oakT=9P@{ek^RdOd?LHY)UY(v|}cM z1n0AuSV_@y8k0?nQ-(-HliB#zO2d)2jzE0BMFdSk0pM!6MA3iRg5l-X8oW2RS`4W5 z`>}aqZ*6xU@Iz{GXD-IwWecw(BK3jcQ*$P@Qm|?gZ2`f!rNfXQg3r>? zB%Tas#N}f5eom{?n)`kJ-RC;}Gypr&9!*7x`IyT2Ur~rS^jfeOIGtd=n{~{5iyMd} zD8muGP9i+xa0-N& za`ul%udn?*oUl9f*^9!p7-WBv-JHYAb8K|MD$Nax9xzNap3PiSN|M}+VbOzx8(0;V7i=zh&zD?H(HZMNtA z?3Cv^w9r@;Ct8XhF4z%G&`kU{+A6R)6LrmyGH5s!QxI}2Y>6lRB_s|fWI36{WP*<$ zUf($ywHdSG=jV%f5%;5WO%dfuL0-RP=vOB>d`ExH-^bHhmyjgSMM|^B^39{J*N-l- zHknW3?PXjXq7xttJAy9p-^#_Sc>YTqb1Ru`zP8Ztl6#09yo5tw2E(r6&4N(WD+{=% zeCd_B&Vfu>*?y9#T_Ch&QQ=kmHZp$yy+$}`EILrW;wx>- zqA1`|C5zffu2w0%*qGCs@?=G(0mp%v*=P{uch_P=|Bv z?A6mjuf<@PlP4Ifm3q`7=X!qxk)Lz1ae^Pl_>yeS+y@6tl`jciB%kbiY!lrs#F>FH ziCob!2HCr%puD_uhPL7H@iEXhn!rgXXog#1+%B@)G>`M1v;rETKu|NK`!lDHvPF6u z&7DI@yAZDhv-~)Px@gd}VQeK@FHE0w+)1xP&gx}nFgs7C>D6coX2*XG2kP;nm9ZF5 zAevny^&0KvFKPA@uN`vW=k$)};dki*L`=3)rCB`?GD0koiN?`cSr)_aoW&Dmfi@=r z?v8*xZvI`j3i*bqaNx1=gVJr<(bG{f#r=7YR;DO2K@D?Q4!?}1KUqHK@x14~-J@%n zKgUyc>rv(*q&mZ6(ujY!CKDK6wN7F}B1V~y{5`$XcDQN`WyPMv^B6C1nB@kaDQgO8<^uvyr&3i6s=Ru3DPjccP_ zg(ks}728BKTua+FtyZC#R35tS*LGT2nqqq7!30w>>=YBC&KO?^`0?Pg;lc6A`QVg5KaQu#7?uHX zRs)aBJUXQ33#h=CG2Dci)?q*Ucz8l!XFnvjbuj0rUmTo&aXMf?ioL(c;_$(oEatfa zg&HXhojBAc(+RI5^O&4;*sJ#{o~E-Wa>-jA_w$~dEhc|4{>Eo``6u=vd_$HxvY(gS zX7J-zTA13KS>AvIPAZyJ5jN$J@RnQSCc3;6bohurX@u1c8(ptblcp|0y!TD_eYSd1 zH9$aFb)BBGZPL2l^ThDJkWSi7hPnzyZrR{supmII<%MF>>HFp2OXy;U!?Tn9a|m&8 zx_3N#lw^PNA0(Q>0I$%ww4U2tt|@mIk0z!VCmm-8*(h%+Ofcz)hO;*OVa2@f74d+^@?JGAKw``ecD<)QSOCP7*lc*S3SEofi{TWd2 zbAW$-1>zR?1QnZ`M+LCq&XR{{5FZ0I36P=I7op?Hnv5`_4EI;7NNuFFZW}bPHs&a< zU~xF1XmeWbQdaD6TH(4P*7_6+ERDivxxp5H4Q_D3fEy+hdx0CAP~=9-P+djuX~PXS zv*(xqfi0%g8f)Bw8JqX=+7{JPAHCNck;{Kx@d$C?=B!^B!bp#9UUg9!d5vW_z?0H7 zw853L%3z+0QdOYuT1}ubT}4>&tdda!UMOBLyj22)4t1cB0h?<8x5O`qdyG5K1j)}` z8`QYVwJ6h214L=6F1ChnXyfUvZ7@&X?rCUaWIC1VIrR1rrjTeZEchFFfQe{jUt)h+ z6Y?$R5UY>E$4qj&0v8M*Y|<|Ssv8Jx;JLR|!Bf7PF*}vCmn!Vw>KhpjuAzw5A6%VO z)|15nUD#kk_d3n2H~i7@xg8@NV0a5Et+3o0;*#T`zz+PF8 zzj@CD69U?j+&pdpOTw@Cea7a^3YRm-{c^6yE&YrIZlNMnwrf$?r;==5e@6NfJl$`B z0#4Xm%NIRjr90oZ%#9p@=z;*Y(cko*3ysN)ey7>6R^28eyx_`&5;NkBDl4s_0&!?ZsdxLH0_R z+*cXVYDipMmNE`WUkQH~t{q63@m)!ajt<9GMux236p!y~%yRi$ncLch8Ik{90~4@F z3DU1%X4;|BonCv~Ub|K({QCJOA*)pt8Q@v$a30HqjCtSI8jh%1>Om&^m zZXCf8+z_zyIZle*?31--~G(b`VhT@eC4jiGbAq+SzA7QCo|qH&3%o)t9lt_)OIq; zrS8?T-2L}1IT->3{&zzU(|+SiG;|dK(?{znLW8SNWlb|@kNz@i;62%NDHcBE6)wk?&Y7I@)M)_0 zf({7w@Qi<~&M%;a`K@TG^~~GA;uWuJtzr0z#s4Dv$5jFb{aDEYa*<{e$Z%{D^m`Q} z$R$82YTdm;JJ{AqtidKQaGg z$89&4sg@VWZx&(ryQ%^!7ZB!87S)Cv23gaWzNv$G5v%(w~Oc#GBx zj$`5DQ9nmIremZu%i=L!Qp@6-6k|t7$lKW%wR-B9ILczYBRbDg4C2=B`~K8MP9+($ zoUrz57)iN*`;6zsbt|8_bmbx-(SX2ccOat0G>IqM4<*wQvG*d^aNQL^hwCr9_NsS7 z(R#vVQ&3H~gjz$A2JGgx9=qh%h zLw)4KjN|Rj?5$2FQ7_1^INNrYFS`LhmHwW%P^T!bf&7Y7t>RIn3YvU^5rb- z6`cVx*U=+{f9c$hs?_PC354umb+Q$ZEinFtC8oDfM5y6^F>smL0pipbF`U_ZKyk3? z1LFvPH?e<*?qgjSI?yimf@N9owps8P&o~8=6gl6h?CDpid(N$XT8l$xU_sNZxg;fr#VliR&}QPI8NI8XuuCJfC%rA9 zG+afj%2s7kP7nbUguL50p2G9I>{^E|D8 zEN)JvYwiCep)*-4%GajC+2((T~Focb}YcW>*AN}U4sQz?^{_s*@^&vm~%B<#9I`ko&x!FrOIu} zrOnYTv+n1|?wpSpLeC2Bs~%{jKU#{z62WxjY2+Au_(*as$1Y4$xPCop^qlK|1FB0d zA#ak;1cmiyK)_@+>Cq3%^a^A}mP@6~K!91!z!t5!aKu2fRDIx|DJW4K-{M6*Uk~Wz zI+!oEP;OgTgJ9~T3Bf3vXY-7Nfe;+p95BqMadef;qnk8~sgB+FSLi1*?2C8(^+=%n zEfyZtND0NunP+DM=-V#tc{1OBte%UlUu}bb-4NX!p?hUREWcTz?g*XrKnZ`Y*VEun zRVNv<$EoxX9X=w-Aw9MoW{eq^$)v}>f<9w$bB76if2`{($291JyyL8^Xp8Rj%dF6a zt4vM8ie)Z3?rS*dAc6u3$)vi!dyuflW0gNH@_7V-wCQoIMHU+*#7T;Oet(I$h@hT+ zT8?T(mX}J9MMRF+KWKnDwErPM4w2?+vaol@HF-}tj$Iv6@^I*gKIt=C7`k_ck;C&* zcE?u)O+$=oSl?}1O<0PDzAnkcgIcl3KxeY~J^-b=!eMTRqWeM>lJ}!mw%rrH(v7xq zIkA4eNb_o1DX)5!huM;UB5^%*=f&Q6P$jCM+GtbAQi~|OeWp_y;$B5&Wxvoa0Z5;W zlG!fZ9A&HX6inuXTVv_6R`#ARE-G?ke}UN6Y%t?|fM!DxRU`c;X+6>yQuq%wOh~LH zbbVV~#?)ePz(QJJ-2t_TW9<>$6rYvW44i0|3oTa*zGaM}W<^tfxtgh4y77Na4;T&3 zIh2P)9+gPn<;RTT`3nGhiOau=w~TxM;I-Z|dQYNoS5_p^OPJtsn&~Q>A9Qi~BrjOk zQ%;m#+b4ncv8n#u5)Ex0%~KP&9H1z+I`0+i>`3sAWO@f18+0B{aBhtavT>N`05|f~ zOrUH>o`lRhP}c2#d)$nYX_O~7i>WWg6b@%>)qfe?^`a>()MLub-Ln|{a?dY6B-5DO zh^}DZ|H*BwC_Y3#!)D^V0dg6?@E2(tEv9p%jhiAA0)eFR*YF8`0m3`M6i+H~;Nf*8 z3O-+!XE4j}CE-nyG!rK^u8MDdiwK%uPAa{jbd~}oKgD-{W&IdsWu@vv?a#1RmeWs( zoM*JB(@0?CV(GKR~Y6+W!?$Gtx=Nv_H8c^ZB7{)N?m zf$%XDtse^XGv{sJH%|iO{0e_%!+T3x9(B*+I2v7n0JiHa(`!Y`MCV+AY0~`lty9bQ zHL6KLb>fYGnmnc}2Ry4O1&PEh#)LD<+)bLtTKCq$hYK!Za@# zU4L{u#183+#=(I?OkuT7qI+$Xkl;9!HpiY;ysi%wRZ2P42WJ&gpCSjKIU(Gh3DzA} zL2Z+!z2M%jfr_>-RMSN{H@)U4YEf8 z5YueovN*>;Ve|%wK1r7QC+9FU267*3p1St(-c*{=4tJLE6U3T>D(dM6Fi*bakzwrX z1)ULJ-f@ODBpJ11W?&{tSdgfRH=_i>ea8k=E7SL(#e(*q(a;vzQtjfR+UY>mXj3}3 z^>`hBuIk8??q_G9X#J&?`To2?Wp0($P2$Gd&{njpY>`%0h8SAabwUQGRaMlk+?Xwi zerN5LXQzKch@aaFR0rQp1ma_-SZQV}@5#G4Tq_sH3b@0zP!ck-&@}otFVLWGDK1l0 z>g{%pQ8ZyW42Y9E=$icU5KaR;MflzV=yK41WLM23ehMtjV8>p$DxD98hKv402 zuu4+xkED%58rqXQMm-w)ilTzPK3mCSjjf`bCi~i3H1h<^#)CHz2%Y~u%{xlx58O7e zWDnFZze3Qj*Ne*xJhy(RRmMt-3?(F7W03#ygDo-mj?LZe`iqX&dC|d**ksKSEIB;Z z>J*0a}LCt!90~6ZKkZmgoQ@+|-gBszkh1!*d1z}ndYTb3l zpX^<2ZzDAj{wtw;AcZu7!Y8CklpZgYfIIaH2vz8mYxeE}X;QKcP|)$)nU|fNos6CJ zZZ>TS1w^yArxoi9Q#Q(c3ks-tcN@-ePJBys8jq|N#R`6n+wkht^J2QuBw#Rp0jx7OsR zQq@;0xbP5u2{YFJ$-3hqPt1FNrti^~TiV{HJx|mIPiM83h&Ct(tJyfo2v>87n_zRL zAn(RDhlyHhCR!*kxUNeBTHH=C=zpJ7*Lnnz-i_5BiE>ZtJwl{!xZ?YSR(w*BEv)&7 zZ+O)wu_^05CDfH)EEm%+ed5=COf0KEP2X<)M@gHm0E^XEb6^u zfi7{#= zguw9hA+HZf$XgM`&vtg?5quHF-L%S4DUaYI-OfCM&%*de@NI;DDrzgw;bY8DZK2G~ z#Q%htJ%RWE(MKPaQRe{I(-^{g!X;A)&#KQ1T$s(vJ~%F6Xw0>iU>HI6dMYw(QIJ>zJa{IU|hsIxb4b}#ll1D=iWQwn4AmK(lqJhlW zpBvT}$7*$Pe6%iqWddKJ4OZy!*i`30#OG=aRw2|Ze;FI%6-uPqxK;RyS_G^x z1noYsCik=xlk+8Kft@Y+LYucmwZt7miR()R-Zn3@MbEbU=b23U7TIr0=oxQI-}&Ce z;NPhyCBYa7P9z1-`Kth|+(62e{Unc}(7mkE63J?r`x(bX4d4_GXw0s+zFN+n8 z+2sz{t}VmWs<#G2POk!|`?jtJwm51mzBe}Ck&fALTYDu8+go^sFG~s;?$pns)~u52 z=0#TXD+l^f4V1`>K)jcBHpjX zo~(Gm_o1GD!W+8ha97{ir*aE4m&Du*J)kh+<GW$18U#oS=Su2K?EXAlZd{|!^_AW zex2vwVAC7)4-Q(s&~tFmJR+CX>b?-v2CyAhtackxJkQv8WSd6#s6{38>a(f!cjS7 zoX%v#GC8W<28Wc^!&=QCg}r<7CI0Rj>rU_T?@pgOmfek3alz=-syfq@)Wz_pSCw5Y z)ZZR|eutOyuTxX4qE-gC#4GxNZBSt{2*#DhvGLa8Q)wSx(`B2KuKP~!yhD5jwU^Vc zbm+IJk{F**6 z;kT{+cMnc{{C|IN!fi?hg3=zMpaZZ-XRICXECo^+dW@p>C5p6J#0H&f%4-yobM1A1 zv@6$Cx7dC%&r#IgNDIteKP|feP41=T?22)nnZz~{@K4v4(aCk@_hu<9+x^)}?FIK; zSxI%)s666k(w(XBez&{ZnnD}hZT--UgkUe-m`Uw@=Utgeu|}xtM)a`t5^o2?io+>COWP`;BHO~b-Jets>W9Iq&_(GT@CPm*f5DP z;4sX+0*ES!!T>ReWrP@?y$WToaxTMb=m7^SXjp?~G2lW8G{wkR6Z5u`?Hk}$s0(YO>SAQ8620#@FPdhVfp z!rWo|Y|O@xJ_{ApZCH8jDf*&=g3t6aw41q#XKLKsM;1ju$z^8T;T?;ACrHh$V?{C=PQ5^^GylbUs%KlxBW2W2FxAIq&b67;{Hr6X%MTHF#R%ln+X2Ua)R+PjIpSgYD^c@c=MY#_Eu>dSkm!zm}`h<}TJ4EKhSQ7_)0R@}=B z=mx9Yo^>+yP)T%KF+#xC?5k1eM-ap#nl%Zu({ZxjlV4^1j{Rjeyq+vw`)>lU0 zfJhT+j;>wR+tU)ibea>fDJ3AA;tA!TGG81NlfeN^^cq{2aId#6%$e*;^TsdE9e-i| z?TxJzq_0B7jZH~^tg(55xUnfo%-Adw{q)8r^JTO(`K_j=DPyLl1Q(JVElqx}Gql=n zOD4%Yi;i0w$BUr>m@$Xzv1ju?W^$4U+pN7m=8NgLv6V4rH8No@m*q2E9?7n?O-Z(W zl^||WLZSNi@$2o0DdOg2Sjd+*CXOLnlAmfy9J0=mB>sYbevutcLTtz}7eeaSd( zS7u8?jUh@Cw=X7$n^%>Ae0byH2(&H!rKTlm*s^M*yx<>bT>LA^wnCl)^{Q^H9(4$y z`qQ=UO8u{YIuK|PTrtA9MRmBlne%f?J=(!9kVgHNh!NeVjdmiJ{en?mctK5OhK)G6 z@UDrw{{@O8LeIyU3(z8@&bR0@&B&g;Kx&^1`jW9s`tiMf3?4rt=?YB8#L$__eQ8$ z`Yf)00lLZZ8)Q9S4F3nFwtCZBzfv=UEt_F+@^cW-5BJw93R4Dmf%$ipOp0vEB4idf zIeAqLhr{kjeRzi!2l?~ZMvq=ofE)h+R9cn)+xuylTfLn9u~9Z}lz1ioV}s-diFNUR zYK*h3U0V9s5}UU~xHI&z8DcYpirBR_s1VA3`i8gx+?ML0J>Hgtxi2hb`xX;#GZ^bz zO$*TN;YMi6PC>WLEM{A%+XrAONx0ioTWNs2-ON^+A#W20%W7Bq?R=hR6wr9Iarj#0 zWd;-*q1XfsE%@}yOe``IJP!NjvH_N8c7=Vls3`;r>#Lk_6GJD#fQ?WjAGi zRDZwFq#`wghv>A0wJO=$>adp123u|e>Z7B$@OG38RkbM14vG3Bq-GyRB5P;}PQXS{ zf8_0qf{AX8O+-(qy+!!k;uaxXyg^7z&>s9rH)%$tO0fpdq%?+fVrL5yy~Y%TWIL8n zFn5Mfds6M}0BO7#__O7;MnDwnZGd@ycoU!qtVzwstM!s&hLiDy5~*T5x42%2Vq0o4 zr{~gRC!O+Iy$Fd{OC=I6FRFg3YN8p&)x!j+9X|CK;^nk`Q@L{akjZq=`>1C_tmfLV z3#v|OwxT&^Z4_7fX8W}Jx`gquW=}!ip|frlWkija1Pb!*nCXAf2LsEM>Vko^X&x9zndE?hgbDr^NVc*21?Imaw=kn94$GlYDXtetw~^-s zH6!PEA*`L>g+y%E?E-U1^twP&b-Ezg928$7*123@JtQFTkxe21pQ_0|7ulDbJnmj& zJmy~FVt9LrSFF8+c$~e&;4DXfh|DZULhIcugla&wVx25Fwylpv^_kBWYQ?PIr5NV7 zCEY6X71xT0hBb1HW5rrMD~WTfh-h0Q)u|$&bB#!KsSw&B{%GV-QFW$(#P+gs4ncmk z-KA~9B8JhN8iKk}&>-T~$@Ytp{gRhaABOr{%8ArEP!M67{{#*;+jO6Qz;fNK_k`x? zYxvQ3Vw=7bXiInJI)VDUSI>zQLwod_Xzw>s(_zU3SDqV=85+l_*93nj`%bJgGhVc* zg(?5$J`)MnM7i}T)3^;$tZLiE#VrS7<3>{^#b4f3C=|?u{;G*Ev08_h<^ul@MnRO_ z7{oR`X;2$?=tz@b6pwCyG+nsS1bdaR6AeXe!-ocy+TMi*rAqOjNieAf{xfDb%Gi`4 z*?I376tcbZOfv_XQUk4&^XNUZiT4avWQT4E$S&xWAaP!e+wq)1`%QP8QR*WS)40u8 zvW8wWm?YV0Mu-O~44azigL9eL0n_ZtU8cQa4X8-uO2!n~7si`^ydz%QOK%NCMER^d zEnkZuve!E{9_95p_g!<6LHU}afA98n{8}s7Ed=oW8rTDMjnQpe{8f+t6)Fq=rQiqZ z71KpaggMJ&6TJ5(_|V|@+h}_`iM&UZb~)+U#!c5K%6*}!+cuMEL%~SbR30|yzLBYH z3v<8oMv{cMPcxH$hl01SfhBy4KO2rI4rNbF%#a~rimm5>4Po`j;$9K;D8NGm(|fsB z#yloz0HHV9G@mFQ2Xug$M>h8cmzP?5lI55E{o!R1xASoMh}^mr&%=P}m-jgx1O*E$X$L2JJOsX8%k{8os65s=_8P{SvrkW?>$ z6n(673(yqSBfv!1vtF9N@C49>I2Qqps&x_|s)(C_M6;s+&#>>_Re-YnPdW<-Xe;C$ zV1QiSBVg};_YBU=r;=Db02t>LME&pKgKm?{y=E|fwtzU$pO<5I2K8rg{K2zECc*uQ zvMu1BEYgGhm9c~SYt)tj|CC264-VHjn3GsS9U#l_1cv~Br5kWp+MY7|7Qu8KDd*=a4ZrukY z40$GW!nQL|ag1iI!KfnvhY!8d#qMRZO8FWkbGUaY5OU*Gz{H7e1vIp6)v1JddJx)`Jy+@qU8*KP)4YzhhHpl!MukWTN!*&xxb9vu!+ zO=F8L2c(g^bUH{hjz`CXE*uYH{Y=F9fFrl!en86IzyX0IOL9R-G_VG42zIASjlvV{ zzAFNWd1uZD3A;kIih6WO*u*7)slQ~cL(wP zBw0FwNx^QE&|&;3v;oSW=7vYmWP; zWShf|iOsG9k9WuD9;hFH*?Hx!1VpmZSxhoVJXDW>uG%R~-X9z2&Na}7<|VM*mbrs} z{sK@*sWxuw=3D-3VIUsx%dD*aCDa}*abN`aE3sOiHWdSDTA}wqeSl+OjRJ7to@%J8f6y zr&bo#)fadk19d*ug6<7GUoE${VH<#d1$F5utvyFh13p`G4T7J$g+EJ%Houmps;NoR z^#E(1V;9is?SiYl%-%#T%|;el@K6Jlkhb<&Bu_C}4x(w@acE-Z9tWBG>;^G^BzX{g zUJE}5RhT%*&Qip|>otkJ`6Im?byXwqfms5k>V8~Z@$$e z3<*X!~Vdt`2^N6MDpT?FHSyw%Y=ho0m}!H&qsOo zF7`KXDcMo8e~Kf5ES?u1%M!5r<0rjqB$DNNKDk;>adlf2dkBIn6D%ts$$^R?)$xBS zZlcEox8|yu0D}?jZ;ocPp+G=$KF|GBGw!_)WvGZh1bp+`{{E*Gxk*faB0daM?xCw( zUni~VIHk4^eQh5`YnxcS$tJJgAhKeSGBn3SMy)9llc_#)t@oqFQ=nLL5x3zSSf;@H5$#% z7@Ci|iF~!lGF~1|UcZI`BQI%&6g6P7vuqqDf{23T$2XIkEKEdE1=-WZX!bfnM{z>< z`E(f}!bN%Jox*NX9T7#~FVZF)yQkdv8?3plxvJssSKw z<&$Nu1aPgJ5UfNIf-5jC1jctDgj55CooMec#2TqM28joaN>KO(*$rlmc6)koq)IEN zcb`m(9^_AI$bV`VSe_97kX?Svoy36uux}B?eK%hSC@0GKmN?(0a{m7MkI`bB*D(Ey znEsW@v=H|U`!BnHxxG3lRrW45kllM={&hQmJYkZOIo;K@9H|kxYQ6`%OiIC67_$r_pP`S7j*3>|>Je0U^3Q~SZiCuMRCz>LEA9M>}GwZk2NViuiC( zmtk(*p;YVF9fuET-C>pp>p6b|{rlG$5~BOQHWOoi`o%`j9z+yLDP$oq$B>k4@JdMwzcb?Lu2C-SXuYjLfbWvM)i&;$06XI zIRMAoi@iVhex~IN{Jf=~a+mlt4i~Vk{G2Ymth5UAs=g=>OEh`(%zP}DC<9hVR zENl(GXIC+M%tqs2+sVOFZeqg0uk!^o^l-a7KK*wvh2+oLx?T zVZ>q_*#!Q(x(1;~GaQQ+Fnm0j&)&m9VtEM@vYVlFQ%@)vk3#H&GM?nuqnk@eWiO*3 z{}P#eyr8cqr_Y}qpPzjF#aZu&1-ks~=|!Z8&j&I@3%N-(ML9z&@yY*cz~j-~*y0ajO>=tua8 zJg=Ziz=er+ARw2baXi0VOs;VrGlaRt0Oiy|5I#7kxxsY)`Zd)pf_|U>KqJzBfQo=* zH25Of5?b+S%)8Zmjg%^D0bie=Lg;*oQP<0t(@Flu4Kc~PXR;1VH$9NAoa^fU54!y875 zkV6W=4Id5)@Di++WfguPowz;I+t8HIy^c<#U%R`}E~0OwQ-UAtb!iv=p>!g9E|;e% zje8}X3FTfjExx}$O>Cp+Xvm<)SCbh%Qe+GlQ05cp0>{wfh-KKNjc|&8`89t9`bQhE zZgyfy)VXl*B&Rm14HBuaNs=r)RWuWJn|ICKYEmF6vCKKIxU=Ye1+l#!(3jxW^hkPz z8t26`M56Ks@og;1}<0He(}XZ z0SS2K0NwPH;X* zIDk^tCTuQGe+~Q%5LB0sl!OO_OH?XJGYd++e#eqUpOL|maTrQUN|%>qrHdxe5p#Sh z)3l?#qwVN0VNXYvBxoRpIEjJ(CUl8}m{_Dx9P5vxUVfT?3WhEi1LR1W=sq4ust{w1 znzrp}=T;3^tLmOK9M*73py_(50q3r?3rx>CEu6FU2KE~n)Ra<5SSz^=!(Rb5=;{ZOsJsS@GBglVgD~sccZ#frEXt+Ha$Ry= zp{7i|VFDa~JzUl!7{Bx_eTJ@yZM5gOtV3wrhl>ZIz5SiN2;1d&=j3x%%M3U*15X?@ z?Wj5S@7322CKc!P-En=9?eRE@Nznb+z*oFkz`Wbs>G|w75%KuE@W3-uugk@ zF30iLGVDlu5J%oaXc2Nw&E0yCJ3C2{Od~r;0WnQ~>cKSd-3Z3OQJMo{f*w#QRtQD; z*)~}+I!8`a7RS6KAxAQ;_#B302*ONo|9C-!E9rFnQy(fP;n1oQ4jmI+jl7olh1-*< zn*S)+UV+?7?TM|ELp7Y@hw!FR-Bwe&(~|BwX?CYY#RJ7AVD>XET!h2K_pq zO6<2o2ieDZPFqymzii?Z6CHl#R)(cjMbdQ74FJi%?UT#Ic|XgK`1gTzS;M1ubX58h z=i0LbQj%f~n+!hwm@2B3!QNBmr3u&x(|a$1$R9zA$(N&cgU3t_FG zWQ1F+bc6#Aw#?bA{gacO&-Qaa8WWAyTCmD2jhFbce%FVS;q28L-Rg+tCJp(qDw6W2+TM5qG@Pbke`vo+iwB8x<i$c;Pkr|oU7|b8(RsAd;A>)sZVAV4( zOQb@kk|u=o%$@o%y*R~gxg^xXg>48?XxIlWoz@Q<5$`P%LJx`$S2@B$Yfu#U#In&o$weBTwds znQWM!K^Q?k`Db*xLKMC(htCt*zn9HCz6=boNYwy@7YMO-{aR*p##|4CYnCuTG)ZBQ zdCWo%tgE%q>uBtfliz1iDl@C{M9FjgL-4R>GZ4`d%&jw&ohOI2(dTS`+{;&vG_w^U~+yz4}!QOrRosXv*PXD6%~qKETA z)}!|}!zmV=1dvu(nj0-LGvY|2fo>h~UOoYP=TTUr{+Q2j(mFB@x;)2dwS_0dZqNog ztwJGcjXE(1Ko&S05T0Lu@g29!wC90-lx9C6bD!O#orB(K@940!=AcE#dz;bciaNIL(Q}8-hoE0qDl5587s8c-?n`;+zCO|&}FlsGH2(F#l$Y%g1 zdyLJrB4A2Un30cQM!iYqDa6W6nduLsEka$$NNh*n>>MA0K;MXede5U$GIxU+V!KnJLDl67ZCO*ccX7X*C1MQN@Dlut7Eu-a_9K8 zw{x(+M^qpH=F8s634EbdqDhp@i{6NS7*PPj1XnuIb>2$DY&*Fjd_rrc zgooKoA(sub`W{q7+HiKsrY|wF!#v|@~3v+=RxbXykDa6N8MiR{5e-%+!HOfaL0$tVg(~;FUV__PS9)< zNexM7T=`PuSp8&FJSX$d>e<(WP3_Uh>+HGK>CVX)Pp6CCKF@BRLBw1H5o~KuAPa_3s!=(>Vv(IFTO6If2e;dlsJ)8E6N#IBb>xd=_?nBjTpUI(^ zVGc?Adm_@HxF(Tk;{4UHD^2&IW|CzB)Oguw zI(fDlIDt0`&jrkM3`5j~^?A^`kUoKDX)$bl{N55lPzwY*Dm7u;!p>#K;?g(6xP z-#FIpBAsR0+WtAUwQ$lXZu3W<9mJOMCRbs&!j!!I0u`6G@tX7~;?K8Wgd_6hJ&H#B_duDLZ85@>dz6 z8Qu`}@tR!KCApc3UR{n@^k>Oju2D6+Hrfml&)>`DTj6cgamVPnl_xXZ9~!tQ1^&YuR0% zzvT=jG0a8e{YzP0;4J2BM@9KCBVGBnNO>w*AAX zrMXTM(IRHK#x;B*@@ZXAu2BVx-KjZj=>m0iX;HsQ@mWBnI#-*jKGPvvcK`=}EM-xG zarV?kY&t5GTPYBn4KBC+b5-bpY8;D7rpX-04=ekx=Rnx4WqNH|qc8jrw79r~atuuG~>PPPXxXJlt8A6u5oeoO9)@Y0LMye2C$K-it^);kNJx=?O^x-TwSD}18=u)i1f-}MF&r`1 zwz?*+vzpOuf^I{ovApuu>b8z=MyEsi#ed~`kmvHKbbGBC;tWQ`Fo`lbH;E24r&|%c zs;QQk4PP}0LJXsig;^L_^Ebdu6Xey59*VHRa^145pBA$2_=^tp8OFR~(g`#}Z9rqzV3DB<80chonzP{VO;%JOMPZ zxbhrjJ@O8toJuh)xk`Ae!-R4JAEEVQbffWqMB_}pEDfSvNyzs&rjvg(Cu15t6y0<} zFK9lj5Q1LQ8VeArYK`V(Olwr3H-Em+T|!gndbgy)-Lgh@r_@cqO}M|;1xdT3a|0V2 zG=@YOzB`}6)AKMI(M*s}Fs5X;be1f&lfypK6Kgs+GLE4b1d>6l;$F7$4LvQnp{F>1 zFmBt545B8<0qeCjcbT^U6?-kn$*1IAYEMy+(x%F*I+5&!VxX`QJqR#Ry>05RHTZGb zcM`V$T65vSkAB+Vt5Sb|FGGZGCs$nl5LiB{U}e#6%edmA1}(u2@Y7;OJ<%-Jx;EQa zUGhDDoaLtjwLHw_puYUt(zTVPg}IY|*GRZ3H-wT`d!HFV2N`!X8q|myQ}Jzv#Sd7h zRLrDB(qNKgfuV0H^B+i;?6ofb<#BX!Iu~axQdbcp7#z;_<=73dXnr}Is8h0VoC>9E zf|DyplX8&3ro2Hr1mdvLG^-EeG^-EeG^-Eegw|(Dcd`)Op~UjMgmQ2!tnCwj6oDCa z0#5(I6d+v#&j5Tf=6TkmG06K@xF;!pYJYk3h@?TaJCPS5B;o1zM~C~E`1))2s7+8&9=0^E z)x{jpqxAc9loWQcNc}v`M8P!Yr1u#dgwM&|JN@qQzWly-^5xMN^cD5?;4j#sJKg{G z6gM@ptMsR&1uvZw+@ph?;}YBhg?oP4A0r%sG4Sru!O=0o-Xqk{j`#O}4{Z_0z0W?| zKNdKc(Vw5gtddIHO)t}N{Mi^*&{76HV~+_1H}KwbiI)(9$H|~fZk!AXV&A~o-%{1y z2_g5*1$3P6(%WJe5qQAz869i-oZ9}KD)e8 zdf)9I92|Y46yL9qwkmUysxN8NEX*;BiiD zFS&*h0CNCS3!Tt^@^_e*)Q1XW6RFQ2!6(f z(mIEj3e>wwq~iU|%4Dk96B=&fO5!R5Pn^ZgA_3r*HXT4p?w4PkoJNO7r`U1&ys|&* zV(rPD$*HZY^cjf0#V(MjG@5JuY0JS@wmZdMhZo+|Qqb9dKixUm-|mf|{|+Y{R^5$i zC`IHOxTn|K)|R7>NildlJ-nH30Xi9;Lr?lVfd>>OI0!)c#)d^N*)NdG8Ttw^*)a;J zRQT|@;YyYw_mnHmdT2ob3N)Iin9J3xO1kI0y4B)2x$gfuYL{ElGontFs!WM#KN>*{ zdxqrjZQWFVyOr2u`Wll-fE0GBqK@~~R0#^&HQ|;fp7&hY#5fgB`S)0dBwMb!tU}uU zEa7at53e^GB)_#gL<0-41W4g+(snP~K{L_rlnR$sJB)W#1s*5d%l4F0j);+HwCwn4kRBD{L&v@;_;)n zC6q`UtW4WEO1oU~F5Ko{#Hz(bb>BXjKqkUvG1bAVNY|$^?sk5{tC%Xa@ZnU_U+121 zy@6@AXDa(;G7z0ImX32(E2tOFv4aTG&=L|#Xzvqn*9En79i7(l`eDl<+#1^)TiDls z2`nuxlgDXhIw=YC#R-jmwtm8Y}K3ci*Atl{1UN8usB$NYmSdr z&b`9=PJd4aDWhLF@hqe&DrO`d`MGp|2PcdGRI$igr?g8LVJ`?4B_Gk`FoRMtfMZoE zP^kg7KJyw9Td_|3tC9Xp(KlpQ#9k+LYvKJoL69JI=6r!1S0~(@M(oaJP8-G90we@m zze)_MY)mdU;vdw-@F7iGp_mU1Aiy-8_JS|$kHOKUTsyCnVga7k?rB@xi zwlAUPMY}=;-VY5s!Um!E=6fd zMM>4}sG3=4xN{0vGY)XKFc(69-dA4GC31F0oL^U?j23NgpYEJ~bs}5ZhrENn*~O28 zqn*8d+I6PSuMUfZ2Sq-FHsH1|?pw+>Iy=(j={ViY+!^F;3ENHO{hnAHI8&RHqa+zf zfcKaJ05HfPdWP36WGO%F3;$*l-0->qjTvLOdIrlBUQR?kB7qdH`mpbR)-Q)kK%vvk zUfPG@SW36!8j+jY#|fa$n>ltnhb@aDn@kp|k}F4$C|!imFWqY?x$A;A zSa@$m9Hq`CS_*YEdf8#pAFH?Zpii5cpu)BORzy(uofd@Yn7}1fmUWQ!k$U0ewI!$_ z69=XsXg7DgjY-wIo#%0XlMH&JCd?#*yWr)k5z-bZNEEd0xf#x^&LAqY6*#tTAB{du z`{O}~%%e!8j_0|C>VBY%>3Tyh{}3epL_4f`WKi{Sa(Tksa8G5;VLu6~K*5P%*(ykZ zl3QD7Sv+;(P#sawV4?J~yb{OB&o{#{kT9hP4dT6?#tAx3frT1>Y<9)es-dw$l`||i zu9yr)mzh+|Lt2buS-43vy7^2uZgKm#Y<<-N0z$)1#3q4o9s)TsI5 zh2*LnQcf~ht{7;-+EPS%f6JCb!qSp7p!Bojqpu!U&Yv~AMN?eMpXLTmD)SFg;?v{` z&ZA8PfCrc8-rPxN!%1wziRnBJeGrn1-}nYXy%-!Aw;Tf(e>e|7b%pWDN1AMXGw zuSX4cH1gWb?F3Th&Uckzv3!i+=hDI>e-eLcoaKGp0RH&zMVjdzwNvwks^G*g+iipS zIeA@!F@QFkoAh%S&|&&(ei!QV;>pup4FpABL)3odoHsMbh@TJPO!Xm6H;RCQMpl(8r1qT5( z5~=*~%U&aL0mG{!umf_rd~fXtL^T|h+K~JZcm(2E|Li9|6hU;cv5_`4t1obVZ`2`8 zwX3db@^f9JKQ1_3s(#Vft@ndwIF zZ{n3U6w-(J8vjHRs%LYkA4Htuiy@p{LO0`Bh2jHEqfXOG^+t#{O{YtPg5zGq?p4A_ zQJ=B)i~!N

LYs7r{$F9t4+g$k=co&oV1w^AV7;%rFQE5ZjbwaW8w^A5V^+6G(4# z3?tHwnO1a5e`e@$9)iK)IS_XB9)t_1zFW7FI%^yGn79#Vx;VPB+CLc%n)y2x@M!?2 z+S=n`GKNMd&^WS?Ls<~ogMOL*k~9F%D^`gi>?|XEi!Du{WBa+f@eL%fCV-VJX>q;L z&TwpChnOOOYAy_d1dvOV_!Tr8UwedXiJ$w7+lfQPfA##ukVa>*SbdNgv#5L+Ab@e z*`_RwpetJZH-MlsnUWI!#*6yjap`0-evdkqh*d!)Wz!8opN(XdLFW3&oBa3s7OWD~ zkf5MOe}nkh&G2&Y&Es~#Sr^uL&}S)rl8IS9bD}`3V6jLN?rw!U&AC;^DD+<~f_ZY1 zqu5Pmw0qFoKRk_(4nIBGIo>_0lyqNXDCPa*0fD?+1lV%tFV z8U8@ML-ZnS-!=Y2FOLndx(w~C1|hgq!eNxge-bPeZRNNWxtuXWQKc#KxPZ2Y$hFT) zjo-ZWkwCNNUtgg4*Z-r<|LM-|7t6Fh;@34k8UvR!L-!fMr~YSk|IzW$;ZnL!1R6E} z`U1`WU)6maF_vllT_AY8bI@9{K9v>GacnL}$5g~Qjjok*Mjf#?HVS?+Jm!0InLNs8 zf9~xPt0|I9x^-(VuHTEUyTWNbdN;4Y$?oU-dtV*wAL~)I?g9nmdCWqpAWp zXHEf;+cx%LTnaKr*o$rQ<0RJwnczIvf4QhZ11eT`^SwZoOIYjwVFju2$7q83SRD5b zYpvE~@M5Q|6?oo_y6tI7ULHNJ?b?t$KHQd#!z5(4=`ls|<_+DcrKN<|bQr;grq=@yab7ih%{} zz3C)KnBNp20iIqFCTw5B3QA%3-@wDZXojY#v)&DF7p3hFK;Mv9R6QP z{9i6{jp-_+XZ9^Bt|Dx{e_K%y3EQU#-=(M|9N`AVV*3vHQgpRD56gN7R8WTN zf|QKVIq4!*-L8bWunXgg$aRpC-2q4>s;7IUP{wBBg$SKnqxrr@f38e_!_Ed&*C9#2 zP(+)f$bxUSL2w5ow;t`vVCm_4bSvqHY%>sw+h;gAfU`Sz;-z+{K|$*F8WbXMLqN}p znEPuLY!`3b$2YvOYX6YaE+O3JdjLWA+>$rH*CNo#@5cQk)e>dM5v_#*uWv0o>V8yRbaZ|u8=yv}j9gpE=&&ykkkXPPK;{g*k zVX3n{^*S1S%9X~JFoJUAHR!->J*DQGP24qR-qCE;#NjRO6dOLam_mFRFbzN$wMDf;A{C#nX{@CaNe^iAUlO1q`rQXM`O}s7C z^~n>_+F_>0WAJ7PjKbZD--{ohqLz9}&^5JUk9k{2ab>tKrD+@hk9)+=k3Yg+3zW+c zQo1i68oKfAgeuCa-UziD3n6btN;q=wByKM?jvl`_DEWY(02-W})!%{Sx|?=KO}q zs-H#rtx3Nv(yw4B#w>S%M*&grQmF}Dt<{LK5EN~Z=3FGSJxUpyocf}e-W5+0#{I#d ztb*;R!hUyctMW7vZ+mIBUsxE!mFyUnHpjw>?2Ssre=JuvCzoUreAl%zB8tz^_3M{y_IKTDoWM{Ezb=iQK6|F7rUY0QWtU#WtTv!!t`FAX>mW|YEwEWrN zabI2zmY0p`1g$)*AD!V!sPyc~Rww%8kNmpsH*=sD4AqU2-zGpg1Bg%iS@I?>QeF_& z!=`@-e@ku^Ke^2&$rX;KgJFgb(@IXJz5pn_c%Thm<-rwsT&BWLY-JbeuOm6~Bh;?@ zqvVnwJRX%F5$3l_>2NWvO-R8I3m&5ZV_?aX_ko)bi0A{f^7f9rCBz;G|3d8*(x(TQ#01<;zc#*Ajk z*tvx76mf18y(QXJ*H&`m|3$1As)qGQ0;71Ku<{`73`77bP|WLgIVh*~Z!p9zdUT1? zf23W|$#Hrqcg~$ocWy?(`I@A2igae_%8-otHQ|_f7ED1QCuc@pKcrceCinI@LEI?* zSud+-s*5yMWYdbs(i^3ua?+`jL1izGqwmride=x4Pqhvjybvc?5c*U>aSBTyny^X> zJ8F%H;yB5!6MRk!f1VAmNrTMeO*Jn?e+i{iXnT21Yl6SoMo4ySP)9dc&yum^{l(sq zHn&d1KEn+E!33Blkec_n2PjZzAC#kowp_zCY2wmA8h7G^QlR{HbXb;Uc@w8i58%N- z<2|(6T}i9eYPDN4ej|`y`^xi%V-aQu=>*@7Pf-jhDWG7SjRw)tJP{d(QP#O`f6J?6 z9Y%qR!P0Oxfs!Kqbc<2#n|Z#Q#I7RM%Xr3ylWa-@gFRE>2{|c-DNP3Wl2;EOe`r;n z>oycVD>$a0KtwnJJ0uPik)q5k!%>le+=@$Q(j%ckI41nF2U%y#$X!}hUV7E6B~Xt! zZ+JY+ABm(FHe1y;Akb}~4eB&xe@i=L@#e-JK3LS)Hl(J<^2|o7%hCq8vi0?F?2urF zco^(##08e?skX@pciL)cMmK~X*o@jbgr-z1zZubsi6;Q@JRLvHM-My$Frb`yjtUew zE|Q5Sdm7pV^tx`)QCl<}1h{N^0prr|fiS~We{~Hq@DWmy zehD;)iIWIQe`$G$&z)YrC(5to?uMa{DFMwEe~%k z^p}={o_9tYD8uilvTk6O#b~!G7`s)8)y%jaieI{9TbHH#@n54}HBMcbVJ7droF{mw zv^FL27vVr>I26O_D2d~kf4$&bb>IM(_BXzURDDg?t zY%3rS)Fs?X06u8n(iz?Wuc;ejddl>ifE$k zhGO8ATG-jDxqM{uf1{0XO?RQCW(ljV9&i4f&5qje4&Jk^ZmZR)e6l0^i+YjTEo0EA zd#DLamI(S$I$@6m+k@_kaO;K;5^MEx%N2@Ge8ecyBaYyr5-qhd^kh|NxG13NY_L%B z#4N8IYqiyC$AxC>B?*pHyDU2HCr=g*Uw*;wE zhL*?EO0#h}&c|jpMN8ZCM7J_@NC7y>3-pixOMhy>-`zz3O-Hx;n>#Hu`Hsj>~mNhw#lUT-ai#K)W3VG#+K~u3kBPi zMT>3cRt(3^P>-}sMtWvJXxFTQ_X34G9FhtGf}Uq#&bflBNg|<1LD5MAgq#zzJ&pb1 z%k3{qN3wD#YqBxJ6o->oaxN=vH`$T3OUZ_PIRn!#f5pyaMn-`0eC;R4lO#LY8BdeR zZ@m!@@3MAss8LwT9mLDLL{TiRme{D)5xnIN!4@A+%7q}PFz2!m)%Yo|BIkM%ehlyN zJm}WC!9#capR?uxD2pwh*;H z*c4ABPRXERCnhBDl+VyI*i>x7R&UxvaA!S0HlOPX^>?B{O3(-#cNGE2PYc3>kGY(I zLR2+tL>1DTqV%_??_Wc-rf5XbfmRXKXHNPq|=7DaCiyfEBskV3r zp>(qIX>yE(+qN~$k6xIMN3`xvhGYs{GjD@~2@ktRo*yi-`09@m+vT@8#z^_%?V)6k zG?c)iMSfks4F@ymZNKz10?d3`JTcK9%?5OtC1EDe2{r(+1@$;O!OHBYk(L=O7UbT~ ze|2K5rO?Q6Le5I^BEHQwH`<%#^~>yL!&`OB3AN0o*~_z<)?Jd(s7@WHEw<2B&w?r) zrZ6*TV!p4;N0|P{xQ}!Jc?5>z#YMx?0VT5)X^nRMQAV+pZcjI3Cht`*Ck=_b(R#u& zr-g$jmlbj?NX2Y2_1PbrgtV>8O$QjLe>xuQ>&h^L+*j18jX}kRM zR{63KV|vbXI0u(V;#G6CuTE=CqM!0MzL+Jm#QP3A_hQ}xi7E&M`QgKuVOnS#H5-=) z@vA&%xxrvsI1Qt=i9Vd02cKM)6F%EHIM~_Sy^PTZS476aA%L~-FB8`37y)o{4;8B|0^!b>XjXdj1n_k(Y#Xz?C) zw72^KmFt52?(^-He)!3kVRO~(BT zNfAOWZt#{9OS{E~ua+|o$Y+!{!!}j?d&=pLV2Dm6!(H*FQDy?WhPzm&&K}@f+5SE0 z&!$OR=%rh_a+3Xu0BdgwHF&mH;ZxL&IW2_h65!rkVg9oLJxAf8W`DROeex z8FYcr((C)+sC%pg%e40d)skGQMKnjB(C3`e9=HsVsR)VZU;D23H75b8<7q&C#)cEv zL2GS};WH-+W8YM?+}TY&JI~~@O}-cThL!SZKA%BhNx!W9^e9b7;FnuFL=EWIP_G?6 zI1HW{9LZFp$K4uW~v3Z~w4%U80=2bqU&@Of8?w`l8vo zy3n_>xk+BgKm}+=TzhnHLOt_GTuvxxlwtY!{f1|Kqx#Ici7g-0O zh)}1epdz8cUTDn2T_bc*rPn5Q=`ssx`|%pJ)4ZASKxRZ~;aZGN^V6JRAGNQ+^NSf> z`lDQ~$;+`gRauU|i$ufj)VrVf4y{JkaV&2OwLDMS0{4J3OV~7Fr&aSOz(I2ZUhd_W zLAJX3q2>l=8%oULe$%(azfq#mkqtfkM^@_ zQkAGnS(*6|;uamr0U{ArNz9`S=_*k=3btH?6@`mR$O{+he}^&r1z>n&|EvJGWOPlU z3yma5HwX<;ne$s*ygXA0Tft*IhxJAZ&Gs50M~y6*Dqf8)o#B80#D(o5W*dbnjsnGV zsaAv=v3=PoSE{q6o_>hg*ycf~2&5PY=tIyOwJZwcV&UWmQ<58^~h5 ze=wcoB~f_%LDA2u^}AqkIbQe*g}!!>zuLtAM-jvb{CXO%+2H%S_J1}TO@{|$%Pm%a z>`q0cH{BKwu!9d{WZ|G9Pjy(EU;lhKO6daVgJS1!e$c5nsVx&3FTf^TIfrOaQ1Y0F+z}LyO^;2$n>nT@Zt|0TNws zF2hL{l8)vfq*s*cO99FY)RXV#fd4^b6IPp`jO#a0yxCI+TOXvCC`?@J0FEix&qzoZ zaI+a3fAs+0}g4NvQ)PLjo~rpv}A12HRxNbsRblE>Bb?kJWisedg2s#*eE^S}VNT7l))ZYtv_f4ZUKO{chYpAf5T`y? zeaS#*gCyAv8SNci2fg4lf-!nXob* zk|bi8Q~k_WQz~c{tkpI>(6FQ2hfXU;YuTn+Z$+(ZHc2xif8~#??zJS2za$Z%MsrEPDv;iZ@q z=;Y1l;?QIrGcD^{BU#Wj{;9;^Rz9q}#IC5cGRNEBY=01AzX(W|{;!XOh|1=-e=G{3 z(T<}W3-w-Y4~EALwgxol>+5!tG^i};C4=8QkUX%DHyhXAY=}^rGl$w-r~rG$G024- zBS=2m!*RV6A4`>#t=mo1y4gkP^PD;Lf0e)|xU=CyER9S< zQlZ@mfkF?)I`9yF{>PW17izOEf5KURU{)vk5q%o#%= zP5>1bAGdVvK$P<6qAvXpGLhjp8w3TsuW%8qmk^-7=`{WsSiQT8dN~|#4ktkUmrNJ| zH9%bxo5DkKcDr>-kOp?J_|!KQWox zdq=qF5*t5wRr0iT$Z68%)rN@p+>Vj3Yy-1Lv9N9jPSrI(WbjyE?MMb(k)+P%V9>zY zv3(!T<_VD{kL90wa-rS~MZ!Ac6LVF@Csw5~K5>HzW4)1LO^g&IB{fW)vr|N(;7?S+ zZ$EnYpo9ATn$y+kNP)_0f1d6T#k~h`^8Z-9wcgK2>45asirOmi7e(_RfJ)}Nf-73Z zvfW@+mNEd$7wG0j1H84&tW7L$)#m_FFY5yVAKb&$D9ZJEUaldRNxiTJs2U7Np!fS} zI!Pi=J^%!U_^8+am7*#m=ko~;$8w$EVDsLODJzR%C%jVS=_RW?f4x+e#H&-BqUiQD zCpMz5LU)Ryd#F4`(d}zb;YFPlA1u_gL6Oy-YtG?+#1q0WU~`P45379gso3}YhCot; zs;v$dMK`O2U1t=DjcawacQ&GzY8171uBfQBc2N8$ryLD+&d6h%beEPAj_^Uc9$Y&c z4Nr&DY_-$Efq{Eqe?y0xF2j*NN(ms6J}mL{CMM!R!Z2Q_yp$hS(Iu@|=Bm1;dWX6< zQ>=!oUOiSV{c<GD4jLt6V`@qZyQ#YPfJYy zqs^U9x3{?3LZ)tRgIH#PXpyyHyoTW%5?Ezt{XSGXp5YDaR;_T0LZXt(lHzvClL@dh z&@G3sR}_)>L{%c{(9oECmeEbOcx!KWj(mIsFlUp*f3Fj4viUa*L=>%lB+5$#NrSLO z7-{J$X6eUt-fVhrmd*kCV>-_Vq5+-P(dwc#nJDe1sBw)ZL1sWFU~S0>SnFPGG;0Ls z)hX(Jbfzr(X#STFH-uykT};Uzro9nBJsTwyug8^%vA|c!vopW!Ei;!U-@hjR(K-Uu+?1Q0R+d^&&o|7mdZe`i~Ni^i2V*=(D! zzHh?L{|A317=`<9NZ<%i^+JITn!Y>)Kc{-hAkQ>qN&ftPidai0NpEn$0hsdeQC<2Q z4Ke1Zd5J1U7-0@u$X~1AE*#NimUqur!c1zISu9(OCz>;ibV^R8p5l^4G#8a0^}#8k zhINusI}3W`8n~4HguoHM(!BZ^_Mc(^GS8sa$ICy@drbA5|NUXXV>&@~9=R4AFOC>& ze_rKA+*0ZA#7hqr`ceXs){=+Gu^0roZA)hTUg%vb5Xv z`gtoTcv~xzq4@yDH6zGAsY|==>*<@b8`ipNck&T$;vVmw%nv`8FYRbqZH-&foLUF` zLi`=$5tZn1uz!xS;VHf?mQK{!-XZpRf0{`k!%`}q0!vQ26Q9+$S=9Yq$IJnaf2XO0 z(_kr7Tk0Y&^~c;&e?-BK$N{pN+`yoq=Y{QZS%Tt+S56kAS7o3BBMk&~lunSoJ5q@9 z@<;gP34X~_?vhdFoPhrGfl4&DKRyArO$K$WDR1D8({omm_^yQr#0W1$!^mJ5e?!No zqU*>%4bBK^gj@WQ=goYiuP))>pCee;f29wRYI+01&kwGBb6G)9@)s)9e>R}1T)|+B zAA(=dn5#l(UXjj!Q)hu63ssg|cWP?jO|%?MiviNz7-B!OD6FuwLRPf=tWhOJ4}=m- z0l#*CJW9?D!=DZNzpl^Dkl`^Le?M5r1VS9qI(;?f|7!EoovqEo?f9YJ;?QJ!k9F&^ zuAT;~b-cP8*DE%VtjhiBW*xAu;ey58T)i9CbzF$9?ugaUNO$EE2de0KUNTq3_WQ|t zhJoC$XCY1fY?7ij5l372#5iBM^FpGey)W%Oa6RF`X(}INxlp3Jc`vr>e-Pn~`>{Qy z)qer4vd(giL!X8Uh?|WM({vDhoF2u|ym`U-aHl2L*xO%OXL#8UHNjl{aY%IrE1HNZ zBDv9I6*Jgu|4&T>jR4*T0CP}PhB;?vOvCV-8Ro%TMQiA4zi!naC@Ns$^Agn8H zMGMM$rIxZ*Nm}&;=1ELxf6Q+;%RA0yp>L?Scp6!M(k8ieCv98xf&Q_sWV@3#0eDkU z@iupwow5N6OU9QA18NosOCgEBBMuO&<-zNDoBR7aU)4{I=GRUR1#<~bj}-6|q+oAq zit@wIM!^XQ$==8~`6-5X5SWnKU6OJd1{tbxQK*SBw6@5q!;vbwe@(O%oR#GqlWz^7 zii>a*83uGSvMdXdd<dnFM4=4@oE)x#bik~vLIYNl?v%GNP9Wy+>H+DfdymG9s z&%vkBJz#5hM9&;FGiCk_J>RLQmOHnLq*6tN0juAVdB15*(=y zA;E|&o}VRIkx!VN8nu(5lC+PHBdVCRA^wQ& zjFkFyZ~q2hq1@3Zq0(}ZV46ZDbWy;>j(IM}|0`?bci+K~e^tH8-UPZiMq$N|=ns#N z6O=G~kt_r9LHlg~gtTL+D4tpP2JD#MmyG#+*ePKOKjdjDISQI({DgJ>loU0Vv2Y;G z`?PqbmS1Yi3I#nD(Y0PhJ*FoR>a!?NX?+&z=RQZAM1s{&TMM+c{n_4E^lsJ<5O=1M zOM(sSeYE!}e~CBz%W{*@FTFcL#Rzdsq#t>rMwe`vIFfuZTarZ{b2swx{Gm12F|MU9 za9{39TKQ%i_7>CNuOP7t+b2xIzanjGPtskVA3iYseeHqm>Z`VsQeJ!a@&ns1O+tkE zOS_`qh&+9n4m_yGy#eB{F2dWQ{m^0ksv?aajI(|!f65P=V7$p9N^s@{RTp1*CyhSj zsWgD354Vx3O7aLeeL!L$I_>?EPEcc5pQb3Yi64K1Bk%GPcDarmSD*l+^E-Mye29+I zkm=J22;vOH2m6*~NeL*N2J?MVsN2U1T|i-cfr6qB!Z`=uXC%q(ZYYtt&Es`c&dWUQ zXyt)Ae@^62c%P9T^?$#YCC`910KANutOk)t4hc!Ji$(~JMIpKP1SklF}XyY=YP z&HYljm$cmRs5ilKSPcJ16^!nT)YQUMRv7X(0nsgb?|cl)xGbn*gF+h8hve4Qil^c- zf37K?^2O#o$}}%FNO5^?MbiY$@@_+_+g+HpX>u%>P2^{`J+jDQI|Z64Brb-eJ)#Q{ z-IQfXOUu>1iX_<$4_I(n;4|)!sY}P^AmNp!oj+ifD{MO`nor5}uj3H? z87g$?AB>dgCj~xK?{9r9HaEUnGIL2U1R&)G^oP;gz7p!0E)fepqx-x}ZPT16e+X!a z@2VhvpyI0gYgyVO;h-qM@;+G$YBH6yuUVGdj&wvNMRyP_JC7aLRSNBJiVGS~DO`a#gMa;vsFZ?c3c$5C?nb!~-Bf@p$4Z)}Ancnu zYo*AO9jYhudWx6f7-6v=gFj> zjESCX-RC-QMU|IH%2QYjT(!?F8j+TNKS^tw>+9%JT~C8*e-_hqp=Lmn^!_?6IRKoD zIQ_}+Na8}|1q~E7Z|4T5ClEbpx0*f9_>*xD>uCvatj~Kln28sX(!VxCua&_M8zW%)Q+ey(MV1&+j)UB4eS$R!S+ehPUf17Y)5wV zFqc4?R8<#9oQUaU42*=>OIPGK0$DtT)V{(r6Zxm6v+l``%$h2KKoUe3m2acUy?KZr z?ErlzC4bNsLM2dMe+Dz-Vxf-S(Jg??3X;9E;IrCRFI;$Jrv#75gAX*|cwm^oQKT7f zlw{?J8uOdKiV;tgq^JBWE~V*Ej+10iZN(79yH}Zhxnx+XL^Jp^sJ~-=w}A3x=ZTf_ z4xhs*k?fKEN?q2Bw5Qz=A-N(-Q`aS{I%*I@!(3{~8kOQ1f85Xx%&j2GChaQ1q1Qe% z6oxbAiOj^V<%vn{WZqx$P{sK+gi9_noG7bEfd;Z;@hP9m2S0m#K4~9aTx|w(@t`y` zEVUxJ(pa#G`$QBA%xDMY-I?|~AVh9}L<$ON#?i%Z0UP9RF(a*tPP$Y8lXw;s6>14> zo1T(DpI--)i@CxON-mrjLlKL7Hdck*MA*p_NGs5hCQ;M+*-I};r zaz!HSnypC1B%T#Er~lVXs;%uVr}MNoJ&C~qC7rar{n1o>(Hj^|{_|i!c>w$zzZ!KM z31A-M7TjNsMrLQLGku;+M8Ryf!8dMEd~W2;Z(2x=e+;!oxNNcYO}C0sODeaVEM7b( zf*OtQRtk8{AM*A2Q-&ZFx0ZmF(+v4GHa<>yTh64sX-@}DHlyaoI8U+E(Hv*X(=($I z&~9~vFUyt~Eoi9-?h~M868}=rf_w-goJ*midE3;hNQ;{Kf;GRpI0c)cu^}szMo5(u zqOva3f0K-(3wBv601KE?c@>RoLECPx<1b(sn&)nGZQEA$SX`cFu8AO;zv2DvnfduI zJj9)|WG{rbv}V#+DN#|z;q2$p;(4z)hPhuB6L-*8YeigmU=ZFgHz5dfLcvEPg;?I% zVlqSfmCEJ$)5&sL0Pr<>U0~>j$P^O;L#&E zn|&U&&vDX$2qx?TFQ4cRMZQ=4WQjYag$rH~lmuXl01KtG2*`xVkGP43FzN0zsY?JKlGln^YO7BEYf-5 zTu#&=A>yxaRq+Va&o4LVM{Q9ZJuItV zMPdIw5|57^>%Zw{cX&Wd;SE!_!B9v&e;{J*b|i>+7c4!y^?4hccdB8pGNPy!!0oLa0%7&W$&_`!9D%AT*V$rVvt0 z@%qhU>bNR(fFJ1Ob`(>br`uIbA5+G)DdUzDQ=F+gQcNEc$+d~(b`(>bs9RP{AJfLQ zY2%g@Q=F;WS4wiHvGs^t|^Ix3Go-1}(nvu&(e4p_jajPUcfe`F-DY*W%n z3Nv?vu4R1O%xBQqS<)XK5BoH-98g~bxU`t zKbRz?Yt&lElj@&Ls$H1QOCeix@%s=;A<;@|1j&35o1qCCi1s5Gn|9WTVCLx@;=+-VLUO-Y&t@{+hjSl=QBN1x@-R+lSt3;O0B zC)y|AW4YfC?;+5Ttw~<+PB@knBD_dv6Qx3kw2t5Xbe$fgVKD&m?YH3|!J_JPIsjhH zW9+o?c#h@7h&TecbVSF;g9O7v;1rGrc`dw)-%p}87ay8y{Ma} z*oLVku2S_y-JIs9B07Q^Fo6$3-{0Tae#FGl5ih$}`Qe^t@pyeug)I2cxK)|b0GhbV^YbAQ_3+}hkf_=z%YfEL@R7kVBk zO$bZEN*NQZE*VH@9CftN*mI_+x+79Vpa(&zTE)^{1GAao8(}U4+hL8r)X$h(jms8C z$1%u(7Cb@Gn{e=q(Wpn9jvg8ZC&M%P@l^ur)hNkI;S!?{e@H#ZTJao|klKP6%^;Hl z;e^mS*j#@No7{&>r|^W=l-fV+jeq4IfIzkR5y+gkb0pp|1M~R=1mo}JwMbHoGUafA zkK+`zD)L4P`5HZwYeAj>2Bk1S&#gleD@AnS%QXhy;(8_lUgQOxI7)sdeQr25svkLY zP7)w98qh5Fe^KgD6cOs@>#s)Vq;=(@J9>jk`o@{b6?R&5mQvsQ6RGghF3U=zc5QY! zB>o(!b}glFf}gZ*&A>Ja%BZV*%`=u}Ma>&nlXS!Nn&@$Z{JP}2D(oQP20@GJP)JFW z!mFhp3Q-aSj1xk>jy}2<)*Yl4dn34xaH!R5E}t&ke`a{q3@@5L^agFNZZ%d;GtPmO67P(MdB|An7g#2*Xu}nD%5t(R&tk+DrnLH! zHK2=he|chOef@B6YwyiyhvX+tA23@)LJ+$960dSu`nc&Ai4wh0WJzOr_fPAkw8eb-}n|n zZ_3~ts0hktDQw$M=$WHk0R^AG;#(9mfH;MIe;o~{{3vo9$2zp6=@}^|&Yxafp)06Q zHBO-c>E~Z0^rh4(o)_jAq|Bi0=DrREVDK*Ov(%?mn=%p~PAV|DBhe-F6+$-JL$l9hYRv0vsY zf0|E}`@J}NOIedlP|MKGx&qXp;|U0Z!(0a~ECjDGak}ce(DyiUew*TUH=65rBEEn( zz?dSz-G?jH3hg#>UA47vW1+CzYNgrBZ7!ZTpp0hwiza&m1?aX1Rd`L6eYTW7QK}cZ;2EF2Erpq^TaxX~=a7aC6)5~RD~$)k$AgpIkN1z^J!{qh30kQWMtvqle=ksH zcLsr-0+rS%(JXTLvWy7bP34Jba}VfGt0LZc!EsvX1N_5?|646Ry1kXDjdEV#@{K0Y zP9|Uz6-dbyrs|eK=9L)owI6Y4j@)f=i+&52>qmioA*&(fO!8l4FiH5jBPMrycr_!E z6S5@I4ONtn;JPu3p@@rfxJY_)e*mnmCR!vEQbG~o;znE!ASX*E0hB7aHh8|*pMDVP zD^WL?_fm*@uhJ#m9#gT7cr^@6c5Z-Iu6+0;e|P7PL9$eyYxq6%Ut9M}_%}^WnO^l` zfyq)Oi{rYDTzqdC_Gm_i$E;#_Y_=_vA(#bAK>gwpA=Qhs*Q#DxDy({uf339W1T`-M zYW;cHE%X+WBc#3PYYUjc)Fi{buQiEC^YK%GWb$;;_EFqu`K_w}TMdK0)pyD8E5?eB&4J!ENS7`^?qn zSRYQ(bdDb%B$xroYY(zQd(}-gs}3pR9m1oK^R&5~VU1kdf0s34e^uv;XV$igJf@8b zVTu(yTW@Xh`CLSomwjK`N>^sXW$o^}%BbdYaw{P9GU}}IOvSmPUWVK&wusTTtb2tA z%{zrsH;ZtU-x{#8dZfR4^U8&VZ?#wcf62EX!}I1ZUG?z*LYM-N9ppQ3*dW<_(9mvS z$MW<#F>$#-5H@cEf1yz|@K=8G^JRS^cQb`x5IsKF{q*#4qaUF>LXPrucX0gC5x#<{ zPJ^CXrs@m|v}7*aq1XKewV1Cga9&VF&}`Z*$?G=1K@L7{etL~7+%RK#R4|$e}(CLPCjFo8f3G@HFtYUa>JgJfygyOIAa1|Dye@t}{pID0~JEsaj&xPd)&;EnM z194k1>G%+zOKuAltr_fs?ceo|iBeww%B^oQS1zceFphkg#mTpNRh72WdTU540?$^c-; zplB@$?^KUN{C9H@OxH+{r!^{u! ze;KKlU4SZJ{g>zu_K?}62oWAP0pC9SUUdhb$E7?F%Y710R&B3?G3v33t9#X}T?EdiZ8@ejfyFfMdQ|_CZpTsX zj~7v|)8B+U(<+BcVaGSb!%dSVg zkQHF%B6XZz0I#Sc~Xy`>2^^b1|AwCG0lWqffu8B-I#8T|DcYH6x@C z=IK?*Sy7OuY^yzU*3zNw*9RyPVpc2Cyj0TS%$B^mK)er}8(^=--5}mjTRLEQe`BqZ zf!mECjl@4i#mLU@tP7Nb$VI9M*9oYzD>TDCPUN*RYMU*={`6vn14T+%p&G%FQ&jsj z1sx80P4Dq%M_)Ia^~UM-Bwu2DX|?RJt57@Zp2DUcYnucYu~I{xDa_wNo1SF*Ha&)n zRy@W%9pm?68n)@}m3?HhUg(5Sf2nl#1DHYNb~N-foiMcuj0wxeBHsCuMS$Cm65hi* z`jkWeEgL*{9%uvKN3dCLa7kTh*t7m%3XBYXBkIc7kiEo!%lgK)mfnkD;~G~Eo4{6C zz!=kY7BFY~%BM(-wI(oTh`*BwOsChMUF0l=7bmOdLm`!P%H%rBZo>&P826pMwrY*Z-GPv#V1j^;>g`I zYAHF#7%YqifQy@l1ST(4wT*RajeDl8TZXh?7nnM9PzG#*4Q#<-Et;cR)X?0iL2itS zK#(XcB#!QG{3{n)vn_~rf5ICE>m_Te_1ft9_is!z+f*_Ch4k}u98}La`(SFcb40R@ zd8KMkX=4jf`-vLnTHD1~#lg(h?YTM|o5josqY>jahA<$^Dx-y>)?ftd86veC4A)uN z-)}lLUUe9%+hc*59tKK+QjuGLIL1Qagz4t|rr55xs&V<-Th%<4f4I9Htrf;%Mr*dB z-NuLpgbs0|SZMx88(L+19}@8!n$9*C=FO7)4u-g@xyo`{?L~`CZFUxzw6~D~OnBBa z)Opq}j}Lgr0;W1+4Q-^sZB2H9aT7emD2%wl+N&Kf(;26&!z1KA_9qxGuCDNX#d-E~ zHebfT$R8}`qB5dBfA=&>{KKDPn23 zOUSg98fB}XW`{XNI#?gmOkNYhXksFm?;MGwb+nOIA-ZtCzB)4CJikrwKZa}hL=$~h zp{yXcl)3(Or{f$b9Off#Gvto9i8tP%dgE0$Rav2N0R3H+f8mR+1l84$d-k6u7Pg$rem7E-J(czgTE<5T|F@9asvUWANRl@IIYg4Br2ZBMaXYeTlC?U(~0Y zB1-2YmQDjLYC=cM(hFdSbY_+eDC_XQfuA4^E|}v)oZHFlV2~qhupqXhCal!pis7D%Sr5(PY zaWcy;;Kn?~p42?Kvf<}y%^|3r;xXlAeh59jY{)&yuF?a%lLq%lYEX9p*^Dq1f(%c0 zclU=wf4l>UKR+BCe727}sz>;X-=TzGuT%H2tJ-;0E9|((W(+aFOY|-$J>Us2e6P9< zlxo|br}G3g&^G64m==r)7!V2)FjeJ&Fwi&!7Iq>4Lv`ijINFEHZo+b;$YejJt|m?@ zkODy|a+c1Yrufn<_uAZ2lLkx3vFrOsLbXEiqVgAf=Ao-HFN1P`|h@y>ku3e#yLsKft#Yq5imCWeKd6+vII2cJ+;b;={JMxR+${z|IJ$PXgpvvV)N*q!rxE(|DI`rKQolK{Cus1;f9Fw= z(atkx`-F>hnSm6NW@2oGkpk=LEjsi#0mjSc1;TNYmihsza0Zx7K&>UoGNYxZV4iqA za@7dQF^HdOfnmYt_?T&0R3pKIYLd*N<3(0v{pi!5li4MVH!; z8k>HaEU)tnlHa&HHIHG_y?{7kDF^|_!N_?4qLC>sDd6QO1=P`(2aSDmd76Ucuzw75 z^ks@7if)l-*a4rIjQ3R9CPw2I;*;z7f?wf)%zSo{B{4vaU=u50)S#IeV}6-kJr9@l z3aEg?hl}A7OY$f)k4{qe=*N#~dL0#zdkF}ZRFp+nMiQ&S&ajT)-HDA{;7O8|LgaP6 zg3LlRo0T&!onBg zv4bG1Ef&yw?!fJ&jtIC-#SYeMD|7a;@zvtT%LK&EWeOVD0`~Gmh7VFu6o7~JClFM2 z>V&EcFGAPe-DPCydK)=1G>oaULa4)nUi>3@viECx@pFc&{-;TCo%IRv0)HWD9Rx7U zFOunGae;$_&obO`TxkAVX`@2mex#|JsEKJr*TtuKJ}z}Qm}y{}pO8r`8vLARV>47n zf-+ppXOMC9X*se|9^g6`|j6O)V{AcszX+^<87zp^yIfYH**ty5Z`62bvH36 zbmW(DG}!=*BHyW{+zOm_y;DoM6}Xac1kWaw0EMKh96qa5E3;}HmQtEhFR2#LdVjT~ zZzQNE`94^F%neG1opx2hzfAnds}8_fo=+NP#zCswCgv^6*ybm;fro>J*7alzz!}igVWE~k?Dv_Z$_k} z!;g-@?6sOciiqE?YqcG1v^BV~cn88rDv}zN1+I-=4E$A(gd>(^_37XQSfz`iJmK&Ka2$hsPDfqF!~oc_QCIT)wSu9Ft)~}l^&!A$KdQCxDudh7)hlw|9NXoXbAOSJb@lPz?w~_+(c$SG zgaNt4O31u$&jvK)5$70F!2iKV2YeQ=W*E6}Z zT4Pt^pk*FQ@bsZtdd9YbeY_^1ED>TBWB8+tLLa@i<5!pN7*D%UnH>-0%L36mDqvW) zAJ0fnG)HY=J1u5{#jpv^Yy;)C!rkwCPN}$?K1A4s6g3c!~|sp5j;p&%EK7 z`*t%HhNt3YCZVvqJu`rferPVTwH9qtwi3eXz34R)!3rzeZehQw1)iz*S|$lgjTTLF zd5*xvKy{pb_~s``msju75b}zC_!n`_6~DsyKw=~Gn}6VFK0aGUr(Hbolm^32e_Ka9 zO40$>$_j`49OR!@D4jha87jL?a*DtgiRxtl!ZvhUk4k+v)q{VQdvwxu-z&rh3j~%k zLo9gW-$I)0i(+xsh13^1{Z6OHOGC>y=D>N(c=L>9qMN2yM@t?6NUXGsVv33N*q58iIm8SM;%i< zqiqO**%5_~ zj7&BkXh|;c?KQirOqOxw#DzZPaDYzD$p}P#BY&8Oj?A6YAsSeuRP+tdChPRw`f<|_ zm%BiZgjQug`q>twa`Y#C$!I!T-+dQg@k-egu`=TsorlOYYdB zImwHe%Juz=BvvFz`|%TVs|2djDnQ~C7xxdABtaEKOkesYm#jTh^BK*Ib~XV*^|@)y zGJlYR6hS5*FRQlXvWkoIQt>=G*sI!C4hmc@4yKqR_iM_h1279jC)}ebEmpD;bYT|s z;+oHt^Ia+E(3!jkWok1IU>;R}BPA|*Gq5YCbe&fuw#ceiLHIKZ^jZh}27X++N16^4C2 zs-1H<*Mg^bKA%sKejrrd!X@s5&rbJWbq(!tY4S<;dvlzQ8#+Tx6$zbn;Gx;F0DmWW zdAWD)-Y0>ZDj6Rd(3zn@4c6c$GHe4c{7CaJeg6691>58Oy_Lu|O(DF1htiM@Vu%KG zL(Yq3I%6n-4d@N}0Z+zb=cOif1s;+pp-1oO%#NoaFPs%_cHY|dTR-(nKICuu-t0`| z-*ikT=Iz%_L5;h%Pc$KX>(tl*^vCeX~yxk-UTd;Uj-^qDSJdusEYwW0MM#3US zm*ZNpc(b5aU`~tSlO6shC5j%KB-M;VoYK>g;^88-Q7NxIq{|sb4H8vW!o%jW?{n=H z#<@wbuMQ6v??$fG58*sag!2|?JEtGN^6=xAK0Z2mg-1>tQ6Bz%SrL_fL4U04R*j8& zd_4I4ajna*|I54V5Avgbd5;?g`Hg>4mwkz;9p}I8^$|(DiNYabLZ^jlvig?)j`=T% zi^0GA^E*yA!WRc4N<2B)ybZ-2Fuo6=t%W2o=NdOhAfCQF!DUzng|)x=Dpeba3;zvi zIMvVxdRmSGxFgU!nai~1Qh!`Wk3We$W#9x-(*T=-+UMFRd!r@8L<27)6D}r$<*k)s zIjHXdnn%uhcc!ycd_%7mlX(U;1zb_ROJG5Zr!ae9yQwOc_vAHjRR(y0IHE`H9 z1NB&{K?<-KMhru7+@^BhCP?0PF_)WMP@jE1@^fNmjdCtTXo&Vscz+!7XJ*4(>4J~R zjJ1q{(t^FYrR+FQ3qn_jd@1r{7rQ(fT5qXb?edxn4TnoTYJXMgbtz>rWHK_lcmdvg z^uwGJ_1qvS#6TDyQffqn8O-OPhp_n_yz(#O8K@%pRrisoNes^Cxb?KP^?m+ZTcF># zvk$SY!s$nkXzB8oL@mwbRAdHXit(kZZ?zn1FZe55V0(Xx*C6+Q<|F)Y!I&(Inow1Q zxQVEu2Z0epg@1Q8PN#5DR89U0MZFe3HzY;f;_n~mGF@JeT!(1JA;f92H~#8boK4SjP_3G?kYwKjYd069g&2z+!qscKCyGBxJm^L!$WC8vZ^G~Qv(3V*GKm)y3B2=8SBmE9>Y%&%;Wb-W== z7W4cnAs6<^QUbryd9j%wlLaWynQ*~qve5UWKqmQ}G`E#KBeEn2c;IP|N*vfjO33A6 zO(|brqr|G$PB_PTC_Q{rv-qlIfvIo2@tUT)qHlUvdV`&*Uhb7HzbDuRFWh?l9?C$L zLVwd;Tm0ijQ5y35RwBc3a7ZGNVIaRYx3;cilz8#giBA%X-Ao#t?d{pFkAMunxS)_{ zc;sK*P-rOWh5QouLqhCHIqOMnpXQK3I-evL5*rf~Nx&aqKsU_g(mq=Wc#=8qs07_Y zVtRx`;OJxVe2&T11=OoVfkBG)tE6;}V1Mf0m(uN0=SmxOU58vKZ$PW;P%qXeM#NK$ zTvaM60rj=nPcv}Z?z?M7k^8IKQfXC_p)l9nrDfyob->t}(2Ft->5PqIuz;jVF{g{5 zT#aosnUEXS)}fvnDE**>knTu4w;8^r3_BjWEX63_D? zeMndPq-fQgCv{>i{D=x?{PsOQeXqq?si2vDg~yi(-un4b4oSc}3Cy}W8K`sx@av6$ zIk2pjdIL)ls~Q?6g`t`ks*?Yrz8GISFIyTN-6J^n%L7is=0m{ zYaWL*OVjJ!{CdeYI-av?6q7r|h<^tGq$QSqa-ae@HfHeJ2VZfnI%>dQlOmQ@72k$h zy$a$c)&dq{6zNV?XyoJdn8j6yJ1dZB0g8FZhvJuM0nB)$Sdih80$8>w=D1#OW9W>g zf-=RG`62usA9aW;7(0}lOENZJ`sVVL+Vtmq!rT&FS?c@ChlH3H_a6i&Vt-#xVMTlk z9Nhs*j?4^1z0K4x)YjO$)oF}b6u-z$-)F=OLRnojzxkwQsw%F!=A-)LyIFJL1_WRM z*vqFz{!1Co$BmS((gsD47{*`JcTR&Ein)AOW}5Emwn}AZTQv(ZNy$(3B#mB`2DpS3 zh}B|%rFmg2hTH8-YE3`Ncw%=rS1 zU{nbA8&XPb(s8g`*nji;?bkXs=rr;{$6XI-;DnB2g-(zcI!v-Zk{hT2J3s8aP;k0f zX}?;(~$z(2T%J@Y;UW6s941s$A5f^FL0ZMgm%o#V~X%Hp)6$0!&{G zCwPTNVQ*ifIDa$B>$dC7qFlU$R_M1KHY9T2VsfNi*RT5Cp=uMI!IA%xEN4%FwGxmx zXt1#R7&fy=E)uuZZnsYz_V&$^?HF2H9djfUNuK0|@%6e$W@orsjq=GP9f5H$*8ZR& z>Kr5amB8AfNSB>xvF~eL)DSrQ%ViFhTStaM4#ncQ(tmWTcKAdwP)Rd`w+`uxWJ&cR zd6csfBUBX?Mb#4-0?$TgLbP5l(A98+LR!t8u3#)pV;FkXoD|+uHCO=~p$b!^rhsm= z*=Wk<(|!|DSIM&U$hw5s#V7_32>l`@zy(&zR2GsM7mbv&#nht)^Nkw!W4Rt{&5-t@ zixrsFxPKN}faqaSXZmSK24xX}qyZU%mr7}dN(Db8fD};l?9FmTQGuAN$^KKJ=AN|) zXfRLsaRu=t};(4yZz{dLYxOTgGb4h5` zTQvs)6`lzmQhr-iC%;!acCe0~Vz11{*O~x^T$}+W1??Qy-ob%mOmS(&6jl;r=ewar zo`3TB<0ykmbrRW+-NR&c!gT}h4ot_^_#H>oxpX`|Ie^LVurEfZscz3^7`O; zU-{6OJzB;WUOkg7s454wo6t0$c`>^4Tz`gxVgF`{&H>(J{8h8SEZnf zE+828FWSVnNH!{dR4cV9dS(1)CnDBY|2!&C>s{mMR(XoO^oIL0sKf+VOQ#w!+kXe@ z;?BHe`q}`fn!Q#aTWExQ)z#O6>O^!N9Bz(nU_$g#efzU{;^S1aroxWO5KZ-ScnZH# zi88pHj48%n(3<_Ig$M=nL1VK#ZhpI4lySFq2?UtjA2m0P{M*=L%(z?22!VQRc#tT` zAsNx207EW(Lt<#vP;ZOBuwJuiaz_qiuyDxEL;3GjYC6$KxQgM0DTleA7k?1R*q(%T zJ1@TW8ipb13J~>peig!>V8D^6>j_%U>PgVE=>pZGNqR1>8$y{`iVpoT1`srX*#w=w zwu(4w^fPMFggSdBOt{yK$XGWJ(71N8Z)7{;AlPV(@Nlyp(RQlPn`-k^^_n%Xv0*1FQYK{f8 z#pX`0IW2)e^=Pf9hXkFxN4(|VU?22~LYWbKgH0+nyq)H<=yfo;zkjIDoz+x?*I#=L zQ(Xr>1FHy?^xqs+^Q9OFIR;&ZH=d_sebE3RRo?d;r|{mAiGatuJbic6>=YkJ$B+q3 z2H)$^4jmxtQ6eq?!D{`!PKAXn%E9>XeTZ1NuJ#!oY6wJOPAENEQ?HvBZ&)`gnE&ib6^+t-L8R z&hCPRa9$8U_#a1?4}+M1TvfPskj?mQjve7T7K^_{Tl70RIRh(Pk!|%Q;nT%D!3417 zDC!HtE-P8h^KanlAb+2$N$z=#|H^ zb$R1+i@0>l2K%VYOf9dGhrL3IfWGTVZ5m{38z#q!`RY;Dll?EiD7tqrd^|V-;d~6< z$RA|0`K3hCJ(`l`mC|^TfjE4PnsAB?f^Q`A93Y=9=IoqZxD)maBU9+@n)H{f zKyCf`R`O2*7C)drImpTp31SVHAy2xE89f_#L*C((d8T0@p+0wmgj^gqOsXfY$5g3X zZN2Zov(sjES)M$^$JK(w#wfX9WvQlbXT?5HO+ztz;eQavsaVAr)kS4k)IRG;&QAMBFO-RuGWar5UeLfM|s6TWZD23WP^0{p?2+0|@7{&iIdeFM&8 zf^bpG1Jx|MXE2--?GUCYA$XK4)!eZ)>Q_g5M{=BWw!kMD;g-{z@$2jfU;rYYnFOEF zn(&Z#7=M~(Vw#HA#Dj)9aD!7I3uu3G_>e1cw&f)bR?kR6@1nBnZIBGX#p}rcc8tP+ z%^WG`MZ_gLp($*yJn|#X#!UP>HV})={==z;9I!QO8Z&nJlFPwP8$&zK*hf2f;(+p^;JcRq7_Qhk% zPW3XI17d+>AyL{bL1Bsyj?*^>NeMngN#+fFgF?Aa@%)CDi}@a0P=rftw1hOm5M7P( zz<@Z)TP5q*I8F)DkQ;o$VV|B1KR!L#JNoi4JXBF{W0)s{onm;tu`&s zN}cLD_KdfTDXXJavdt$$#e8vo?(RlO5S3`W;K1sL0V=*Rcp%S67vlcuRVm#duz$mr zTbDb|ZC%uBT8_&In@=ugz5>o;M;G@|=jq{*;TV##b3P&DT{7Pc%P7#ugRt z{HLe|^KmqW9k6`;2h3CyLoFsMU4In;G@R4FbP}EZc?S4hlZMpl7t2{=^D7m6>eHAN zetyFnu6|TAH9AM?sN3ACYWUE_qaTxHe`N=od)AjRqHHeDBN;Q~Cqr03988_RoENq& zmJQW5Jz`w!yWaEGsoB){TKtf02+elHa0?!6faIBvyxA}pv&&^d$5$0Kz<)n9QO@9r zB7Wt3$HNenCfOgr|EdqPnFZOo$8W+ukaq_jwKpQHVF90AgSWc+0ZnoXui^G1FIQh| zgQMS9wYpc}wQf&L6Q+Y6oao(EFcf#)5IfRt%U+nD9Bb?dBe3Coz{+Ma7_jRmMC(Z* z&G-%Itnil~$p}UP8^S7He1+CUuZE(}tVsN%8n?Pw} zn%@u_rmTcm+Qc`4?Z^Dt6vF4=p+7b;j#QfHoFtCStDJ{Ird4-B#(!|)_zl#En$aW5 zXLnXI5;xBXeVJXNTR;hUxsmK7Fw@XPG<`Fr>=M5;ad^2wKj zll@~!G(V1y27BfA>3`vugReXAl1{7ZAuWkb9%gfL+Mp;0}gf>gM7>QtvBIcZm0qx}s*pV|){Y-og|A@PxA4KW z;LF46r3(7vVGnFWq$53`0ykWuAG!M#kXzocxPPGCBJ?^f!Fv2Oz;y+3cAyWcTrw(y9*75&bQ%VDfA;xL)&OBsMo`U{_z z^Tnn)K7EP^@nUJc&b1z;ldB^g#L3t@6n~Hs%5ZqzE+voxi^38|_Mk=7EmEiQfL$t^ zOAs-BJx3nzzn6SS*DS;>S?0;XX z!D+Muf_NOsk@qrRz<6=Ae2MIDnVXSd-sZz@em=^!PKElIPkH4CV8o^>e{xSh&Y$9y zqCQO#uL3eG1bRyfQxn+=;7b@fDnPAr$60Cx5TjPbCc*)JaukhJoIio$SQP%!pn;5@ z&^@7$b+6!Ry{+RF;R6;!85(Utseg$GSezbQTwGA!p$YipcWpvD{JZ45bmXt#dy6)fath12^nP}3NH@21fawRV;jIS&r8x0FaUA17=K;%-90p2 zp*VgkGqv9cxldy;jW}SISYG~P>5O}QD7(TdZ9JpO9(=I>;nDFvPBx~mS$q>*F|Gj* zyWm=(#WB%FD6T2qwf3CD02F2>FABwrW!gAJp+I`D_U{mE@yEzs&Gp=Vsiyz!ZeqdFirj3c_>ZnaJ# zvpzvLS<>}Rio_3H$nu2d(yFxK8b=vCcP9XIyni%0A2n>5TD#2P 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 #w;fs(As! z_<SnQo%Ou!1xd(Y=#FbBv2!aNQ5F^0i$aM>1 zbrg5o>$QJ>lGD0rfIH=%gJ*|2DcW2hdq4g1=V6%?pLy%9IgtHr!r@q5JLn7IsU z$Xn@05U|gPT5OgD%w!7rNJvggrMN?#E2uN=uU9$!foWCJfUFTmJL{S;XFS^s(b+RQ zL}%L!(b;W>=xpmDI=iPKT03Aqiw=$QZm{3B%h`X{CD82adB-O{0+sInJbE%K$=`iP3&Pe1OX5Wa-rlY+3bEo{NgKE!th~(%%z1LbLfG4}^ZmN& zmX>7p-RQ_04y| zrUlH30XppX!b9@Sb2CCFF2c)CzbX)mKXFS~jEBlN3ESGfdxf$t;jf-o;A*8PKa>>j z#^gs|K~4=*&+VAYDqK4|8zmkhG)8dK`4=2Cy7)Ist?@?iLOv)7CX zlmx82mQShWH{XFnz}KMwz<32=@547d9#o!@`S}JNDLc;Wr2rv?;wjWk5v3IINwI&y z6x-9&V{MZMRK~WEw|R`1b%cwWd2e)MD`?N>O9bN~EkpFs4bej#BA2>ysVkHE8>ae0 zWIN56U`c<79-1L~C`0sc(-09AV1xib3Z+x1nj%IiqJ!V?Q*(q~11`y?qvbSPy21!B}X5s5V^AA4;4B?lq;;QU& z{bEa2QFVg}l~z;)1;6R*8+r^u@TPfEPOw{xl9E7}UX(Mu4m{y22-1Tc8V1oVB1T`wFKJ{(@ zgzN**mNHc_TbKEb;CMpyNCt)Z!iVt+(@vYyEhij6>ds2ja3q;|f}jK|1$EP)dkmiJ ze}ycdXL&pkz-r4eMh*2TV@rSRJcI8U4-2GOaF#z2s-?th2+6Q1CkeZ%kU#R+7EpmO zWerYR&a(Nctvky!sY(hY#OwzT9zoE$;%d6WOr2wNi6zAVn4=2}%ai|lH3$1PAL|=Q zAb6@_0}(zWHOLf|vlpKJt~bf>adRE&RDtyK=aC!=0Y z*4sSAjGaNa6@CMVLOEx1Sf7;3Cl|?#qd{F{Kf5Up(`yc1Q3*h!$U&G}{Zd@z$uyr( z**OZG;m{k;<$6H(ajw7KU`H5O&RVr({l;0pd09HpR%FbQkuRLJ(>mM_0c=AuD(fNE zfa)uty5ZNmFol!{mG^(R*l(s7Gob)h3>QG1C!n!2=J|@;c(KVek*vx@oJ|I88Vi^m z^cBsc>rja!E^!np0gXZlY}-?8pXXV%oGa6agq8PbB~18LLwsf6G5h6}jE$H9G~BPT zmQjUIBh9HRllmK{Hq8Lb&oaD7MPcbvx>WWHadA~#%HU@Uh*J1<~{EzA*uVo+@7|)P_t3FyjxkzH~DioUFmd0MA@Pxn@P&p0?Ji7Ir$ECU7#&W z5l0k1o<$LhSWSOck*4-%>n_AuiS{e;k;4ke`sVPR1n<4#wI$Z(BqLc)e|}XZ{m%=$ z%6*m39YDgBf7?CS%s_W_zItbjS1HxyH#*9Grkg{1=LQZxDZnYD?KtYEy|4P*T4KM(Ep~ESK9{ zZQAqOHZlFZsC@nDP*>k`tXZ5}02&%Uvu2U)K>o}UqybNow}VNsB`iQp+Y*{vZ+Q?U zU7+fIz7BGHGq)UII9~NfSib}x54B5Un*V zrOAJJG7u9z8|pks&h?8N;QPqs;|{oKI9@vNr-ZFN|Pi8CC>2Xz!gEp zL`C1_CQp~=SU`+sVu_8BoRtwaMt%01k-^p8V>dAOXg1D&<#X{DT00=L8<$emke{0( zP)PNgKzzGy?|T{v0T*5A{n(O@0R43v>Vbb6oPUPENF6ET)+Rql5t}L{Gx4w`j zOe1#PV@~re;0;SCX=J0gL8!Ra2xO^94;}G_t(sc&xZb9+ut}0XDd#I*b3`EX(9{8> zVp{-fF}ejTtI#7T$*RQ{)k%ObZK=aykTQG&u#f%~p}ujM0R_?!98~+<3aj3iv!{Px zJxlD}wkBrd&1})M++qjAvs~}e0={o6IKqI9w}c~r#ahE*i@2Lr95sSXGdZFf=!fXJ zw>A~|@sc~3ht2ooUmCtK>D411@r1+!ic7kb^7QhqCtV~8PcJu5#m$tvHNgNgfVIq~ zow2EHP6~8QYSTAKm+-1sbz`?0rQ&}qIloftW!YM>$d~2iXMIU0Mo#(wuD#hFF~C*( z2v;=3-_1a_s0y-0HgkVR3%4nrZ}GTE!+)A&@k;k^*bf&ZI#~U+N~=hNylISYp>5#Z z7UPMplw?~mgY+oV5=(<&nFeQfw8VU+6SSS!Ns}8qrQI}EwtwcvkVt`uj35I zPrU6{&L+i^<(#*_KX(w$aJJ-geyxOZeufT}%gSwp)Af0Q%)h@zEapp!W5s=vr;-4+ zoghg;lVhA(?je8Ql3QTh5iJPUbVBJUd0tLl`yhGwnE0fBxbtAZ2@Y+CHH38%43li0 z14F|QVuxkRURZx@w~qfS@YsVGNw2)JOU;qXrw|CpJ#`a!%}$A}mmJTq>gh%KOH}E} z1d7XW*cyry%^V<4J5nm&xKyCcvl5@b5agYqY%G7hn$eH&2Qi@SjP zA?r(nuG4>^cLdm=d`s8}Sghpsky+H8_bp)awy`tKa%bPo04;8hr$(BLmxQOxe|(X@ zaAsX`i3U>sI`m6qL1bkxxq!F^N zDFvuc%4Rq5^=5WK9}g2V2yZ{&n-w$y++!==q)~qbwkU0bMde<{0u2t5FPmZsfoq3+ z=fOQS$AJCz?yGw{?frY>zWVn@vwvd0H_SKWbF$Bf$@npDXG^^w@k0ea!sj3XAz=Am zn&8QyR{hES1=bK2zSpi{U1R`t0!4RSbJdOQEi#;8Ovvn4xQcLT=x0oENWjBt09Xhn-jERyZ)l;lC&413PauI;{8GB!l;ONn! zk%3>90I;0fHBxm^(g7}zu*!qT6;QK)wcKync0=t3doMt7L=UJ$3!ZT?p(vA!=?br$ z;bNG3z9bb_PD02C?(M^W1eL_zKAwRV0A_zU%@@G_E1>ZtgF9j}Q&8ltSKwU5jpFem zoF~VJhr^p25~K611p6t_kY~}&^DFTts+m>LAel;-&VwX1>jpEkWh7RS-47tRB`MZM z?sd(42DKJv<{ zMr7e0*1&=cz`l4Ze8`;26K1&#qq;t={TZg91qj~tZnHvVbdH z%u|;C7Yi8Y>+65Z7u)NzN9(e<#E&6+v79YN*>k874NOQ7TH5Teg%^4Ki#g?5mJ~TW zP+S5tWRauk=7kWrx>;WVM^%5GS#LX5K(#k;HiOP5^su%I}VNe4nAHuK~m zi}&`?9+pl%%_Xd#PQHcXp5xQ$*OPPT63>p#masJr0)p$Fzk-5e!kB->Xiz^wq?7ZB zN)g_GEr4Nhp|6mP-lpkyRV`G>bjq=mkJ81 zj=eL|XlHwtFK5w13p<8=)HoY_aRQ$8v*%~eo*WP0XBck>=FrI#)FIy-*GEZXIC26> zH(F<6wKk@8npl2@$+CadE{}sE_T(xXHr9=!d=M&(2Zp|;P0sVLAQzczyF;@%Pi&AM zP#6q;o{MD(mFDT>k&V`= zY%+AuoN7ZwSxr>-+ObJbJSHhS0jFww{d}fpCKCiHJJBRo{aH{?3~vxa&ijYkIX*7- z;`q3@H;xat4l1<$+&g~7yq@{nF1}z)NfluL?@5e|EpgoufRn`;;QJCOquXT-!pEH3#|wr@ zA20&E?5q-7O^!{KjN(d{Lx3k_NiEi3Hnrh4=dt~>i;dRFZ!p9q$^r5X4e~ZX_a$9K zm%2EyMN-8ZzI6@$f+!kB1L>XY%ktI+ux(JnUbThv~9>m?+DK{mb&9lcj%XP+mIqZM+I<=IhP$ z_;U?=A3b0o^WMf4HT*;r=5D?MN{)%PEUV*SC8@p_@P^ZdPG~eg8itdK<@~j&#BMC+ zAqiiX9BJ{99NY7khgk4V*r8aZoAX%u>_xC}CJRe1lOy{xgTUYIeZ zSG_QphnA3k(F>Oq9q}xr=!FC9){BPp?VXE#)nzNvd(onOFW2m=B>fK_2D55{A3S_k zY~r(!ZAy|jcr+y1lUCeO4gQU*PIwJL)K0OKc*Y8fm%f?e)P9{ zQC^mT^^)sEN+p%zz(3bYc|!^ZMao#rsyaV6SM%9_b+Ma*hYJ^Ob)*lWvSslS=I~#M zIk>Y>(l=hvM80b-qp23N!qx)$^bL?_J@uLmze8UI*L!^Sw$))Q<2{dxyI8EiC%A0V zP8KDIV7g|HBTVnFMpf}$Y6K&{T@{VLOXr;4$7R1%U6#R`7v%lV=QX@TL&PYW$%t(* z6iR1*aRo}7!x^@hnVV7lv-7oHyu9n=yxE`K!`i-qd+3PSw)dIwU8I55iP{1uuJc0! zLV>$!03f*UcIS(*y*54Xz3*dd*Mfg&iF!4N0(4jmT&hH$las<5wxN}Vl)?H{13_G^CR;vOas zMLQG{uBmN$tC?3}fL`MLS=#^z%KjQoo=zS;IXTXTxX6}k^t|2!dH=F1mlY&bi`Dgi zXpe?gI&iU?2<_X>BzY{PK4l;=CT)90rV*d{wLmoNvx4MurY6_kUB0op{zb0L8e6&+ zQ}A{yB83=DYtf6-v}VSwSdwWHhY2(ZE=qH^dTzF(33PSe-;J${zV5l=Qns7Fb_{6} z-mL69b;)f#Vwe*3slI^h*5tO8ZwkhL4ldkMCCY5_vwUd*auOws1>iFXBtL^&ol50lLs?5be=C1rts0Ct+= z=^@VnJ@&yTJN!F7ZR^9IA%ixAfkW z$*$n@Vs-`03v~F2#_>7)E-znmpm$2CROS> zxSlQNspbuP!ASjO*M~%b$-DH}LbXw2a*SH;G4LK^&qN1q6$ z+QNnYiq4G*DqSDN2=W|%-%E3hlI`XyKWK?7*TAQja_}!JBDSTt6;&6lH(H^joQfmb z237J$YjHMx(fTs4eVNx?W&ZGG#C>f%j)akMbG#d)3!1k-1i!Q7W|k}2w((XhNg5DF zsw5ov3Z9{pEC0zQq6h2!5WhW^Th0RWXQXh({ou)Lmt=v7s zHTkjvBoyKvhKD6ox50e=$JizPuEU5&=JCHr0ga(~Dq4EM{hOa3uhs!**x*)BmzNHa z3*MYY{Gr6~zbbW_YLmxt@p4@hZCC)q;m2@^TJaD9(dB4wdwZVE8R=l`=(Kk{MX6mc z-udi(%zDt{hxns^*6+y4pDefZmTY7xCQC5yU*WyzjRxm=VbfOWt{M>5GV0?=qk}8B zn|eOYzMecg$CQxzWVO25Toq)$T%n7H=lunHM3!SltmC{`6wQN!+Sdvs&TTm>q^mi#n))ydQVh%tMA+5Ur}MJTkk?i9AK&RlV` z3X3j#q*#1=5nrvvsoGUp_sY$piLA@I*KVSg=50kS?wbuR?q%GbYD-z}e2NWj?Iqfp z+8)+?$ElY=hNJw7i|;-MXIUgV!2XM}eHUi?Eza6w3q*s`T8o?&JPmGN$jzAOuJb5( zH`0yV&O7aY_}!BB7-a)?o8ItsvdfOVdtVOczwna@nJs!u3@=+Z>HBT#O$i%=m?s!6 z(=0L)CphJ`Y|Nd6Qtx-kAGcla4*k@;@rslsGmD)2Z%6h%wpyh|&Wfcy(FAsTPTEjGh$N zs|xxo?q9PYgZ?9d)eFFVSm@d z9`I^&WFU!D9W6BEOG@<@c9k<+@p$xgVeOT+^ z%f*Kn96wr0ri@KNpJ*ohZgq3?!!nFkZt1ZT-YuDVUK4!eG*Zg$aWL6cZeVH{UzVkR zzgtaeDlBT-DXpcjoNXpEg;&yGNlmteL@eiDZ?0@ecQ(4Wy%|Df06a?7;m)|R@#wG3 z*_!Mmx{lKk7gO6-MeYqKuh*{NNih67AJf}2Ec^;qXDNdKN1I)(qYe32P5V-Iavgm* zLI!LNc1M+bRPRn7sGn(6M-G0&j?>Y9?K*n;=6ltX(?^phlc$fx7dl_Rk~kIm<8TDN z-2r&EK)crZK+D~7!EqM+qyyZ>Q~K==0WW-j$PS9x1v_}>ip*axXRpeOth$>0Mv?SZ zmr%Lv^Jiz@d_9GA{T1*=$xHN;esUh1_vAust=`RNAS&3;YjH+e%rWPhKxfx~8JC~p z(oWH#ML?kQn)LF+krB0z19L=x?Uw&Ze8BBfHwF`jEYpyDvWyQ zm&WVz&JT4`!?Ht94o6_v&VO&7UX>d_l`? zJ1;Iv)X1wfeEgm*fz8JA2w}!wn^a+Cle+FQ&lE3!`htuUq(}xPZ2l!e4)9UZ>HcdD z8@b^33)SJEh@vEbJAqE9ifhAYyf2z8xZwybrV$qAYpY6_m z7&Gk-8s*mP`sWb-e?V@3h`aa$9ci{inQo&jH#Dp$ock&mow}V@A&_@n)n>VvoDwtB zYv^U>)QVC>Z0`iHcQWsP(#)e7xn)M|>`fpng4n`XkWFLUjp_7X8PM87BT%I7ZB=B5 zci0_0eIL+#S3@Rfj*jI>D&2hFQqR>oQhTh%KGi3wjnc|+ZO5i_9nrtTQKA`k)V{*P z|M2tI9PM-vclX_Q-_5={JDZ+lr%xY0`R4cpo@O0qnEDR&u)hJbt{a$L56yGRNG&CN zU1G}t0QI8^lT~>&7AYvB+!Mpm0Sn2FSo*@z0Sn2FSo*?~pm{6QeQYSIFqn@9h1Cz8VP$O0svB9I5snruzMYo{CXM#ge3x# zAzT}iGU%>2#ytX)FnmKKUOoZI0T%`Ul_!hd?3$kA!S%{ro<_q<=$uUFaKd1;sGLh;8J_ssmBwnS3x-{hDS zqo(e>?cCkBZ(rqERzLlE_fM8*r%#@@zbv`t+V%a{AN&z-Sa_MQNh~Of&D_Vp)mM*o z&F7{}=kDVYZp{ztuRh4KsFA4Izh{k-b*`T9sYK`8D-v>fcP_@L?D3iV_lwMpC*r2o z)ib6l6|PjilgaEb)j>KnR`d3h=uN4|R!e?mSSz3wHBBo~Zp{qMsRb`~EKs}Ys-bk( z&duW5Q#Gk?`+5uZlQ` z>BTOQ#=qVtdfapGdn=-*Rd2HE{dQ;ht2>-SP4#3-jtk_8U77LAdGC+hH`TlNf4`pD zuXcI;qV3Dg)~`Q)zwGk8JMT~5ERxDOEx!G>I8&}adi+lhPiHcfOFd}hyyWmj#?~u- zn+%ZX0B=Sn28QYP#hIjd7=QqnW`H2tZ*roK$aHQACc)`n)0woGjRP2_D`hYlF=y5? xOb^dsiee6EV3@uID8jV1ZMtUwlMG0mz;uyJCMjmsnGDknGnu5>PR|Az1_0I0DV6{L delta 118690 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

3|+7EL>y`hP~v@0zIX8E{>8|KIj zjatIwR23jR)kig&(%n(J@COTH>4b^gQ+Yr_RXA6#+8`Y6j|XhCROPfJ07L31#NCU~ z7FU)A@KNIp=JDK@l+ z+-yKHBw3tE`l#RYSbW}ug8;wRln}EL4|~M>VX-((Nm++ryXa{&NG_wg(#K&-9YpvP zO*~azvvZpnMppJro=TwLY!w}z?AHxcg|(Tlg3t-D{3vMe72-Hc4`$;U{VA?KlsX<1 ze<;zM)h;0leb_Q%O#Gv>0A|ASAxQEL!^_U_b)0tl5l1+WdM)G313kc*u|s;%VUMRm z#fDk^)-G+Tx5I?melZ+GKH_p0e5kVhuR&f7p=a zunEi6hNeteaf`bi-G4O%EEOdvm3lD}XUYUM^vK-Zy}eLH0y4ke9W>q7rf2}!= z)g*QvA>YCu`PL)$vq-AeLpz()3FSlR~ZbNQexXyMz%$tpbJxS4xYeMBA`4 z74`x-S)GlyRdfutp;SPr+bh`YwAp40CBY)9f;h_8{0U>jLYIt9nv<^_e>D-wE={0@ z2@SB>s8Jwi23Gy#3S0+aYTpy5Lq^!=cACOMe*+pp2Pz1vxE0tPK>8u3t8tSY^n z>t$5S?w6>VThxUR0b1`ze?2O8DMi$#^y_$SbNcR7hIkaBhGTtFI)mk*W?7?f98Hiz z&=MZD&p37{4753(VPwF3#}L2~mwItP-$eDRksd)*#o{UP^}{=)E`u6P)zGhF06t=T z)srC@dN>loOKto^#0^9@gbla@vpo)7RUS=2z852lDfW_;OFC~Ded+L&o}lm}^EV6htoz#`Lg zQ-II8{p-3_e@{I@XiC;pO6tIY?dQ&=;ZWsUe~hQr5zb-UhY(kHnT%>@7o%3K zip~#Js-T2hx0031Eo3iT1c%UK2B&PbY;a4(Iq$+mw{FF1nlNs_@QBh8EQ&c3=A$iG zO6DCEim&u2BY+7C)$u@5F_=9#)`h#GRZvmyzG~QrU$Ko@!|fEfsiI|PA*V4b1{tjv zc=%)ve??`yZcyEBBNbgvMYg)EbEwj$TBXRFdg5k1Kw?)f2yj|yML=b;jq_oSdZK?# zJH1NH?Tx9vxrv|HwF`0R8Bzb}mY~r8p4s^(gwjqK>JBJ#GhHx%u+}708=zetl_on& z_(y?CT^tFJ>2AMY0=31~o+nnChYVA?n$*9Xe{PYm3H#RNAP;p z5joHt{dE-Q@Q_Nohqf0`x0GZtRZ}svk{8l4>bInB{!Qh*MBmz>D<=8bDY8qN%S)wI z7ZX_8Ag|;i7Zr7)DVJ`~RD&2JSYg?VT7t_?mgYFwc9JoP~E~%Qgth! z^0CxkA=*DwM0bXn8(Ks22YlAUUE}@t-&J(FO4}YG^1fM4fSl-zX_E9Zh-yU2Iw6F?033U$_Y7T(&+S`cJrc_JF22d&X70NCgCS$Z z6N@xrG0-V%O$H(0JUQ2F`J;;cxZJK?%>eX!cWjd`Ef1fy+yLxta zx%`h(H=f|N2_P(=vZ}irWL7-AhkXor!2t+88lzX0Px9$gd_o+cTVKW5)C{y0$XJ8X z#e>?ynofg~s5E%IuZc|A_-*W9nk@lV`7~;k$xuab3uD_vK*Jic3RTT%)B_Cc_pb?f zmQ6pK2dxX>MHXm$G&E4Ve+>U9bMrY8zKRb-;#sdydTt1&2MBQvPgt3mZLjLkh{=2o zj_%&Q@@W9Svs_*T7@6KvWn_=?tieDVNbG#o-YJ3d>Ym)Nsi2 z0H6ta&#+xncW(KbJTKoV4Qep!M5XW>Bo=O3lF0IokK&C>Vg-e#e@PHGWx^>mDdMKw za0<_n*w-9QxfTgCvIL7+u*r#i_`_A287Vk9gpnV(*jkvj>Rn#wlgGh9fekSx(4U z58#G{i;Kh|Q6a5SfBkU_7!Lzz+tnow0hoLMH=C*J9uypJ%Z*^uaUg-xt_BGm_(2pk zRx|g%`BQsPgpDPgqk}6k^eUC%Ayd?5f7w3*Xn8nkJ6m=YT)s}IRj>{an{^0+pNf4J!FJ(9iR2(fSm_p@PaeKe^d@R05kZI_#XaP<53<= z#vheY<2w!`=wV%rr>qGe!}jEvc~(m>2q_Jm%HuXW=TG(#YHUgdNh*JFA$qi!!w19o zoSFxJXb{OL(@ohr_#IrcA*@(q*kUq_L{Sojyuv5L$0__FCWbIr9f$#w8fO#5_4gK$ z4Ww+U#4a<}e~aSFHyefWYNMJNklSfHqzM)lLrm?U>9S~6p|waj zA7atF_VD+Fe&2WyByxE)&r|;Ze?|qNIQ30}k;oHne=U?xH{lNo1)S*53pa;e5=R%8AJ9E3=VX_3tNmFh;a+kc-R@2_K(Up8TW8}CBuuTG@@)g0 zqtM*V(eNxZ!ScB6j~WeYavt9@`h#EFHqA35V^)aE4I87Xt$Nzx>L+aOHR&?C%Zv-l zy1V-Tf0d>tR34@BKq$Tlt2k-H6VuHu+y;MUF8ORZ(>R(b&F08^A^1iJK&ZEe*>f@v zX$@qw-*IR2~VA9%mRhnmq;_J@f#u z#ytl7DN8tTub0#E=o%$xyoGs=M0~(g?G0cWx>4{!cK#-zO9Z+}fPWgW zVYYFLYq{egh!bT5eE$g-t)m9)B>OpnE05yMufyaW&!eJ3eYwWUW)hmR4;g_mN1?=%K= zW3~p%y4EGo32sFf3!u?-y<5_|7v$6|YJFC+(qE6|!{4{|?fu6rlG&YrBeo_A3KsP1 zUuO-oI7c4`Bm?<14FP2C;tf4AbH+1Tf4u(yY1mUCG{NQ8pt%SQA3XW}q|pd(29db% z=(~)O72P~#jk>EGj}EfSnvl6Y1i5u!y-})GJwE{GcBZpu(40QBzli2vqwLAATRozW z?(Qz)p**t+=Szn%AoQUj+L70Or4hcXYd-);+L!C_IrJd4`thf7#1j zv#%8cc6Vn)0FMR5-`|44eS(1u2j3P@OmDdy2q0m4AehtZUmbpJuXlUTdOImr3}5nh z7Rl?2Lex#wD$>1{ZXP*~kj&*cBGo|aR{Hp+rzPiyZ@r9%3oKvm2dU%N57|YeI^a_l zE41$!9oKb0AGHAMSJ><6f1<%9f8ED~nCB5)$%-%&rToVTjBFUd6t~d9cQgOz0^hg~ z#yY9m|54gjtn|WrA3-H%qpC`>y?pBxaNwJuaNnqZCRqU<4T|0BXRgwVrgO%6xFc)K zTEqMCcP%I~NV7PF^S@wc#U^&M+Q^E_k*2cCRa}c(vEb+&W_2cMG-SixfB!v~U95b; zpBZC6vs7@eInaln`xH%eGi7Va>c;~cS6MX+Pp^E5Zrt5=3*6z%_tTgXlA5od87iH= z_OuS=9aoMm3X3ixTUqB`PyWIY@9WRMJzB)8orNpU+enxmXS5b}pl!6SYXaXsrhI^J1J-t^BoK~2Q9 zg=Jw?QH9qMV;r~Sk|GHgL-!V!H8oFL%Q5b8C4kCez8a!A5>`yRLJg?L+K)dLifTwH z1n4H8$j6V2r{&cTe`TZ5R=ShDgByYldUQ5=XZW`SfKBl_NY4`jd15!9&t6lCXklxf zr}#mwo^vAl^*DuwicX{LY^iTGuxA@$?nWg}crW9S!7@j#)i);$=FXO9UW~!or0k>4 z1{Dfn-jKs?+`})3`~=&L{kF9=xKI#VQ<&9N5kiU@(wmhXe@gb|<1=XZKFzw8!6-Uy zisfaG{{LJcdMnKJ^lp-=^m4VA3v&#|uQR-;9--5!oCK++vW%FP^&6s?d>Cc$$prlo zj|vQ!HJp|#(~J}LpuJrIo5~W1p8Cdw7~MC+ke!W3m{*<`NChBtNU)!qBo}LSA5_fgjkfI0vh} zp-4|}pf~!Qa+I`0))=&t-!|xqdi<<=4^E=5`V!Zr6!W2s>Ll7-SWYru)R0ob^>hV; zR!7*1V(L5VO4v75*yb9$KWvmzWx@1ZIsH_6fLo1>e`;ca2@2)tzzx-1Dw4eT302fn zs;25nS}lcTlDY!fkWyhXZkia0@zTk(z6?FaN;>)zbPEuJkO<-HJnlmDE$?$Jb1_#i zFT&v>NJC^`CzgW5;fqnU+pB`q)7mV>YB5H# z+2U+=!!^&a_$Y_i+%1og7(R1Y{69Jj(#0w&e}u#?0?RGWB4eKWHaU0cD67_{e!%mj z#yc`R74<%UfMWdlLew06=>Uc3UDXtEioa@{MSa$IZH3P^ zv%T5)bJ?qS>9`3w*fTu!MExe^RAmPyZBW0@X&Is@T0;pTw)S|WGUgkZeC1zx7e|r}Q z%1X|C+BNf_mB<@$xT5CN7E3X=wwS}iYikaDk#jGut|iBgY1F2>VM;62yyj3!K;$k1 zI7RU*IWb$%$kLn&Sz6F~%H8cn6k_N5ib{FpQE1$oJ!;{BXHh3}YXwQLY79-I9sDo? zds2i~$SLiV^rOdRb;Ggw%90fee{#=qWc7t8mSMhu%suRX8zND}*EiP31VoaKFsnPO zGMWO&E*}xu37MGtH3kAn^D4KPI)mMAy3Du_Jx><_NV{3tN?CQL?XeROIkjPUezj^F?1X|@am$5Yn|nZ9O_(SF8M-Un(ve`HTP(U1ui z3$nqjOXoBS;KSRAJUB@c1hkz9zK{WXh-jPv%VpgQ+&9I75J8{-=kII?KkrMS;^Am) z-BNOnNE^bG#EN(d=zi%!e*y_a;HK6_)LtwJpKfg)Z@$_*+V+p50c=^ryCFy^*@?;Z z(dTD#*ChPoPpbr{Lv#~*e+nJThQ7QyFX%&RpSt?i_ePp3vpM-_Q8b4VTjs;Gib?4c zG7vgcbXGV%-?KAO-;uCB(x6g^0OjMtAn-H}J$@<_r$|?pL}gCS{z+emWp(J+0ue)4 zXD6xM?9_DO$Ai1Drx^QUMf%*^zKBOPNq9d;RFifYUBq40C@#^}f1rI*QWo*olVGa- zQtnaCSUxEy*IJWmLeVW$hpH_nnT?0wGIKe#OrrU$0u3)UZOLt z54ERQk-&>xu~^h<_zp*op4AdyL!$(cp9-!+Eq_|NmTJ(~f2G3bDQKtmr>8ZbHbb0- zDa^0!7E)&MIQ4pFu3R0iN5o(G+Qe#sU826|bFx|uuLs6lZ85PLJf1=$5cUNm_ zfLfo`eo~u8LsZk1pe-Wk|S%SeEePY=V1)2{MK$+B2YB@+YBih$# zeXEJm`j8&4e;OI@*TY~M_vqpu>@x!+8b=oxP z)7YWv=oJ1lCw>Mah4}f_{_J-dDnIh3j`#4}1Akm~$riy3fkff^<4&Sx;y{aHQoC7; zI;#9ieItZXD6G~tH2w&06IFQpVt-E^zYh4u z`t-g9s-~9=OIe0>IhMG}3uTk$z#Um#ySnRomwJ)^oBDaCt9-yJYQ zyPq9Ef3Q@H#yE*p%@+`fasg9y=**zjt)dO1U8|*-gDsemCODi$&#B?Y!BF69qe!Re ze$}+hn4=m^(F7dv#k^Tmj=3|OQjS)&QcQU;iGo5I$EevUDE`vX+A#`d&C@JyZJ4@s zGB|YAue+G6tp`sV9X}a+HJqpb==tPwu1*Qee?XJblNr`f2^R<385zu$$|qbQA`J9QH^wMbJqw+wlB5Jg zS%1A>n|t|_!==t<@ss%_ODc6hOBl9^m%Df>t(S%CA?Ote`6fHd{8L-l(I#e-6Vy zy*<$Z+z1mcjC>Bt#K=J_Z3;zw(OZ?t;Vq?KSc=h!CjYQjun}HyhXj9C9tb} zFFQYsLMs^nD9W;pvDxnvMh*x1f9>?6QE)Xp;+r&?F7w=rhGU3~7X=Wav zp~VHo^?!j|4#2_nl8|M610cYMr>e3n8ylm{h*L3av=*C81_;OKGyN##T!sSXe63TP z8eU*##He7o{QgKFf{+-`+U-@6)@AEwQGPJu#aK7R6Pr6eC;6Lk>c^pfe|WH6gu>b* zg8hSc+xw?)b`H12eR*tezCPYL*gu7T$8X{7xQb;N%isQGb8Fj(5cf(-`nR*9UKDaP z&MvS8X%IVZnk^6SZjZ3V!-60S|3egvlHoRi{mtE7 zxKe@0|0SR7#)DX0=XiT-f8xFIDW4tYMBCIyxdC~P@5?w&z_Xf#J3Sh|hTVG&&saG4 zyet$gjC47C*d_z%o>*g59RR}U>D#njkB7`4HLQaf|y@6_gBn=Aj?|7&<64Lo9e zB7XM_P&kuoe7dSYj~Jqe-#ug0>;kPla)H(!xIi8 zoCrhtctht^5aak?pC^llKx0gXo88&kk72U;px2vi?-KEwf5qS1;$Qvs-R9BJ>E`~{ z>Gsj<&3D`L7|`$TWI$MHD^P29HjlSSKb&nFi1p1dzK&u1a3{ln8l!d-+w}W{kHh0v zv&{pLmggwRk9R7`p}bf#5r0mDY?y>Wdgsz?MZhtcM01$DMxCc*zr9n*Gz%)v+JfaF z$J^}3mj$0Ie;3DK7Jc{_B$(;LZkBC4Xp^a~pgcKcsOf&JgKW~*-4|7YbiRln|6%V)dmAUBpZhOHS)nG7 zhIW@*6j9nN6k578Sq@cb=l{3#MG_&i!B&|4c6Xq9g4VyWKVpj3Vn*nssr8)O}6vzD=ccZ2M0!?KL& zdmCixx}vS<0i_R8Xa=ln`fHC_-tuO2b;vz6%wne^Jio=gjh|?wpyk<$H8eq&A<7f_ zId6-8L98oqIxn)(d0M1pTU}1BRKVYC&rJxve+Piii*)vMl3calf4d7P5u(p<`S}4n z{{%&IN_$Es=^`J=#&r|C7N>$1G3}$*cAtz}-RcfvCm=HFa3?{QBA=IdYQ7V#ySEz_ zmVSP+d-khc9p?-Y6`1Mvnn}Od(g%wo+gj@Hb-;M*d_-{8@Ct1+Yv@mwgk#zDY|K~Vyw?GOew0NAQzE4^a>kk@7vc;&)i{t^Me6%Wla{J$R`?gO0Vn~SsdsnfJMtOOL0%= zahcwTazsi{N81Pz+?~6l&R!PzBrQ|B5|nRY`XRk7vC}$B@p5PMx64^_LoYqie=r_i z=XsGHPcIYNqt#Z!bV3SzHcKzFU+Avgu1!2meyN}BCF@O?)B-$nce!k8osbs-R_XR=?iwolMy{<=M zq2z@Gx3y_G2feBC=X)Q$SLna5D-p@(z{sr>c=5_*@yKm?@VGGl7Cr^j#xcA`K`C4e_|8zp4yQD z)zoXQj-ul8OUE1MtSZRuUbAJ3Rzq80DrjwOTDdwcttCdR2B0fcs1;pr6=-&ag;mPA zNqwcVp2E-#;sDjF25>bMt6p4|qo!^x^LBn%TD>UC5Uj0Vj$S=aEAT3H?D0nGnCt08 z+B`7`z8$TJtaGb{7^W1be|{`uC711Z{lvJqu2e#swLOtw#6QgFbe0k0xt8sYzw0F= zWIL5qq;zcX*|A-Rkv3N7{T!;T^iz159IGfCzmi_$5u+~RVhF)at3;%^tw>8rd7^4c zq4Y!~nE7`6C2KkR?GPQ^`V-Cr)}0vkv)pdq5~+O9txa+#o2xfOe-GJ*(1)eJu6Cf? z9Ad@;FvC-W%i+~n8M+yv; zH;mXXMo?EwcYfEa4V+U~A2^pSYTizgqWmVgqm5c7tv|hj!DE=EERV9HOs1psG_eT7 zWCm`6o8gLO)rk@Oe+sn}=6+R55)n)wHKHNA`gj`qtAQoPnSe;td-bzwKslzU??JQtI55AUkcnK6CPEotqvm1#`NNmB_ z(#ss9B#v*X75_{iT^;kc)lu*drC*ERJ$T|DXl`Au_vFlntzwVdd;+XtC;u;*m$|MH z_a((1#QwI9fBX1cR~uK*Y(*CyF(i&&TW2gr`wR@ z;UBu!HGEk9WCYMdLJc+ZCfz9qJ4WV%)e$f2TCXidI-I8jX1Fd_>SjCvHli-v59Y zpVLBwR(C&x`S8{=l5EOKi}eP_v$R)J)@gq*IQX>x!I$aJG0c`G-BO(ohPj)@SK&PV z5{OSup7&#G|NJ$C8?R8<@;>|b}Tls!3H=I(eT-GsG+exLq=6+be&zQfS$u&~V?5Z2JTjzYz-tDY3b zSPyns*a}B{y`VMJu2~Z)y{FkEEh6b(f6dc*9sHpg_Kz*qzRHRcyS#(x_&mMr;xFRR z!!V1-LSJcu%mebQGhwh(Plcdt>Mx z>w{I%9E%lVbkQ7-HKLUPc^}pYJi~o*f3Lc9 zn%oTQ9WrlsP_esR__yFwg&F71piAcaA-_|n5!2u^0t5jUU%KwyqgU&Yaw3O8^{_ne zF7uL*3606SwBzwFMnHMdsZFz&hXgEmp2H?^$aIAzZi`DKX_=DAR4O4i{*E@b@e<56 z_>|6VdmtU9vS5xNC0hJOA`^;~e>a??V`>_ova3EpiP9;=f_J_oPAtS&?j|&43he7W zR0>1hg8deA4%gyF^+{NA{Sk!*L!=ImLxCw+7|9u5Hx;I>5M_2=EiX}VkNniY6joSv zI(`L>G(fe=q-4UcFAcqMM+tRABp3yGirE6kJ=|GEE(4$AT>S#n?lJ+GaySU*>hCss zG?c1IdGszgg4rSX2DJobf2g`Usgms7go3LTL8tG+BUat6M1M;#xHIGYrvXk+Utdsd z?wcXIa;;SMB~*!uN3a>z@e!a%mukw8ZO6XR48t@MjAq`N;p#)BNzTafM*686RFYAh zRoiF_p+Nj#TlShL^K4#ilq-be?E3Gq3m&0*VFp4 z8zMAFO3x$1g9YIQ90AKDfepw9i zBm}F!OjmRo#robQhH)}#!}uwkPD29T_nb>;gkA|nnn*R7NNLmf0>0sK`!I-Wo{5~- zvwgyS41Ufh|5xVbazHzrfvwrG7iIp{GjuVTrGz9;$ZRdukxk5z1@vP zmo6_K?<{U5#E_G((PRARQ+&@vp-%Dy?>72rueZlGr_J8YekFsZ93CQXs(;QC{<1!VZ%+0)5~m{j_JbU44n4tY|!^a zI4;#S_z{G?4_u;BuM^i%?zVoCw`J4obe7Qy4&*a}{VZc!E`f>_0Uax+yYVE4 zNHLqJRr*Uhf0`3z7LBAnIvn&S`IWlFo@g6<63SO3KY{#LU@9!-1d=*l0lv)3^aJ>R zc0=oR?((_%IiFAX{^L1s(DC%I=2IwZL2$_|1u4pu78N5LYsYP!B+2lOme6)gatNh# zTQPCE;x4daXip&!tus%uDOi+<-K6DpK8CkkC*02Rf2$dYY}AxQG?-sP@+h4lA+7J8 z(T=;cv`8fnRDdyQI>uY7(`0nbN-&N#Eio7LLn1TLg91EnblqieW~WBbI3ktHS$?C& zfCNTkBAmn}PNr-V=OI>mUXio1aD{U^*Xm9z3ecNOC}$`3XS6*_siZFx2nXaOPxL*< z`K6JLRG z3+N3EJ$nETRE2D0Bylv67BRYIw^KjyE$djM*+Le5%OYX_Aqw~4pbn7EC^d8@&@4@U zPVNfzQhVFDVn8H2Nq>TNnUWTn3=JhPWE4}He<*r(00<;(>??DyYo39N&nG|lW``V< z^D3RDvqaZ{NnRFS*kb90-;=qYl3|C&arn;cWIWD%g-uK6)hwBMOn6TeROwrwpF!Fk z`B&&(kMHGQq${TuX5I_AJlQyxClS|vylLNVSiIqrzk>0TYQu2s8cK8cShI!!8n{XR zf3t{4v($@9Wp3#Cjd4wY(o%p1^plRo2?yq09YQ(=6g~-yI~unMP6m46+;uU$l0TgT zM(UN5Q(5h{JU7XmdP!AWqynQSO=&O@HT!)$CX|*!u!s4 zFuilVMDp8$TNc|9;yMG|TyGsacF=wItFbl|#TrF5QWfdsl2iG6l#{VI#1Z<9wl^+2 zx|-G;$8hn{#kt|Z;0s!o)A5=ef2GJHiJ#i%UXP9jZA$D?8sjO#R2CI}fMa$Av~lB# zzDpDW=wzOne!uvbFqlNShe)5yGE_00$cgXRr6+2=mH?*Vm~bRj!t|-{n1Tyl0W8(B zX@N1*&**)5_GMp|gH`NwjvsvNo%uMo@hF1@nnjsifq$!v)o!l8L|>Yvf7r()=ycrc z_0&;5-7XdS%@3-`du{~5Y1G?+MxRvm_iM6&9Q-qi%w|x!NJ|K_39VmhGp()$AskBS zy?BxF9s!1cbkdru(f%vX^)qG-2#sbiz`=M-fxt2!yy$=3|8n@^ljHN@XI;fm1oBA+ z?SgkYEai#AZbbFO?=jPgf3O+YJ9UdDny9*Zrjj-it(Xvb03s*U!M!>WF4n4p3|TuS!8@>z$$C|ruKEI zEsh*1;rK{9i8pEEf!paCdhHFU^G^UaQ5uIogKe|!k?MU$(+D#Ffo2t&jYK=EPB%T* zTD!6ukFw%V)+2KW6@STr0bW^rKE*Lsf_v*1`c*b9?)$9YdQDLqPXif*ewdHb!h8m+ zmg#d3K06z>x-#vv;~;5x@J0XZ>C;>r$%e=l!S8`zOa= zep<~q>K_D@pBDM7y#=RgWQuOJmGT|U)K z({HfBWxuMfi+{)8@BenuD&{X?;&qg^zTbbl3)@q(8+_b_$84IFSyJY+76E4C7x1w6 z&U^2@_11g4-B$o{%ZM)b?OphL3o|hV!I37+$C}l;kc8JtKHb@S`|#uQgVSd_2iZ&w z^zi9vKIe%yyz6oYuDb+6uPA(&Chs?VGbbpdFjA%?8-K;6uFfoZJOYOyOp+}NU(#+t zd3$>$k&0DGGis7->4TZl4cyOkKLS8~Ll2Z{huRKjY2qda37JdQ;9JJ_V6a$>g-<-Q ziw{Ma+}r|X7pHp_{4<(9dBi{J*r)_a7zNR2JLT6>vRyvUtW^?oc%(s3ACdLyC7@C% zt=b-to_|s|B++)|?K-);z64#S-nBGE*Xy@+2)y#|>+wBsYYW}a_q?7QQ$Y}RLdTa9 zJvVe>P>!$6eP1rhH6Dq-oMNTiw*q4_xSDM)ZS|)g_w5q8BD^KVKgShoodt_g<17u_ zVJ(AW^ShS88(K;Y&yLP;3;NA1oiQyxWW4R=Du4dxhT3l+u(Aqyd5J&K-|O+fyFZP8 zi)0HNa%Zf<&B?CN?TdYWF}BL^=*yb_wGnQB&Z6jLBGt9+oAb6F^vk z*?*BFeM3ODdgB51k_0zO$y3-@^NAA^aISw(dla^xNZ$(@^jWGxaF^BrE5 zj<3L5$W(jtu(3BAv_Ro*0~=B_IE=w8S6p39^$*5ZXo9e1i!F_KumfuSo|H=5LqitsbCnZ zR&DpzS2JC$SPY>!#>KDS8mBm%q{-}I%h#-6<{Mrq=izRF8W5pE>9mvlN+o&;P&=Pa z?o@G||2(B74>~z3R6gx^E$}HWdEh*&qIm(4(=JL8tGwKxrN7i@c}w|7&;FkU zTjJ1W0EMcQOCLDH)QS)KZPgM>yy%V_gY6V$G==TGT^C~3Z!{45WuAkpOqE@30UZ;X z6s{#2bmR2+kX({*x|2R8^X3)xH zJ1{stwLrTIEmXHGm-eHSw9=~#Ru*D{1?L5M4LbG*v#a?H^_&mXqmrT^b${jV6s;5r z>iE;PL+Prc^yU2O7<#JaXbYt2B|n|zH zAhb^a)KT33W8S)*3xrnt@p7Pm@f_qn#td96!yWa?VWKO{&n7bZLj#?wa2@~ zYrAicd#@Gk*NRR{b^Wq+Eq5?IOeH9(D*qk7jg7{-)io*kG(|##bbpp5lkC^jtHD%5 zI-Y^)XL%qpYlHs|0qLT#t5vm{`4EBrcM`_tGA zPyP;Oc=ES0!;`7k^F69{#OD_Fgq)zZl*>W;Zax;|Dgv-@N~_2`enM!IKBJ!QZ^|vMC$Tu&KAV zl-Ewv4pXDgaz)IAk=O_Jh zd3r?s&e9M?-PDRe`+UU=ew`$isK2w$2vaYP!*fSk{5a1_5F{z?a4*EX@VB+{CRK~n zgI!avKEScz`G2imsBI2i;mO^Cj;YB?iUjClX4E(xha2Q&K~NudSBTMT6qsc6P8&6<|BxhMK6Ntwi+cPXjr+pu0D8`B#X#m zLs~D?^nU_qb!N8ICnkya%5i1Uu_h@{5L|!d)Ja8fSY`{RKuQ$z|BcJB*X3VqTXCh) zt6przld8uc9p&Jj)+azJU<<-aRmmg(L06OH^Z%{I;n{YRcoHa#x&jaich`Bl{aK7N~JO8-~J}Wpp`{NvR*Y5?^mS^A-x`IkY=Il%K>Qh znST~v#DaZMbo12{*FbgMNE~QCj%*eJG{E1r-$*P?Oz~A&Vj%l5L?g#i+^Q75rK{Zi ztbHF)eC>&1yS*>cFm?O=9f1!J&hFW&+cM_5PlX5^4LTGn#1Ixm)W*2;cOoiqv-4cs z@DO>1e&J4$r-aBc@}Xx#T5orc`7Y2C8Gq}~)lhzW4+W8rEG~n3Hp81|Q~R+7UKbU` z=}`)_G^|+J^y2N=ET6gUZ1=jWTyYSTQ>`t+QJE)>#ruF3S~y&Z$pZp3{P8jw z{lKwbEY4$0ThpwZw3cp8;k=knO0%9Rs(x3Yt62N$ms{*rv|Twnnsbfb;s)-j`G52l z3eZ5?s)Hrz3O&1(R2!3W6Y{vw=GNaz(YR5x%I8cw?={U!1IH&*n|UuzL^$*KyRHm& zM$690xEezUOg0G2L^nu9gdm)JxL*y(Z-j_ajM@-pvQ-evWR80cquZk9QeIE5An?~W zYOgOM^rm{OI^DI=8DF8ayAXJFX@6o17=rD@^3)>Q`XL5vXk7I2G8<*!kCibR{45=% zMPWPUIi9Fx&aX7bxbZb@UA=*<=!ww)a{Fc@0VJE-7ve?&ILAN6=@F&qtq;rt;xZ*h zhXN=kcGT1>?{qE#Iy^h-5B}f%`v30NhuQsVYXduVeQh{87#{dFA{%>eZhzCLpU68s z{1mRSUJCB?f*nt|NhF?%6)Mc3qmpZqs~E5cMbnC>#^ITROs?a=`&Yx1IGp1gXuqgY zzY9GcIWzKLc0l^wM8=`7>-&9-+ZX2F_>_dOcN-CpQ1NEPw%KKYFrWV|FeZuU@MxrH@_#s#`z8to~f_1bMtzv54;EFwr zv*}TqjQ#F~J_IM>tLz(?nMa0=TfwGMAl={~9IDRsgWaeUG0<(?kAHeK{>Lhl#r=Rt zlEe#6OyrK0n+$Novm!c1kD3wUMqD!RMT3&hj2_xjEnTUCt`ogmSb4*xI;EMYYAM?G`8Owi%iGqEnvd4Ira|) zRtT+I#$FS*{IlK8&VP4p)B$zvUBTTxMP+8AcD-*IqSXOpoBk@&py(rlWPtUk#&+Qm z0|r@gP?QAY-OP@5+>usxr6ykDw>_?>^VbHjzl$e9;KK5^18sCy_N^*~jXIcaSNr~+ zZP$p(blG55GB2uPa{JlM4B$bTnLRsWEf&Z4@Qe!ob8!_%uoia*=jYu9R2%Yy`M)L^_~sz2El|Hf~P zMrK|ks6K4)wm#A{bl-av?LQN_QB&*0(?)??sf~tilyzf~8z=r&2o`^~wbu^ZsFa6@ z+o(ULe&6At6)o{!4BKerHKJ*QsQstK?B)K^%sX(J{(pZTY2YKzvPoY410BUP@L$=& z|4Zh{mU+cVGX3+~_l>shDCq{r+F&u!{}H2+Z>(C4A2L{gRsRnYe}XFvlONKv%gc2t z@LwM(w6Gid6wu2N|Bn_8U1Zg&{Ez{|*!KUJv2lm!Pp@$I{q?*&%731&Q=|X-&>>~s zV0WXksDJkVShAYytXkP0GNe>Yy-Dxk1>65SPZQ_CeKF5(*Rbl}!FSlun{XZ6atgI>a&?0|BDqLY`soRe8~E~DM$J2_`h7qKg%AVj(>Li z0G9hNR_o8Qb?Vzg*6IzpMrEhnN{;exbAo4+E zc9@juRX)3GchtVQsi|iYdsKQyR%r@u1FPDv5|xnN&Q$`H*eC$ywL3KoI7WwDOb3DZOQ$Xo1#kcW2?J62&HiYXG-FrAU!?a)>Gf@TEJ z+0LbfwyWhpDv0A!Rvl_+Kc^K3<}Bz^ms+rvQJ5~Jv{r0jP~PqqsW{(o#=Z|11!0*) z5{iR&XG)QFc6=D8;utbnnNV43|DLO6aeoQGDY&~cSalyMDU0;yS|R+`RJzKwjjN$~ z8@CK=cgjwkT3LD1ybO6+|Gc-Zj4lFg)Rs3aQL{=`Jr=(|9VNHLd}6OKhEglqzJIPx z)9G9lcSV`rplc>jyb>YctcmAbhEyJ|LKxnu1q>;VQRT$i6I3xXdSVJ@&@mOnz;utd65WIpv81U{I}lIc~7$J*+1ISYGw^x<_j z88v!#85;7K7cu^+XI%ai6I7LPbt!_->I z%h#vd!83BIrMWqwbk^fdBzPLNwpYp<9|m|mpS#| z`6p3_=Ja}JhWuJb)_JX}BSQLOCsd81#lO+72J@E)u!vf{CHc;DlG)t?3n}x0&qN+2 zqia5L_XcPdc0VWN&ZlEK11xiAH=h#BIG=8pY7CMlw`nq?&vpZ+Kq@s(i*lCVRZlW! z8iO30?%5qN2458Q!F zX`!aMp@E#JR7G-QidO!djX<_JjZbFgaGFHi^1z;7Fp6%AsZ8#uv=S7`@N`f&y<64x z>>*?51cxWb&}|*i9`I`O{em+ql}qH+Rxl4HTFJb8tY~tHNWmjMTz|q0`XDuHLxS;~ zLo(7Mrc2^*3KdB|!dy7(h&9-Y3=JDMX1o#}P=Fc~s@`6OB%E7%WoS8a;}yJmmZ+EI z>LyFw-DJQ4OD~Q$O05-eusHXOH(TbOxZjo+ULL~iz(EA}66W)V_wkVc!-E$@t~=gp zdB2O{VtqH8=foDe#D9E&Uug5VBOgRHy@(gZ8@*}<9=ZM9`3je^5g`)Pod{a5Q2y@j zTKX5{qrFiMpCDyhDzx)`)i<02u+c+#$()O5(v`n&w&2IoVjVk?%!ANp(Av$?oBXHr z7=jYabWqv!C;LKY>c-i)Q-rkZH*05C=Um$+$HW5OLY9@SEPt?_$z;fZGF78W;q)G4 zT?nE^MytQAy7_~1vX?&idH&M&A#mJ2`zf8=@#uS2_~F-&@L|YaE1U32iv)$Fn|5;>_e}O^CYZHGFeI1VJuV!f=c2HxOK8~t| zO*^bHT({#|=d+?xQ|9Cg^qaS{|dH*)t@K@cfex*i;0iM-e z{pSH{{a^L8mFnkfo8QChzWchWQvKX=+mb;muvlQw0xbNydFaLjhK(KZ_4c^GH~7kQ z=zEv%Ie)l($9rEN;d=y;w{lqoBuU~)T@t=;G3+>8 zTX}UzO+wl8( zP~MdN-HQ!!F;i;6BZ=X~cu?tuN$IcjSf=YS(0}?xE!V_Rf(>gIvLs#q#sZX5+ggFL zeQ4azrrfG~zKW|+FODxg_>o+h+Bl@HRq#6xqXP%h&gByc)^i2Lg7;WNv7p;rN7+fE zej#J;fH8ODVEYoUxvXcgBQ6cq+aVY>Q(Esjyvpvw%j6668}tWAZistees8v(Tbg?# zS${(()k+PWRil81_!xa0jJ(rcdP6qMW^SeD_a0OK#i27XaK3FLlT3gsOuE~=DA`}3 zOG|m+WFtxcdv8~L_IGfr=?z0<%8Z(j>*8H+sKlco|Jc}{WF@LV1$b8H@J4uTlG@5# zu7WgEbT5@NPxdz-Awoi`-c)DH#iFWP1%E?I0J(Q^)Qm02VF}o#nqrDL-#)89B|uu8 zDQGB?C@^~1Vc`eC*i;%2^8n*q*AD8Nyv(04-4B{JZ}kK41|{aPBmd1ekG?rMKAr5r z-l97G_E5oz;P1aaP~SpK{;4|K`*v?~^wS}hZmj5zKgZ_{6+8-fczXEl{^8l{YJYSE zm+yG#8ZLoiTdc=ykm;(f6?3BU3roX@zZzjqG`{UHfFbjaFk^ESO(E`y1cuBNa3y$36enPWFEM)+qL_m-9sSJQq>NeUq5QvDQWi85l%*CA6Txyr;zs;6Hj?lrsl{odo-S zUFfGI{7CFnvm-8SMJ*H1$@R4El@;V72$ihV?`8E2_)E^4&@gNVwc>$k#(#rkcO6R> zSo%rUp4wzlb$+c%ppIoxkndP(J<~H2Ye=0`{|Qqs@Ae&CByoABYdj-_Tqvk#WU5Wm z<}EAg2F4}AUno7*3#=`$7-P)4DCW9To+15q43gsfV_8gppI;*^B+m8I zytJ&heI>Mkpm=Oj$EYGVqkr9x6#h{8N*Q{hi#wC;N|rgSCwVNqWEG!Zqt0xpqEe{e zd*k=5X=?N4_uf|N3DIZv=eQR=Pv)4Z6Yf6Z!qspkuIT`hs@IN`wQ43%ldN(8DB z0;>qQGHaDnkQbK)5fJfvXSzX9T@>bed5% z_)Gjry?|2;n+{w6|jMcpBGbNIjBg16$fX8Sx$}|-x><|ofk9H5=I68y|1po z!r*$#taw^9)Mcs*7Ju4DYL9rLXZ+1a$I8=c*)rD9*V)F(M(;N;vYdcuwA9R)wHuFjz*SL#5ccSQDsPk>rqWl%O_mIGEs;7ZslciBV=;{0F1PKI%$_slD(M(?yB@e=+;nd+Y zVYF*pYpb196Il0X&~L};*{19&&g7aMfSLnxJwtBgu1j@cZ>CVfwTM4~xQY#KQRDkr z+7Q^GjgR;Ce~mR#y`?Ob6VpG)5;UG;@6f@~Tmb^&M}Jk%%-datq12LHy^~2%*`$n^tWs4rn)fLc(DA9a?_=@II&$`f) zf8zMapQvDIR(4?dvYO9A>hN2%lx-Kxl>zk{94A#ngj;$T(SlNaH-go7vWJ}Rt?orp zgMGrbbAQTun(@|SEAlVl)%E@3lgS}eiRr|EHteP}7rN9i&Q*&Rgou77+MlXY zGk$~AQ$&J;G6=Hs6U+vGJ>5Gv`u?oTG9B0FMY~_r)49h;X}9DE)o+~u>~M1^)h=gx zbNzcQ8VX5;L?`5xuEx6bKGPc*nh1&<_|>Vtr+@llspp|>b18nfEOm~jrxZA>zr*}p zeOoD7UD7DX4#YIT#unk!`iI{XO;eT5En_!d<;L}^v9zn)wKv8~nO@aGoPR+9LMgnn_jiRq6FFxh7d>>CG7WWiu026^ z7Jpwrxki^wRX4kv{Gl$F#!yDi!;gFWXWnmszEbBGEzd4hE5nX zZmQQ9*E?}PaTC%XPY1Y!wjg^LxA!XMx|Ke~WmPp=<+c%Nk0Ph9yRs2oBWC3tU88g( zHu^<(B!5DdenWRO<3XZ3CcBm}S`T;C2`wgY*NhF9oYGEp-R6aW<5f29AIKQUpMO`i zH$mt6GJjfB%bJW&+7SOptE;oUDf>)*bP^c~K>;aElXAP)(_z~o_q+;GQG!GP$*`G; z3k#IqbfN-BYL&97O$6iXt{mZXUSH?wWEV;Y72@=%l1~20Y1K*)lo03#;LDtY48)2t zxe(Uknajlk`F=G~hg%sU7G=Jfe3Fy{Y1sYIX>4ui2p5^@hEBKYyDz{}N3D!b$ zTi7HQSju|o>*n0wFrsc>##Tj)r}})FZJk)Q1LY_5R+aj!+`&JdXRvrMl||ot(=X0l znt|6kvIeyAE8M<;XSy{+*mbimRv55@>WoAI>^P_t|F$)ZJ4>CxU_8D2F@L|d^RN?L z;LT+)9&3}tq@Z^4!;l&LDnt8&jdHtGefO|H(4>UDj0LPMi-%1h< zSgrHfrshq)txk2$BgY!3lf1!5w*!3vzOr5iX{lTb^aBipxalSZ3C6RPa-3{WjzL3v zFk3dbk9fG@J!R<_AYiSX_|V!3oLX_a^Zo`yT8@eJ$apg2(CL}wG=J~1xe;f6ouSXu zVo+mE&OdL-x|NC>HXz?OTJCIhQ5!CFF1n<2)a<+Zk4nVkM)pR*(wJ7o1v*LWn60d0 z)Hk+ zNlc0YI4QN`o;6N}wV(M+*~=Pt=>P5$G2;jGkFk$~a`v!+-}a^wCHz=j8zf4Sp`et* z7lnx%D>=y@CVZE^eT0a=Ld?_alh}*!x8`x!dKLtj?zv)~VSggYHnN!gO3eZ)ggO-^ zg3EYS4p(Kq8z&Ee;`fXRA`VKGa*%A5JG>$;%c7HESd{qDsktR-6rkJf6{F~{tdp1T zN<^GK4rJ%^yMxu#>1v$Jm@{}Y%)~8?ZNG^Io8~QFZ7-47vp#(~+lpjOYhQ$9ah`Mp+vtC0#5s9$ zv#|5T*wL=Ix0&ir`-LLcJa-@)NHFoexfn!5}dgZohU%@PF@~R`$M?*{(5965b zZ0g+g>1gvj=A(m@(KE1HlvL_DPvHgykZ93|+e0@!pQZ`vTP? z^`+ZJ&v0oT))z~i5#Dk}nw6=u%VM!kCcyeF+R62D3F{`=a!aQeCY=R+1ViELkjNBK%RUp*8|ku)Tw2 zHsyEB-*GWhlK?Hto6W>uP(ipBb%Is1*+SRr{(hMT-U@? zU$mbcIy!j4>^(XV%w-BBYb~H;tW6!tR($G4F1B!RjA0r*qd`B#sSvt&dwvb7YNrva z2SYN16LUXL%vkkWX%Hkh5mG9PFHJtjCvk0hCafFb+MzO&WZ{$&uptS^h~A`f)e@?6RTGA$731WM^Yrn`vHhlGM_$F&8(KZQp#m(U#C(CL|R3F zlb}@BV$aK?PLL63)CM(@N+inKOwW;9>4^=rZHm9ThR-A3P+ApG6M@T1{xL6&Ruzre z?w<`FOdJwIofP*OWQ^9!7iGFNiGNZmRw~44>5wAyz*2rLz0VLG^>q7e!E=yewi!RY z8&Td}pkXCx$AAI;75Un_V==p&SlXg!EOe3GQ}&S`(b&PX*(}(4V*7`$c#F$tA;h&~Fl>dGp%fReyu+3Dsfh z8Y^E)k*ROho_Bws1jS1s5p zX_7pS3MQ;p(BQthTo+oL(xZq>K7i+=hGB_u8oUF1SyjLD*>eR1)aX%B} zD}jr$(RDjo=>|XBUw^-hDe#|~*U;}~r3xZtK=GeN>0fMz!`^l)ZotVCwcFi2CFA>6 zV?oYnRn>pnd$^itI*o`|k~ogtI&VJZ=N|T8da961jR{hs&6raj8C4 z@4C@*U2U>$bno*>)SamZkSgzLk81>|?19>)^1DD8zlwY3%6}E&@`JHutyPogfXyfv z_E%05m@Fk*;)$~^!S0IqA(h1|JT@jn3n4z@XR&aeth~RZ#c?;mWUY+Xdt9s?u;U0rIYS z2jF|8PkN-@6Dn>(qKM&+JbBW{omC?lu#8ai*xbtFwR0^m6XA2dp-#{=(wC>LgZDB| zAVj^>{L%LvzEN*=l*jKU1GbUR-dZao6(1Dfx3;8f~=|u}7gby9&4Dq0&qfqX?dLR4V z43nej>6>vz@^slRP^`m)?cX18!egUs?|&{Q5c>&s(CtadVob`&W=aXY(h{*S-)oRFw!(R7u~IM;H2>u!jpL)O~qh5-C=`Mi5yP>FLv*z@Zd7`EnwDc0;teScJx z=v7H~RHf<Ew5mO3fNY(*K*z4U7AnwH8T#M zPaAR8@x-k#b3bs5b@a$xo@wsWM{TX_=FLUk;Dl%wQo5eTQf9OviF$mNXxgnHgeWn6b<{Dle` z^afeUCxQW@V@TG>a_O!i6yKK~d|1q>d{L6FTxz`QXG;n%aHiFrpICSXdam$^6hv?b zg_jj}t2+RGNidPJZ)Q~f=k^(u|JjRCmyo?BPUV004p_XeW)qi3EHq3Es zV(*?DxCKewe%+=kRAg5Ev5Mzsw?yD5B1lHEssQezMYZrWiJjX%9TXptK@K7c>pnmb z+fqLtHkv1ETzpEfW&W@76yaT9gS#k|Ugv5uRkR#FXD-jqO~i(3E9__D$}IY5K;h?k zTh(KArdtk?K()mJ%hEgq#(zcpLr;*S|6K4@Y98t=YK4)2oVhGivGJ=r_Us!jG#mq<}uUXO=#ULfMmeYaoF z<(j%X?k)Ns^}t)+9KP|YJ)~*}|3@51-5$4Wbp3dqKM{Fm;_fnk05>gF+Ed$AuY2$$ z6>B)po7RS>QND}<-G9OVMb<%Fan5%(WscBHlAL)0Ge=1#>RmM{cSji8qO-PIIFfDn za+EP{xfkG{WWJ>YVC>H%oS+zh#dosAG$79XPC`K%l9HBzjekdlk%PXo zMA_lUb?4jhH}@c`i1tGii%4HhVCVsQZ5rVRzX)ZdvE7idDu2paC^Js>w?7s5`wgFi zaBpOsM=TIGMYR-H?&z_}ja2`L%;3JJn@Bk#;-q%O`JsB;;(dqy3bBW!ZAzo|3^Lej z520>`Y5>qVa#*`$-K0g!#VK8+L;}Uc&9a09S7ARP0a_^^krj&O7O!}06pex2F@J-k zVM37SAp$fRFMrNOQt=RJxk!wZpUhd2(*u$DAhYffMv%|Ua*xh zo%WL^#ukcednD>dI#Z92Pw`b`mcf~yo5%-j z`-JFIvY6;|X@3zj|KbxiIpyhD@;nkhPl5r?YQ)phe7>tbFWM_wi@2~)#I^u|E5lWz z`P?`i;D15icMMyh@>o_`wf0>!KE`#W^AeNQytv|RN`n^4=TF3Lrw_N@JEDh&#!TTM z%)_BSijRQc1FZWBYHZYH1*f~0(@R?gANk^U(es8MhSfRbGhfz{?-$442@a6i=f^aY z0d-)b@FC_|(M&-tx(tJf|g)DI#$qIWbb&Y zkZyWMjUVS`VB~*k1x6PTgW-&x%fq7n_8HzQi0WustOOnj()c!Pg?tmN;u3X478Ant z*~euIf4g@sU{61&lGq+wZ^wDED+g~ zkbf_2#bnr*p&dbE?pyEJZz7HPj&kDyjl<`w7^`D^g=$$hHmbDNtZq0w_?Hh8Mb&Jn znK)h7c&hG+AVDaldCSWePP6HtFz*cP&G|Le6q}eJbFeZufI}Hz%b~)E1lnqzbuwnfc3-IoqN&q4{J-&(S)t7mT;65z*ixmCcg+8ms;QP{rzj~ z)UwlSb%ARQGikWm3Um`v7PY3@xVSeDOuZ>g46Io-N)L_6IolDiP0o^VzB4Ga?)4xT zHy&WWw<&ZXFi%pVD$(Cf)+rbtRb?I{H`R!z$!$%Y9*n(1hv58E?D00@%Jc9e6@PqW z!C;q(ktFky%DmyoT;Ir6B)Ktm`}x%B{3+m4SOxk;ob24FAoq=o^PC$cz!mHI(ab%- z0P*EP?lVU`0PrvtWb+V+Wi{lf)Q}xOdv!_S@)qmR&A?1YNTKA5ay{V_H@O!U$1b+eI?SlW=G2BI$ylY z8K*&n+$jVPeDOZccn@#fK!5k}#@9L8J-uXf4?V|X2=7S4kAZHfZ1Wf-xu79Wu6v*3IR)lCkRHVahv6{DmIxAG|%Ss(MzGWb>*E zUkhCh%5*p)?w!$>(-}1ml5jg0FvRGF+|GzLqN#x-Ral?GKh@_usec`=?>)BLdu;z# zXT!K-BX4Ym5BNhIi!D_{Hkvq~ObckN!xZm9n4C8>a)fZ1!k0S|CPzwmEwXTUKg_5=ckcv%r#_t*~=ZyNg313wo`kNcRpemGZK z8PEM_eq5gyt+--S&wqdyO@ZXBrswm*EN0D?=m3aJ8-z#)j6@Fn(tQJmRy_eV3CH}) zYR+R8QFW%9}-FLKo^t&F?=8F*{j5q zgGYxI_^q7FQYyY#GC<&5r^Er%uCdP}ib&pkv#nI7FM;8X)3;QrA-ZFGoSOK<(!NI) zrN6A3)#(nJfK59wC3{`wymB#ftWFQ#&D4AEs$Id$cz>(VUD=&4R7I~DtI_$gAkEJF zG%Hhj+>WQaeb{%azsVPDXkX#wxRsV9mgQC;?w9Apj6G)1{W9Ig zZ8!U{83h&e@x1nm`W!~x9l(b-58H41*PFe2@8sS)x%W=)y_5g7cOqi8M%GB)&1Kl& znQW($z%LPPNO&b8f0Iwb1I-Z>L^@}nd-`bh|9@~!1fMpzCRT_xis=91pq%Q9rJe(q zyjd!BUeh8?UjEMSw3^|o_r2@4?!Athp37xWr*A=`r?|XiFF{or7MkYp#oDxG$tZs( z`z~#2&=}QQqRN1h#Q*5%_X?4|Z zw13Ad@S(CGT9lSo6Obwb@sEg_`QfRNt9b2PQKvV$J`9oBdJS|E1aN#1$W+i4&Fvpm(G*sTO^W`(F-c9 zz_QHj&X+}FeQHE~rOO7h&LM}>8!As1-xcLj8$@PrsHh1ej_6$Zk;KaH^OUHXU4OIW zinoFLhYW}JSujideHKsLeHNBb8GIyP>0=r3FR?{v=@jhp-53`MK&Vgk8g^p$x2-&%M`$E?b@u@e~h>b>kS{m7OVL@O9p_;-V8=70LbOGbu8Tk@{K#l#c5)LU8jn zd@sKNz%5P182cy`b>;<^#qHT>Vt@K$@wjjy(6}>q z(#Bm=-o0`EmyNru{gBrCK<8Q;_X&6Pt8dI2^~|J^nm7S^sj}j@Gno8|b>?&UHMHn(yQBi#pHz6Iw{*< zIw|0wB5HttUy0jf-vTV4q<`NeF|>@;c7{#vJOhT!EFr!uY~}XG)y-7}11~ou9(XzZ z}4R?i|=CfkiP=Cpqe)0h8U)7!I z#k{(vB*wU{eH-M=9?jcDLx6|SEN!Z z)!v#)ss5^kVU{!&GJliM3Y*M}^aRAzMpQ^zm=WD3iHDn9JYpT@fL*iERQ4V((`)cW z*LysGU9WI5fZ!E}0$6&8aM%W9Qywew#eTSUvCU@w*k-SZ7pEMMY|#O(-7{cYpL$U(SUJZ1XYyj09F% zf&2>o9S2=pP2#!EcKj<0=s@8DW3P9zW6yw{-<3?+^&0WRSC%0EI&}3Zvmcms-+dqg zk8%|-gAI~O5TRt^N{K&#r3#{cLH-p@E)F@ z7)F)Vsvp4eWhsG3iao1aFh(_YCa$$K3OB*%GTKgl5nt&st_&O9-CXSg8DUk87OV6} zlZKnNGCQxZnF-e8ceOW-5!D%VM5u?sxcdQaYyYUIwa}g}Rr4;&HCB ztpFWY43huS$b_xmhE-ZHJ|pof-*KvWUB&CgFh;&e-5Cl8rTaAsw7dBL-I-rzdBN5o z4}h(02rOIe#y#Ujr_M(9s~JLTBwH$Ee{u39xk-Jq8C~o-ZOc4&*a~p z41c;+7dqUa^iJ;TH;meO;A9Q`i+pFLk*kUWx^nfK509O+{@6*ya-;idy@bLVwvmnJ zR{s#D6faA6|%Avu`cDYw_j5z&tQg_*MC?w|7D| z^(;%EZ6^)G;l*iC zXsA8Ne;^(nD(lxkcmJ{=4>ovaai3uM$`yY~8-eue_>}p;*Xl1B{dxsHXtlw%{Axz! zeF4u+$HxE9H?KWo++kL(5(67FkOs5bMlP|7;g!|fOx3+CRcM`Rud3Etj8+VWT=ssQ z8fEj*p2`QOcVUk{DcG-ee#y9;l}}&3h%@+>H-CesVd6#X_|ECzxN%5JAF0K2jhcV7 zEL44m+)tJF?ObO;Hnr{oAxo8iN&Cn?c7(!Ts+CSH9gAtOlU`rfqy?#cl%A&r@ZXfqRbc*Z?)+Vw3Q=8 z#T&l>Yp9bp4qf~#8m5lZW;U&s6~RGQPY~F8w*=N(@qm(hOdGmK(0-1B8i(+hp<{K) zZ$1&@$zds%=}Yj=ibnUC9u>G?Q`onCMyjW%%w`KRDY-Qa71j%xNUe?m#f_O#{dF z^vvMAqVg44O}?3B=URA7#L?fFKszULVE4V5zM$@3V^l)nu7q5&@x>Po;SVbUqN7oO zR7GAk_C0i7B)kMJ$d@s|%Hs09RRhrL!W@B|rVgt?Oxgz4a56ywkNsIq*VL*%Mb5PtSjYvg@kCywEzM zvZq~R^8*$SQ_o=j9hJT?<>Jyurd(Xj&@zN)=X01Jhu1m_fh0F&MaWBE{V(Dq5#VLq zwIl|1N0>V#cGqNt{*bltqzH|atUtB$>eJrw;nsr6BV` z1&OYa8)lB#cxMy++=!r~LVR7IxdtPUT_l$PiWlhNFP&}pqP~A)`#IVByubg=SN-E> z2l_@(Ro#oA6;K;QLXlT_uG@dzNfV{MJ4N>?L58jxR(tWJ;*&j!rxdDB?>i)a*bT@Y zf1YhM<4vaO*UPsrECd(2<5dCMWST8~mcyJ(q}Aub$ChNZPixs68y3(OoAUXG86*5H zcO&#WS^!HuH}QW{1k9)S93*6o`noq993H6WmIDOt`H>eHXJoARUrMij`0*HLrRxz3 zgTe4E7>m_jrbp;{_h*>{v}_&L%!{e^V_@cKs;+Wio<31;L(1y+?boT&Kk((mTdHGl zq2f}e7c*#`nzHp`I=yHE|#EsAEnIB*1t9URmCK0?XLPF8Y2YF&^zCuC*o4OU|>y}SgyaIt~=sX7^D$rTu1u4!N^ zAF(lkw%k;@9x$;@CxNjs<+feNVF(O}t#D2wfBUz%bgT9dkp}^w4z-Mbmad-YNo=n9 za>G2auStKp8EhDv^MEENfZUDSKEBZI+iY+Jtb>VJ-V2sCSZ?)8|FqucI^FLLd-#fQ zWP8mSN&cfm_>%=7)Xa`*W>9bU#G6T@ZbeP>I-Uurao^Je?u###7OpC|P7FK>T@(;W1Enwr&My%WJoGFZ zCAoT1^F+ir=%ETZaDh-`1Ba7fU{uy4+EGOr0vgEri#TV}o-Fab+}~pNOo*kiOUH<` zI=$_1?>hv_1QtqY*+oo2McH@D2tlZvs8Ot$ESN41RQOlb$9EoDY!u0li7{tn)@PG3 zhxLD)T*WsyV@OMVD?bZ9vd$oUKt~rH=V4(b#DS@;=<%a1rYAY`?fhp_;BtR|md{>v zU_q~To+|Mon}nCWRX@)6r*E-1cxQ<|x^0?P%uwfenu79p61vJtEEjGEm*7r=`>u-y zARGaXza=pJmEuN*B(}jm05I0KkXMhY4ak2Ep&F;$T#zjQf3#SC@^r9&!qt!X&$r(B z>6XR!Qq;x|yww5qTrmnA)GFl;df$8U#MOAVR@43yI-6k`un*MtBH}sOvA7?rop;2P zs>6z2YFM@+Rw7*dmHs09GRFP-(sgzCQNv5^qe72Ow!TK6wni(kaQ!7HuG|lKc3yu? zQ2nUFF%5ET>G6>Nb@<{J_@UN1xUwtGBn)y(MAwyko8$>NA+`V>8o^B$_xsCfdILuf z;9HC4CY6eR(3D&e}GXI-y|9wMUl6m;|L;N+X$SIeN_RpG(j zG9Y;0w0FD=XmETo>@Gv}-BL9BUk!f_zBDj$hw7!uZppgpkgfx`Wz}BHZUMV$7wKfo z53`x*>ipwIPOFYR_Z8_U_6mkH38OzrwyopoI+@NwflQ+ZM<{Q*i!jONA_VCYg zUGRW9cx{3I8bOOF8AmY2?m{WVQDbrRUB7p9cyRjp;aB^rw11SGNr|u6FE_GX2NlhG zN99_v?}Hey`>tjAtvyf2ciM7UGzNU@$H1cMg2vJP0(wNLCBwjL&R5$sFb{~U&GsOg z7z0N7s+xo2{_vaQgVX1Ojwz~NE$^}&9x@4$0&^_2?>mUP7>YhPMVE}cmus9Ls)s>DjMUg6%`qdLitsYW|E!TppoP zsV5xJr^jAbUNKeqzD-p**5iM>ssM@iQI!{ynSNz;rB$=?>16g&KU+R*@$vgmd^Asw(2BP z4u{-!*)K(NzTV^O*RdXkje6Ylmz&)u|E%Bbx6li04Bn8qi)q2cX zFo8IlGWvHtnt2y!a8`-Ravi{v963P9l1Wz;m4tcQ#>slqbNCY)k2LKklqPS4b!W*$ z*Gt_=k=k%h1|;8pBcvpMn5hFMW`NsLCn0uzo^(X zkqL7B1s2O1R**Q5TNVCK=cp{L^a7F3@vd{wHs!4yIgo0u81E37jXVHH1&Mksty`WvYL( ze@3R#ShF>l<$BEDD?Fo_%&p=2`tT6$2rVcA-6}hiHk6UkPEeNV{3>PVh_%t!Ieu3E z1%8}T%CQL$vn0O&Jb40rLVxpgmH`TWBm-d1%%GuVaicMrr5h!BZLHQ_9Im`eJ$jFA zqKiUj)|fI?^!=RVDKxlBig-dv6V!i6+JzYlyoljqkM7E8$PGc4poBih_&>}rVf2Z5 zMQe_2FZC2Y0W`-X`{LYb<7c+16zJ}@I=M`L)m?lLEz{JwkZLH}`srFWv^io$yKzQ% zXNcFZ-&;6G9nkDifzS;Cfkagx!L zZo*2_l-)~U;tt}=FVcc0TT*|xH}w*Vx&ofeu{tZhTX=6hJN3l+@kuupJrY}#J%Z$x*b$Tlx_=jlGhaK_Mp z$OLFxyQ@08P(IX@i7d}5AEceg&ZPFa~ZnM8+O?rmNA3yHW zJ1d1?_+X02{^GD=Sp`OcYRjyTz_p$ettL?rb+5;C)%(Sa21?cLwa&4o1k~hK0dkiv z=#Gf?4<%6W%(zOT`pjjn(m05)!kuD3*8YrLF#OSmha z;d|*^5BDt!mi1A{Xy1e6HgBO>^peq@L$?0exlI@%p`N3GEvEt@v{)lp@7U`biGv!s zfl|dsDw`s<6hGpU7Y+5-oSJyThStl0Un}#D_kVvDhuJ!NWXF7-fly^hm?G%NZY3Dv zSm8qolQY{U2pRDc+ojTQ6RO`)Ths`nLnLkr453}cGbH~F2oYI&Gc@;Sw#M5EBq`(& zK2*AA+jByONB#^rPsS`?{ENlzt7Xs_kSDjalF|k#FL`)15Ghq55uzdt*$shFgK7Ln3UHj;TAWSx;b5z$D7GjLt!ca)%M{mA?oC6w37AqC-0iv&J! zS=%Bb{F@aRbt%MU3#*02by8I2nx%qL3$hA69B5EWTXvRBes?4ujWnMKPSfcQEqCKW z^GkMEoHiA;wY@`U#^r*$UGbv)HYr>FSjvAsgw$-|QjtlCxqXRQc~7D-&pEW119btD z+}UW6P8Sbrc@N$&{ww2@p?nGFo$lYC`xaBX5*QU55J4aY z?pMlzi=-eVbd%s6BL`tE_|;C{VKz^9dLgA5;#iQI1v9Vu_M$;!`5B9K#C;+M+mnA6 zu$%F2!cvumW_y*+eMk)=62KoJb44(^K()11nSIRzExim-lDQM$n>qgR+f0`nfu`~k zr)z_K7SUk8RT&QU*DX6S+4hCZ;CIy=+qZUZRZg2soXOOOuX*3V)pC^$z}l~pv$gvyCDBlSLM&7wMdAQg7l+|j0)Hg&#PIDNj5mnZEPyAQmcWxx z1W%+4Jm_jdz$f5oSrA|1#s+`dm9v?is19waKZ%~GBE`wD9k?1vfqxV_n*yOlJpDC~ zOw?lr*zmvc827ZGnou$f*0Wg9KcQD@@Mwe=7Sp>`!O{l}JT! zfUD_&pNzo6%h{A9*Hje3-S1sqrmb=r5pI&p*q`7sl}Ii-z}2~I@1B3;X_nuK!6)3d zRUR9hn`E=;QgGT9N@kbAoA6s5@OzeMffSpg()Oy(4EOO|n7~OS&%mtN-b-vA0+7i7 zt*98nOkytWooom4y-C@)E!@<2jxnrU12%J!^3IU|6ulsxyBW8rrp}QcItJP&OdR(V058J zzrqk$7A$sJt=?QDqYEouU5uiI>BaII>zv*u!kE{6_jkJF2X%i}Km{UX*pUezYO1}$ z&LVR5Ek(C2pN3&Co74^LPv`-a$U`uo!GQ|>aK(2yp>A?O9egfPuED9*N(Y^8`P=|m zOEUF28{n{`UaYURDOcO4kgY4NI^=YfQpTdn$r-2(#8oY@t4yCIzgKfv^+YuVsDl8l zG3U}3`Yfey_M3l?-rT_r01}QvlG~ea6gw*Jy~zmP5(Y3k?z>AZfPUL&2ZN-xE&AYG zmO2Bz!AAIWEOP|*eN#weJEn&j&0ZGZ6;>>D#!A2k}o1^Ra)i&sf`Bu**=45?P@BdC7Vf! z1=UTYrUtoR@&rNH-2)g0zkngLyO?Fghb@P%}dLh48V|EJWzcWBN<1EnP85r->*)!T&|#0BTkg z3G9BgC>7}crAww{e*A6d#x^eq1#~Fd+{hVBd&x$(_^88jpQ;i#-Vqm7I&l}<+BL0C78R{{aJq* z1+YEXSi!e<8--;wd$vzhkqUcg>v@a#zFJcPj%+C@3hzzwVBPq&P%tDdOs>LJ|V z_2YI2LN}T_EsUV<8vJeJnbT$Mb_ajN7r@svB1V4Okk0W2dAlQ`OX+JG5aGUUJeeN1 zJDOuXUej0rb2t#X=f5hU)Tl#k8&7eBt)^AtsV7d6FjgV4sbdpoh1-(n?F0ls}g0jYl^Qw>~_ zrrR$N@?8~N@-IY$3?x{rE;!Fkp)*eJMOkuy8qO=1*#7vgOUa+?`fC>CElO@J+nVT= z2vZtEyJBK!rZJOO6mIean++BD54;O${jbWH59j*+xzNgaWL;IAPDqrCtU7yUUjSPOkr}XRT_VKYLFH&(h@OpOUjoUEnAXH8u#Hi=0N9Nm2g^=`aD@2 zQ{dvGH8h(R38wnRz(GJQBc(24$|%M+!BglzE=0;z^|+K-%Pgkl;+C4L7Z`IBXNk@u z*YJohnU{d{MSPv4vkVhxUUH$yGmPoxMqTtnCuS{86_i>LlYvH_CLe#E$82E~E{h1G zwN-Xow2IQM2?iVC#$Eg?hKy%G9c6O7%&WQJ^5;$Fi#&(|Sd2Oe;Zz6kgXBtAplqt= zd^G@%kvC2|PA z9ei_Q(fg8e2Ykg?4$o!l!;#wkuIfHY$Qf(5gx2xlwx#>mCYyJEoPc4f9tc`*-xL3? z9Yo9t)MAl1o_f4}D5pn3_9~ss z&(rCGHqu~xK3$5DCeX_?yMj6HES{$;nO5i)WA)?pb&)@tcxsXzJ}Wx{UJoj)W3&wA zZZ%3`Of5e9NI?08fnZFnJ~QCn8fa+_h9h{oT{S7gF?f)>52Q4nHYa^Js9iCrU^L-? zR~-+6ufw#2LwSF9JFqot7|%cK9cy#rMC>#F!h~U(mNdK>raXpT8z8{7r7h3Gbkf8< z3~5~KS%JSN=leD~sW4McVwOXyD)xNaapmFzY&BBJgxm{)69#-?H`oG#W*P2qhFd^+)#8jpopadvmYrF5 zL)obwKN&+cmk1t6s^5?;XBfxYnps0{y=ep5NQ12q`nA5d>5;m}ZLOC@VtpdQgK$&U znrSocp{-U*!`RV<%#MlDd!QB?>ngzYa0xE6M`eGS|E%U+`_9(0!LC2j-GoaGzHU#&;RP?!`3J$^Ybd zcyxaG<>26T8wWkK86j$k1HiQBQ8&Hipaa`fN&^D$RLuK~B-wbnrhF@nQ_m4lYov@3 zXJCK2uwc_z5~0I|_fq0oL{>R=Ir#~7y#CfJ#ai}fPo}Z|B*BlSIIDy5H>3Fv{o7>c zH8(@SnJ5*&%vXAVivNmU7W|VG!7MU>@Qptuthc`|E*LNx3(>PuDwXd7NX?*hs>JF8!2XMSl_;MuCM3iIq9dR-L#-|rr< z-x=2$BfSD7 zHnb_X&OEoI)|Ol=Ph{?an_h+5%pqGUQ7|cO!<4e^d9I!vlxbV-i(@75^O}RRqQuZkgO`64ac-d?i^BcHrw|Oi;owD&Lydl4R|NA(`jX+}D z5A;)FaLiMdFN|4|^9vqB*PJazNzQ*5tVfxC9DNF}R=`|8m?T*5rp+BQ1K5ic`%2G5jtVe+nPl6L^KdF8-psGvm@ z^cuw1yo^{4pP%@6yBkb*DAk7cxc6gNYf^#a;&hyRrx)`S+T$K`A7dQ+v3Q5s2jJs5 zIs^r~%@w=6W)m7d^f=D$@alg#T>b8D<+g6v8Csmo+2AycEM%f-bIeQ(_Xli$sW`JU zqeSr~IzT96s_&4q(g&gOE$Ca|2UttSrHZwJ$yl;41a&LQFx{+)Ow%i zRX>UX)u-@t@)RGHFz?3K9dvM`*-g0qh{NM+?l4OaI6}UVP`LKIFlT?rQ;sVCZl6(7 zTu-N*JG4Anw_PE`7)B!E3PQF2eTAaWg1*5Tj)+{D;x4HKn!zp*7XK!2Ev+g{xT7y0c$uIR9QF5)h2LlK6LQ=};fb7Cl=$OE`0+xK z@dCluMUv>30$M0qIuy1M|#?$%eYapTojXOc1>I5afsVI3@ zQSwe}CS4Y;(2*T~ur@~^x3A)8lF;><7#-lJU@1^<-i&ewhendc?RSHCFelhP*J8Fa zp@m^y?>Az4p-;eA@?H}(Um_-zV z!G9xCIr(GuiJ@)Xb~Xd|rA*mM`v6ccN8NU|1dkRf>+!_$ZnOU!yGUGP)052kLkD3x zJpg@Xj?I4sD1_0DHg0#@@!+%J;K*$W^h-Be4yFm%i5D0obj{Z#%35CeREDeItu^p_ z&tr&fglO}fofZ=|yiG}0;3zZyDVai#nEQgGJi5H(8ZIxRG=ndGJ@N9An|hSaV@5JA z&~bEp&iLG}A<@&rq&uHKi}4v>m_1DII3$ptYS(}8jcy|QAW57wPl5Q^WJ=_hpAybD zXq|nh;wz{$udISt%b25S{4~btD4jAeB1Fm+=tC8Y+uJmo<1Hh_wtq6rJ;Y%41FmWa zHD&wThy>@aS28&~mBSpYy6;Jbjv{Z9{s?`Pg@C#jk71_DERPbzK24t_V_)!N;wPv& zO6Pw`Ogv^hO5x+t46=xV4&H-}JJnIK0tLN_acQ#1-R?5U`tk7WY$z93sJiQvB8zaX zJS)iJCrR$2g(q2*FUI3oZ)Le2*M~mGDg*G>afT~kxd~4YyUYF%#D{4{vlD3usSnUx z6mcNiUNn+=Z49rdD@)XEz8ZfO^HSFK$;*EaewWAipPA@iWOEXnKh1p1kt^WDj4rLE z*JkUu`wNKNq(Ie~UeI+It-;cLT#XLT*E$^IdQmo_yKu=|pWxp6Fqus}2+9m?W|qX< z(_9-=2vjxScD9`;GvBxZD=5xBJ)?;rR4|Qxnt@g%+^wY*Toty1TG4UM=v4LAe!zbN z*8mcZl3P_ax^fY!h|4arSsYLN>!H*Gxpx8YHI71v%I=*L7m}PG44K!Ern~Cc8?eX1 zzfgP}lh0wn9P}~o8s;g>r0yk2rMSCc6J!o%CHnIs8UHlp?wZBW1x7Q^e$j7ZFY(SO z=l4-jo^`kPBK#4J%Ek21=TdrrFo}QFWfaJ;x{gN_1?!$_0y!J@4IiHzpPug@o$p0> z?sN9>@fV*RMn{7$2dB~5{?Y#V@Y?~R&OMipAAK@7IFC*T9}Z3jM+bwm=cDco-q%+F z2c3jeV7njQY-1zS{%+f@mAJjsCdqc=PUazy%-QaO#PQLiur96Lk1T3KC z9e#W^_z*!~rH|9$M<3(YYxMPK|KL;jc%42zJUu3yZ{W=eOflEwxXKQub6YtB`Jrj_ zUb@WLHTgUn&2k)2!>mW3zSkhyvmer5X2tBw$MI~D(_RXF;{J_(KIVas5+c3{q6dbg zUAd}Ps8y^^rn6MXie&YzKNWu|u;R$RaN%ZnJ3Fm5<@!~~Er+6WPy{xs{GQL1GYwY= z5RNr$1V?TlM012YKqG+UiAH$1o_5*gYFR6>fh{a9)n`HoF`p z&C|luT!an&dK~4+oMuM;;e0nQNu`=T*1|+>McdpWN9`UE{!u!bcB8}icADOu?Z3su zVj{x^@XVU7)4Dyic-ZtWfH%8uKR*BRwVjWT&vzNCFyK|Fe$O`-{kPUee!Bnoq=fzT z`@&1Go?AQ20Hy5r|l5_qgntyeaBe zy~WhM4^3Hf{$7MLzF2y&@2ro1eG0el_V}dVVui9Bnm@+JW2?^b_9+mrT$<28D=?c@ zyE8|_GzK_)5jA;=R%e>0|J%{FcJ#Ubni+j=H7oku8pfin5nX==cWWEE4)V4pbRFCq zSWv;I9kEyLHyfGERSf3u%c$V(KU)ZSBmmuj>;Sy)W{+oJM#eut1K1muf+RnfX)ZJU z)NPgsy(@%ufHgo}d2>T27<)LqZw5yFko-#a*up%~f33Vbzq?BylzD(JWuA?Hh;ez8 z0c4gg=3u<@e(rw~KXe@FGUCgMVm)_X0X@g&$xWQ0kKB2J<2UZx_o6plv+Aq$MwE6; zn1f3zgsK>E)742etUN67o`((#9F|eR`ua1Ea#-&~<5BjcX`Hl!N~lL3r}2tG;;qCy zoEK>Q8FHaJ;T??J4ECwcEO=zJJD4LGH`f^deWm<1Fin3fZ2Tu@6g@d+wVon&AMqYK(V+5hbP`Tku8(rewa`cj zBu?kaZcaxpG|6dc?@E3Q22VwchWTRzIHUXuUsBuD@}##=7X2=$&F=8~0yG6@;+^j! zNR^MC&;8=#-B&+`Ov>dC%{b24 zVIO~b77JU`!V8P{d#%^rC-YXd?ZqNgXM>LpXySD?kqm_kJiPimK94V{n> zg%=I|!6caoo+dDIJ>u3L$SyYE>JZcI>`6SD%I%pk6raY3;A%nJWQY{b{NL=q-pYTJ z3kmFI8>ls!EdeQN^XvG5h^!?%9L-1KMvDta-s1?ZJny#v@3k1&9{t=)@&O(LJMAWT zcabkZ$5Y3>=m}QKdjrpRTpeb6fiP1tDgfu}88T;x0BytE`$qUreY@<{%YzgwD~-dB zE5ApiIJ~QwpT-kN8w(I(bvfNaYMy^g;{NI2Fxu{!()hYT+v1Nt`vL>v;|)+S{7Tnw z($f#55w+)blmLn{@!RCg=U=`e_b^j*uT#dwmn^YH;u=&&|JK!GsxkFoDXu~=D0WmK zPGbdcnDBn{wmN&wrPWD#Zj8wjHc{31^q9CY2R}r`^S}2 zT8D?gr;v7Ar!9i@g@rKH6f^dMz zZ;$42anrdkiFu!DyeLWa`@Sh^DF~$)R@Q$)xy0;RVXi}xY`U(jl_ZRH`GNg>CSiTo7^#y;Wo5~1k`A42I zWS>C5CEk?c=n8q&)^kPESz|ZXGny7zl|5`>$5zl5kxZ>NsK9jID6tB{E<%%&Fbmnn znOwB$!B?J49v>d>@!C%>FR%$29`dC0qnIS+8UdBEy>U`)w<{2!uAEJpw%JfTMxcb> zPCpq|b-IFA+mIa{;`)E!MjnSSD3ncMVSCts<;*=v&z^O7<2IO@ID-1L4o~dF*y7uO zCs@2L7!@rnffenyG`SLWs%v5f0-C61W_FEm*oakT=9P@{ek^RdOd?LHY)UY(v|}cM z1n0AuSV_@y8k0?nQ-(-HliB#zO2d)2jzE0BMFdSk0pM!6MA3iRg5l-X8oW2RS`4W5 z`>}aqZ*6xU@Iz{GXD-IwWecw(BK3jcQ*$P@Qm|?gZ2`f!rNfXQg3r>? zB%Tas#N}f5eom{?n)`kJ-RC;}Gypr&9!*7x`IyT2Ur~rS^jfeOIGtd=n{~{5iyMd} zD8muGP9i+xa0-N& za`ul%udn?*oUl9f*^9!p7-WBv-JHYAb8K|MD$Nax9xzNap3PiSN|M}+VbOzx8(0;V7i=zh&zD?H(HZMNtA z?3Cv^w9r@;Ct8XhF4z%G&`kU{+A6R)6LrmyGH5s!QxI}2Y>6lRB_s|fWI36{WP*<$ zUf($ywHdSG=jV%f5%;5WO%dfuL0-RP=vOB>d`ExH-^bHhmyjgSMM|^B^39{J*N-l- zHknW3?PXjXq7xttJAy9p-^#_Sc>YTqb1Ru`zP8Ztl6#09yo5tw2E(r6&4N(WD+{=% zeCd_B&Vfu>*?y9#T_Ch&QQ=kmHZp$yy+$}`EILrW;wx>- zqA1`|C5zffu2w0%*qGCs@?=G(0mp%v*=P{uch_P=|Bv z?A6mjuf<@PlP4Ifm3q`7=X!qxk)Lz1ae^Pl_>yeS+y@6tl`jciB%kbiY!lrs#F>FH ziCob!2HCr%puD_uhPL7H@iEXhn!rgXXog#1+%B@)G>`M1v;rETKu|NK`!lDHvPF6u z&7DI@yAZDhv-~)Px@gd}VQeK@FHE0w+)1xP&gx}nFgs7C>D6coX2*XG2kP;nm9ZF5 zAevny^&0KvFKPA@uN`vW=k$)};dki*L`=3)rCB`?GD0koiN?`cSr)_aoW&Dmfi@=r z?v8*xZvI`j3i*bqaNx1=gVJr<(bG{f#r=7YR;DO2K@D?Q4!?}1KUqHK@x14~-J@%n zKgUyc>rv(*q&mZ6(ujY!CKDK6wN7F}B1V~y{5`$XcDQN`WyPMv^B6C1nB@kaDQgO8<^uvyr&3i6s=Ru3DPjccP_ zg(ks}728BKTua+FtyZC#R35tS*LGT2nqqq7!30w>>=YBC&KO?^`0?Pg;lc6A`QVg5KaQu#7?uHX zRs)aBJUXQ33#h=CG2Dci)?q*Ucz8l!XFnvjbuj0rUmTo&aXMf?ioL(c;_$(oEatfa zg&HXhojBAc(+RI5^O&4;*sJ#{o~E-Wa>-jA_w$~dEhc|4{>Eo``6u=vd_$HxvY(gS zX7J-zTA13KS>AvIPAZyJ5jN$J@RnQSCc3;6bohurX@u1c8(ptblcp|0y!TD_eYSd1 zH9$aFb)BBGZPL2l^ThDJkWSi7hPnzyZrR{supmII<%MF>>HFp2OXy;U!?Tn9a|m&8 zx_3N#lw^PNA0(Q>0I$%ww4U2tt|@mIk0z!VCmm-8*(h%+Ofcz)hO;*OVa2@f74d+^@?JGAKw``ecD<)QSOCP7*lc*S3SEofi{TWd2 zbAW$-1>zR?1QnZ`M+LCq&XR{{5FZ0I36P=I7op?Hnv5`_4EI;7NNuFFZW}bPHs&a< zU~xF1XmeWbQdaD6TH(4P*7_6+ERDivxxp5H4Q_D3fEy+hdx0CAP~=9-P+djuX~PXS zv*(xqfi0%g8f)Bw8JqX=+7{JPAHCNck;{Kx@d$C?=B!^B!bp#9UUg9!d5vW_z?0H7 zw853L%3z+0QdOYuT1}ubT}4>&tdda!UMOBLyj22)4t1cB0h?<8x5O`qdyG5K1j)}` z8`QYVwJ6h214L=6F1ChnXyfUvZ7@&X?rCUaWIC1VIrR1rrjTeZEchFFfQe{jUt)h+ z6Y?$R5UY>E$4qj&0v8M*Y|<|Ssv8Jx;JLR|!Bf7PF*}vCmn!Vw>KhpjuAzw5A6%VO z)|15nUD#kk_d3n2H~i7@xg8@NV0a5Et+3o0;*#T`zz+PF8 zzj@CD69U?j+&pdpOTw@Cea7a^3YRm-{c^6yE&YrIZlNMnwrf$?r;==5e@6NfJl$`B z0#4Xm%NIRjr90oZ%#9p@=z;*Y(cko*3ysN)ey7>6R^28eyx_`&5;NkBDl4s_0&!?ZsdxLH0_R z+*cXVYDipMmNE`WUkQH~t{q63@m)!ajt<9GMux236p!y~%yRi$ncLch8Ik{90~4@F z3DU1%X4;|BonCv~Ub|K({QCJOA*)pt8Q@v$a30HqjCtSI8jh%1>Om&^m zZXCf8+z_zyIZle*?31--~G(b`VhT@eC4jiGbAq+SzA7QCo|qH&3%o)t9lt_)OIq; zrS8?T-2L}1IT->3{&zzU(|+SiG;|dK(?{znLW8SNWlb|@kNz@i;62%NDHcBE6)wk?&Y7I@)M)_0 zf({7w@Qi<~&M%;a`K@TG^~~GA;uWuJtzr0z#s4Dv$5jFb{aDEYa*<{e$Z%{D^m`Q} z$R$82YTdm;JJ{AqtidKQaGg z$89&4sg@VWZx&(ryQ%^!7ZB!87S)Cv23gaWzNv$G5v%(w~Oc#GBx zj$`5DQ9nmIremZu%i=L!Qp@6-6k|t7$lKW%wR-B9ILczYBRbDg4C2=B`~K8MP9+($ zoUrz57)iN*`;6zsbt|8_bmbx-(SX2ccOat0G>IqM4<*wQvG*d^aNQL^hwCr9_NsS7 z(R#vVQ&3H~gjz$A2JGgx9=qh%h zLw)4KjN|Rj?5$2FQ7_1^INNrYFS`LhmHwW%P^T!bf&7Y7t>RIn3YvU^5rb- z6`cVx*U=+{f9c$hs?_PC354umb+Q$ZEinFtC8oDfM5y6^F>smL0pipbF`U_ZKyk3? z1LFvPH?e<*?qgjSI?yimf@N9owps8P&o~8=6gl6h?CDpid(N$XT8l$xU_sNZxg;fr#VliR&}QPI8NI8XuuCJfC%rA9 zG+afj%2s7kP7nbUguL50p2G9I>{^E|D8 zEN)JvYwiCep)*-4%GajC+2((T~Focb}YcW>*AN}U4sQz?^{_s*@^&vm~%B<#9I`ko&x!FrOIu} zrOnYTv+n1|?wpSpLeC2Bs~%{jKU#{z62WxjY2+Au_(*as$1Y4$xPCop^qlK|1FB0d zA#ak;1cmiyK)_@+>Cq3%^a^A}mP@6~K!91!z!t5!aKu2fRDIx|DJW4K-{M6*Uk~Wz zI+!oEP;OgTgJ9~T3Bf3vXY-7Nfe;+p95BqMadef;qnk8~sgB+FSLi1*?2C8(^+=%n zEfyZtND0NunP+DM=-V#tc{1OBte%UlUu}bb-4NX!p?hUREWcTz?g*XrKnZ`Y*VEun zRVNv<$EoxX9X=w-Aw9MoW{eq^$)v}>f<9w$bB76if2`{($291JyyL8^Xp8Rj%dF6a zt4vM8ie)Z3?rS*dAc6u3$)vi!dyuflW0gNH@_7V-wCQoIMHU+*#7T;Oet(I$h@hT+ zT8?T(mX}J9MMRF+KWKnDwErPM4w2?+vaol@HF-}tj$Iv6@^I*gKIt=C7`k_ck;C&* zcE?u)O+$=oSl?}1O<0PDzAnkcgIcl3KxeY~J^-b=!eMTRqWeM>lJ}!mw%rrH(v7xq zIkA4eNb_o1DX)5!huM;UB5^%*=f&Q6P$jCM+GtbAQi~|OeWp_y;$B5&Wxvoa0Z5;W zlG!fZ9A&HX6inuXTVv_6R`#ARE-G?ke}UN6Y%t?|fM!DxRU`c;X+6>yQuq%wOh~LH zbbVV~#?)ePz(QJJ-2t_TW9<>$6rYvW44i0|3oTa*zGaM}W<^tfxtgh4y77Na4;T&3 zIh2P)9+gPn<;RTT`3nGhiOau=w~TxM;I-Z|dQYNoS5_p^OPJtsn&~Q>A9Qi~BrjOk zQ%;m#+b4ncv8n#u5)Ex0%~KP&9H1z+I`0+i>`3sAWO@f18+0B{aBhtavT>N`05|f~ zOrUH>o`lRhP}c2#d)$nYX_O~7i>WWg6b@%>)qfe?^`a>()MLub-Ln|{a?dY6B-5DO zh^}DZ|H*BwC_Y3#!)D^V0dg6?@E2(tEv9p%jhiAA0)eFR*YF8`0m3`M6i+H~;Nf*8 z3O-+!XE4j}CE-nyG!rK^u8MDdiwK%uPAa{jbd~}oKgD-{W&IdsWu@vv?a#1RmeWs( zoM*JB(@0?CV(GKR~Y6+W!?$Gtx=Nv_H8c^ZB7{)N?m zf$%XDtse^XGv{sJH%|iO{0e_%!+T3x9(B*+I2v7n0JiHa(`!Y`MCV+AY0~`lty9bQ zHL6KLb>fYGnmnc}2Ry4O1&PEh#)LD<+)bLtTKCq$hYK!Za@# zU4L{u#183+#=(I?OkuT7qI+$Xkl;9!HpiY;ysi%wRZ2P42WJ&gpCSjKIU(Gh3DzA} zL2Z+!z2M%jfr_>-RMSN{H@)U4YEf8 z5YueovN*>;Ve|%wK1r7QC+9FU267*3p1St(-c*{=4tJLE6U3T>D(dM6Fi*bakzwrX z1)ULJ-f@ODBpJ11W?&{tSdgfRH=_i>ea8k=E7SL(#e(*q(a;vzQtjfR+UY>mXj3}3 z^>`hBuIk8??q_G9X#J&?`To2?Wp0($P2$Gd&{njpY>`%0h8SAabwUQGRaMlk+?Xwi zerN5LXQzKch@aaFR0rQp1ma_-SZQV}@5#G4Tq_sH3b@0zP!ck-&@}otFVLWGDK1l0 z>g{%pQ8ZyW42Y9E=$icU5KaR;MflzV=yK41WLM23ehMtjV8>p$DxD98hKv402 zuu4+xkED%58rqXQMm-w)ilTzPK3mCSjjf`bCi~i3H1h<^#)CHz2%Y~u%{xlx58O7e zWDnFZze3Qj*Ne*xJhy(RRmMt-3?(F7W03#ygDo-mj?LZe`iqX&dC|d**ksKSEIB;Z z>J*0a}LCt!90~6ZKkZmgoQ@+|-gBszkh1!*d1z}ndYTb3l zpX^<2ZzDAj{wtw;AcZu7!Y8CklpZgYfIIaH2vz8mYxeE}X;QKcP|)$)nU|fNos6CJ zZZ>TS1w^yArxoi9Q#Q(c3ks-tcN@-ePJBys8jq|N#R`6n+wkht^J2QuBw#Rp0jx7OsR zQq@;0xbP5u2{YFJ$-3hqPt1FNrti^~TiV{HJx|mIPiM83h&Ct(tJyfo2v>87n_zRL zAn(RDhlyHhCR!*kxUNeBTHH=C=zpJ7*Lnnz-i_5BiE>ZtJwl{!xZ?YSR(w*BEv)&7 zZ+O)wu_^05CDfH)EEm%+ed5=COf0KEP2X<)M@gHm0E^XEb6^u zfi7{#= zguw9hA+HZf$XgM`&vtg?5quHF-L%S4DUaYI-OfCM&%*de@NI;DDrzgw;bY8DZK2G~ z#Q%htJ%RWE(MKPaQRe{I(-^{g!X;A)&#KQ1T$s(vJ~%F6Xw0>iU>HI6dMYw(QIJ>zJa{IU|hsIxb4b}#ll1D=iWQwn4AmK(lqJhlW zpBvT}$7*$Pe6%iqWddKJ4OZy!*i`30#OG=aRw2|Ze;FI%6-uPqxK;RyS_G^x z1noYsCik=xlk+8Kft@Y+LYucmwZt7miR()R-Zn3@MbEbU=b23U7TIr0=oxQI-}&Ce z;NPhyCBYa7P9z1-`Kth|+(62e{Unc}(7mkE63J?r`x(bX4d4_GXw0s+zFN+n8 z+2sz{t}VmWs<#G2POk!|`?jtJwm51mzBe}Ck&fALTYDu8+go^sFG~s;?$pns)~u52 z=0#TXD+l^f4V1`>K)jcBHpjX zo~(Gm_o1GD!W+8ha97{ir*aE4m&Du*J)kh+<GW$18U#oS=Su2K?EXAlZd{|!^_AW zex2vwVAC7)4-Q(s&~tFmJR+CX>b?-v2CyAhtackxJkQv8WSd6#s6{38>a(f!cjS7 zoX%v#GC8W<28Wc^!&=QCg}r<7CI0Rj>rU_T?@pgOmfek3alz=-syfq@)Wz_pSCw5Y z)ZZR|eutOyuTxX4qE-gC#4GxNZBSt{2*#DhvGLa8Q)wSx(`B2KuKP~!yhD5jwU^Vc zbm+IJk{F**6 z;kT{+cMnc{{C|IN!fi?hg3=zMpaZZ-XRICXECo^+dW@p>C5p6J#0H&f%4-yobM1A1 zv@6$Cx7dC%&r#IgNDIteKP|feP41=T?22)nnZz~{@K4v4(aCk@_hu<9+x^)}?FIK; zSxI%)s666k(w(XBez&{ZnnD}hZT--UgkUe-m`Uw@=Utgeu|}xtM)a`t5^o2?io+>COWP`;BHO~b-Jets>W9Iq&_(GT@CPm*f5DP z;4sX+0*ES!!T>ReWrP@?y$WToaxTMb=m7^SXjp?~G2lW8G{wkR6Z5u`?Hk}$s0(YO>SAQ8620#@FPdhVfp z!rWo|Y|O@xJ_{ApZCH8jDf*&=g3t6aw41q#XKLKsM;1ju$z^8T;T?;ACrHh$V?{C=PQ5^^GylbUs%KlxBW2W2FxAIq&b67;{Hr6X%MTHF#R%ln+X2Ua)R+PjIpSgYD^c@c=MY#_Eu>dSkm!zm}`h<}TJ4EKhSQ7_)0R@}=B z=mx9Yo^>+yP)T%KF+#xC?5k1eM-ap#nl%Zu({ZxjlV4^1j{Rjeyq+vw`)>lU0 zfJhT+j;>wR+tU)ibea>fDJ3AA;tA!TGG81NlfeN^^cq{2aId#6%$e*;^TsdE9e-i| z?TxJzq_0B7jZH~^tg(55xUnfo%-Adw{q)8r^JTO(`K_j=DPyLl1Q(JVElqx}Gql=n zOD4%Yi;i0w$BUr>m@$Xzv1ju?W^$4U+pN7m=8NgLv6V4rH8No@m*q2E9?7n?O-Z(W zl^||WLZSNi@$2o0DdOg2Sjd+*CXOLnlAmfy9J0=mB>sYbevutcLTtz}7eeaSd( zS7u8?jUh@Cw=X7$n^%>Ae0byH2(&H!rKTlm*s^M*yx<>bT>LA^wnCl)^{Q^H9(4$y z`qQ=UO8u{YIuK|PTrtA9MRmBlne%f?J=(!9kVgHNh!NeVjdmiJ{en?mctK5OhK)G6 z@UDrw{{@O8LeIyU3(z8@&bR0@&B&g;Kx&^1`jW9s`tiMf3?4rt=?YB8#L$__eQ8$ z`Yf)00lLZZ8)Q9S4F3nFwtCZBzfv=UEt_F+@^cW-5BJw93R4Dmf%$ipOp0vEB4idf zIeAqLhr{kjeRzi!2l?~ZMvq=ofE)h+R9cn)+xuylTfLn9u~9Z}lz1ioV}s-diFNUR zYK*h3U0V9s5}UU~xHI&z8DcYpirBR_s1VA3`i8gx+?ML0J>Hgtxi2hb`xX;#GZ^bz zO$*TN;YMi6PC>WLEM{A%+XrAONx0ioTWNs2-ON^+A#W20%W7Bq?R=hR6wr9Iarj#0 zWd;-*q1XfsE%@}yOe``IJP!NjvH_N8c7=Vls3`;r>#Lk_6GJD#fQ?WjAGi zRDZwFq#`wghv>A0wJO=$>adp123u|e>Z7B$@OG38RkbM14vG3Bq-GyRB5P;}PQXS{ zf8_0qf{AX8O+-(qy+!!k;uaxXyg^7z&>s9rH)%$tO0fpdq%?+fVrL5yy~Y%TWIL8n zFn5Mfds6M}0BO7#__O7;MnDwnZGd@ycoU!qtVzwstM!s&hLiDy5~*T5x42%2Vq0o4 zr{~gRC!O+Iy$Fd{OC=I6FRFg3YN8p&)x!j+9X|CK;^nk`Q@L{akjZq=`>1C_tmfLV z3#v|OwxT&^Z4_7fX8W}Jx`gquW=}!ip|frlWkija1Pb!*nCXAf2LsEM>Vko^X&x9zndE?hgbDr^NVc*21?Imaw=kn94$GlYDXtetw~^-s zH6!PEA*`L>g+y%E?E-U1^twP&b-Ezg928$7*123@JtQFTkxe21pQ_0|7ulDbJnmj& zJmy~FVt9LrSFF8+c$~e&;4DXfh|DZULhIcugla&wVx25Fwylpv^_kBWYQ?PIr5NV7 zCEY6X71xT0hBb1HW5rrMD~WTfh-h0Q)u|$&bB#!KsSw&B{%GV-QFW$(#P+gs4ncmk z-KA~9B8JhN8iKk}&>-T~$@Ytp{gRhaABOr{%8ArEP!M67{{#*;+jO6Qz;fNK_k`x? zYxvQ3Vw=7bXiInJI)VDUSI>zQLwod_Xzw>s(_zU3SDqV=85+l_*93nj`%bJgGhVc* zg(?5$J`)MnM7i}T)3^;$tZLiE#VrS7<3>{^#b4f3C=|?u{;G*Ev08_h<^ul@MnRO_ z7{oR`X;2$?=tz@b6pwCyG+nsS1bdaR6AeXe!-ocy+TMi*rAqOjNieAf{xfDb%Gi`4 z*?I376tcbZOfv_XQUk4&^XNUZiT4avWQT4E$S&xWAaP!e+wq)1`%QP8QR*WS)40u8 zvW8wWm?YV0Mu-O~44azigL9eL0n_ZtU8cQa4X8-uO2!n~7si`^ydz%QOK%NCMER^d zEnkZuve!E{9_95p_g!<6LHU}afA98n{8}s7Ed=oW8rTDMjnQpe{8f+t6)Fq=rQiqZ z71KpaggMJ&6TJ5(_|V|@+h}_`iM&UZb~)+U#!c5K%6*}!+cuMEL%~SbR30|yzLBYH z3v<8oMv{cMPcxH$hl01SfhBy4KO2rI4rNbF%#a~rimm5>4Po`j;$9K;D8NGm(|fsB z#yloz0HHV9G@mFQ2Xug$M>h8cmzP?5lI55E{o!R1xASoMh}^mr&%=P}m-jgx1O*E$X$L2JJOsX8%k{8os65s=_8P{SvrkW?>$ z6n(673(yqSBfv!1vtF9N@C49>I2Qqps&x_|s)(C_M6;s+&#>>_Re-YnPdW<-Xe;C$ zV1QiSBVg};_YBU=r;=Db02t>LME&pKgKm?{y=E|fwtzU$pO<5I2K8rg{K2zECc*uQ zvMu1BEYgGhm9c~SYt)tj|CC264-VHjn3GsS9U#l_1cv~Br5kWp+MY7|7Qu8KDd*=a4ZrukY z40$GW!nQL|ag1iI!KfnvhY!8d#qMRZO8FWkbGUaY5OU*Gz{H7e1vIp6)v1JddJx)`Jy+@qU8*KP)4YzhhHpl!MukWTN!*&xxb9vu!+ zO=F8L2c(g^bUH{hjz`CXE*uYH{Y=F9fFrl!en86IzyX0IOL9R-G_VG42zIASjlvV{ zzAFNWd1uZD3A;kIih6WO*u*7)slQ~cL(wP zBw0FwNx^QE&|&;3v;oSW=7vYmWP; zWShf|iOsG9k9WuD9;hFH*?Hx!1VpmZSxhoVJXDW>uG%R~-X9z2&Na}7<|VM*mbrs} z{sK@*sWxuw=3D-3VIUsx%dD*aCDa}*abN`aE3sOiHWdSDTA}wqeSl+OjRJ7to@%J8f6y zr&bo#)fadk19d*ug6<7GUoE${VH<#d1$F5utvyFh13p`G4T7J$g+EJ%Houmps;NoR z^#E(1V;9is?SiYl%-%#T%|;el@K6Jlkhb<&Bu_C}4x(w@acE-Z9tWBG>;^G^BzX{g zUJE}5RhT%*&Qip|>otkJ`6Im?byXwqfms5k>V8~Z@$$e z3<*X!~Vdt`2^N6MDpT?FHSyw%Y=ho0m}!H&qsOo zF7`KXDcMo8e~Kf5ES?u1%M!5r<0rjqB$DNNKDk;>adlf2dkBIn6D%ts$$^R?)$xBS zZlcEox8|yu0D}?jZ;ocPp+G=$KF|GBGw!_)WvGZh1bp+`{{E*Gxk*faB0daM?xCw( zUni~VIHk4^eQh5`YnxcS$tJJgAhKeSGBn3SMy)9llc_#)t@oqFQ=nLL5x3zSSf;@H5$#% z7@Ci|iF~!lGF~1|UcZI`BQI%&6g6P7vuqqDf{23T$2XIkEKEdE1=-WZX!bfnM{z>< z`E(f}!bN%Jox*NX9T7#~FVZF)yQkdv8?3plxvJssSKw z<&$Nu1aPgJ5UfNIf-5jC1jctDgj55CooMec#2TqM28joaN>KO(*$rlmc6)koq)IEN zcb`m(9^_AI$bV`VSe_97kX?Svoy36uux}B?eK%hSC@0GKmN?(0a{m7MkI`bB*D(Ey znEsW@v=H|U`!BnHxxG3lRrW45kllM={&hQmJYkZOIo;K@9H|kxYQ6`%OiIC67_$r_pP`S7j*3>|>Je0U^3Q~SZiCuMRCz>LEA9M>}GwZk2NViuiC( zmtk(*p;YVF9fuET-C>pp>p6b|{rlG$5~BOQHWOoi`o%`j9z+yLDP$oq$B>k4@JdMwzcb?Lu2C-SXuYjLfbWvM)i&;$06XI zIRMAoi@iVhex~IN{Jf=~a+mlt4i~Vk{G2Ymth5UAs=g=>OEh`(%zP}DC<9hVR zENl(GXIC+M%tqs2+sVOFZeqg0uk!^o^l-a7KK*wvh2+oLx?T zVZ>q_*#!Q(x(1;~GaQQ+Fnm0j&)&m9VtEM@vYVlFQ%@)vk3#H&GM?nuqnk@eWiO*3 z{}P#eyr8cqr_Y}qpPzjF#aZu&1-ks~=|!Z8&j&I@3%N-(ML9z&@yY*cz~j-~*y0ajO>=tua8 zJg=Ziz=er+ARw2baXi0VOs;VrGlaRt0Oiy|5I#7kxxsY)`Zd)pf_|U>KqJzBfQo=* zH25Of5?b+S%)8Zmjg%^D0bie=Lg;*oQP<0t(@Flu4Kc~PXR;1VH$9NAoa^fU54!y875 zkV6W=4Id5)@Di++WfguPowz;I+t8HIy^c<#U%R`}E~0OwQ-UAtb!iv=p>!g9E|;e% zje8}X3FTfjExx}$O>Cp+Xvm<)SCbh%Qe+GlQ05cp0>{wfh-KKNjc|&8`89t9`bQhE zZgyfy)VXl*B&Rm14HBuaNs=r)RWuWJn|ICKYEmF6vCKKIxU=Ye1+l#!(3jxW^hkPz z8t26`M56Ks@og;1}<0He(}XZ z0SS2K0NwPH;X* zIDk^tCTuQGe+~Q%5LB0sl!OO_OH?XJGYd++e#eqUpOL|maTrQUN|%>qrHdxe5p#Sh z)3l?#qwVN0VNXYvBxoRpIEjJ(CUl8}m{_Dx9P5vxUVfT?3WhEi1LR1W=sq4ust{w1 znzrp}=T;3^tLmOK9M*73py_(50q3r?3rx>CEu6FU2KE~n)Ra<5SSz^=!(Rb5=;{ZOsJsS@GBglVgD~sccZ#frEXt+Ha$Ry= zp{7i|VFDa~JzUl!7{Bx_eTJ@yZM5gOtV3wrhl>ZIz5SiN2;1d&=j3x%%M3U*15X?@ z?Wj5S@7322CKc!P-En=9?eRE@Nznb+z*oFkz`Wbs>G|w75%KuE@W3-uugk@ zF30iLGVDlu5J%oaXc2Nw&E0yCJ3C2{Od~r;0WnQ~>cKSd-3Z3OQJMo{f*w#QRtQD; z*)~}+I!8`a7RS6KAxAQ;_#B302*ONo|9C-!E9rFnQy(fP;n1oQ4jmI+jl7olh1-*< zn*S)+UV+?7?TM|ELp7Y@hw!FR-Bwe&(~|BwX?CYY#RJ7AVD>XET!h2K_pq zO6<2o2ieDZPFqymzii?Z6CHl#R)(cjMbdQ74FJi%?UT#Ic|XgK`1gTzS;M1ubX58h z=i0LbQj%f~n+!hwm@2B3!QNBmr3u&x(|a$1$R9zA$(N&cgU3t_FG zWQ1F+bc6#Aw#?bA{gacO&-Qaa8WWAyTCmD2jhFbce%FVS;q28L-Rg+tCJp(qDw6W2+TM5qG@Pbke`vo+iwB8x<i$c;Pkr|oU7|b8(RsAd;A>)sZVAV4( zOQb@kk|u=o%$@o%y*R~gxg^xXg>48?XxIlWoz@Q<5$`P%LJx`$S2@B$Yfu#U#In&o$weBTwds znQWM!K^Q?k`Db*xLKMC(htCt*zn9HCz6=boNYwy@7YMO-{aR*p##|4CYnCuTG)ZBQ zdCWo%tgE%q>uBtfliz1iDl@C{M9FjgL-4R>GZ4`d%&jw&ohOI2(dTS`+{;&vG_w^U~+yz4}!QOrRosXv*PXD6%~qKETA z)}!|}!zmV=1dvu(nj0-LGvY|2fo>h~UOoYP=TTUr{+Q2j(mFB@x;)2dwS_0dZqNog ztwJGcjXE(1Ko&S05T0Lu@g29!wC90-lx9C6bD!O#orB(K@940!=AcE#dz;bciaNIL(Q}8-hoE0qDl5587s8c-?n`;+zCO|&}FlsGH2(F#l$Y%g1 zdyLJrB4A2Un30cQM!iYqDa6W6nduLsEka$$NNh*n>>MA0K;MXede5U$GIxU+V!KnJLDl67ZCO*ccX7X*C1MQN@Dlut7Eu-a_9K8 zw{x(+M^qpH=F8s634EbdqDhp@i{6NS7*PPj1XnuIb>2$DY&*Fjd_rrc zgooKoA(sub`W{q7+HiKsrY|wF!#v|@~3v+=RxbXykDa6N8MiR{5e-%+!HOfaL0$tVg(~;FUV__PS9)< zNexM7T=`PuSp8&FJSX$d>e<(WP3_Uh>+HGK>CVX)Pp6CCKF@BRLBw1H5o~KuAPa_3s!=(>Vv(IFTO6If2e;dlsJ)8E6N#IBb>xd=_?nBjTpUI(^ zVGc?Adm_@HxF(Tk;{4UHD^2&IW|CzB)Oguw zI(fDlIDt0`&jrkM3`5j~^?A^`kUoKDX)$bl{N55lPzwY*Dm7u;!p>#K;?g(6xP z-#FIpBAsR0+WtAUwQ$lXZu3W<9mJOMCRbs&!j!!I0u`6G@tX7~;?K8Wgd_6hJ&H#B_duDLZ85@>dz6 z8Qu`}@tR!KCApc3UR{n@^k>Oju2D6+Hrfml&)>`DTj6cgamVPnl_xXZ9~!tQ1^&YuR0% zzvT=jG0a8e{YzP0;4J2BM@9KCBVGBnNO>w*AAX zrMXTM(IRHK#x;B*@@ZXAu2BVx-KjZj=>m0iX;HsQ@mWBnI#-*jKGPvvcK`=}EM-xG zarV?kY&t5GTPYBn4KBC+b5-bpY8;D7rpX-04=ekx=Rnx4WqNH|qc8jrw79r~atuuG~>PPPXxXJlt8A6u5oeoO9)@Y0LMye2C$K-it^);kNJx=?O^x-TwSD}18=u)i1f-}MF&r`1 zwz?*+vzpOuf^I{ovApuu>b8z=MyEsi#ed~`kmvHKbbGBC;tWQ`Fo`lbH;E24r&|%c zs;QQk4PP}0LJXsig;^L_^Ebdu6Xey59*VHRa^145pBA$2_=^tp8OFR~(g`#}Z9rqzV3DB<80chonzP{VO;%JOMPZ zxbhrjJ@O8toJuh)xk`Ae!-R4JAEEVQbffWqMB_}pEDfSvNyzs&rjvg(Cu15t6y0<} zFK9lj5Q1LQ8VeArYK`V(Olwr3H-Em+T|!gndbgy)-Lgh@r_@cqO}M|;1xdT3a|0V2 zG=@YOzB`}6)AKMI(M*s}Fs5X;be1f&lfypK6Kgs+GLE4b1d>6l;$F7$4LvQnp{F>1 zFmBt545B8<0qeCjcbT^U6?-kn$*1IAYEMy+(x%F*I+5&!VxX`QJqR#Ry>05RHTZGb zcM`V$T65vSkAB+Vt5Sb|FGGZGCs$nl5LiB{U}e#6%edmA1}(u2@Y7;OJ<%-Jx;EQa zUGhDDoaLtjwLHw_puYUt(zTVPg}IY|*GRZ3H-wT`d!HFV2N`!X8q|myQ}Jzv#Sd7h zRLrDB(qNKgfuV0H^B+i;?6ofb<#BX!Iu~axQdbcp7#z;_<=73dXnr}Is8h0VoC>9E zf|DyplX8&3ro2Hr1mdvLG^-EeG^-EeG^-Eegw|(Dcd`)Op~UjMgmQ2!tnCwj6oDCa z0#5(I6d+v#&j5Tf=6TkmG06K@xF;!pYJYk3h@?TaJCPS5B;o1zM~C~E`1))2s7+8&9=0^E z)x{jpqxAc9loWQcNc}v`M8P!Yr1u#dgwM&|JN@qQzWly-^5xMN^cD5?;4j#sJKg{G z6gM@ptMsR&1uvZw+@ph?;}YBhg?oP4A0r%sG4Sru!O=0o-Xqk{j`#O}4{Z_0z0W?| zKNdKc(Vw5gtddIHO)t}N{Mi^*&{76HV~+_1H}KwbiI)(9$H|~fZk!AXV&A~o-%{1y z2_g5*1$3P6(%WJe5qQAz869i-oZ9}KD)e8 zdf)9I92|Y46yL9qwkmUysxN8NEX*;BiiD zFS&*h0CNCS3!Tt^@^_e*)Q1XW6RFQ2!6(f z(mIEj3e>wwq~iU|%4Dk96B=&fO5!R5Pn^ZgA_3r*HXT4p?w4PkoJNO7r`U1&ys|&* zV(rPD$*HZY^cjf0#V(MjG@5JuY0JS@wmZdMhZo+|Qqb9dKixUm-|mf|{|+Y{R^5$i zC`IHOxTn|K)|R7>NildlJ-nH30Xi9;Lr?lVfd>>OI0!)c#)d^N*)NdG8Ttw^*)a;J zRQT|@;YyYw_mnHmdT2ob3N)Iin9J3xO1kI0y4B)2x$gfuYL{ElGontFs!WM#KN>*{ zdxqrjZQWFVyOr2u`Wll-fE0GBqK@~~R0#^&HQ|;fp7&hY#5fgB`S)0dBwMb!tU}uU zEa7at53e^GB)_#gL<0-41W4g+(snP~K{L_rlnR$sJB)W#1s*5d%l4F0j);+HwCwn4kRBD{L&v@;_;)n zC6q`UtW4WEO1oU~F5Ko{#Hz(bb>BXjKqkUvG1bAVNY|$^?sk5{tC%Xa@ZnU_U+121 zy@6@AXDa(;G7z0ImX32(E2tOFv4aTG&=L|#Xzvqn*9En79i7(l`eDl<+#1^)TiDls z2`nuxlgDXhIw=YC#R-jmwtm8Y}K3ci*Atl{1UN8usB$NYmSdr z&b`9=PJd4aDWhLF@hqe&DrO`d`MGp|2PcdGRI$igr?g8LVJ`?4B_Gk`FoRMtfMZoE zP^kg7KJyw9Td_|3tC9Xp(KlpQ#9k+LYvKJoL69JI=6r!1S0~(@M(oaJP8-G90we@m zze)_MY)mdU;vdw-@F7iGp_mU1Aiy-8_JS|$kHOKUTsyCnVga7k?rB@xi zwlAUPMY}=;-VY5s!Um!E=6fd zMM>4}sG3=4xN{0vGY)XKFc(69-dA4GC31F0oL^U?j23NgpYEJ~bs}5ZhrENn*~O28 zqn*8d+I6PSuMUfZ2Sq-FHsH1|?pw+>Iy=(j={ViY+!^F;3ENHO{hnAHI8&RHqa+zf zfcKaJ05HfPdWP36WGO%F3;$*l-0->qjTvLOdIrlBUQR?kB7qdH`mpbR)-Q)kK%vvk zUfPG@SW36!8j+jY#|fa$n>ltnhb@aDn@kp|k}F4$C|!imFWqY?x$A;A zSa@$m9Hq`CS_*YEdf8#pAFH?Zpii5cpu)BORzy(uofd@Yn7}1fmUWQ!k$U0ewI!$_ z69=XsXg7DgjY-wIo#%0XlMH&JCd?#*yWr)k5z-bZNEEd0xf#x^&LAqY6*#tTAB{du z`{O}~%%e!8j_0|C>VBY%>3Tyh{}3epL_4f`WKi{Sa(Tksa8G5;VLu6~K*5P%*(ykZ zl3QD7Sv+;(P#sawV4?J~yb{OB&o{#{kT9hP4dT6?#tAx3frT1>Y<9)es-dw$l`||i zu9yr)mzh+|Lt2buS-43vy7^2uZgKm#Y<<-N0z$)1#3q4o9s)TsI5 zh2*LnQcf~ht{7;-+EPS%f6JCb!qSp7p!Bojqpu!U&Yv~AMN?eMpXLTmD)SFg;?v{` z&ZA8PfCrc8-rPxN!%1wziRnBJeGrn1-}nYXy%-!Aw;Tf(e>e|7b%pWDN1AMXGw zuSX4cH1gWb?F3Th&Uckzv3!i+=hDI>e-eLcoaKGp0RH&zMVjdzwNvwks^G*g+iipS zIeA@!F@QFkoAh%S&|&&(ei!QV;>pup4FpABL)3odoHsMbh@TJPO!Xm6H;RCQMpl(8r1qT5( z5~=*~%U&aL0mG{!umf_rd~fXtL^T|h+K~JZcm(2E|Li9|6hU;cv5_`4t1obVZ`2`8 zwX3db@^f9JKQ1_3s(#Vft@ndwIF zZ{n3U6w-(J8vjHRs%LYkA4Htuiy@p{LO0`Bh2jHEqfXOG^+t#{O{YtPg5zGq?p4A_ zQJ=B)i~!N

LYs7r{$F9t4+g$k=co&oV1w^AV7;%rFQE5ZjbwaW8w^A5V^+6G(4# z3?tHwnO1a5e`e@$9)iK)IS_XB9)t_1zFW7FI%^yGn79#Vx;VPB+CLc%n)y2x@M!?2 z+S=n`GKNMd&^WS?Ls<~ogMOL*k~9F%D^`gi>?|XEi!Du{WBa+f@eL%fCV-VJX>q;L z&TwpChnOOOYAy_d1dvOV_!Tr8UwedXiJ$w7+lfQPfA##ukVa>*SbdNgv#5L+Ab@e z*`_RwpetJZH-MlsnUWI!#*6yjap`0-evdkqh*d!)Wz!8opN(XdLFW3&oBa3s7OWD~ zkf5MOe}nkh&G2&Y&Es~#Sr^uL&}S)rl8IS9bD}`3V6jLN?rw!U&AC;^DD+<~f_ZY1 zqu5Pmw0qFoKRk_(4nIBGIo>_0lyqNXDCPa*0fD?+1lV%tFV z8U8@ML-ZnS-!=Y2FOLndx(w~C1|hgq!eNxge-bPeZRNNWxtuXWQKc#KxPZ2Y$hFT) zjo-ZWkwCNNUtgg4*Z-r<|LM-|7t6Fh;@34k8UvR!L-!fMr~YSk|IzW$;ZnL!1R6E} z`U1`WU)6maF_vllT_AY8bI@9{K9v>GacnL}$5g~Qjjok*Mjf#?HVS?+Jm!0InLNs8 zf9~xPt0|I9x^-(VuHTEUyTWNbdN;4Y$?oU-dtV*wAL~)I?g9nmdCWqpAWp zXHEf;+cx%LTnaKr*o$rQ<0RJwnczIvf4QhZ11eT`^SwZoOIYjwVFju2$7q83SRD5b zYpvE~@M5Q|6?oo_y6tI7ULHNJ?b?t$KHQd#!z5(4=`ls|<_+DcrKN<|bQr;grq=@yab7ih%{} zz3C)KnBNp20iIqFCTw5B3QA%3-@wDZXojY#v)&DF7p3hFK;Mv9R6QP z{9i6{jp-_+XZ9^Bt|Dx{e_K%y3EQU#-=(M|9N`AVV*3vHQgpRD56gN7R8WTN zf|QKVIq4!*-L8bWunXgg$aRpC-2q4>s;7IUP{wBBg$SKnqxrr@f38e_!_Ed&*C9#2 zP(+)f$bxUSL2w5ow;t`vVCm_4bSvqHY%>sw+h;gAfU`Sz;-z+{K|$*F8WbXMLqN}p znEPuLY!`3b$2YvOYX6YaE+O3JdjLWA+>$rH*CNo#@5cQk)e>dM5v_#*uWv0o>V8yRbaZ|u8=yv}j9gpE=&&ykkkXPPK;{g*k zVX3n{^*S1S%9X~JFoJUAHR!->J*DQGP24qR-qCE;#NjRO6dOLam_mFRFbzN$wMDf;A{C#nX{@CaNe^iAUlO1q`rQXM`O}s7C z^~n>_+F_>0WAJ7PjKbZD--{ohqLz9}&^5JUk9k{2ab>tKrD+@hk9)+=k3Yg+3zW+c zQo1i68oKfAgeuCa-UziD3n6btN;q=wByKM?jvl`_DEWY(02-W})!%{Sx|?=KO}q zs-H#rtx3Nv(yw4B#w>S%M*&grQmF}Dt<{LK5EN~Z=3FGSJxUpyocf}e-W5+0#{I#d ztb*;R!hUyctMW7vZ+mIBUsxE!mFyUnHpjw>?2Ssre=JuvCzoUreAl%zB8tz^_3M{y_IKTDoWM{Ezb=iQK6|F7rUY0QWtU#WtTv!!t`FAX>mW|YEwEWrN zabI2zmY0p`1g$)*AD!V!sPyc~Rww%8kNmpsH*=sD4AqU2-zGpg1Bg%iS@I?>QeF_& z!=`@-e@ku^Ke^2&$rX;KgJFgb(@IXJz5pn_c%Thm<-rwsT&BWLY-JbeuOm6~Bh;?@ zqvVnwJRX%F5$3l_>2NWvO-R8I3m&5ZV_?aX_ko)bi0A{f^7f9rCBz;G|3d8*(x(TQ#01<;zc#*Ajk z*tvx76mf18y(QXJ*H&`m|3$1As)qGQ0;71Ku<{`73`77bP|WLgIVh*~Z!p9zdUT1? zf23W|$#Hrqcg~$ocWy?(`I@A2igae_%8-otHQ|_f7ED1QCuc@pKcrceCinI@LEI?* zSud+-s*5yMWYdbs(i^3ua?+`jL1izGqwmride=x4Pqhvjybvc?5c*U>aSBTyny^X> zJ8F%H;yB5!6MRk!f1VAmNrTMeO*Jn?e+i{iXnT21Yl6SoMo4ySP)9dc&yum^{l(sq zHn&d1KEn+E!33Blkec_n2PjZzAC#kowp_zCY2wmA8h7G^QlR{HbXb;Uc@w8i58%N- z<2|(6T}i9eYPDN4ej|`y`^xi%V-aQu=>*@7Pf-jhDWG7SjRw)tJP{d(QP#O`f6J?6 z9Y%qR!P0Oxfs!Kqbc<2#n|Z#Q#I7RM%Xr3ylWa-@gFRE>2{|c-DNP3Wl2;EOe`r;n z>oycVD>$a0KtwnJJ0uPik)q5k!%>le+=@$Q(j%ckI41nF2U%y#$X!}hUV7E6B~Xt! zZ+JY+ABm(FHe1y;Akb}~4eB&xe@i=L@#e-JK3LS)Hl(J<^2|o7%hCq8vi0?F?2urF zco^(##08e?skX@pciL)cMmK~X*o@jbgr-z1zZubsi6;Q@JRLvHM-My$Frb`yjtUew zE|Q5Sdm7pV^tx`)QCl<}1h{N^0prr|fiS~We{~Hq@DWmy zehD;)iIWIQe`$G$&z)YrC(5to?uMa{DFMwEe~%k z^p}={o_9tYD8uilvTk6O#b~!G7`s)8)y%jaieI{9TbHH#@n54}HBMcbVJ7droF{mw zv^FL27vVr>I26O_D2d~kf4$&bb>IM(_BXzURDDg?t zY%3rS)Fs?X06u8n(iz?Wuc;ejddl>ifE$k zhGO8ATG-jDxqM{uf1{0XO?RQCW(ljV9&i4f&5qje4&Jk^ZmZR)e6l0^i+YjTEo0EA zd#DLamI(S$I$@6m+k@_kaO;K;5^MEx%N2@Ge8ecyBaYyr5-qhd^kh|NxG13NY_L%B z#4N8IYqiyC$AxC>B?*pHyDU2HCr=g*Uw*;wE zhL*?EO0#h}&c|jpMN8ZCM7J_@NC7y>3-pixOMhy>-`zz3O-Hx;n>#Hu`Hsj>~mNhw#lUT-ai#K)W3VG#+K~u3kBPi zMT>3cRt(3^P>-}sMtWvJXxFTQ_X34G9FhtGf}Uq#&bflBNg|<1LD5MAgq#zzJ&pb1 z%k3{qN3wD#YqBxJ6o->oaxN=vH`$T3OUZ_PIRn!#f5pyaMn-`0eC;R4lO#LY8BdeR zZ@m!@@3MAss8LwT9mLDLL{TiRme{D)5xnIN!4@A+%7q}PFz2!m)%Yo|BIkM%ehlyN zJm}WC!9#capR?uxD2pwh*;H z*c4ABPRXERCnhBDl+VyI*i>x7R&UxvaA!S0HlOPX^>?B{O3(-#cNGE2PYc3>kGY(I zLR2+tL>1DTqV%_??_Wc-rf5XbfmRXKXHNPq|=7DaCiyfEBskV3r zp>(qIX>yE(+qN~$k6xIMN3`xvhGYs{GjD@~2@ktRo*yi-`09@m+vT@8#z^_%?V)6k zG?c)iMSfks4F@ymZNKz10?d3`JTcK9%?5OtC1EDe2{r(+1@$;O!OHBYk(L=O7UbT~ ze|2K5rO?Q6Le5I^BEHQwH`<%#^~>yL!&`OB3AN0o*~_z<)?Jd(s7@WHEw<2B&w?r) zrZ6*TV!p4;N0|P{xQ}!Jc?5>z#YMx?0VT5)X^nRMQAV+pZcjI3Cht`*Ck=_b(R#u& zr-g$jmlbj?NX2Y2_1PbrgtV>8O$QjLe>xuQ>&h^L+*j18jX}kRM zR{63KV|vbXI0u(V;#G6CuTE=CqM!0MzL+Jm#QP3A_hQ}xi7E&M`QgKuVOnS#H5-=) z@vA&%xxrvsI1Qt=i9Vd02cKM)6F%EHIM~_Sy^PTZS476aA%L~-FB8`37y)o{4;8B|0^!b>XjXdj1n_k(Y#Xz?C) zw72^KmFt52?(^-He)!3kVRO~(BT zNfAOWZt#{9OS{E~ua+|o$Y+!{!!}j?d&=pLV2Dm6!(H*FQDy?WhPzm&&K}@f+5SE0 z&!$OR=%rh_a+3Xu0BdgwHF&mH;ZxL&IW2_h65!rkVg9oLJxAf8W`DROeex z8FYcr((C)+sC%pg%e40d)skGQMKnjB(C3`e9=HsVsR)VZU;D23H75b8<7q&C#)cEv zL2GS};WH-+W8YM?+}TY&JI~~@O}-cThL!SZKA%BhNx!W9^e9b7;FnuFL=EWIP_G?6 zI1HW{9LZFp$K4uW~v3Z~w4%U80=2bqU&@Of8?w`l8vo zy3n_>xk+BgKm}+=TzhnHLOt_GTuvxxlwtY!{f1|Kqx#Ici7g-0O zh)}1epdz8cUTDn2T_bc*rPn5Q=`ssx`|%pJ)4ZASKxRZ~;aZGN^V6JRAGNQ+^NSf> z`lDQ~$;+`gRauU|i$ufj)VrVf4y{JkaV&2OwLDMS0{4J3OV~7Fr&aSOz(I2ZUhd_W zLAJX3q2>l=8%oULe$%(azfq#mkqtfkM^@_ zQkAGnS(*6|;uamr0U{ArNz9`S=_*k=3btH?6@`mR$O{+he}^&r1z>n&|EvJGWOPlU z3yma5HwX<;ne$s*ygXA0Tft*IhxJAZ&Gs50M~y6*Dqf8)o#B80#D(o5W*dbnjsnGV zsaAv=v3=PoSE{q6o_>hg*ycf~2&5PY=tIyOwJZwcV&UWmQ<58^~h5 ze=wcoB~f_%LDA2u^}AqkIbQe*g}!!>zuLtAM-jvb{CXO%+2H%S_J1}TO@{|$%Pm%a z>`q0cH{BKwu!9d{WZ|G9Pjy(EU;lhKO6daVgJS1!e$c5nsVx&3FTf^TIfrOaQ1Y0F+z}LyO^;2$n>nT@Zt|0TNws zF2hL{l8)vfq*s*cO99FY)RXV#fd4^b6IPp`jO#a0yxCI+TOXvCC`?@J0FEix&qzoZ zaI+a3fAs+0}g4NvQ)PLjo~rpv}A12HRxNbsRblE>Bb?kJWisedg2s#*eE^S}VNT7l))ZYtv_f4ZUKO{chYpAf5T`y? zeaS#*gCyAv8SNci2fg4lf-!nXob* zk|bi8Q~k_WQz~c{tkpI>(6FQ2hfXU;YuTn+Z$+(ZHc2xif8~#??zJS2za$Z%MsrEPDv;iZ@q z=;Y1l;?QIrGcD^{BU#Wj{;9;^Rz9q}#IC5cGRNEBY=01AzX(W|{;!XOh|1=-e=G{3 z(T<}W3-w-Y4~EALwgxol>+5!tG^i};C4=8QkUX%DHyhXAY=}^rGl$w-r~rG$G024- zBS=2m!*RV6A4`>#t=mo1y4gkP^PD;Lf0e)|xU=CyER9S< zQlZ@mfkF?)I`9yF{>PW17izOEf5KURU{)vk5q%o#%= zP5>1bAGdVvK$P<6qAvXpGLhjp8w3TsuW%8qmk^-7=`{WsSiQT8dN~|#4ktkUmrNJ| zH9%bxo5DkKcDr>-kOp?J_|!KQWox zdq=qF5*t5wRr0iT$Z68%)rN@p+>Vj3Yy-1Lv9N9jPSrI(WbjyE?MMb(k)+P%V9>zY zv3(!T<_VD{kL90wa-rS~MZ!Ac6LVF@Csw5~K5>HzW4)1LO^g&IB{fW)vr|N(;7?S+ zZ$EnYpo9ATn$y+kNP)_0f1d6T#k~h`^8Z-9wcgK2>45asirOmi7e(_RfJ)}Nf-73Z zvfW@+mNEd$7wG0j1H84&tW7L$)#m_FFY5yVAKb&$D9ZJEUaldRNxiTJs2U7Np!fS} zI!Pi=J^%!U_^8+am7*#m=ko~;$8w$EVDsLODJzR%C%jVS=_RW?f4x+e#H&-BqUiQD zCpMz5LU)Ryd#F4`(d}zb;YFPlA1u_gL6Oy-YtG?+#1q0WU~`P45379gso3}YhCot; zs;v$dMK`O2U1t=DjcawacQ&GzY8171uBfQBc2N8$ryLD+&d6h%beEPAj_^Uc9$Y&c z4Nr&DY_-$Efq{Eqe?y0xF2j*NN(ms6J}mL{CMM!R!Z2Q_yp$hS(Iu@|=Bm1;dWX6< zQ>=!oUOiSV{c<GD4jLt6V`@qZyQ#YPfJYy zqs^U9x3{?3LZ)tRgIH#PXpyyHyoTW%5?Ezt{XSGXp5YDaR;_T0LZXt(lHzvClL@dh z&@G3sR}_)>L{%c{(9oECmeEbOcx!KWj(mIsFlUp*f3Fj4viUa*L=>%lB+5$#NrSLO z7-{J$X6eUt-fVhrmd*kCV>-_Vq5+-P(dwc#nJDe1sBw)ZL1sWFU~S0>SnFPGG;0Ls z)hX(Jbfzr(X#STFH-uykT};Uzro9nBJsTwyug8^%vA|c!vopW!Ei;!U-@hjR(K-Uu+?1Q0R+d^&&o|7mdZe`i~Ni^i2V*=(D! zzHh?L{|A317=`<9NZ<%i^+JITn!Y>)Kc{-hAkQ>qN&ftPidai0NpEn$0hsdeQC<2Q z4Ke1Zd5J1U7-0@u$X~1AE*#NimUqur!c1zISu9(OCz>;ibV^R8p5l^4G#8a0^}#8k zhINusI}3W`8n~4HguoHM(!BZ^_Mc(^GS8sa$ICy@drbA5|NUXXV>&@~9=R4AFOC>& ze_rKA+*0ZA#7hqr`ceXs){=+Gu^0roZA)hTUg%vb5Xv z`gtoTcv~xzq4@yDH6zGAsY|==>*<@b8`ipNck&T$;vVmw%nv`8FYRbqZH-&foLUF` zLi`=$5tZn1uz!xS;VHf?mQK{!-XZpRf0{`k!%`}q0!vQ26Q9+$S=9Yq$IJnaf2XO0 z(_kr7Tk0Y&^~c;&e?-BK$N{pN+`yoq=Y{QZS%Tt+S56kAS7o3BBMk&~lunSoJ5q@9 z@<;gP34X~_?vhdFoPhrGfl4&DKRyArO$K$WDR1D8({omm_^yQr#0W1$!^mJ5e?!No zqU*>%4bBK^gj@WQ=goYiuP))>pCee;f29wRYI+01&kwGBb6G)9@)s)9e>R}1T)|+B zAA(=dn5#l(UXjj!Q)hu63ssg|cWP?jO|%?MiviNz7-B!OD6FuwLRPf=tWhOJ4}=m- z0l#*CJW9?D!=DZNzpl^Dkl`^Le?M5r1VS9qI(;?f|7!EoovqEo?f9YJ;?QJ!k9F&^ zuAT;~b-cP8*DE%VtjhiBW*xAu;ey58T)i9CbzF$9?ugaUNO$EE2de0KUNTq3_WQ|t zhJoC$XCY1fY?7ij5l372#5iBM^FpGey)W%Oa6RF`X(}INxlp3Jc`vr>e-Pn~`>{Qy z)qer4vd(giL!X8Uh?|WM({vDhoF2u|ym`U-aHl2L*xO%OXL#8UHNjl{aY%IrE1HNZ zBDv9I6*Jgu|4&T>jR4*T0CP}PhB;?vOvCV-8Ro%TMQiA4zi!naC@Ns$^Agn8H zMGMM$rIxZ*Nm}&;=1ELxf6Q+;%RA0yp>L?Scp6!M(k8ieCv98xf&Q_sWV@3#0eDkU z@iupwow5N6OU9QA18NosOCgEBBMuO&<-zNDoBR7aU)4{I=GRUR1#<~bj}-6|q+oAq zit@wIM!^XQ$==8~`6-5X5SWnKU6OJd1{tbxQK*SBw6@5q!;vbwe@(O%oR#GqlWz^7 zii>a*83uGSvMdXdd<dnFM4=4@oE)x#bik~vLIYNl?v%GNP9Wy+>H+DfdymG9s z&%vkBJz#5hM9&;FGiCk_J>RLQmOHnLq*6tN0juAVdB15*(=y zA;E|&o}VRIkx!VN8nu(5lC+PHBdVCRA^wQ& zjFkFyZ~q2hq1@3Zq0(}ZV46ZDbWy;>j(IM}|0`?bci+K~e^tH8-UPZiMq$N|=ns#N z6O=G~kt_r9LHlg~gtTL+D4tpP2JD#MmyG#+*ePKOKjdjDISQI({DgJ>loU0Vv2Y;G z`?PqbmS1Yi3I#nD(Y0PhJ*FoR>a!?NX?+&z=RQZAM1s{&TMM+c{n_4E^lsJ<5O=1M zOM(sSeYE!}e~CBz%W{*@FTFcL#Rzdsq#t>rMwe`vIFfuZTarZ{b2swx{Gm12F|MU9 za9{39TKQ%i_7>CNuOP7t+b2xIzanjGPtskVA3iYseeHqm>Z`VsQeJ!a@&ns1O+tkE zOS_`qh&+9n4m_yGy#eB{F2dWQ{m^0ksv?aajI(|!f65P=V7$p9N^s@{RTp1*CyhSj zsWgD354Vx3O7aLeeL!L$I_>?EPEcc5pQb3Yi64K1Bk%GPcDarmSD*l+^E-Mye29+I zkm=J22;vOH2m6*~NeL*N2J?MVsN2U1T|i-cfr6qB!Z`=uXC%q(ZYYtt&Es`c&dWUQ zXyt)Ae@^62c%P9T^?$#YCC`910KANutOk)t4hc!Ji$(~JMIpKP1SklF}XyY=YP z&HYljm$cmRs5ilKSPcJ16^!nT)YQUMRv7X(0nsgb?|cl)xGbn*gF+h8hve4Qil^c- zf37K?^2O#o$}}%FNO5^?MbiY$@@_+_+g+HpX>u%>P2^{`J+jDQI|Z64Brb-eJ)#Q{ z-IQfXOUu>1iX_<$4_I(n;4|)!sY}P^AmNp!oj+ifD{MO`nor5}uj3H? z87g$?AB>dgCj~xK?{9r9HaEUnGIL2U1R&)G^oP;gz7p!0E)fepqx-x}ZPT16e+X!a z@2VhvpyI0gYgyVO;h-qM@;+G$YBH6yuUVGdj&wvNMRyP_JC7aLRSNBJiVGS~DO`a#gMa;vsFZ?c3c$5C?nb!~-Bf@p$4Z)}Ancnu zYo*AO9jYhudWx6f7-6v=gFj> zjESCX-RC-QMU|IH%2QYjT(!?F8j+TNKS^tw>+9%JT~C8*e-_hqp=Lmn^!_?6IRKoD zIQ_}+Na8}|1q~E7Z|4T5ClEbpx0*f9_>*xD>uCvatj~Kln28sX(!VxCua&_M8zW%)Q+ey(MV1&+j)UB4eS$R!S+ehPUf17Y)5wV zFqc4?R8<#9oQUaU42*=>OIPGK0$DtT)V{(r6Zxm6v+l``%$h2KKoUe3m2acUy?KZr z?ErlzC4bNsLM2dMe+Dz-Vxf-S(Jg??3X;9E;IrCRFI;$Jrv#75gAX*|cwm^oQKT7f zlw{?J8uOdKiV;tgq^JBWE~V*Ej+10iZN(79yH}Zhxnx+XL^Jp^sJ~-=w}A3x=ZTf_ z4xhs*k?fKEN?q2Bw5Qz=A-N(-Q`aS{I%*I@!(3{~8kOQ1f85Xx%&j2GChaQ1q1Qe% z6oxbAiOj^V<%vn{WZqx$P{sK+gi9_noG7bEfd;Z;@hP9m2S0m#K4~9aTx|w(@t`y` zEVUxJ(pa#G`$QBA%xDMY-I?|~AVh9}L<$ON#?i%Z0UP9RF(a*tPP$Y8lXw;s6>14> zo1T(DpI--)i@CxON-mrjLlKL7Hdck*MA*p_NGs5hCQ;M+*-I};r zaz!HSnypC1B%T#Er~lVXs;%uVr}MNoJ&C~qC7rar{n1o>(Hj^|{_|i!c>w$zzZ!KM z31A-M7TjNsMrLQLGku;+M8Ryf!8dMEd~W2;Z(2x=e+;!oxNNcYO}C0sODeaVEM7b( zf*OtQRtk8{AM*A2Q-&ZFx0ZmF(+v4GHa<>yTh64sX-@}DHlyaoI8U+E(Hv*X(=($I z&~9~vFUyt~Eoi9-?h~M868}=rf_w-goJ*midE3;hNQ;{Kf;GRpI0c)cu^}szMo5(u zqOva3f0K-(3wBv601KE?c@>RoLECPx<1b(sn&)nGZQEA$SX`cFu8AO;zv2DvnfduI zJj9)|WG{rbv}V#+DN#|z;q2$p;(4z)hPhuB6L-*8YeigmU=ZFgHz5dfLcvEPg;?I% zVlqSfmCEJ$)5&sL0Pr<>U0~>j$P^O;L#&E zn|&U&&vDX$2qx?TFQ4cRMZQ=4WQjYag$rH~lmuXl01KtG2*`xVkGP43FzN0zsY?JKlGln^YO7BEYf-5 zTu#&=A>yxaRq+Va&o4LVM{Q9ZJuItV zMPdIw5|57^>%Zw{cX&Wd;SE!_!B9v&e;{J*b|i>+7c4!y^?4hccdB8pGNPy!!0oLa0%7&W$&_`!9D%AT*V$rVvt0 z@%qhU>bNR(fFJ1Ob`(>br`uIbA5+G)DdUzDQ=F+gQcNEc$+d~(b`(>bs9RP{AJfLQ zY2%g@Q=F;WS4wiHvGs^t|^Ix3Go-1}(nvu&(e4p_jajPUcfe`F-DY*W%n z3Nv?vu4R1O%xBQqS<)XK5BoH-98g~bxU`t zKbRz?Yt&lElj@&Ls$H1QOCeix@%s=;A<;@|1j&35o1qCCi1s5Gn|9WTVCLx@;=+-VLUO-Y&t@{+hjSl=QBN1x@-R+lSt3;O0B zC)y|AW4YfC?;+5Ttw~<+PB@knBD_dv6Qx3kw2t5Xbe$fgVKD&m?YH3|!J_JPIsjhH zW9+o?c#h@7h&TecbVSF;g9O7v;1rGrc`dw)-%p}87ay8y{Ma} z*oLVku2S_y-JIs9B07Q^Fo6$3-{0Tae#FGl5ih$}`Qe^t@pyeug)I2cxK)|b0GhbV^YbAQ_3+}hkf_=z%YfEL@R7kVBk zO$bZEN*NQZE*VH@9CftN*mI_+x+79Vpa(&zTE)^{1GAao8(}U4+hL8r)X$h(jms8C z$1%u(7Cb@Gn{e=q(Wpn9jvg8ZC&M%P@l^ur)hNkI;S!?{e@H#ZTJao|klKP6%^;Hl z;e^mS*j#@No7{&>r|^W=l-fV+jeq4IfIzkR5y+gkb0pp|1M~R=1mo}JwMbHoGUafA zkK+`zD)L4P`5HZwYeAj>2Bk1S&#gleD@AnS%QXhy;(8_lUgQOxI7)sdeQr25svkLY zP7)w98qh5Fe^KgD6cOs@>#s)Vq;=(@J9>jk`o@{b6?R&5mQvsQ6RGghF3U=zc5QY! zB>o(!b}glFf}gZ*&A>Ja%BZV*%`=u}Ma>&nlXS!Nn&@$Z{JP}2D(oQP20@GJP)JFW z!mFhp3Q-aSj1xk>jy}2<)*Yl4dn34xaH!R5E}t&ke`a{q3@@5L^agFNZZ%d;GtPmO67P(MdB|An7g#2*Xu}nD%5t(R&tk+DrnLH! zHK2=he|chOef@B6YwyiyhvX+tA23@)LJ+$960dSu`nc&Ai4wh0WJzOr_fPAkw8eb-}n|n zZ_3~ts0hktDQw$M=$WHk0R^AG;#(9mfH;MIe;o~{{3vo9$2zp6=@}^|&Yxafp)06Q zHBO-c>E~Z0^rh4(o)_jAq|Bi0=DrREVDK*Ov(%?mn=%p~PAV|DBhe-F6+$-JL$l9hYRv0vsY zf0|E}`@J}NOIedlP|MKGx&qXp;|U0Z!(0a~ECjDGak}ce(DyiUew*TUH=65rBEEn( zz?dSz-G?jH3hg#>UA47vW1+CzYNgrBZ7!ZTpp0hwiza&m1?aX1Rd`L6eYTW7QK}cZ;2EF2Erpq^TaxX~=a7aC6)5~RD~$)k$AgpIkN1z^J!{qh30kQWMtvqle=ksH zcLsr-0+rS%(JXTLvWy7bP34Jba}VfGt0LZc!EsvX1N_5?|646Ry1kXDjdEV#@{K0Y zP9|Uz6-dbyrs|eK=9L)owI6Y4j@)f=i+&52>qmioA*&(fO!8l4FiH5jBPMrycr_!E z6S5@I4ONtn;JPu3p@@rfxJY_)e*mnmCR!vEQbG~o;znE!ASX*E0hB7aHh8|*pMDVP zD^WL?_fm*@uhJ#m9#gT7cr^@6c5Z-Iu6+0;e|P7PL9$eyYxq6%Ut9M}_%}^WnO^l` zfyq)Oi{rYDTzqdC_Gm_i$E;#_Y_=_vA(#bAK>gwpA=Qhs*Q#DxDy({uf339W1T`-M zYW;cHE%X+WBc#3PYYUjc)Fi{buQiEC^YK%GWb$;;_EFqu`K_w}TMdK0)pyD8E5?eB&4J!ENS7`^?qn zSRYQ(bdDb%B$xroYY(zQd(}-gs}3pR9m1oK^R&5~VU1kdf0s34e^uv;XV$igJf@8b zVTu(yTW@Xh`CLSomwjK`N>^sXW$o^}%BbdYaw{P9GU}}IOvSmPUWVK&wusTTtb2tA z%{zrsH;ZtU-x{#8dZfR4^U8&VZ?#wcf62EX!}I1ZUG?z*LYM-N9ppQ3*dW<_(9mvS z$MW<#F>$#-5H@cEf1yz|@K=8G^JRS^cQb`x5IsKF{q*#4qaUF>LXPrucX0gC5x#<{ zPJ^CXrs@m|v}7*aq1XKewV1Cga9&VF&}`Z*$?G=1K@L7{etL~7+%RK#R4|$e}(CLPCjFo8f3G@HFtYUa>JgJfygyOIAa1|Dye@t}{pID0~JEsaj&xPd)&;EnM z194k1>G%+zOKuAltr_fs?ceo|iBeww%B^oQS1zceFphkg#mTpNRh72WdTU540?$^c-; zplB@$?^KUN{C9H@OxH+{r!^{u! ze;KKlU4SZJ{g>zu_K?}62oWAP0pC9SUUdhb$E7?F%Y710R&B3?G3v33t9#X}T?EdiZ8@ejfyFfMdQ|_CZpTsX zj~7v|)8B+U(<+BcVaGSb!%dSVg zkQHF%B6XZz0I#Sc~Xy`>2^^b1|AwCG0lWqffu8B-I#8T|DcYH6x@C z=IK?*Sy7OuY^yzU*3zNw*9RyPVpc2Cyj0TS%$B^mK)er}8(^=--5}mjTRLEQe`BqZ zf!mECjl@4i#mLU@tP7Nb$VI9M*9oYzD>TDCPUN*RYMU*={`6vn14T+%p&G%FQ&jsj z1sx80P4Dq%M_)Ia^~UM-Bwu2DX|?RJt57@Zp2DUcYnucYu~I{xDa_wNo1SF*Ha&)n zRy@W%9pm?68n)@}m3?HhUg(5Sf2nl#1DHYNb~N-foiMcuj0wxeBHsCuMS$Cm65hi* z`jkWeEgL*{9%uvKN3dCLa7kTh*t7m%3XBYXBkIc7kiEo!%lgK)mfnkD;~G~Eo4{6C zz!=kY7BFY~%BM(-wI(oTh`*BwOsChMUF0l=7bmOdLm`!P%H%rBZo>&P826pMwrY*Z-GPv#V1j^;>g`I zYAHF#7%YqifQy@l1ST(4wT*RajeDl8TZXh?7nnM9PzG#*4Q#<-Et;cR)X?0iL2itS zK#(XcB#!QG{3{n)vn_~rf5ICE>m_Te_1ft9_is!z+f*_Ch4k}u98}La`(SFcb40R@ zd8KMkX=4jf`-vLnTHD1~#lg(h?YTM|o5josqY>jahA<$^Dx-y>)?ftd86veC4A)uN z-)}lLUUe9%+hc*59tKK+QjuGLIL1Qagz4t|rr55xs&V<-Th%<4f4I9Htrf;%Mr*dB z-NuLpgbs0|SZMx88(L+19}@8!n$9*C=FO7)4u-g@xyo`{?L~`CZFUxzw6~D~OnBBa z)Opq}j}Lgr0;W1+4Q-^sZB2H9aT7emD2%wl+N&Kf(;26&!z1KA_9qxGuCDNX#d-E~ zHebfT$R8}`qB5dBfA=&>{KKDPn23 zOUSg98fB}XW`{XNI#?gmOkNYhXksFm?;MGwb+nOIA-ZtCzB)4CJikrwKZa}hL=$~h zp{yXcl)3(Or{f$b9Off#Gvto9i8tP%dgE0$Rav2N0R3H+f8mR+1l84$d-k6u7Pg$rem7E-J(czgTE<5T|F@9asvUWANRl@IIYg4Br2ZBMaXYeTlC?U(~0Y zB1-2YmQDjLYC=cM(hFdSbY_+eDC_XQfuA4^E|}v)oZHFlV2~qhupqXhCal!pis7D%Sr5(PY zaWcy;;Kn?~p42?Kvf<}y%^|3r;xXlAeh59jY{)&yuF?a%lLq%lYEX9p*^Dq1f(%c0 zclU=wf4l>UKR+BCe727}sz>;X-=TzGuT%H2tJ-;0E9|((W(+aFOY|-$J>Us2e6P9< zlxo|br}G3g&^G64m==r)7!V2)FjeJ&Fwi&!7Iq>4Lv`ijINFEHZo+b;$YejJt|m?@ zkODy|a+c1Yrufn<_uAZ2lLkx3vFrOsLbXEiqVgAf=Ao-HFN1P`|h@y>ku3e#yLsKft#Yq5imCWeKd6+vII2cJ+;b;={JMxR+${z|IJ$PXgpvvV)N*q!rxE(|DI`rKQolK{Cus1;f9Fw= z(atkx`-F>hnSm6NW@2oGkpk=LEjsi#0mjSc1;TNYmihsza0Zx7K&>UoGNYxZV4iqA za@7dQF^HdOfnmYt_?T&0R3pKIYLd*N<3(0v{pi!5li4MVH!; z8k>HaEU)tnlHa&HHIHG_y?{7kDF^|_!N_?4qLC>sDd6QO1=P`(2aSDmd76Ucuzw75 z^ks@7if)l-*a4rIjQ3R9CPw2I;*;z7f?wf)%zSo{B{4vaU=u50)S#IeV}6-kJr9@l z3aEg?hl}A7OY$f)k4{qe=*N#~dL0#zdkF}ZRFp+nMiQ&S&ajT)-HDA{;7O8|LgaP6 zg3LlRo0T&!onBg zv4bG1Ef&yw?!fJ&jtIC-#SYeMD|7a;@zvtT%LK&EWeOVD0`~Gmh7VFu6o7~JClFM2 z>V&EcFGAPe-DPCydK)=1G>oaULa4)nUi>3@viECx@pFc&{-;TCo%IRv0)HWD9Rx7U zFOunGae;$_&obO`TxkAVX`@2mex#|JsEKJr*TtuKJ}z}Qm}y{}pO8r`8vLARV>47n zf-+ppXOMC9X*se|9^g6`|j6O)V{AcszX+^<87zp^yIfYH**ty5Z`62bvH36 zbmW(DG}!=*BHyW{+zOm_y;DoM6}Xac1kWaw0EMKh96qa5E3;}HmQtEhFR2#LdVjT~ zZzQNE`94^F%neG1opx2hzfAnds}8_fo=+NP#zCswCgv^6*ybm;fro>J*7alzz!}igVWE~k?Dv_Z$_k} z!;g-@?6sOciiqE?YqcG1v^BV~cn88rDv}zN1+I-=4E$A(gd>(^_37XQSfz`iJmK&Ka2$hsPDfqF!~oc_QCIT)wSu9Ft)~}l^&!A$KdQCxDudh7)hlw|9NXoXbAOSJb@lPz?w~_+(c$SG zgaNt4O31u$&jvK)5$70F!2iKV2YeQ=W*E6}Z zT4Pt^pk*FQ@bsZtdd9YbeY_^1ED>TBWB8+tLLa@i<5!pN7*D%UnH>-0%L36mDqvW) zAJ0fnG)HY=J1u5{#jpv^Yy;)C!rkwCPN}$?K1A4s6g3c!~|sp5j;p&%EK7 z`*t%HhNt3YCZVvqJu`rferPVTwH9qtwi3eXz34R)!3rzeZehQw1)iz*S|$lgjTTLF zd5*xvKy{pb_~s``msju75b}zC_!n`_6~DsyKw=~Gn}6VFK0aGUr(Hbolm^32e_Ka9 zO40$>$_j`49OR!@D4jha87jL?a*DtgiRxtl!ZvhUk4k+v)q{VQdvwxu-z&rh3j~%k zLo9gW-$I)0i(+xsh13^1{Z6OHOGC>y=D>N(c=L>9qMN2yM@t?6NUXGsVv33N*q58iIm8SM;%i< zqiqO**%5_~ zj7&BkXh|;c?KQirOqOxw#DzZPaDYzD$p}P#BY&8Oj?A6YAsSeuRP+tdChPRw`f<|_ zm%BiZgjQug`q>twa`Y#C$!I!T-+dQg@k-egu`=TsorlOYYdB zImwHe%Juz=BvvFz`|%TVs|2djDnQ~C7xxdABtaEKOkesYm#jTh^BK*Ib~XV*^|@)y zGJlYR6hS5*FRQlXvWkoIQt>=G*sI!C4hmc@4yKqR_iM_h1279jC)}ebEmpD;bYT|s z;+oHt^Ia+E(3!jkWok1IU>;R}BPA|*Gq5YCbe&fuw#ceiLHIKZ^jZh}27X++N16^4C2 zs-1H<*Mg^bKA%sKejrrd!X@s5&rbJWbq(!tY4S<;dvlzQ8#+Tx6$zbn;Gx;F0DmWW zdAWD)-Y0>ZDj6Rd(3zn@4c6c$GHe4c{7CaJeg6691>58Oy_Lu|O(DF1htiM@Vu%KG zL(Yq3I%6n-4d@N}0Z+zb=cOif1s;+pp-1oO%#NoaFPs%_cHY|dTR-(nKICuu-t0`| z-*ikT=Iz%_L5;h%Pc$KX>(tl*^vCeX~yxk-UTd;Uj-^qDSJdusEYwW0MM#3US zm*ZNpc(b5aU`~tSlO6shC5j%KB-M;VoYK>g;^88-Q7NxIq{|sb4H8vW!o%jW?{n=H z#<@wbuMQ6v??$fG58*sag!2|?JEtGN^6=xAK0Z2mg-1>tQ6Bz%SrL_fL4U04R*j8& zd_4I4ajna*|I54V5Avgbd5;?g`Hg>4mwkz;9p}I8^$|(DiNYabLZ^jlvig?)j`=T% zi^0GA^E*yA!WRc4N<2B)ybZ-2Fuo6=t%W2o=NdOhAfCQF!DUzng|)x=Dpeba3;zvi zIMvVxdRmSGxFgU!nai~1Qh!`Wk3We$W#9x-(*T=-+UMFRd!r@8L<27)6D}r$<*k)s zIjHXdnn%uhcc!ycd_%7mlX(U;1zb_ROJG5Zr!ae9yQwOc_vAHjRR(y0IHE`H9 z1NB&{K?<-KMhru7+@^BhCP?0PF_)WMP@jE1@^fNmjdCtTXo&Vscz+!7XJ*4(>4J~R zjJ1q{(t^FYrR+FQ3qn_jd@1r{7rQ(fT5qXb?edxn4TnoTYJXMgbtz>rWHK_lcmdvg z^uwGJ_1qvS#6TDyQffqn8O-OPhp_n_yz(#O8K@%pRrisoNes^Cxb?KP^?m+ZTcF># zvk$SY!s$nkXzB8oL@mwbRAdHXit(kZZ?zn1FZe55V0(Xx*C6+Q<|F)Y!I&(Inow1Q zxQVEu2Z0epg@1Q8PN#5DR89U0MZFe3HzY;f;_n~mGF@JeT!(1JA;f92H~#8boK4SjP_3G?kYwKjYd069g&2z+!qscKCyGBxJm^L!$WC8vZ^G~Qv(3V*GKm)y3B2=8SBmE9>Y%&%;Wb-W== z7W4cnAs6<^QUbryd9j%wlLaWynQ*~qve5UWKqmQ}G`E#KBeEn2c;IP|N*vfjO33A6 zO(|brqr|G$PB_PTC_Q{rv-qlIfvIo2@tUT)qHlUvdV`&*Uhb7HzbDuRFWh?l9?C$L zLVwd;Tm0ijQ5y35RwBc3a7ZGNVIaRYx3;cilz8#giBA%X-Ao#t?d{pFkAMunxS)_{ zc;sK*P-rOWh5QouLqhCHIqOMnpXQK3I-evL5*rf~Nx&aqKsU_g(mq=Wc#=8qs07_Y zVtRx`;OJxVe2&T11=OoVfkBG)tE6;}V1Mf0m(uN0=SmxOU58vKZ$PW;P%qXeM#NK$ zTvaM60rj=nPcv}Z?z?M7k^8IKQfXC_p)l9nrDfyob->t}(2Ft->5PqIuz;jVF{g{5 zT#aosnUEXS)}fvnDE**>knTu4w;8^r3_BjWEX63_D? zeMndPq-fQgCv{>i{D=x?{PsOQeXqq?si2vDg~yi(-un4b4oSc}3Cy}W8K`sx@av6$ zIk2pjdIL)ls~Q?6g`t`ks*?Yrz8GISFIyTN-6J^n%L7is=0m{ zYaWL*OVjJ!{CdeYI-av?6q7r|h<^tGq$QSqa-ae@HfHeJ2VZfnI%>dQlOmQ@72k$h zy$a$c)&dq{6zNV?XyoJdn8j6yJ1dZB0g8FZhvJuM0nB)$Sdih80$8>w=D1#OW9W>g zf-=RG`62usA9aW;7(0}lOENZJ`sVVL+Vtmq!rT&FS?c@ChlH3H_a6i&Vt-#xVMTlk z9Nhs*j?4^1z0K4x)YjO$)oF}b6u-z$-)F=OLRnojzxkwQsw%F!=A-)LyIFJL1_WRM z*vqFz{!1Co$BmS((gsD47{*`JcTR&Ein)AOW}5Emwn}AZTQv(ZNy$(3B#mB`2DpS3 zh}B|%rFmg2hTH8-YE3`Ncw%=rS1 zU{nbA8&XPb(s8g`*nji;?bkXs=rr;{$6XI-;DnB2g-(zcI!v-Zk{hT2J3s8aP;k0f zX}?;(~$z(2T%J@Y;UW6s941s$A5f^FL0ZMgm%o#V~X%Hp)6$0!&{G zCwPTNVQ*ifIDa$B>$dC7qFlU$R_M1KHY9T2VsfNi*RT5Cp=uMI!IA%xEN4%FwGxmx zXt1#R7&fy=E)uuZZnsYz_V&$^?HF2H9djfUNuK0|@%6e$W@orsjq=GP9f5H$*8ZR& z>Kr5amB8AfNSB>xvF~eL)DSrQ%ViFhTStaM4#ncQ(tmWTcKAdwP)Rd`w+`uxWJ&cR zd6csfBUBX?Mb#4-0?$TgLbP5l(A98+LR!t8u3#)pV;FkXoD|+uHCO=~p$b!^rhsm= z*=Wk<(|!|DSIM&U$hw5s#V7_32>l`@zy(&zR2GsM7mbv&#nht)^Nkw!W4Rt{&5-t@ zixrsFxPKN}faqaSXZmSK24xX}qyZU%mr7}dN(Db8fD};l?9FmTQGuAN$^KKJ=AN|) zXfRLsaRu=t};(4yZz{dLYxOTgGb4h5` zTQvs)6`lzmQhr-iC%;!acCe0~Vz11{*O~x^T$}+W1??Qy-ob%mOmS(&6jl;r=ewar zo`3TB<0ykmbrRW+-NR&c!gT}h4ot_^_#H>oxpX`|Ie^LVurEfZscz3^7`O; zU-{6OJzB;WUOkg7s454wo6t0$c`>^4Tz`gxVgF`{&H>(J{8h8SEZnf zE+828FWSVnNH!{dR4cV9dS(1)CnDBY|2!&C>s{mMR(XoO^oIL0sKf+VOQ#w!+kXe@ z;?BHe`q}`fn!Q#aTWExQ)z#O6>O^!N9Bz(nU_$g#efzU{;^S1aroxWO5KZ-ScnZH# zi88pHj48%n(3<_Ig$M=nL1VK#ZhpI4lySFq2?UtjA2m0P{M*=L%(z?22!VQRc#tT` zAsNx207EW(Lt<#vP;ZOBuwJuiaz_qiuyDxEL;3GjYC6$KxQgM0DTleA7k?1R*q(%T zJ1@TW8ipb13J~>peig!>V8D^6>j_%U>PgVE=>pZGNqR1>8$y{`iVpoT1`srX*#w=w zwu(4w^fPMFggSdBOt{yK$XGWJ(71N8Z)7{;AlPV(@Nlyp(RQlPn`-k^^_n%Xv0*1FQYK{f8 z#pX`0IW2)e^=Pf9hXkFxN4(|VU?22~LYWbKgH0+nyq)H<=yfo;zkjIDoz+x?*I#=L zQ(Xr>1FHy?^xqs+^Q9OFIR;&ZH=d_sebE3RRo?d;r|{mAiGatuJbic6>=YkJ$B+q3 z2H)$^4jmxtQ6eq?!D{`!PKAXn%E9>XeTZ1NuJ#!oY6wJOPAENEQ?HvBZ&)`gnE&ib6^+t-L8R z&hCPRa9$8U_#a1?4}+M1TvfPskj?mQjve7T7K^_{Tl70RIRh(Pk!|%Q;nT%D!3417 zDC!HtE-P8h^KanlAb+2$N$z=#|H^ zb$R1+i@0>l2K%VYOf9dGhrL3IfWGTVZ5m{38z#q!`RY;Dll?EiD7tqrd^|V-;d~6< z$RA|0`K3hCJ(`l`mC|^TfjE4PnsAB?f^Q`A93Y=9=IoqZxD)maBU9+@n)H{f zKyCf`R`O2*7C)drImpTp31SVHAy2xE89f_#L*C((d8T0@p+0wmgj^gqOsXfY$5g3X zZN2Zov(sjES)M$^$JK(w#wfX9WvQlbXT?5HO+ztz;eQavsaVAr)kS4k)IRG;&QAMBFO-RuGWar5UeLfM|s6TWZD23WP^0{p?2+0|@7{&iIdeFM&8 zf^bpG1Jx|MXE2--?GUCYA$XK4)!eZ)>Q_g5M{=BWw!kMD;g-{z@$2jfU;rYYnFOEF zn(&Z#7=M~(Vw#HA#Dj)9aD!7I3uu3G_>e1cw&f)bR?kR6@1nBnZIBGX#p}rcc8tP+ z%^WG`MZ_gLp($*yJn|#X#!UP>HV})={==z;9I!QO8Z&nJlFPwP8$&zK*hf2f;(+p^;JcRq7_Qhk% zPW3XI17d+>AyL{bL1Bsyj?*^>NeMngN#+fFgF?Aa@%)CDi}@a0P=rftw1hOm5M7P( zz<@Z)TP5q*I8F)DkQ;o$VV|B1KR!L#JNoi4JXBF{W0)s{onm;tu`&s zN}cLD_KdfTDXXJavdt$$#e8vo?(RlO5S3`W;K1sL0V=*Rcp%S67vlcuRVm#duz$mr zTbDb|ZC%uBT8_&In@=ugz5>o;M;G@|=jq{*;TV##b3P&DT{7Pc%P7#ugRt z{HLe|^KmqW9k6`;2h3CyLoFsMU4In;G@R4FbP}EZc?S4hlZMpl7t2{=^D7m6>eHAN zetyFnu6|TAH9AM?sN3ACYWUE_qaTxHe`N=od)AjRqHHeDBN;Q~Cqr03988_RoENq& zmJQW5Jz`w!yWaEGsoB){TKtf02+elHa0?!6faIBvyxA}pv&&^d$5$0Kz<)n9QO@9r zB7Wt3$HNenCfOgr|EdqPnFZOo$8W+ukaq_jwKpQHVF90AgSWc+0ZnoXui^G1FIQh| zgQMS9wYpc}wQf&L6Q+Y6oao(EFcf#)5IfRt%U+nD9Bb?dBe3Coz{+Ma7_jRmMC(Z* z&G-%Itnil~$p}UP8^S7He1+CUuZE(}tVsN%8n?Pw} zn%@u_rmTcm+Qc`4?Z^Dt6vF4=p+7b;j#QfHoFtCStDJ{Ird4-B#(!|)_zl#En$aW5 zXLnXI5;xBXeVJXNTR;hUxsmK7Fw@XPG<`Fr>=M5;ad^2wKj zll@~!G(V1y27BfA>3`vugReXAl1{7ZAuWkb9%gfL+Mp;0}gf>gM7>QtvBIcZm0qx}s*pV|){Y-og|A@PxA4KW z;LF46r3(7vVGnFWq$53`0ykWuAG!M#kXzocxPPGCBJ?^f!Fv2Oz;y+3cAyWcTrw(y9*75&bQ%VDfA;xL)&OBsMo`U{_z z^Tnn)K7EP^@nUJc&b1z;ldB^g#L3t@6n~Hs%5ZqzE+voxi^38|_Mk=7EmEiQfL$t^ zOAs-BJx3nzzn6SS*DS;>S?0;XX z!D+Muf_NOsk@qrRz<6=Ae2MIDnVXSd-sZz@em=^!PKElIPkH4CV8o^>e{xSh&Y$9y zqCQO#uL3eG1bRyfQxn+=;7b@fDnPAr$60Cx5TjPbCc*)JaukhJoIio$SQP%!pn;5@ z&^@7$b+6!Ry{+RF;R6;!85(Utseg$GSezbQTwGA!p$YipcWpvD{JZ45bmXt#dy6)fath12^nP}3NH@21fawRV;jIS&r8x0FaUA17=K;%-90p2 zp*VgkGqv9cxldy;jW}SISYG~P>5O}QD7(TdZ9JpO9(=I>;nDFvPBx~mS$q>*F|Gj* zyWm=(#WB%FD6T2qwf3CD02F2>FABwrW!gAJp+I`D_U{mE@yEzs&Gp=Vsiyz!ZeqdFirj3c_>ZnaJ# zvpzvLS<>}Rio_3H$nu2d(yFxK8b=vCcP9XIyni%0A2n>5TD#2P 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 #w;fs(As! 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 FOaL{ADuDn1 delta 118690 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

3|+7EL>y`hP~v@0zIX8E{>8|KIj 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%0A2n>5TD#2P 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 #w;fs(As! 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 DV{$2s delta 118702 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

3|+7EL>y`hP~v@0zIX8E{>8|KIj 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%0A2n>5TD#2P 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 #w;fs(As! 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 diff --git a/Moose Test Missions/Moose_Test_ZONE_RADIUS/Moose_Test_ZONE_RADIUS.miz b/Moose Test Missions/Moose_Test_ZONE_RADIUS/Moose_Test_ZONE_RADIUS.miz index 0e9de40895582a299706f81b29eb031fd5e0efc7..e498a90235125289694c5c6a1cdd8e19b9d4f2b2 100644 GIT binary patch delta 697 zcmV;q0!IC#w+N%80k9?+e}X;BNG^acbK(I20AmFJ02TlM0BkWZZZAYdMnP3fR4+|$ zZ*yfXY;|F!R84E+Fc3W_kpD2~QY&PY4@wsdIg}(@0-JQ%WDm=>6vdVkgDe$E-b?9! zuOz#P(z+#~7vs^qnfGR-87BUdTx2qWi*C0Ii`(1P45ojV*NgcCf9A`{&p*={tk&1R z*WmmYfT7b4f)-M01~*JFMNKXRtn-3tLyN~4MuXwi;A%L07<|9HtRg#YE)&XOLv7R; z9&X&xTqL|qo&EG2*yI;AJA0UwB5|oB+-U+!mMUQ$ zte7d4aOk+8CfP+Oejc~kmzv%7`^-v#SS6v#a_>prKs({+z&n>)_ zXCS135U>9oq3*%#n6S{+F(|;?TZ+JR*h805?THZ(62hE`AXBmc@7i}x$*rP=Zyn=(E)|jPO>n=m%|wXECMncm(Jt?DVG`=0xAQ< z8~~R`8Uiu{2{8bdd>R5W17m$4cGLIc(~0GIX}0!0H(O8}QX8v;Qj*h>HacVTj6 fXm53MWphwV1qJ{B000dD4FHb=004eY00000D_1bQ delta 118714 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�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 diff --git a/Moose Test Missions/Moose_Test_ZONE_UNIT/Moose_Test_ZONE_UNIT.miz b/Moose Test Missions/Moose_Test_ZONE_UNIT/Moose_Test_ZONE_UNIT.miz index 7c78b1d6c725de0e74714bc9d8e5935c8237216d..5537226f67946f584c91cf87e1379ebebc1bc0d9 100644 GIT binary patch delta 681 zcmV;a0#^N{wg{!80kAn45rRF-NG^acbK(I20AmFJ02Y_v%PyqWiA zq!}julU!snf{Sjq3ya&^)eNS8m)DE=1m?@h&p*={tk&1R*WmmYfT7b4f)-M01~*JF zMNKXRtn-3tLyO0M7)FEP)!=G4d>DMcysRQSZ7vhaVMA@y7#?oi(Oe|FOr8Do9N6R+ zH9LEll_GJeBiv~NK$SonWnC%Tlv}c8#;Y0i0Id)vT9ztd9;}!tm2l{|peETxC?efH zMmW~xCK~p>jc~kmzv%7`^-v#SS6v#a_>prKs({+z&n>)vm1iKNfe^3%9ii^Q?3l37 z)-fo++*^vkbl5|eQSFHl5E8N8sxvHjRmV|1}l!^Qe5H4w& z**sBGWD^(RB}IUJQd_voI0ljP*8;z!dXZ~wJG@tYhU_}@B-u^6op7b3f(T7y$y0x$ zj;5Z7%w|e>A%9w?iM*xIn=(E)|jPO>n=mq!@_ECNLvm*M0ACzqTV0xARB8~~Te83Hl`jW7V0{uu%? z1L`&amopjyLIYYj0GD_g0!0JTN&uI@8UjHiTuT4|cVTj6Xm53MWphwV1qJ{B000dD P4FHV;0006`00000$@DGp delta 118709 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
55Q{%?OIVDD$~Xzz+P-^*vM%ATo>$;% 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

6%O*-Jew(wRkibNE~G~7Z3L6p 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�L*ZPp=Se2WCJ8Pe$TT0Iae^rA`@E|({69NgD&rer#+sPPw+flsWa>7 z7#(SJIc*xDa!2+KZ8n(E2hE?p9#%+arw1qf}+8+p;UA zr&}k8D2B2tt&g6jd7DMt@#Z??tH^p8{Yc`qa%wZ<(^s-|-Ed=QG%vdU&_TNXQRdH# z^pwVybjNM+Tl`^nnZ(Xu>D1Pz2t2mm>m$2$Qd5B^!6bq9FMQ5g7(iuL{1rQ$#Ss8S z&tt7)pY0jnB>$^?B6@34zVoxd3XiTTHTLalItZ_IUFeNX8&_Jc2B5f;=^wU?=eAfk z#|Rg1^;Mvlw!3;XhY zQf&e0^5Ch(9e$nJW-v)y@BT2)EaBFIGA-N$Ps%)P8+>yIli(tDshP~R-_P|36u!>B zfhDfmcS2?v1kcoo+;K2o)Z*nD!lG>`x}Iuvx}sUeVigBfvZ`QU1l_U=ulL(|eFlec zXSu5F6tf?Kon0yCYWIbsS+0nL=lm}4F4D!4*gU(KEvXJm>c+X7I3nmIvm`a2kz~?R z`x=Z`Bndd{)KhBWX}3z0^7C5xZqDN+l;V}0RMP$IaNN7CD-&!dZ>9Vk`VkKe)zgY_ zxgl;`%8(0>*9mE4H6KnIOO!R@2@sk}&2!;U*;)~Y=*Xl7^XjW!&^O*)GW0g{YrS|zv8zI8ueeZd$rEJHxlU*;L z>PegdDc3HoUIPB|ZxPFc8jZ_c9_J4P1HlrdXL!Oawrzn+7r%xMo&PY_%6Mck*;@xO zOf?)^@&!qC6?8kuiZz>q6UYii1mOA>Sn98DvT0QE_1KJTC+9U}V{hDX7SI4w)X9pl!VN<w+muvh@v z*%Yl?=u*pbFm^Vg)_!DBF^cC4HFQ14>y|(cuqtak6@|ET{A#9K@uJWgxTZz{2fVne zsqX|H-0Mu{(5Z18y*1ZtnfSvdy0ddUzA9$lt8}Dty~%!h`d2^eazyH7UO6Q5))=N0 zQRmi<*-UxL>S^V(*J>V7rt29am?a_Y?G}+pyicpmzrr=D2q04$?xS7k%c;{Ks;8u_MP6-dqh86L%9QI z7l&^A^x{_@3}JU>x8QXW9I~%Zo!IOk;qeQWE8(l+<)h~6sAo@{%&n6%Ic)pi32Zdcmu>CLBDtB-&_ns!Vvec8>=U-Pw^8YnwR)5s5229EB6Gak7GG}mfdw! zUkLo^Xx2UyGI!P7ev9mM%ZBFgDJ;IG*abF}=xk{PjJmGu3x6?$sVKM>_->pcN zY%d&|b;3>CsO}My$>z-P`fKo3iy%O=apcs_Kro(4z#~eOmucmtp?H(^tLnZh$I8VV zi+gn=GjZpw74vA1)j}NH1R*ffhzX}EB~9&cP$izl?W@|AC^(nN*uH{@ji}Oi0^!#W)caLz0xqrK=F=HiV-8a88pVOT@h&L_J z{VGmW(L-8fq1Kk$jMu*Gtcd~Bs%tpUWB$lJYe8&xEFTc~rPI;s0}GCc0};sq4f8a3 zu*m$F|38A{Y%yh4$7Gb}SXUR;B?+(k>(Su!S24*1<~C3fhvqpMjp*3lFg<8V3pLiwS}yI|}!?;B`c2{w|DjJ{uD&@^M;{&$7!j-V2L#zxB#B~N@t zCw8p`OukFgP^tjbM_WTC`6~574nr+W&if@5<79ZwhxPPpKE-FQAg*xoqyMruLiXQE zq5tedwoe{qDe#NsW5xPKH_n$5W{nz9cq=LoOBgku&;I;haR~o^Ih^9^_rJr5kBVRW zpJL^lgAad~E^BAsJytrDFv}?`9=HxZAh(^?(ou^4b_X9w9&ff=BhVkuw!Q{kf8Y36 zD_HXG@BTwa-V++3|6b@eW}x3Z92OAQJf|Xa$MUXN3O-!(R(K&UV*K*U>?Z$Ct$||j zW$EvCcej#)TYtkI$I?f3a|QoTa`^9!-;$45f5YGT4%C14ydSw_`uA&OqZS#mx&HNG zH!D-`?&`F#^zY9R*THbq@ujD?cBSCC{YLl=?PId{ed8l-CEdHd)4>}J!w;9qTP^nw ze>S{JH~QxWUkpY(?5nROg!dLlT>d)Sn|d0V78XjmY7qYL$93@QyKCgcPy}U%+2z1! zYc=lO!tLNe;}&8z;*Z1N-P6>%sq~ODkFAH-4(sywe-(~^Vb@vj9)FD-2tMw+J4UL!8gTUa^k}CIh7~ z$8Z>nDA}U{<>UXuLtsQxltUYcbGRQq&9H;sed72}gQl}7R=b66IsCK$uZGgQx_SQl z6XWeZ6?XNL$UyPm)q`~A+!Gt&&tJY%AMW;&Exc!9ZYMtDYTkI?T|KSv!F4VIezJ)8Pvuz4VAKiC`EMRK(eSh~0=89w;$>%s3+t$%+< zJ}MTq9z8y6YdVZ<9oauA&~mkkgJVqhBMU1AP``_SxX19vlZPxx_}71VHlnDA+fSI+ z>B}acth*0at)g77yDC|SM4iDi0fK2}CL(&CNPAqV)H(^Bw`@Teoxyyb!LNtUyE?bi z%&?Bzr-$%DH(l}A7NXxJXR+EtC|5zR6c1JiLdm={4+&o zRf-nhrtR$gZ)>n$!elHqUd4Q?#?(24mcYK~M_|CyKbIea5c(NMve6P{F}9Pz>E z0n8VBH}*x}tFeo}Hyc>{qLs9rj0D@cHTu7y!2zS^ZXAuce|`P!`SFh_6tI#r2SIXY zU$jIguRN%_G`lJgjyBh%kkk?K%SAY3Agfq7KJ6{68zLRL59VX%vTV z^3A;kM%R;XzW)~YYE)hO-kE)zs&GDeqxF8xCvjcxNk=n}Z*Hx2zs7(E)qz_w!M47X z>G7VX3B2XbugY@~qjRIbf9&t6d44+ZnE}4oqI+duMf)jXeo}uk%^>KYa?htTN%%fu za_%MX=kH|M_)iJ|9!s;=hFBl_VZ>e1lhyoR1f9SUNMC64`eia!rQ|KY6>7QA%Wq9a zre!6=hqdx0a{0o1re~)#b|WCS)*#^WiB&K`1lx(hzHrs zd6#ilLfTlI$7p+AwcyZs*Uj>)$_!!JesuXTWP|%-2X;ce+NlU*6m3d<6>XFb79bTm zs|kY1bh0LkTYHcDNg(sr&yH?GuR%Zfti(Gjrb#9GC#B+%dfNVF zqw4V!g%^qF;k@Z}`xhwuxnL~|u?(WG7^)5L!=RbpSMZZO;y7ySG;m0%47Pu)Fxmy- zkqSjo=t?6AKd%~SGV*~=GO3ohr$jz1JrBFe!fN@YEpA`>s&w&(Sj10Lu#-TB z2X~ajs$p*xz0xX!LDH$gSiNAoZD&iNAy52L$`O2Z|FL3pEH!WwdJ)cYr7r;9{ z`X(d!&@3eJLr^ zn3u@&aB@zu>fbxr5jHP_B=1kxC`UDy*+q%T_DWz~%8Y!l*rjCVM0@7n{+|V~;2ly3liJaINeSMEI($ zki=BUinsBdUwOpkBYs#1z>KY8B*jW+t-dz0DRb=Gmi7u5FddOMl-{xxS4kO76+vHC-Cr(^Wy+Gp+;=WT!e3Y{-|;z&w?lCw7wqW|&Q#k(o| z`wO~-jA-dcV}jK$9IHFU*rbY=@v~TzL|g=K8i5gSu!1{8`0 zfLSdqVfj$YT}{8d!1Qb%DEB}iLx_;v>uZUz>VDhqoeJSS{0c3hbi*Sm#Z~-+W)HwH z4&{c&=7Hg#Bb_nLk59tu?_7kv#7rc$w-Jt{adltTGhXFyK26I(Z`^2lyq?x8?B_oT zKh0#OPvku}0wex=3QuQv$DrtA$ESE&5SW!TEHRW!`$Kr_0sFV4YKsG31yBDCxEQn^ z&zv6VC_hJ&_4@p3Q!XmfKR0bB!7)cqu|=}~*ZMCi{bN~AO+mH#7DcJYD#oe5xC*uy z=Gb(NJ@i{-w(@q*%Dcr8Y)nQQhr$ov$?mx>Hv6LXZylfY6e*n1+Od zFAhmx<{Ti%sFxzpE*^i}ch^XKV&4dSOd?b)CTp*^{5@4kJTxuFtfBP#%CE?K@YWCZPSH~v;8*|T_?NN!YkZuUCpeg1*3*=Ye_Ko3lzY%Sg608L zSP9G7wU&d*Uv)cLQ2JpBYEd++%{N4uVaB}7v#daabD5OsTA}l4QuMNjMWG!r8?UE* zZ3JA|r?1P@>6mcwTSe2{fxfOh`%LV_ND4jUDQ3d%Z-vBRL5m1*)!}t;8La4np8lY^ zFFpSDVo|=)62h3Lzz|);WD3IkVjjrHEkmtq6g63u z(H0JK>=ef=`Nw11Yh?re!} z@PWP=UZOG%d`c{R$8lke=#%U?$VwE9qMKj;OS!yb26F2A1c26M0ZnYR&V)lxDWU*b z7SXIqm_%#3W7C^TNS?k!OvW=b#_ODt;530aoghq(T_E~8G)6FZR-Ta(l=!zlSxYg> zHN2NhEsEijp|x)GS`4-YTJMjzr38~;u2CK_xxjswjpu^QeNLsU zJns+oCOi{dVv=M72@iudXi1QMm85zV+^PEs>pL$?QZsH(Mj>6Gf>ISv5bf_7ENv7m zEz;Aiz(JK)d<2$e+ylV474BS*b56zbt>sFMWRz~D|HbPSVeW(?ix+T?Ft2Kam>Esc zi*p^}xIm&W$(3_46A04&uxE=9BQiysNucBOVJeVIS9nmpKPSj1Blr}q!z3yq!UK4E z*`x?Vjjj;bbE2XtBzh9TA6?JpY^Gwqkd^fAQ@!G9qi}ZTw#7_ikdw?6!wcWG%^3;+ zOq%1guuVbmIsA_zG#xC<%{Ls)W~h;rEq{-WACW|ssXL__$&cLS$VwsmV2d{0N0gT@ zE-*cPjs$FM+Ch=-+=6uTlh{_*=|^6Ug4L4tH!W!QYM5ioi0M5$*JG~MNI|O7FIgMm zG25HE!2UXx-Efq#6IdVL#bP4yDw7Umcl;L(IqN}h_|G{7;|AhG zI(j+O#3`rTx$*_M@(qr_sL1Y4Co}UXUNAA<7Bo)O^x{sZ!Lm%A{n-Euj`!w;jE-6+ zTxlutbIT1YbkD=wfaaWDhK10CfjfFlL5y?%YeT0wu;`hBXyk5}5ad-K%(-vUh#AmN zh~5~7&N2UTe=bLu6n`gpFRXmdRszgw=kh+V;GFj_O?Iy112!LOrb&>0A)-#zyVJZ- zhlMtZvdyg%(u~jjN-0L)I86^pI<)ti!8_a|uXX=gHZQ0x*V^vhQXS3@-eKucr7k2*__{?43l zHFtR*=Vy|ngdtN05UudsyomOD&iagp8!u{K431#remhW<2^reu6m@JF1{Y(N{ArJt zY|<&0LAQxt2vWho)6WgACCIGo=R_#yjUrq{A(vRNj#iPHMl6RoBWqIPtSD^ov%p@|`ZsUi5VdDOYXei>FCxn96S+QaF{~>9|44f?@*pUN;-{cKwQm13!7< z(suEV+1j@O)eh}3Q;F0mdZ?i5Bqb)JSief)q1obMIiH6dlav7 zpjx_yg#H4_KPz^5+njk@9UJjkJ)*V4>EyfFLFS%&dlMg&Jl(Wnid!%9&N6qh4eQac zFQ}&TchuU#%Mvom-ivk=Hj8C|`@{~W-Kr=or*bVOB{ob;s^0BJ4-H0w`EBgEZH`jQ z#y=KcaM|4czxLa}3FS9uGm}#^gc$KSa_4 zb@hpjrK|BH4hd9VS$xb#*Ahh<#GD%(Rr|%^F6&mZ1}G_J(NxXi7>4++t2adWCDcE4 z2XZ8*E||W4{lZ|k^)-B>^Z|8qvwv~-aCX}Gu5#s30+I!gi}%*F_-)eIMf?bOIC^s4 zqprNSO62ug1X~~Pj@UxC`LEuFxE3FcMG|Or6P2c}p5osj&L4b4|A_Ss_V+SwrYmmP zr=A@!VLga>TG`Md*N1qx5B^Rx4DDeGwLC-g((UfQ2rLz>yC7fh?oCbn`tQFVW?LdyT@~- z7G07d6A|G(gDm%LW2aX?oc%&&2M%E~fE$xmCWU{}C3=chj*564W=9dDU5$W$?m?ls z@1UC#+X(VMQ*)uk0bQa$6w+H5N7XpNf3hA6*X7n3Ve~u{)10kpk?CpSs(*XaZ7%h* zUa7NlQfN$*}mUTC| zn#kz>9C4kW?nYA{7uaxfEKE0dA#r$xYc#;v7cRfHQW-AaeRf^9f*yS0-jDuZHwn8` zzun(c7hp%V_CSgM_@5 zT}4fIqUUIN26rhFhj(W;F21Ex_1=RXQkersJNpaY*Qfvvg-gwCe}f~d4@!dvDpTWc zPtMM#8XF6CWlP7h<{X?pOlADz3_Gvq^OZ7~$xk2zbQY59hSM1IRUUtx*gKHH{N|@I zR+&uhG-FtbqsNH@Q6`Z|?|I$04xoq8(lo<)dh z3t#R1&HCmki2VM0|6I34W}x>m|6T3$JA9|Z@M+T{#a5x4%e@VDq)I_E(l1Or;vG>) zZ|SD~5Y-OJx3<@HK$lMm;EEB0XNA=M(AjHYG~=4X%2Y$aGsy_;Ug zXGlE4MqWuKiugAAr`!_5}QoaH64WtkKg78PKYG>%_L zN1`V^s;5Ube}^>mX}sXWe!2qFB`XjN6yy^4O^gHTbLzmph>;-et!@%TuJn1{_}IaR zcC6fMKFJ*pAAIEBpw7m_+%#Dx1#Jz*(LL*EC68h&pUxHo8h~GQ*O{40AZE*wxI2f& z%E4y5E;&ie+=o%k6G*0}RtPOcp|n##Mcb_pln3|M50@z%pgWS}%X=(?3_&{nO4=@A za+W&rqPu#S*rYP9Ntp@lM^dlZsWKQ$FxQJx+vwk739AnAbPXO3>&E^qAccUml?AN^ z|HZy{D$mBgrA0lLJ`}bwIrXik-vWz?W%a|RydMH*|Ao_jAV^`a$I^o4U@nad4WS`X5`t1m~FU3PhI<; zlsO$@@+9b5N55X8y8{g%TL0t3>TNx7f%r(}JPD0yy&Bcq zER5$Dvl-^GbV9X=urMfgidnzv{7`vO@Qq3^m^(#P*M8K6_Y9MY?conzlF~7->GK$` zQ;tMVAh|_Ot)VXv&q~;nKUOa&Mc^InE@tB>K#(MG%{W)>OqVt+eN@6$f%AD>Ut3Ot zH3^@wVnQCa;%lB5D%(7B1VsTv?iO}Z2(F=ppVV+`26KOmg<;qi6{h>aiBxYkt4r0S@6};n;Kj>^_fwN1&Vb>#)g&?Wd4c2>+ zUHW^VGC|5F=CKqAA$gAmLosVzq)yv6;!;-5Mer%qZ>W6G) z@^~Z=zg5^=AJMp*yo-mf-)}*s%4-OHv+R4iljn1_Y(2{uV&+7-KMb%o*ss^5|Kh7f zYW#w}`J&?(gV`Fx43@xw2gwVK9dmoDzQqeJ?qWkqQi$0TMQvFe9?a5d3ki{yp+XYZ zHHlLNZZxdK@MWKF&(*_FjlwkaPT_*FtB))hp2kb)OOmygq_vBC9~})66J+?sx9_&0BS)o9ES;iG)PsX$ zj)kw!uu{LlW1Unf(|&%jQ+_70erAmM6wFfE7x1#(B*C)(fFmMl_)+xOyuQgyvq=3lzW)?8VgB^@I_t^6pG(-%-e(*J`_&hH5F9*$0pr2G-VtqYgXclTS|Sj!CR9pw82fM zT7lEsi;D71*{TfR|F zRp{Lgtf8EHgniX=&7=QYLX_m2U}fof(mM01Y&xsWgfp&9F=@|yVl^|F%IWqOIq0sF ziq4XxA!qpB@+=|R%&K&qxxiQNv8+vn6a^U3LhkT8K&8KdPD9F5A?bz}au_b#5I!Isld2*FN_^hHBb49>a?|0(k=rRj1Vk}y)v5%WDdHHKojsNyk z)Jny2h!v)pcxF{#bv72=Q@$$V5IN^Pz{&rh(zlL6vXjy2+ZEnWJP{%cWbyRh5MJj{ z^wUil9@bQ+vV%OrD4XoZ`Th3zm4ly(BQ#q>coAG@zxX8_IHX`1vu23krabHQ&?m8) z@QX*i;0jV1=GiBpa8FccE$Nw7*)<#~!h3F(H1`#hJXXzv#Hb4n%vrj{+3u{Te~!1H zLR5PHCZV#-pV~7&Fq;#8n@`I8LVdJ+Pkw|CRmYBb9b;5jM&3|1^C>sbM%o=ODHJyy zqYF_W>-9jP>jQ|Wpi;zY>5hJnCm-K_&Fj0C1%6TSN9LUXaoQp}`lNw7Q^UQyxp@=mrts zc5Mu01HCtahWa*ArV(oF*G*5oHg0R1_7+0^VOkAxU#2ji@qzpXz+c z$AuvqzM)C-_*w;wh^jB9;UkG(^_-;siwS__W{Se9zVagbz4>`*Qm+*@h zg1g1sqC-leHAo$xZ@Bnk5T)|si5{|=1KDn`tXS^zqbU%tXpQ{4^17>p4>W_+uK;P_jl6&r76Bpf$o31eBX<{i0ww&%_MVVNoHbC14$0b-Cv( z(boj|yH{F6zy=kizz$Y1z4VgrX3AwW6xp@RzY^g|AwLNgU+>p^OW)$rWTB!cj|xeF z&FCC4mB^S`Mb8z2YEP-wXDSdFX6D9j&UivV4W!12xjQa?%3`j{F&b=yjlAQt$WICb zS};guu0NpebI`Lu-Qf)ukzRS)UI7U4yBGOi_t>nT_KQyZ2m0uo5lrvDUa3O2(J5`^ zkTV{k>GwXc5)pKw@ecny@D7XlBU4s*CZxnMG9B z2u?GoqMTV)sw zOgJMkcMD#eE|`%L-(dr;F$f6MzFoPG@O-S$1W-17$24#ywnk$;_tYd+)xo75uF6+=S-29m`YaH5r<}dWS=_lqAhb#Ac{G}Y?Wt>+;*!T@*{m6H` z(VBQZ+~s~H4;rN^)wKH1l_o!$!Zli@K$9AHjlSXxV6HR7u zSQJMbjpLr@6zFflAJ72)1Pjjb=|3B|Kr^MIWF+4?Jp0|5_!uiWJP!$X7B_-CLltyz zi8Ek7{SNbp))T<~X2kQPMPHcbI@o>w61P@X;jZ?!kcX0@HJ3%~5L88HxN+%?+j`!v z8;Dz@2?kFBlcaG}(WN9(YaCWsR>(m?@+oYG=+O(#BVlI2-f#;uLrhVOd`E={s~0Je z^{gE|bOClI_D8Y|aYUH*fMrs>jmW)ov11IkSTVv`(im(WB?raf5N#T6a&`Yn52G?X z0W8}|y#4`W5?%_DqGVu?KN)RvmZz~$6%LQUB=aBB*BvjdGfPuysqszG_4^5z-M3Gr zsrRaw%OF=qyC$?gvr%~sL#t0HzAz}slcO(~CqIEX#Q=|;ncQc->{vkDg*hn3fUKC4 zS?RsRYks-r9N<{#yzsD$ZC}n@VCWfyY>@)8R+E{B1=Aq|`qFd9fGgPYHvnW&+?z$; zaZ6`DXhyEAb9MX8mR7r+0&UFsF#jm;0Z*R| z9c(XKO=J-411WcaQXei1>va&>f!_-n%@6yQ`a&bGAiW)*N`8;dljxTe&%CHJYjF7b zN$z$sbKN4B_d|*C#MZ5|W(>}WxFB!nKsyN0Aswsv*+4u$XCr?+%+-ikklMTbg{r-j zm~cw}`*MrbJ~!ABgWL}%d+Dc<)G(`Z7Vutjfj#YP#14dwqCb0#n-|uJci0KXNp`hI z6J_Lm+1sHKr3cbiTWP;&C`VCT`WSniY(pQE-IF95;(i-Zyp4ScUo(*&_bpe_v;=EO zwC3ujwb@3cwfaVpe`yu7oE)*-XUT+x>6PuVYVWi1b*>}$0&C$2^a>TVS0l6EHFWo? zLp8Q>c%Po(Xl7REU_cxJFUoen!zsS zhs&!NC?oUp2>mDnKX1AveC_ZxK4gQYlmR{;i@(KQlk&t1d!FwY=%=a~V*{5F`aI~I z^nqN0cd=b*MN`}|Y0h%rL$wpV)#`oiFzh&f(-M~RGo^h5gD#r0?oSlnL}9OlhiwQR zO5TiyKZ>gdD^JTG>=mJ1iDWmHo(_atm;)WG3ja*bleR)L{Bz|PH^AEyEZ*T9=^hlf z>q2qWz)m&Vb+orI0-*zT#QU@Ae zw8aOKZsY2?*Y!+^ag?h0EeOc~;)O6<7TosNVo-#5Q}c5lRm$StYcs`Y$2$7;}>hB!=-b|HY zO#(6Uy%AMfcQ-fuW_(R2;n=lX~!!UbYFn{woQqGRGmrS0IUI z2@E24c0Gx3+utptZLarvCB}Aw5zI>Rr5%#_3l?I>VM&ErY6M?@Hac;1$(i6~uNw<0 z2N~1haO7n?H8RelYakL;Q|U@EjCyZao?SM1gb>a3uMJtHngh^29|!k>d{H{!H_Vf~ z`Vh4;h#oNMANgeBMfSAE7vPBp0;8_rbB;C%>A-n)Wxy?tv=o$9^kvMn*z94SS^Qc> z!pL?C!HjQuxHjLSM5!v^Ln+`{kNCOVi<-T;!_?}^E6f2CCTN1;C6mglQiWZA)a5M6 zX2?E&>Zlt~9ofPf<@^+M&}6?arkF#kr0+kVeY~qcgS0+Y{ZrTZq z8>{%Inw3`n4PH-cLw==E2Bs_uxt7nU8vRGtN3MbXa`|GO;`XlYl5IB+G5^JUy*_Pd z$n)z$5QM7-qq)GQ!JIovu)nrWf)XHTj(^_RHy(!1jWsAj@kFwk^-N$?o!+WbGI4rY zeFF$36u*5s3%=D7YUb%T1uk&V&PY@i^!|;M~+hm`lQ4qlYljL79XrP zW2|NDoO7C3yN8Y!#I-NotHqL0{0Z%9Km;Bg^K#ileBL-^LR#H$9FVnkA@b%xS{m?c zxU5qUuBs1a^cp+mjbS61l0Sr%Br@g3^d(soOt{r!4&bCNYhX-?XtU&p!qr&Z*uVml z$q6^*3~!m%u=`o{5-HQWrgal2+wvzgRgpmo`WXdebMkI&t*fC9*2GBmF<8y}S~M(4 z^EgC{z4j}zHBVf>7=VLSQm=tjv)%SV!KYY`zKx^xbQ z@IDy=D5>P{G2>xe`&nH6NOCD+UeqKyZWt+rD1>X|99_1(a5srhAn-?4k2gHAAFK|E674NB_W^h?aU-7rGe)&njkTNxy21xgUvte){xk{*#UaAQA?vz{h zHl$ElfAE3uiB29Yf4egfw^aP>6H2T|UYM199xPTF9Dh6He+Qq1_ z_*$6rrIkevqz2Ahee>f}TQAniHQ}O6P%x6L@e|?h@h|Qxgvry2mb1C3+LWWvunDNF ziF5x@8_UJA9)msN&S{2l1oOXtt01tHOH2WzGe0$_;!iU}`|_CCQ|3aF_{L%y&sE+g zoX0x`$k9fBNA(A}p?UXW1ieq$;K!7+iW)P^IpCMz;>L$&f6WHgr(wUfqxMoiygJ#9 z!QK@g`6(6j@D1cOl#D>}tCl;mDbq)hscqthF~ZnCBnfA#0Lj9t;TVl!qwO@m0`ZA4dJUoB?TLGfCK<96%l-V77Tulz}^oV4P-gz z@i~=85*{Dwu|z6F9-)h2hV)BDVjBkClaKZ`E$hOq2-sr4PtpWUzHDREj_)jw|9A^e zkHNTY1l5rv2iMEJixg!hRU83`?imhw#a&7*+N>55l;n73p~ZkK%3%E&74An%;BDbU zc=PFmiIJK(9e3-F9*gOL~ z`=tjlY2Cvj>C-FBBb1NrKgF$9FEdm`seh~7iUBgIO@$G2*92UV4<=(l4n|ZB9Dgdj zPeZWPgyIqTqx~i*xc_Yo(lj)gIn?sYFr}5ktk_T6;Sa!92ldE}d)yM9QHku*8{aav zr`~^XJ%?8gfKy_2O2)4Qn0IernOx3vO zPk5A9ee@r?Dg?Ik_S0r2#Wo#kFNHkq$guISrC7Z)8$Sevm4Ua1%=`6K&c7;m8#|R5 z;^)9WBvE~q*nO`?w)E#il%<<@)C*6jXy8DFATm{u9S6yTE_XA6hZ3Es{i3mpVj8XJ z8fB+OaI$;XDgaXnXncQ6sRPs-`vctOVe2pw9#S;|krBqAt2*HBGMi}du$bp45g0e= zR}OGNlFKE#bn%FPSkgSkKM2T8y<6Mk8v50@M@*9&;LBLOjTz_ypm>eb(v+>@iR&LA z^zM_ylN2iabeI|c*~Aj*W%zSMb-~SrHOICDnofnwfb5V7K2-{Lvj=~=9x?(Q1({L% z4JxP{SC-JIcvM1a^*#EqX_DYlFp-=fVOk*A#EeHOZT3|5x&UxsYaOG8x07HJ0z^A~ zbr1suTU=3PQkseyw%p5|e0H;D4ia2~+ZSj^A^CH^2I93H%=wfyAV7vzPI5c{J$6wg zGoxX5;^7^mt@4-<8IhDhxgwohL;#MQqhmo=Nb2&f1)MWs_fi>;gZF^3_IF8ih!QEe z8pGAlPO<*3`cl8eEBcrR%0% zj#S%2NZZ!~MM1oVi8rH%I6M=e@LbD?`fQHv+mAQbXx>_GJL?+q+i{6AG$pvxozkcK0~YQ7T~13F~TXidpFf2sty4kcsM=?dmro`2!Al8DB#L zT-nCUcbp69>nn3CR)z|vEjpu~fDzPpoQX#nvP3A&L{gmOIIe7pu6pW9v*5{*8b?*T z75s?fz*QB}JG6ZPiu?ffw(^qstAvI%C*zT%QXfZVBXmr!sm_esoLbJ(jh4(Wv}H3& zlg>mSM3WPzndX69ss;!yY6UAt>U0MqfwSTHR779D^myMj(IsiPyp*Dco_(UFe-rE# zWX^?*jc`xiIgZ5Q8>;2&09qzyDxFF3IFuPwU{bxx|5H+x2sCw^ch5wr2uZ|RHEV~Y z)_x(@Syb9>%I${Kekh>PrLD%{i83+~^5qqh&UNG%BNb2sIO^}QDm&>#eQ!5)c3Hj> zhj$#$nSYD!yyz=0r=8O{Dh^Lpn-L!m5f$P5ksWTOf3kcdR~wKZCV5t zX^8yfR)5u04ebES_%3ww$W@nK289Jam2vT|>5ObLeBw~9BxO!KrY+&W6v2KW)O_f~ zlK*KEE|cc`@+D22!MYhRnW!#DF;Ort`+_A}W)_gP0?c8&Nm@3i0jw&05@vXW5mpZN z1LnJ_<%aLIYkLxdgo%0tns?Zn@s8r5p5p4|a@GJoK?ZA>qXyGUeqBI0HEDJtP&8A= z1>NY#jEz}vrBIC%i#}82^7CYqR=O8+(xI_lQUY_7v@M0`8#^6S&`ib5-#Z|Ku+W?0 zBv{h|%c(##R)t@X@872vk5Tf+02xv(CWGzBLq~UeS)pAc7;M2>Et;B@EB&<%wa~mx zd-4xW10TYL7M`}uH3Y4k=!+;)jc4Ax6d(}Ewlii44LxfPRFm+?YXx&4ACrUHL|HV8 zo(Ax0JX?X3;U%WjS>kUN(@~zL0b9t*CWU2@x%$2xML!oPt&9_ryWgd{%j?zVd^HZ& z!6W4lB}!|~mj&}^$cgcS%$PBFeJ**0oK~ITw_%1F$$3dp$2dYxISaZ>cmR&N#FfBo zaMdU0w3aFh;IOQUbaJ)R6W1y8;}?eN4OTTGyMW1uc&fkPJ`2DhQZJ}(uIkK)p0};m zqbC{zkga06L}ui<#Xrk9%AR8}x0mkBtnT5pqSP*8SD!4UV6+ADzNG%Eg^F)p%@xyL5EX3MRjsPSxQdt1N=&qkkLgr{qX06?W=VmiqGnA zUATS1vuV&BJFJBZAuJA7GsoedM?fo3sh5h&y7so#dN zh%Rb{7%*oQkg3V_N?V$mifGy#Y2yPo=Y#zyX8Ezwy2(4RjytR31Qy1B3MNHKw{_P! za*?wVdO{Mix^{{KkCQxV@7|kGF?X48Uz}jCiA}3wj`7OahfV53A(iIv6eZ_&B z8t0;}tdxy8+HU0~@GO0>))C(FzsUN^s5pYAT_Cs<+>;Po7AFKJ!QI{6-DQKjy9al7 zSzLmCb+O;>eQ%`^4bAI3ZC@-)N_pmI9;{js64kx~17 zd)Wf(rh&^wT*|((NzbPE-EFJA0(nfVEVaF&SK^n#zxdj2!}{(}iXJbUBia=1`!DIK z5j;z^+|X3MZeyVov@pJUrREH9oc(?lez-i`&D}BMd%ZlK>mRmHvp;+cVcN=j!@f-a z05LY+zLkEoy62BsxfH(}eDxdx(^Ks^<45B7>NBd)ll)(?tnSk_Q8puc6J zQwtv;UjDE(5_U~2D5-$buW60XWc~(X{u;W<;_>wBN{3t@36N$ywo@9V00X~5g>CMW z>)zZryn3jB&*&a{9vb>DftMLs#N{O7+tUo{A)QM--3+5L);R3YC>f5hcg9G`!pUPd zxHH_y>E2m+Zr*novbD5~Zrl-n^rXY3L!yhL6ZQXMvAJd0D`H6#n-=ecplt~y8=}`W zFkOC4{+dcPDTQ#(FrI-gyXR12kxPXo6nqj_PbQoNWBa{4PT@PV;wAL%*{_JT^FE~@ z0-mVJ=GyQTPVxxi}lnPGqO9`o8XGTjly*l$m;T7#tpRB#<$n}j1gKE zhq4c~_m^1@nc|^E>G+c?f**I&o9oWd7deECOwRVZl!l1`iK;U;Ib)v2vmx5KHSH8LsB^uY$vXKe#`tNi_!?*N%f=GwBq=amu!a_P)DIhNQLHY7X>bfX(RC zJK{@Vlol;|yzrt5x@*!>3;nJ>Il)NV@4~o|ui!s&HZ;KYYi$13bgC!L4a#sNmj20G zFRA;}*@#8X(6nsq&xS_pU8vm(&yN67w&~PR^o@pxXu+wEWrJ)Ou~vo~4OPtW>u(7} z7{e@d&cQgnU>^u*J!GJlHB_epu)esx@2Hp7iYz`BO*k0)}R+bH&>-V+6NmK zRcFW&eGV*07Sven&Sw}RG06?`aY`+u-4tyL4kvmb3I94pAio|6GhTk$qkWm~#X76$ zUzK{74E12vJsn^w+FPtXx@B9j>Enl5+r7zP8jraHqH0++T1or2gE06?J6T!3^R3On zT*O|T9~Z8(6z68M3`aPh7+3UI5ZVU;qsntq`rVj=Ogept86~Q7fsf>Q!rP$G#?MYA z^{;pXL3h8Q0$X2wUjF8Nez&-&Jq+VFHbHtuY`~vP-LO!zC>;HCTisr7>_TMN>y;UJ z7*`miqOp`@LRVvz@1-UR^7~TEx*G7NYYJ7|`t%wa$Z1gdaPXuOrmfNxi2JOC?B6Ts zK1&Pttr_6T!t-`&5f>xLk0P%d?gcRx|B-rvA-186*{Llgiqu-jCU!2M@U^1FKgJnQ z9o5i(b{j|g$(k*Qvur8zMLrQ9Lq(;2?Jq?D+1AzfI$U@Lt=zPBo+C$9*lxvgAHTCY z$wvmO%?I3cl4-gqIjqLOKFQW6&x*e-4HaMIjpsLw4k>|N2&8FrIas5QmpuUySN??K zrmQN^olTUy{N7ND@n#lZvYAXm@L^HbX}w#}qZd4=y`xyufFxQrDbs(=(l>8F z@r0&UB+z>zlC8DdK^|LEOO`0Z>x~$XGqv#ad_?2?e@bKHy>&M~!R2rLU|6rA)3ifG z+^A%RZRA5*n3i<_I1vsi$VWVh+arJEEk)=}&ExK1yo`|ONs-V|P#F}*y7Nkq{tgdY zs{M}0PE@-53awiciHI|2_%kKu>f3MRF|8B^Guzo>VxlPXf8_p)FbVo*9z%Kqz2qV` zIM71PA-^J8ikV%y>t)5h(iG5r0D2k;M>ixzP`q|6d|>>>5C{MKwq2&eMKnjU##}|&~r1f*O+Ax3CoVI8w+~#pJ4E>} z6I^yaQc(J_x0?>6eSEQ{B)U%2Zy^OWZ~&GeJ7%QdY=P;)&(g-0KVFjwrz@rB9!HXK zC$L+jdRV|?q&{2qffVO_%54+nZFIfJAKyKmVP<~&r96yV8Xf+FMipQkYnwiLBw$x$ zl?=ynY_Vo{`eswdM8p4Ygh2v!k;mITiP*1zaz%@7Lmiez8{=GyU_8d=S6{5Ke6IXq zvXw6Hl+IW_4;6fnsnb-NJ2`lqD;6m`$>ym|K>Izv*{wPMq`kTNWmaH)eO+63;{&#S zSAFxWw}-JLhyKzEap!4k%h5dZV`u<&fFO=M+3!cI^&!J|dv|&QS;o{ILB6sV6>M(= zSAdqIJ~Ikeo&f&Gc7Zi%{-|?+T~)}#j$E@^{>xK{pTMC)hOT%HnJ1P%r>wBR?$KBY zrXf~Covzkpv33mqxLU2-)BAhMRmzrK^TW^)IeMXsi*MG}{P;`P5dQ3BM-FdfF1dpn zPd22H@w6A%&0~AZ4^ggfysHKhtwl0*pL|e@yuBsweFkM#KG{6%&*pHMJz1Tsbr@bB3;;5s&CNRz6Q>ON z0(Z|_vpGA%w+WQ@^~_pH=VsdNbW=IO&1O&dr&%QEvT)KwV1VD%>A9YUQDGIACygz0P5t)R;R}`7HDjJiVNdu#p~w!TMAw0mY$t>^MZg~=S=d`&e_mt zM8p-xuIS6oS>N3rU)tVmOrqYWw3X*72D&+gWVUD`9lfrA_82GFl9uHZQYp3z-xYFYJD$d5GOI*Hss^ zfABW0_HuL#F*XsHZ}-NX1k&H!bL2R<38WXeKRLcjY&R}GoO<0nP^yt`tO3WmX7&Yi zNiWLpk4Ivdee~&k1CxMvH;+4eFC%^Y;P^%2^SWcNli_fg#m)T>Ab{GNK=tK&aYjT) z`Lq%$L(@S|RzbbD)6dQjzShb1%2jTUmo~BIxAD8T-Thpg+_u;|G^g)|o-mP#4xlYu{rr<$z*E`D1K~5YH=q8Yz zUxEX_+i{!W&|_})H7JhCQb8RMh1}$NqFMZ>;Jw(ogj(dT$(NCaEhMNI(r@?2&qhiJ zjS+6%efzM}z4HW#B^4OcC774GXj8a;r$;-$ODywFR7|j=x4|~jBtfw7Qrb7E_`_k5 z=1X}dE*TRwEWtt}4bWg1mZ>94dtI98qHE4)xwITqk|(4!{BFr);;-E#A)B$=Ab~Cv zj~zsp7_Ui~yJOWRRH&kig``N9G~6hSWlFw7qeKQyO)ORgbdGxvrQb9N{c1$AL|NI8 zgq$GQ@h+m2#LI~$L>$?1WJaz}Vvsdxgdzjq-Mw6%Jb0g2y*ug(+8~d!?|XXW7efg- zvXGm{V#xf{9SDk!u&s;22H&__7=>iPzZ2B%ZM|6brEq>71-~HZ zp~p&%|4LWSZrMMM229wG7@W7K@D)!S9^JV%g!y9t3ebmo98`N#Va${UK5?r^}xB1{JFkiD#o5JaD;s>`tmWd%H{YBVBL1t5C;lrA@6Vl1Ie|p{VH;2F*jA6f!!KTiMOXKjmUqbmkW?8FD!@-!=qxa`e=`S0Fe;mFd2o_*(GgvwMB3(*I=QAL!Rq*Ewv}$R zsUYx-yfB4!1Uzt_tMMP=qZ&}}d%xBn#A4X)W^;S~{A@X?2za~cO+flgUeD_HVj0Jk z?;*UyajfaRnnsP&KS$Ed?ei;QMKU49Ohju-G`J>3J6f3T8OPp1)iy>!me@@&u(q0* zj}I^~z!qYk$D;se0WdhG3J~wX;~4REvr35=rpi*dyReq^2W16|?!uoxi;QmDQdt1O zZW|P6NVI|3Djf8|)v&8jw@!1j)wZvjS#>kMtMv0lmX5)ltlT+D<--GLWmbR))?3f3 zxq0=Zka0!=Lg~iClLZ2`)R*VsWZ5=&fzF%#{s4Je>Q|NO7SCKE7PiUudJ}uIA}A4WE&b}`-Yv)SO{ddB%`_D($QZ2f(?%LI!VK&5x@Styd77n1jrsfu1@6tjWk7mY;rac`V zhIi8zUD7O!&eWLMx#Uz-$-xi2b7HFW;;)DkpAYem+dir_GfWaUD~?`|bx@N{ezc3U z)ePKSS5^+({XdNti>FAs3u>f;Pl{M^aR3Rq>x|JywJ}vKieMiDM~V`~nxHl~51x?q zR^id+sjT6;7e5*<;5NNj-kCjH+BTTv?GCoLzw>R=!g&i2`m{jWN@iv=$}`@|#{zU9 zv_Hu<+^BbeZf0m12?G`K3%1);9=Ui7ZS536r)LZBq9^Iy=2$Y%+n69F&ThZy#*=|Z z%`24d!^eD>{IIW_tgu?-`T^aG*0dc(_kNaJ9E=_C@YT?Iop%6m$|i>aiusMV!B;5a zH;%xqgWd}}-KC%O>a+7cJ~y#2sQ?u6`fI?e$6d`MC2bEuHLuO+qUdu(h_mvbp5!LY z3I5pZ{mo2@PGd~Fv?=Cd7boNHlh#IsZPR2Q9mA+V2EW4<#)h)Z=4liV^uev@l+$VW zwl^&OB=f4AR6-}mNVM>Da}kpdapR`rmIkad;x?Y(SCkQb)@iVG%gnwBX~&PE8&0E_ zHwO^z>2a35TwOn#2qa~0g}0{QOV3na&h{8PzvYQgD$(NhegbIRB2&MyJ_GZ+1oqRW z@z3b65K2;mJ%+2)PH%QHhTn#Ad|T5Z_1=-BL{;fT6?K`VJFFKsx6Z3>Z^w5YmiKgU zvsFS2<>dN{{@FTxe+WmGj5t`6_x4>q%k(wjHG8j`y_$b~<12w$h7r1=1kGDYu2L{A zf3}Iay=!WQt)3>ttre7~%$(KBr$1JS`1GF@#Ha9~z$rhbX7Lb4+Aogo`*%FdS9UUMmzY4}! zmweif1Ghv1>)nV zZv~}yZE&?sNULg(E1dczoY38g2*&@)iJ8rR%RJaS`}iSaULzQ1%4+r7Py{eWpt4?d zOi!2}`E!wV1OTY<6Efs>0>8 zp>o(Abp59Sb)4I5`1h7HCLm=nO3{CM@I6;oUiD7kEirH8xBjnvdl)9{2HLW8Qzz!5x%1_tEGfxR{LUA1rc@a=W8$5krgD`S+Y1A!v3)m6yI zw?T8z^a2e94#_XgcA-c+bi4l8k;}g85EuYjI9H38yJrp83+20mkc)Ke3r}9Vm0M(l zXK{YO$}+a0-K2AYi`P5Q@;ClrCrk~2>`}tGt=a(iZ9RHj$#lp$Yk3*X(T<1qFZ+C^1_`mK7i!4gTR?-E( zbpoWAG}QBroXg+~a@@D~FFW#^BrU$@?H(j_K5Gx07AQ`m!kPQY)pu?PZz2aRdRa_}SEhdxE#x|8g*(1(>ulAdM9oKO^&%MP!h_N1K;L*H zKjyW4#oKTrf5xlKgE7$9 zn)M!?msu%*Xnx1b6`^g`_#bm&S;Cp?kuR^qlMIe;^1(~t|aozovCb5jr zxCN)EMLqC!L#Vt>NHkXW_?tOxRAe;kztI1A@iwtNM8?(wG>MiUk5wqSFvl4Q`*BnFlF|CP3-AAS+PwL4pUV@jSux^Rd>`|GKsW zQ-Ac-_%kCboa9lM73lx!Kv9s3$-O;7llUepmfJ01|F-*3s6g`qiW0U#R8{kBwD73j zR@36cR?9!BOW%sPk`wV(@`V<_oiDe?ju6;Ca=$*+EA<8V7Vu$xtw)j zM^<$~t%rAiU^(pd>Yi2ows&~!=vuTfHhCgr%f_^UUk~K;Hb#2gIXk%8J-_-EdwrGj zp2TmRt9~c9j6VU%deZ9vrb-VkKJl1h=TZH*d99zCGpvGZ=wK#A@&0 zAvppaT|VhSD-}i<<)QY}HRIj}!T^jV&plBA z`3tQ3J|}L4Qt}+NKB$@=JP%c*H*No&8DRRcbLwsHZQsGgdqhr>a|hq|HqoC z+BnN6AYfTwq+3ULT7aK*Y05&-_RLPsVUw=6U*wkpX(Esb0BfGz!3`Q90%YT2m zTE48=5IEy-TvloFf0J)Lgd2*y2*%Hs`-o!u@||1BwTnluebHeo()H-1;o1u=hf#FX zUSF!>nEtu?E%NA$^=|(h>YLc=9?&a(=zaRj)g=~UmgU__*75RG5f=fB0_z`ij1Zzs zjB1%Oce=X+foz1?z9c?mkxBf9$5po( z5zimqizleTUPnx4?=xdLK49rbfNtH~0R8tjqaC#vXQ*`|O+O})(S_yPh4U=s%VBl>yT(CHnu2>+*5$u;>spo86$OYjv0`Id zT8p$z=Nz0|W_HdkJUE9Zz>QYu=}doWOx+tSSwk*~*R~mKYgYZzq30=fv~gB&TbZ_A z!j5;Ecx(cAG=;o2xGj04ya!EO0gl4Y*l$3LEZC%M;mR>WnuTd ze)iWhIY`&LeKlm&;g`{>qLNi$^PZG$X~Vg|ylgOdy#Xfc-NMMKa&KXwtVxx@yN54i z2jc;B(#2FgBvVb6q=oD%HQ=u{N*8cOQ;v!_LKiSnH?jk9e3V*|I0zYMD5@Yty6=5v z#s6>#&o99j0q;9T;4v$sdGSY^+NQAqDMRA>p0A$dB(^IEUE*wO0*}?}>zw^$NrV1A zilEavE?1&X+fnRxOY1j$SDWPswDDyvCzjTatir?xo42)DG9j{^X)===i=>a+b>ahi zlVF$WcV1QFJ-T55%a^(Cz7?L{uN}Q$UFQFY#noTgA@5IItrhtjS1Xn`;^d%%1*wb)rpPx20X0 zwHlY2T=shxTchzi%r8Ad4K$jhBx_7&Xpv~LeOA!q1JI(n+|NL!xOp?qvP2g}%dCS^ z!piVKj`qpNm8nO9rjcJ5(z5(3eDt}loXgVljRQ{kv5|Mie z0qwl^tTSwyd(vo{+KkILIB%hxw-STVx+35CI*5Sg`?r1Ze)`l506QBkXLvD$p^GAl zuWx-5%Xr4LDtL<@Wn$3P?dOMuJl%r@9)6njts7j>fNP>|(nDh{dF@SEwZ870-tD*wpe_O%Ob$U8h_~dg_V}-#44{5`Z&Bg4%X~ zVAcoj0|(<-l~+_M)K_Xh8Y(gK*bpC66$bZa1Qd?yz+wtWzY}2~Xe^lq1I(%ZxQ|Qz z_~Y)A8&SG-BS3zx$62v>=NR2=>SK~|v*|9Snd$T^?reN$PqnG`XR+2)zh;8rr{7~eCs*U{J-@4Cd$MEWXH5xWFblUr(@bpd?TY{p}kgi$Nv0OeHV zd(ruL{D83cX^Df|+tNj#qp$nYRA}CuqPx06=jOoq?V6FyB<;v);6uSEUi)UG9&kNp zfD{BWcsR9hS%p-K{>&eftznbIZ+BOB6swxnX*NOG3NiBVqwFpT*s%pNAG%ByQCy@+ zm_Oe1wC50`MV8gIax$0AAgNHScafr||FlyxrMCU|;!qnAwBt5}FuPT^<7<1JlgY*A z|6!MO>6kPuIZQ+YhTKL`2WE^be(B1hqraH->7k=zczH#2YDl3~PV3WZ*=qDQiwFkO zd7V)E0=fy3p?+y4;8hbv^hu~t4uX9l%*`cDTW6(pjiT~;wTDTX%O$mqbqXNOW%DNo zZi3A0TTgDmWu8M>(&=4#mw?vG5YxUHF74{}ESw=ybl?d_bn~{SP6NIVh>6j+53|1- zp*>(imHcg0!K4rUX7E(#*NG^~{ycs4L`u_=wTy=2 z#i{cTFm;zJ`imH-UN>KFWgM^Xr7?q4K70(EtX{dM2}|Xs)Nuc5XCo0%Jf|M$#M$6} zKlj@B{Kl*^iUyZf`C-Ebo>>>C7(dXZ6@(httBTWksb4t|4vM3O7zI|X})TY7{=3=gm~Nn$Ami`xkqcqf1^`weHerH~k8?ZgtUk`YxIR>Qy4 zsB1VQF*`o+l9u0?_I)F_sXz<&*4*{~G!cXGk_F->IBv;VMaVME>ltB$YM~zgpgi~wZHyJpltl~M z1@u~u1Ap|La?wsy^Wb4dJ$SRNfU8c9s+A&meB~3es&r)QKCQ&-a-xfFdl|o%(Q3N)NT6r{_Z!palT%x|Lwx%`$rit?elMM53oP% zdl#othD9fG!UG5S>Y+Ba-~gL`}9(>P9$Mx}Hj z@8<2BfvyVzmaYk<{nG9gdUbR2wbvDYrtOomSb0v+lB$`S0{!(>(`6tx>lXRL2zX}| zGCVa6OW|1k?-FE;87$cBzVHsi>T{Ue*LC=2BkQErJ=pcOl-}{y9|nq}`S$!HEYmWf z?>JX&Je28hUj1}M!$L4Ar3QDG%F<&kGinsjdbggJLQKZp@Ny@Ov~g*ul$O=Fz0^3M z8kh-cFVA#j4w0&__k@<`selL!Yjb{+#KCWG)3;8g_2PTvQiII ziRQItHB$_%&98jh<%x8iwxj{3qVJ#`hC1G?7)xusIztNHD|MaS_{ZND_K)mK({nqu zwkBvF(+Ns;7$zsVo7mURd@=wd%RV7zoH&iDaT}UDU)m10`71oNAYbL`;P`X5k(gdPqiHg%|W#+OCdw){^_d$9s2rF7I*cm=qvJ7@Om z<6M$B@snFaN8E)|WF4an9(}!CI9_k|_s@O9mCdPs?!aYi(L|+W)_gCTe)CA(9uJsJ zOmOq+n^*_3D@z%HCx{e@C?j-wPrG=|v+hFba_!&5PAtFN<={1OCN$9yPYs`9gY``B z&fzCZR93Z}Ol<ApIwQcV8(W~)+rInZwG?7=~x$J^1>mBy}v)j6X2n5Ecw=)!nw z+BNp+c9eJNmUVJsdHGBEpg>TGj3}Zld&@qDQse6Y^mNEa&SrKdwDrD;+l(djtOkImf&w$cx7n--P% zuUU9BUe)Zl(4QE1(g_X4qhES}rDO+gA5$2>|n zD7F&$twy!Iy?DGrw4fAeSg_xbQy3Z>wo_f?nkqKcEm`x{)zAGK?SX?4Y^S6jPE#G6 zV^-n*0_xppO6N+hRh9IVzsH@Y%gMDMXvdBAH}SjJK}p(2S;Cvm(3_ybq`5Se{FAXV z-z<$vUc7)@64BKuYC~J?sE{oO4FIhQ7bsKLk||2{&JzpN?$!wx*VmSGi9Gl$JURd= zdbe!5-xw2*yxs6llUjbrZ}4$jIy)u1CrWp(*3_Ul(A6>@RyDV0@gC@3S^ZnE$(Iey z!$g&mGvr1tM*HWL*~r;~s<&}Q^T&Ck=N2&s%uT_;QL^}_32RDu*i3*Y7M1t<>F2RL zAA7+|50B-&*^mfPCeBqj-CbuEO1@~fA+K4ibb*{7(Gdwv4474zAAR*U4ZL{V1bHZSx=V;@-Ixz#Wx{-$PD%D{Z{aC0{Il zJ@1mo0`V*Vm?d$VOJgZT)~M(L;l8%U2drn4@yi2!eG2?%ZQ*;jHGwmj~-P;q-kgAY}0Du*e18RH8^_2q@k%N>-OQnl5yG@6J3%9 zIQ$lq&`XY!&fa|2xPKmUcIn)k(^MJVH>?d*-b_h%$TXpJqLDG_szqh(M~}l$(C z@VQPCM(plRFvr)HRxHxa#G#{$+(E7{W&(CdIWu$0FhqsR@%Y?QH-i5z`Ut<|w~l|% zGjCNCQc49)bL|@V*%aEPuDo*`5}V3uM4V>u1az9~jhFcNyn71?z4#_J*5_d6$*7_0 zao|&sbvE59Vw^>v&vxAvZbf@EeBO#F4zle=Aa{Z9VozKv=v8KCdUP0$(DiWhj+J`s zt6$$dtS#7(E>6@$evo+bS1Y?KhIp*=WX>3ICdpWUM>HFsl7f<>DbCR_W@o{d7X7Vp zp$7d!CRLYhYr5-QkR^N56cJ)8hjs?Wy2MGNXrUDtq8Je=tW#1cl&S(gF!EDBvQu1t zank2-xy_;0-)r~c(#eF{avmjv6q5cpb<&xNzg5O$o}>)YzsG|v;ETmMEJ`N|KX} zHW8y}J$uR00QU>a$vk4z=Pq^lKJJ}2Lx$J5?!Lpj?fF56Eu(Ll*`3F|EwhZrG-C5w z1#ibTIcoC>Jh6O}HETRS_nGHJezOA56vzx=&PliZh08E=tcvoe8SB-f8-*5vTPZ$$%@L9m&qCnJ+~>W1PgNl;N8T zo=O9Q>p)ITqJsXlmF+JkQhND>?!cR)*>RTu5BPofh3`b}+Uq0wqWP`BV>U>|)%)1H zK|+YU^4nLOM$W*x)r*|{%JnlY_7ok~8qwdNmJVDW&_2p*g_eetTD9hcS=!&CRt&?m zEOE~4JA_N_OmT%hJcG-R0Ha^Q3T5L@`DDqWY%s_cp~kmIo4wB0;RuCHGG)vjKw3vT zDwL$psAS9L)*Ig&{-x0(vh~7N>4v+xysu! zu0)t_YHGe(DZFWM?9^LxFctyPLVfJLJv#*=RM{j%ei}A(nn~+kh1^a2bGcL z=q3#m$8eu)>-XvAC)}DySy3O+qpSyJW^!ORfBMPYj2n~Xt$m9e1g`!_@Z9t`NSeJI zm_t;7YPY3o? zDz`Xhe`>+ZYjLI7>Y9OyntA&-l!c~T=;N&6%7y=CCERSioAjLrrrbnPm*XqVJ3kbL zu<%8L-}Pg4M~(uf?5}(Aqk^f+0c~3{%dvxp*T)8|6E{Fe{iT3+TSvQ;#YM(P0Wzsi zusBdKP>4`aP+y>0of%x1;Gv*)2%w-4K3eSToh|HaoyOIroL0m!J73gVeuOXv{xT%L z|I?FNnJR-^_1+#%!Ii!(&o=)}# zHt<{FNJ<{BA>pfcdbtMseTL$G;CS^T#o^`9YUDkF&V^B z=^YdIi_W^%h!;1}OzcCUHSqI=s%@$n)K2;$rdN|k8QbGDGKM{i_vpQklPvr%Y+OPq zH6HgIwV$Cs$Y5Yt^bsdex-B2Ql&5e5l@6L0C0nadmW5frpp9o((_J?TGn~T==aMzw zpj69$z61|u#)pX*)gL$a=({-%%FlV&BE^JKujtt2f)OlC#bg$$kk?^Z(thlTg<6LY z_kh^=P@{JMjkfBBKanF77eO0bB}+I>T`M87pTF__`K!Cz@|kWPBEUqsd_S*S3B9_+ zHzbQ9hv1+jeCNB45D~T}cpj2wtifld5Ru@w%L=%jQ0dYXMs5v^ZG)zEg4Nwtn~GTPW6z zH^_aK5>vS0Qutuvu_!}dwBzC1@aoV+fPRChEIg!}j9lm3Xvn;|5L?go$XS#bfathk zTZV@n0z;LooU3})o7~+TUJ}UMV>*|Dc#Fc$3Am2N$7I4$R(CJ{~9arl4UC6Kl7k8+=klcX5 zBmOe)$A4uj>yxrm7m7QJ1aSb=JVQg!U%x*)jDyRUrt>V6R`jAz`K9-vr76be8pDe= zJeuztGG5e;{yFD&)=zT+(C)UTr=F$esfCDRQ~j*glWeuQO6iw( z>maosWc(e%$gu@@{=Cnrn&>-iOpG_%*^$koPx+nU?K>h>u)zZZ*5S1hIYv`04rf1s z!$35o4PnS-Ti^74Y|^2x#AHyeJKCCdZlgh=9uawJJOSShatWCA@v5t_J~^!16%C#F zWM(7%8%qZePH3@-6yE&cYj%9cwbW8E^Ze@mZX;{|ZLe6bM#NaM_8Ar|bYX1wV-Y0B ze3(VJB>Fv_J}3Pu=z~GtRG>!t6c4K1M#;z>w%-kCp6TL)4{*bUbD_m21`7vGYndeJuLWWBS81bGtycM8?u(y0 zM!da&<%g=#7wD^{ZJUiI<3@n^RYUxFtBUXVw1%7OtyHS`pR^Xs(T-hBQnwDt-nbO6 zYAUMmhQGPu^WYppar1G@Yl4ZUnd1PAt8sn+nr-n5H~VUsZ<99^p6pLOxj~B_R6fA= z6sF0mx3bu53}VDJrkDcduh{xim;S0UH+z}NjNQcU6dRM*F@&e{Tl-B{-NutH_=Ed>=N|6vF+sa{r^q2+)l zc_B>NEsJvQs&T(fi5MR%N&k}6*FME24Bs?_Bs9)U6x#`q>77R3Rze${x=%P%ZTH8# zxNk!K(xBpcgc-@+U#>G(+2`Fy_Be<3X8Gx(rQxWlDBB;=l3| zrG^;KYfFg&N~Ji(nvDt4D{aeR)sAWB8A?^y^vJOqDqa}6Vvj>yX; zCYXt1yA3Fb(yO`rKJrb72SL6`T8a{{^f!b<7YDMDDGeUyMTdMdsWIzek6eR8$QM) z_oVLkjg*2aCV{Tb=Y#T-uD2^Weo#l7=bc)0?l-_pzWeLo=gc4&K^4+&X)nN_{50QqFe0X-mlXD>rPYXDEfFMta& z+jU;NtoQu}!0YtMVzV9j`Ua@e>v7&F%6)L`Yv5`Grn%n3P5aC0iJP8|-upJb-MQ|D zx5vZ2QEVm$y<^K;1ZKa_-AR|%%kwyRH6x_m&5r!nwT6me`09x=>HF#a)|Cr?`^&Q) zc@;n)k&HiByP#fF8oD`E+vhjrars~|MJ@|E7l({T2^3()sJp?d4VgVV>*5POH#`pWW@Px^4KF;5$;q_HQ@5 zUyyr2CHArX==_uZDRmR-o@BGrc&LZE*e7>OaB_GDO7+JdCWHzJ=rRn1pCo}!?ypKd z*UUlC&df9$vX1r7Nns~75|ye zg;JyGW`ZM7_@qXTPF4&>ikz1V<%P4EMgY5H(JCUuOFi*@_z0MUTC=;T{=7Tq9qhM% zKp-ClEu$~!h3c+X*S8t+F{Pd_S%m)#1?dTmz|D|<{!zgC;H-HrgQ>z2k8LyvyIC=81sWEr;10zm>E}bR z(3{!);z@!tVv<2@y@7FlLbm_qo*R>{wQl>%Jsz?Nf3;A)DoW6gB(!ZP*l*KBwLhS~ zQXy~lrz${?j8ViY)guX)35jEWDd0nF11$U5d#vCSVU9?mXDNKG{1e;u<@@@&H=OX# zY|I&DVR2IQ&5HQM`dNFgTuf{PL+bv50O7MH-3E>f9CH~zS^2+S$k&|(5`ND|g0u+| z2yMcCuC$@CfhPt+F&`!6am-Wv6D8jX-1-E1!5AucZKcom9G(h{S^6C-}l1df7MgEpm(9-yo(t#o7ZWr;f61*D6dmiQ(g29ZG8YR8>jlpJ{&UI!9>b0qhD-a93L9432=RTo-2qbm z@7_opq$E6~QaY>E#BB_+?)A;u0x@B|*hmAX%i~EWp*YwyBg4NEiZBx&GvFIWHJMIa zjwq$ZG1(Lp*B$4?7EKBy)c8!N^SOb}s!HhVbHr4OiB4aCJSUQmgQ6i}w^cFBHVn4Y z@psf+iTH{yoxSdNKA4k6eUnyD-R3r}7Rb7yD7t2vI+5q|P2Bo5P`Mo3``;F5%X?Yq8)yVRRtX9EhW}buKbXl4+{GM@x;;CJ7Lpx=0 zla#6@m7~f62_L4<7BZL8)R)>Ov(E@O($E|ph9-*z)TX8pu;`*O{Uf%kGpGxPZ`;n$!*k=vq09IzVlMqj8KU^26seIV<4Y%HpY?;R)7j+M}qs)dT@`Gx} zpGwuAs;I0Yi?%=H8}K67K;`KNj*pO%W1{(B44e@5!M%FkEn83xZmUDha9yM#ovl1y zF(S#CsO~9px;d;&CKh|`XLg11x}qz;+SYF>qy6!J!yIZrbcs*yLm9 z!&YteUql9N9*VJ*0etMi{|@J^*$i%_GpE^VXV_RimS|6Y?OA+&^X=hD+Uf*OvU%#q ziOHdSnTUz@6dTL<|EbfwqngULFrH9`-iBtO#6eU*=}L=q>7aDtAPhnvFj6F;B!VD{ zaZo_%5PC5hf(nR$6hROKAqj{u3TUK+2m~=i6hnD8>U)l?c_+!eCpX!@^PRo+x_^B8 zrpn)b#G>90&4_yVJU`It53T+7l$YoGf<~FtCPrhKCT1Urp6~T8Uy4u{T~6tl>Uyqo z)|TAeUfh@T(#Esto`mGwjKj$J@{S$#7{{2A0p>C{TC1Tz06t^-A!OIy&Gk=HQ|}Hg zuRdCyAAhq&d$jp^Fno*E62AHV#n$HPxXJpb#)Qw)C7a9_@7p&@w$?ZF?oy}LAbwdV z&Zv|r`uceenTT9#*l{xV=;7#%E*ut@Iesxdm1z#xEemt|1taBn;+RWa8!cjEExdXo z8_U0#ekAQ#RemWGe$+O4JYM3Z+`waATbb0oyDQfZdw<#sGnfm-A(#bAXMQn5p>h@- zv#JI%85yr60%G7Ltu2opoom`eubH;nJNg;Ppwy>t6cPv~?d(abSxY0rczXy#2k zhH2Ul|5ln6iUz%vqwCwycS*J092Y1;CefpNiNl(%BPXYn79-LW=JHDP-zcNxBEvM` zr7+TM^uCf?T?QfscmWdl7jT$)uj*5y&rcN7laWBl&*|FHLsoZF`VUFWL@aqrnh6QC zJvwD{_UTMd-XX~(xYmHr3z@l@v!X2Bvt_RC4dmupyDLEkbF>ETZg~>=slo9Gg+Iip zG~}J6!nopcJ&QSI5;}`Kv^auKK1%OKt`%BKvg9U~?yodou4_H+bM0+m?Lo_->Q_^R zljy5Ctm`t#ew| z2Dt_#cxBV|B2#<4l5lHw`ELI^u}_;)eK|6xB8y4lAx~y&LrRd-29kWw_woL~w;?!^Z>N!5==<64(d4y(u+NF^)4Ub!fT+v%@x+Q`q5ZIQ`YX3NgVc1ARe9G1P7axi`kL?@@76+c| z2J*7;q-E(EN+3$UEG-Ktvs(+^%rWph@3G~ACI0NG*ZH@KPc+N-X3V&U*4|NHVD6=M z+$Ov#;oo^RJMfT4KcgZz%cxT9s7C?QD@vS7Lb^!L*f7Cu_QttTk6p3EONb@Ma^Cc8 z8q}jdemI-^))>mV6RceQB_O8fxK!=y0VnzNZ0~gG4+1QpcB9RLrhzADdi%@bC(_YU%yi3;UJy7m88CYJ$BTfs8#;- z6+7B4&7~bR4mE{$KI#@>t<=UBHiA+;XsZ$)G|_h!`0SuUk5aQl`-dK8uQ4Mn##yi$_hrKk+Qo`xyjI66XKlg~)x z9j=ZrTc+;p-Z7yNyQE*YXjn&*{hR!`CuJ6|9vV~>X($>y?~_43tsPsy*XoapEC4}8zEmdCG4IssbRm5KK zm~zKQeyaUtl?5)U5O9>EV&s;KeNT=S252{txL<#;gY5??7F3>ba49})YtWc*7BnYH zwaCm`Ioq-FE7h7*&ddNjhahKk=l)rP63%60!h4|tVdDhRY$FAgIe`u=?bZ&YTi~Fx z0K@kpq)enq7?@(gx%ar5E^#M5%P>)Wt52DGfnDny>%Dt9*O$vO>l0So~oa4 zldz++*3DZ31?5}}-**rSI1Z5_D90z41HvjLYOIxW0h|6@u03}ZxY)X-hTxwUR@W4Z z?fq3c4-`jFPWfOC9~F{5vvppu6Hu<m z;DpnFR2QD;6zIUo&|l1c+-NCzlar7TwLqmXbUV`4C5+*IoF+qS#r2!_<}c7*{$$@ZrXG#$DWD4irRs-ORxJwcbi zwpeOQsnoZg-s@Pp(>%6qM6M|R#v!3#y#P-8dMU_x)j&^=G&Vb3(3N59~2r_6cLmZU~^wa*Z)TyxT(&13Ck zTu-6m8BcmnW=~db#r&n0TC>*geY+`C6Ri{MvzlSI@%!Y_C;7hN_Cd8iAuH7?0x_!n zs$|KU6sGUFx=}S!y`g&jf#5Lo^Pw%M(FR7lh`rkVCJRO+1U2V0)+n|Q*1umn+K6Va zPLj}LMva>%)UP7o#TZ66+M_o$g^45gPqRbGnAn!7FOw~Ag2U}M96trs3`uY$^ItLr z-s-%9Ri^C!&R^wn$wS1s_K0&eOVLdQbI&!Y{4*}47Ah18u00eX zX?nn_Lc9;o*xIGUpJk@lz6H5%e<3Z|w3GjWIPiX2W_sAryi|*W+XMX4;{st)zB1e( z`B>4X7E0n<<`wBW@c}Z15TR6K4fm3mmFGLxTaTO%5I2PIi3fK(sRg~&=VRJs7G6~K~w@tN$<;5>sapVF4nkbtcUjw`arTYK(1&HpV?D6{^ zeM0u~>&f3gNwJq|S8+Qi6ZT-BB7b!2?CR20$9O@Y({dn? z3{az-0XVJShedc;U~rIzM=(4_!xbJG4UgoQe%l$xOS&?3fdW^&&guVs8{Zg0Kp*fY zMwnj&2ZpqS2l_>wLH!%e7U6Sjlm`TI5asCnCoNw5XBvm}Z-ku-Job`6GxEO5H@ld_ z_@*aW8U#9{r5UDSdCbbp-N8*GAQ*U1Ej-LG61{y>9#Vk^gMh#m-~)6rzm9K^LHTWv zP`?NlI5Ipc(jU&Dn0%GZ4;n=F+ZOd?;Hql4pG=faSRVf!a3U! z{GLQGu&&C1iV4ZCA+S(in%9@dKhE3Lny3$xs{nbw0S>w9_f@{B1P-rj`31n}(nC%_l zA3-8$?*I0Kw+C(a_6vdVkgDe$E-b?9! zuOz#P(z+#~7vs^qnfGR-87BUdTx2qWi*C0Ii`(1P45ojV*NgcCf9A`{&p*={tk&1R z*WmmYfT7b4f)-M01~*JFMNKXRtn-3tLyN~4MuXwi;A%L07<|9HtRg#YE)&XOLv7R; z9&X&xTqL|qo&EG2*yI;AJA0UwB5|oB+-U+!mMUQ$ zte7d4aOk+8CfP+Oejc~kmzv%7`^-v#SS6v#a_>prKs({+z&n>)_ zXCS135U>9oq3*%#n6S{+F(|;?TZ+JR*h805?THZ(62hE`AXBmc@7i}x$*rP=Zy6bm$xkfDkPg;004Jka%E_5b#rBNP)h{{00000 R3;+xOL<0Z-D`5Zt004>KE*by; delta 118717 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 diff --git a/Moose Test Missions/Moose_Test_SET_CLIENT/Moose_Test_SET_CLIENT.lua b/Moose Test Missions/Moose_Test_SET_CLIENT/Moose_Test_SET_CLIENT.lua new file mode 100644 index 000000000..af79af84f --- /dev/null +++ b/Moose Test Missions/Moose_Test_SET_CLIENT/Moose_Test_SET_CLIENT.lua @@ -0,0 +1,3 @@ + +SetClient = SET_CLIENT:New():FilterCoalitions("blue"):FilterCategories("plane"):FilterCountries("USA"):FilterStart() + diff --git a/Moose Test Missions/Moose_Test_SET_CLIENT/Moose_Test_SET_CLIENT.miz b/Moose Test Missions/Moose_Test_SET_CLIENT/Moose_Test_SET_CLIENT.miz new file mode 100644 index 0000000000000000000000000000000000000000..a5788e28331bd344799d67342e8c6eae7ea3e8a2 GIT binary patch literal 19551 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 V0!0HJngEx3Y62Su6P*A6000zAB=G{OOh-S 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