**FLIGHTCONTROL**
- Improved menus
- Added more menus
- Improved radio messages overlap
- Added options to limit number of fights taxiing and taking off
This commit is contained in:
Frank 2022-05-20 20:08:28 +02:00
parent 7c4cb5ea7f
commit 6279f1920e
4 changed files with 852 additions and 268 deletions

File diff suppressed because it is too large Load Diff

View File

@ -182,6 +182,18 @@ FLIGHTGROUP.RadioMessage = {
TAXIING={normal="Taxiing", enhanced="Taxiing"}, TAXIING={normal="Taxiing", enhanced="Taxiing"},
} }
--- Player skill.
-- @type FLIGHTGROUP.PlayerSkill
-- @field #string NOVICE Novice
FLIGHTGROUP.PlayerSkill = {
NOVICE="Novice",
}
--- Player settings.
-- @type FLIGHTGROUP.PlayerSettings
-- @field #boolean subtitles Display subtitles.
-- @field #string skill Skill level.
--- FLIGHTGROUP class version. --- FLIGHTGROUP class version.
-- @field #string version -- @field #string version
FLIGHTGROUP.version="0.7.3" FLIGHTGROUP.version="0.7.3"
@ -1645,8 +1657,6 @@ function FLIGHTGROUP:onafterParking(From, Event, To)
local flightcontrol=_DATABASE:GetFlightControl(airbasename) local flightcontrol=_DATABASE:GetFlightControl(airbasename)
if flightcontrol then if flightcontrol then
env.info("FF flight control!")
-- Set FC for this flight -- Set FC for this flight
self:SetFlightControl(flightcontrol) self:SetFlightControl(flightcontrol)
@ -3167,6 +3177,7 @@ function FLIGHTGROUP:_InitGroup(Template)
-- Set callsign. Default is set on spawn if not modified by user. -- Set callsign. Default is set on spawn if not modified by user.
local callsign=template.units[1].callsign local callsign=template.units[1].callsign
self:I({callsign=callsign})
if type(callsign)=="number" then -- Sometimes callsign is just "101". if type(callsign)=="number" then -- Sometimes callsign is just "101".
local cs=tostring(callsign) local cs=tostring(callsign)
callsign={} callsign={}
@ -3174,8 +3185,8 @@ function FLIGHTGROUP:_InitGroup(Template)
callsign[2]=cs:sub(2,2) callsign[2]=cs:sub(2,2)
callsign[3]=cs:sub(3,3) callsign[3]=cs:sub(3,3)
end end
self.callsign.NumberSquad=callsign[1] self.callsign.NumberSquad=tonumber(callsign[1])
self.callsign.NumberGroup=callsign[2] self.callsign.NumberGroup=tonumber(callsign[2])
self.callsign.NameSquad=UTILS.GetCallsignName(self.callsign.NumberSquad) self.callsign.NameSquad=UTILS.GetCallsignName(self.callsign.NumberSquad)
-- Set default formation. -- Set default formation.
@ -3195,8 +3206,9 @@ function FLIGHTGROUP:_InitGroup(Template)
-- Create Menu. -- Create Menu.
if not self.isAI then if not self.isAI then
self.menu=self.menu or {} self.menu=self.menu or {}
self.menu.atc=self.menu.atc or {} self.menu.atc=self.menu.atc or {} --#table
self.menu.atc.root=self.menu.atc.root or MENU_GROUP:New(self.group, "ATC") self.menu.atc.root=self.menu.atc.root or MENU_GROUP:New(self.group, "ATC") --Core.Menu#MENU_GROUP
self.menu.atc.help=self.menu.atc.help or MENU_GROUP:New(self.group, "Help", self.menu.atc.root) --Core.Menu#MENU_GROUP
end end
-- Units of the group. -- Units of the group.
@ -3624,6 +3636,20 @@ function FLIGHTGROUP:AddWaypointLanding(Airbase, Speed, AfterWaypointWithID, Alt
return waypoint return waypoint
end end
--- Get player element.
-- @param #FLIGHTGROUP self
-- @return Ops.OpsGroup#OPSGROUP.Element The element.
function FLIGHTGROUP:GetPlayerElement()
for _,_element in pairs(self.elements) do
local element=_element --Ops.OpsGroup#OPSGROUP.Element
if not element.ai then
return element
end
end
return nil
end
--- Set parking spot of element. --- Set parking spot of element.
-- @param #FLIGHTGROUP self -- @param #FLIGHTGROUP self
@ -4119,40 +4145,36 @@ end
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
-- MENU FUNCTIONS -- MENU FUNCTIONS
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
--- Get the proper terminal type based on generalized attribute of the group. --- Update menu.
--@param #FLIGHTGROUP self --@param #FLIGHTGROUP self
--@param #number delay Delay in seconds. --@param #number delay Delay in seconds.
function FLIGHTGROUP:_UpdateMenu(delay) function FLIGHTGROUP:_UpdateMenu(delay)
if delay and delay>0 then if delay and delay>0 then
self:T(self.lid..string.format("FF updating menu in %.1f sec", delay)) -- Delayed call.
self:ScheduleOnce(delay, FLIGHTGROUP._UpdateMenu, self) self:ScheduleOnce(delay, FLIGHTGROUP._UpdateMenu, self)
else else
self:T(self.lid.."FF updating menu NOW")
-- Get current position of group. -- Get current position of group.
local position=self:GetCoordinate() local position=self:GetCoordinate()
-- Get all FLIGHTCONTROLS -- Get all FLIGHTCONTROLS
local fc={} local fc={}
for airbasename,_flightcontrol in pairs(_DATABASE.FLIGHTCONTROLS) do for airbasename,_flightcontrol in pairs(_DATABASE.FLIGHTCONTROLS) do
local flightcontrol=_flightcontrol --Ops.FlightControl#FLIGHTCONTROL
local airbase=AIRBASE:FindByName(airbasename) -- Get coord of airbase.
local coord=flightcontrol:GetCoordinate()
local coord=airbase:GetCoordinate()
-- Distance to flight.
local dist=coord:Get2DDistance(position) local dist=coord:Get2DDistance(position)
local fcitem={airbasename=airbasename, dist=dist} -- Add to table.
table.insert(fc, {airbasename=airbasename, dist=dist})
table.insert(fc, fcitem)
end end
-- Sort table wrt distance to airbases. -- Sort table wrt distance to airbases.
@ -4161,18 +4183,20 @@ function FLIGHTGROUP:_UpdateMenu(delay)
end end
table.sort(fc, _sort) table.sort(fc, _sort)
for _,_menu in pairs(self.menu.atc or {}) do -- Remove all submenus.
local menu=_menu self.menu.atc.root:RemoveSubMenus()
end self:_CreateMenuAtcHelp(self.menu.atc.root)
-- Max menu entries.
local N=7
-- If there is a designated FC, we put it first. -- If there is a designated FC, we put it first.
local N=8
local gotairbase=nil local gotairbase=nil
if self.flightcontrol then if self.flightcontrol then
self.flightcontrol:_CreatePlayerMenu(self, self.menu.atc) self.flightcontrol:_CreatePlayerMenu(self, self.menu.atc.root)
gotairbase=self.flightcontrol.airbasename gotairbase=self.flightcontrol.airbasename
N=7 N=N-1
end end
-- Max 8 entries in F10 menu. -- Max 8 entries in F10 menu.
@ -4180,13 +4204,88 @@ function FLIGHTGROUP:_UpdateMenu(delay)
local airbasename=fc[i].airbasename local airbasename=fc[i].airbasename
if gotairbase==nil or airbasename~=gotairbase then if gotairbase==nil or airbasename~=gotairbase then
local flightcontrol=_DATABASE:GetFlightControl(airbasename) local flightcontrol=_DATABASE:GetFlightControl(airbasename)
flightcontrol:_CreatePlayerMenu(self, self.menu.atc) flightcontrol:_CreatePlayerMenu(self, self.menu.atc.root)
end end
end end
end end
end end
--- Create player menu.
-- @param #FLIGHTGROUP self
-- @param #table rootmenu ATC root menu table.
function FLIGHTGROUP:_CreateMenuAtcHelp(rootmenu)
-- Help menu.
local helpmenu=MENU_GROUP:New(self.group, "Help", rootmenu)
-- Group name.
local groupname=self.groupname
---
-- Skill level menu
---
local skillmenu=MENU_GROUP:New(self.group, "Skill Level", helpmenu)
MENU_GROUP_COMMAND:New(self.group, "Beginner", skillmenu, self._MenuNotImplemented, self, groupname)
MENU_GROUP_COMMAND:New(self.group, "Student", skillmenu, self._MenuNotImplemented, self, groupname)
MENU_GROUP_COMMAND:New(self.group, "Professional", skillmenu, self._MenuNotImplemented, self, groupname)
---
-- Commands
---
MENU_GROUP_COMMAND:New(self.group, "Subtitles On/Off", helpmenu, self._MenuNotImplemented, self, groupname)
MENU_GROUP_COMMAND:New(self.group, "My Voice On/Off", helpmenu, self._MenuNotImplemented, self, groupname)
MENU_GROUP_COMMAND:New(self.group, "My Status", helpmenu, self._PlayerMyStatus, self, groupname)
end
--- Player menu not implemented.
-- @param #FLIGHTGROUP self
-- @param #string groupname Name of the flight group.
function FLIGHTGROUP:_MenuNotImplemented(groupname)
-- Get flight group.
local flight=_DATABASE:GetOpsGroup(groupname) --Ops.FlightGroup#FLIGHTGROUP
if flight then
local text=string.format("Sorry, this feature is not implemented yet!")
MESSAGE:New(text, 10, nil, true):ToGroup(flight.group)
--self:TextMessageToFlight(text, flight)
end
end
--- Player status.
-- @param #FLIGHTGROUP self
-- @param #string groupname Name of the flight group.
function FLIGHTGROUP:_PlayerMyStatus(groupname)
-- Get flight group.
local flight=_DATABASE:GetOpsGroup(groupname) --Ops.FlightGroup#FLIGHTGROUP
if flight then
local fc=flight.flightcontrol
-- Status text.
local text=string.format("My Status:")
text=text..string.format("\nCallsign: %s", tostring(flight:GetCallsignName()))
text=text..string.format("\nFlight status: %s", tostring(flight:GetState()))
text=text..string.format("\nFlight control: %s status=%s", tostring(fc and fc.airbasename or "N/A"), tostring(fc and fc:GetFlightStatus(flight) or "N/A"))
-- Send message.
--self:TextMessageToFlight(text, flight, 10, true)
MESSAGE:New(text, 10, nil, true):ToGroup(flight.group)
else
--TODO: Error
end
end
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

View File

@ -730,6 +730,7 @@ function OPSGROUP:New(group)
------------------------ ------------------------
--- Triggers the FSM event "Stop". Stops the OPSGROUP and all its event handlers. --- Triggers the FSM event "Stop". Stops the OPSGROUP and all its event handlers.
-- @function [parent=#OPSGROUP] Stop
-- @param #OPSGROUP self -- @param #OPSGROUP self
--- Triggers the FSM event "Stop" after a delay. Stops the OPSGROUP and all its event handlers. --- Triggers the FSM event "Stop" after a delay. Stops the OPSGROUP and all its event handlers.
@ -1610,10 +1611,11 @@ end
--- Get current coordinate of the group. If the current position cannot be determined, the last known position is returned. --- Get current coordinate of the group. If the current position cannot be determined, the last known position is returned.
-- @param #OPSGROUP self -- @param #OPSGROUP self
-- @param #boolean NewObject Create a new coordiante object. -- @param #boolean NewObject Create a new coordiante object.
-- @param #string UnitName (Optional) Get position of a specifc unit of the group. Default is the first existing unit in the group.
-- @return Core.Point#COORDINATE The coordinate (of the first unit) of the group. -- @return Core.Point#COORDINATE The coordinate (of the first unit) of the group.
function OPSGROUP:GetCoordinate(NewObject) function OPSGROUP:GetCoordinate(NewObject, UnitName)
local vec3=self:GetVec3() or self.position --DCS#Vec3 local vec3=self:GetVec3(UnitName) or self.position --DCS#Vec3
if vec3 then if vec3 then
@ -11260,6 +11262,8 @@ function OPSGROUP:SetDefaultCallsign(CallsignName, CallsignNumber)
self.callsignDefault.NumberSquad=CallsignName self.callsignDefault.NumberSquad=CallsignName
self.callsignDefault.NumberGroup=CallsignNumber or 1 self.callsignDefault.NumberGroup=CallsignNumber or 1
self.callsignDefault.NameSquad=UTILS.GetCallsignName(self.callsign.NumberSquad) self.callsignDefault.NameSquad=UTILS.GetCallsignName(self.callsign.NumberSquad)
self:I(self.lid..string.format("Default callsign=%s", self.callsignDefault.NameSquad))
return self return self
end end

View File

@ -322,6 +322,16 @@ function MARKER:ReadOnly()
return self return self
end end
--- Marker is readonly. Text cannot be changed and marker cannot be removed.
-- @param #MARKER self
-- @return #MARKER self
function MARKER:ReadWrite()
self.readonly=false
return self
end
--- Set message that is displayed on screen if the marker is added. --- Set message that is displayed on screen if the marker is added.
-- @param #MARKER self -- @param #MARKER self
-- @param #string Text Message displayed when the marker is added. -- @param #string Text Message displayed when the marker is added.