This commit is contained in:
Frank
2019-11-14 21:50:55 +01:00
parent a33c8219e1
commit 5cf97ac802
2 changed files with 118 additions and 44 deletions
+115 -12
View File
@@ -259,7 +259,7 @@ function FLIGHTCONTROL:onafterStatus()
--self:_CheckInbound() --self:_CheckInbound()
-- Check parking spots. -- Check parking spots.
self:_CheckParking() --self:_CheckParking()
-- Update parking spots. -- Update parking spots.
self:_UpdateParkingSpots() self:_UpdateParkingSpots()
@@ -420,6 +420,11 @@ function FLIGHTCONTROL:_CheckQueues()
if isholding then if isholding then
local n,parking=self:_GetFreeParkingSpots()
-- Get number of alive elements.
local Ne=self:GetNelements()
-- Message. -- Message.
local text=string.format("Flight %s, you are cleared to land.", flight.groupname) local text=string.format("Flight %s, you are cleared to land.", flight.groupname)
MESSAGE:New(text, 5, "FLIGHTCONTROL"):ToAll() MESSAGE:New(text, 5, "FLIGHTCONTROL"):ToAll()
@@ -428,7 +433,7 @@ function FLIGHTCONTROL:_CheckQueues()
-- TODO: Humans have to confirm via F10 menu. -- TODO: Humans have to confirm via F10 menu.
if flight.ai then if flight.ai then
flight:FlightLanding() flight:FlightLanding()
self:_LandAI(flight) self:_LandAI(flight, parking)
end end
else else
@@ -468,9 +473,22 @@ function FLIGHTCONTROL:_GetNextFight()
local flightholding=self:_GetNextFightHolding() local flightholding=self:_GetNextFightHolding()
local flightparking=self:_GetNextFightParking() local flightparking=self:_GetNextFightParking()
-- Free parking spots.
local nP=self:_GetFreeParkingSpots()
-- Get number of alive elements of the holding flight.
local nH=0
if flightholding then
nH=flightholding:GetNelements()
end
-- If no flight is waiting for takeoff return the holding flight or nil. -- If no flight is waiting for takeoff return the holding flight or nil.
if not flightparking then if not flightparking then
return flightholding, true if nP>=nH then
return flightholding, true
else
return nil, nil
end
end end
-- If no flight is waiting for landing return the takeoff flight or nil. -- If no flight is waiting for landing return the takeoff flight or nil.
@@ -483,12 +501,16 @@ function FLIGHTCONTROL:_GetNextFight()
-- Return holding flight if fuel is low. -- Return holding flight if fuel is low.
if flightholding.fuellow then if flightholding.fuellow then
return flightholding, true if nP>=nH then
return flightholding, true
else
return nil, nil
end
end end
-- Return the flight which is waiting longer. -- Return the flight which is waiting longer.
if flightholding.Tholding>flightparking.Tparking then if flightholding.Tholding>flightparking.Tparking and nP>=nH then
return flightholding, true return flightholding, true
else else
return flightparking, false return flightparking, false
@@ -792,7 +814,7 @@ function FLIGHTCONTROL:_InitParkingSpots()
parking.reserved="none" parking.reserved="none"
-- Mark position. -- Mark position.
local text=string.format("ID=%d, Terminal=%d, Free=%s, Reserved=%s, Dist=%.1f", parking.id, parking.terminal, tostring(parking.free), tostring(parking.reserved), parking.drunway) local text=string.format("ID=%d, Terminal=%d, Free=%s, Reserved=%s, Dist=%.1f", parking.TerminalID, parking.TerminalType, tostring(parking.Free), tostring(parking.reserved), parking.DistToRwy)
--parking.markerid=parking.position:MarkToAll(text) --parking.markerid=parking.position:MarkToAll(text)
-- Add to table. -- Add to table.
@@ -895,10 +917,10 @@ function FLIGHTCONTROL:_UpdateParkingSpots()
parking.Coordinate:RemoveMark(parking.markerid) parking.Coordinate:RemoveMark(parking.markerid)
end end
local text=string.format("ID=%03d, Terminal=%03d, Free=%s, Reserved=%s, reserved4=%s, Dist=%.1f", parking.id, parking.terminal, tostring(parking.free), tostring(parking.reserved), parking.reserved4, parking.drunway) local text=string.format("ID=%03d, Terminal=%03d, Free=%s, Reserved=%s, reserved4=%s, Dist=%.1f", parking.TerminalID, parking.TerminalType, tostring(parking.Free), tostring(parking.TOAC), parking.reserved, parking.DistToRwy)
message=message.."\n"..text message=message.."\n"..text
if parking.free==false or parking.reserved or parking.reserved4~="none" then if parking.Free==false or parking.TOAC or parking.reserved~="none" then
parking.markerid=parking.position:MarkToAll(text) parking.markerid=parking.Coordinate:MarkToAll(text)
end end
break break
@@ -1163,6 +1185,35 @@ end
-- Routing Functions -- Routing Functions
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
--- Scan airbase zone and find new flights.
-- @param #FLIGHTCONTROL self
function FLIGHTCONTROL:_CheckAirbase()
-- Airbase position.
local coord=self:GetCoordinate()
-- Scan radius = 5 NM.
local RCCZ=UTILS.NMToMeters(5)
-- Debug info.
self:T(self.lid..string.format("Scanning airbase zone. Radius=%.1f NM.", UTILS.MetersToNM(RCCZ)))
-- Scan units in carrier zone.
local _,_,_,unitscan=coord:ScanObjects(RCCZ, true, false, false)
local su=SET_UNIT:New()
for _,_unit in pairs(unitscan) do
local unit=_unit --Wrapper.Unit#UNIT
if unit and unit:IsAlive() and unit:InAir()==false then
su:AddUnit(unit)
end
end
return su
end
--- Scan airbase zone and find new flights. --- Scan airbase zone and find new flights.
-- @param #FLIGHTCONTROL self -- @param #FLIGHTCONTROL self
function FLIGHTCONTROL:_CheckACstatus() function FLIGHTCONTROL:_CheckACstatus()
@@ -1326,7 +1377,7 @@ end
--- Tell AI to land at the airbase. Flight is added to the landing queue. --- Tell AI to land at the airbase. Flight is added to the landing queue.
-- @param #FLIGHTCONTROL self -- @param #FLIGHTCONTROL self
-- @param Ops.FlightGroup#FLIGHTGROUP flight Flight group. -- @param Ops.FlightGroup#FLIGHTGROUP flight Flight group.
function FLIGHTCONTROL:_LandAI(flight) function FLIGHTCONTROL:_LandAI(flight, parking)
-- Debug info. -- Debug info.
self:I(self.lid..string.format("Landing AI flight %s.", flight.groupname)) self:I(self.lid..string.format("Landing AI flight %s.", flight.groupname))
@@ -1334,11 +1385,63 @@ function FLIGHTCONTROL:_LandAI(flight)
-- Add flight to landing queue. -- Add flight to landing queue.
self:_AddFlightToLandingQueue(flight) self:_AddFlightToLandingQueue(flight)
-- Remove flight from waiting queue.
self:_RemoveFlightFromQueue(self.Qwaiting, flight, "holding")
-- Altitude above ground for a glide slope of 3.
local alpha=math.rad(3)
local x1=UTILS.NMToMeters(10)
local x2=UTILS.NMToMeters(5)
local h1=x1*math.tan(alpha)
local h2=x2*math.tan(alpha)
local SpeedLand=150
local runway=self:GetActiveRunway()
-- Waypoints.
local wp={}
wp[#wp+1]=self.group:GetCoordinate():WaypointAir(nil, COORDINATE.WaypointType.TurningPoint, COORDINATE.WaypointAction.FlyoverPoint, UTILS.KnotsToKmph(SpeedTo), true , nil, {}, "Current Pos")
-- Approach point: 10 NN in direction of runway.
local papp=self.airbase:GetCoordinate():Translate(x1, runway.heading-180):SetAltitude(h1)
wp[#wp+1]=papp:WaypointAirTurningPoint(nil, UTILS.KnotsToKmph(SpeedLand), {}, "Final Approach")
-- Okay, it looks like it's best to specify the coordinates not at the airbase but a bit away. This causes a more direct landing approach.
local pland=self.airbase:GetCoordinate():Translate(x2, runway.heading-180):SetAltitude(h2)
wp[#wp+1]=pland:WaypointAirLanding(UTILS.KnotsToKmph(SpeedLand), self.airbase, {}, "Landing")
if self.Debug then
papp:MarkToAll(string.format("Final Approach: d=%d m, h=%d m", x1, h1))
pland:MarkToAll(string.format("Landing: d=%d m, h=%d m", x2, h2))
end
-- Give signal to land. -- Give signal to land.
flight.flaghold:Set(1) flight.flaghold:Set(1)
-- Remove flight from waiting queue. -- Get group template.
self:_RemoveFlightFromQueue(self.Qwaiting, flight, "holding") local Template=self.group:GetTemplate()
-- Set route points.
Template.route.points=wp
for i,unit in pairs(Template.units) do
local spot=parking[i] --Ops.FlightControl#FLIGHTCONTROL.ParkingSpot
spot.reserved=unit.name
unit.parking_landing=spot.TerminalID
local text=string.format("FF Reserving parking spot %d for unit %s", spot.TerminalID, tostring(unit.name))
env.info(text)
end
MESSAGE:New("Respawning group"):ToAll()
--Respawn the group.
self.group=self.group:Respawn(Template, true)
-- Route the group.
self.group:Route(wp, 1)
end end
--- Get holding point. --- Get holding point.
+1 -30
View File
@@ -1532,9 +1532,6 @@ function FLIGHTGROUP:onafterHold(From, Event, To, airbase, SpeedTo, SpeedHold, S
local h1=x1*math.tan(alpha) local h1=x1*math.tan(alpha)
local h2=x2*math.tan(alpha) local h2=x2*math.tan(alpha)
-- Get a landing point
local pland=airbase:GetZone():GetRandomCoordinate(x2,x1):SetAltitude(x2)
-- Do we have a flight control? -- Do we have a flight control?
local fc=_DATABASE:GetFlightControl(airbase:GetName()) local fc=_DATABASE:GetFlightControl(airbase:GetName())
if fc then if fc then
@@ -1549,26 +1546,6 @@ function FLIGHTGROUP:onafterHold(From, Event, To, airbase, SpeedTo, SpeedHold, S
p1:MarkToAll("Holding point P1") p1:MarkToAll("Holding point P1")
end end
-- Get active runway.
local runway=fc:GetActiveRunway()
-- Approach point: 10 NN in direction of runway.
local papp=airbase:GetCoordinate():Translate(x1, runway.heading-180):SetAltitude(h1)
wpap=papp:WaypointAirTurningPoint(nil, UTILS.KnotsToKmph(SpeedLand), {}, "Final Approach")
if self.Debug then
papp:MarkToAll(string.format("Final Approach: d=%d m, h=%d m", x1, h1))
end
-- TODO: make dependend on AC type helos etc.
-- Approach point: 10 NN in direction of runway.
pland=airbase:GetCoordinate():Translate(x2, runway.heading-180):SetAltitude(h2)
if self.Debug then
pland:MarkToAll(string.format("Landing: d=%d m, h=%d m", x2, h2))
end
-- Set flightcontrol for this flight. -- Set flightcontrol for this flight.
self:SetFlightControl(fc) self:SetFlightControl(fc)
end end
@@ -1589,16 +1566,10 @@ function FLIGHTGROUP:onafterHold(From, Event, To, airbase, SpeedTo, SpeedHold, S
local wp={} local wp={}
wp[#wp+1]=self.group:GetCoordinate():WaypointAir(nil, COORDINATE.WaypointType.TurningPoint, COORDINATE.WaypointAction.FlyoverPoint, UTILS.KnotsToKmph(SpeedTo), true , nil, {}, "Current Pos") wp[#wp+1]=self.group:GetCoordinate():WaypointAir(nil, COORDINATE.WaypointType.TurningPoint, COORDINATE.WaypointAction.FlyoverPoint, UTILS.KnotsToKmph(SpeedTo), true , nil, {}, "Current Pos")
wp[#wp+1]= p0:WaypointAir(nil, COORDINATE.WaypointType.TurningPoint, COORDINATE.WaypointAction.FlyoverPoint, UTILS.KnotsToKmph(SpeedTo), true , nil, {TaskArrived, TaskControlled}, "Holding Point") wp[#wp+1]= p0:WaypointAir(nil, COORDINATE.WaypointType.TurningPoint, COORDINATE.WaypointAction.FlyoverPoint, UTILS.KnotsToKmph(SpeedTo), true , nil, {TaskArrived, TaskControlled}, "Holding Point")
if wpap then
wp[#wp+1]=wpap
end
-- Okay, it looks like it's best to specify the coordinates not at the airbase but a bit away. This causes a more direct landing approach.
wp[#wp+1]=pland:WaypointAirLanding(UTILS.KnotsToKmph(SpeedLand), airbase, {}, "Landing")
-- Respawn? -- Respawn?
local respawn=true local respawn=false
if respawn then if respawn then