mirror of
https://github.com/FlightControl-Master/MOOSE.git
synced 2025-10-29 16:58:06 +00:00
AIRBOS v0.5.2w
This commit is contained in:
@@ -721,17 +721,13 @@ AIRBOSS.GroovePos={
|
|||||||
-- @field #number Xmax Maximum allowed longitual distance to carrier.
|
-- @field #number Xmax Maximum allowed longitual distance to carrier.
|
||||||
-- @field #number Zmin Minimum allowed latitudal distance to carrier.
|
-- @field #number Zmin Minimum allowed latitudal distance to carrier.
|
||||||
-- @field #number Zmax Maximum allowed latitudal distance to carrier.
|
-- @field #number Zmax Maximum allowed latitudal distance to carrier.
|
||||||
-- @field #number Rmin Minimum allowed range to carrier.
|
|
||||||
-- @field #number Rmax Maximum allowed range to carrier.
|
|
||||||
-- @field #number Amin Minimum allowed angle to carrier.
|
|
||||||
-- @field #number Amax Maximum allowed angle to carrier.
|
|
||||||
-- @field #number LimitXmin Latitudal threshold for triggering the next step if X<Xmin.
|
-- @field #number LimitXmin Latitudal threshold for triggering the next step if X<Xmin.
|
||||||
-- @field #number LimitXmax Latitudal threshold for triggering the next step if X>Xmax.
|
-- @field #number LimitXmax Latitudal threshold for triggering the next step if X>Xmax.
|
||||||
-- @field #number LimitZmin Latitudal threshold for triggering the next step if Z<Zmin.
|
-- @field #number LimitZmin Latitudal threshold for triggering the next step if Z<Zmin.
|
||||||
-- @field #number LimitZmax Latitudal threshold for triggering the next step if Z>Zmax.
|
-- @field #number LimitZmax Latitudal threshold for triggering the next step if Z>Zmax.
|
||||||
|
|
||||||
--- Parameters of a flight group.
|
--- Parameters of a flight group.
|
||||||
-- @type AIRBOSS.Flightitem
|
-- @type AIRBOSS.FlightGroup
|
||||||
-- @field Wrapper.Group#GROUP group Flight group.
|
-- @field Wrapper.Group#GROUP group Flight group.
|
||||||
-- @field #string groupname Name of the group.
|
-- @field #string groupname Name of the group.
|
||||||
-- @field #number nunits Number of units in group.
|
-- @field #number nunits Number of units in group.
|
||||||
@@ -746,6 +742,14 @@ AIRBOSS.GroovePos={
|
|||||||
-- @field #number case Recovery case of flight.
|
-- @field #number case Recovery case of flight.
|
||||||
-- @field #string seclead Name of section lead.
|
-- @field #string seclead Name of section lead.
|
||||||
-- @field #table section Other human flight groups belonging to this flight. This flight is the lead.
|
-- @field #table section Other human flight groups belonging to this flight. This flight is the lead.
|
||||||
|
-- @field #boolean holding If true, flight is in holding zone.
|
||||||
|
-- @field #boolean ballcall If true, flight called the ball in the groove.
|
||||||
|
-- @field #table elements Flight group elements.
|
||||||
|
|
||||||
|
--- Parameters of an element in a flight group.
|
||||||
|
-- @type AIRBOSS.FlightElement
|
||||||
|
-- @field Wrapper.Unit#UNIT unit Aircraft unit.
|
||||||
|
-- @field #string onboard Onboard number.
|
||||||
-- @field #boolean ballcall If true, flight called the ball in the groove.
|
-- @field #boolean ballcall If true, flight called the ball in the groove.
|
||||||
|
|
||||||
--- Player data table holding all important parameters of each player.
|
--- Player data table holding all important parameters of each player.
|
||||||
@@ -755,13 +759,12 @@ AIRBOSS.GroovePos={
|
|||||||
-- @field Wrapper.Client#CLIENT client Client object of player.
|
-- @field Wrapper.Client#CLIENT client Client object of player.
|
||||||
-- @field #string callsign Callsign of player.
|
-- @field #string callsign Callsign of player.
|
||||||
-- @field #string difficulty Difficulty level.
|
-- @field #string difficulty Difficulty level.
|
||||||
-- @field #string step Coming pattern step.
|
-- @field #string step Current/next pattern step.
|
||||||
-- @field #boolean warning Set true once the player got a warning.
|
-- @field #boolean warning Set true once the player got a warning.
|
||||||
-- @field #number passes Number of passes.
|
-- @field #number passes Number of passes.
|
||||||
-- @field #boolean attitudemonitor If true, display aircraft attitude and other parameters constantly.
|
-- @field #boolean attitudemonitor If true, display aircraft attitude and other parameters constantly.
|
||||||
-- @field #table debrief Debrief analysis of the current step of this pass.
|
-- @field #table debrief Debrief analysis of the current step of this pass.
|
||||||
-- @field #table grades LSO grades of player passes.
|
-- @field #table grades LSO grades of player passes.
|
||||||
-- @field #boolean holding If true, player is in holding zone.
|
|
||||||
-- @field #boolean landed If true, player landed or attempted to land.
|
-- @field #boolean landed If true, player landed or attempted to land.
|
||||||
-- @field #boolean boltered If true, player boltered.
|
-- @field #boolean boltered If true, player boltered.
|
||||||
-- @field #boolean waveoff If true, player was waved off during final approach.
|
-- @field #boolean waveoff If true, player was waved off during final approach.
|
||||||
@@ -772,7 +775,7 @@ AIRBOSS.GroovePos={
|
|||||||
-- @field #number wire Wire caught by player when trapped.
|
-- @field #number wire Wire caught by player when trapped.
|
||||||
-- @field #AIRBOSS.GroovePos groove Data table at each position in the groove. Elemets are of type @{#AIRBOSS.GrooveData}.
|
-- @field #AIRBOSS.GroovePos groove Data table at each position in the groove. Elemets are of type @{#AIRBOSS.GrooveData}.
|
||||||
-- @field #table menu F10 radio menu
|
-- @field #table menu F10 radio menu
|
||||||
-- @extends #AIRBOSS.Flightitem
|
-- @extends #AIRBOSS.FlightGroup
|
||||||
|
|
||||||
--- Main radio menu.
|
--- Main radio menu.
|
||||||
-- @field #table MenuF10
|
-- @field #table MenuF10
|
||||||
@@ -780,7 +783,7 @@ AIRBOSS.MenuF10={}
|
|||||||
|
|
||||||
--- Airboss class version.
|
--- Airboss class version.
|
||||||
-- @field #string version
|
-- @field #string version
|
||||||
AIRBOSS.version="0.5.2"
|
AIRBOSS.version="0.5.2w"
|
||||||
|
|
||||||
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
||||||
-- TODO list
|
-- TODO list
|
||||||
@@ -1447,31 +1450,35 @@ function AIRBOSS:_GetACNickname(actype)
|
|||||||
return nickname
|
return nickname
|
||||||
end
|
end
|
||||||
|
|
||||||
--- Check recovery times and start/stop recovery mode of aircraft.
|
--- Check AI status. Pattern queue AI in the groove? Marshal queue AI arrived in holding zone?
|
||||||
-- @param #AIRBOSS self
|
-- @param #AIRBOSS self
|
||||||
function AIRBOSS:_CheckAIStatus()
|
function AIRBOSS:_CheckAIStatus()
|
||||||
|
|
||||||
-- Loop over all flights in landing pattern.
|
-- Loop over all flights in landing pattern.
|
||||||
for _,_flight in pairs(self.Qpattern) do
|
for _,_flight in pairs(self.Qpattern) do
|
||||||
local flight=_flight --#AIRBOSS.Flightitem
|
local flight=_flight --#AIRBOSS.FlightGroup
|
||||||
|
|
||||||
-- Only AI!
|
-- Only AI!
|
||||||
if flight.ai then
|
if flight.ai then
|
||||||
|
|
||||||
-- Get unnits
|
|
||||||
local units=flight.group:GetUnits()
|
|
||||||
|
|
||||||
-- Loop over all units in AI flight.
|
-- Loop over all units in AI flight.
|
||||||
for _,_unit in pairs(units) do
|
for _,_element in pairs(flight.elements) do
|
||||||
local unit=_unit --Wrapper.Unit#UNIT
|
local element=_element --#AIRBOSS.FlightElement
|
||||||
|
|
||||||
|
-- Unit
|
||||||
|
local unit=element.unit
|
||||||
|
|
||||||
-- Get lineup and distance to carrier.
|
-- Get lineup and distance to carrier.
|
||||||
local lineup=self:_Lineup(unit, true)
|
local lineup=self:_Lineup(unit, true)
|
||||||
local distance=UTILS.NMToMeters(unit:GetCoordinate():Get2DDistance(self:GetCoordinate()))
|
|
||||||
|
-- Distance in NM.
|
||||||
|
local distance=UTILS.MetersToNM(unit:GetCoordinate():Get2DDistance(self:GetCoordinate()))
|
||||||
|
|
||||||
|
-- Altitude in ft.
|
||||||
local alt=UTILS.MetersToFeet(unit:GetAltitude())
|
local alt=UTILS.MetersToFeet(unit:GetAltitude())
|
||||||
|
|
||||||
-- Check if parameters are right and flight is in the groove.
|
-- Check if parameters are right and flight is in the groove.
|
||||||
if lineup<2 and distance<=0.75 and alt<500 and not flight.ballcall then
|
if lineup<2 and distance<=0.75 and alt<500 and not element.ballcall then
|
||||||
|
|
||||||
-- Paddles: Call the ball!
|
-- Paddles: Call the ball!
|
||||||
self:RadioTransmission(self.LSORadio, AIRBOSS.LSOCall.CALLTHEBALL, false, 0)
|
self:RadioTransmission(self.LSORadio, AIRBOSS.LSOCall.CALLTHEBALL, false, 0)
|
||||||
@@ -1479,15 +1486,14 @@ function AIRBOSS:_CheckAIStatus()
|
|||||||
-- Pilot: "405, Hornet Ball, 3.2"
|
-- Pilot: "405, Hornet Ball, 3.2"
|
||||||
-- TODO: Message to players only.
|
-- TODO: Message to players only.
|
||||||
-- TODO: Voice over.
|
-- TODO: Voice over.
|
||||||
-- TODO: Correct unit onboard number not section lead!
|
local text=string.format("%s, %s Ball, %.1f.", element.onboard, self:_GetACNickname(unit:GetTypeName()), self:_GetFuelState(unit)/1000)
|
||||||
local text=string.format("%s, %s Ball, %.1f.", flight.onboard, self:_GetACNickname(unit:GetTypeName()), self:_GetFuelState(unit)/1000)
|
MESSAGE:New(text, 15):ToCoalition(self:GetCoalition())
|
||||||
MESSAGE:New(text, 5):ToCoalition(self:GetCoalition())
|
|
||||||
--self:MessageToPlayer(playerData, text, playerData.onboard, "", 3, false, 3)
|
--self:MessageToPlayer(playerData, text, playerData.onboard, "", 3, false, 3)
|
||||||
|
|
||||||
-- Paddles: Roger ball after 3 seconds.
|
-- Paddles: Roger ball after 3 seconds.
|
||||||
self:RadioTransmission(self.LSORadio, AIRBOSS.LSOCall.ROGERBALL, false, 3)
|
self:RadioTransmission(self.LSORadio, AIRBOSS.LSOCall.ROGERBALL, false, 3)
|
||||||
|
|
||||||
-- TODO: This does not work for flights with more than one aircraft in the group! But we need to set it not to flood the screen with messages for the same unit.
|
-- This is for the whole flight. Maybe we need it.
|
||||||
flight.ballcall=true
|
flight.ballcall=true
|
||||||
end
|
end
|
||||||
|
|
||||||
@@ -1552,7 +1558,7 @@ function AIRBOSS:_CheckPlayerPatternDistance(player)
|
|||||||
|
|
||||||
-- Loop over all other flights in pattern.
|
-- Loop over all other flights in pattern.
|
||||||
for _,_flight in pairs(self.Qpattern) do
|
for _,_flight in pairs(self.Qpattern) do
|
||||||
local flight=_flight --#AIRBOSS.Flightitem
|
local flight=_flight --#AIRBOSS.FlightGroup
|
||||||
|
|
||||||
-- Now we still need to loop over all units in the flight.
|
-- Now we still need to loop over all units in the flight.
|
||||||
for _,_unit in pairs(flight.group:GetUnits()) do
|
for _,_unit in pairs(flight.group:GetUnits()) do
|
||||||
@@ -1597,8 +1603,6 @@ function AIRBOSS:_CheckRecoveryTimes()
|
|||||||
-- Loop over all slots.
|
-- Loop over all slots.
|
||||||
for _,_recovery in pairs(self.recoverytimes) do
|
for _,_recovery in pairs(self.recoverytimes) do
|
||||||
local recovery=_recovery --#AIRBOSS.Recovery
|
local recovery=_recovery --#AIRBOSS.Recovery
|
||||||
|
|
||||||
--if recovery.OVER==false then
|
|
||||||
|
|
||||||
-- Get start/stop clock strings.
|
-- Get start/stop clock strings.
|
||||||
local Cstart=UTILS.SecondsToClock(recovery.START)
|
local Cstart=UTILS.SecondsToClock(recovery.START)
|
||||||
@@ -2289,7 +2293,7 @@ function AIRBOSS:_CheckQueue()
|
|||||||
if nmarshal>0 and npattern<self.Nmaxpattern then
|
if nmarshal>0 and npattern<self.Nmaxpattern then
|
||||||
|
|
||||||
-- Next flight in line to be send from marshal to pattern.
|
-- Next flight in line to be send from marshal to pattern.
|
||||||
local marshalflight=self.Qmarshal[1] --#AIRBOSS.Flightitem
|
local marshalflight=self.Qmarshal[1] --#AIRBOSS.FlightGroup
|
||||||
|
|
||||||
-- Time flight is marshaling.
|
-- Time flight is marshaling.
|
||||||
local Tmarshal=timer.getAbsTime()-marshalflight.time
|
local Tmarshal=timer.getAbsTime()-marshalflight.time
|
||||||
@@ -2302,7 +2306,7 @@ function AIRBOSS:_CheckQueue()
|
|||||||
if npattern>0 then
|
if npattern>0 then
|
||||||
|
|
||||||
-- Last flight group send to pattern.
|
-- Last flight group send to pattern.
|
||||||
local patternflight=self.Qpattern[#self.Qpattern] --#AIRBOSS.Flightitem
|
local patternflight=self.Qpattern[#self.Qpattern] --#AIRBOSS.FlightGroup
|
||||||
|
|
||||||
-- Recovery case of pattern flight.
|
-- Recovery case of pattern flight.
|
||||||
pcase=patternflight.case
|
pcase=patternflight.case
|
||||||
@@ -2435,7 +2439,7 @@ function AIRBOSS:_ScanCarrierZone()
|
|||||||
-- Find flights that are not in CCA.
|
-- Find flights that are not in CCA.
|
||||||
local remove={}
|
local remove={}
|
||||||
for _,_flight in pairs(self.flights) do
|
for _,_flight in pairs(self.flights) do
|
||||||
local flight=_flight --#AIRBOSS.Flightitem
|
local flight=_flight --#AIRBOSS.FlightGroup
|
||||||
if insideCCA[flight.groupname]==nil then
|
if insideCCA[flight.groupname]==nil then
|
||||||
table.insert(remove, flight.group)
|
table.insert(remove, flight.group)
|
||||||
end
|
end
|
||||||
@@ -2490,7 +2494,7 @@ end
|
|||||||
|
|
||||||
--- Tell AI to orbit at a specified position at a specified alititude with a specified speed.
|
--- Tell AI to orbit at a specified position at a specified alititude with a specified speed.
|
||||||
-- @param #AIRBOSS self
|
-- @param #AIRBOSS self
|
||||||
-- @param #AIRBOSS.Flightitem flight Flight group.
|
-- @param #AIRBOSS.FlightGroup flight Flight group.
|
||||||
-- @param #number nstack Stack number of group. (Should be #self.Qmarshal+1 for new flight groups.)
|
-- @param #number nstack Stack number of group. (Should be #self.Qmarshal+1 for new flight groups.)
|
||||||
function AIRBOSS:_MarshalAI(flight, nstack)
|
function AIRBOSS:_MarshalAI(flight, nstack)
|
||||||
|
|
||||||
@@ -2523,6 +2527,30 @@ function AIRBOSS:_MarshalAI(flight, nstack)
|
|||||||
-- Waypoints array.
|
-- Waypoints array.
|
||||||
local wp={}
|
local wp={}
|
||||||
|
|
||||||
|
-- Current position.
|
||||||
|
wp[1]=group:GetCoordinate():WaypointAirTurningPoint(nil ,Speed, {}, "Current Position")
|
||||||
|
|
||||||
|
-- If flight has not arrived in the holding zone, we guide it there.
|
||||||
|
if not flight.holding then
|
||||||
|
|
||||||
|
-- Get altitude and positions.
|
||||||
|
local Altitude, p1, p2=self:_GetMarshalAltitude(nstack, flight.case)
|
||||||
|
|
||||||
|
if flight.case==1 then
|
||||||
|
-- TODO: Test & fine tune.
|
||||||
|
-- Waypoint in front of the carrier
|
||||||
|
wp[2]=self:GetCoordinate():Translate(UTILS.NMtoMeters(10), self:GetHeading()-45)
|
||||||
|
-- Enter pattern
|
||||||
|
wp[3]=self:GetCoordinate():Translate(UTILS.NMtoMeters(5), self:GetHeading()-90)
|
||||||
|
--TODO: waypoint task that sets flight.holing to true.
|
||||||
|
else
|
||||||
|
wp[2]=p1:WaypointAirTurningPoint(nil ,Speed, {}, "Entering Marshal Pattern")
|
||||||
|
-- TODO: waypoint task!
|
||||||
|
end
|
||||||
|
|
||||||
|
end
|
||||||
|
|
||||||
|
|
||||||
-- Set up waypoints including collapsing the stack.
|
-- Set up waypoints including collapsing the stack.
|
||||||
for stack=nstack, 1, -1 do
|
for stack=nstack, 1, -1 do
|
||||||
|
|
||||||
@@ -2531,7 +2559,7 @@ function AIRBOSS:_MarshalAI(flight, nstack)
|
|||||||
-- Get altitude and positions.
|
-- Get altitude and positions.
|
||||||
local Altitude, p1, p2=self:_GetMarshalAltitude(stack, flight.case)
|
local Altitude, p1, p2=self:_GetMarshalAltitude(stack, flight.case)
|
||||||
|
|
||||||
-- Right CW pattern for CASE II/III.
|
-- Right CCW pattern for CASE II/III.
|
||||||
local c1=nil --Core.Point#COORDINATE
|
local c1=nil --Core.Point#COORDINATE
|
||||||
local c2=nil --Core.Point#COORDINATE
|
local c2=nil --Core.Point#COORDINATE
|
||||||
local p0=nil --Core.Point#COORDINATE
|
local p0=nil --Core.Point#COORDINATE
|
||||||
@@ -2566,7 +2594,7 @@ function AIRBOSS:_MarshalAI(flight, nstack)
|
|||||||
|
|
||||||
end
|
end
|
||||||
|
|
||||||
-- Landing waypoint.
|
-- Landing waypoint. (Done separately now).
|
||||||
--wp[#wp+1]=Carrier:SetAltitude(250):WaypointAirLanding(Speed, self.airbase, nil, "Landing")
|
--wp[#wp+1]=Carrier:SetAltitude(250):WaypointAirLanding(Speed, self.airbase, nil, "Landing")
|
||||||
|
|
||||||
-- Reinit waypoints.
|
-- Reinit waypoints.
|
||||||
@@ -2597,7 +2625,7 @@ end
|
|||||||
|
|
||||||
--- Tell AI to land on the carrier.
|
--- Tell AI to land on the carrier.
|
||||||
-- @param #AIRBOSS self
|
-- @param #AIRBOSS self
|
||||||
-- @param #AIRBOSS.Flightitem flight Flight group.
|
-- @param #AIRBOSS.FlightGroup flight Flight group.
|
||||||
function AIRBOSS:_LandAI(flight)
|
function AIRBOSS:_LandAI(flight)
|
||||||
|
|
||||||
-- Aircraft speed when flying the pattern.
|
-- Aircraft speed when flying the pattern.
|
||||||
@@ -2690,7 +2718,7 @@ end
|
|||||||
|
|
||||||
--- Add a flight group to a specific marshal stack and to the marshal queue.
|
--- Add a flight group to a specific marshal stack and to the marshal queue.
|
||||||
-- @param #AIRBOSS self
|
-- @param #AIRBOSS self
|
||||||
-- @param #AIRBOSS.Flightitem flight Flight group.
|
-- @param #AIRBOSS.FlightGroup flight Flight group.
|
||||||
-- @param #number stack Marshal stack. This (re-)sets the flag value.
|
-- @param #number stack Marshal stack. This (re-)sets the flag value.
|
||||||
function AIRBOSS:_AddMarshalGroup(flight, stack)
|
function AIRBOSS:_AddMarshalGroup(flight, stack)
|
||||||
|
|
||||||
@@ -2722,7 +2750,7 @@ end
|
|||||||
--- Check if marshal stack can be collapsed.
|
--- Check if marshal stack can be collapsed.
|
||||||
-- If next in line is an AI flight, this is done. If human player is next, we wait for "Commence" via F10 radio menu command.
|
-- If next in line is an AI flight, this is done. If human player is next, we wait for "Commence" via F10 radio menu command.
|
||||||
-- @param #AIRBOSS self
|
-- @param #AIRBOSS self
|
||||||
-- @param #AIRBOSS.Flightitem flight Flight to go to pattern.
|
-- @param #AIRBOSS.FlightGroup flight Flight to go to pattern.
|
||||||
function AIRBOSS:_CheckCollapseMarshalStack(flight)
|
function AIRBOSS:_CheckCollapseMarshalStack(flight)
|
||||||
|
|
||||||
-- Check if flight is AI or human. If AI, we collapse the stack and commence. If human, we suggest to commence.
|
-- Check if flight is AI or human. If AI, we collapse the stack and commence. If human, we suggest to commence.
|
||||||
@@ -2750,7 +2778,7 @@ end
|
|||||||
|
|
||||||
--- Collapse marshal stack.
|
--- Collapse marshal stack.
|
||||||
-- @param #AIRBOSS self
|
-- @param #AIRBOSS self
|
||||||
-- @param #AIRBOSS.Flightitem flight Flight that left the marshal stack.
|
-- @param #AIRBOSS.FlightGroup flight Flight that left the marshal stack.
|
||||||
-- @param #boolean nopattern If true, flight does not go to pattern.
|
-- @param #boolean nopattern If true, flight does not go to pattern.
|
||||||
function AIRBOSS:_CollapseMarshalStack(flight, nopattern)
|
function AIRBOSS:_CollapseMarshalStack(flight, nopattern)
|
||||||
self:I({flight=flight, nopattern=nopattern})
|
self:I({flight=flight, nopattern=nopattern})
|
||||||
@@ -2781,7 +2809,7 @@ function AIRBOSS:_CollapseMarshalStack(flight, nopattern)
|
|||||||
mflight.flag:Set(mstack-1)
|
mflight.flag:Set(mstack-1)
|
||||||
|
|
||||||
-- Inform players.
|
-- Inform players.
|
||||||
if mflight.player and mflight.difficulty~=AIRBOSS.Difficulty.HARD then
|
if mflight.ai==false and mflight.difficulty~=AIRBOSS.Difficulty.HARD then
|
||||||
local alt=UTILS.MetersToFeet(self:_GetMarshalAltitude(mstack-1,case))
|
local alt=UTILS.MetersToFeet(self:_GetMarshalAltitude(mstack-1,case))
|
||||||
local text=string.format("descent to next lower stack at %d ft", alt)
|
local text=string.format("descent to next lower stack at %d ft", alt)
|
||||||
self:MessageToPlayer(mflight, text, "MARSHAL")
|
self:MessageToPlayer(mflight, text, "MARSHAL")
|
||||||
@@ -2892,7 +2920,7 @@ function AIRBOSS:_GetQueueInfo(queue, case)
|
|||||||
|
|
||||||
-- Loop over flight groups.
|
-- Loop over flight groups.
|
||||||
for _,_flight in pairs(queue) do
|
for _,_flight in pairs(queue) do
|
||||||
local flight=_flight --#AIRBOSS.Flightitem
|
local flight=_flight --#AIRBOSS.FlightGroup
|
||||||
|
|
||||||
-- Check if a specific case was requested.
|
-- Check if a specific case was requested.
|
||||||
if case then
|
if case then
|
||||||
@@ -2929,7 +2957,7 @@ function AIRBOSS:_PrintQueue(queue, name)
|
|||||||
text=text.." empty."
|
text=text.." empty."
|
||||||
else
|
else
|
||||||
for i,_flight in pairs(queue) do
|
for i,_flight in pairs(queue) do
|
||||||
local flight=_flight --#AIRBOSS.Flightitem
|
local flight=_flight --#AIRBOSS.FlightGroup
|
||||||
|
|
||||||
-- Timestamp.
|
-- Timestamp.
|
||||||
local clock=UTILS.SecondsToClock(flight.time)
|
local clock=UTILS.SecondsToClock(flight.time)
|
||||||
@@ -2978,14 +3006,14 @@ end
|
|||||||
--- Create a new flight group. Usually when a flight appears in the CCA.
|
--- Create a new flight group. Usually when a flight appears in the CCA.
|
||||||
-- @param #AIRBOSS self
|
-- @param #AIRBOSS self
|
||||||
-- @param Wrapper.Group#GROUP group Aircraft group.
|
-- @param Wrapper.Group#GROUP group Aircraft group.
|
||||||
-- @return #AIRBOSS.Flightitem Flight group.
|
-- @return #AIRBOSS.FlightGroup Flight group.
|
||||||
function AIRBOSS:_CreateFlightGroup(group)
|
function AIRBOSS:_CreateFlightGroup(group)
|
||||||
|
|
||||||
-- 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:I(self.lid..string.format("Creating new flight for group %s of aircraft type %s.", group:GetName(), group:GetTypeName()))
|
||||||
|
|
||||||
-- New flight.
|
-- New flight.
|
||||||
local flight={} --#AIRBOSS.Flightitem
|
local flight={} --#AIRBOSS.FlightGroup
|
||||||
|
|
||||||
-- Check if not already in flights
|
-- Check if not already in flights
|
||||||
if not self:_InQueue(self.flights, group) then
|
if not self:_InQueue(self.flights, group) then
|
||||||
@@ -3012,6 +3040,19 @@ function AIRBOSS:_CreateFlightGroup(group)
|
|||||||
-- Note, this should be re-set elsewhere!
|
-- Note, this should be re-set elsewhere!
|
||||||
flight.case=self.case
|
flight.case=self.case
|
||||||
|
|
||||||
|
flight.elements={}
|
||||||
|
local units=group:GetUnits()
|
||||||
|
for _,_unit in pairs(units) do
|
||||||
|
local unit=_unit --Wrapper.Unit#UNIT
|
||||||
|
local name=unit:GetName()
|
||||||
|
local element={} --#AIRBOSS.FlightElement
|
||||||
|
element.unit=unit
|
||||||
|
element.onboard=flight.onboardnumbers[name]
|
||||||
|
element.ballcall=false
|
||||||
|
table.insert(flight.elements, element)
|
||||||
|
end
|
||||||
|
|
||||||
|
|
||||||
-- Onboard
|
-- Onboard
|
||||||
if flight.ai then
|
if flight.ai then
|
||||||
local onboard=flight.onboardnumbers[flight.seclead]
|
local onboard=flight.onboardnumbers[flight.seclead]
|
||||||
@@ -3116,7 +3157,7 @@ end
|
|||||||
-- @param #AIRBOSS self
|
-- @param #AIRBOSS self
|
||||||
-- @param Wrapper.Group#GROUP group Group that will be removed from queue.
|
-- @param Wrapper.Group#GROUP group Group that will be removed from queue.
|
||||||
-- @param #table queue The queue from which the group will be removed.
|
-- @param #table queue The queue from which the group will be removed.
|
||||||
-- @return #AIRBOSS.Flightitem Flight group.
|
-- @return #AIRBOSS.FlightGroup Flight group.
|
||||||
-- @return #number Queue index.
|
-- @return #number Queue index.
|
||||||
function AIRBOSS:_GetFlightFromGroupInQueue(group, queue)
|
function AIRBOSS:_GetFlightFromGroupInQueue(group, queue)
|
||||||
|
|
||||||
@@ -3125,7 +3166,7 @@ function AIRBOSS:_GetFlightFromGroupInQueue(group, queue)
|
|||||||
|
|
||||||
-- Loop over all flight groups in queue
|
-- Loop over all flight groups in queue
|
||||||
for i,_flight in pairs(queue) do
|
for i,_flight in pairs(queue) do
|
||||||
local flight=_flight --#AIRBOSS.Flightitem
|
local flight=_flight --#AIRBOSS.FlightGroup
|
||||||
|
|
||||||
if flight.groupname==name then
|
if flight.groupname==name then
|
||||||
return flight, i
|
return flight, i
|
||||||
@@ -3136,6 +3177,43 @@ function AIRBOSS:_GetFlightFromGroupInQueue(group, queue)
|
|||||||
return nil, nil
|
return nil, nil
|
||||||
end
|
end
|
||||||
|
|
||||||
|
--- Get element in flight.
|
||||||
|
-- @param #AIRBOSS self
|
||||||
|
-- @param #string unitname Name of the unit.
|
||||||
|
-- @param #AIRBOSS.FlightGroup flight Flight group.
|
||||||
|
-- @return #AIRBOSS.FlightElement Flight element.
|
||||||
|
-- @return #number Element index.
|
||||||
|
function AIRBOSS:_GetFlightElement(unitname, flight)
|
||||||
|
|
||||||
|
-- Loop over all elements in flight group.
|
||||||
|
for i,_element in pairs(flight) do
|
||||||
|
local element=_element --#AIRBOSS.FlightElement
|
||||||
|
|
||||||
|
if element.unit:GetName()==unitname then
|
||||||
|
return element, i
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
self:T2(self.lid..string.format("WARNING: Flight element %s could not be found in flight group.", unitname, flight.groupname))
|
||||||
|
return nil, nil
|
||||||
|
end
|
||||||
|
|
||||||
|
--- Get element in flight.
|
||||||
|
-- @param #AIRBOSS self
|
||||||
|
-- @param #string unitname Name of the unit.
|
||||||
|
-- @param #AIRBOSS.FlightGroup flight Flight group.
|
||||||
|
function AIRBOSS:_RemoveFlightElement(unitname, flight)
|
||||||
|
|
||||||
|
-- Get table index.
|
||||||
|
local element,idx=self:_GetFlightElement(unitname,flight)
|
||||||
|
|
||||||
|
if idx then
|
||||||
|
table.remove(flight.elements, idx)
|
||||||
|
else
|
||||||
|
self:E("ERROR: Flight element could not be removed from flight group. Index=nil!")
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
--- Check if a group is in a queue.
|
--- Check if a group is in a queue.
|
||||||
-- @param #AIRBOSS self
|
-- @param #AIRBOSS self
|
||||||
-- @param #table queue The queue to check.
|
-- @param #table queue The queue to check.
|
||||||
@@ -3144,7 +3222,7 @@ end
|
|||||||
function AIRBOSS:_InQueue(queue, group)
|
function AIRBOSS:_InQueue(queue, group)
|
||||||
local name=group:GetName()
|
local name=group:GetName()
|
||||||
for _,_flight in pairs(queue) do
|
for _,_flight in pairs(queue) do
|
||||||
local flight=_flight --#AIRBOSS.Flightitem
|
local flight=_flight --#AIRBOSS.FlightGroup
|
||||||
if name==flight.groupname then
|
if name==flight.groupname then
|
||||||
return true
|
return true
|
||||||
end
|
end
|
||||||
@@ -3156,11 +3234,11 @@ end
|
|||||||
--- Remove a flight group.
|
--- Remove a flight group.
|
||||||
-- @param #AIRBOSS self
|
-- @param #AIRBOSS self
|
||||||
-- @param Wrapper.Group#GROUP group Aircraft group.
|
-- @param Wrapper.Group#GROUP group Aircraft group.
|
||||||
-- @return #AIRBOSS.Flightitem Flight group.
|
-- @return #AIRBOSS.FlightGroup Flight group.
|
||||||
function AIRBOSS:_RemoveFlightGroup(group)
|
function AIRBOSS:_RemoveFlightGroup(group)
|
||||||
local groupname=group:GetName()
|
local groupname=group:GetName()
|
||||||
for i,_flight in pairs(self.flights) do
|
for i,_flight in pairs(self.flights) do
|
||||||
local flight=_flight --#AIRBOSS.Flightitem
|
local flight=_flight --#AIRBOSS.FlightGroup
|
||||||
if flight.groupname==groupname then
|
if flight.groupname==groupname then
|
||||||
self:I(string.format("Removing flight group %s (not in CCA).", groupname))
|
self:I(string.format("Removing flight group %s (not in CCA).", groupname))
|
||||||
table.remove(self.flights, i)
|
table.remove(self.flights, i)
|
||||||
@@ -3172,12 +3250,12 @@ end
|
|||||||
--- Remove a flight group from a queue.
|
--- Remove a flight group from a queue.
|
||||||
-- @param #AIRBOSS self
|
-- @param #AIRBOSS self
|
||||||
-- @param #table queue The queue from which the group will be removed.
|
-- @param #table queue The queue from which the group will be removed.
|
||||||
-- @param #AIRBOSS.Flightitem flight Flight group that will be removed from queue.
|
-- @param #AIRBOSS.FlightGroup flight Flight group that will be removed from queue.
|
||||||
function AIRBOSS:_RemoveFlightFromQueue(queue, flight)
|
function AIRBOSS:_RemoveFlightFromQueue(queue, flight)
|
||||||
|
|
||||||
-- Loop over all flights in group.
|
-- Loop over all flights in group.
|
||||||
for i,_flight in pairs(queue) do
|
for i,_flight in pairs(queue) do
|
||||||
local qflight=_flight --#AIRBOSS.Flightitem
|
local qflight=_flight --#AIRBOSS.FlightGroup
|
||||||
|
|
||||||
-- Check for name.
|
-- Check for name.
|
||||||
if qflight.groupname==flight.groupname then
|
if qflight.groupname==flight.groupname then
|
||||||
@@ -3201,7 +3279,7 @@ function AIRBOSS:_RemoveGroupFromQueue(queue, group)
|
|||||||
|
|
||||||
-- Loop over all flights in group.
|
-- Loop over all flights in group.
|
||||||
for i,_flight in pairs(queue) do
|
for i,_flight in pairs(queue) do
|
||||||
local flight=_flight --#AIRBOSS.Flightitem
|
local flight=_flight --#AIRBOSS.FlightGroup
|
||||||
|
|
||||||
-- Check for name.
|
-- Check for name.
|
||||||
if flight.groupname==name then
|
if flight.groupname==name then
|
||||||
@@ -3233,10 +3311,16 @@ function AIRBOSS:_RemoveUnitFromFlight(unit)
|
|||||||
-- Check if flight exists.
|
-- Check if flight exists.
|
||||||
if flight then
|
if flight then
|
||||||
|
|
||||||
-- TODO: Improve this and remove the explicit unit. Make unit array for flight!
|
-- Remove element from flight group.
|
||||||
|
self:_RemoveFlightElement(unit:GetName(), flight)
|
||||||
|
|
||||||
-- Decrease number of units in group.
|
-- Decrease number of units in group.
|
||||||
flight.nunits=flight.nunits-1
|
flight.nunits=flight.nunits-1
|
||||||
|
|
||||||
|
-- Check if numbers still match.
|
||||||
|
if #flight.elements~=flight.nunits then
|
||||||
|
self:E("ERROR: Number of elements != number of units in flight!")
|
||||||
|
end
|
||||||
|
|
||||||
-- Check if no units are left.
|
-- Check if no units are left.
|
||||||
if flight.nunits==0 then
|
if flight.nunits==0 then
|
||||||
@@ -3260,12 +3344,12 @@ function AIRBOSS:_RemoveFlight(flight)
|
|||||||
self:_RemoveFlightFromQueue(self.Qpattern, flight)
|
self:_RemoveFlightFromQueue(self.Qpattern, flight)
|
||||||
|
|
||||||
-- Check if player or AI
|
-- Check if player or AI
|
||||||
if flight.player then
|
if flight.ai then
|
||||||
-- Set Playerstep to undefined.
|
|
||||||
flight.step=AIRBOSS.PatternStep.UNDEFINED
|
|
||||||
else
|
|
||||||
-- Remove AI flight completely.
|
-- Remove AI flight completely.
|
||||||
self:_RemoveFlightFromQueue(self.flights, flight)
|
self:_RemoveFlightFromQueue(self.flights, flight)
|
||||||
|
else
|
||||||
|
-- Set Playerstep to undefined.
|
||||||
|
flight.step=AIRBOSS.PatternStep.UNDEFINED
|
||||||
end
|
end
|
||||||
|
|
||||||
end
|
end
|
||||||
@@ -3348,7 +3432,7 @@ function AIRBOSS:_CheckPatternUpdate()
|
|||||||
|
|
||||||
-- Loop over all marshal flights
|
-- Loop over all marshal flights
|
||||||
for _,_flight in pairs(self.Qmarshal) do
|
for _,_flight in pairs(self.Qmarshal) do
|
||||||
local flight=_flight --#AIRBOSS.Flightitem
|
local flight=_flight --#AIRBOSS.FlightGroup
|
||||||
|
|
||||||
-- Update marshal pattern of AI keeping the same stack.
|
-- Update marshal pattern of AI keeping the same stack.
|
||||||
if flight.ai then
|
if flight.ai then
|
||||||
@@ -3776,7 +3860,7 @@ function AIRBOSS:_Holding(playerData)
|
|||||||
local playeralt=unit:GetAltitude()
|
local playeralt=unit:GetAltitude()
|
||||||
|
|
||||||
-- Get holding zone of player.
|
-- Get holding zone of player.
|
||||||
local zoneHolding=self:_GetZoneHolding(playerData.case, playerData.flag:Get())
|
local zoneHolding=self:_GetZoneHolding(playerData.case, stack)
|
||||||
|
|
||||||
-- Check if player is in holding zone.
|
-- Check if player is in holding zone.
|
||||||
local inholdingzone=unit:IsInZone(zoneHolding)
|
local inholdingzone=unit:IsInZone(zoneHolding)
|
||||||
@@ -7143,6 +7227,8 @@ function AIRBOSS:_RequestMarshal(_unitName)
|
|||||||
self:MessageToPlayer(playerData, text, "MARSHAL")
|
self:MessageToPlayer(playerData, text, "MARSHAL")
|
||||||
|
|
||||||
else
|
else
|
||||||
|
|
||||||
|
-- TODO: check if recovery window is open.
|
||||||
|
|
||||||
-- Add flight to marshal stack.
|
-- Add flight to marshal stack.
|
||||||
self:_MarshalPlayer(playerData)
|
self:_MarshalPlayer(playerData)
|
||||||
@@ -7335,7 +7421,7 @@ function AIRBOSS:_SetSection(_unitName)
|
|||||||
|
|
||||||
-- Loop over all registered flights.
|
-- Loop over all registered flights.
|
||||||
for _,_flight in pairs(self.flights) do
|
for _,_flight in pairs(self.flights) do
|
||||||
local flight=_flight --#AIRBOSS.Flightitem
|
local flight=_flight --#AIRBOSS.FlightGroup
|
||||||
|
|
||||||
-- Only human flight groups excluding myself.
|
-- Only human flight groups excluding myself.
|
||||||
if flight.ai==false and flight.groupname~=playerData.groupname then
|
if flight.ai==false and flight.groupname~=playerData.groupname then
|
||||||
|
|||||||
Reference in New Issue
Block a user