mirror of
https://github.com/FlightControl-Master/MOOSE.git
synced 2025-08-15 10:47:21 +00:00
OPS cargo
This commit is contained in:
parent
f4cb6df8d4
commit
c247a98402
@ -64,6 +64,7 @@ ARMYGROUP = {
|
|||||||
-- @field #number length Length of element in meters.
|
-- @field #number length Length of element in meters.
|
||||||
-- @field #number width Width of element in meters.
|
-- @field #number width Width of element in meters.
|
||||||
-- @field #number height Height of element in meters.
|
-- @field #number height Height of element in meters.
|
||||||
|
-- @extends Ops.OpsGroup#OPSGROUP.Element
|
||||||
|
|
||||||
--- Target
|
--- Target
|
||||||
-- @type ARMYGROUP.Target
|
-- @type ARMYGROUP.Target
|
||||||
@ -78,10 +79,10 @@ ARMYGROUP.version="0.4.0"
|
|||||||
-- TODO list
|
-- TODO list
|
||||||
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
||||||
|
|
||||||
-- TODO: Retreat.
|
|
||||||
-- TODO: Suppression of fire.
|
-- TODO: Suppression of fire.
|
||||||
-- TODO: Check if group is mobile.
|
-- TODO: Check if group is mobile.
|
||||||
-- TODO: F10 menu.
|
-- TODO: F10 menu.
|
||||||
|
-- DONE: Retreat.
|
||||||
-- DONE: Rearm. Specify a point where to go and wait until ammo is full.
|
-- DONE: Rearm. Specify a point where to go and wait until ammo is full.
|
||||||
|
|
||||||
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
||||||
@ -116,13 +117,13 @@ function ARMYGROUP:New(Group)
|
|||||||
self:AddTransition("*", "Detour", "OnDetour") -- Make a detour to a coordinate and resume route afterwards.
|
self:AddTransition("*", "Detour", "OnDetour") -- Make a detour to a coordinate and resume route afterwards.
|
||||||
self:AddTransition("OnDetour", "DetourReached", "Cruising") -- Group reached the detour coordinate.
|
self:AddTransition("OnDetour", "DetourReached", "Cruising") -- Group reached the detour coordinate.
|
||||||
|
|
||||||
self:AddTransition("*", "Retreat", "Retreating") --
|
self:AddTransition("*", "Retreat", "Retreating") -- Order a retreat.
|
||||||
self:AddTransition("Retreating", "Retreated", "Retreated") --
|
self:AddTransition("Retreating", "Retreated", "Retreated") -- Group retreated.
|
||||||
|
|
||||||
self:AddTransition("Cruising", "EngageTarget", "Engaging") -- Engage a target
|
self:AddTransition("Cruising", "EngageTarget", "Engaging") -- Engage a target from Cruising state
|
||||||
self:AddTransition("Holding", "EngageTarget", "Engaging") -- Engage a target
|
self:AddTransition("Holding", "EngageTarget", "Engaging") -- Engage a target from Holding state
|
||||||
self:AddTransition("OnDetour", "EngageTarget", "Engaging") -- Engage a target
|
self:AddTransition("OnDetour", "EngageTarget", "Engaging") -- Engage a target from OnDetour state
|
||||||
self:AddTransition("Engaging", "Disengage", "Cruising") -- Engage a target
|
self:AddTransition("Engaging", "Disengage", "Cruising") -- Disengage and back to cruising.
|
||||||
|
|
||||||
self:AddTransition("*", "Rearm", "Rearm") -- Group is send to a coordinate and waits until ammo is refilled.
|
self:AddTransition("*", "Rearm", "Rearm") -- Group is send to a coordinate and waits until ammo is refilled.
|
||||||
self:AddTransition("Rearm", "Rearming", "Rearming") -- Group has arrived at the rearming coodinate and is waiting to be fully rearmed.
|
self:AddTransition("Rearm", "Rearming", "Rearming") -- Group has arrived at the rearming coodinate and is waiting to be fully rearmed.
|
||||||
@ -152,8 +153,7 @@ function ARMYGROUP:New(Group)
|
|||||||
-- Handle events:
|
-- Handle events:
|
||||||
self:HandleEvent(EVENTS.Birth, self.OnEventBirth)
|
self:HandleEvent(EVENTS.Birth, self.OnEventBirth)
|
||||||
self:HandleEvent(EVENTS.Dead, self.OnEventDead)
|
self:HandleEvent(EVENTS.Dead, self.OnEventDead)
|
||||||
self:HandleEvent(EVENTS.RemoveUnit, self.OnEventRemoveUnit)
|
self:HandleEvent(EVENTS.RemoveUnit, self.OnEventRemoveUnit)
|
||||||
|
|
||||||
--self:HandleEvent(EVENTS.Hit, self.OnEventHit)
|
--self:HandleEvent(EVENTS.Hit, self.OnEventHit)
|
||||||
|
|
||||||
-- Start the status monitoring.
|
-- Start the status monitoring.
|
||||||
@ -343,7 +343,9 @@ function ARMYGROUP:onafterStatus(From, Event, To)
|
|||||||
-- FSM state.
|
-- FSM state.
|
||||||
local fsmstate=self:GetState()
|
local fsmstate=self:GetState()
|
||||||
|
|
||||||
if self:IsAlive() then
|
local alive=self:IsAlive()
|
||||||
|
|
||||||
|
if alive then
|
||||||
|
|
||||||
---
|
---
|
||||||
-- Detection
|
-- Detection
|
||||||
@ -371,6 +373,10 @@ function ARMYGROUP:onafterStatus(From, Event, To)
|
|||||||
self:_UpdateEngageTarget()
|
self:_UpdateEngageTarget()
|
||||||
end
|
end
|
||||||
|
|
||||||
|
end
|
||||||
|
|
||||||
|
if alive~=nil then
|
||||||
|
|
||||||
if self.verbose>=1 then
|
if self.verbose>=1 then
|
||||||
|
|
||||||
-- Get number of tasks and missions.
|
-- Get number of tasks and missions.
|
||||||
@ -379,14 +385,20 @@ function ARMYGROUP:onafterStatus(From, Event, To)
|
|||||||
|
|
||||||
local roe=self:GetROE()
|
local roe=self:GetROE()
|
||||||
local alarm=self:GetAlarmstate()
|
local alarm=self:GetAlarmstate()
|
||||||
local speed=UTILS.MpsToKnots(self.velocity)
|
local speed=UTILS.MpsToKnots(self.velocity or 0)
|
||||||
local speedEx=UTILS.MpsToKnots(self:GetExpectedSpeed())
|
local speedEx=UTILS.MpsToKnots(self:GetExpectedSpeed())
|
||||||
local formation=self.option.Formation or "unknown"
|
local formation=self.option.Formation or "unknown"
|
||||||
local ammo=self:GetAmmoTot()
|
local ammo=self:GetAmmoTot()
|
||||||
|
|
||||||
|
local cargo=0
|
||||||
|
for _,_element in pairs(self.elements) do
|
||||||
|
local element=_element --Ops.OpsGroup#OPSGROUP.Element
|
||||||
|
cargo=cargo+element.weightCargo
|
||||||
|
end
|
||||||
|
|
||||||
-- Info text.
|
-- Info text.
|
||||||
local text=string.format("%s [ROE-AS=%d-%d T/M=%d/%d]: Wp=%d/%d-->%d (final %s), Life=%.1f, Speed=%.1f (%d), Heading=%03d, Ammo=%d",
|
local text=string.format("%s [ROE-AS=%d-%d T/M=%d/%d]: Wp=%d/%d-->%d (final %s), Life=%.1f, Speed=%.1f (%d), Heading=%03d, Ammo=%d, Cargo=%.1f",
|
||||||
fsmstate, roe, alarm, nTaskTot, nMissions, self.currentwp, #self.waypoints, self:GetWaypointIndexNext(), tostring(self.passedfinalwp), self.life or 0, speed, speedEx, self.heading, ammo.Total)
|
fsmstate, roe, alarm, nTaskTot, nMissions, self.currentwp, #self.waypoints, self:GetWaypointIndexNext(), tostring(self.passedfinalwp), self.life or 0, speed, speedEx, self.heading or 0, ammo.Total, cargo)
|
||||||
self:I(self.lid..text)
|
self:I(self.lid..text)
|
||||||
|
|
||||||
end
|
end
|
||||||
@ -408,7 +420,7 @@ function ARMYGROUP:onafterStatus(From, Event, To)
|
|||||||
if self.verbose>=2 then
|
if self.verbose>=2 then
|
||||||
local text="Elements:"
|
local text="Elements:"
|
||||||
for i,_element in pairs(self.elements) do
|
for i,_element in pairs(self.elements) do
|
||||||
local element=_element --#ARMYGROUP.Element
|
local element=_element --Ops.OpsGroup#OPSGROUP.Element
|
||||||
|
|
||||||
local name=element.name
|
local name=element.name
|
||||||
local status=element.status
|
local status=element.status
|
||||||
@ -443,6 +455,26 @@ function ARMYGROUP:onafterStatus(From, Event, To)
|
|||||||
self:__Status(-30)
|
self:__Status(-30)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
||||||
|
-- DCS Events ==> See OPSGROUP
|
||||||
|
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
--- Event function handling when a unit is hit.
|
||||||
|
-- @param #ARMYGROUP self
|
||||||
|
-- @param Core.Event#EVENTDATA EventData Event data.
|
||||||
|
function ARMYGROUP:OnEventHit(EventData)
|
||||||
|
|
||||||
|
-- Check that this is the right group.
|
||||||
|
if EventData and EventData.IniGroup and EventData.IniUnit and EventData.IniGroupName and EventData.IniGroupName==self.groupname then
|
||||||
|
local unit=EventData.IniUnit
|
||||||
|
local group=EventData.IniGroup
|
||||||
|
local unitname=EventData.IniUnitName
|
||||||
|
|
||||||
|
-- TODO: suppression
|
||||||
|
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
||||||
-- FSM Events
|
-- FSM Events
|
||||||
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
||||||
@ -452,7 +484,7 @@ 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 #ARMYGROUP.Element Element The group element.
|
-- @param Ops.OpsGroup#OPSGROUP.Element Element The group element.
|
||||||
function ARMYGROUP:onafterElementSpawned(From, Event, To, Element)
|
function ARMYGROUP:onafterElementSpawned(From, Event, To, Element)
|
||||||
self:T(self.lid..string.format("Element spawned %s", Element.name))
|
self:T(self.lid..string.format("Element spawned %s", Element.name))
|
||||||
|
|
||||||
@ -811,6 +843,40 @@ function ARMYGROUP:onafterRetreated(From, Event, To)
|
|||||||
|
|
||||||
end
|
end
|
||||||
|
|
||||||
|
--- On after "Board" event.
|
||||||
|
-- @param #ARMYGROUP self
|
||||||
|
-- @param #string From From state.
|
||||||
|
-- @param #string Event Event.
|
||||||
|
-- @param #string To To state.
|
||||||
|
-- @param Ops.OpsGroup#OPSGROUP.Element Carrier to board.
|
||||||
|
function ARMYGROUP:onafterBoard(From, Event, To, Carrier, Formation)
|
||||||
|
|
||||||
|
local Coordinate=Carrier.unit:GetCoordinate()
|
||||||
|
|
||||||
|
local Speed=UTILS.KmphToKnots(self.speedMax*0.2)
|
||||||
|
|
||||||
|
local waypoint=self:AddWaypoint(Coordinate, Speed, AfterWaypointWithID, Formation, true)
|
||||||
|
|
||||||
|
|
||||||
|
end
|
||||||
|
|
||||||
|
--- On after "Pickup" event.
|
||||||
|
-- @param #ARMYGROUP self
|
||||||
|
-- @param #string From From state.
|
||||||
|
-- @param #string Event Event.
|
||||||
|
-- @param #string To To state.
|
||||||
|
-- @param Ops.OpsGroup#OPSGROUP.Element Carrier to board.
|
||||||
|
function ARMYGROUP:onafterBoard(From, Event, To, Carrier, Formation)
|
||||||
|
|
||||||
|
local Coordinate=Carrier.unit:GetCoordinate()
|
||||||
|
|
||||||
|
local Speed=UTILS.KmphToKnots(self.speedMax*0.2)
|
||||||
|
|
||||||
|
local waypoint=self:AddWaypoint(Coordinate, Speed, AfterWaypointWithID, Formation, true)
|
||||||
|
|
||||||
|
|
||||||
|
end
|
||||||
|
|
||||||
--- On after "EngageTarget" event.
|
--- On after "EngageTarget" event.
|
||||||
-- @param #ARMYGROUP self
|
-- @param #ARMYGROUP self
|
||||||
-- @param #string From From state.
|
-- @param #string From From state.
|
||||||
@ -980,113 +1046,6 @@ function ARMYGROUP:onafterStop(From, Event, To)
|
|||||||
|
|
||||||
end
|
end
|
||||||
|
|
||||||
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
|
||||||
-- Events DCS
|
|
||||||
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
--- Event function handling the birth of a unit.
|
|
||||||
-- @param #ARMYGROUP self
|
|
||||||
-- @param Core.Event#EVENTDATA EventData Event data.
|
|
||||||
function ARMYGROUP:OnEventBirth(EventData)
|
|
||||||
|
|
||||||
-- Check that this is the right group.
|
|
||||||
if EventData and EventData.IniGroup and EventData.IniUnit and EventData.IniGroupName and EventData.IniGroupName==self.groupname then
|
|
||||||
local unit=EventData.IniUnit
|
|
||||||
local group=EventData.IniGroup
|
|
||||||
local unitname=EventData.IniUnitName
|
|
||||||
|
|
||||||
if self.respawning then
|
|
||||||
|
|
||||||
self:I(self.lid.."Respawning unit "..tostring(unitname))
|
|
||||||
|
|
||||||
local function reset()
|
|
||||||
self.respawning=nil
|
|
||||||
self:_CheckGroupDone()
|
|
||||||
end
|
|
||||||
|
|
||||||
-- Reset switch in 1 sec. This should allow all birth events of n>1 groups to have passed.
|
|
||||||
-- TODO: Can I do this more rigorously?
|
|
||||||
self:ScheduleOnce(1, reset)
|
|
||||||
|
|
||||||
else
|
|
||||||
|
|
||||||
-- Get element.
|
|
||||||
local element=self:GetElementByName(unitname)
|
|
||||||
|
|
||||||
-- Set element to spawned state.
|
|
||||||
self:T3(self.lid..string.format("EVENT: Element %s born ==> spawned", element.name))
|
|
||||||
self:ElementSpawned(element)
|
|
||||||
|
|
||||||
end
|
|
||||||
|
|
||||||
end
|
|
||||||
|
|
||||||
end
|
|
||||||
|
|
||||||
--- Event function handling the crash of a unit.
|
|
||||||
-- @param #ARMYGROUP self
|
|
||||||
-- @param Core.Event#EVENTDATA EventData Event data.
|
|
||||||
function ARMYGROUP:OnEventDead(EventData)
|
|
||||||
|
|
||||||
-- Check that this is the right group.
|
|
||||||
if EventData and EventData.IniGroup and EventData.IniUnit and EventData.IniGroupName and EventData.IniGroupName==self.groupname then
|
|
||||||
self:T(self.lid..string.format("EVENT: Unit %s dead!", EventData.IniUnitName))
|
|
||||||
|
|
||||||
local unit=EventData.IniUnit
|
|
||||||
local group=EventData.IniGroup
|
|
||||||
local unitname=EventData.IniUnitName
|
|
||||||
|
|
||||||
-- Get element.
|
|
||||||
local element=self:GetElementByName(unitname)
|
|
||||||
|
|
||||||
if element then
|
|
||||||
self:T(self.lid..string.format("EVENT: Element %s dead ==> destroyed", element.name))
|
|
||||||
self:ElementDestroyed(element)
|
|
||||||
end
|
|
||||||
|
|
||||||
end
|
|
||||||
|
|
||||||
end
|
|
||||||
|
|
||||||
--- Event function handling when a unit is removed from the game.
|
|
||||||
-- @param #ARMYGROUP self
|
|
||||||
-- @param Core.Event#EVENTDATA EventData Event data.
|
|
||||||
function ARMYGROUP:OnEventRemoveUnit(EventData)
|
|
||||||
|
|
||||||
-- Check that this is the right group.
|
|
||||||
if EventData and EventData.IniGroup and EventData.IniUnit and EventData.IniGroupName and EventData.IniGroupName==self.groupname then
|
|
||||||
local unit=EventData.IniUnit
|
|
||||||
local group=EventData.IniGroup
|
|
||||||
local unitname=EventData.IniUnitName
|
|
||||||
|
|
||||||
-- Get element.
|
|
||||||
local element=self:GetElementByName(unitname)
|
|
||||||
|
|
||||||
if element then
|
|
||||||
self:T(self.lid..string.format("EVENT: Element %s removed ==> dead", element.name))
|
|
||||||
self:ElementDead(element)
|
|
||||||
end
|
|
||||||
|
|
||||||
end
|
|
||||||
|
|
||||||
end
|
|
||||||
|
|
||||||
--- Event function handling when a unit is hit.
|
|
||||||
-- @param #ARMYGROUP self
|
|
||||||
-- @param Core.Event#EVENTDATA EventData Event data.
|
|
||||||
function ARMYGROUP:OnEventHit(EventData)
|
|
||||||
|
|
||||||
-- Check that this is the right group.
|
|
||||||
if EventData and EventData.IniGroup and EventData.IniUnit and EventData.IniGroupName and EventData.IniGroupName==self.groupname then
|
|
||||||
local unit=EventData.IniUnit
|
|
||||||
local group=EventData.IniGroup
|
|
||||||
local unitname=EventData.IniUnitName
|
|
||||||
|
|
||||||
-- TODO: suppression
|
|
||||||
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
||||||
-- Routing
|
-- Routing
|
||||||
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
||||||
@ -1197,49 +1156,17 @@ function ARMYGROUP:_InitGroup()
|
|||||||
-- Units of the group.
|
-- Units of the group.
|
||||||
local units=self.group:GetUnits()
|
local units=self.group:GetUnits()
|
||||||
|
|
||||||
for _,_unit in pairs(units) do
|
-- Add elemets.
|
||||||
local unit=_unit --Wrapper.Unit#UNIT
|
for _,unit in pairs(units) do
|
||||||
|
self:_AddElementByName(unit:GetName())
|
||||||
-- TODO: this is wrong when grouping is used!
|
|
||||||
local unittemplate=unit:GetTemplate()
|
|
||||||
|
|
||||||
local element={} --#ARMYGROUP.Element
|
|
||||||
element.name=unit:GetName()
|
|
||||||
element.unit=unit
|
|
||||||
element.status=OPSGROUP.ElementStatus.INUTERO
|
|
||||||
element.typename=unit:GetTypeName()
|
|
||||||
element.skill=unittemplate.skill or "Unknown"
|
|
||||||
element.ai=true
|
|
||||||
element.category=element.unit:GetUnitCategory()
|
|
||||||
element.categoryname=element.unit:GetCategoryName()
|
|
||||||
element.size, element.length, element.height, element.width=unit:GetObjectSize()
|
|
||||||
element.ammo0=self:GetAmmoUnit(unit, false)
|
|
||||||
element.life0=unit:GetLife0()
|
|
||||||
element.life=element.life0
|
|
||||||
|
|
||||||
-- Debug text.
|
|
||||||
if self.verbose>=2 then
|
|
||||||
local text=string.format("Adding element %s: status=%s, skill=%s, life=%.3f category=%s (%d), size: %.1f (L=%.1f H=%.1f W=%.1f)",
|
|
||||||
element.name, element.status, element.skill, element.life, element.categoryname, element.category, element.size, element.length, element.height, element.width)
|
|
||||||
self:I(self.lid..text)
|
|
||||||
end
|
|
||||||
|
|
||||||
-- Add element to table.
|
|
||||||
table.insert(self.elements, element)
|
|
||||||
|
|
||||||
-- Get Descriptors.
|
|
||||||
self.descriptors=self.descriptors or unit:GetDesc()
|
|
||||||
|
|
||||||
-- Set type name.
|
|
||||||
self.actype=self.actype or unit:GetTypeName()
|
|
||||||
|
|
||||||
if unit:IsAlive() then
|
|
||||||
-- Trigger spawned event.
|
|
||||||
self:ElementSpawned(element)
|
|
||||||
end
|
|
||||||
|
|
||||||
end
|
end
|
||||||
|
|
||||||
|
-- Get Descriptors.
|
||||||
|
self.descriptors=units[1]:GetDesc()
|
||||||
|
|
||||||
|
-- Set type name.
|
||||||
|
self.actype=units[1]:GetTypeName()
|
||||||
|
|
||||||
-- Debug info.
|
-- Debug info.
|
||||||
if self.verbose>=1 then
|
if self.verbose>=1 then
|
||||||
local text=string.format("Initialized Army Group %s:\n", self.groupname)
|
local text=string.format("Initialized Army Group %s:\n", self.groupname)
|
||||||
|
|||||||
@ -175,22 +175,13 @@ FLIGHTGROUP.Attribute = {
|
|||||||
|
|
||||||
--- Flight group element.
|
--- Flight group element.
|
||||||
-- @type FLIGHTGROUP.Element
|
-- @type FLIGHTGROUP.Element
|
||||||
-- @field #string name Name of the element, i.e. the unit/client.
|
|
||||||
-- @field Wrapper.Unit#UNIT unit Element unit object.
|
|
||||||
-- @field Wrapper.Group#GROUP group Group object of the element.
|
|
||||||
-- @field #string modex Tail number.
|
-- @field #string modex Tail number.
|
||||||
-- @field #string skill Skill level.
|
|
||||||
-- @field #boolean ai If true, element is AI.
|
|
||||||
-- @field Wrapper.Client#CLIENT client The client if element is occupied by a human player.
|
-- @field Wrapper.Client#CLIENT client The client if element is occupied by a human player.
|
||||||
-- @field #table pylons Table of pylons.
|
-- @field #table pylons Table of pylons.
|
||||||
-- @field #number fuelmass Mass of fuel in kg.
|
-- @field #number fuelmass Mass of fuel in kg.
|
||||||
-- @field #number category Aircraft category.
|
|
||||||
-- @field #string categoryname Aircraft category name.
|
|
||||||
-- @field #string callsign Call sign, e.g. "Uzi 1-1".
|
-- @field #string callsign Call sign, e.g. "Uzi 1-1".
|
||||||
-- @field #string status Status, i.e. born, parking, taxiing. See @{#OPSGROUP.ElementStatus}.
|
|
||||||
-- @field #number damage Damage of element in percent.
|
|
||||||
-- @field Wrapper.Airbase#AIRBASE.ParkingSpot parking The parking spot table the element is parking on.
|
-- @field Wrapper.Airbase#AIRBASE.ParkingSpot parking The parking spot table the element is parking on.
|
||||||
|
-- @extends Ops.OpsGroup#OPSGROUP.Element
|
||||||
|
|
||||||
--- FLIGHTGROUP class version.
|
--- FLIGHTGROUP class version.
|
||||||
-- @field #string version
|
-- @field #string version
|
||||||
@ -243,7 +234,7 @@ function FLIGHTGROUP:New(group)
|
|||||||
self.lid=string.format("FLIGHTGROUP %s | ", self.groupname)
|
self.lid=string.format("FLIGHTGROUP %s | ", self.groupname)
|
||||||
|
|
||||||
-- Defaults
|
-- Defaults
|
||||||
--self:SetVerbosity(0)
|
self.isFlightgroup=true
|
||||||
self:SetFuelLowThreshold()
|
self:SetFuelLowThreshold()
|
||||||
self:SetFuelLowRTB()
|
self:SetFuelLowRTB()
|
||||||
self:SetFuelCriticalThreshold()
|
self:SetFuelCriticalThreshold()
|
||||||
@ -251,7 +242,6 @@ function FLIGHTGROUP:New(group)
|
|||||||
self:SetDefaultROE()
|
self:SetDefaultROE()
|
||||||
self:SetDefaultROT()
|
self:SetDefaultROT()
|
||||||
self:SetDetection()
|
self:SetDetection()
|
||||||
self.isFlightgroup=true
|
|
||||||
|
|
||||||
-- Holding flag.
|
-- Holding flag.
|
||||||
self.flaghold=USERFLAG:New(string.format("%s_FlagHold", self.groupname))
|
self.flaghold=USERFLAG:New(string.format("%s_FlagHold", self.groupname))
|
||||||
@ -314,13 +304,6 @@ function FLIGHTGROUP:New(group)
|
|||||||
|
|
||||||
-- TODO: Add pseudo functions.
|
-- TODO: Add pseudo functions.
|
||||||
|
|
||||||
-- Debug trace.
|
|
||||||
if false then
|
|
||||||
BASE:TraceOnOff(true)
|
|
||||||
BASE:TraceClass(self.ClassName)
|
|
||||||
BASE:TraceLevel(1)
|
|
||||||
end
|
|
||||||
|
|
||||||
-- Add to data base.
|
-- Add to data base.
|
||||||
_DATABASE:AddFlightGroup(self)
|
_DATABASE:AddFlightGroup(self)
|
||||||
|
|
||||||
@ -554,7 +537,7 @@ end
|
|||||||
|
|
||||||
--- Disable to automatically engage detected targets.
|
--- Disable to automatically engage detected targets.
|
||||||
-- @param #FLIGHTGROUP self
|
-- @param #FLIGHTGROUP self
|
||||||
-- @return #OPSGROUP self
|
-- @return #FLIGHTGROUP self
|
||||||
function FLIGHTGROUP:SetEngageDetectedOff()
|
function FLIGHTGROUP:SetEngageDetectedOff()
|
||||||
self.engagedetectedOn=false
|
self.engagedetectedOn=false
|
||||||
return self
|
return self
|
||||||
@ -747,7 +730,7 @@ function FLIGHTGROUP:GetFuelMin()
|
|||||||
|
|
||||||
local fuelmin=math.huge
|
local fuelmin=math.huge
|
||||||
for i,_element in pairs(self.elements) do
|
for i,_element in pairs(self.elements) do
|
||||||
local element=_element --#FLIGHTGROUP.Element
|
local element=_element --Ops.OpsGroup#OPSGROUP.Element
|
||||||
|
|
||||||
local unit=element.unit
|
local unit=element.unit
|
||||||
|
|
||||||
@ -1119,64 +1102,9 @@ function FLIGHTGROUP:onafterStatus(From, Event, To)
|
|||||||
end
|
end
|
||||||
|
|
||||||
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
||||||
-- Events
|
-- DCS Events ==> See also OPSGROUP
|
||||||
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
||||||
|
|
||||||
--- Flightgroup event function, handling the birth of a unit.
|
|
||||||
-- @param #FLIGHTGROUP self
|
|
||||||
-- @param Core.Event#EVENTDATA EventData Event data.
|
|
||||||
function FLIGHTGROUP:OnEventBirth(EventData)
|
|
||||||
|
|
||||||
--env.info(string.format("EVENT: Birth for unit %s", tostring(EventData.IniUnitName)))
|
|
||||||
|
|
||||||
-- Check that this is the right group.
|
|
||||||
if EventData and EventData.IniGroup and EventData.IniUnit and EventData.IniGroupName and EventData.IniGroupName==self.groupname then
|
|
||||||
local unit=EventData.IniUnit
|
|
||||||
local group=EventData.IniGroup
|
|
||||||
local unitname=EventData.IniUnitName
|
|
||||||
|
|
||||||
-- Set group.
|
|
||||||
self.group=self.group or EventData.IniGroup
|
|
||||||
|
|
||||||
if self.respawning then
|
|
||||||
|
|
||||||
local function reset()
|
|
||||||
self.respawning=nil
|
|
||||||
end
|
|
||||||
|
|
||||||
-- Reset switch in 1 sec. This should allow all birth events of n>1 groups to have passed.
|
|
||||||
-- TODO: Can I do this more rigorously?
|
|
||||||
self:ScheduleOnce(1, reset)
|
|
||||||
|
|
||||||
else
|
|
||||||
|
|
||||||
-- Set homebase if not already set.
|
|
||||||
if EventData.Place then
|
|
||||||
self.homebase=self.homebase or EventData.Place
|
|
||||||
end
|
|
||||||
|
|
||||||
if self.homebase and not self.destbase then
|
|
||||||
self.destbase=self.homebase
|
|
||||||
end
|
|
||||||
|
|
||||||
-- Get element.
|
|
||||||
local element=self:GetElementByName(unitname)
|
|
||||||
|
|
||||||
-- Create element spawned event if not already present.
|
|
||||||
if not self:_IsElement(unitname) then
|
|
||||||
element=self:AddElementByName(unitname)
|
|
||||||
end
|
|
||||||
|
|
||||||
-- Set element to spawned state.
|
|
||||||
self:T(self.lid..string.format("EVENT: Element %s born at airbase %s==> spawned", element.name, self.homebase and self.homebase:GetName() or "unknown"))
|
|
||||||
self:ElementSpawned(element)
|
|
||||||
|
|
||||||
end
|
|
||||||
|
|
||||||
end
|
|
||||||
|
|
||||||
end
|
|
||||||
|
|
||||||
--- Flightgroup event function handling the crash of a unit.
|
--- Flightgroup event function handling the crash of a unit.
|
||||||
-- @param #FLIGHTGROUP self
|
-- @param #FLIGHTGROUP self
|
||||||
-- @param Core.Event#EVENTDATA EventData Event data.
|
-- @param Core.Event#EVENTDATA EventData Event data.
|
||||||
@ -1356,69 +1284,7 @@ function FLIGHTGROUP:OnEventUnitLost(EventData)
|
|||||||
|
|
||||||
end
|
end
|
||||||
|
|
||||||
--- Flightgroup event function handling the crash of a unit.
|
|
||||||
-- @param #FLIGHTGROUP self
|
|
||||||
-- @param Core.Event#EVENTDATA EventData Event data.
|
|
||||||
function FLIGHTGROUP:OnEventKill(EventData)
|
|
||||||
|
|
||||||
-- Check that this is the right group.
|
|
||||||
if EventData and EventData.IniGroup and EventData.IniUnit and EventData.IniGroupName and EventData.IniGroupName==self.groupname then
|
|
||||||
|
|
||||||
-- Target name
|
|
||||||
local targetname=tostring(EventData.TgtUnitName)
|
|
||||||
|
|
||||||
-- Debug info.
|
|
||||||
self:T2(self.lid..string.format("EVENT: Unit %s killed object %s!", tostring(EventData.IniUnitName), targetname))
|
|
||||||
|
|
||||||
-- Check if this was a UNIT or STATIC object.
|
|
||||||
local target=UNIT:FindByName(targetname)
|
|
||||||
if not target then
|
|
||||||
target=STATIC:FindByName(targetname, false)
|
|
||||||
end
|
|
||||||
|
|
||||||
-- Only count UNITS and STATICs (not SCENERY)
|
|
||||||
if target then
|
|
||||||
|
|
||||||
-- Debug info.
|
|
||||||
self:T(self.lid..string.format("EVENT: Unit %s killed unit/static %s!", tostring(EventData.IniUnitName), targetname))
|
|
||||||
|
|
||||||
-- Kill counter.
|
|
||||||
self.Nkills=self.Nkills+1
|
|
||||||
|
|
||||||
-- Check if on a mission.
|
|
||||||
local mission=self:GetMissionCurrent()
|
|
||||||
if mission then
|
|
||||||
mission.Nkills=mission.Nkills+1 -- Increase mission kill counter.
|
|
||||||
end
|
|
||||||
|
|
||||||
end
|
|
||||||
|
|
||||||
end
|
|
||||||
|
|
||||||
end
|
|
||||||
|
|
||||||
--- Flightgroup event function handling the crash of a unit.
|
|
||||||
-- @param #FLIGHTGROUP self
|
|
||||||
-- @param Core.Event#EVENTDATA EventData Event data.
|
|
||||||
function FLIGHTGROUP:OnEventRemoveUnit(EventData)
|
|
||||||
|
|
||||||
-- Check that this is the right group.
|
|
||||||
if EventData and EventData.IniGroup and EventData.IniUnit and EventData.IniGroupName and EventData.IniGroupName==self.groupname then
|
|
||||||
local unit=EventData.IniUnit
|
|
||||||
local group=EventData.IniGroup
|
|
||||||
local unitname=EventData.IniUnitName
|
|
||||||
|
|
||||||
-- Get element.
|
|
||||||
local element=self:GetElementByName(unitname)
|
|
||||||
|
|
||||||
if element then
|
|
||||||
self:T3(self.lid..string.format("EVENT: Element %s removed ==> dead", element.name))
|
|
||||||
self:ElementDead(element)
|
|
||||||
end
|
|
||||||
|
|
||||||
end
|
|
||||||
|
|
||||||
end
|
|
||||||
|
|
||||||
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
||||||
-- FSM functions
|
-- FSM functions
|
||||||
@ -1743,7 +1609,7 @@ function FLIGHTGROUP:onafterTaxiing(From, Event, To)
|
|||||||
self.Tparking=nil
|
self.Tparking=nil
|
||||||
|
|
||||||
-- TODO: need a better check for the airbase.
|
-- TODO: need a better check for the airbase.
|
||||||
local airbase=self:GetClosestAirbase() --self.group:GetCoordinate():GetClosestAirbase(nil, self.group:GetCoalition())
|
local airbase=self:GetClosestAirbase()
|
||||||
|
|
||||||
if self.flightcontrol and airbase and self.flightcontrol.airbasename==airbase:GetName() then
|
if self.flightcontrol and airbase and self.flightcontrol.airbasename==airbase:GetName() then
|
||||||
|
|
||||||
@ -2894,7 +2760,7 @@ function FLIGHTGROUP:_InitGroup()
|
|||||||
|
|
||||||
-- Add elemets.
|
-- Add elemets.
|
||||||
for _,unit in pairs(self.group:GetUnits()) do
|
for _,unit in pairs(self.group:GetUnits()) do
|
||||||
local element=self:AddElementByName(unit:GetName())
|
self:_AddElementByName(unit:GetName())
|
||||||
end
|
end
|
||||||
|
|
||||||
-- Get first unit. This is used to extract other parameters.
|
-- Get first unit. This is used to extract other parameters.
|
||||||
@ -2960,10 +2826,11 @@ function FLIGHTGROUP:AddElementByName(unitname)
|
|||||||
local element={} --#FLIGHTGROUP.Element
|
local element={} --#FLIGHTGROUP.Element
|
||||||
|
|
||||||
element.name=unitname
|
element.name=unitname
|
||||||
element.unit=unit
|
|
||||||
element.status=OPSGROUP.ElementStatus.INUTERO
|
element.status=OPSGROUP.ElementStatus.INUTERO
|
||||||
|
element.unit=unit
|
||||||
element.group=unit:GetGroup()
|
element.group=unit:GetGroup()
|
||||||
|
|
||||||
|
|
||||||
-- TODO: this is wrong when grouping is used!
|
-- TODO: this is wrong when grouping is used!
|
||||||
local unittemplate=element.unit:GetTemplate()
|
local unittemplate=element.unit:GetTemplate()
|
||||||
|
|
||||||
|
|||||||
@ -611,6 +611,12 @@ function NAVYGROUP:onafterStatus(From, Event, To)
|
|||||||
self:__Status(-30)
|
self:__Status(-30)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
||||||
|
-- DCS Events ==> See OPSGROUP
|
||||||
|
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
-- See OPSGROUP!
|
||||||
|
|
||||||
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
||||||
-- FSM Events
|
-- FSM Events
|
||||||
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
||||||
@ -1032,94 +1038,6 @@ function NAVYGROUP:onafterStop(From, Event, To)
|
|||||||
|
|
||||||
end
|
end
|
||||||
|
|
||||||
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
|
||||||
-- Events DCS
|
|
||||||
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
--- Event function handling the birth of a unit.
|
|
||||||
-- @param #NAVYGROUP self
|
|
||||||
-- @param Core.Event#EVENTDATA EventData Event data.
|
|
||||||
function NAVYGROUP:OnEventBirth(EventData)
|
|
||||||
|
|
||||||
-- Check that this is the right group.
|
|
||||||
if EventData and EventData.IniGroup and EventData.IniUnit and EventData.IniGroupName and EventData.IniGroupName==self.groupname then
|
|
||||||
local unit=EventData.IniUnit
|
|
||||||
local group=EventData.IniGroup
|
|
||||||
local unitname=EventData.IniUnitName
|
|
||||||
|
|
||||||
if self.respawning then
|
|
||||||
|
|
||||||
local function reset()
|
|
||||||
self.respawning=nil
|
|
||||||
end
|
|
||||||
|
|
||||||
-- Reset switch in 1 sec. This should allow all birth events of n>1 groups to have passed.
|
|
||||||
-- TODO: Can I do this more rigorously?
|
|
||||||
self:ScheduleOnce(1, reset)
|
|
||||||
|
|
||||||
else
|
|
||||||
|
|
||||||
-- Get element.
|
|
||||||
local element=self:GetElementByName(unitname)
|
|
||||||
|
|
||||||
-- Set element to spawned state.
|
|
||||||
self:T3(self.lid..string.format("EVENT: Element %s born ==> spawned", element.name))
|
|
||||||
self:ElementSpawned(element)
|
|
||||||
|
|
||||||
end
|
|
||||||
|
|
||||||
end
|
|
||||||
|
|
||||||
end
|
|
||||||
|
|
||||||
--- Flightgroup event function handling the crash of a unit.
|
|
||||||
-- @param #NAVYGROUP self
|
|
||||||
-- @param Core.Event#EVENTDATA EventData Event data.
|
|
||||||
function NAVYGROUP:OnEventDead(EventData)
|
|
||||||
|
|
||||||
-- Check that this is the right group.
|
|
||||||
if EventData and EventData.IniGroup and EventData.IniUnit and EventData.IniGroupName and EventData.IniGroupName==self.groupname then
|
|
||||||
self:T(self.lid..string.format("EVENT: Unit %s dead!", EventData.IniUnitName))
|
|
||||||
|
|
||||||
local unit=EventData.IniUnit
|
|
||||||
local group=EventData.IniGroup
|
|
||||||
local unitname=EventData.IniUnitName
|
|
||||||
|
|
||||||
-- Get element.
|
|
||||||
local element=self:GetElementByName(unitname)
|
|
||||||
|
|
||||||
if element then
|
|
||||||
self:T(self.lid..string.format("EVENT: Element %s dead ==> destroyed", element.name))
|
|
||||||
self:ElementDestroyed(element)
|
|
||||||
end
|
|
||||||
|
|
||||||
end
|
|
||||||
|
|
||||||
end
|
|
||||||
|
|
||||||
--- Flightgroup event function handling the crash of a unit.
|
|
||||||
-- @param #NAVYGROUP self
|
|
||||||
-- @param Core.Event#EVENTDATA EventData Event data.
|
|
||||||
function NAVYGROUP:OnEventRemoveUnit(EventData)
|
|
||||||
|
|
||||||
-- Check that this is the right group.
|
|
||||||
if EventData and EventData.IniGroup and EventData.IniUnit and EventData.IniGroupName and EventData.IniGroupName==self.groupname then
|
|
||||||
local unit=EventData.IniUnit
|
|
||||||
local group=EventData.IniGroup
|
|
||||||
local unitname=EventData.IniUnitName
|
|
||||||
|
|
||||||
-- Get element.
|
|
||||||
local element=self:GetElementByName(unitname)
|
|
||||||
|
|
||||||
if element then
|
|
||||||
self:T(self.lid..string.format("EVENT: Element %s removed ==> dead", element.name))
|
|
||||||
self:ElementDead(element)
|
|
||||||
end
|
|
||||||
|
|
||||||
end
|
|
||||||
|
|
||||||
end
|
|
||||||
|
|
||||||
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
||||||
-- Routing
|
-- Routing
|
||||||
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
Loading…
x
Reference in New Issue
Block a user