This commit is contained in:
Frank
2020-05-07 18:05:41 +02:00
parent c30d9f3472
commit ae36353aab
2 changed files with 113 additions and 67 deletions
+78 -40
View File
@@ -1,4 +1,4 @@
--- **OPS** - (R2.5) - Manage recovery of aircraft at airdromes. --- **OPS** - Manage recovery of aircraft at airdromes.
-- --
-- --
-- --
@@ -27,15 +27,6 @@
-- @field #table runways Runway table. -- @field #table runways Runway table.
-- @field #table flights All flights table. -- @field #table flights All flights table.
-- @field #table clients Table with all clients spawning at this airbase. -- @field #table clients Table with all clients spawning at this airbase.
-- @field #table Qinbound Queue of aircraft inbound and traveling to the holding position.
-- @field #table Qholding Queue of aircraft waiting for landing permission.
-- @field #table Qlanding Queue of aircraft currently on final approach.
-- @field #table Qtaxiinb Queue of aircraft taxiing to parking after landing.
-- @field #table Qarrived Queue of aircraft that have arrived at their parking spot after landing.
-- @field #table Qparking Queue of aircraft parking and waiting for taxi & takeoff clearance.
-- @field #table Qtaxiout Queue of aircraft taxiing from parking to runway for takeoff.
-- @field #table Qreadyto Queue of aircraft ready for takeoff. Only human players.
-- @field #table Qtakeoff Queue of aircraft about to takeoff.
-- @field Ops.ATIS#ATIS atis ATIS object. -- @field Ops.ATIS#ATIS atis ATIS object.
-- @field #number activerwyno Number of active runway. -- @field #number activerwyno Number of active runway.
-- @field #number atcfreq ATC radio frequency. -- @field #number atcfreq ATC radio frequency.
@@ -72,15 +63,6 @@ FLIGHTCONTROL = {
runways = {}, runways = {},
flights = {}, flights = {},
clients = {}, clients = {},
Qinbound = {},
Qholding = {},
Qlanding = {},
Qtaxiinb = {},
Qarrived = {},
Qparking = {},
Qtaxiout = {},
Qreadyto = {},
Qtakeoff = {},
atis = nil, atis = nil,
activerwyno = 1, activerwyno = 1,
atcfreq = nil, atcfreq = nil,
@@ -312,7 +294,11 @@ end
-- @return #FLIGHTCONTROL self -- @return #FLIGHTCONTROL self
function FLIGHTCONTROL:SetParkingGuard(TemplateGroupName) function FLIGHTCONTROL:SetParkingGuard(TemplateGroupName)
self.parkingGuard=SPAWN:New(TemplateGroupName) --self.parkingGuard=SPAWN:New(TemplateGroupName)
local alias=string.format("Parking Guard %s", self.airbasename)
self.parkingGuard=SPAWN:NewWithAlias(TemplateGroupName, alias)
return self return self
end end
@@ -354,7 +340,7 @@ function FLIGHTCONTROL:onafterStatus()
self:_CheckFlights() self:_CheckFlights()
-- Check parking spots. -- Check parking spots.
self:_CheckParking() --self:_CheckParking()
-- Check waiting and landing queue. -- Check waiting and landing queue.
self:_CheckQueues() self:_CheckQueues()
@@ -388,7 +374,7 @@ function FLIGHTCONTROL:onafterStatus()
end end
-- Info text. -- Info text.
local text=string.format("State %s - Runway %s - Parking %d/%d/%d of %d - Flights=%s: Qpark=%d Qtxout=%d Qready=%d Qto=%d | Qinbound=%d Qhold=%d Qland=%d Qtxinb=%d Qarr=%d", 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:GetState(), runway.idx, Nfree, Noccu, Nresv, self.Nparkingspots, Nflights, NQparking, NQtaxiout, NQreadyto, NQtakeoff, NQinbound, NQholding, NQlanding, NQtaxiinb, NQarrived) self:GetState(), runway.idx, Nfree, Noccu, Nresv, self.Nparkingspots, Nflights, NQparking, NQtaxiout, NQreadyto, NQtakeoff, NQinbound, NQholding, NQlanding, NQtaxiinb, NQarrived)
self:I(self.lid..text) self:I(self.lid..text)
@@ -427,23 +413,35 @@ end
function FLIGHTCONTROL:OnEventBirth(EventData) function FLIGHTCONTROL:OnEventBirth(EventData)
self:F3({EvendData=EventData}) self:F3({EvendData=EventData})
if EventData and EventData.IniGroupName and EventData.Place and EventData.Place:GetName()==self.airbasename then if EventData and EventData.IniGroupName and EventData.IniUnit then
self:I(self.lid..string.format("BIRTH: unit = %s", tostring(EventData.IniUnitName))) self:I(self.lid..string.format("BIRTH: unit = %s", tostring(EventData.IniUnitName)))
self:T2(self.lid..string.format("BIRTH: group = %s", tostring(EventData.IniGroupName))) self:T2(self.lid..string.format("BIRTH: group = %s", tostring(EventData.IniGroupName)))
-- Unit that was born. -- Unit that was born.
local unit=EventData.IniUnit local unit=EventData.IniUnit
-- We delay this, to have all elements of the group in the game. -- We delay this, to have all elements of the group in the game.
if unit:IsAir() then if unit:IsAir() then
self:ScheduleOnce(0.5, self._CreateFlightGroup, self, EventData.IniGroup) local bornhere=EventData.Place and EventData.Place:GetName()==self.airbasename or false
env.info("FF born here ".. tostring(bornhere))
-- We got a player?
local playerunit, playername=self:_GetPlayerUnitAndName(EventData.IniUnitName)
self:SpawnParkingGuard(unit) if playername or bornhere then
self:ScheduleOnce(0.5, self._CreateFlightGroup, self, EventData.IniGroup)
end
if bornhere then
self:SpawnParkingGuard(unit)
end
end end
end end
end end
@@ -1366,8 +1364,10 @@ function FLIGHTCONTROL:_CreatePlayerMenu(flight, atcmenu)
local groupname=flight.groupname local groupname=flight.groupname
local gid=group:GetID() local gid=group:GetID()
self:I(self.lid..string.format("Creating ATC player menu for flight group %s (ID=%d) in state=%s", tostring(flight.groupname), gid, flight:GetState())) local flightstatus=self:GetFlightStatus(flight)
local gotcontrol=flight.flightcontrol and flight.flightcontrol.airbasename==self.airbasename or false
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)))
local airbasename=self.airbasename local airbasename=self.airbasename
local Tag=airbasename local Tag=airbasename
@@ -1390,7 +1390,7 @@ function FLIGHTCONTROL:_CreatePlayerMenu(flight, atcmenu)
MENU_GROUP_COMMAND_DELAYED:New(group, "ATIS", infomenu, self._PlayerRequestInfoATIS, self, groupname):SetTime(Tnow):SetTag(Tag) MENU_GROUP_COMMAND_DELAYED:New(group, "ATIS", infomenu, self._PlayerRequestInfoATIS, self, groupname):SetTime(Tnow):SetTag(Tag)
-- Root Commands. -- Root Commands.
if flight.flightcontrol and flight.flightcontrol.airbasename==self.airbasename then if gotcontrol then
--- ---
-- FC is controlling this flight -- FC is controlling this flight
@@ -1415,6 +1415,11 @@ function FLIGHTCONTROL:_CreatePlayerMenu(flight, atcmenu)
--- ---
-- Airborne -- Airborne
--- ---
elseif flight:IsInbound() then
MENU_GROUP_COMMAND_DELAYED:New(group, "Holding", rootmenu, self._PlayerHolding, self, groupname):SetTime(Tnow):SetTag(Tag)
end end
if flight:IsInbound() or flight:IsHolding() or flight:IsLanding() or flight:IsLanded() then if flight:IsInbound() or flight:IsHolding() or flight:IsLanding() or flight:IsLanded() then
@@ -1429,18 +1434,14 @@ function FLIGHTCONTROL:_CreatePlayerMenu(flight, atcmenu)
if flight:IsAirborne() then if flight:IsAirborne() then
if self:GetFlightStatus(flight)==FLIGHTCONTROL.FlightStatus.INBOUND then MENU_GROUP_COMMAND_DELAYED:New(group, "Inbound", rootmenu, self._PlayerInbound, self, groupname):SetTime(Tnow):SetTag(Tag)
MENU_GROUP_COMMAND_DELAYED:New(group, "Holding", rootmenu, self._PlayerInbound, self, groupname):SetTime(Tnow):SetTag(Tag)
else
MENU_GROUP_COMMAND_DELAYED:New(group, "Inbound", rootmenu, self._PlayerHolding, self, groupname):SetTime(Tnow):SetTag(Tag)
end
end end
end end
if flight.flightcontrol and flight.flightcontrol.airbasename==self.airbasename then if gotcontrol then
MENU_GROUP_COMMAND_DELAYED:New(group, "My Status", rootmenu, self._PlayerMyStatus, self, groupname):SetTime(Tnow):SetTag(Tag) MENU_GROUP_COMMAND_DELAYED:New(group, "My Status", rootmenu, self._PlayerMyStatus, self, groupname):SetTime(Tnow):SetTag(Tag)
end end
@@ -1464,7 +1465,7 @@ function FLIGHTCONTROL:_PlayerRequestParking(groupname)
local coord=flight:GetGroup():GetCoordinate() local coord=flight:GetGroup():GetCoordinate()
--TODO: terminal type for helos! --TODO: terminal type for helos!
local spot=self:GetClosestParkingSpot(coord, AIRBASE.TerminalType.FighterAircraft, true) local spot=self:GetClosestParkingSpot(coord, nil, true)
--TODO: voice over. --TODO: voice over.
local text=string.format("Flight XYZ, tower, your assigned parking position is terminal ID %d.\nCheck your F10 map for details.", spot.TerminalID) local text=string.format("Flight XYZ, tower, your assigned parking position is terminal ID %d.\nCheck your F10 map for details.", spot.TerminalID)
@@ -1575,7 +1576,10 @@ function FLIGHTCONTROL:_PlayerInbound(groupname)
-- Set FC controlling this flight. -- Set FC controlling this flight.
flight:SetFlightControl(self) flight:SetFlightControl(self)
end end
-- Call RTB event.
flight:RTB(self.airbase)
-- Add flight to inbound queue. -- Add flight to inbound queue.
self:SetFlightStatus(flight, FLIGHTCONTROL.FlightStatus.INBOUND) self:SetFlightStatus(flight, FLIGHTCONTROL.FlightStatus.INBOUND)
@@ -1605,7 +1609,7 @@ function FLIGHTCONTROL:_PlayerHolding(groupname)
if flight then if flight then
if flight:IsAirborne() then if flight:IsInbound() then
if flight.flightcontrol and flight.flightcontrol.airbasename==self.airbasename then if flight.flightcontrol and flight.flightcontrol.airbasename==self.airbasename then
@@ -1616,7 +1620,7 @@ function FLIGHTCONTROL:_PlayerHolding(groupname)
-- Call holding event. -- Call holding event.
flight:Holding() flight:Holding()
else else
-- Error you are not airborne! -- Error you are not airborne!
@@ -1626,7 +1630,7 @@ function FLIGHTCONTROL:_PlayerHolding(groupname)
end end
else else
-- Error you are not airborne! -- Error you are not airborne!
local text=string.format("Negative, you must be AIRBORNE to call HOLDING!") local text=string.format("Negative, you must be INBOUND to call HOLDING!")
MESSAGE:New(text, 5):ToGroup(flight.group) MESSAGE:New(text, 5):ToGroup(flight.group)
end end
else else
@@ -2101,6 +2105,40 @@ function FLIGHTCONTROL:GetCoalition()
return self.airbase:GetCoalition() return self.airbase:GetCoalition()
end end
--- Returns the unit of a player and the player name. If the unit does not belong to a player, nil is returned.
-- @param #FLIGHTCONTROL self
-- @param #string unitName Name of the player unit.
-- @return Wrapper.Unit#UNIT Unit of player or nil.
-- @return #string Name of the player or nil.
function FLIGHTCONTROL:_GetPlayerUnitAndName(unitName)
if unitName then
-- Get DCS unit from its name.
local DCSunit=Unit.getByName(unitName)
if DCSunit then
-- Get player name if any.
local playername=DCSunit:getPlayerName()
-- Unit object.
local unit=UNIT:Find(DCSunit)
-- Check if enverything is there.
if DCSunit and unit and playername then
self:T(self.lid..string.format("Found DCS unit %s with player %s", tostring(unitName), tostring(playername)))
return unit, playername
end
end
end
-- Return nil if we could not find a player.
return nil,nil
end
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+35 -27
View File
@@ -2493,6 +2493,10 @@ end
-- @param #string To To state. -- @param #string To To state.
function FLIGHTGROUP:onafterFlightAirborne(From, Event, To) function FLIGHTGROUP:onafterFlightAirborne(From, Event, To)
self:I(self.lid..string.format("Flight airborne")) self:I(self.lid..string.format("Flight airborne"))
if not self.ai then
self:_UpdateMenu()
end
end end
--- On after "FlightLanding" event. --- On after "FlightLanding" event.
@@ -2799,7 +2803,7 @@ end
-- @param #number delay Delay in seconds. -- @param #number delay Delay in seconds.
function FLIGHTGROUP:_CheckFlightDone(delay) function FLIGHTGROUP:_CheckFlightDone(delay)
if self:IsAlive() and not self.ai then if self:IsAlive() and self.ai then
if delay and delay>0 then if delay and delay>0 then
-- Delayed call. -- Delayed call.
@@ -3022,9 +3026,6 @@ function FLIGHTGROUP:onafterRTB(From, Event, To, airbase, SpeedTo, SpeedHold, Sp
local runway=airbase:GetActiveRunway() local runway=airbase:GetActiveRunway()
-- Clear all tasks.
self:ClearTasks()
-- Set holding flag to 0=false. -- Set holding flag to 0=false.
self.flaghold:Set(0) self.flaghold:Set(0)
@@ -3072,33 +3073,40 @@ function FLIGHTGROUP:onafterRTB(From, Event, To, airbase, SpeedTo, SpeedHold, Sp
end end
local routeto=false if self.ai then
if fc or world.event.S_EVENT_KILL then
routeto=true
end
-- Respawn? local routeto=false
if routeto then if fc or world.event.S_EVENT_KILL then
routeto=true
end
--self:I(self.lid.."FF route (not repawn)") -- Clear all tasks.
self:ClearTasks()
-- Respawn?
if routeto then
-- Just route the group. Respawn might happen when going from holding to final. --self:I(self.lid.."FF route (not repawn)")
self:Route(wp, 1)
-- Just route the group. Respawn might happen when going from holding to final.
else self:Route(wp, 1)
else
--self:I(self.lid.."FF respawn (not route)")
-- Get group template.
local Template=self.group:GetTemplate()
-- Set route points.
Template.route.points=wp
--self:I(self.lid.."FF respawn (not route)") --Respawn the group with new waypoints.
self:Respawn(Template)
-- Get group template.
local Template=self.group:GetTemplate() end
-- Set route points. end
Template.route.points=wp
--Respawn the group with new waypoints.
self:Respawn(Template)
end
end end