This commit is contained in:
Frank
2020-03-23 23:56:10 +01:00
parent e1d09bdd8b
commit 56ec7f122f
6 changed files with 136 additions and 34 deletions
@@ -6000,6 +6000,22 @@ function WAREHOUSE:GetAssetByID(id)
end
end
--- Get a warehouse asset from its name.
-- @param #WAREHOUSE self
-- @param #string GroupName Spawn group name.
-- @return #WAREHOUSE.Assetitem The warehouse asset.
function WAREHOUSE:GetAssetByName(GroupName)
local name=self:_GetNameWithOut(GroupName)
local _,aid,_=self:_GetIDsFromGroup(GROUP:FindByName(name))
if aid then
return _WAREHOUSEDB.Assets[aid]
else
return nil
end
end
--- Get a warehouse request from its unique id.
-- @param #WAREHOUSE self
-- @param #number id Request ID.
+31 -17
View File
@@ -579,7 +579,7 @@ function AIRWING:onafterStatus(From, Event, To)
-- Count missions not over yet.
local nmissions=self:CountMissionsInQueue()
-- TODO: count payloads, count squadrons, count missions
-- TODO: count payloads, assets total
local text=string.format("Status %s: missions=%d, payloads=%d, squads=%d", fsmstate, nmissions, #self.payloads, #self.squadrons)
self:I(self.lid..text)
@@ -598,10 +598,10 @@ function AIRWING:onafterStatus(From, Event, To)
-------------------
local text="Squadrons:"
for i,_squadron in pairs(self.squadrons) do
local squadron=_squadron --#AIRWING.Squadron
local squadron=_squadron --Ops.Squadron#SQUADRON
-- Squadron text
text=text..string.format("\n* %s", squadron.name)
text=text..string.format("\n* %s %s", squadron.name, squadron:GetState())
-- Loop over all assets.
for j,_asset in pairs(squadron.assets) do
@@ -1026,17 +1026,25 @@ 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)
if Mission:IsPlanned() or Mission:IsQueued() or Mission:IsRequested() then
Mission:Done()
else
for _,_asset in pairs(Mission.assets) do
local asset=_asset --#AIRWING.SquadronAsset
local flightgroup=asset.flightgroup
if flightgroup then
flightgroup:MissionCancel(Mission)
end
-- Not requested any more (if it was).
asset.requested=nil
end
-- Not requested any more (if it was).
asset.requested=nil
end
-- Remove queued request (if any).
@@ -1173,13 +1181,19 @@ end
-- @param #string To To state.
function AIRWING:onafterDestroyed(From, Event, To)
self:I(self.lid.."Airwing warehouse destroyed!")
-- Cancel all missions.
for _,_mission in pairs(self.missionqueue) do
local mission=_mission --Ops.Auftrag#AUFTRAG
mission:Cancel()
end
-- Remove all squadron assets.
for _,_squadron in pairs(self.squadrons) do
local squadron=_squadron --Ops.Squadron#SQUADRON
for _,_asset in pairs(squadron.assets) do
local asset=_asset
squadron:DelAsset(asset)
end
squadron:Stop()
-- Stop Squadron. This also removes all assets.
squadron:Stop()
end
-- Call parent warehouse function first.
+64 -8
View File
@@ -232,6 +232,7 @@ AUFTRAG.TargetType={
-- @field #number waypointindex Waypoint index.
-- @field Ops.FlightGroup#FLIGHTGROUP.Task waypointtask Waypoint task.
-- @field #string status Flight mission status.
-- @field Ops.AirWing#AIRWING.SquadronAsset asset The squadron asset.
--- AUFTRAG class version.
@@ -312,7 +313,8 @@ function AUFTRAG:New(Type)
self:AddTransition("*", "Stop", "*")
self:AddTransition("*", "Repeat", AUFTRAG.Status.PLANNED)
self:AddTransition("*", "FlightDead", "*")
self:AddTransition("*", "AssetDead", "*")
--[[
@@ -1061,6 +1063,11 @@ function AUFTRAG:onafterStatus(From, Event, To)
if fsmstate~=self.status then
self:E(self.lid..string.format("ERROR: FSM state %s != %s mission status!", fsmstate, self.status))
end
for _,_flightdata in pairs(self.flightdata) do
local flightdata=_flightdata --#AUFTRAG.FlightData
string.format("%s", flightdata.status)
end
-- Check if mission is OVER (done or cancelled).
if self:IsOver() then
@@ -1100,6 +1107,32 @@ function AUFTRAG:Evaluate()
return self
end
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
-- Asset Data
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
--- Get asset data table.
-- @param #AUFTRAG self
-- @param #string AssetName Name of the asset.
-- @return #AUFTRAG.FlightData Flight data or nil if flightgroup does not exist.
function AUFTRAG:GetAssetDataByName(AssetName)
return self.flightdata[tostring(AssetName)]
end
--- Get asset data table.
-- @param #AUFTRAG self
-- @param #string AssetName Name of the asset.
-- @return #AUFTRAG.FlightData Flight data or nil if flightgroup does not exist.
function AUFTRAG:NewMissionAsset(AssetName)
local assetdata={} --#AUFTRAG.FlightData
--assetdata.status==AUFTRAG.FlightStatus.SCHEDULED
return self.flightdata[tostring(AssetName)]
end
--- Get flight data table.
-- @param #AUFTRAG self
-- @param Ops.FlightGroup#FLIGHTGROUP flightgroup The flight group.
@@ -1129,6 +1162,7 @@ function AUFTRAG:SetFlightStatus(flightgroup, status)
end
end
-- Debug info.
self:I(self.lid..string.format("Setting flight %s status to %s. IsNotOver=%s CheckFlightsDone=%s", flightgroup.groupname, self:GetFlightStatus(flightgroup), tostring(self:IsNotOver()), tostring(self:CheckFlightsDone())))
-- Check if ALL flights are done with their mission.
@@ -1325,6 +1359,24 @@ function AUFTRAG:onafterDone(From, Event, To)
self:I(self.lid..string.format("New mission status=%s", self.status))
end
--- On after "FlightDead" event.
-- @param #AUFTRAG self
-- @param #string From From state.
-- @param #string Event Event.
-- @param #string To To state.
-- @param Ops.FlightGroup#FLIGHTGROUP FlightGroup The flightgroup that is dead now.
function AUFTRAG:onafterFlightDead(From, Event, To, FlightGroup)
self:SetFlightStatus(FlightGroup, AUFTRAG.FlightStatus.DONE)
local asset=self:GetAssetByName(FlightGroup.groupname)
if asset then
self:AssetDead(asset)
end
end
--- On after "AssetDead" event.
-- @param #AUFTRAG self
-- @param #string From From state.
@@ -1332,15 +1384,14 @@ end
-- @param #string To To state.
-- @param Ops.AirWing#AIRWING.SquadronAsset Asset The asset.
function AUFTRAG:onafterAssetDead(From, Event, To, Asset)
-- Delete asset from mission.
self:DelAsset(Asset)
-- Remove flightgroup from mission.
self:DelFlightGroup(Asset.flightgroup)
--self:DelFlightGroup(Asset.flightgroup)
local N=self:CountFlightGroups()
-- All assets dead?
if #self.assets==0 then
if N==0 then
if self:IsNotOver() then
@@ -1350,14 +1401,19 @@ function AUFTRAG:onafterAssetDead(From, Event, To, Asset)
else
self:E(self.lid.."ERROR: All assets are dead not but mission was already over... Investigate!")
-- Now this can happen, because when a flightgroup dies (sometimes!), the mission is DONE
end
end
-- Remove asset from airwing.
if self.airwing then
self.airwing:RemoveAssetFromSquadron(Asset)
end
-- Delete asset from mission.
self:DelAsset(Asset)
end
--- On after "Success" event.
@@ -1595,7 +1651,7 @@ function AUFTRAG:CountFlightGroups()
return N
end
--- Get coordinate of target. First unit/group of the set is used.
--- Get coordinate of target.
-- @param #AUFTRAG self
-- @return Core.Point#COORDINATE The target coordinate or nil.
function AUFTRAG:GetTargetCoordinate()
+1 -4
View File
@@ -2305,10 +2305,7 @@ function FLIGHTGROUP:onafterFlightDead(From, Event, To)
for _,_mission in pairs(self.missionqueue) do
local mission=_mission --Ops.Auftrag#AUFTRAG
local asset=mission:GetAssetByName(self.groupname)
if asset then
mission:AssetDead(asset)
end
mission:FlightDead(self)
end
+20 -5
View File
@@ -264,6 +264,7 @@ function SQUADRON:DelAsset(Asset)
for i,_asset in pairs(self.assets) do
local asset=_asset --Ops.AirWing#AIRWING.SquadronAsset
if Asset.uid==asset.uid then
self:T2(self.lid..string.format("Removing asset %s", asset.spawngroupname))
table.remove(self.assets, i)
break
end
@@ -277,7 +278,6 @@ end
--- On after Start event. Starts the FLIGHTGROUP FSM and event handlers.
-- @param #SQUADRON self
-- @param Wrapper.Group#GROUP Group Flight group.
-- @param #string From From state.
-- @param #string Event Event.
-- @param #string To To state.
@@ -293,7 +293,6 @@ end
--- On after "Status" event.
-- @param #SQUADRON self
-- @param Wrapper.Group#GROUP Group Flight group.
-- @param #string From From state.
-- @param #string Event Event.
-- @param #string To To state.
@@ -327,6 +326,21 @@ function SQUADRON:_CheckAssetStatus()
end
--- On after "Stop" event.
-- @param #SQUADRON self
-- @param #string From From state.
-- @param #string Event Event.
-- @param #string To To state.
function SQUADRON:onafterStop(From, Event, To)
-- Remove all assets.
for i=#self.assets,1,-1 do
local asset=self.assets[i]
self:DelAsqsset(asset)
end
end
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
-- Misc Functions
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
@@ -374,13 +388,14 @@ function SQUADRON:CanMission(Mission)
---
-- Check if this asset is currently on a PATROL mission (STARTED or EXECUTING).
if self.airwing:IsAssetOnMission(asset, AUFTRAG.Type.PATROL) and Mission.type~=AUFTRAG.Type.PATROL then
if self.airwing:IsAssetOnMission(asset, AUFTRAG.Type.PATROL) and Mission.type==AUFTRAG.Type.INTERCEPT then
-- Check if the payload of this asset is compatible with the mission.
if self:CheckMissionType(Mission.type, asset.payload.missiontypes) then
-- Note: we do not check the payload as an asset that is on a PATROL mission should be able to do an intercept as well!
--if self:CheckMissionType(Mission.type, asset.payload.missiontypes) then
-- TODO: Check if asset actually has weapons left. Difficult!
table.insert(assets, asset)
end
--end
end
@@ -243,7 +243,11 @@ function WINGCOMMANDER:onafterStatus(From, Event, To)
-- Add mission to queue.
if mission then
--TODO: Better amount of necessary assets. Count units in asset and in contact. Might need nassetMin/Max.
mission.nassets=1
-- Set mission contact.
contact.mission=mission
-- Add mission to queue.