This commit is contained in:
Frank
2019-12-06 23:31:44 +01:00
parent 5b57873dee
commit abbe53c7fa
3 changed files with 139 additions and 83 deletions
+40 -23
View File
@@ -104,11 +104,11 @@ end
-- @param #string To To state. -- @param #string To To state.
function RAT2:onafterStatus(From, Event, To) function RAT2:onafterStatus(From, Event, To)
self:I(string.format("RAT status %s", self:GetState()))
-- Check queue of aircraft to spawn. -- Check queue of aircraft to spawn.
self:_CheckQueueSpawn() self:_CheckQueueSpawn()
self:_CheckArrived()
self:__Status(-10) self:__Status(-10)
end end
@@ -117,14 +117,23 @@ end
-- @param #RAT2 self -- @param #RAT2 self
function RAT2:_CheckQueueSpawn() function RAT2:_CheckQueueSpawn()
self:I(string.format("Checking flights"))
-- Loop over all ratcraft.
for i,_ratcraft in pairs(self.Qcraft) do for i,_ratcraft in pairs(self.Qcraft) do
local ratcraft=_ratcraft --Functional.RatCraft#RATCRAFT local ratcraft=_ratcraft --Functional.RatCraft#RATCRAFT
-- Get number of alive groups. -- Get number of alive groups.
local Nalive=ratcraft:_GetAliveGroups() local Nalive=ratcraft:_GetAliveGroups()
-- Check if new groups should be spawned. for _,_flight in pairs(ratcraft.flights) do
if Nalive<ratcraft.Nspawn then local flight=_flight --Ops.FlightGroup#FLIGHTGROUP
self:I(string.format("Checking flight group %s in status %s", flight.groupname, flight:GetState()))
if flight:IsInUtero() or flight:IsArrived() or flight:IsDead() then
self:I(string.format("Spawning new flight group %s in status %s", flight.groupname, flight:GetState()))
-- Get departure and parking. -- Get departure and parking.
local departure, parking=ratcraft:GetDeparture() local departure, parking=ratcraft:GetDeparture()
@@ -137,29 +146,30 @@ function RAT2:_CheckQueueSpawn()
parking=departure.parking or parking parking=departure.parking or parking
-- Try to spawn a ratcraft group. -- Try to spawn a ratcraft group.
local group=self:_SpawnRatcraft(ratcraft, departure, destination, parking) local group=self:_SpawnRatcraft(ratcraft, flight, departure, destination, parking)
-- Remove queue item and break loop. -- Remove queue item and break loop.
if group then if group then
-- We add a little delay -- We add a little delay
self:__Spawned(0.1, group, ratcraft) self:__Spawned(0.1, group, flight, ratcraft)
break break
end end -- if group
end
end
end
end -- if departure
end -- if spawn flight
end -- for flights
end -- for ratcraft
end end
--- Check spawn queue and spawn aircraft if necessary. --- Check spawn queue and spawn aircraft if necessary.
-- @param #RAT2 self -- @param #RAT2 self
function RAT2:_CheckArrived() function RAT2:_CheckArrived()
for _,_flight in pairs(self.flights) do for _,_ratcraft in pairs(self.Qcraft) do
local ratcraft=_ratcraft --Functional.RatCraft#RATCRAFT
for _,_flight in pairs(ratcraft.flights) do
local flight=_flight --Ops.FlightGroup#FLIGHTGROUP local flight=_flight --Ops.FlightGroup#FLIGHTGROUP
if flight:IsArrived() then if flight:IsArrived() then
@@ -168,6 +178,7 @@ function RAT2:_CheckArrived()
end end
end end
end
end end
@@ -177,11 +188,15 @@ end
--- Function called after a RAT group was spawned. --- Function called after a RAT group was spawned.
-- @param #RAT2 self -- @param #RAT2 self
function RAT2:onafterSpawned(From, Event, To, group, ratcraft) -- @param #string From From state.
-- @param #string Event Event.
-- @param #string To To state.
-- @param Wrapper.Group#GROUP group The spawned group.
-- @param Ops.FlightGroup#FLIGHTGROUP flight The flight group.
-- @param Functional.RatCraft#RATCRAFT ratcraft The ratcraft object.
function RAT2:onafterSpawned(From, Event, To, group, flight, ratcraft)
local flightgroup=FLIGHTGROUP:New(group:GetName()) group:SmokeGreen()
table.insert(ratcraft.flights, flightgroup)
end end
@@ -191,15 +206,16 @@ end
--- Spawn an aircraft asset (plane or helo) at the airbase associated with the warehouse. --- Spawn an aircraft asset (plane or helo) at the airbase associated with the warehouse.
-- @param #RAT2 self -- @param #RAT2 self
-- @param #RATAC ratcraft Ratcraft to spawn. -- @param Functional.RatCraft#RATCRAFT ratcraft Ratcraft to spawn.
-- @param Ops.FlightGroup#FLIGHTGROUP flight Flight group.
-- @param Functional.RatCraft#RATCRAFT.Departure departure Departure. -- @param Functional.RatCraft#RATCRAFT.Departure departure Departure.
-- @param Functional.RatCraft#RATCRAFT.Departure destination Destination. -- @param Functional.RatCraft#RATCRAFT.Departure destination Destination.
-- @param #table parking Parking data for this group. -- @param #table parking Parking data for this group.
-- @return Wrapper.Group#GROUP The spawned group or nil if the group could not be spawned. -- @return Wrapper.Group#GROUP The spawned group or nil if the group could not be spawned.
function RAT2:_SpawnRatcraft(ratcraft, departure, destination, parking) function RAT2:_SpawnRatcraft(ratcraft, flight, departure, destination, parking)
-- Prepare the spawn template. -- Prepare the spawn template.
local template=self:_SpawnAssetPrepareTemplate(ratcraft) local template=self:_SpawnAssetPrepareTemplate(ratcraft, flight.groupname)
-- Get flight path if the group goes to another warehouse by itself. -- Get flight path if the group goes to another warehouse by itself.
template.route.points=self:_GetFlightplan(ratcraft, AIRBASE:FindByName(departure.name), AIRBASE:FindByName(destination.name)) template.route.points=self:_GetFlightplan(ratcraft, AIRBASE:FindByName(departure.name), AIRBASE:FindByName(destination.name))
@@ -301,15 +317,16 @@ end
--- Prepare a spawn template for the asset. Deep copy of asset template, adjusting template and unit names, nillifying group and unit ids. --- Prepare a spawn template for the asset. Deep copy of asset template, adjusting template and unit names, nillifying group and unit ids.
-- @param #RAT2 self -- @param #RAT2 self
-- @param #RATAC ratcraft Aircraft that will be spawned. -- @param Functional.RatCraft#RATCRAFT ratcraft Aircraft that will be spawned.
-- @param #string groupname Name for the group to be spawned.
-- @return #table Prepared new spawn template. -- @return #table Prepared new spawn template.
function RAT2:_SpawnAssetPrepareTemplate(ratcraft) function RAT2:_SpawnAssetPrepareTemplate(ratcraft, groupname)
-- Create an own copy of the template! -- Create an own copy of the template!
local template=UTILS.DeepCopy(ratcraft.template) local template=UTILS.DeepCopy(ratcraft.template)
-- Set unique name. -- Set unique name.
template.name=ratcraft.alias template.name=groupname
-- Set current(!) coalition and country. -- Set current(!) coalition and country.
template.CoalitionID=ratcraft.coalition template.CoalitionID=ratcraft.coalition
+60 -28
View File
@@ -48,7 +48,7 @@
-- @field #boolean journey If true, continue journey from the current destination. -- @field #boolean journey If true, continue journey from the current destination.
-- @field #string takeoff Takeoff type cold, hot, air. -- @field #string takeoff Takeoff type cold, hot, air.
-- @field #string landing Landing type. -- @field #string landing Landing type.
-- @field #table Table of flight groups. -- @field #table flights Table of flight groups.
-- @field #number Nspawn Number of max spawned aircraft groups. -- @field #number Nspawn Number of max spawned aircraft groups.
-- @extends Core.Fsm#FSM -- @extends Core.Fsm#FSM
RATCRAFT = { RATCRAFT = {
@@ -82,8 +82,7 @@ RATCRAFT = {
takeoff = nil, takeoff = nil,
landing = nil, landing = nil,
flights = {}, flights = {},
Nalive = 0, Nspawn = 2,
Nspawn = 1,
} }
--- Generalized asset attributes. Can be used to request assets with certain general characteristics. See [DCS attributes](https://wiki.hoggitworld.com/view/DCS_enum_attributes) on hoggit. --- Generalized asset attributes. Can be used to request assets with certain general characteristics. See [DCS attributes](https://wiki.hoggitworld.com/view/DCS_enum_attributes) on hoggit.
@@ -143,18 +142,47 @@ RATCRAFT.DeType={
--- Create a new RATCRAFT class object from a template group defined in the mission editor. --- Create a new RATCRAFT class object from a template group defined in the mission editor.
-- @param #RATCRAFT self -- @param #RATCRAFT self
-- @param #string groupname Name of the **late activated** template group. -- @param #string groupname Name of the **late activated** template group.
-- @param #number nspawn Number of groups to spawn. Default 1.
-- @param #string alias (Optional) Alias for the group name used as spawn name prefix. Default is the group name. -- @param #string alias (Optional) Alias for the group name used as spawn name prefix. Default is the group name.
-- @return #RATCRAFT self -- @return #RATCRAFT self
function RATCRAFT:New(groupname, alias) function RATCRAFT:New(groupname, nspawn, alias)
-- Inherit everything from FSM class. -- Inherit everything from FSM class.
local self=BASE:Inherit(self, FSM:New()) --#RATCRAFT local self=BASE:Inherit(self, FSM:New()) --#RATCRAFT
self.templategroup=GROUP:FindByName(groupname) -- Defaults
self.templatename=groupname self.Nspawn=nspawn or 1
self.template=self.templategroup:GetTemplate()
self.alias=alias or groupname self.alias=alias or groupname
-- Start State.
self:SetStartState("Stopped")
-- Add FSM transitions.
-- From State --> Event --> To State
self:AddTransition("Stopped", "Load", "Stopped") -- Load ratcraft from file.
self:AddTransition("Stopped", "Start", "Running") -- Start RAT2 script.
self:AddTransition("Running", "Pause", "Paused") -- Pause spawning RATCRAFT.
self:AddTransition("Paused", "Unpause", "Running") -- UnPause spawning RATCRAFT.
-- Initialize aircraft parameters.
self:_Init(groupname)
self:Start()
return self
end
--- Init aircraft parameters.
-- @param #RATCRAFT self
-- @param #string groupname Name of the template group.
-- @return #RATCRAFT self
function RATCRAFT:_Init(groupname)
self.templatename=groupname
self.templategroup=GROUP:FindByName(groupname)
self.template=self.templategroup:GetTemplate()
self.speedmax=self.templategroup:GetSpeedMax() self.speedmax=self.templategroup:GetSpeedMax()
self.range=1000000 self.range=1000000
self.DCSdesc=self.templategroup:GetDCSDesc(1) self.DCSdesc=self.templategroup:GetDCSDesc(1)
@@ -170,26 +198,6 @@ function RATCRAFT:New(groupname, alias)
self.sizez=self.DCSdesc.box.max.z self.sizez=self.DCSdesc.box.max.z
self.size =math.max(self.sizex, self.sizez) self.size =math.max(self.sizex, self.sizez)
-- Start State.
self:SetStartState("Stopped")
-- Add FSM transitions.
-- From State --> Event --> To State
self:AddTransition("Stopped", "Load", "Stopped") -- Load ratcraft from file.
self:AddTransition("Stopped", "Start", "Running") -- Start RAT2 script.
self:AddTransition("Running", "Pause", "Paused") -- Pause spawning RATCRAFT.
self:AddTransition("Paused", "Unpause", "Running") -- UnPause spawning RATCRAFT.
return self
end
--- Init aircraft parameters.
-- @param #RATCRAFT self
-- @return #RATCRAFT self
function RATCRAFT:_Init()
end end
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
@@ -239,13 +247,13 @@ function RATCRAFT:AddDestinationAirbase(airbasename, parking)
local destination={} --#RATCRAFT.Departure local destination={} --#RATCRAFT.Departure
-- Convert parking IDs to complete parking data.
local spots=nil local spots=nil
if parking then if parking then
if type(parking)=="number" then if type(parking)=="number" then
parking={parking} parking={parking}
end end
-- Convert parking IDs to complete parking data.
spots={} spots={}
local airbase=AIRBASE:FindByName(airbasename) local airbase=AIRBASE:FindByName(airbasename)
for _,TerminalID in pairs(parking) do for _,TerminalID in pairs(parking) do
@@ -282,6 +290,30 @@ function RATCRAFT:AddDepartureZone(zone)
return self return self
end end
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
-- FSM Functions
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
--- Add a departure for the aircraft.
-- @param #RATCRAFT self
function RATCRAFT:onafterStart()
-- Create flight groups.
for i=1,self.Nspawn do
-- Group name.
local groupname=string.format("%s-%02d", self.alias, i)
-- New flight group.
local flightgroup=FLIGHTGROUP:New(groupname)
-- Add flight to tabloe.
table.insert(self.flights, flightgroup)
end
end
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
-- Departure Functions -- Departure Functions
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+16 -9
View File
@@ -286,7 +286,7 @@ function FLIGHTGROUP:New(groupname)
-- Add FSM transitions. -- Add FSM transitions.
-- From State --> Event --> To State -- From State --> Event --> To State
self:AddTransition("Stopped", "Start", "Running") -- Start FSM. self:AddTransition("Stopped", "Start", "InUtero") -- Start FSM.
self:AddTransition("*", "Stop", "Stopped") -- Stop FSM. self:AddTransition("*", "Stop", "Stopped") -- Stop FSM.
self:AddTransition("*", "FlightStatus", "*") -- FLIGHTGROUP status update. self:AddTransition("*", "FlightStatus", "*") -- FLIGHTGROUP status update.
@@ -593,51 +593,58 @@ function FLIGHTGROUP:GetWaypointCurrent()
return self.waypoints[self.currentwp] return self.waypoints[self.currentwp]
end end
--- Check if flight is in state in utero.
-- @param #FLIGHTGROUP self
-- @return #boolean If true, flight is not spawned yet.
function FLIGHTGROUP:IsInUtero()
return self:Is("InUtero")
end
--- Check if flight is in state spawned. --- Check if flight is in state spawned.
-- @param #FLIGHTGROUP self -- @param #FLIGHTGROUP self
-- @return #boolean -- @return #boolean If true, flight is spawned.
function FLIGHTGROUP:IsSpawned() function FLIGHTGROUP:IsSpawned()
return self:Is("Spawned") return self:Is("Spawned")
end end
--- Check if flight is parking. --- Check if flight is parking.
-- @param #FLIGHTGROUP self -- @param #FLIGHTGROUP self
-- @return #boolean -- @return #boolean If true, flight is parking after spawned.
function FLIGHTGROUP:IsParking() function FLIGHTGROUP:IsParking()
return self:Is("Parking") return self:Is("Parking")
end end
--- Check if flight is parking. --- Check if flight is parking.
-- @param #FLIGHTGROUP self -- @param #FLIGHTGROUP self
-- @return #boolean -- @return #boolean If true, flight is taxiing after engine start up.
function FLIGHTGROUP:IsTaxiing() function FLIGHTGROUP:IsTaxiing()
return self:Is("Taxiing") return self:Is("Taxiing")
end end
--- Check if flight is airborne. --- Check if flight is airborne.
-- @param #FLIGHTGROUP self -- @param #FLIGHTGROUP self
-- @return #boolean -- @return #boolean If true, flight is airborne.
function FLIGHTGROUP:IsAirborne() function FLIGHTGROUP:IsAirborne()
return self:Is("Airborne") return self:Is("Airborne")
end end
--- Check if flight is landing. --- Check if flight is landing.
-- @param #FLIGHTGROUP self -- @param #FLIGHTGROUP self
-- @return #boolean -- @return #boolean If true, flight is landing, i.e. on final approach.
function FLIGHTGROUP:IsLanding() function FLIGHTGROUP:IsLanding()
return self:Is("Landing") return self:Is("Landing")
end end
--- Check if flight has landed and is now taxiing to its parking spot. --- Check if flight has landed and is now taxiing to its parking spot.
-- @param #FLIGHTGROUP self -- @param #FLIGHTGROUP self
-- @return #boolean -- @return #boolean If true, flight has landed
function FLIGHTGROUP:IsLanded() function FLIGHTGROUP:IsLanded()
return self:Is("Landed") return self:Is("Landed")
end end
--- Check if flight has arrived at its destination parking spot. --- Check if flight has arrived at its destination parking spot.
-- @param #FLIGHTGROUP self -- @param #FLIGHTGROUP self
-- @return #boolean -- @return #boolean If true, flight has arrived at its destination and is parking.
function FLIGHTGROUP:IsArrived() function FLIGHTGROUP:IsArrived()
return self:Is("Arrived") return self:Is("Arrived")
end end
@@ -651,7 +658,7 @@ end
--- Check if flight is dead. --- Check if flight is dead.
-- @param #FLIGHTGROUP self -- @param #FLIGHTGROUP self
-- @return #boolean -- @return #boolean If true, all units/elements of the flight are dead.
function FLIGHTGROUP:IsDead() function FLIGHTGROUP:IsDead()
return self:Is("Dead") return self:Is("Dead")
end end