mirror of
https://github.com/FlightControl-Master/MOOSE.git
synced 2025-10-29 16:58:06 +00:00
Improvements of departure selection (unfinished).
This commit is contained in:
parent
8bcb47a8ee
commit
f4e8f15090
@ -35,26 +35,38 @@ RAT={
|
|||||||
airports_destination={}, -- Possible destination airports if unit does not fly "overseas", destpoint=overseas or destpoint=airport.
|
airports_destination={}, -- Possible destination airports if unit does not fly "overseas", destpoint=overseas or destpoint=airport.
|
||||||
departure_name="random", -- Name of the departure airport. Default is "random" for a randomly chosen one of the coalition airports.
|
departure_name="random", -- Name of the departure airport. Default is "random" for a randomly chosen one of the coalition airports.
|
||||||
destination_name="random",-- Name of the destination airport. Default is "random" for a randomly chosen one of the coalition airports.
|
destination_name="random",-- Name of the destination airport. Default is "random" for a randomly chosen one of the coalition airports.
|
||||||
|
random_departure=true, -- By default a random friendly airport is chosen as departure.
|
||||||
|
random_destination=true, -- By default a random friendly airport is chosen as destination.
|
||||||
|
departure_zones={}, -- Array containing the names of the departure zones.
|
||||||
|
departure_ports={}, -- Array containing the names of the destination zones.
|
||||||
zones_departure={}, -- Departure zones for air start.
|
zones_departure={}, -- Departure zones for air start.
|
||||||
Rzone=5000, -- Radius of departure zones in meters.
|
Rzone=5000, -- Radius of departure zones in meters.
|
||||||
ratcraft={}, -- Array with the spawned RAT aircraft.
|
ratcraft={}, -- Array with the spawned RAT aircraft.
|
||||||
markerid=0,
|
markerid=0,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
--- RAT categories.
|
||||||
|
-- @field #RAT cat
|
||||||
|
RAT.cat={
|
||||||
|
plane="plane",
|
||||||
|
heli="heli"
|
||||||
|
}
|
||||||
|
|
||||||
--TODO list:
|
--TODO list:
|
||||||
--TODO: Add scheduled spawn and corresponding user functions.
|
--DONE: Add scheduled spawn.
|
||||||
--TODO: Add possibility to spawn in air.
|
--DONE: Add possibility to spawn in air.
|
||||||
--TODO: Add departure zones for air start.
|
--DONE: Add departure zones for air start.
|
||||||
--TODO: Make more functions to adjust/set parameters.
|
--TODO: Make more functions to adjust/set RAT parameters.
|
||||||
--TODO: Clean up debug messages.
|
--TODO: Clean up debug messages.
|
||||||
--DONE: Improve flight plan. Especially check FL against route length.
|
--DONE: Improve flight plan. Especially check FL against route length.
|
||||||
--DONE: Add event handlers.
|
--DONE: Add event handlers.
|
||||||
--DONE: Respawn units when they have landed.
|
--DONE: Respawn units when they have landed.
|
||||||
--DONE: Change ROE state.
|
--DONE: Change ROE state.
|
||||||
--TODO: Make ROE state user function
|
--TODO: Make ROE state user function
|
||||||
--TODO: Add status reports.
|
--TODO: Improve status reports.
|
||||||
--TODO: Check compatibility with #SPAWN functions.
|
--TODO: Check compatibility with other #SPAWN functions.
|
||||||
--TODO: Add possibility to continue journey at destination. Need "place" in event data for that.
|
--TODO: Add possibility to continue journey at destination. Need "place" in event data for that.
|
||||||
|
--TODO: Add enumerators and get rid off error prone string comparisons.
|
||||||
--DONE: Check that FARPS are not used as airbases for planes. Don't know if they appear in list of airports.
|
--DONE: Check that FARPS are not used as airbases for planes. Don't know if they appear in list of airports.
|
||||||
--DONE: Add cases for helicopters.
|
--DONE: Add cases for helicopters.
|
||||||
|
|
||||||
@ -157,14 +169,14 @@ function RAT:_InitAircraft(DCSgroup)
|
|||||||
self.aircraft.Vmax = DCSdesc.speedMax
|
self.aircraft.Vmax = DCSdesc.speedMax
|
||||||
|
|
||||||
-- min cruise airspeed = 75% of max
|
-- min cruise airspeed = 75% of max
|
||||||
self.aircraft.Vmin = self.aircraft.Vmax*0.75
|
self.aircraft.Vmin = self.aircraft.Vmax*0.60
|
||||||
|
|
||||||
-- actual travel speed (random between ASmin and ASmax)
|
-- actual travel speed (random between ASmin and ASmax)
|
||||||
--TODO: This needs to be placed somewhere else! Randomization should not happen here. Otherwise it is not changed for multiple spawns.
|
--TODO: This needs to be placed somewhere else! Randomization should not happen here. Otherwise it is not changed for multiple spawns.
|
||||||
self.aircraft.Vcruise = math.random(self.aircraft.Vmin, self.aircraft.Vmax)
|
self.aircraft.Vcruise = math.random(self.aircraft.Vmin, self.aircraft.Vmax)
|
||||||
|
|
||||||
-- Limit travel speed to ~900 km/h for jets.
|
-- Limit travel speed to ~900 km/h for jets.
|
||||||
self.aircraft.Vcruise = math.min(self.aircraft.Vcruise, self.Vcruisemax)
|
self.aircraft.Vcruise = math.min(self.aircraft.Vcruise, self.aircraft.Vmax)
|
||||||
|
|
||||||
-- max climb speed in m/s
|
-- max climb speed in m/s
|
||||||
self.aircraft.Vymax=DCSdesc.VyMax
|
self.aircraft.Vymax=DCSdesc.VyMax
|
||||||
@ -289,7 +301,8 @@ function RAT:_SpawnWithRoute()
|
|||||||
self:HandleEvent(EVENTS.Land, self._OnLand)
|
self:HandleEvent(EVENTS.Land, self._OnLand)
|
||||||
self:HandleEvent(EVENTS.EngineShutdown, self._OnEngineShutdown)
|
self:HandleEvent(EVENTS.EngineShutdown, self._OnEngineShutdown)
|
||||||
self:HandleEvent(EVENTS.Dead, self._OnDead)
|
self:HandleEvent(EVENTS.Dead, self._OnDead)
|
||||||
self:HandleEvent(EVENTS.Crash, self._OnCrash)
|
-- TODO: Crash needs to be handled better. Does it always occur when dead?
|
||||||
|
--self:HandleEvent(EVENTS.Crash, self._OnCrash)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
||||||
@ -488,6 +501,59 @@ function RAT:SetDepartureZones(zonenames)
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
--- Test if an airport exists on the current map.
|
||||||
|
-- @param #RAT self
|
||||||
|
-- @param #string name
|
||||||
|
-- @return #boolean True if airport exsits, false otherwise.
|
||||||
|
function RAT:_AirportExists(name)
|
||||||
|
for _,airport in pairs(self.airports_map) do
|
||||||
|
if airport:GeName()==name then
|
||||||
|
return true
|
||||||
|
end
|
||||||
|
end
|
||||||
|
return false
|
||||||
|
end
|
||||||
|
|
||||||
|
|
||||||
|
--- Set possible departure ports. This can be an airport or a zone defined in the mission editor.
|
||||||
|
-- @param #RAT self
|
||||||
|
function RAT:SetDepartureAll(names)
|
||||||
|
|
||||||
|
-- Random departure is deactivated now that user specified departure ports.
|
||||||
|
self.random_departure=false
|
||||||
|
|
||||||
|
if type(names)=="table" then
|
||||||
|
|
||||||
|
-- we did get a table of names
|
||||||
|
for _,name in pairs(names) do
|
||||||
|
|
||||||
|
if self:_AirportExists(name) then
|
||||||
|
-- If an airport with this name exists, we put it in the ports array.
|
||||||
|
table.insert(self.departure_ports,"name")
|
||||||
|
else
|
||||||
|
-- If it is not an airport, we assume it is a zone.
|
||||||
|
table.insert(self.departure_zones,"name")
|
||||||
|
end
|
||||||
|
|
||||||
|
end
|
||||||
|
|
||||||
|
elseif type(names)=="string" then
|
||||||
|
|
||||||
|
if self:_AirportExists("names") then
|
||||||
|
-- If an airport with this name exists, we put it in the ports array.
|
||||||
|
table.insert(self.departure_ports, "names")
|
||||||
|
else
|
||||||
|
-- If it is not an airport, we assume it is a zone.
|
||||||
|
table.insert(self.departure_zones, "names")
|
||||||
|
end
|
||||||
|
|
||||||
|
else
|
||||||
|
-- error message
|
||||||
|
error("Input parameter must be a string or a table!")
|
||||||
|
end
|
||||||
|
|
||||||
|
end
|
||||||
|
|
||||||
--- Set name of destination airport for the AI aircraft. If no name is given an airport from the coalition is chosen randomly.
|
--- Set name of destination airport for the AI aircraft. If no name is given an airport from the coalition is chosen randomly.
|
||||||
-- @param #RAT self
|
-- @param #RAT self
|
||||||
-- @param #string name Name of the destination airport or "random" for a randomly chosen one of the coalition.
|
-- @param #string name Name of the destination airport or "random" for a randomly chosen one of the coalition.
|
||||||
@ -500,34 +566,91 @@ function RAT:SetDestination(name)
|
|||||||
end
|
end
|
||||||
|
|
||||||
|
|
||||||
--- Set the departure airport of the AI. If no airport name is given an airport from the coalition is chosen randomly.
|
--- Set the departure airport of the AI. If no airport name is given explicitly an airport from the coalition is chosen randomly.
|
||||||
|
-- If takeoff style is set to "air", we use zones around the airports or the zones specified by user input.
|
||||||
-- @param #RAT self
|
-- @param #RAT self
|
||||||
-- @return Wrapper.Airbase#AIRBASE Departure airport if spawning at airport.
|
-- @return Wrapper.Airbase#AIRBASE Departure airport if spawning at airport.
|
||||||
function RAT:_SetDeparture()
|
function RAT:_SetDeparture()
|
||||||
|
|
||||||
local departure
|
local departure
|
||||||
local text
|
|
||||||
|
-- Array containing possible departure airports or zones.
|
||||||
|
local departures={}
|
||||||
|
|
||||||
if self.takeoff=="air" then
|
if self.takeoff=="air" then
|
||||||
|
|
||||||
|
if self.random_departure then
|
||||||
|
|
||||||
|
-- Air start above a random airport.
|
||||||
|
for _,airport in pairs(self.airports)do
|
||||||
|
table.insert(departures, airport:GetZone())
|
||||||
|
end
|
||||||
|
|
||||||
|
else
|
||||||
|
|
||||||
|
-- Put all specified zones in table.
|
||||||
|
for _,name in pairs(self.departure_zones) do
|
||||||
|
table.insert(departures, ZONE:New(name))
|
||||||
|
end
|
||||||
|
-- Put all specified airport zones in table.
|
||||||
|
for _,name in pairs(self.departure_zones) do
|
||||||
|
table.insert(departures, AIRBASE:FindByName("name"):GetZone())
|
||||||
|
end
|
||||||
|
|
||||||
|
end
|
||||||
|
--[[
|
||||||
if self.departure_name=="random" then
|
if self.departure_name=="random" then
|
||||||
departure=self.zones_departure[math.random(1, #self.zones_departure)]
|
departure=self.zones_departure[math.random(#self.zones_departure)]
|
||||||
else
|
else
|
||||||
departure=ZONE:FindByName(self.departure_name)
|
departure=ZONE:FindByName(self.departure_name)
|
||||||
end
|
end
|
||||||
|
|
||||||
text="Chosen departure zone: "..departure:GetName()
|
text="Chosen departure zone: "..departure:GetName()
|
||||||
|
]]
|
||||||
else
|
else
|
||||||
|
|
||||||
|
if self.random_departure then
|
||||||
|
|
||||||
|
-- All friendly departure airports.
|
||||||
|
departures=self.airports
|
||||||
|
|
||||||
|
else
|
||||||
|
|
||||||
|
for _,name in pairs(self.departure_ports) do
|
||||||
|
table.insert(departures, AIRBASE:FindByName(name))
|
||||||
|
end
|
||||||
|
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
--[[
|
||||||
if self.departure_name=="random" then
|
if self.departure_name=="random" then
|
||||||
-- Get a random departure airport from all friendly coalition airports.
|
-- Get a random departure airport from all friendly coalition airports.
|
||||||
departure=self.airports[math.random(1, #self.airports)]
|
departure=self.airports[math.random(#self.airports)]
|
||||||
elseif AIRBASE:FindByName(self.departure_name) then
|
elseif AIRBASE:FindByName(self.departure_name) then
|
||||||
-- Take the explicit airport provided.
|
-- Take the explicit airport provided.
|
||||||
departure=AIRBASE:FindByName(self.departure_name)
|
departure=AIRBASE:FindByName(self.departure_name)
|
||||||
else
|
else
|
||||||
-- If nothing else works, we randomly choose from frindly coalition airports.
|
-- If nothing else works, we randomly choose from friendly coalition airports.
|
||||||
departure=self.airports[math.random(1, #self.airports)]
|
departure=self.airports[math.random(#self.airports)]
|
||||||
end
|
end
|
||||||
|
|
||||||
text="Chosen departure airport: "..departure:GetName().." with ID "..departure:GetID()
|
text="Chosen departure airport: "..departure:GetName().." with ID "..departure:GetID()
|
||||||
end
|
end
|
||||||
|
]]
|
||||||
|
|
||||||
|
-- Select departure airport or zone.
|
||||||
|
local departure=departures[math.random(#departures)]
|
||||||
|
|
||||||
|
local text
|
||||||
|
if self.takeoff=="air" then
|
||||||
|
text="Chosen departure zone: "..departure:GetName()
|
||||||
|
else
|
||||||
|
text="Chosen departure airport: "..departure:GetName().." (ID "..departure:GetID()..")"
|
||||||
|
end
|
||||||
env.info(myid..text)
|
env.info(myid..text)
|
||||||
MESSAGE:New(text, 60):ToAll()
|
MESSAGE:New(text, 60):ToAll()
|
||||||
|
|
||||||
return departure
|
return departure
|
||||||
end
|
end
|
||||||
|
|
||||||
@ -562,11 +685,14 @@ end
|
|||||||
-- @param #number minrange Minimum range to q in meters.
|
-- @param #number minrange Minimum range to q in meters.
|
||||||
-- @param #number maxrange Maximum range to q in meters.
|
-- @param #number maxrange Maximum range to q in meters.
|
||||||
function RAT:_GetDestinations(q, minrange, maxrange)
|
function RAT:_GetDestinations(q, minrange, maxrange)
|
||||||
|
|
||||||
local absolutemin=5000 -- Absolute minimum is 5 km.
|
local absolutemin=5000 -- Absolute minimum is 5 km.
|
||||||
minrange=minrange or absolutemin -- Default min is absolute min.
|
minrange=minrange or absolutemin -- Default min is absolute min.
|
||||||
maxrange=maxrange or 10000000 -- Default max 10,000 km.
|
maxrange=maxrange or 10000000 -- Default max 10,000 km.
|
||||||
|
|
||||||
-- Ensure that minrange is always > 10 km to ensure the destination != departure.
|
-- Ensure that minrange is always > 10 km to ensure the destination != departure.
|
||||||
minrange=math.max(absolutemin, minrange)
|
minrange=math.max(absolutemin, minrange)
|
||||||
|
|
||||||
-- loop over all friendly airports
|
-- loop over all friendly airports
|
||||||
for _,airport in pairs(self.airports) do
|
for _,airport in pairs(self.airports) do
|
||||||
local p=airport:GetCoordinate()
|
local p=airport:GetCoordinate()
|
||||||
@ -577,6 +703,7 @@ function RAT:_GetDestinations(q, minrange, maxrange)
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
env.info(myid.."Number of possible destination airports = "..#self.airports_destination)
|
env.info(myid.."Number of possible destination airports = "..#self.airports_destination)
|
||||||
|
|
||||||
if #self.airports_destination > 1 then
|
if #self.airports_destination > 1 then
|
||||||
--- Compare distance of destination airports.
|
--- Compare distance of destination airports.
|
||||||
-- @param Core.Point#COORDINATE a Coordinate of point a.
|
-- @param Core.Point#COORDINATE a Coordinate of point a.
|
||||||
@ -589,6 +716,7 @@ function RAT:_GetDestinations(q, minrange, maxrange)
|
|||||||
end
|
end
|
||||||
table.sort(self.airports_destination, compare)
|
table.sort(self.airports_destination, compare)
|
||||||
end
|
end
|
||||||
|
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
||||||
@ -1310,4 +1438,28 @@ function RAT:_SetMarker(text, vec3)
|
|||||||
self.markerid=self.markerid+1
|
self.markerid=self.markerid+1
|
||||||
env.info(myid.."Placing marker with ID "..self.markerid.." and text "..text)
|
env.info(myid.."Placing marker with ID "..self.markerid.." and text "..text)
|
||||||
trigger.action.markToAll(self.markerid, text, vec3)
|
trigger.action.markToAll(self.markerid, text, vec3)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
--[[
|
||||||
|
--- @type RATPORT
|
||||||
|
-- @extends Wrapper.Positionable#POSITIONABLE
|
||||||
|
|
||||||
|
--- #RATPORT class, extends @{Positionable#POSITIONABLE}
|
||||||
|
-- @field #RATPORT RATPORT
|
||||||
|
RATPORT={
|
||||||
|
ClassName="RATPORT",
|
||||||
|
}
|
||||||
|
|
||||||
|
--- Creates a new RATPORT object.
|
||||||
|
-- @param #RATPORT self
|
||||||
|
-- @param #string name Name of airport or zone.
|
||||||
|
-- @return #RATPORT self
|
||||||
|
function RATPORT:New(name)
|
||||||
|
local self = BASE:Inherit(self, POSITIONABLE:New(name)) -- #RATPORT
|
||||||
|
return self
|
||||||
|
end
|
||||||
|
|
||||||
|
--function RATCRAFT:New(name)
|
||||||
|
-- local self = BASE:Inherit(self, GROUP:New(name))
|
||||||
|
--end
|
||||||
|
]]
|
||||||
Loading…
x
Reference in New Issue
Block a user