This commit is contained in:
Frank 2020-09-05 00:56:44 +02:00
parent 2e998dc315
commit 5ad30277ba
6 changed files with 198 additions and 61 deletions

View File

@ -717,6 +717,22 @@ function BASE:CreateEventCrash( EventTime, Initiator )
world.onEvent( Event ) world.onEvent( Event )
end end
--- Creation of a Crash Event.
-- @param #BASE self
-- @param DCS#Time EventTime The time stamp of the event.
-- @param DCS#Object Initiator The initiating object of the event.
function BASE:CreateEventUnitLost(EventTime, Initiator)
self:F( { EventTime, Initiator } )
local Event = {
id = world.event.S_EVENT_UNIT_LOST,
time = EventTime,
initiator = Initiator,
}
world.onEvent( Event )
end
--- Creation of a Dead Event. --- Creation of a Dead Event.
-- @param #BASE self -- @param #BASE self
-- @param DCS#Time EventTime The time stamp of the event. -- @param DCS#Time EventTime The time stamp of the event.

View File

@ -14,7 +14,6 @@
--- AIRWING class. --- AIRWING class.
-- @type AIRWING -- @type AIRWING
-- @field #string ClassName Name of the class. -- @field #string ClassName Name of the class.
-- @field #boolean Debug Debug mode. Messages to all about status.
-- @field #number verbose Verbosity of output. -- @field #number verbose Verbosity of output.
-- @field #string lid Class id string for output to DCS log file. -- @field #string lid Class id string for output to DCS log file.
-- @field #table menu Table of menu items. -- @field #table menu Table of menu items.
@ -109,7 +108,6 @@
-- @field #AIRWING -- @field #AIRWING
AIRWING = { AIRWING = {
ClassName = "AIRWING", ClassName = "AIRWING",
Debug = false,
verbose = 0, verbose = 0,
lid = nil, lid = nil,
menu = nil, menu = nil,
@ -394,7 +392,7 @@ function AIRWING:FetchPayloadFromStock(UnitType, MissionType, Payloads)
end end
-- Debug. -- Debug.
if self.Debug then if self.verbose>=4 then
self:I(self.lid..string.format("Looking for payload for unit type=%s and mission type=%s", UnitType, MissionType)) self:I(self.lid..string.format("Looking for payload for unit type=%s and mission type=%s", UnitType, MissionType))
for i,_payload in pairs(self.payloads) do for i,_payload in pairs(self.payloads) do
local payload=_payload --#AIRWING.Payload local payload=_payload --#AIRWING.Payload
@ -456,7 +454,7 @@ function AIRWING:FetchPayloadFromStock(UnitType, MissionType, Payloads)
end end
-- Debug. -- Debug.
if self.Debug then if self.verbose>=4 then
self:I(self.lid..string.format("Sorted payloads for mission type X and aircraft type=Y:")) self:I(self.lid..string.format("Sorted payloads for mission type X and aircraft type=Y:"))
for _,_payload in ipairs(self.payloads) do for _,_payload in ipairs(self.payloads) do
local payload=_payload --#AIRWING.Payload local payload=_payload --#AIRWING.Payload
@ -576,7 +574,7 @@ end
--- Remove asset from squadron. --- Remove asset from squadron.
-- @param #AIRWING self -- @param #AIRWING self
-- @param #AIRWING.SquadronAsset Asset -- @param #AIRWING.SquadronAsset Asset The squad asset.
function AIRWING:RemoveAssetFromSquadron(Asset) function AIRWING:RemoveAssetFromSquadron(Asset)
local squad=self:GetSquadronOfAsset(Asset) local squad=self:GetSquadronOfAsset(Asset)
if squad then if squad then
@ -1541,7 +1539,9 @@ function AIRWING:onafterSquadAssetReturned(From, Event, To, Squadron, Asset)
self:T(self.lid..string.format("Asset %s from squadron %s returned! asset.assignment=\"%s\"", Asset.spawngroupname, Squadron.name, tostring(Asset.assignment))) self:T(self.lid..string.format("Asset %s from squadron %s returned! asset.assignment=\"%s\"", Asset.spawngroupname, Squadron.name, tostring(Asset.assignment)))
-- Stop flightgroup. -- Stop flightgroup.
Asset.flightgroup:Stop() if Asset.flightgroup and not Asset.flightgroup:IsStopped() then
Asset.flightgroup:Stop()
end
-- Return payload. -- Return payload.
self:ReturnPayloadFromAsset(Asset) self:ReturnPayloadFromAsset(Asset)

View File

@ -2552,10 +2552,8 @@ end
-- @param #string To To state. -- @param #string To To state.
-- @param Ops.AirWing#AIRWING.SquadronAsset Asset The asset. -- @param Ops.AirWing#AIRWING.SquadronAsset Asset The asset.
function AUFTRAG:onafterAssetDead(From, Event, To, Asset) function AUFTRAG:onafterAssetDead(From, Event, To, Asset)
-- Remove opsgroup from mission. -- Number of groups alive.
--self:DelOpsGroup(Asset.opsgroup)
local N=self:CountOpsGroups() local N=self:CountOpsGroups()
-- All assets dead? -- All assets dead?
@ -2568,15 +2566,22 @@ function AUFTRAG:onafterAssetDead(From, Event, To, Asset)
else else
self:E(self.lid.."ERROR: All assets are dead not but mission was already over... Investigate!") --self:E(self.lid.."ERROR: All assets are dead not but mission was already over... Investigate!")
-- Now this can happen, because when a opsgroup dies (sometimes!), the mission is DONE -- Now this can happen, because when a opsgroup dies (sometimes!), the mission is DONE
end end
end end
-- Remove asset from airwing. -- Asset belonged to an airwing.
if self.airwing then if self.airwing then
self.airwing:RemoveAssetFromSquadron(Asset)
if self.Ncasualties==self.Nelements then
-- All elements were destroyed ==> Asset is gone.
self.airwing:RemoveAssetFromSquadron(Asset)
else
-- Not all assets were destroyed (despawn) ==> Add asset back to airwing.
self.airwing:AddAsset(Asset.flightgroup.group, 1)
end
end end
-- Delete asset from mission. -- Delete asset from mission.

View File

@ -46,6 +46,7 @@
-- @field #boolean ishelo If true, the is a helicopter group. -- @field #boolean ishelo If true, the is a helicopter group.
-- @field #number callsignName Callsign name. -- @field #number callsignName Callsign name.
-- @field #number callsignNumber Callsign number. -- @field #number callsignNumber Callsign number.
-- @field #number Ndestroyed Number of destroyed units.
-- --
-- @extends Ops.OpsGroup#OPSGROUP -- @extends Ops.OpsGroup#OPSGROUP
@ -132,6 +133,7 @@ FLIGHTGROUP = {
Tparking = nil, Tparking = nil,
menu = nil, menu = nil,
ishelo = nil, ishelo = nil,
Ndestroyed = 0,
} }
@ -1346,15 +1348,9 @@ end
-- @param #string To To state. -- @param #string To To state.
-- @param #FLIGHTGROUP.Element Element The flight group element. -- @param #FLIGHTGROUP.Element Element The flight group element.
function FLIGHTGROUP:onafterElementDestroyed(From, Event, To, Element) function FLIGHTGROUP:onafterElementDestroyed(From, Event, To, Element)
self:T(self.lid..string.format("Element dead %s.", Element.name))
-- Cancel all missions.
for _,_mission in pairs(self.missionqueue) do
local mission=_mission --Ops.Auftrag#AUFTRAG
mission:ElementDestroyed(self, Element) -- Call OPSGROUP function.
self:GetParent(self).onafterElementDestroyed(self, From, Event, To, Element)
end
end end
@ -1365,7 +1361,9 @@ end
-- @param #string To To state. -- @param #string To To state.
-- @param #FLIGHTGROUP.Element Element The flight group element. -- @param #FLIGHTGROUP.Element Element The flight group element.
function FLIGHTGROUP:onafterElementDead(From, Event, To, Element) function FLIGHTGROUP:onafterElementDead(From, Event, To, Element)
self:T(self.lid..string.format("Element dead %s.", Element.name))
-- Call OPSGROUP function.
self:GetParent(self).onafterElementDead(self, From, Event, To, Element)
if self.flightcontrol and Element.parking then if self.flightcontrol and Element.parking then
self.flightcontrol:SetParkingFree(Element.parking) self.flightcontrol:SetParkingFree(Element.parking)
@ -1373,9 +1371,7 @@ function FLIGHTGROUP:onafterElementDead(From, Event, To, Element)
-- Not parking any more. -- Not parking any more.
Element.parking=nil Element.parking=nil
-- Set element status.
self:_UpdateStatus(Element, OPSGROUP.ElementStatus.DEAD)
end end
@ -1569,7 +1565,6 @@ end
-- @param #string From From state. -- @param #string From From state.
-- @param #string Event Event. -- @param #string Event Event.
-- @param #string To To state. -- @param #string To To state.
-- @param Wrapper.Airbase#AIRBASE airbase The airbase the flight landed.
function FLIGHTGROUP:onafterLandedAt(From, Event, To) function FLIGHTGROUP:onafterLandedAt(From, Event, To)
self:I(self.lid..string.format("Flight landed at")) self:I(self.lid..string.format("Flight landed at"))
end end
@ -1601,11 +1596,6 @@ end
-- @param #string Event Event. -- @param #string Event Event.
-- @param #string To To state. -- @param #string To To state.
function FLIGHTGROUP:onafterDead(From, Event, To) function FLIGHTGROUP:onafterDead(From, Event, To)
self:T(self.lid..string.format("Flight dead!"))
-- Delete waypoints so they are re-initialized at the next spawn.
self.waypoints=nil
self.groupinitialized=false
-- Remove flight from all FC queues. -- Remove flight from all FC queues.
if self.flightcontrol then if self.flightcontrol then
@ -1613,17 +1603,9 @@ function FLIGHTGROUP:onafterDead(From, Event, To)
self.flightcontrol=nil self.flightcontrol=nil
end end
-- Cancel all missions. -- Call OPSGROUP function.
for _,_mission in pairs(self.missionqueue) do self:GetParent(self).onafterDead(self, From, Event, To)
local mission=_mission --Ops.Auftrag#AUFTRAG
self:MissionCancel(mission)
mission:GroupDead(self)
end
-- Stop
self:Stop()
end end

View File

@ -491,12 +491,20 @@ function OPSGROUP:GetDCSGroup()
return DCSGroup return DCSGroup
end end
--- Get DCS GROUP object. --- Get MOOSE UNIT object.
-- @param #OPSGROUP self -- @param #OPSGROUP self
-- @return DCS#Group DCS group object. -- @param #number UnitNumber Number of the unit in the group. Default first unit.
-- @return Wrapper.Unit#UNIT The MOOSE UNIT object.
function OPSGROUP:GetUnit(UnitNumber) function OPSGROUP:GetUnit(UnitNumber)
local DCSGroup=Group.getByName(self.groupname)
return DCSGroup local DCSUnit=self:GetDCSUnit(UnitNumber)
if DCSUnit then
local unit=UNIT:Find(DCSUnit)
return unit
end
return nil
end end
--- Get DCS GROUP object. --- Get DCS GROUP object.
@ -515,15 +523,68 @@ function OPSGROUP:GetDCSUnit(UnitNumber)
return nil return nil
end end
--- Despawn group. --- Get DCS units.
-- @param #OPSGROUP self -- @param #OPSGROUP self
-- @return #OPSGROUP self -- @return #list<DCS#Unit> DCS units.
function OPSGROUP:DespawnGroup() function OPSGROUP:GetDCSUnits()
local DCSGroup=self:GetDCSGroup() local DCSGroup=self:GetDCSGroup()
if DCSGroup then if DCSGroup then
local units=DCSGroup:getUnits()
return units
end
return nil
end
--- Despawn the group. The whole group is despawned and (optionally) a "Remove Unit" event is generated for all current units of the group.
-- @param #OPSGROUP self
-- @return #OPSGROUP self
function OPSGROUP:Despawn()
local DCSGroup=self:GetDCSGroup()
if DCSGroup then
-- Destroy DCS group.
DCSGroup:destroy() DCSGroup:destroy()
-- Get all units.
local units=self:GetDCSUnits()
-- Create a "Remove Unit" event.
local EventTime=timer.getTime()
for i=1,#units do
self:CreateEventRemoveUnit(EventTime, units[i])
end
end
return self
end
--- Destroy group. The whole group is despawned and a "Unit Lost" event is generated for all current units.
-- @param #OPSGROUP self
-- @return #OPSGROUP self
function OPSGROUP:Destroy()
local DCSGroup=self:GetDCSGroup()
if DCSGroup then
self:I(self.lid.."Destroying group ")
-- Destroy DCS group.
DCSGroup:destroy()
-- Get all units.
local units=self:GetDCSUnits()
-- Create a "Unit Lost" event.
local EventTime=timer.getTime()
for i=1,#units do
self:CreateEventUnitLost(EventTime, units[i])
end
end end
return self return self
@ -538,6 +599,7 @@ function OPSGROUP:DespawnUnit(UnitName)
if DCSGroup then if DCSGroup then
DCSGroup:destroy() DCSGroup:destroy()
self:CreateEventRemoveUnit(timer.getTime(), DCSObject)
end end
return self return self
@ -2347,7 +2409,7 @@ function OPSGROUP:_QueueUpdate()
--- ---
-- First check if group is alive? Late activated groups are activated and uncontrolled units are started automatically. -- First check if group is alive? Late activated groups are activated and uncontrolled units are started automatically.
if self:IsAlive()~=nil then if self:IsExist() then
local mission=self:_GetNextMission() local mission=self:_GetNextMission()
@ -2564,6 +2626,67 @@ function OPSGROUP:onafterLeaveZone(From, Event, To, Zone)
self.inzones:Remove(zonename, true) self.inzones:Remove(zonename, true)
end end
--- On after "ElementDestroyed" event.
-- @param #OPSGROUP self
-- @param #string From From state.
-- @param #string Event Event.
-- @param #string To To state.
-- @param #OPSGROUP.Element Element The flight group element.
function OPSGROUP:onafterElementDestroyed(From, Event, To, Element)
self:I(self.lid..string.format("Element destroyed %s", Element.name))
-- Cancel all missions.
for _,_mission in pairs(self.missionqueue) do
local mission=_mission --Ops.Auftrag#AUFTRAG
mission:ElementDestroyed(self, Element)
end
-- Set element status.
self:_UpdateStatus(Element, OPSGROUP.ElementStatus.DEAD)
end
--- On after "ElementDead" event.
-- @param #OPSGROUP self
-- @param #string From From state.
-- @param #string Event Event.
-- @param #string To To state.
-- @param #OPSGROUP.Element Element The flight group element.
function OPSGROUP:onafterElementDead(From, Event, To, Element)
self:I(self.lid..string.format("Element dead %s", Element.name))
-- Set element status.
self:_UpdateStatus(Element, OPSGROUP.ElementStatus.DEAD)
end
--- On after "Dead" event.
-- @param #OPSGROUP self
-- @param #string From From state.
-- @param #string Event Event.
-- @param #string To To state.
function OPSGROUP:onafterDead(From, Event, To)
self:T(self.lid..string.format("Flight dead!"))
-- Delete waypoints so they are re-initialized at the next spawn.
self.waypoints=nil
self.groupinitialized=false
-- Cancel all missions.
for _,_mission in pairs(self.missionqueue) do
local mission=_mission --Ops.Auftrag#AUFTRAG
self:MissionCancel(mission)
mission:GroupDead(self)
end
-- Stop
self:Stop()
end
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
-- Internal Check Functions -- Internal Check Functions
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
@ -3427,6 +3550,7 @@ function OPSGROUP:GetTACAN()
return self.tacan.Channel, self.tacan.Morse, self.tacan.Band, self.tacan.On, self.tacan.BeaconName return self.tacan.Channel, self.tacan.Morse, self.tacan.Band, self.tacan.On, self.tacan.BeaconName
end end
--- Activate/switch ICLS beacon settings. --- Activate/switch ICLS beacon settings.
-- @param #OPSGROUP self -- @param #OPSGROUP self
-- @param #OPSGROUP.Beacon Icls ICLS data table. -- @param #OPSGROUP.Beacon Icls ICLS data table.
@ -3628,6 +3752,8 @@ function OPSGROUP:TurnOffRadio()
return self return self
end end
--- Set default formation. --- Set default formation.
-- @param #OPSGROUP self -- @param #OPSGROUP self
-- @param #number Formation The formation the groups flies in. -- @param #number Formation The formation the groups flies in.
@ -3673,6 +3799,8 @@ function OPSGROUP:SwitchFormation(Formation)
return self return self
end end
--- Set default formation. --- Set default formation.
-- @param #OPSGROUP self -- @param #OPSGROUP self
-- @param #number CallsignName Callsign name. -- @param #number CallsignName Callsign name.

View File

@ -17,7 +17,6 @@
--- SQUADRON class. --- SQUADRON class.
-- @type SQUADRON -- @type SQUADRON
-- @field #string ClassName Name of the class. -- @field #string ClassName Name of the class.
-- @field #boolean Debug Debug mode. Messages to all about status.
-- @field #number verbose Verbosity level. -- @field #number verbose Verbosity level.
-- @field #string lid Class id string for output to DCS log file. -- @field #string lid Class id string for output to DCS log file.
-- @field #string name Name of the squadron. -- @field #string name Name of the squadron.
@ -63,8 +62,7 @@
-- @field #SQUADRON -- @field #SQUADRON
SQUADRON = { SQUADRON = {
ClassName = "SQUADRON", ClassName = "SQUADRON",
Debug = nil, verbose = 3,
verbose = 0,
lid = nil, lid = nil,
name = nil, name = nil,
templatename = nil, templatename = nil,
@ -199,7 +197,6 @@ function SQUADRON:New(TemplateGroupName, Ngroups, SquadronName)
-- Debug trace. -- Debug trace.
if false then if false then
self.Debug=true
BASE:TraceOnOff(true) BASE:TraceOnOff(true)
BASE:TraceClass(self.ClassName) BASE:TraceClass(self.ClassName)
BASE:TraceLevel(1) BASE:TraceLevel(1)
@ -658,7 +655,7 @@ function SQUADRON:_CheckAssetStatus()
local asset=_asset --Ops.AirWing#AIRWING.SquadronAsset local asset=_asset --Ops.AirWing#AIRWING.SquadronAsset
-- Text. -- Text.
text=text..string.format("\n-[%d] %s*%d: ", j, asset.unittype, asset.nunits) text=text..string.format("\n-[%d] %s (%s*%d): ", j, asset.spawngroupname, asset.unittype, asset.nunits)
if asset.spawned then if asset.spawned then
@ -670,7 +667,7 @@ function SQUADRON:_CheckAssetStatus()
local mission=self.airwing and self.airwing:GetAssetCurrentMission(asset) or false local mission=self.airwing and self.airwing:GetAssetCurrentMission(asset) or false
if mission then if mission then
local distance=asset.flightgroup and UTILS.MetersToNM(mission:GetTargetDistance(asset.flightgroup.group:GetCoordinate())) or 0 local distance=asset.flightgroup and UTILS.MetersToNM(mission:GetTargetDistance(asset.flightgroup.group:GetCoordinate())) or 0
text=text..string.format(" Mission %s - %s: Status=%s, Dist=%.1f NM", mission.name, mission.type, mission.status, distance) text=text..string.format("Mission %s - %s: Status=%s, Dist=%.1f NM", mission.name, mission.type, mission.status, distance)
else else
text=text.."Mission None" text=text.."Mission None"
end end
@ -708,15 +705,24 @@ function SQUADRON:_CheckAssetStatus()
--- ---
-- In Stock -- In Stock
--- ---
text=text..string.format("In Stock")
if self:IsRepaired(asset) then
text=text.." and Combat Ready"
else
text=text..string.format(", Repaired in %d sec", self:GetRepairTime(asset))
if asset.damage then
text=text..string.format(" (Damage=%.1f)", asset.damage)
end
end
if asset.Treturned then if asset.Treturned then
local T=timer.getAbsTime()-asset.Treturned local T=timer.getAbsTime()-asset.Treturned
text=text..string.format(" Treturn=%d sec", T) text=text..string.format(", Returned for %d sec", T)
end end
if asset.damage then
text=text..string.format(" Damage=%.1f", asset.damage)
end
text=text..string.format(" Repaired=%s T=%d sec", tostring(self:IsRepaired(asset)), self:GetRepairTime(asset))
end end
end end