This commit is contained in:
Frank
2019-12-10 19:35:10 +01:00
parent 2583c5c175
commit 99827bce47
5 changed files with 126 additions and 14 deletions
+4 -4
View File
@@ -133,7 +133,7 @@ function RAT2:_CheckQueueSpawn()
if flight:IsInUtero() or flight:IsArrived() or flight:IsDead() then
self:I(string.format("Spawning new flight group %s in status %s", flight.groupname, flight:GetState()))
self:I(string.format("Try Spawning new flight group %s in status %s", flight.groupname, flight:GetState()))
-- Get departure and parking.
local departure, parking=ratcraft:GetDeparture()
@@ -141,9 +141,9 @@ function RAT2:_CheckQueueSpawn()
-- Get destination depending on departure.
local destination=ratcraft:GetDestination(departure)
if departure and destination then
if departure and destination and parking then
parking=departure.parking or parking
self:I(string.format("Spawning new flight group %s in status %s", flight.groupname, flight:GetState()))
-- Try to spawn a ratcraft group.
local group=self:_SpawnRatcraft(ratcraft, flight, departure, destination, parking)
@@ -836,7 +836,7 @@ function RAT2:_GetFlightplan(ratcraft, departure, destination)
-- Mark points at waypoints for debugging.
if self.Debug then
if self.Debug or true then
for i,coord in pairs(c) do
local coord=coord --Core.Point#COORDINATE
local dist=0
+2 -2
View File
@@ -1341,9 +1341,9 @@ function RANGE:AddBombingTargetUnit(unit, goodhitrange, randommove)
-- Debug or error output.
if _isstatic==true then
self:T(self.id..string.format("Adding STATIC bombing target %s with good hit range %d. Random move = %s.", name, goodhitrange, tostring(randommove)))
self:I(self.id..string.format("Adding STATIC bombing target %s with good hit range %d. Random move = %s.", name, goodhitrange, tostring(randommove)))
elseif _isstatic==false then
self:T(self.id..string.format("Adding UNIT bombing target %s with good hit range %d. Random move = %s.", name, goodhitrange, tostring(randommove)))
self:I(self.id..string.format("Adding UNIT bombing target %s with good hit range %d. Random move = %s.", name, goodhitrange, tostring(randommove)))
else
self:E(self.id..string.format("ERROR! No bombing target with name %s could be found. Carefully check all UNIT and STATIC names defined in the mission editor!", name))
end
@@ -50,6 +50,7 @@
-- @field #string landing Landing type.
-- @field #table flights Table of flight groups.
-- @field #number Nspawn Number of max spawned aircraft groups.
-- @field #number Nunits Number of units in group.
-- @extends Core.Fsm#FSM
RATCRAFT = {
ClassName = "RATCRAFT",
@@ -83,6 +84,7 @@ RATCRAFT = {
landing = nil,
flights = {},
Nspawn = 2,
Nunits = nil,
}
--- Generalized asset attributes. Can be used to request assets with certain general characteristics. See [DCS attributes](https://wiki.hoggitworld.com/view/DCS_enum_attributes) on hoggit.
@@ -191,6 +193,9 @@ function RATCRAFT:_Init(groupname)
self.country=self.templategroup:GetUnit(1):GetCountry()
self.category=self.templategroup:GetUnit(1):GetCategory()
self.Nunits=#self.templategroup:GetUnits()
-- aircraft dimensions
self.sizex=self.DCSdesc.box.max.x
@@ -225,6 +230,7 @@ function RATCRAFT:AddDepartureAirbase(airbasename, parking)
for _,TerminalID in pairs(parking) do
local spot=airbase:GetParkingSpotData(TerminalID)
if spot then
self:I(string.format("Add in parking spot %d", spot.TerminalID))
table.insert(spots, spot)
end
end
@@ -232,7 +238,7 @@ function RATCRAFT:AddDepartureAirbase(airbasename, parking)
departure.name=airbasename
departure.type=RATCRAFT.DeType.AIRBASE
departure.parking=parking
departure.parking=spots
table.insert(self.departures, departure)
return self
@@ -353,10 +359,12 @@ function RATCRAFT:GetDeparture()
local group=self.templategroup --Wrapper.Group#GROUP
-- Get number of free parking spots.
local parking=airbase:FindFreeParkingSpotForAircraft(group)
--local parking=airbase:FindFreeParkingSpotForAircraft(group)
local parking=self:GetParkingDeparture(departure)
-- Check if parking is sufficient.
if #parking>=#group:GetUnits() then
if parking and #parking>=self.Nunits then
self:I(string.format("Returning departure %s", departure.name))
return departure, parking
@@ -386,6 +394,84 @@ function RATCRAFT:GetDeparture()
end
--- Get parking at departure.
-- @param #RATCRAFT self
-- @param #RATCRAFT.Departure departure The chosen departure.
-- @return #table Parking data table or nil if not enough spots.
function RATCRAFT:GetParkingDeparture(departure)
if departure.type==RATCRAFT.DeType.AIRBASE then
local airbase=AIRBASE:FindByName(departure.name)
if airbase then
local parkingdata=airbase:GetParkingSpotsTable()
if departure.parking then
---
-- User specified parking spots
---
-- Check if free?
local parking={}
for _,_spot in pairs(parkingdata) do
local spot=_spot --Wrapper.Airbase#AIRBASE.ParkingSpot
self:I(string.format("Checking spot %d", spot.TerminalID))
-- Check if spot if free?
if spot.Free then
self:I(string.format("Spot %d is FREE", spot.TerminalID))
-- Check if spot is in user table?
for _,_park in pairs(departure.parking) do
local park=_park --Wrapper.Airbase#AIRBASE.ParkingSpot
if park.TerminalID==spot.TerminalID then
self:I(string.format("Adding spot %d to parking", spot.TerminalID))
table.insert(parking, spot)
end
end
end
end
-- Only return data if sufficient spots available.
if #parking>=self.Nunits then
self:I(string.format("Found valid parking for %d spots", #parking))
return parking
end
else
---
-- Choose parking from what is free
---
local parking={}
for _,_spot in pairs(parkingdata) do
local spot=_spot --Wrapper.Airbase#AIRBASE.ParkingSpot
if spot.Free then
table.insert(parking, spot)
end
if #parking>=self.Nunits then
return parking
end
end
end
end
end
self:I(string.format("Could not find valid parking data"))
return nil
end
--- Get destination.
-- @param #RATCRAFT self
-- @param #RATCRAFT.Departure departure The chosen departure.
+8 -3
View File
@@ -2297,6 +2297,10 @@ end
-- @return #FLIGHTGROUP self
function FLIGHTGROUP:_UpdateRoute(n)
if true then
--return
end
-- TODO: what happens if currentwp=#waypoints
n=n or self.currentwp+1
@@ -2314,7 +2318,8 @@ function FLIGHTGROUP:_UpdateRoute(n)
else
if self:IsTaxiing() or self:IsParking() or self:IsSpawned() then
local coord=self.group:GetCoordinate()
local current=coord:WaypointAirTakeOffParking(nil, 50)
--local current=coord:WaypointAirTakeOffParking(nil, 50)
local current=coord:WaypointAir( AltType, COORDINATE.WaypointType.TakeOffParkingHot, COORDINATE.WaypointAction.FromParkingAreaHot, 50, true, coord:GetClosestAirbase(), {}, "Takeoff")
table.insert(wp, current)
end
end
@@ -2374,7 +2379,7 @@ function FLIGHTGROUP:_UpdateRoute(n)
if airbase then
-- Route flight to destination/home.
self:RTB(airbase)
--self:RTB(airbase)
else
-- Let flight orbit.
--self:Orbit(self.group:GetCoordinate(), UTILS.FeetToMeters(20000), self.group:GetSpeedMax()*0.4)
@@ -2410,7 +2415,7 @@ function FLIGHTGROUP:_UpdateWaypointTasks()
if #tasks>0 then
for _,task in pairs(tasks) do
local Task=task --#FLIGHTGROUP.Task
local Task=task --#FLIGHTGROUP.Task
-- Add task execute.
table.insert(taskswp, self.group:TaskFunction("FLIGHTGROUP._TaskExecute", self, Task))
+23 -2
View File
@@ -654,6 +654,7 @@ end
-- @param #AIRBASE self
-- @param #AIRBASE.TerminalType termtype Terminal type for which marks should be placed.
-- @param #boolean mark If false, do not place markers but only give output to DCS.log file. Default true.
-- @return #table Table with marker IDs.
function AIRBASE:MarkParkingSpots(termtype, mark)
-- Default is true.
@@ -668,6 +669,8 @@ function AIRBASE:MarkParkingSpots(termtype, mark)
local airbasename=self:GetName()
self:E(string.format("Parking spots at %s for termial type %s:", airbasename, tostring(termtype)))
self.parkingmarks=self.parkingmarks or {}
for _,_spot in pairs(parkingdata) do
-- Mark text.
@@ -676,16 +679,34 @@ function AIRBASE:MarkParkingSpots(termtype, mark)
-- Create mark on the F10 map.
if mark then
_spot.Coordinate:MarkToAll(_text)
local mid=_spot.Coordinate:MarkToAll(_text)
if self.parkingmarks[_spot.TerminalID] then
_spot.Coordinate:RemoveMark(self.parkingmarks[_spot.TerminalID])
end
self.parkingmarks[_spot.TerminalID]=mid
end
-- Info to DCS.log file.
local _text=string.format("%s, Term Index=%3d, Term Type=%03d, Free=%5s, TOAC=%5s, Term ID0=%3d, Dist2Rwy=%.1f m",
airbasename, _spot.TerminalID, _spot.TerminalType,tostring(_spot.Free),tostring(_spot.TOAC),_spot.TerminalID0,_spot.DistToRwy)
self:E(_text)
self:I(_text)
end
return markers
end
--- Place markers of parking spots on the F10 map and update regularly.
-- @param #AIRBASE self
-- @param #AIRBASE.TerminalType termtype Terminal type for which marks should be placed.
-- @param #boolean mark If false, do not place markers but only give output to DCS.log file. Default true.
function AIRBASE:MonitorParkingSpots(termtype, mark)
local sched,shedid=SCHEDULER:New(self, self.MarkParkingSpots, {self,termtype,mark}, 5, 5)
end
--- Seach unoccupied parking spots at the airbase for a specific group of aircraft. The routine also optionally checks for other unit, static and scenery options in a certain radius around the parking spot.
-- The dimension of the spawned aircraft and of the potential obstacle are taken into account. Note that the routine can only return so many spots that are free.
-- @param #AIRBASE self