From ef1a9330a45b337bed5bf51fe85f003663819db0 Mon Sep 17 00:00:00 2001 From: FlightControl Date: Fri, 8 Mar 2019 10:03:58 +0100 Subject: [PATCH] Updates, many fixes. Now also the communication to the players is working. --- Moose Development/Moose/AI/AI_A2G_BAI.lua | 46 +++--- Moose Development/Moose/AI/AI_A2G_CAS.lua | 2 +- .../Moose/AI/AI_A2G_Dispatcher.lua | 32 +++- Moose Development/Moose/AI/AI_A2G_Engage.lua | 150 +++++++++++++++++- Moose Development/Moose/AI/AI_A2G_Patrol.lua | 36 ++--- Moose Development/Moose/AI/AI_A2G_SEAD.lua | 2 +- Moose Development/Moose/Core/Base.lua | 6 +- .../Moose/Tasking/DetectionManager.lua | 5 +- Moose Development/Moose/Tasking/Task.lua | 2 +- Moose Development/Moose/Tasking/TaskInfo.lua | 2 +- .../Moose/Tasking/Task_Capture_Dispatcher.lua | 21 +-- 11 files changed, 234 insertions(+), 70 deletions(-) diff --git a/Moose Development/Moose/AI/AI_A2G_BAI.lua b/Moose Development/Moose/AI/AI_A2G_BAI.lua index 055994d6b..d572347ba 100644 --- a/Moose Development/Moose/AI/AI_A2G_BAI.lua +++ b/Moose Development/Moose/AI/AI_A2G_BAI.lua @@ -105,8 +105,8 @@ function AI_A2G_BAI:onafterEngage( DefenderGroup, From, Event, To, AttackSetUnit self:SetTargetDistance( TargetCoord ) -- For RTB status check - local FromEngageAngle = DefenderCoord:GetAngleDegrees( DefenderCoord:GetDirectionVec3( TargetCoord ) ) - local ToWP = DefenderCoord:Translate( EngageDistance, FromEngageAngle, true ):WaypointAir( + local FromEngageAngle = TargetCoord:GetAngleDegrees( TargetCoord:GetDirectionVec3( DefenderCoord ) ) + local ToWP = TargetCoord:Translate( EngageDistance, FromEngageAngle, true ):WaypointAir( self.PatrolAltType or "RADIO", POINT_VEC3.RoutePointType.TurningPoint, POINT_VEC3.RoutePointAction.TurningPoint, @@ -116,35 +116,31 @@ function AI_A2G_BAI:onafterEngage( DefenderGroup, From, Event, To, AttackSetUnit EngageRoute[#EngageRoute+1] = ToWP - if TargetDistance <= EngageDistance * 3 then + local AttackUnitTasks = {} - local AttackUnitTasks = {} - - local AttackSetUnitPerThreatLevel = AttackSetUnit:GetSetPerThreatLevel( 10, 0 ) - for AttackUnitIndex, AttackUnit in ipairs( AttackSetUnitPerThreatLevel or {} ) do - if AttackUnit then - if AttackUnit:IsAlive() and AttackUnit:IsGround() then - self:T( { "BAI Unit:", AttackUnit:GetName() } ) - AttackUnitTasks[#AttackUnitTasks+1] = DefenderGroup:TaskAttackUnit( AttackUnit, true, false, nil, nil, EngageAltitude ) - end + local AttackSetUnitPerThreatLevel = AttackSetUnit:GetSetPerThreatLevel( 10, 0 ) + for AttackUnitIndex, AttackUnit in ipairs( AttackSetUnitPerThreatLevel or {} ) do + if AttackUnit then + if AttackUnit:IsAlive() and AttackUnit:IsGround() then + self:T( { "BAI Unit:", AttackUnit:GetName() } ) + AttackUnitTasks[#AttackUnitTasks+1] = DefenderGroup:TaskAttackUnit( AttackUnit, true, false, nil, nil, EngageAltitude ) end end - - if #AttackUnitTasks == 0 then - self:E( DefenderGroupName .. ": No targets found -> Going RTB") - self:Return() - self:__RTB( self.TaskDelay ) - else - DefenderGroup:OptionROEOpenFire() - DefenderGroup:OptionROTEvadeFire() - DefenderGroup:OptionKeepWeaponsOnThreat() - - AttackTasks[#AttackTasks+1] = DefenderGroup:TaskCombo( AttackUnitTasks ) - end + end + + if #AttackUnitTasks == 0 then + self:E( DefenderGroupName .. ": No targets found -> Going RTB") + self:Return() + self:__RTB( self.TaskDelay ) + else + DefenderGroup:OptionROEOpenFire() + DefenderGroup:OptionROTEvadeFire() + DefenderGroup:OptionKeepWeaponsOnThreat() + AttackTasks[#AttackTasks+1] = DefenderGroup:TaskCombo( AttackUnitTasks ) end - AttackTasks[#AttackTasks+1] = DefenderGroup:TaskFunction( "AI_A2G_ENGAGE.EngageRoute", self, AttackSetUnit ) + AttackTasks[#AttackTasks+1] = DefenderGroup:TaskFunction( "AI_A2G_ENGAGE.___Engage", self, AttackSetUnit ) EngageRoute[#EngageRoute].task = DefenderGroup:TaskCombo( AttackTasks ) DefenderGroup:Route( EngageRoute, self.TaskDelay ) diff --git a/Moose Development/Moose/AI/AI_A2G_CAS.lua b/Moose Development/Moose/AI/AI_A2G_CAS.lua index 1978803d0..c8773b3f5 100644 --- a/Moose Development/Moose/AI/AI_A2G_CAS.lua +++ b/Moose Development/Moose/AI/AI_A2G_CAS.lua @@ -136,7 +136,7 @@ function AI_A2G_CAS:onafterEngage( DefenderGroup, From, Event, To, AttackSetUnit end end - AttackTasks[#AttackTasks+1] = DefenderGroup:TaskFunction( "AI_A2G_ENGAGE.EngageRoute", self, AttackSetUnit ) + AttackTasks[#AttackTasks+1] = DefenderGroup:TaskFunction( "AI_A2G_ENGAGE.___Engage", self, AttackSetUnit ) EngageRoute[#EngageRoute].task = DefenderGroup:TaskCombo( AttackTasks ) DefenderGroup:Route( EngageRoute, self.TaskDelay ) diff --git a/Moose Development/Moose/AI/AI_A2G_Dispatcher.lua b/Moose Development/Moose/AI/AI_A2G_Dispatcher.lua index dd22a20c6..44d221ad2 100644 --- a/Moose Development/Moose/AI/AI_A2G_Dispatcher.lua +++ b/Moose Development/Moose/AI/AI_A2G_Dispatcher.lua @@ -3564,17 +3564,43 @@ do -- AI_A2G_DISPATCHER if DefenderTarget then Dispatcher:MessageToPlayers( "Squadron " .. Squadron.Name .. ", " .. DefenderName .. " airborne." ) - Fsm:Engage( DefenderTarget.Set ) -- Engage on the TargetSetUnit + Fsm:EngageRoute( DefenderTarget.Set ) -- Engage on the TargetSetUnit end end + function Fsm:OnAfterEngageRoute( Defender, From, Event, To, AttackSetUnit ) + self:F({"Engage Route", Defender:GetName()}) + --self:GetParent(self).onafterBirth( self, Defender, From, Event, To ) + + local DefenderName = Defender:GetName() + local Dispatcher = Fsm:GetDispatcher() -- #AI_A2G_DISPATCHER + local Squadron = Dispatcher:GetSquadronFromDefender( Defender ) + local FirstUnit = AttackSetUnit:GetFirst() + local Coordinate = FirstUnit:GetCoordinate() -- Core.Point#COORDINATE + + Dispatcher:MessageToPlayers( "Squadron " .. Squadron.Name .. ", " .. DefenderName .. " on route, bearing " .. Coordinate:ToString( Defender ) ) + end + + function Fsm:OnAfterEngage( Defender, From, Event, To, AttackSetUnit ) + self:F({"Engage Route", Defender:GetName()}) + --self:GetParent(self).onafterBirth( self, Defender, From, Event, To ) + + local DefenderName = Defender:GetName() + local Dispatcher = Fsm:GetDispatcher() -- #AI_A2G_DISPATCHER + local Squadron = Dispatcher:GetSquadronFromDefender( Defender ) + local FirstUnit = AttackSetUnit:GetFirst() + local Coordinate = FirstUnit:GetCoordinate() + + Dispatcher:MessageToPlayers( "Squadron " .. Squadron.Name .. ", " .. DefenderName .. " engaging target, bearing " .. Coordinate:ToString( Defender ) ) + end + function Fsm:onafterRTB( Defender, From, Event, To ) self:F({"Defender RTB", Defender:GetName()}) local DefenderName = Defender:GetName() local Dispatcher = self:GetDispatcher() -- #AI_A2G_DISPATCHER local Squadron = Dispatcher:GetSquadronFromDefender( Defender ) - Dispatcher:MessageToPlayers( "Squadron " .. Squadron.Name .. ", " .. DefenderName .. " returning." ) + Dispatcher:MessageToPlayers( "Squadron " .. Squadron.Name .. ", " .. DefenderName .. " RTB." ) self:GetParent(self).onafterRTB( self, Defender, From, Event, To ) @@ -3716,7 +3742,7 @@ do -- AI_A2G_DISPATCHER local SquadronOverhead = self:GetSquadronOverhead( SquadronName ) local Fsm = self:GetDefenderTaskFsm( DefenderGroup ) - Fsm:Engage( AttackerSet ) -- Engage on the TargetSetUnit + Fsm:EngageRoute( AttackerSet ) -- Engage on the TargetSetUnit self:SetDefenderTaskTarget( DefenderGroup, DetectedItem ) diff --git a/Moose Development/Moose/AI/AI_A2G_Engage.lua b/Moose Development/Moose/AI/AI_A2G_Engage.lua index 0035ed3ef..71a2eae6f 100644 --- a/Moose Development/Moose/AI/AI_A2G_Engage.lua +++ b/Moose Development/Moose/AI/AI_A2G_Engage.lua @@ -101,6 +101,51 @@ function AI_A2G_ENGAGE:New( AIGroup, EngageMinSpeed, EngageMaxSpeed, EngageFloor self.EngageFloorAltitude = EngageFloorAltitude or 1000 self.EngageCeilingAltitude = EngageCeilingAltitude or 1500 + self:AddTransition( { "Started", "Engaging", "Returning", "Airborne", "Patrolling" }, "EngageRoute", "Engaging" ) -- FSM_CONTROLLABLE Transition for type #AI_A2G_ENGAGE. + + --- OnBefore Transition Handler for Event EngageRoute. + -- @function [parent=#AI_A2G_ENGAGE] OnBeforeEngageRoute + -- @param #AI_A2G_ENGAGE self + -- @param Wrapper.Group#GROUP AIGroup The Group Object managed by the FSM. + -- @param #string From The From State string. + -- @param #string Event The Event string. + -- @param #string To The To State string. + -- @return #boolean Return false to cancel Transition. + + --- OnAfter Transition Handler for Event EngageRoute. + -- @function [parent=#AI_A2G_ENGAGE] OnAfterEngageRoute + -- @param #AI_A2G_ENGAGE self + -- @param Wrapper.Group#GROUP AIGroup The Group Object managed by the FSM. + -- @param #string From The From State string. + -- @param #string Event The Event string. + -- @param #string To The To State string. + + --- Synchronous Event Trigger for Event EngageRoute. + -- @function [parent=#AI_A2G_ENGAGE] EngageRoute + -- @param #AI_A2G_ENGAGE self + + --- Asynchronous Event Trigger for Event EngageRoute. + -- @function [parent=#AI_A2G_ENGAGE] __EngageRoute + -- @param #AI_A2G_ENGAGE self + -- @param #number Delay The delay in seconds. + +--- OnLeave Transition Handler for State Engaging. +-- @function [parent=#AI_A2G_ENGAGE] OnLeaveEngaging +-- @param #AI_A2G_ENGAGE self +-- @param Wrapper.Group#GROUP AIGroup The Group Object managed by the FSM. +-- @param #string From The From State string. +-- @param #string Event The Event string. +-- @param #string To The To State string. +-- @return #boolean Return false to cancel Transition. + +--- OnEnter Transition Handler for State Engaging. +-- @function [parent=#AI_A2G_ENGAGE] OnEnterEngaging +-- @param #AI_A2G_ENGAGE self +-- @param Wrapper.Group#GROUP AIGroup The Group Object managed by the FSM. +-- @param #string From The From State string. +-- @param #string Event The Event string. +-- @param #string To The To State string. + self:AddTransition( { "Started", "Engaging", "Returning", "Airborne", "Patrolling" }, "Engage", "Engaging" ) -- FSM_CONTROLLABLE Transition for type #AI_A2G_ENGAGE. --- OnBefore Transition Handler for Event Engage. @@ -119,7 +164,7 @@ function AI_A2G_ENGAGE:New( AIGroup, EngageMinSpeed, EngageMaxSpeed, EngageFloor -- @param #string From The From State string. -- @param #string Event The Event string. -- @param #string To The To State string. - + --- Synchronous Event Trigger for Event Engage. -- @function [parent=#AI_A2G_ENGAGE] Engage -- @param #AI_A2G_ENGAGE self @@ -293,9 +338,22 @@ end -- todo: need to fix this global function --- @param Wrapper.Group#GROUP AIControllable -function AI_A2G_ENGAGE.EngageRoute( AIGroup, Fsm, AttackSetUnit ) +function AI_A2G_ENGAGE.___EngageRoute( AIGroup, Fsm, AttackSetUnit ) - AIGroup:I( { "AI_A2G_ENGAGE.EngageRoute:", AIGroup:GetName() } ) + AIGroup:I( { "AI_A2G_ENGAGE.___EngageRoute:", AIGroup:GetName() } ) + + if AIGroup:IsAlive() then + Fsm:__EngageRoute( Fsm.TaskDelay, AttackSetUnit ) + + --local Task = AIGroup:TaskOrbitCircle( 4000, 400 ) + --AIGroup:SetTask( Task ) + end +end + +--- @param Wrapper.Group#GROUP AIControllable +function AI_A2G_ENGAGE.___Engage( AIGroup, Fsm, AttackSetUnit ) + + AIGroup:I( { "AI_A2G_ENGAGE.___Engage:", AIGroup:GetName() } ) if AIGroup:IsAlive() then Fsm:__Engage( Fsm.TaskDelay, AttackSetUnit ) @@ -336,7 +394,7 @@ end -- @param #string From The From State string. -- @param #string Event The Event string. -- @param #string To The To State string. -function AI_A2G_ENGAGE:onafterEngage( DefenderGroup, From, Event, To, AttackSetUnit ) +function AI_A2G_ENGAGE:onafterEngageRoute( DefenderGroup, From, Event, To, AttackSetUnit ) self:F( { DefenderGroup, From, Event, To, AttackSetUnit} ) @@ -376,3 +434,87 @@ function AI_A2G_ENGAGE:OnEventDead( EventData ) end end end + +--- @param #AI_A2G_ENGAGE self +-- @param Wrapper.Group#GROUP DefenderGroup The GroupGroup managed by the FSM. +-- @param #string From The From State string. +-- @param #string Event The Event string. +-- @param #string To The To State string. +function AI_A2G_ENGAGE:onafterEngageRoute( DefenderGroup, From, Event, To, AttackSetUnit ) + + self:F( { DefenderGroup, From, Event, To, AttackSetUnit} ) + + local DefenderGroupName = DefenderGroup:GetName() + + local AttackCount = AttackSetUnit:Count() + + if AttackCount > 0 then + + if DefenderGroup:IsAlive() then + + local EngageAltitude = math.random( self.EngageFloorAltitude, self.EngageCeilingAltitude ) + local EngageSpeed = math.random( self.EngageMinSpeed, self.EngageMaxSpeed ) + + -- Determine the distance to the target. + -- If it is less than 10km, then attack without a route. + -- Otherwise perform a route attack. + + local DefenderCoord = DefenderGroup:GetPointVec3() + DefenderCoord:SetY( EngageAltitude ) -- Ground targets don't have an altitude. + + local TargetCoord = AttackSetUnit:GetFirst():GetPointVec3() + TargetCoord:SetY( EngageAltitude ) -- Ground targets don't have an altitude. + + local TargetDistance = DefenderCoord:Get2DDistance( TargetCoord ) + local EngageDistance = ( DefenderGroup:IsHelicopter() and 5000 ) or ( DefenderGroup:IsAirPlane() and 10000 ) + + if TargetDistance <= EngageDistance * 3 then + + self:__Engage( 0.1, AttackSetUnit ) + + else + + local EngageRoute = {} + local AttackTasks = {} + + --- Calculate the target route point. + + local FromWP = DefenderCoord:WaypointAir( + self.PatrolAltType or "RADIO", + POINT_VEC3.RoutePointType.TurningPoint, + POINT_VEC3.RoutePointAction.TurningPoint, + EngageSpeed, + true + ) + + EngageRoute[#EngageRoute+1] = FromWP + + self:SetTargetDistance( TargetCoord ) -- For RTB status check + + local FromEngageAngle = DefenderCoord:GetAngleDegrees( DefenderCoord:GetDirectionVec3( TargetCoord ) ) + local ToWP = DefenderCoord:Translate( EngageDistance, FromEngageAngle, true ):WaypointAir( + self.PatrolAltType or "RADIO", + POINT_VEC3.RoutePointType.TurningPoint, + POINT_VEC3.RoutePointAction.TurningPoint, + EngageSpeed, + true + ) + + EngageRoute[#EngageRoute+1] = ToWP + + AttackTasks[#AttackTasks+1] = DefenderGroup:TaskFunction( "AI_A2G_ENGAGE.___EngageRoute", self, AttackSetUnit ) + EngageRoute[#EngageRoute].task = DefenderGroup:TaskCombo( AttackTasks ) + + DefenderGroup:OptionROEReturnFire() + DefenderGroup:OptionROTEvadeFire() + + DefenderGroup:Route( EngageRoute, self.TaskDelay ) + end + + end + else + self:E( DefenderGroupName .. ": No targets found -> Going RTB") + self:Return() + self:__RTB( self.TaskDelay ) + end +end \ No newline at end of file diff --git a/Moose Development/Moose/AI/AI_A2G_Patrol.lua b/Moose Development/Moose/AI/AI_A2G_Patrol.lua index 4e8a6e953..86b5d49dc 100644 --- a/Moose Development/Moose/AI/AI_A2G_Patrol.lua +++ b/Moose Development/Moose/AI/AI_A2G_Patrol.lua @@ -62,7 +62,7 @@ -- ### 2.2 AI_A2G_PATROL Events -- -- * **@{AI.AI_Patrol#AI_PATROL_ZONE.Start}**: Start the process. --- * **@{AI.AI_Patrol#AI_PATROL_ZONE.Route}**: Route the AI to a new random 3D point within the Patrol Zone. +-- * **@{AI.AI_Patrol#AI_PATROL_ZONE.PatrolRoute}**: Route the AI to a new random 3D point within the Patrol Zone. -- * **@{#AI_A2G_PATROL.Engage}**: Let the AI engage the bogeys. -- * **@{#AI_A2G_PATROL.Abort}**: Aborts the engagement and return patrolling in the patrol zone. -- * **@{AI.AI_Patrol#AI_PATROL_ZONE.RTB}**: Route the AI to the home base. @@ -173,10 +173,10 @@ function AI_A2G_PATROL:New( AIGroup, EngageMinSpeed, EngageMaxSpeed, EngageFloor -- @param #string Event The Event string. -- @param #string To The To State string. - self:AddTransition( "Patrolling", "Route", "Patrolling" ) -- FSM_CONTROLLABLE Transition for type #AI_A2G_PATROL. + self:AddTransition( "Patrolling", "PatrolRoute", "Patrolling" ) -- FSM_CONTROLLABLE Transition for type #AI_A2G_PATROL. - --- OnBefore Transition Handler for Event Route. - -- @function [parent=#AI_A2G_PATROL] OnBeforeRoute + --- OnBefore Transition Handler for Event PatrolRoute. + -- @function [parent=#AI_A2G_PATROL] OnBeforePatrolRoute -- @param #AI_A2G_PATROL self -- @param Wrapper.Group#GROUP AIPatrol The Group Object managed by the FSM. -- @param #string From The From State string. @@ -184,20 +184,20 @@ function AI_A2G_PATROL:New( AIGroup, EngageMinSpeed, EngageMaxSpeed, EngageFloor -- @param #string To The To State string. -- @return #boolean Return false to cancel Transition. - --- OnAfter Transition Handler for Event Route. - -- @function [parent=#AI_A2G_PATROL] OnAfterRoute + --- OnAfter Transition Handler for Event PatrolRoute. + -- @function [parent=#AI_A2G_PATROL] OnAfterPatrolRoute -- @param #AI_A2G_PATROL self -- @param Wrapper.Group#GROUP AIPatrol The Group Object managed by the FSM. -- @param #string From The From State string. -- @param #string Event The Event string. -- @param #string To The To State string. - --- Synchronous Event Trigger for Event Route. - -- @function [parent=#AI_A2G_PATROL] Route + --- Synchronous Event Trigger for Event PatrolRoute. + -- @function [parent=#AI_A2G_PATROL] PatrolRoute -- @param #AI_A2G_PATROL self - --- Asynchronous Event Trigger for Event Route. - -- @function [parent=#AI_A2G_PATROL] __Route + --- Asynchronous Event Trigger for Event PatrolRoute. + -- @function [parent=#AI_A2G_PATROL] __PatrolRoute -- @param #AI_A2G_PATROL self -- @param #number Delay The delay in seconds. @@ -234,12 +234,12 @@ function AI_A2G_PATROL:onafterPatrol( AIPatrol, From, Event, To ) self:ClearTargetDistance() - self:__Route( self.TaskDelay ) + self:__PatrolRoute( self.TaskDelay ) AIPatrol:OnReSpawn( function( PatrolGroup ) self:__Reset( self.TaskDelay ) - self:__Route( self.TaskDelay ) + self:__PatrolRoute( self.TaskDelay ) end ) end @@ -247,12 +247,12 @@ end --- @param Wrapper.Group#GROUP AIPatrol -- This statis method is called from the route path within the last task at the last waaypoint of the AIPatrol. -- Note that this method is required, as triggers the next route when patrolling for the AIPatrol. -function AI_A2G_PATROL.PatrolRoute( AIPatrol, Fsm ) +function AI_A2G_PATROL.___PatrolRoute( AIPatrol, Fsm ) - AIPatrol:F( { "AI_A2G_PATROL.PatrolRoute:", AIPatrol:GetName() } ) + AIPatrol:F( { "AI_A2G_PATROL.___PatrolRoute:", AIPatrol:GetName() } ) if AIPatrol:IsAlive() then - Fsm:Route() + Fsm:PatrolRoute() end end @@ -263,7 +263,7 @@ end -- @param #string From The From State string. -- @param #string Event The Event string. -- @param #string To The To State string. -function AI_A2G_PATROL:onafterRoute( AIPatrol, From, Event, To ) +function AI_A2G_PATROL:onafterPatrolRoute( AIPatrol, From, Event, To ) self:F2() @@ -300,7 +300,7 @@ function AI_A2G_PATROL:onafterRoute( AIPatrol, From, Event, To ) PatrolRoute[#PatrolRoute+1] = ToPatrolRoutePoint local Tasks = {} - Tasks[#Tasks+1] = AIPatrol:TaskFunction( "AI_A2G_PATROL.PatrolRoute", self ) + Tasks[#Tasks+1] = AIPatrol:TaskFunction( "AI_A2G_PATROL.___PatrolRoute", self ) PatrolRoute[#PatrolRoute].task = AIPatrol:TaskCombo( Tasks ) AIPatrol:OptionROEReturnFire() @@ -317,7 +317,7 @@ function AI_A2G_PATROL.Resume( AIPatrol, Fsm ) AIPatrol:F( { "AI_A2G_PATROL.Resume:", AIPatrol:GetName() } ) if AIPatrol:IsAlive() then Fsm:__Reset( self.TaskDelay ) - Fsm:__Route( self.TaskDelay ) + Fsm:__PatrolRoute( self.TaskDelay ) end end diff --git a/Moose Development/Moose/AI/AI_A2G_SEAD.lua b/Moose Development/Moose/AI/AI_A2G_SEAD.lua index f5d73a217..ae2f2dad1 100644 --- a/Moose Development/Moose/AI/AI_A2G_SEAD.lua +++ b/Moose Development/Moose/AI/AI_A2G_SEAD.lua @@ -194,7 +194,7 @@ function AI_A2G_SEAD:onafterEngage( DefenderGroup, From, Event, To, AttackSetUni end end - AttackTasks[#AttackTasks+1] = DefenderGroup:TaskFunction( "AI_A2G_ENGAGE.EngageRoute", self, AttackSetUnit ) + AttackTasks[#AttackTasks+1] = DefenderGroup:TaskFunction( "AI_A2G_ENGAGE.___Engage", self, AttackSetUnit ) EngageRoute[#EngageRoute].task = DefenderGroup:TaskCombo( AttackTasks ) DefenderGroup:Route( EngageRoute, self.TaskDelay ) diff --git a/Moose Development/Moose/Core/Base.lua b/Moose Development/Moose/Core/Base.lua index cca8fedeb..a72fb0e1f 100644 --- a/Moose Development/Moose/Core/Base.lua +++ b/Moose Development/Moose/Core/Base.lua @@ -809,8 +809,10 @@ do -- Scheduling function BASE:ScheduleStop( SchedulerFunction ) self:F3( { "ScheduleStop:" } ) - - _SCHEDULEDISPATCHER:Stop( self.Scheduler, self._.Schedules[SchedulerFunction] ) + + if self.Scheduler then + _SCHEDULEDISPATCHER:Stop( self.Scheduler, self._.Schedules[SchedulerFunction] ) + end end end diff --git a/Moose Development/Moose/Tasking/DetectionManager.lua b/Moose Development/Moose/Tasking/DetectionManager.lua index 4603adf82..e7caaea2d 100644 --- a/Moose Development/Moose/Tasking/DetectionManager.lua +++ b/Moose Development/Moose/Tasking/DetectionManager.lua @@ -57,6 +57,9 @@ do -- DETECTION MANAGER Detection = nil, } + --- @field Tasking.CommandCenter#COMMANDCENTER + DETECTION_MANAGER.CC = {} + --- FAC constructor. -- @param #DETECTION_MANAGER self -- @param Core.Set#SET_GROUP SetGroup @@ -238,7 +241,7 @@ do -- DETECTION MANAGER function DETECTION_MANAGER:MessageToPlayers( Message ) if self.CC then - self.CC:MessageToAll( Message ) + self.CC:MessageToCoalition( Message ) end return self diff --git a/Moose Development/Moose/Tasking/Task.lua b/Moose Development/Moose/Tasking/Task.lua index 0f4ec262d..a99012590 100644 --- a/Moose Development/Moose/Tasking/Task.lua +++ b/Moose Development/Moose/Tasking/Task.lua @@ -1786,7 +1786,7 @@ function TASK:GetPlayerCount() --R2.1 Get a count of the players. if PlayerGroup:IsAlive() == true then if self:IsGroupAssigned( PlayerGroup ) then local PlayerNames = PlayerGroup:GetPlayerNames() - PlayerCount = PlayerCount + #PlayerNames + PlayerCount = PlayerCount + ((PlayerNames) and #PlayerNames or 0) -- PlayerNames can be nil when there are no players. end end end diff --git a/Moose Development/Moose/Tasking/TaskInfo.lua b/Moose Development/Moose/Tasking/TaskInfo.lua index d3fc88350..e5b23aa16 100644 --- a/Moose Development/Moose/Tasking/TaskInfo.lua +++ b/Moose Development/Moose/Tasking/TaskInfo.lua @@ -24,7 +24,7 @@ TASKINFO = { ClassName = "TASKINFO", } ---- @type #TASKINFO.Detail #string A string that flags to document which level of detail needs to be shown in the report. +--- @type TASKINFO.Detail #string A string that flags to document which level of detail needs to be shown in the report. -- -- - "M" for Markings on the Map (F10). -- - "S" for Summary Reports. diff --git a/Moose Development/Moose/Tasking/Task_Capture_Dispatcher.lua b/Moose Development/Moose/Tasking/Task_Capture_Dispatcher.lua index f1b078028..d37ad7d5d 100644 --- a/Moose Development/Moose/Tasking/Task_Capture_Dispatcher.lua +++ b/Moose Development/Moose/Tasking/Task_Capture_Dispatcher.lua @@ -195,8 +195,8 @@ do -- TASK_CAPTURE_DISPATCHER --- Add a capture zone task. -- @param #TASK_CAPTURE_DISPATCHER self -- @param #string TaskPrefix (optional) The prefix of the capture zone task. - -- This prefix will be appended with a . + a number of 3 digits. - -- If no TaskPrefix is given, then "Capture" will be used as the prefix. + -- If no TaskPrefix is given, then "Capture" will be used as the TaskPrefix. + -- The TaskPrefix will be appended with a . + a number of 3 digits, if the TaskPrefix already exists in the task collection. -- @param Functional.CaptureZoneCoalition#ZONE_CAPTURE_COALITION CaptureZone The zone of the coalition to be captured as the task goal. -- @param #string Briefing The briefing of the task to be shown to the player. -- @return Tasking.Task_Capture_Zone#TASK_CAPTURE_ZONE @@ -205,9 +205,11 @@ do -- TASK_CAPTURE_DISPATCHER -- function TASK_CAPTURE_DISPATCHER:AddCaptureZoneTask( TaskPrefix, CaptureZone, Briefing ) - self.ZoneCount = self.ZoneCount + 1 - - local TaskName = string.format( ( TaskPrefix or "Capture" ) .. ".%03d", self.ZoneCount ) + local TaskName = TaskPrefix or "Capture" + if self.Zones[TaskName] then + self.ZoneCount = self.ZoneCount + 1 + TaskName = string.format( "%s.%03d", TaskName, self.ZoneCount ) + end self.Zones[TaskName] = {} self.Zones[TaskName].CaptureZone = CaptureZone @@ -241,15 +243,8 @@ do -- TASK_CAPTURE_DISPATCHER for TaskIndex, TaskData in pairs( self.Tasks ) do local Task = TaskData -- Tasking.Task#TASK if Task:IsStatePlanned() then - -- Here we need to check if the pilot is still existing. --- local DetectedItem = Detection:GetDetectedItemByIndex( TaskIndex ) --- if not DetectedItem then --- local TaskText = Task:GetName() --- for TaskGroupID, TaskGroup in pairs( self.SetGroup:GetSet() ) do --- Mission:GetCommandCenter():MessageToGroup( string.format( "Obsolete A2A task %s for %s removed.", TaskText, Mission:GetShortText() ), TaskGroup ) --- end + -- Here we need to check if the pilot is still existing. -- Task = self:RemoveTask( TaskIndex ) --- end end end