From e3a0a67fa595842d46d12fbbb325e39e07d63cbb Mon Sep 17 00:00:00 2001 From: FlightControl Date: Thu, 4 May 2017 15:53:25 +0200 Subject: [PATCH 1/9] Update Task Abort process --- Moose Development/Moose/Tasking/Task.lua | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/Moose Development/Moose/Tasking/Task.lua b/Moose Development/Moose/Tasking/Task.lua index 78fea4073..4f66198bf 100644 --- a/Moose Development/Moose/Tasking/Task.lua +++ b/Moose Development/Moose/Tasking/Task.lua @@ -277,14 +277,9 @@ function TASK:AbortUnit( PlayerUnit ) self:E( { IsAssignedToGroup = IsAssignedToGroup } ) if IsAssignedToGroup then local PlayerName = PlayerUnit:GetPlayerName() - self:UnAssignFromUnit( PlayerUnit ) self:MessageToGroups( PlayerName .. " aborted Task " .. self:GetName() ) - self:E( { TaskGroup = PlayerGroup:GetName(), GetUnits = PlayerGroup:GetUnits() } ) - if #PlayerGroup:GetUnits() == 1 then - self:UnAssignFromGroup( PlayerGroup ) - PlayerGroup:SetState( PlayerGroup, "Assigned", nil ) - end - self:Abort() + self:UnAssignFromGroup( PlayerGroup ) + --self:Abort() self:PlayerAborted( PlayerUnit ) end end From 16e6730dc1a808bce64ee13d7a11884ab161bd72 Mon Sep 17 00:00:00 2001 From: FlightControl Date: Thu, 4 May 2017 16:19:04 +0200 Subject: [PATCH 2/9] Trace --- Moose Development/Moose/Core/Set.lua | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/Moose Development/Moose/Core/Set.lua b/Moose Development/Moose/Core/Set.lua index 196982ffb..aaa06e3a8 100644 --- a/Moose Development/Moose/Core/Set.lua +++ b/Moose Development/Moose/Core/Set.lua @@ -165,11 +165,10 @@ end -- @param #SET_BASE self -- @param #string ObjectName function SET_BASE:Remove( ObjectName ) - self:F( ObjectName ) local t = self.Set[ObjectName] - self:E( { ObjectName, t } ) + self:F3( { ObjectName, t } ) if t then if t._next then @@ -1568,7 +1567,7 @@ end -- @return #string The name of the UNIT -- @return #table The UNIT function SET_UNIT:FindInDatabase( Event ) - self:E( { Event.IniDCSUnitName, self.Set[Event.IniDCSUnitName], Event } ) + self:F2( { Event.IniDCSUnitName, self.Set[Event.IniDCSUnitName], Event } ) return Event.IniDCSUnitName, self.Set[Event.IniDCSUnitName] From 7a84b6cc355108c4e274152aad9e5e34a5135e26 Mon Sep 17 00:00:00 2001 From: FlightControl Date: Fri, 5 May 2017 09:34:51 +0200 Subject: [PATCH 3/9] Improvements on task assignment logic --- Moose Development/Moose/Core/Fsm.lua | 2 +- Moose Development/Moose/Tasking/Task.lua | 266 +++++++++++------- .../Moose/Tasking/Task_A2G_Dispatcher.lua | 4 +- 3 files changed, 171 insertions(+), 101 deletions(-) diff --git a/Moose Development/Moose/Core/Fsm.lua b/Moose Development/Moose/Core/Fsm.lua index d2333ffdc..db7a0b40a 100644 --- a/Moose Development/Moose/Core/Fsm.lua +++ b/Moose Development/Moose/Core/Fsm.lua @@ -1121,7 +1121,7 @@ end self:T( { ProcessUnit, From, Event, To, Dummy, self:IsTrace() } ) if self:IsTrace() then - MESSAGE:New( "@ Process " .. self:GetClassNameAndID() .. " : " .. Event .. " changed to state " .. To, 2 ):ToAll() + --MESSAGE:New( "@ Process " .. self:GetClassNameAndID() .. " : " .. Event .. " changed to state " .. To, 2 ):ToAll() end self:T( { Scores = self._Scores, To = To } ) diff --git a/Moose Development/Moose/Tasking/Task.lua b/Moose Development/Moose/Tasking/Task.lua index 4f66198bf..07fa7ee00 100644 --- a/Moose Development/Moose/Tasking/Task.lua +++ b/Moose Development/Moose/Tasking/Task.lua @@ -78,6 +78,7 @@ TASK = { Mission = nil, CommandCenter = nil, TimeOut = 0, + AssignedGroups = {}, } --- FSM PlayerAborted event handler prototype for TASK. @@ -164,6 +165,7 @@ function TASK:New( Mission, SetGroupAssign, TaskName, TaskType ) self:AddTransition( "Planned", "Assign", "Assigned" ) self:AddTransition( "Assigned", "AssignUnit", "Assigned" ) self:AddTransition( "Assigned", "Success", "Success" ) + self:AddTransition( "Assigned", "Hold", "Hold" ) self:AddTransition( "Assigned", "Fail", "Failed" ) self:AddTransition( "Assigned", "Abort", "Aborted" ) self:AddTransition( "Assigned", "Cancel", "Cancelled" ) @@ -241,9 +243,9 @@ function TASK:JoinUnit( PlayerUnit, PlayerGroup ) --self:MessageToGroups( PlayerUnit:GetPlayerName() .. " is planning to join Task " .. self:GetName() ) end if self:IsStateAssigned() then - local IsAssignedToGroup = self:IsAssignedToGroup( PlayerGroup ) - self:E( { IsAssignedToGroup = IsAssignedToGroup } ) - if IsAssignedToGroup then + local IsGroupAssigned = self:IsGroupAssigned( PlayerGroup ) + self:E( { IsGroupAssigned = IsGroupAssigned } ) + if IsGroupAssigned then self:AssignToUnit( PlayerUnit ) self:MessageToGroups( PlayerUnit:GetPlayerName() .. " joined Task " .. self:GetName() ) end @@ -273,15 +275,29 @@ function TASK:AbortUnit( PlayerUnit ) -- Check if the PlayerGroup is already assigned to the Task. If yes, the PlayerGroup is aborted from the Task. -- If the PlayerUnit was the last unit of the PlayerGroup, the menu needs to be removed from the Group. if self:IsStateAssigned() then - local IsAssignedToGroup = self:IsAssignedToGroup( PlayerGroup ) - self:E( { IsAssignedToGroup = IsAssignedToGroup } ) - if IsAssignedToGroup then + local IsGroupAssigned = self:IsGroupAssigned( PlayerGroup ) + self:E( { IsGroupAssigned = IsGroupAssigned } ) + if IsGroupAssigned then local PlayerName = PlayerUnit:GetPlayerName() self:MessageToGroups( PlayerName .. " aborted Task " .. self:GetName() ) self:UnAssignFromGroup( PlayerGroup ) --self:Abort() + + -- Now check if the task needs to go to hold... + -- It will go to hold, if there are no players in the mission... + + local IsRemaining = false + for GroupName, GroupData in pairs( PlayerGroups ) do + IsRemaining = ( IsRemaining == false ) and self:IsGroupAssigned( PlayerGroup ) or IsRemaining + end + + if IsRemaining == false then + self:Abort() + end + self:PlayerAborted( PlayerUnit ) end + end end @@ -308,14 +324,14 @@ function TASK:CrashUnit( PlayerUnit ) -- Check if the PlayerGroup is already assigned to the Task. If yes, the PlayerGroup is aborted from the Task. -- If the PlayerUnit was the last unit of the PlayerGroup, the menu needs to be removed from the Group. if self:IsStateAssigned() then - local IsAssignedToGroup = self:IsAssignedToGroup( PlayerGroup ) - self:E( { IsAssignedToGroup = IsAssignedToGroup } ) - if IsAssignedToGroup then + local IsGroupAssigned = self:IsGroupAssigned( PlayerGroup ) + self:E( { IsGroupAssigned = IsGroupAssigned } ) + if IsGroupAssigned then self:UnAssignFromUnit( PlayerUnit ) self:MessageToGroups( PlayerUnit:GetPlayerName() .. " crashed in Task " .. self:GetName() ) self:E( { TaskGroup = PlayerGroup:GetName(), GetUnits = PlayerGroup:GetUnits() } ) if #PlayerGroup:GetUnits() == 1 then - PlayerGroup:SetState( PlayerGroup, "Assigned", nil ) + self:ClearGroupAssignment( PlayerGroup ) end self:PlayerCrashed( PlayerUnit ) end @@ -343,40 +359,136 @@ function TASK:GetGroups() return self.SetGroup end +do -- Group Assignment + --- Returns if the @{Task} is assigned to the Group. + -- @param #TASK self + -- @param Wrapper.Group#GROUP TaskGroup + -- @return #boolean + function TASK:IsGroupAssigned( TaskGroup ) + + local TaskGroupName = TaskGroup:GetName() + + if self.AssignedGroups[TaskGroupName] == TaskGroup then + self:T( { "Task is assigned to:", TaskGroup:GetName() } ) + return true + end + + self:T( { "Task is not assigned to:", TaskGroup:GetName() } ) + return false + end + + + --- Set @{Group} assigned to the @{Task}. + -- @param #TASK self + -- @param Wrapper.Group#GROUP TaskGroup + -- @return #TASK + function TASK:SetGroupAssigned( TaskGroup ) + + local TaskName = self:GetName() + local TaskGroupName = TaskGroup:GetName() + + self.AssignedGroups[TaskGroupName] = TaskGroup + self:E( string.format( "Task %s is assigned to %s", TaskName, TaskGroupName ) ) + + local SetAssignedGroups = self:GetGroups() + + SetAssignedGroups:ForEachGroup( + function( AssignedGroup ) + if self:IsGroupAssigned(AssignedGroup) then + self:GetMission():GetCommandCenter():MessageToGroup( string.format( "Task %s is assigned to group %s.", TaskName, TaskGroupName ), AssignedGroup ) + else + self:GetMission():GetCommandCenter():MessageToGroup( string.format( "Task %s is assigned to your group.", TaskName ), AssignedGroup ) + end + end + ) + + return self + end + + --- Clear the @{Group} assignment from the @{Task}. + -- @param #TASK self + -- @param Wrapper.Group#GROUP TaskGroup + -- @return #TASK + function TASK:ClearGroupAssignment( TaskGroup ) + + local TaskName = self:GetName() + local TaskGroupName = TaskGroup:GetName() + + self.AssignedGroups[TaskGroupName] = nil + self:E( string.format( "Task %s is unassigned to %s", TaskName, TaskGroupName ) ) + + local SetAssignedGroups = self:GetGroups() ---- Assign the @{Task} to a @{Group}. --- @param #TASK self --- @param Wrapper.Group#GROUP TaskGroup --- @return #TASK -function TASK:AssignToGroup( TaskGroup ) - self:F( TaskGroup:GetName() ) + SetAssignedGroups:ForEachGroup( + function( AssignedGroup ) + if self:IsGroupAssigned(AssignedGroup) then + self:GetMission():GetCommandCenter():MessageToGroup( string.format( "Task %s is unassigned from group %s.", TaskName, TaskGroupName ), AssignedGroup ) + else + self:GetMission():GetCommandCenter():MessageToGroup( string.format( "Task %s is unassigned from your group.", TaskName ), AssignedGroup ) + end + end + ) + + return self + end - local TaskGroupName = TaskGroup:GetName() +end + +do -- Group Assignment + + --- Assign the @{Task} to a @{Group}. + -- @param #TASK self + -- @param Wrapper.Group#GROUP TaskGroup + -- @return #TASK + function TASK:AssignToGroup( TaskGroup ) + self:F( TaskGroup:GetName() ) + + local TaskGroupName = TaskGroup:GetName() + + self:SetGroupAssigned( TaskGroup ) + + local Mission = self:GetMission() + local MissionMenu = Mission:GetMenu( TaskGroup ) + MissionMenu:RemoveSubMenus() + + self:SetAssignedMenuForGroup( TaskGroup ) + + local TaskUnits = TaskGroup:GetUnits() + for UnitID, UnitData in pairs( TaskUnits ) do + local TaskUnit = UnitData -- Wrapper.Unit#UNIT + local PlayerName = TaskUnit:GetPlayerName() + self:E(PlayerName) + if PlayerName ~= nil or PlayerName ~= "" then + self:AssignToUnit( TaskUnit ) + end + end + + return self + end - TaskGroup:SetState( TaskGroup, "Assigned", self ) + --- UnAssign the @{Task} from a @{Group}. + -- @param #TASK self + function TASK:UnAssignFromGroup( TaskGroup ) + self:F2( { TaskGroup } ) + + self:ClearGroupAssignment( TaskGroup ) - self:E("Task is assigned to " .. TaskGroup:GetName() ) + self:RemoveAssignedMenuForGroup( TaskGroup ) - local Mission = self:GetMission() - local MissionMenu = Mission:GetMenu( TaskGroup ) - MissionMenu:RemoveSubMenus() - - self:SetAssignedMenuForGroup( TaskGroup ) - - local TaskUnits = TaskGroup:GetUnits() - for UnitID, UnitData in pairs( TaskUnits ) do - local TaskUnit = UnitData -- Wrapper.Unit#UNIT - local PlayerName = TaskUnit:GetPlayerName() - self:E(PlayerName) - if PlayerName ~= nil or PlayerName ~= "" then - self:AssignToUnit( TaskUnit ) + local TaskUnits = TaskGroup:GetUnits() + for UnitID, UnitData in pairs( TaskUnits ) do + local TaskUnit = UnitData -- Wrapper.Unit#UNIT + local PlayerName = TaskUnit:GetPlayerName() + if PlayerName ~= nil or PlayerName ~= "" then + self:UnAssignFromUnit( TaskUnit ) + end end end - return self end + --- -- @param #TASK self -- @param Wrapper.Group#GROUP FindGroup @@ -452,7 +564,7 @@ function TASK:SendBriefingToAssignedGroups() for TaskGroupName, TaskGroup in pairs( self.SetGroup:GetSet() ) do - if self:IsAssignedToGroup( TaskGroup ) then + if self:IsGroupAssigned( TaskGroup ) then TaskGroup:Message( self.TaskBriefing, 60 ) end end @@ -469,47 +581,7 @@ function TASK:UnAssignFromGroups() end end ---- UnAssign the @{Task} from a @{Group}. --- @param #TASK self -function TASK:UnAssignFromGroup( TaskGroup ) - self:F2( { TaskGroup } ) - - TaskGroup:SetState( TaskGroup, "Assigned", nil ) - self:E("Task is unassigned from " .. TaskGroup:GetName() ) - - self:RemoveAssignedMenuForGroup( TaskGroup ) - - local TaskUnits = TaskGroup:GetUnits() - for UnitID, UnitData in pairs( TaskUnits ) do - local TaskUnit = UnitData -- Wrapper.Unit#UNIT - local PlayerName = TaskUnit:GetPlayerName() - if PlayerName ~= nil or PlayerName ~= "" then - self:UnAssignFromUnit( TaskUnit ) - end - end -end - - - ---- Returns if the @{Task} is assigned to the Group. --- @param #TASK self --- @param Wrapper.Group#GROUP TaskGroup --- @return #boolean -function TASK:IsAssignedToGroup( TaskGroup ) - - local TaskGroupName = TaskGroup:GetName() - - if self:IsStateAssigned() then - if TaskGroup:GetState( TaskGroup, "Assigned" ) == self then - self:T( { "Task is assigned to:", TaskGroup:GetName() } ) - return true - end - end - - self:T( { "Task is not assigned to:", TaskGroup:GetName() } ) - return false -end --- Returns if the @{Task} has still alive and assigned Units. -- @param #TASK self @@ -519,7 +591,7 @@ function TASK:HasAliveUnits() for TaskGroupID, TaskGroup in pairs( self.SetGroup:GetSet() ) do if self:IsStateAssigned() then - if self:IsAssignedToGroup( TaskGroup ) then + if self:IsGroupAssigned( TaskGroup ) then for TaskUnitID, TaskUnit in pairs( TaskGroup:GetUnits() ) do if TaskUnit:IsAlive() then self:T( { HasAliveUnits = true } ) @@ -560,9 +632,9 @@ function TASK:SetMenu( MenuTime ) --R2.1 Mission Reports and Task Reports added. MENU_GROUP_COMMAND:New( TaskGroup, "Report Held Tasks", TaskGroup.MenuReports, Mission.MenuReportOverview, Mission, TaskGroup, "Hold" ) end - if self:IsStatePlanned() or self:IsStateReplanned() then +-- if self:IsStatePlanned() or self:IsStateReplanned() then self:SetMenuForGroup( TaskGroup, MenuTime ) - end +-- end end end end @@ -575,12 +647,10 @@ end -- @return #TASK function TASK:SetMenuForGroup( TaskGroup, MenuTime ) - if not TaskGroup:GetState( TaskGroup, "Assigned" ) then - self:SetPlannedMenuForGroup( TaskGroup, self:GetTaskName(), MenuTime ) + if self:IsGroupAssigned( TaskGroup ) then + self:SetAssignedMenuForGroup( TaskGroup, MenuTime ) else - if not self:IsAssignedToGroup( TaskGroup ) then - self:SetAssignedMenuForGroup( TaskGroup, MenuTime ) - end + self:SetPlannedMenuForGroup( TaskGroup, self:GetTaskName(), MenuTime ) end end @@ -640,7 +710,7 @@ function TASK:RemoveMenu( MenuTime ) for TaskGroupID, TaskGroup in pairs( self.SetGroup:GetSet() ) do local TaskGroup = TaskGroup -- Wrapper.Group#GROUP if TaskGroup:IsAlive() and TaskGroup:GetPlayerNames() then - if not self:IsAssignedToGroup( TaskGroup ) then + if not self:IsGroupAssigned( TaskGroup ) then self:RemovePlannedMenuForGroup( TaskGroup, MenuTime ) end end @@ -723,8 +793,6 @@ function TASK:MenuTaskAbort( TaskGroup ) self:AbortUnit( PlayerUnit ) end - self:GetMission():GetCommandCenter():GetPositionable():MessageToSetGroup( "Abort", 15, self.SetGroup ) - end @@ -1020,14 +1088,17 @@ function TASK:onenterAssigned( From, Event, To, PlayerUnit, PlayerName ) self:E( { "Task Assigned", self.Dispatcher } ) - self:MessageToGroups( "Task " .. self:GetName() .. " has been assigned to your group." ) - - if self.Dispatcher then - self:E( "Firing Assign event " ) - self.Dispatcher:Assign( self, PlayerUnit, PlayerName ) + if From ~= "Assigned" then + self:GetMission():GetCommandCenter():MessageToCoalition( "Task " .. self:GetName() .. " is assigned." ) + if self.Dispatcher then + self:E( "Firing Assign event " ) + self.Dispatcher:Assign( self, PlayerUnit, PlayerName ) + end + + self:GetMission():__Start( 1 ) + + self:SetMenu() end - - self:GetMission():__Start( 1 ) end @@ -1056,12 +1127,13 @@ end function TASK:onenterAborted( From, Event, To ) self:E( "Task Aborted" ) - - self:GetMission():GetCommandCenter():MessageToCoalition( "Task " .. self:GetName() .. " has been aborted! Task may be replanned." ) - self:UnAssignFromGroups() + if From ~= "Aborted" then + self:GetMission():GetCommandCenter():MessageToCoalition( "Task " .. self:GetName() .. " has been aborted! Task may be replanned." ) + self:__Replan( 5 ) + self:SetMenu() + end - self:__Replan( 5 ) end --- FSM function for a TASK @@ -1101,7 +1173,7 @@ end function TASK:onstatechange( From, Event, To ) if self:IsTrace() then - MESSAGE:New( "@ Task " .. self.TaskName .. " : " .. Event .. " changed to state " .. To, 2 ):ToAll() + --MESSAGE:New( "@ Task " .. self.TaskName .. " : " .. From .. " changed to " .. To .. " by " .. Event, 2 ):ToAll() end if self.Scores[To] then diff --git a/Moose Development/Moose/Tasking/Task_A2G_Dispatcher.lua b/Moose Development/Moose/Tasking/Task_A2G_Dispatcher.lua index 28842bcab..b1a6e4348 100644 --- a/Moose Development/Moose/Tasking/Task_A2G_Dispatcher.lua +++ b/Moose Development/Moose/Tasking/Task_A2G_Dispatcher.lua @@ -277,9 +277,7 @@ do -- TASK_A2G_DISPATCHER Mission:GetCommandCenter():SetMenu() for TaskGroupID, TaskGroup in pairs( self.SetGroup:GetSet() ) do - if not TaskGroup:GetState( TaskGroup, "Assigned" ) then - Mission:GetCommandCenter():MessageToGroup( string.format( "Mission *%s* has tasks %s. Subscribe to a task using the Mission *Overlord* radio menu.", Mission:GetName(), TaskReport:Text(", ") ), TaskGroup ) - end + Mission:GetCommandCenter():MessageToGroup( string.format( "Mission *%s* has tasks %s. Subscribe to a task using the Mission *Overlord* radio menu.", Mission:GetName(), TaskReport:Text(", ") ), TaskGroup ) end end From 99cbe0c8bb901ed205ab256e74ac968fcc652463 Mon Sep 17 00:00:00 2001 From: FlightControl Date: Fri, 5 May 2017 10:50:12 +0200 Subject: [PATCH 4/9] Heavy rework of the menus and now it is much better --- Moose Development/Moose/Core/Menu.lua | 2 +- .../Moose/Tasking/CommandCenter.lua | 1 - Moose Development/Moose/Tasking/Mission.lua | 58 ++++++++++- Moose Development/Moose/Tasking/Task.lua | 97 +++++++++++-------- Moose Development/Moose/Wrapper/Group.lua | 2 +- 5 files changed, 115 insertions(+), 45 deletions(-) diff --git a/Moose Development/Moose/Core/Menu.lua b/Moose Development/Moose/Core/Menu.lua index c38f763d4..70028b829 100644 --- a/Moose Development/Moose/Core/Menu.lua +++ b/Moose Development/Moose/Core/Menu.lua @@ -82,7 +82,7 @@ do -- MENU_BASE -- @param #string MenuText The text of the child menu. -- @return #MENU_BASE function MENU_BASE:GetMenu( MenuText ) - self:F( { self.Menus, MenuText } ) + self:F2( { Menu = self.Menus[MenuText] } ) return self.Menus[MenuText] end diff --git a/Moose Development/Moose/Tasking/CommandCenter.lua b/Moose Development/Moose/Tasking/CommandCenter.lua index 7b05761b1..2a696ead2 100644 --- a/Moose Development/Moose/Tasking/CommandCenter.lua +++ b/Moose Development/Moose/Tasking/CommandCenter.lua @@ -269,7 +269,6 @@ end -- @param #COMMANDCENTER self -- @return Core.Menu#MENU_COALITION function COMMANDCENTER:GetMenu() - self:F() return self.CommandCenterMenu end diff --git a/Moose Development/Moose/Tasking/Mission.lua b/Moose Development/Moose/Tasking/Mission.lua index 00451544a..54032cda1 100644 --- a/Moose Development/Moose/Tasking/Mission.lua +++ b/Moose Development/Moose/Tasking/Mission.lua @@ -12,6 +12,7 @@ MISSION = { ClassName = "MISSION", Name = "", MissionStatus = "PENDING", + AssignedGroups = {}, } --- This is the main MISSION declaration method. Each Mission is like the master or a Mission orchestration between, Clients, Tasks, Stages etc. @@ -366,7 +367,7 @@ end -- @param #MISSION self -- @param #number MenuTime function MISSION:SetMenu( MenuTime ) - self:F() + self:F( { self:GetName(), MenuTime } ) for _, TaskData in pairs( self:GetTasks() ) do local Task = TaskData -- Tasking.Task#TASK @@ -378,7 +379,7 @@ end -- @param #MISSION self -- @param #number MenuTime function MISSION:RemoveMenu( MenuTime ) - self:F() + self:F( { self:GetName(), MenuTime } ) for _, Task in pairs( self:GetTasks() ) do local Task = Task -- Tasking.Task#TASK @@ -387,6 +388,58 @@ function MISSION:RemoveMenu( MenuTime ) end +do -- Group Assignment + + --- Returns if the @{Mission} is assigned to the Group. + -- @param #MISSION self + -- @param Wrapper.Group#GROUP MissionGroup + -- @return #boolean + function MISSION:IsGroupAssigned( MissionGroup ) + + local MissionGroupName = MissionGroup:GetName() + + if self.AssignedGroups[MissionGroupName] == MissionGroup then + self:T( { "Mission is assigned to:", MissionGroup:GetName() } ) + return true + end + + self:T( { "Mission is not assigned to:", MissionGroup:GetName() } ) + return false + end + + + --- Set @{Group} assigned to the @{Mission}. + -- @param #MISSION self + -- @param Wrapper.Group#GROUP MissionGroup + -- @return #MISSION + function MISSION:SetGroupAssigned( MissionGroup ) + + local MissionName = self:GetName() + local MissionGroupName = MissionGroup:GetName() + + self.AssignedGroups[MissionGroupName] = MissionGroup + self:E( string.format( "Mission %s is assigned to %s", MissionName, MissionGroupName ) ) + + return self + end + + --- Clear the @{Group} assignment from the @{Mission}. + -- @param #MISSION self + -- @param Wrapper.Group#GROUP MissionGroup + -- @return #MISSION + function MISSION:ClearGroupAssignment( MissionGroup ) + + local MissionName = self:GetName() + local MissionGroupName = MissionGroup:GetName() + + self.AssignedGroups[MissionGroupName] = nil + self:E( string.format( "Mission %s is unassigned to %s", MissionName, MissionGroupName ) ) + + return self + end + +end + --- Gets the COMMANDCENTER. -- @param #MISSION self -- @return Tasking.CommandCenter#COMMANDCENTER @@ -642,7 +695,6 @@ end -- Tasks = Mission:GetTasks() -- env.info( "Task 2 Completion = " .. Tasks[2]:GetGoalPercentage() .. "%" ) function MISSION:GetTasks() - self:F() return self.Tasks end diff --git a/Moose Development/Moose/Tasking/Task.lua b/Moose Development/Moose/Tasking/Task.lua index 07fa7ee00..be5fb9b0d 100644 --- a/Moose Development/Moose/Tasking/Task.lua +++ b/Moose Development/Moose/Tasking/Task.lua @@ -391,6 +391,9 @@ do -- Group Assignment self.AssignedGroups[TaskGroupName] = TaskGroup self:E( string.format( "Task %s is assigned to %s", TaskName, TaskGroupName ) ) + -- Set the group to be assigned at mission level. This allows to decide the menu options on mission level for this group. + self:GetMission():SetGroupAssigned( TaskGroup ) + local SetAssignedGroups = self:GetGroups() SetAssignedGroups:ForEachGroup( @@ -417,6 +420,9 @@ do -- Group Assignment self.AssignedGroups[TaskGroupName] = nil self:E( string.format( "Task %s is unassigned to %s", TaskName, TaskGroupName ) ) + + -- Set the group to be assigned at mission level. This allows to decide the menu options on mission level for this group. + self:GetMission():ClearGroupAssignment( TaskGroup ) local SetAssignedGroups = self:GetGroups() @@ -448,12 +454,6 @@ do -- Group Assignment self:SetGroupAssigned( TaskGroup ) - local Mission = self:GetMission() - local MissionMenu = Mission:GetMenu( TaskGroup ) - MissionMenu:RemoveSubMenus() - - self:SetAssignedMenuForGroup( TaskGroup ) - local TaskUnits = TaskGroup:GetUnits() for UnitID, UnitData in pairs( TaskUnits ) do local TaskUnit = UnitData -- Wrapper.Unit#UNIT @@ -463,6 +463,10 @@ do -- Group Assignment self:AssignToUnit( TaskUnit ) end end + + local Mission = self:GetMission() + local CommandCenter = Mission:GetCommandCenter() + CommandCenter:SetMenu() return self end @@ -474,8 +478,6 @@ do -- Group Assignment self:ClearGroupAssignment( TaskGroup ) - self:RemoveAssignedMenuForGroup( TaskGroup ) - local TaskUnits = TaskGroup:GetUnits() for UnitID, UnitData in pairs( TaskUnits ) do local TaskUnit = UnitData -- Wrapper.Unit#UNIT @@ -484,8 +486,11 @@ do -- Group Assignment self:UnAssignFromUnit( TaskUnit ) end end + + local Mission = self:GetMission() + local CommandCenter = Mission:GetCommandCenter() + CommandCenter:SetMenu() end - end @@ -611,9 +616,9 @@ end -- @param #number MenuTime -- @return #TASK function TASK:SetMenu( MenuTime ) --R2.1 Mission Reports and Task Reports added. Fixes issue #424. - self:F() + self:F( { self:GetName(), MenuTime } ) - self.SetGroup:Flush() + --self.SetGroup:Flush() for TaskGroupID, TaskGroupData in pairs( self.SetGroup:GetSet() ) do local TaskGroup = TaskGroupData -- Wrapper.Group#GROUP if TaskGroup:IsAlive() and TaskGroup:GetPlayerNames() then @@ -647,10 +652,9 @@ end -- @return #TASK function TASK:SetMenuForGroup( TaskGroup, MenuTime ) + self:SetPlannedMenuForGroup( TaskGroup, MenuTime ) if self:IsGroupAssigned( TaskGroup ) then self:SetAssignedMenuForGroup( TaskGroup, MenuTime ) - else - self:SetPlannedMenuForGroup( TaskGroup, self:GetTaskName(), MenuTime ) end end @@ -661,7 +665,7 @@ end -- @param #string MenuText The menu text. -- @param #number MenuTime -- @return #TASK self -function TASK:SetPlannedMenuForGroup( TaskGroup, MenuText, MenuTime ) +function TASK:SetPlannedMenuForGroup( TaskGroup, MenuTime ) self:E( TaskGroup:GetName() ) local Mission = self:GetMission() @@ -669,14 +673,21 @@ function TASK:SetPlannedMenuForGroup( TaskGroup, MenuText, MenuTime ) local CommandCenter = Mission:GetCommandCenter() local CommandCenterMenu = CommandCenter:GetMenu() + local TaskType = self:GetType() + local TaskText = self:GetName() + local MissionMenu = MENU_GROUP:New( TaskGroup, MissionName, CommandCenterMenu ):SetTime( MenuTime ) - local MissionMenu = Mission:GetMenu( TaskGroup ) - local TaskType = self:GetType() - local TaskTypeMenu = MENU_GROUP:New( TaskGroup, TaskType, MissionMenu ):SetTime( MenuTime ) - local TaskMenu = MENU_GROUP_COMMAND:New( TaskGroup, MenuText, TaskTypeMenu, self.MenuAssignToGroup, { self = self, TaskGroup = TaskGroup } ):SetTime( MenuTime ):SetRemoveParent( true ) + local TaskPlannedMenu = MENU_GROUP:New( TaskGroup, "Planned Tasks", MissionMenu ):SetTime( MenuTime ) + local TaskTypeMenu = MENU_GROUP:New( TaskGroup, TaskType, TaskPlannedMenu ):SetTime( MenuTime ):SetRemoveParent( true ) + local TaskTypeMenu = MENU_GROUP:New( TaskGroup, TaskText, TaskTypeMenu ):SetTime( MenuTime ):SetRemoveParent( true ) + local ReportTaskMenu = MENU_GROUP_COMMAND:New( TaskGroup, string.format( "Report Task %s Status", TaskText ), TaskTypeMenu, self.MenuTaskStatus, self, TaskGroup ):SetTime( MenuTime ):SetRemoveParent( true ) + + if not Mission:IsGroupAssigned( TaskGroup ) then + local JoinTaskMenu = MENU_GROUP_COMMAND:New( TaskGroup, string.format( "Join Task %s", TaskText ), TaskTypeMenu, self.MenuAssignToGroup, { self = self, TaskGroup = TaskGroup } ):SetTime( MenuTime ):SetRemoveParent( true ) + end return self end @@ -687,15 +698,23 @@ end -- @param #number MenuTime -- @return #TASK self function TASK:SetAssignedMenuForGroup( TaskGroup, MenuTime ) - self:E( TaskGroup:GetName() ) + self:F( { TaskGroup:GetName(), MenuTime } ) local Mission = self:GetMission() + local MissionName = Mission:GetName() + local CommandCenter = Mission:GetCommandCenter() + local CommandCenterMenu = CommandCenter:GetMenu() + + local TaskType = self:GetType() + local TaskText = self:GetName() + + local MissionMenu = MENU_GROUP:New( TaskGroup, MissionName, CommandCenterMenu ):SetTime( MenuTime ) local MissionMenu = Mission:GetMenu( TaskGroup ) - self:E( { MissionMenu = MissionMenu } ) - local TaskTypeMenu = MENU_GROUP_COMMAND:New( TaskGroup, "Task Status", MissionMenu, self.MenuTaskStatus, self, TaskGroup ):SetTime( MenuTime ) - local TaskMenu = MENU_GROUP_COMMAND:New( TaskGroup, "Abort Task", MissionMenu, self.MenuTaskAbort, self, TaskGroup ):SetTime( MenuTime ) + local TaskAssignedMenu = MENU_GROUP:New( TaskGroup, string.format( "Assigned Task %s", TaskText ), MissionMenu ):SetTime( MenuTime ) + local TaskTypeMenu = MENU_GROUP_COMMAND:New( TaskGroup, string.format( "Report Task %s Status", TaskText ), TaskAssignedMenu, self.MenuTaskStatus, self, TaskGroup ):SetTime( MenuTime ):SetRemoveParent( true ) + local TaskMenu = MENU_GROUP_COMMAND:New( TaskGroup, string.format( "Abort Group from Task %s", TaskText ), TaskAssignedMenu, self.MenuTaskAbort, self, TaskGroup ):SetTime( MenuTime ):SetRemoveParent( true ) return self end @@ -705,14 +724,12 @@ end -- @param #number MenuTime -- @return #TASK function TASK:RemoveMenu( MenuTime ) - self:F() + self:F( { self:GetName(), MenuTime } ) for TaskGroupID, TaskGroup in pairs( self.SetGroup:GetSet() ) do local TaskGroup = TaskGroup -- Wrapper.Group#GROUP if TaskGroup:IsAlive() and TaskGroup:GetPlayerNames() then - if not self:IsGroupAssigned( TaskGroup ) then - self:RemovePlannedMenuForGroup( TaskGroup, MenuTime ) - end + self:RefreshMenus( TaskGroup, MenuTime ) end end end @@ -723,24 +740,26 @@ end -- @param Wrapper.Group#GROUP TaskGroup -- @param #number MenuTime -- @return #TASK self -function TASK:RemovePlannedMenuForGroup( TaskGroup, MenuTime ) - self:F() +function TASK:RefreshMenus( TaskGroup, MenuTime ) + self:F( { TaskGroup:GetName(), MenuTime } ) local Mission = self:GetMission() local MissionName = Mission:GetName() - + local CommandCenter = Mission:GetCommandCenter() + local CommandCenterMenu = CommandCenter:GetMenu() + local MissionMenu = Mission:GetMenu( TaskGroup ) + + local TaskText = self:GetName() + local PlannedMenu = MissionMenu:GetMenu( string.format( "Planned Tasks", TaskText ) ) + local AssignedMenu = MissionMenu:GetMenu( string.format( "Assigned Task %s", TaskText ) ) - if MissionMenu then - local TaskType = self:GetType() - local TypeMenu = MissionMenu:GetMenu( TaskType ) - - if TypeMenu then - local TaskMenu = TypeMenu:GetMenu( self:GetTaskName() ) - if TaskMenu then - TaskMenu:Remove( MenuTime ) - end - end + if PlannedMenu then + PlannedMenu:Remove( MenuTime ) + end + + if AssignedMenu then + AssignedMenu:Remove( MenuTime ) end end diff --git a/Moose Development/Moose/Wrapper/Group.lua b/Moose Development/Moose/Wrapper/Group.lua index 02bbd7722..3be9bc187 100644 --- a/Moose Development/Moose/Wrapper/Group.lua +++ b/Moose Development/Moose/Wrapper/Group.lua @@ -1141,7 +1141,7 @@ do -- Players end end - self:F( PlayerNames ) + self:F2( PlayerNames ) return PlayerNames end From 02e2f21ec6da774b793310be50a9bbbd2e72d4b2 Mon Sep 17 00:00:00 2001 From: FlightControl Date: Fri, 5 May 2017 10:57:29 +0200 Subject: [PATCH 5/9] test good abort when more than one player is still assigned to the task, the task should not abort, only the player... --- Moose Development/Moose/Tasking/Task.lua | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Moose Development/Moose/Tasking/Task.lua b/Moose Development/Moose/Tasking/Task.lua index be5fb9b0d..e5b69426f 100644 --- a/Moose Development/Moose/Tasking/Task.lua +++ b/Moose Development/Moose/Tasking/Task.lua @@ -287,8 +287,8 @@ function TASK:AbortUnit( PlayerUnit ) -- It will go to hold, if there are no players in the mission... local IsRemaining = false - for GroupName, GroupData in pairs( PlayerGroups ) do - IsRemaining = ( IsRemaining == false ) and self:IsGroupAssigned( PlayerGroup ) or IsRemaining + for GroupName, AssignedGroup in pairs( PlayerGroups ) do + IsRemaining = ( IsRemaining == false ) and self:IsGroupAssigned( AssignedGroup ) or IsRemaining end if IsRemaining == false then From 82477c93d254d20d3ed1f9b584651d09eed82bed Mon Sep 17 00:00:00 2001 From: FlightControl Date: Fri, 5 May 2017 11:45:17 +0200 Subject: [PATCH 6/9] Fixed abort logic and trace overhead on menus --- Moose Development/Moose/Core/Menu.lua | 14 ++++++------- Moose Development/Moose/Tasking/Task.lua | 26 ++++++++++-------------- 2 files changed, 18 insertions(+), 22 deletions(-) diff --git a/Moose Development/Moose/Core/Menu.lua b/Moose Development/Moose/Core/Menu.lua index 70028b829..4cbb0f828 100644 --- a/Moose Development/Moose/Core/Menu.lua +++ b/Moose Development/Moose/Core/Menu.lua @@ -810,9 +810,9 @@ do -- @param MenuTime -- @return #MENU_GROUP self function MENU_GROUP:RemoveSubMenus( MenuTime ) - self:F2( { self.MenuPath, MenuTime, self.MenuTime } ) + --self:F2( { self.MenuPath, MenuTime, self.MenuTime } ) - self:T( { "Removing Group SubMenus:", self.MenuGroup:GetName(), self.MenuPath } ) + --self:T( { "Removing Group SubMenus:", self.MenuGroup:GetName(), self.MenuPath } ) for MenuText, Menu in pairs( self.Menus ) do Menu:Remove( MenuTime ) end @@ -825,7 +825,7 @@ do -- @param MenuTime -- @return #nil function MENU_GROUP:Remove( MenuTime ) - self:F( { self.MenuGroupID, self.MenuPath, MenuTime, self.MenuTime } ) + --self:F2( { self.MenuGroupID, self.MenuPath, MenuTime, self.MenuTime } ) self:RemoveSubMenus( MenuTime ) @@ -844,7 +844,7 @@ do end end end - self:T( { "Removing Group Menu:", self.MenuGroup:GetName(), self.MenuGroup._Menus[self.Path].Path } ) + self:T( { "Removing Group Menu:", MenuGroup = self.MenuGroup:GetName(), MenuPath = self.MenuGroup._Menus[self.Path].Path } ) self.MenuGroup._Menus[self.Path] = nil self = nil end @@ -896,7 +896,7 @@ do self.MenuText = MenuText self.ParentMenu = ParentMenu - self:T( { "Adding Group Command Menu:", MenuGroup:GetName(), MenuText, self.MenuParentPath } ) + self:T( { "Adding Group Command Menu:", MenuGroup = MenuGroup:GetName(), MenuText = MenuText, MenuPath = self.MenuParentPath } ) self.MenuPath = missionCommands.addCommandForGroup( self.MenuGroupID, MenuText, self.MenuParentPath, self.MenuCallHandler, arg ) if self.ParentMenu and self.ParentMenu.Menus then @@ -914,14 +914,14 @@ do -- @param MenuTime -- @return #nil function MENU_GROUP_COMMAND:Remove( MenuTime ) - self:F( { self.MenuGroupID, self.MenuPath, MenuTime, self.MenuTime } ) + --self:F2( { self.MenuGroupID, self.MenuPath, MenuTime, self.MenuTime } ) if not MenuTime or self.MenuTime ~= MenuTime then if self.MenuGroup._Menus[self.Path] then self = self.MenuGroup._Menus[self.Path] missionCommands.removeItemForGroup( self.MenuGroupID, self.MenuPath ) - self:T( { "Removing Group Command Menu:", self.MenuGroup:GetName(), self.MenuText, self.Path, self.MenuGroup._Menus[self.Path].Path } ) + self:T( { "Removing Group Command Menu:", MenuGroup = self.MenuGroup:GetName(), MenuText = self.MenuText, MenuPath = self.Path } ) self.ParentMenu.Menus[self.MenuText] = nil self.ParentMenu.MenuCount = self.ParentMenu.MenuCount - 1 diff --git a/Moose Development/Moose/Tasking/Task.lua b/Moose Development/Moose/Tasking/Task.lua index e5b69426f..72daf5888 100644 --- a/Moose Development/Moose/Tasking/Task.lua +++ b/Moose Development/Moose/Tasking/Task.lua @@ -261,13 +261,10 @@ end -- @param #TASK self -- @param Wrapper.Unit#UNIT PlayerUnit The CLIENT or UNIT of the Player aborting the Task. -- @return #boolean true if Unit is part of the Task. -function TASK:AbortUnit( PlayerUnit ) - self:F( { PlayerUnit = PlayerUnit } ) - - local PlayerUnitAborted = false +function TASK:AbortGroup( PlayerGroup ) + self:F( { PlayerGroup = PlayerGroup } ) local PlayerGroups = self:GetGroups() - local PlayerGroup = PlayerUnit:GetGroup() -- Is the PlayerGroup part of the PlayerGroups? if PlayerGroups:IsIncludeObject( PlayerGroup ) then @@ -278,7 +275,7 @@ function TASK:AbortUnit( PlayerUnit ) local IsGroupAssigned = self:IsGroupAssigned( PlayerGroup ) self:E( { IsGroupAssigned = IsGroupAssigned } ) if IsGroupAssigned then - local PlayerName = PlayerUnit:GetPlayerName() + local PlayerName = PlayerGroup:GetUnit(1):GetPlayerName() self:MessageToGroups( PlayerName .. " aborted Task " .. self:GetName() ) self:UnAssignFromGroup( PlayerGroup ) --self:Abort() @@ -286,22 +283,24 @@ function TASK:AbortUnit( PlayerUnit ) -- Now check if the task needs to go to hold... -- It will go to hold, if there are no players in the mission... + PlayerGroups:Flush() local IsRemaining = false - for GroupName, AssignedGroup in pairs( PlayerGroups ) do - IsRemaining = ( IsRemaining == false ) and self:IsGroupAssigned( AssignedGroup ) or IsRemaining + for GroupName, AssignedGroup in pairs( PlayerGroups:GetSet() or {} ) do + IsRemaining = ( ( IsRemaining == false ) and self:IsGroupAssigned( AssignedGroup ) ) or IsRemaining + self:F( { Task = self:GetName(), IsRemaining = IsRemaining } ) end if IsRemaining == false then self:Abort() end - self:PlayerAborted( PlayerUnit ) + self:PlayerAborted( PlayerGroup:GetUnit(1) ) end end end - return PlayerUnitAborted + return self end --- A PlayerUnit crashed in a Task. Abort the Player. @@ -369,7 +368,7 @@ do -- Group Assignment local TaskGroupName = TaskGroup:GetName() - if self.AssignedGroups[TaskGroupName] == TaskGroup then + if self.AssignedGroups[TaskGroupName] then self:T( { "Task is assigned to:", TaskGroup:GetName() } ) return true end @@ -808,10 +807,7 @@ end -- @param #TASK self function TASK:MenuTaskAbort( TaskGroup ) - for PlayerUnitName, PlayerUnit in pairs( TaskGroup:GetUnits() ) do - self:AbortUnit( PlayerUnit ) - end - + self:AbortGroup( TaskGroup ) end From 1c4002fb37862a9b57cd5877b47e1d4f1e39af29 Mon Sep 17 00:00:00 2001 From: FlightControl Date: Fri, 5 May 2017 11:50:24 +0200 Subject: [PATCH 7/9] Fixes abort --- Moose Development/Moose/Tasking/Task.lua | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/Moose Development/Moose/Tasking/Task.lua b/Moose Development/Moose/Tasking/Task.lua index 72daf5888..75b951382 100644 --- a/Moose Development/Moose/Tasking/Task.lua +++ b/Moose Development/Moose/Tasking/Task.lua @@ -286,10 +286,14 @@ function TASK:AbortGroup( PlayerGroup ) PlayerGroups:Flush() local IsRemaining = false for GroupName, AssignedGroup in pairs( PlayerGroups:GetSet() or {} ) do - IsRemaining = ( ( IsRemaining == false ) and self:IsGroupAssigned( AssignedGroup ) ) or IsRemaining - self:F( { Task = self:GetName(), IsRemaining = IsRemaining } ) + if self:IsGroupAssigned( AssignedGroup ) == true then + IsRemaining = true + self:F( { Task = self:GetName(), IsRemaining = IsRemaining } ) + break + end end - + + self:F( { Task = self:GetName(), IsRemaining = IsRemaining } ) if IsRemaining == false then self:Abort() end From 0b87b265c745488859af400d1d37d45be18708ce Mon Sep 17 00:00:00 2001 From: FlightControl Date: Fri, 5 May 2017 12:05:46 +0200 Subject: [PATCH 8/9] Fixing abort --- Moose Development/Moose/Core/Fsm.lua | 8 ++++---- Moose Development/Moose/Core/Menu.lua | 4 ++-- Moose Development/Moose/Tasking/Task.lua | 13 +++++++------ 3 files changed, 13 insertions(+), 12 deletions(-) diff --git a/Moose Development/Moose/Core/Fsm.lua b/Moose Development/Moose/Core/Fsm.lua index db7a0b40a..51adf9b86 100644 --- a/Moose Development/Moose/Core/Fsm.lua +++ b/Moose Development/Moose/Core/Fsm.lua @@ -1011,12 +1011,12 @@ do -- FSM_PROCESS -- Copy Processes for ProcessID, Process in pairs( self:GetProcesses() ) do self:E( { Process} ) - Process.fsm:Remove() - Process.fsm = nil + if Process.fsm then + Process.fsm:Remove() + Process.fsm = nil + end end - self._Processes = nil - return self end diff --git a/Moose Development/Moose/Core/Menu.lua b/Moose Development/Moose/Core/Menu.lua index 4cbb0f828..b33d8ef2c 100644 --- a/Moose Development/Moose/Core/Menu.lua +++ b/Moose Development/Moose/Core/Menu.lua @@ -882,7 +882,7 @@ do local Path = ( ParentMenu and ( table.concat( ParentMenu.MenuPath or {}, "@" ) .. "@" .. MenuText ) ) or MenuText if MenuGroup._Menus[Path] then self = MenuGroup._Menus[Path] - self:T( { "Re-using Group Command Menu:", MenuGroup:GetName(), MenuText } ) + self:F2( { "Re-using Group Command Menu:", MenuGroup:GetName(), MenuText } ) else self = BASE:Inherit( self, MENU_COMMAND_BASE:New( MenuText, ParentMenu, CommandMenuFunction, arg ) ) @@ -896,7 +896,7 @@ do self.MenuText = MenuText self.ParentMenu = ParentMenu - self:T( { "Adding Group Command Menu:", MenuGroup = MenuGroup:GetName(), MenuText = MenuText, MenuPath = self.MenuParentPath } ) + self:F( { "Adding Group Command Menu:", MenuGroup = MenuGroup:GetName(), MenuText = MenuText, MenuPath = self.MenuParentPath } ) self.MenuPath = missionCommands.addCommandForGroup( self.MenuGroupID, MenuText, self.MenuParentPath, self.MenuCallHandler, arg ) if self.ParentMenu and self.ParentMenu.Menus then diff --git a/Moose Development/Moose/Tasking/Task.lua b/Moose Development/Moose/Tasking/Task.lua index 75b951382..b23cc8cf7 100644 --- a/Moose Development/Moose/Tasking/Task.lua +++ b/Moose Development/Moose/Tasking/Task.lua @@ -882,13 +882,14 @@ end function TASK:RemoveStateMachine( TaskUnit ) self:F( { TaskUnit, self.Fsm[TaskUnit] ~= nil } ) - self:E( self.Fsm ) - for TaskUnitT, Fsm in pairs( self.Fsm ) do - local Fsm = Fsm -- Core.Fsm#FSM_PROCESS - self:E( TaskUnitT ) - Fsm:Remove() - end + --self:E( self.Fsm ) + --for TaskUnitT, Fsm in pairs( self.Fsm ) do + --local Fsm = Fsm -- Core.Fsm#FSM_PROCESS + --self:E( TaskUnitT ) + --self.Fsm[TaskUnit] = nil + --end + self.Fsm[TaskUnit]:Remove() self.Fsm[TaskUnit] = nil collectgarbage() From 6f9bfc42110bf3b00d68e263727b8655afdbfe3f Mon Sep 17 00:00:00 2001 From: FlightControl Date: Fri, 5 May 2017 12:40:16 +0200 Subject: [PATCH 9/9] Abort logic improvements --- Moose Development/Moose/Tasking/Mission.lua | 11 ++++------- Moose Development/Moose/Tasking/Task.lua | 2 +- 2 files changed, 5 insertions(+), 8 deletions(-) diff --git a/Moose Development/Moose/Tasking/Mission.lua b/Moose Development/Moose/Tasking/Mission.lua index 54032cda1..c19af3f75 100644 --- a/Moose Development/Moose/Tasking/Mission.lua +++ b/Moose Development/Moose/Tasking/Mission.lua @@ -289,20 +289,17 @@ end -- If the Unit is part of a Task in the Mission, true is returned. -- @param #MISSION self -- @param Wrapper.Unit#UNIT PlayerUnit The CLIENT or UNIT of the Player joining the Mission. --- @return #boolean true if Unit is part of a Task in the Mission. +-- @return #MISSION function MISSION:AbortUnit( PlayerUnit ) self:F( { PlayerUnit = PlayerUnit } ) - local PlayerUnitRemoved = false - for TaskID, Task in pairs( self:GetTasks() ) do local Task = Task -- Tasking.Task#TASK - if Task:AbortUnit( PlayerUnit ) then - PlayerUnitRemoved = true - end + local PlayerGroup = PlayerUnit:GetGroup() + Task:AbortGroup( PlayerGroup ) end - return PlayerUnitRemoved + return self end --- Handles a crash of a PlayerUnit from the Mission. diff --git a/Moose Development/Moose/Tasking/Task.lua b/Moose Development/Moose/Tasking/Task.lua index b23cc8cf7..15c88a013 100644 --- a/Moose Development/Moose/Tasking/Task.lua +++ b/Moose Development/Moose/Tasking/Task.lua @@ -754,7 +754,7 @@ function TASK:RefreshMenus( TaskGroup, MenuTime ) local MissionMenu = Mission:GetMenu( TaskGroup ) local TaskText = self:GetName() - local PlannedMenu = MissionMenu:GetMenu( string.format( "Planned Tasks", TaskText ) ) + local PlannedMenu = MissionMenu:GetMenu( "Planned Tasks" ) local AssignedMenu = MissionMenu:GetMenu( string.format( "Assigned Task %s", TaskText ) ) if PlannedMenu then