diff --git a/Moose Development/Moose/AI/AI_Escort.lua b/Moose Development/Moose/AI/AI_Escort.lua index e18948790..c772940ab 100644 --- a/Moose Development/Moose/AI/AI_Escort.lua +++ b/Moose Development/Moose/AI/AI_Escort.lua @@ -147,8 +147,8 @@ -- @image Escorting.JPG - ---- @type AI_ESCORT +--- +-- @type AI_ESCORT -- @extends AI.AI_Formation#AI_FORMATION @@ -168,11 +168,14 @@ -- -- -- First find the GROUP object and the CLIENT object. -- local EscortUnit = CLIENT:FindByName( "Unit Name" ) -- The Unit Name is the name of the unit flagged with the skill Client in the mission editor. --- local EscortGroup = GROUP:FindByName( "Group Name" ) -- The Group Name is the name of the group that will escort the Escort Client. +-- local EscortGroup = SET_GROUP:New():FilterPrefixes("Escort"):FilterOnce() -- The the group name of the escorts contains "Escort". -- -- -- Now use these 2 objects to construct the new EscortPlanes object. -- EscortPlanes = AI_ESCORT:New( EscortUnit, EscortGroup, "Desert", "Welcome to the mission. You are escorted by a plane with code name 'Desert', which can be instructed through the F10 radio menu." ) --- +-- EscortPlanes:MenusAirplanes() -- create menus for airplanes +-- EscortPlanes:__Start(2) +-- +-- -- @field #AI_ESCORT AI_ESCORT = { ClassName = "AI_ESCORT", @@ -189,7 +192,7 @@ AI_ESCORT = { TaskPoints = {} } ---- @field Functional.Detection#DETECTION_AREAS +-- @field Functional.Detection#DETECTION_AREAS AI_ESCORT.Detection = nil --- MENUPARAM type @@ -211,10 +214,14 @@ AI_ESCORT.Detection = nil -- -- -- First find the GROUP object and the CLIENT object. -- local EscortUnit = CLIENT:FindByName( "Unit Name" ) -- The Unit Name is the name of the unit flagged with the skill Client in the mission editor. --- local EscortGroup = GROUP:FindByName( "Group Name" ) -- The Group Name is the name of the group that will escort the Escort Client. +-- local EscortGroup = SET_GROUP:New():FilterPrefixes("Escort"):FilterOnce() -- The the group name of the escorts contains "Escort". -- -- -- Now use these 2 objects to construct the new EscortPlanes object. -- EscortPlanes = AI_ESCORT:New( EscortUnit, EscortGroup, "Desert", "Welcome to the mission. You are escorted by a plane with code name 'Desert', which can be instructed through the F10 radio menu." ) +-- EscortPlanes:MenusAirplanes() -- create menus for airplanes +-- EscortPlanes:__Start(2) +-- +-- function AI_ESCORT:New( EscortUnit, EscortGroupSet, EscortName, EscortBriefing ) local self = BASE:Inherit( self, AI_FORMATION:New( EscortUnit, EscortGroupSet, EscortName, EscortBriefing ) ) -- #AI_ESCORT @@ -227,10 +234,17 @@ function AI_ESCORT:New( EscortUnit, EscortGroupSet, EscortName, EscortBriefing ) self.EscortGroupSet = EscortGroupSet self.EscortGroupSet:SetSomeIteratorLimit( 8 ) - + self.EscortBriefing = EscortBriefing self.Menu = {} + self.Menu.HoldAtEscortPosition = self.Menu.HoldAtEscortPosition or {} + self.Menu.HoldAtLeaderPosition = self.Menu.HoldAtLeaderPosition or {} + self.Menu.Flare = self.Menu.Flare or {} + self.Menu.Smoke = self.Menu.Smoke or {} + self.Menu.Targets = self.Menu.Targets or {} + self.Menu.ROE = self.Menu.ROE or {} + self.Menu.ROT = self.Menu.ROT or {} -- if not EscortBriefing then -- EscortGroup:MessageToClient( EscortGroup:GetCategoryName() .. " '" .. EscortName .. "' (" .. EscortGroup:GetCallsign() .. ") reporting! " .. @@ -250,7 +264,7 @@ function AI_ESCORT:New( EscortUnit, EscortGroupSet, EscortName, EscortBriefing ) EscortGroupSet:ForEachGroup( - --- @param Core.Group#GROUP EscortGroup + -- @param Core.Group#GROUP EscortGroup function( EscortGroup ) -- Set EscortGroup known at EscortUnit. if not self.PlayerUnit._EscortGroups then @@ -325,14 +339,14 @@ function AI_ESCORT:_InitEscortRoute( EscortGroup ) end ---- @param #AI_ESCORT self +-- @param #AI_ESCORT self -- @param Core.Set#SET_GROUP EscortGroupSet function AI_ESCORT:onafterStart( EscortGroupSet ) self:F() EscortGroupSet:ForEachGroup( - --- @param Core.Group#GROUP EscortGroup + -- @param Core.Group#GROUP EscortGroup function( EscortGroup ) EscortGroup:WayPointInitialize() @@ -370,7 +384,7 @@ function AI_ESCORT:onafterStart( EscortGroupSet ) self:_InitFlightMenus() self.EscortGroupSet:ForSomeGroupAlive( - --- @param Core.Group#GROUP EscortGroup + -- @param Core.Group#GROUP EscortGroup function( EscortGroup ) self:_InitEscortMenus( EscortGroup ) @@ -378,7 +392,7 @@ function AI_ESCORT:onafterStart( EscortGroupSet ) self:SetFlightModeFormation( EscortGroup ) - --- @param #AI_ESCORT self + -- @param #AI_ESCORT self -- @param Core.Event#EVENTDATA EventData function EscortGroup:OnEventDeadOrCrash( EventData ) self:F( { "EventDead", EventData } ) @@ -394,14 +408,14 @@ function AI_ESCORT:onafterStart( EscortGroupSet ) end ---- @param #AI_ESCORT self +-- @param #AI_ESCORT self -- @param Core.Set#SET_GROUP EscortGroupSet function AI_ESCORT:onafterStop( EscortGroupSet ) self:F() EscortGroupSet:ForEachGroup( - --- @param Core.Group#GROUP EscortGroup + -- @param Core.Group#GROUP EscortGroup function( EscortGroup ) EscortGroup:WayPointInitialize() @@ -550,7 +564,7 @@ function AI_ESCORT:SetFlightMenuFormation( Formation ) local MenuFlightFormationID = MENU_GROUP_COMMAND:New( self.PlayerGroup, Formation, FlightMenuFormation, function ( self, Formation, ... ) self.EscortGroupSet:ForSomeGroupAlive( - --- @param Core.Group#GROUP EscortGroup + -- @param Core.Group#GROUP EscortGroup function( EscortGroup, self, Formation, Arguments ) if EscortGroup:IsAir() then self:E({FormationID=FormationID}) @@ -764,7 +778,7 @@ end function AI_ESCORT:SetFlightMenuHoldAtEscortPosition() - for _, MenuHoldAtEscortPosition in pairs( self.Menu.HoldAtEscortPosition ) do + for _, MenuHoldAtEscortPosition in pairs( self.Menu.HoldAtEscortPosition or {} ) do local FlightMenuReportNavigation = MENU_GROUP:New( self.PlayerGroup, "Navigation", self.FlightMenu ) local FlightMenuHoldPosition = MENU_GROUP_COMMAND @@ -785,7 +799,7 @@ end function AI_ESCORT:SetEscortMenuHoldAtEscortPosition( EscortGroup ) - for _, HoldAtEscortPosition in pairs( self.Menu.HoldAtEscortPosition ) do + for _, HoldAtEscortPosition in pairs( self.Menu.HoldAtEscortPosition or {}) do if EscortGroup:IsAir() then local EscortGroupName = EscortGroup:GetName() local EscortMenuReportNavigation = MENU_GROUP:New( self.PlayerGroup, "Navigation", EscortGroup.EscortMenu ) @@ -853,7 +867,7 @@ end function AI_ESCORT:SetFlightMenuHoldAtLeaderPosition() - for _, MenuHoldAtLeaderPosition in pairs( self.Menu.HoldAtLeaderPosition ) do + for _, MenuHoldAtLeaderPosition in pairs( self.Menu.HoldAtLeaderPosition or {}) do local FlightMenuReportNavigation = MENU_GROUP:New( self.PlayerGroup, "Navigation", self.FlightMenu ) local FlightMenuHoldAtLeaderPosition = MENU_GROUP_COMMAND @@ -874,7 +888,7 @@ end function AI_ESCORT:SetEscortMenuHoldAtLeaderPosition( EscortGroup ) - for _, HoldAtLeaderPosition in pairs( self.Menu.HoldAtLeaderPosition ) do + for _, HoldAtLeaderPosition in pairs( self.Menu.HoldAtLeaderPosition or {}) do if EscortGroup:IsAir() then local EscortGroupName = EscortGroup:GetName() @@ -999,7 +1013,7 @@ end function AI_ESCORT:SetFlightMenuFlare() - for _, MenuFlare in pairs( self.Menu.Flare) do + for _, MenuFlare in pairs( self.Menu.Flare or {}) do local FlightMenuReportNavigation = MENU_GROUP:New( self.PlayerGroup, "Navigation", self.FlightMenu ) local FlightMenuFlare = MENU_GROUP:New( self.PlayerGroup, MenuFlare.MenuText, FlightMenuReportNavigation ) @@ -1014,7 +1028,7 @@ end function AI_ESCORT:SetEscortMenuFlare( EscortGroup ) - for _, MenuFlare in pairs( self.Menu.Flare) do + for _, MenuFlare in pairs( self.Menu.Flare or {}) do if EscortGroup:IsAir() then local EscortGroupName = EscortGroup:GetName() @@ -1059,7 +1073,7 @@ end function AI_ESCORT:SetFlightMenuSmoke() - for _, MenuSmoke in pairs( self.Menu.Smoke) do + for _, MenuSmoke in pairs( self.Menu.Smoke or {}) do local FlightMenuReportNavigation = MENU_GROUP:New( self.PlayerGroup, "Navigation", self.FlightMenu ) local FlightMenuSmoke = MENU_GROUP:New( self.PlayerGroup, MenuSmoke.MenuText, FlightMenuReportNavigation ) @@ -1076,7 +1090,7 @@ end function AI_ESCORT:SetEscortMenuSmoke( EscortGroup ) - for _, MenuSmoke in pairs( self.Menu.Smoke) do + for _, MenuSmoke in pairs( self.Menu.Smoke or {}) do if EscortGroup:IsAir() then local EscortGroupName = EscortGroup:GetName() @@ -1169,7 +1183,7 @@ function AI_ESCORT:SetFlightMenuTargets() local FlightMenuAttackNearbyAir = MENU_GROUP_COMMAND:New( self.PlayerGroup, "Attack nearest airborne targets", self.FlightMenuAttack, AI_ESCORT._FlightAttackNearestTarget, self, self.__Enum.ReportType.Air ):SetTag( "Attack" ) local FlightMenuAttackNearbyGround = MENU_GROUP_COMMAND:New( self.PlayerGroup, "Attack nearest ground targets", self.FlightMenuAttack, AI_ESCORT._FlightAttackNearestTarget, self, self.__Enum.ReportType.Ground ):SetTag( "Attack" ) - for _, MenuTargets in pairs( self.Menu.Targets) do + for _, MenuTargets in pairs( self.Menu.Targets or {}) do MenuTargets.FlightReportTargetsScheduler = SCHEDULER:New( self, self._FlightReportTargetsScheduler, {}, MenuTargets.Interval, MenuTargets.Interval ) end @@ -1179,7 +1193,7 @@ end function AI_ESCORT:SetEscortMenuTargets( EscortGroup ) - for _, MenuTargets in pairs( self.Menu.Targets) do + for _, MenuTargets in pairs( self.Menu.Targets or {} or {}) do if EscortGroup:IsAir() then local EscortGroupName = EscortGroup:GetName() --local EscortMenuReportTargets = MENU_GROUP:New( self.PlayerGroup, "Report targets", EscortGroup.EscortMenu ) @@ -1231,7 +1245,7 @@ function AI_ESCORT:MenuAssistedAttack() self:F() self.EscortGroupSet:ForSomeGroupAlive( - --- @param Core.Group#GROUP EscortGroup + -- @param Core.Group#GROUP EscortGroup function( EscortGroup ) if not EscortGroup:IsAir() then -- Request assistance from other escorts. @@ -1246,7 +1260,7 @@ end function AI_ESCORT:SetFlightMenuROE() - for _, MenuROE in pairs( self.Menu.ROE) do + for _, MenuROE in pairs( self.Menu.ROE or {}) do local FlightMenuROE = MENU_GROUP:New( self.PlayerGroup, "Rule Of Engagement", self.FlightMenu ) local FlightMenuROEHoldFire = MENU_GROUP_COMMAND:New( self.PlayerGroup, "Hold fire", FlightMenuROE, AI_ESCORT._FlightROEHoldFire, self, "Holding weapons!" ) @@ -1261,7 +1275,7 @@ end function AI_ESCORT:SetEscortMenuROE( EscortGroup ) - for _, MenuROE in pairs( self.Menu.ROE) do + for _, MenuROE in pairs( self.Menu.ROE or {}) do if EscortGroup:IsAir() then local EscortGroupName = EscortGroup:GetName() @@ -1302,7 +1316,7 @@ end function AI_ESCORT:SetFlightMenuROT() - for _, MenuROT in pairs( self.Menu.ROT) do + for _, MenuROT in pairs( self.Menu.ROT or {}) do local FlightMenuROT = MENU_GROUP:New( self.PlayerGroup, "Reaction On Threat", self.FlightMenu ) local FlightMenuROTNoReaction = MENU_GROUP_COMMAND:New( self.PlayerGroup, "Fight until death", FlightMenuROT, AI_ESCORT._FlightROTNoReaction, self, "Fighting until death!" ) @@ -1317,7 +1331,7 @@ end function AI_ESCORT:SetEscortMenuROT( EscortGroup ) - for _, MenuROT in pairs( self.Menu.ROT) do + for _, MenuROT in pairs( self.Menu.ROT or {}) do if EscortGroup:IsAir() then local EscortGroupName = EscortGroup:GetName() @@ -1375,7 +1389,7 @@ function AI_ESCORT:SetEscortMenuResumeMission( EscortGroup ) end ---- @param #AI_ESCORT self +-- @param #AI_ESCORT self -- @param Wrapper.Group#GROUP OrbitGroup -- @param Wrapper.Group#GROUP EscortGroup -- @param #number OrbitHeight @@ -1419,7 +1433,7 @@ function AI_ESCORT:_HoldPosition( OrbitGroup, EscortGroup, OrbitHeight, OrbitSec end ---- @param #AI_ESCORT self +-- @param #AI_ESCORT self -- @param Wrapper.Group#GROUP OrbitGroup -- @param #number OrbitHeight -- @param #number OrbitSeconds @@ -1428,7 +1442,7 @@ function AI_ESCORT:_FlightHoldPosition( OrbitGroup, OrbitHeight, OrbitSeconds ) local EscortUnit = self.PlayerUnit self.EscortGroupSet:ForEachGroupAlive( - --- @param Core.Group#GROUP EscortGroup + -- @param Core.Group#GROUP EscortGroup function( EscortGroup, OrbitGroup ) if EscortGroup:IsAir() then if OrbitGroup == nil then @@ -1456,7 +1470,7 @@ end function AI_ESCORT:_FlightJoinUp() self.EscortGroupSet:ForEachGroupAlive( - --- @param Core.Group#GROUP EscortGroup + -- @param Core.Group#GROUP EscortGroup function( EscortGroup ) if EscortGroup:IsAir() then self:_JoinUp( EscortGroup ) @@ -1483,7 +1497,7 @@ end function AI_ESCORT:_FlightFormationTrail( XStart, XSpace, YStart ) self.EscortGroupSet:ForEachGroupAlive( - --- @param Core.Group#GROUP EscortGroup + -- @param Core.Group#GROUP EscortGroup function( EscortGroup ) if EscortGroup:IsAir() then self:_EscortFormationTrail( EscortGroup, XStart, XSpace, YStart ) @@ -1510,7 +1524,7 @@ end function AI_ESCORT:_FlightFormationStack( XStart, XSpace, YStart, YSpace ) self.EscortGroupSet:ForEachGroupAlive( - --- @param Core.Group#GROUP EscortGroup + -- @param Core.Group#GROUP EscortGroup function( EscortGroup ) if EscortGroup:IsAir() then self:_EscortFormationStack( EscortGroup, XStart, XSpace, YStart, YSpace ) @@ -1533,7 +1547,7 @@ end function AI_ESCORT:_FlightFlare( Color, Message ) self.EscortGroupSet:ForEachGroupAlive( - --- @param Core.Group#GROUP EscortGroup + -- @param Core.Group#GROUP EscortGroup function( EscortGroup ) if EscortGroup:IsAir() then self:_Flare( EscortGroup, Color, Message ) @@ -1556,7 +1570,7 @@ end function AI_ESCORT:_FlightSmoke( Color, Message ) self.EscortGroupSet:ForEachGroupAlive( - --- @param Core.Group#GROUP EscortGroup + -- @param Core.Group#GROUP EscortGroup function( EscortGroup ) if EscortGroup:IsAir() then self:_Smoke( EscortGroup, Color, Message ) @@ -1587,7 +1601,7 @@ end function AI_ESCORT:_FlightSwitchReportNearbyTargets( ReportTargets ) self.EscortGroupSet:ForEachGroupAlive( - --- @param Core.Group#GROUP EscortGroup + -- @param Core.Group#GROUP EscortGroup function( EscortGroup ) if EscortGroup:IsAir() then self:_EscortSwitchReportNearbyTargets( EscortGroup, ReportTargets ) @@ -1679,7 +1693,7 @@ function AI_ESCORT:_ScanTargets( ScanDuration ) end ---- @param Wrapper.Group#GROUP EscortGroup +-- @param Wrapper.Group#GROUP EscortGroup -- @param #AI_ESCORT self function AI_ESCORT.___Resume( EscortGroup, self ) @@ -1701,7 +1715,7 @@ function AI_ESCORT.___Resume( EscortGroup, self ) end ---- @param #AI_ESCORT self +-- @param #AI_ESCORT self -- @param Wrapper.Group#GROUP EscortGroup -- @param #number WayPoint function AI_ESCORT:_ResumeMission( EscortGroup, WayPoint ) @@ -1723,7 +1737,7 @@ function AI_ESCORT:_ResumeMission( EscortGroup, WayPoint ) end ---- @param #AI_ESCORT self +-- @param #AI_ESCORT self -- @param Wrapper.Group#GROUP EscortGroup The escort group that will attack the detected item. -- @param Functional.Detection#DETECTION_BASE.DetectedItem DetectedItem function AI_ESCORT:_AttackTarget( EscortGroup, DetectedItem ) @@ -1743,7 +1757,7 @@ function AI_ESCORT:_AttackTarget( EscortGroup, DetectedItem ) local AttackUnitTasks = {} DetectedSet:ForEachUnit( - --- @param Wrapper.Unit#UNIT DetectedUnit + -- @param Wrapper.Unit#UNIT DetectedUnit function( DetectedUnit, Tasks ) if DetectedUnit:IsAlive() then AttackUnitTasks[#AttackUnitTasks+1] = EscortGroup:TaskAttackUnit( DetectedUnit ) @@ -1767,7 +1781,7 @@ function AI_ESCORT:_AttackTarget( EscortGroup, DetectedItem ) local Tasks = {} DetectedSet:ForEachUnit( - --- @param Wrapper.Unit#UNIT DetectedUnit + -- @param Wrapper.Unit#UNIT DetectedUnit function( DetectedUnit, Tasks ) if DetectedUnit:IsAlive() then Tasks[#Tasks+1] = EscortGroup:TaskFireAtPoint( DetectedUnit:GetVec2(), 50 ) @@ -1795,7 +1809,7 @@ end function AI_ESCORT:_FlightAttackTarget( DetectedItem ) self.EscortGroupSet:ForEachGroupAlive( - --- @param Core.Group#GROUP EscortGroup + -- @param Core.Group#GROUP EscortGroup function( EscortGroup, DetectedItem ) if EscortGroup:IsAir() then self:_AttackTarget( EscortGroup, DetectedItem ) @@ -1842,7 +1856,7 @@ end --- ---- @param #AI_ESCORT self +-- @param #AI_ESCORT self -- @param Wrapper.Group#GROUP EscortGroup The escort group that will attack the detected item. -- @param Functional.Detection#DETECTION_BASE.DetectedItem DetectedItem function AI_ESCORT:_AssistTarget( EscortGroup, DetectedItem ) @@ -1854,7 +1868,7 @@ function AI_ESCORT:_AssistTarget( EscortGroup, DetectedItem ) local Tasks = {} DetectedSet:ForEachUnit( - --- @param Wrapper.Unit#UNIT DetectedUnit + -- @param Wrapper.Unit#UNIT DetectedUnit function( DetectedUnit, Tasks ) if DetectedUnit:IsAlive() then Tasks[#Tasks+1] = EscortGroup:TaskFireAtPoint( DetectedUnit:GetVec2(), 50 ) @@ -1881,7 +1895,7 @@ end function AI_ESCORT:_FlightROEHoldFire( EscortROEMessage ) self.EscortGroupSet:ForEachGroupAlive( - --- @param Wrapper.Group#GROUP EscortGroup + -- @param Wrapper.Group#GROUP EscortGroup function( EscortGroup ) self:_ROE( EscortGroup, EscortGroup.OptionROEHoldFire, EscortROEMessage ) end @@ -1890,7 +1904,7 @@ end function AI_ESCORT:_FlightROEOpenFire( EscortROEMessage ) self.EscortGroupSet:ForEachGroupAlive( - --- @param Wrapper.Group#GROUP EscortGroup + -- @param Wrapper.Group#GROUP EscortGroup function( EscortGroup ) self:_ROE( EscortGroup, EscortGroup.OptionROEOpenFire, EscortROEMessage ) end @@ -1899,7 +1913,7 @@ end function AI_ESCORT:_FlightROEReturnFire( EscortROEMessage ) self.EscortGroupSet:ForEachGroupAlive( - --- @param Wrapper.Group#GROUP EscortGroup + -- @param Wrapper.Group#GROUP EscortGroup function( EscortGroup ) self:_ROE( EscortGroup, EscortGroup.OptionROEReturnFire, EscortROEMessage ) end @@ -1908,7 +1922,7 @@ end function AI_ESCORT:_FlightROEWeaponFree( EscortROEMessage ) self.EscortGroupSet:ForEachGroupAlive( - --- @param Wrapper.Group#GROUP EscortGroup + -- @param Wrapper.Group#GROUP EscortGroup function( EscortGroup ) self:_ROE( EscortGroup, EscortGroup.OptionROEWeaponFree, EscortROEMessage ) end @@ -1924,7 +1938,7 @@ end function AI_ESCORT:_FlightROTNoReaction( EscortROTMessage ) self.EscortGroupSet:ForEachGroupAlive( - --- @param Wrapper.Group#GROUP EscortGroup + -- @param Wrapper.Group#GROUP EscortGroup function( EscortGroup ) self:_ROT( EscortGroup, EscortGroup.OptionROTNoReaction, EscortROTMessage ) end @@ -1933,7 +1947,7 @@ end function AI_ESCORT:_FlightROTPassiveDefense( EscortROTMessage ) self.EscortGroupSet:ForEachGroupAlive( - --- @param Wrapper.Group#GROUP EscortGroup + -- @param Wrapper.Group#GROUP EscortGroup function( EscortGroup ) self:_ROT( EscortGroup, EscortGroup.OptionROTPassiveDefense, EscortROTMessage ) end @@ -1942,7 +1956,7 @@ end function AI_ESCORT:_FlightROTEvadeFire( EscortROTMessage ) self.EscortGroupSet:ForEachGroupAlive( - --- @param Wrapper.Group#GROUP EscortGroup + -- @param Wrapper.Group#GROUP EscortGroup function( EscortGroup ) self:_ROT( EscortGroup, EscortGroup.OptionROTEvadeFire, EscortROTMessage ) end @@ -1951,7 +1965,7 @@ end function AI_ESCORT:_FlightROTVertical( EscortROTMessage ) self.EscortGroupSet:ForEachGroupAlive( - --- @param Wrapper.Group#GROUP EscortGroup + -- @param Wrapper.Group#GROUP EscortGroup function( EscortGroup ) self:_ROT( EscortGroup, EscortGroup.OptionROTVertical, EscortROTMessage ) end @@ -2178,5 +2192,3 @@ function AI_ESCORT:_FlightReportTargetsScheduler() return false end - -