diff --git a/Moose Development/Moose/Ops/AirWing.lua b/Moose Development/Moose/Ops/AirWing.lua index 5f7c3e623..6d29cb004 100644 --- a/Moose Development/Moose/Ops/AirWing.lua +++ b/Moose Development/Moose/Ops/AirWing.lua @@ -113,6 +113,7 @@ function AIRWING:New(warehousename, airwingname) self:AddTransition("*", "MissionNew", "*") -- Add a new mission. self:AddTransition("*", "MissionRequest", "*") -- Add a (mission) request to the warehouse. self:AddTransition("*", "MissionDone", "*") -- Mission is over. + self:AddTransition("*", "MissionCancel", "*") -- Mission is over. ------------------------ --- Pseudo Functions --- @@ -507,7 +508,7 @@ end --- Optimize chosen assets for the mission at hand. -- @param #AIRWING self -- @param #table assets Table of (unoptimized) assets. --- @param Ops.Auftrag#AUFTRAG Next mission or *nil*. +-- @param Ops.Auftrag#AUFTRAG Mission Next mission or *nil*. function AIRWING:_OptimizeAssetSelection(assets, Mission) local TargetCoordinate=Mission:GetTargetCoordinate() @@ -585,15 +586,27 @@ function AIRWING:onafterNewAsset(From, Event, To, asset, assignment) end end ---- On after "MissionNew" event. +--- On after "MissionCancel" event. -- @param #AIRWING self -- @param #string From From state. -- @param #string Event Event. -- @param #string To To state. --- @param Ops.Auftrag#AUFTRAG Mission -function AIRWING:onafterMissionNew(From, Event, To, Mission) +-- @param Ops.Auftrag#AUFTRAG Mission The mission to be cancelled. +function AIRWING:onafterMissionCancel(From, Event, To, Mission) + + self:I(self.lid..string.format("Cancel mission %s", Mission.name)) + + for _,_asset in pairs(Mission.assets) do + local asset=_asset --#AIRWING.SquadronAsset + + local flightgroup=asset.flightgroup + + if flightgroup then + flightgroup:MissionCancel(Mission) + end + end + - self:I(self.lid..string.format("New mission %s", Mission.name)) end diff --git a/Moose Development/Moose/Ops/Auftrag.lua b/Moose Development/Moose/Ops/Auftrag.lua index b40dafa16..ff41a82ac 100644 --- a/Moose Development/Moose/Ops/Auftrag.lua +++ b/Moose Development/Moose/Ops/Auftrag.lua @@ -22,6 +22,7 @@ -- @field #string status Mission status. -- @field #string name Mission name. -- @field #number prio Mission priority. +-- @field #boolean urgent Mission is urgent. Running missions with lower prio might be cancelled. -- @field #number Tstart Mission start time in seconds. -- @field #number Tstop Mission stop time in seconds. -- @field #number duration Mission duration in seconds. @@ -408,7 +409,7 @@ end -- @return #AUFTRAG self function AUFTRAG:SetPriority(Prio, Urgent) self.prio=Prio or 50 - self.isurgent=Urgent + self.urgent=Urgent return self end diff --git a/Moose Development/Moose/Ops/FlightGroup.lua b/Moose Development/Moose/Ops/FlightGroup.lua index cc4682808..b727ed471 100644 --- a/Moose Development/Moose/Ops/FlightGroup.lua +++ b/Moose Development/Moose/Ops/FlightGroup.lua @@ -1398,12 +1398,26 @@ function FLIGHTGROUP:onafterQueueUpdate(From, Event, To) --- -- First check if group is alive? Late activated groups are activated and uncontrolled units are started automatically. - if self:IsAlive()~=nil and not self.currentmission then + if self:IsAlive()~=nil then local mission=self:_GetNextMission() if mission then - self:MissionStart(mission) + + local currentmission=self:GetMissionCurrent() + + if currentmission then + + -- Current mission but new mission is urgent with higher prio. + if mission.urgent and mission.prio