mirror of
https://github.com/FlightControl-Master/MOOSE.git
synced 2025-10-29 16:58:06 +00:00
FC
**FLIGHTCONTROL** - Less output to dcs log file **FLIGHTGROUP** - Added function :SetReadyForTakeoff
This commit is contained in:
@@ -6311,10 +6311,11 @@ function WAREHOUSE:_RouteAir(aircraft)
|
|||||||
self:T2(self.lid..string.format("RouteAir aircraft group %s alive=%s", aircraft:GetName(), tostring(aircraft:IsAlive())))
|
self:T2(self.lid..string.format("RouteAir aircraft group %s alive=%s", aircraft:GetName(), tostring(aircraft:IsAlive())))
|
||||||
|
|
||||||
-- Give start command to activate uncontrolled aircraft within the next 60 seconds.
|
-- Give start command to activate uncontrolled aircraft within the next 60 seconds.
|
||||||
if not self.flightcontrol then
|
if self.flightcontrol then
|
||||||
local starttime=math.random(60)
|
local fg=FLIGHTGROUP:New(aircraft)
|
||||||
|
fg:SetReadyForTakeoff(true)
|
||||||
aircraft:StartUncontrolled(starttime)
|
else
|
||||||
|
aircraft:StartUncontrolled(math.random(60))
|
||||||
end
|
end
|
||||||
|
|
||||||
-- Debug info.
|
-- Debug info.
|
||||||
|
|||||||
@@ -20,7 +20,7 @@
|
|||||||
--- FLIGHTCONTROL class.
|
--- FLIGHTCONTROL class.
|
||||||
-- @type FLIGHTCONTROL
|
-- @type FLIGHTCONTROL
|
||||||
-- @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 #boolean verbose Verbosity level.
|
||||||
-- @field #string theatre The DCS map used in the mission.
|
-- @field #string theatre The DCS map used in the mission.
|
||||||
-- @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 airbasename Name of airbase.
|
-- @field #string airbasename Name of airbase.
|
||||||
@@ -83,7 +83,7 @@
|
|||||||
-- @field #FLIGHTCONTROL
|
-- @field #FLIGHTCONTROL
|
||||||
FLIGHTCONTROL = {
|
FLIGHTCONTROL = {
|
||||||
ClassName = "FLIGHTCONTROL",
|
ClassName = "FLIGHTCONTROL",
|
||||||
Debug = false,
|
verbose = 0,
|
||||||
lid = nil,
|
lid = nil,
|
||||||
theatre = nil,
|
theatre = nil,
|
||||||
airbasename = nil,
|
airbasename = nil,
|
||||||
@@ -312,6 +312,15 @@ end
|
|||||||
-- User API Functions
|
-- User API Functions
|
||||||
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
--- Set verbosity level.
|
||||||
|
-- @param #FLIGHTCONTROL self
|
||||||
|
-- @param #number VerbosityLevel Level of output (higher=more). Default 0.
|
||||||
|
-- @return #FLIGHTCONTROL self
|
||||||
|
function FLIGHTCONTROL:SetVerbosity(VerbosityLevel)
|
||||||
|
self.verbose=VerbosityLevel or 0
|
||||||
|
return self
|
||||||
|
end
|
||||||
|
|
||||||
--- Set the tower frequency.
|
--- Set the tower frequency.
|
||||||
-- @param #FLIGHTCONTROL self
|
-- @param #FLIGHTCONTROL self
|
||||||
-- @param #number Frequency Frequency in MHz. Default 305 MHz.
|
-- @param #number Frequency Frequency in MHz. Default 305 MHz.
|
||||||
@@ -322,9 +331,9 @@ function FLIGHTCONTROL:SetFrequency(Frequency, Modulation)
|
|||||||
self.frequency=Frequency or 305
|
self.frequency=Frequency or 305
|
||||||
self.modulation=Modulation or radio.modulation.AM
|
self.modulation=Modulation or radio.modulation.AM
|
||||||
|
|
||||||
|
return self
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
||||||
--- Set the number of aircraft groups, that are allowed to land simultaniously.
|
--- Set the number of aircraft groups, that are allowed to land simultaniously.
|
||||||
-- Note that this restricts AI and human players.
|
-- Note that this restricts AI and human players.
|
||||||
-- @param #FLIGHTCONTROL self
|
-- @param #FLIGHTCONTROL self
|
||||||
@@ -380,43 +389,6 @@ function FLIGHTCONTROL:SetLimitTaxi(Ntaxi, IncludeInbound, Nlanding)
|
|||||||
return self
|
return self
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
||||||
--- Set runway. This clears all auto generated runways.
|
|
||||||
-- @param #FLIGHTCONTROL self
|
|
||||||
-- @param #FLIGHTCONTROL.Runway Runway.
|
|
||||||
-- @return #FLIGHTCONTROL self
|
|
||||||
function FLIGHTCONTROL:SetRunway(runway)
|
|
||||||
|
|
||||||
-- Reset table.
|
|
||||||
self.runways={}
|
|
||||||
|
|
||||||
-- Set runway.
|
|
||||||
table.insert(self.runways, runway)
|
|
||||||
|
|
||||||
return self
|
|
||||||
end
|
|
||||||
|
|
||||||
--- Add runway.
|
|
||||||
-- @param #FLIGHTCONTROL self
|
|
||||||
-- @param #FLIGHTCONTROL.Runway Runway.
|
|
||||||
-- @return #FLIGHTCONTROL self
|
|
||||||
function FLIGHTCONTROL:AddRunway(runway)
|
|
||||||
|
|
||||||
-- Set runway.
|
|
||||||
table.insert(self.runways, runway)
|
|
||||||
|
|
||||||
return self
|
|
||||||
end
|
|
||||||
|
|
||||||
--- Set active runway number. Counting refers to the position in the table entry.
|
|
||||||
-- @param #FLIGHTCONTROL self
|
|
||||||
-- @param #number no Number in the runways table.
|
|
||||||
-- @return #FLIGHTCONTROL self
|
|
||||||
function FLIGHTCONTROL:SetActiveRunwayNumber(no)
|
|
||||||
self.activerwyno=no
|
|
||||||
return self
|
|
||||||
end
|
|
||||||
|
|
||||||
--- Add a holding pattern.
|
--- Add a holding pattern.
|
||||||
-- This is a zone where the aircraft...
|
-- This is a zone where the aircraft...
|
||||||
-- @param #FLIGHTCONTROL self
|
-- @param #FLIGHTCONTROL self
|
||||||
@@ -425,7 +397,7 @@ end
|
|||||||
-- @param #number Length Length in nautical miles. Default 15 NM.
|
-- @param #number Length Length in nautical miles. Default 15 NM.
|
||||||
-- @param #number FlightlevelMin Min flight level. Default 5.
|
-- @param #number FlightlevelMin Min flight level. Default 5.
|
||||||
-- @param #number FlightlevelMax Max flight level. Default 15.
|
-- @param #number FlightlevelMax Max flight level. Default 15.
|
||||||
-- @return #FLIGHTCONTROL self
|
-- @return #FLIGHTCONTROL.HoldingPattern Holding pattern table.
|
||||||
function FLIGHTCONTROL:AddHoldingPattern(ArrivalZone, Heading, Length, FlightlevelMin, FlightlevelMax)
|
function FLIGHTCONTROL:AddHoldingPattern(ArrivalZone, Heading, Length, FlightlevelMin, FlightlevelMax)
|
||||||
|
|
||||||
-- Get ZONE if passed as string.
|
-- Get ZONE if passed as string.
|
||||||
@@ -556,7 +528,7 @@ function FLIGHTCONTROL:onbeforeStatus()
|
|||||||
|
|
||||||
-- Debug info.
|
-- Debug info.
|
||||||
local text=string.format("Last message sent %d sec ago. Will call status again in %d sec", dT, dt)
|
local text=string.format("Last message sent %d sec ago. Will call status again in %d sec", dT, dt)
|
||||||
self:I(self.lid..text)
|
self:T(self.lid..text)
|
||||||
|
|
||||||
-- Call status again in dt seconds.
|
-- Call status again in dt seconds.
|
||||||
self:__Status(-dt)
|
self:__Status(-dt)
|
||||||
@@ -564,7 +536,7 @@ function FLIGHTCONTROL:onbeforeStatus()
|
|||||||
-- Deny transition.
|
-- Deny transition.
|
||||||
return false
|
return false
|
||||||
else
|
else
|
||||||
self:I(self.lid..string.format("Last radio sent %d>%d sec ago. Status update allowed", dT, self.dTmessage))
|
self:T2(self.lid..string.format("Last radio sent %d>%d sec ago. Status update allowed", dT, self.dTmessage))
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
@@ -576,7 +548,7 @@ end
|
|||||||
function FLIGHTCONTROL:onafterStatus()
|
function FLIGHTCONTROL:onafterStatus()
|
||||||
|
|
||||||
-- Debug message.
|
-- Debug message.
|
||||||
self:I(self.lid.."Status update")
|
self:T2(self.lid.."Status update")
|
||||||
|
|
||||||
-- Check status of all registered flights.
|
-- Check status of all registered flights.
|
||||||
self:_CheckFlights()
|
self:_CheckFlights()
|
||||||
@@ -618,9 +590,11 @@ function FLIGHTCONTROL:onafterStatus()
|
|||||||
end
|
end
|
||||||
|
|
||||||
-- Info text.
|
-- Info text.
|
||||||
local text=string.format("State %s - Runway %s - Parking F=%d/O=%d/R=%d of %d - Flights=%s: Qpark=%d Qtxout=%d Qready=%d Qto=%d | Qinbound=%d Qhold=%d Qland=%d Qtxinb=%d Qarr=%d",
|
if self.verbose>=1 then
|
||||||
self:GetState(), runway.idx, Nfree, Noccu, Nresv, self.Nparkingspots, Nflights, NQparking, NQtaxiout, NQreadyto, NQtakeoff, NQinbound, NQholding, NQlanding, NQtaxiinb, NQarrived)
|
local text=string.format("State %s - Runway %s - Parking F=%d/O=%d/R=%d of %d - Flights=%s: Qpark=%d Qtxout=%d Qready=%d Qto=%d | Qinbound=%d Qhold=%d Qland=%d Qtxinb=%d Qarr=%d",
|
||||||
self:I(self.lid..text)
|
self:GetState(), runway.idx, Nfree, Noccu, Nresv, self.Nparkingspots, Nflights, NQparking, NQtaxiout, NQreadyto, NQtakeoff, NQinbound, NQholding, NQlanding, NQtaxiinb, NQarrived)
|
||||||
|
self:I(self.lid..text)
|
||||||
|
end
|
||||||
|
|
||||||
if Nflights==Nqueues then
|
if Nflights==Nqueues then
|
||||||
--Check!
|
--Check!
|
||||||
@@ -698,7 +672,7 @@ function FLIGHTCONTROL:OnEventLand(EventData)
|
|||||||
self:F3({EvendData=EventData})
|
self:F3({EvendData=EventData})
|
||||||
|
|
||||||
self:T2(self.lid..string.format("LAND: unit = %s", tostring(EventData.IniUnitName)))
|
self:T2(self.lid..string.format("LAND: unit = %s", tostring(EventData.IniUnitName)))
|
||||||
self:T2(self.lid..string.format("LAND: group = %s", tostring(EventData.IniGroupName)))
|
self:T3(self.lid..string.format("LAND: group = %s", tostring(EventData.IniGroupName)))
|
||||||
|
|
||||||
end
|
end
|
||||||
|
|
||||||
@@ -709,7 +683,7 @@ function FLIGHTCONTROL:OnEventTakeoff(EventData)
|
|||||||
self:F3({EvendData=EventData})
|
self:F3({EvendData=EventData})
|
||||||
|
|
||||||
self:T2(self.lid..string.format("TAKEOFF: unit = %s", tostring(EventData.IniUnitName)))
|
self:T2(self.lid..string.format("TAKEOFF: unit = %s", tostring(EventData.IniUnitName)))
|
||||||
self:T2(self.lid..string.format("TAKEOFF: group = %s", tostring(EventData.IniGroupName)))
|
self:T3(self.lid..string.format("TAKEOFF: group = %s", tostring(EventData.IniGroupName)))
|
||||||
|
|
||||||
-- This would be the closest airbase.
|
-- This would be the closest airbase.
|
||||||
local airbase=EventData.Place
|
local airbase=EventData.Place
|
||||||
@@ -731,17 +705,9 @@ end
|
|||||||
function FLIGHTCONTROL:OnEventEngineStartup(EventData)
|
function FLIGHTCONTROL:OnEventEngineStartup(EventData)
|
||||||
self:F3({EvendData=EventData})
|
self:F3({EvendData=EventData})
|
||||||
|
|
||||||
self:I(self.lid..string.format("ENGINESTARTUP: unit = %s", tostring(EventData.IniUnitName)))
|
self:T2(self.lid..string.format("ENGINESTARTUP: unit = %s", tostring(EventData.IniUnitName)))
|
||||||
self:T2(self.lid..string.format("ENGINESTARTUP: group = %s", tostring(EventData.IniGroupName)))
|
self:T3(self.lid..string.format("ENGINESTARTUP: group = %s", tostring(EventData.IniGroupName)))
|
||||||
|
|
||||||
-- Unit that took off.
|
|
||||||
local unit=EventData.IniUnit
|
|
||||||
|
|
||||||
-- Nil check for unit.
|
|
||||||
if not unit then
|
|
||||||
return
|
|
||||||
end
|
|
||||||
|
|
||||||
end
|
end
|
||||||
|
|
||||||
--- Event handler for event engine shutdown.
|
--- Event handler for event engine shutdown.
|
||||||
@@ -750,16 +716,8 @@ end
|
|||||||
function FLIGHTCONTROL:OnEventEngineShutdown(EventData)
|
function FLIGHTCONTROL:OnEventEngineShutdown(EventData)
|
||||||
self:F3({EvendData=EventData})
|
self:F3({EvendData=EventData})
|
||||||
|
|
||||||
self:I(self.lid..string.format("ENGINESHUTDOWN: unit = %s", tostring(EventData.IniUnitName)))
|
self:T2(self.lid..string.format("ENGINESHUTDOWN: unit = %s", tostring(EventData.IniUnitName)))
|
||||||
self:T2(self.lid..string.format("ENGINESHUTDOWN: group = %s", tostring(EventData.IniGroupName)))
|
self:T3(self.lid..string.format("ENGINESHUTDOWN: group = %s", tostring(EventData.IniGroupName)))
|
||||||
|
|
||||||
-- Unit that took off.
|
|
||||||
local unit=EventData.IniUnit
|
|
||||||
|
|
||||||
-- Nil check for unit.
|
|
||||||
if not unit then
|
|
||||||
return
|
|
||||||
end
|
|
||||||
|
|
||||||
end
|
end
|
||||||
|
|
||||||
@@ -770,7 +728,7 @@ function FLIGHTCONTROL:OnEventCrash(EventData)
|
|||||||
self:F3({EvendData=EventData})
|
self:F3({EvendData=EventData})
|
||||||
|
|
||||||
self:T2(self.lid..string.format("CRASH: unit = %s", tostring(EventData.IniUnitName)))
|
self:T2(self.lid..string.format("CRASH: unit = %s", tostring(EventData.IniUnitName)))
|
||||||
self:T2(self.lid..string.format("CRASH: group = %s", tostring(EventData.IniGroupName)))
|
self:T3(self.lid..string.format("CRASH: group = %s", tostring(EventData.IniGroupName)))
|
||||||
|
|
||||||
end
|
end
|
||||||
|
|
||||||
@@ -783,23 +741,10 @@ end
|
|||||||
function FLIGHTCONTROL:_CheckQueues()
|
function FLIGHTCONTROL:_CheckQueues()
|
||||||
|
|
||||||
-- Print queue.
|
-- Print queue.
|
||||||
if true then
|
if self.verbose>=2 then
|
||||||
self:_PrintQueue(self.flights, "All flights")
|
self:_PrintQueue(self.flights, "All flights")
|
||||||
end
|
end
|
||||||
|
|
||||||
-- Number of holding groups.
|
|
||||||
local nholding=self:CountFlights(FLIGHTCONTROL.FlightStatus.HOLDING)
|
|
||||||
|
|
||||||
-- Number of groups landing.
|
|
||||||
local nlanding=self:CountFlights(FLIGHTCONTROL.FlightStatus.LANDING)
|
|
||||||
|
|
||||||
-- Number of parking groups.
|
|
||||||
local nparking=self:CountFlights(FLIGHTCONTROL.FlightStatus.PARKING)
|
|
||||||
|
|
||||||
-- Number of groups taking off.
|
|
||||||
local ntakeoff=self:CountFlights(FLIGHTCONTROL.FlightStatus.TAKEOFF)
|
|
||||||
|
|
||||||
|
|
||||||
-- Get next flight in line: either holding or parking.
|
-- Get next flight in line: either holding or parking.
|
||||||
local flight, isholding, parking=self:_GetNextFlight()
|
local flight, isholding, parking=self:_GetNextFlight()
|
||||||
|
|
||||||
@@ -856,7 +801,7 @@ function FLIGHTCONTROL:_CheckQueues()
|
|||||||
|
|
||||||
end
|
end
|
||||||
else
|
else
|
||||||
self:T3(self.lid..string.format("FYI: Landing clearance for flight %s denied"))
|
self:T3(self.lid..string.format("FYI: Landing clearance for flight %s denied", flight.groupname))
|
||||||
end
|
end
|
||||||
|
|
||||||
else
|
else
|
||||||
@@ -954,12 +899,12 @@ function FLIGHTCONTROL:_CheckQueues()
|
|||||||
|
|
||||||
else
|
else
|
||||||
-- Debug message.
|
-- Debug message.
|
||||||
self:I(self.lid..string.format("FYI: Take off for flight %s denied as other flights are taking off (N=%d) or landing (N=%d).", flight.groupname, ntakeoff, nlanding))
|
self:T3(self.lid..string.format("FYI: Take off for flight %s denied", flight.groupname))
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
else
|
else
|
||||||
-- Debug message.
|
-- Debug message.
|
||||||
self:I(self.lid..string.format("FYI: No flight in queue for takeoff or landing."))
|
self:T2(self.lid..string.format("FYI: No flight in queue for takeoff or landing"))
|
||||||
end
|
end
|
||||||
|
|
||||||
end
|
end
|
||||||
@@ -970,7 +915,6 @@ end
|
|||||||
-- @return #boolean If true, flight can.
|
-- @return #boolean If true, flight can.
|
||||||
function FLIGHTCONTROL:_CheckFlightTakeoff(flight)
|
function FLIGHTCONTROL:_CheckFlightTakeoff(flight)
|
||||||
|
|
||||||
|
|
||||||
-- Number of groups landing.
|
-- Number of groups landing.
|
||||||
local nlanding=self:CountFlights(FLIGHTCONTROL.FlightStatus.LANDING)
|
local nlanding=self:CountFlights(FLIGHTCONTROL.FlightStatus.LANDING)
|
||||||
|
|
||||||
@@ -986,24 +930,21 @@ function FLIGHTCONTROL:_CheckFlightTakeoff(flight)
|
|||||||
---
|
---
|
||||||
|
|
||||||
if nlanding>self.NtaxiLanding then
|
if nlanding>self.NtaxiLanding then
|
||||||
self:I(self.lid..string.format("AI flight %s [status=%s] NOT cleared for taxi/takeoff as %d>%d flight(s) landing", flight.groupname, status, nlanding, self.NtaxiLanding))
|
self:T(self.lid..string.format("AI flight %s [status=%s] NOT cleared for taxi/takeoff as %d>%d flight(s) landing", flight.groupname, status, nlanding, self.NtaxiLanding))
|
||||||
return false
|
return false
|
||||||
end
|
end
|
||||||
|
|
||||||
-- Number of AI flights taxiing/takeoff.
|
|
||||||
local ntakeoff=self:CountFlights(FLIGHTCONTROL.FlightStatus.TAKEOFF, nil, true)
|
|
||||||
|
|
||||||
local ninbound=0
|
local ninbound=0
|
||||||
if self.NtaxiInbound then
|
if self.NtaxiInbound then
|
||||||
ninbound=self:CountFlights(FLIGHTCONTROL.FlightStatus.TAXIINB, nil, true)
|
ninbound=self:CountFlights(FLIGHTCONTROL.FlightStatus.TAXIINB, nil, true)
|
||||||
end
|
end
|
||||||
|
|
||||||
if ntakeoff+ninbound>self.NtaxiTot then
|
if ntakeoff+ninbound>=self.NtaxiTot then
|
||||||
self:I(self.lid..string.format("AI flight %s [status=%s] NOT cleared for taxi/takeoff as %s flight(s) taxi/takeoff", flight.groupname, status, ntakeoff))
|
self:T(self.lid..string.format("AI flight %s [status=%s] NOT cleared for taxi/takeoff as %d>=%d flight(s) taxi/takeoff", flight.groupname, status, ntakeoff, self.NtaxiTot))
|
||||||
return false
|
return false
|
||||||
end
|
end
|
||||||
|
|
||||||
self:I(self.lid..string.format("AI flight %s [status=%s] cleared for taxi/takeoff", flight.groupname, status))
|
self:T(self.lid..string.format("AI flight %s [status=%s] cleared for taxi/takeoff! nLanding=%d, nTakeoff=%d", flight.groupname, status, nlanding, ntakeoff))
|
||||||
return true
|
return true
|
||||||
else
|
else
|
||||||
---
|
---
|
||||||
@@ -1015,15 +956,15 @@ function FLIGHTCONTROL:_CheckFlightTakeoff(flight)
|
|||||||
|
|
||||||
if status==FLIGHTCONTROL.FlightStatus.READYTO then
|
if status==FLIGHTCONTROL.FlightStatus.READYTO then
|
||||||
|
|
||||||
if nlanding>0 then
|
if nlanding>self.NtaxiLanding then
|
||||||
-- Traffic landing. No permission to
|
-- Traffic landing. No permission to
|
||||||
self:I(self.lid..string.format("Player flight %s [status=%s] not cleared for taxi/takeoff as %s flight(s) landing", flight.groupname, status, nlanding))
|
self:T(self.lid..string.format("Player flight %s [status=%s] not cleared for taxi/takeoff as %d>%d flight(s) landing", flight.groupname, status, nlanding, self.NtaxiLanding))
|
||||||
return false
|
return false
|
||||||
end
|
end
|
||||||
|
|
||||||
end
|
end
|
||||||
|
|
||||||
self:I(self.lid..string.format("Player flight %s [status=%s] cleared for taxi/takeoff", flight.groupname, status))
|
self:T(self.lid..string.format("Player flight %s [status=%s] cleared for taxi/takeoff", flight.groupname, status))
|
||||||
return true
|
return true
|
||||||
end
|
end
|
||||||
|
|
||||||
@@ -1050,7 +991,7 @@ function FLIGHTCONTROL:_CheckFlightLanding(flight)
|
|||||||
-- AI
|
-- AI
|
||||||
---
|
---
|
||||||
|
|
||||||
if ntakeoff==0 and nlanding<self.NlandingTot then
|
if ntakeoff<=self.NlandingTakeoff and nlanding<self.NlandingTot then
|
||||||
return true
|
return true
|
||||||
end
|
end
|
||||||
|
|
||||||
@@ -1061,7 +1002,7 @@ function FLIGHTCONTROL:_CheckFlightLanding(flight)
|
|||||||
---
|
---
|
||||||
|
|
||||||
|
|
||||||
if ntakeoff==0 and nlanding<self.NlandingTot then
|
if ntakeoff<=self.NlandingTakeoff and nlanding<self.NlandingTot then
|
||||||
return true
|
return true
|
||||||
end
|
end
|
||||||
|
|
||||||
@@ -1109,7 +1050,7 @@ function FLIGHTCONTROL:_GetNextFlight()
|
|||||||
if flightholding and flightparking then
|
if flightholding and flightparking then
|
||||||
|
|
||||||
local text=string.format("We got a flight holding %s [%s] and parking %s [%s]", flightholding:GetName(), flightholding:GetState(), flightparking:GetName(), flightparking:GetState())
|
local text=string.format("We got a flight holding %s [%s] and parking %s [%s]", flightholding:GetName(), flightholding:GetState(), flightparking:GetName(), flightparking:GetState())
|
||||||
self:I(self.lid..text)
|
self:T(self.lid..text)
|
||||||
|
|
||||||
-- Return holding flight if fuel is low.
|
-- Return holding flight if fuel is low.
|
||||||
if flightholding.fuellow then
|
if flightholding.fuellow then
|
||||||
@@ -1123,7 +1064,7 @@ function FLIGHTCONTROL:_GetNextFlight()
|
|||||||
end
|
end
|
||||||
|
|
||||||
local text=string.format("Flight holding for %d sec, flight parking for %d sec", flightholding:GetHoldingTime(), flightparking:GetParkingTime())
|
local text=string.format("Flight holding for %d sec, flight parking for %d sec", flightholding:GetHoldingTime(), flightparking:GetParkingTime())
|
||||||
self:I(self.lid..text)
|
self:T(self.lid..text)
|
||||||
|
|
||||||
-- Return the flight which is waiting longer. NOTE that Tholding and Tparking are abs. mission time. So a smaller value means waiting longer.
|
-- Return the flight which is waiting longer. NOTE that Tholding and Tparking are abs. mission time. So a smaller value means waiting longer.
|
||||||
if flightholding.Tholding and flightparking.Tparking and flightholding.Tholding<flightparking.Tparking and parking then
|
if flightholding.Tholding and flightparking.Tparking and flightholding.Tholding<flightparking.Tparking and parking then
|
||||||
@@ -1234,32 +1175,32 @@ function FLIGHTCONTROL:_GetNextFightParking()
|
|||||||
-- Check special cases where only up to one flight is waiting for takeoff.
|
-- Check special cases where only up to one flight is waiting for takeoff.
|
||||||
if Nparking==0 then
|
if Nparking==0 then
|
||||||
return nil
|
return nil
|
||||||
elseif Nparking==1 then
|
|
||||||
return Qparking[1]
|
|
||||||
end
|
end
|
||||||
|
|
||||||
-- Sort flights parking time.
|
-- Sort flights parking time.
|
||||||
local function _sortByTparking(a, b)
|
local function _sortByTparking(a, b)
|
||||||
local flightA=a --Ops.FlightGroup#FLIGHTGROUP
|
local flightA=a --Ops.FlightGroup#FLIGHTGROUP
|
||||||
local flightB=b --Ops.FlightGroup#FLIGHTGROUP
|
local flightB=b --Ops.FlightGroup#FLIGHTGROUP
|
||||||
return flightA.Tparking<flightB.Tparking -- Tholding is the abs. timestamp. So the one with the smallest time is holding the longest.
|
return flightA.Tparking<flightB.Tparking -- Tparking is the abs. timestamp. So the one with the smallest time is parking the longest.
|
||||||
end
|
end
|
||||||
|
|
||||||
-- Return flight waiting longest.
|
-- Return flight waiting longest.
|
||||||
table.sort(Qparking, _sortByTparking)
|
table.sort(Qparking, _sortByTparking)
|
||||||
|
|
||||||
-- Debug.
|
-- Debug.
|
||||||
local text="Parking flights:"
|
if self.verbose>=2 then
|
||||||
for i,_flight in pairs(Qparking) do
|
local text="Parking flights:"
|
||||||
local flight=_flight --Ops.FlightGroup#FLIGHTGROUP
|
for i,_flight in pairs(Qparking) do
|
||||||
text=text..string.format("\n[%d] %s %.1f", i, flight.groupname, flight:GetParkingTime())
|
local flight=_flight --Ops.FlightGroup#FLIGHTGROUP
|
||||||
|
text=text..string.format("\n[%d] %s %.1f", i, flight.groupname, flight:GetParkingTime())
|
||||||
|
end
|
||||||
|
self:I(self.lid..text)
|
||||||
end
|
end
|
||||||
self:I(self.lid..text)
|
|
||||||
|
|
||||||
-- Get the first AI flight.
|
-- Get the first AI flight.
|
||||||
for i,_flight in pairs(Qparking) do
|
for i,_flight in pairs(Qparking) do
|
||||||
local flight=_flight --Ops.FlightGroup#FLIGHTGROUP
|
local flight=_flight --Ops.FlightGroup#FLIGHTGROUP
|
||||||
if flight.isAI then
|
if flight.isAI and flight.isReadyTO then
|
||||||
return flight
|
return flight
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
@@ -1354,7 +1295,7 @@ function FLIGHTCONTROL:_RemoveFlightFromQueue(queue, flight, queuename)
|
|||||||
|
|
||||||
-- Check for name.
|
-- Check for name.
|
||||||
if qflight.groupname==flight.groupname then
|
if qflight.groupname==flight.groupname then
|
||||||
self:I(self.lid..string.format("Removing flight group %s from %s queue", flight.groupname, queuename))
|
self:T(self.lid..string.format("Removing flight group %s from %s queue", flight.groupname, queuename))
|
||||||
table.remove(queue, i)
|
table.remove(queue, i)
|
||||||
|
|
||||||
if not flight.isAI then
|
if not flight.isAI then
|
||||||
@@ -1365,7 +1306,7 @@ function FLIGHTCONTROL:_RemoveFlightFromQueue(queue, flight, queuename)
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
self:I(self.lid..string.format("Could NOT remove flight group %s from %s queue", flight.groupname, queuename))
|
self:E(self.lid..string.format("WARNING: Could NOT remove flight group %s from %s queue", flight.groupname, queuename))
|
||||||
return false, nil
|
return false, nil
|
||||||
end
|
end
|
||||||
|
|
||||||
@@ -1532,8 +1473,7 @@ function FLIGHTCONTROL:_InitParkingSpots()
|
|||||||
self.Nparkingspots=0
|
self.Nparkingspots=0
|
||||||
for _,_spot in pairs(parkingdata) do
|
for _,_spot in pairs(parkingdata) do
|
||||||
local spot=_spot --Wrapper.Airbase#AIRBASE.ParkingSpot
|
local spot=_spot --Wrapper.Airbase#AIRBASE.ParkingSpot
|
||||||
|
|
||||||
|
|
||||||
-- Mark position.
|
-- Mark position.
|
||||||
local text=string.format("Parking ID=%d, Terminal=%d: Free=%s, Client=%s, Dist=%.1f", spot.TerminalID, spot.TerminalType, tostring(spot.Free), tostring(spot.ClientSpot), spot.DistToRwy)
|
local text=string.format("Parking ID=%d, Terminal=%d: Free=%s, Client=%s, Dist=%.1f", spot.TerminalID, spot.TerminalType, tostring(spot.Free), tostring(spot.ClientSpot), spot.DistToRwy)
|
||||||
self:I(self.lid..text)
|
self:I(self.lid..text)
|
||||||
@@ -1541,10 +1481,8 @@ function FLIGHTCONTROL:_InitParkingSpots()
|
|||||||
-- Add to table.
|
-- Add to table.
|
||||||
self.parking[spot.TerminalID]=spot
|
self.parking[spot.TerminalID]=spot
|
||||||
|
|
||||||
spot.Marker=MARKER:New(spot.Coordinate, "Spot"):ReadOnly()
|
-- Marker.
|
||||||
spot.Marker:ToCoalition(self:GetCoalition())
|
spot.Marker=MARKER:New(spot.Coordinate, "Spot"):ReadOnly():ToCoalition(self:GetCoalition())
|
||||||
--spot.Marker.tocoaliton=true
|
|
||||||
--spot.Marker.coalition=self:GetCoalition()
|
|
||||||
|
|
||||||
-- Check if spot is initially free or occupied.
|
-- Check if spot is initially free or occupied.
|
||||||
if spot.Free then
|
if spot.Free then
|
||||||
@@ -1580,12 +1518,12 @@ function FLIGHTCONTROL:_InitParkingSpots()
|
|||||||
--env.info(string.format("FF parking spot %d is occupied by NOT ALIVE unit %s", spot.TerminalID, unitname))
|
--env.info(string.format("FF parking spot %d is occupied by NOT ALIVE unit %s", spot.TerminalID, unitname))
|
||||||
|
|
||||||
-- Parking spot is free.
|
-- Parking spot is free.
|
||||||
self:SetParkingFree(spot)
|
self:SetParkingFree(spot)
|
||||||
|
|
||||||
end
|
end
|
||||||
|
|
||||||
else
|
else
|
||||||
self:I(self.lid..string.format("ERROR: Parking spot is NOT FREE but no unit could be found there!"))
|
self:E(self.lid..string.format("ERROR: Parking spot is NOT FREE but no unit could be found there!"))
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
@@ -1846,7 +1784,7 @@ function FLIGHTCONTROL:_CreatePlayerMenu(flight, mainmenu)
|
|||||||
local gotcontrol=self:IsControlling(flight)
|
local gotcontrol=self:IsControlling(flight)
|
||||||
|
|
||||||
-- Debug info.
|
-- Debug info.
|
||||||
self:I(self.lid..string.format("Creating ATC player menu for flight %s: in state=%s status=%s, gotcontrol=%s", tostring(flight.groupname), flight:GetState(), flightstatus, tostring(gotcontrol)))
|
self:T(self.lid..string.format("Creating ATC player menu for flight %s: in state=%s status=%s, gotcontrol=%s", tostring(flight.groupname), flight:GetState(), flightstatus, tostring(gotcontrol)))
|
||||||
|
|
||||||
|
|
||||||
-- Airbase root menu.
|
-- Airbase root menu.
|
||||||
@@ -3007,7 +2945,7 @@ function FLIGHTCONTROL:_CreateFlightGroup(group)
|
|||||||
end
|
end
|
||||||
|
|
||||||
-- Debug info.
|
-- Debug info.
|
||||||
self:I(self.lid..string.format("Creating new flight for group %s of aircraft type %s.", group:GetName(), group:GetTypeName()))
|
self:T(self.lid..string.format("Creating new flight for group %s of aircraft type %s.", group:GetName(), group:GetTypeName()))
|
||||||
|
|
||||||
-- Get flightgroup from data base.
|
-- Get flightgroup from data base.
|
||||||
local flight=_DATABASE:GetOpsGroup(group:GetName())
|
local flight=_DATABASE:GetOpsGroup(group:GetName())
|
||||||
@@ -3113,7 +3051,7 @@ function FLIGHTCONTROL:_CheckFlights()
|
|||||||
for i=#self.flights,1,-1 do
|
for i=#self.flights,1,-1 do
|
||||||
local flight=self.flights[i] --Ops.FlightGroup#FLIGHTGROUP
|
local flight=self.flights[i] --Ops.FlightGroup#FLIGHTGROUP
|
||||||
if flight:IsDead() then
|
if flight:IsDead() then
|
||||||
self:I(self.lid..string.format("Removing DEAD flight %s", tostring(flight.groupname)))
|
self:T(self.lid..string.format("Removing DEAD flight %s", tostring(flight.groupname)))
|
||||||
self:_RemoveFlight(flight)
|
self:_RemoveFlight(flight)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
@@ -3166,7 +3104,7 @@ end
|
|||||||
function FLIGHTCONTROL:_LandAI(flight, parking)
|
function FLIGHTCONTROL:_LandAI(flight, parking)
|
||||||
|
|
||||||
-- Debug info.
|
-- Debug info.
|
||||||
self:I(self.lid..string.format("Landing AI flight %s.", flight.groupname))
|
self:T(self.lid..string.format("Landing AI flight %s.", flight.groupname))
|
||||||
|
|
||||||
-- Set flight status to LANDING.
|
-- Set flight status to LANDING.
|
||||||
self:SetFlightStatus(flight, FLIGHTCONTROL.FlightStatus.LANDING)
|
self:SetFlightStatus(flight, FLIGHTCONTROL.FlightStatus.LANDING)
|
||||||
@@ -3195,8 +3133,8 @@ function FLIGHTCONTROL:_LandAI(flight, parking)
|
|||||||
-- Set the parking spot at the destination airbase.
|
-- Set the parking spot at the destination airbase.
|
||||||
unit.parking_landing=spot.TerminalID
|
unit.parking_landing=spot.TerminalID
|
||||||
|
|
||||||
local text=string.format("FF Reserving parking spot %d for unit %s", spot.TerminalID, tostring(unit.name))
|
local text=string.format("Reserving parking spot %d for unit %s", spot.TerminalID, tostring(unit.name))
|
||||||
self:I(self.lid..text)
|
self:T(self.lid..text)
|
||||||
|
|
||||||
-- Set parking to RESERVED.
|
-- Set parking to RESERVED.
|
||||||
self:SetParkingReserved(spot, element.name)
|
self:SetParkingReserved(spot, element.name)
|
||||||
@@ -3377,7 +3315,8 @@ function FLIGHTCONTROL:SpawnParkingGuard(unit)
|
|||||||
-- Length of the unit + 3 meters.
|
-- Length of the unit + 3 meters.
|
||||||
local size, x, y, z=unit:GetObjectSize()
|
local size, x, y, z=unit:GetObjectSize()
|
||||||
|
|
||||||
self:I(self.lid..string.format("Parking guard for %s: heading=%d, distance x=%.1f m", unit:GetName(), heading, x))
|
-- Debug message.
|
||||||
|
self:T2(self.lid..string.format("Parking guard for %s: heading=%d, distance x=%.1f m", unit:GetName(), heading, x))
|
||||||
|
|
||||||
-- Coordinate for the guard.
|
-- Coordinate for the guard.
|
||||||
local Coordinate=coordinate:Translate(0.75*x+3, heading)
|
local Coordinate=coordinate:Translate(0.75*x+3, heading)
|
||||||
|
|||||||
@@ -55,6 +55,7 @@
|
|||||||
-- @field #boolean despawnAfterHolding If `true`, group is despawned after reaching the holding point.
|
-- @field #boolean despawnAfterHolding If `true`, group is despawned after reaching the holding point.
|
||||||
-- @field #number RTBRecallCount Number that counts RTB calls.
|
-- @field #number RTBRecallCount Number that counts RTB calls.
|
||||||
-- @field Ops.FlightControl#FLIGHTCONTROL.HoldingStack stack Holding stack.
|
-- @field Ops.FlightControl#FLIGHTCONTROL.HoldingStack stack Holding stack.
|
||||||
|
-- @field #boolean isReadyTO Flight is ready for takeoff. This is for FLIGHTCONTROL.
|
||||||
--
|
--
|
||||||
-- @extends Ops.OpsGroup#OPSGROUP
|
-- @extends Ops.OpsGroup#OPSGROUP
|
||||||
|
|
||||||
@@ -370,6 +371,20 @@ function FLIGHTGROUP:SetVTOL()
|
|||||||
return self
|
return self
|
||||||
end
|
end
|
||||||
|
|
||||||
|
--- Set if group is ready for taxi/takeoff if controlled by a `FLIGHTCONTROL`.
|
||||||
|
-- @param #FLIGHTGROUP self
|
||||||
|
-- @param #boolean ReadyTO If `true`, flight is ready for takeoff.
|
||||||
|
-- @param #number Delay Delay in seconds before value is set. Default 0 sec.
|
||||||
|
-- @return #FLIGHTGROUP self
|
||||||
|
function FLIGHTGROUP:SetReadyForTakeoff(ReadyTO, Delay)
|
||||||
|
if Delay and Delay>0 then
|
||||||
|
self:ScheduleOnce(Delay, FLIGHTGROUP.SetReadyForTakeoff, self, ReadyTO, 0)
|
||||||
|
else
|
||||||
|
self.isReadyTO=ReadyTO
|
||||||
|
end
|
||||||
|
return self
|
||||||
|
end
|
||||||
|
|
||||||
--- Set the FLIGHTCONTROL controlling this flight group.
|
--- Set the FLIGHTCONTROL controlling this flight group.
|
||||||
-- @param #FLIGHTGROUP self
|
-- @param #FLIGHTGROUP self
|
||||||
-- @param Ops.FlightControl#FLIGHTCONTROL flightcontrol The FLIGHTCONTROL object.
|
-- @param Ops.FlightControl#FLIGHTCONTROL flightcontrol The FLIGHTCONTROL object.
|
||||||
|
|||||||
@@ -4774,6 +4774,11 @@ function OPSGROUP:onafterMissionStart(From, Event, To, Mission)
|
|||||||
|
|
||||||
-- Set mission status to STARTED.
|
-- Set mission status to STARTED.
|
||||||
Mission:__Started(3)
|
Mission:__Started(3)
|
||||||
|
|
||||||
|
-- Set ready for takeoff in case of FLIGHTCONTROL.
|
||||||
|
if self.isFlightgroup and Mission.type~=AUFTRAG.Type.ALERT5 then
|
||||||
|
FLIGHTGROUP.SetReadyForTakeoff(self, true)
|
||||||
|
end
|
||||||
|
|
||||||
-- Route group to mission zone.
|
-- Route group to mission zone.
|
||||||
if self.speedMax>3.6 or true then
|
if self.speedMax>3.6 or true then
|
||||||
|
|||||||
Reference in New Issue
Block a user