mirror of
https://github.com/FlightControl-Master/MOOSE.git
synced 2026-08-19 22:17:13 +00:00
Update CarrierAirWing.lua
This commit is contained in:
@@ -3,7 +3,7 @@
|
|||||||
-- **Main Features:**
|
-- **Main Features:**
|
||||||
--
|
--
|
||||||
-- * Nice stuff.
|
-- * Nice stuff.
|
||||||
--
|
--
|
||||||
-- ===
|
-- ===
|
||||||
--
|
--
|
||||||
-- ### Author: **funkyfranky**
|
-- ### Author: **funkyfranky**
|
||||||
@@ -29,9 +29,9 @@
|
|||||||
-- 
|
-- 
|
||||||
--
|
--
|
||||||
-- # The CVW Concept
|
-- # The CVW Concept
|
||||||
--
|
--
|
||||||
--
|
--
|
||||||
--
|
--
|
||||||
-- @field #CVW
|
-- @field #CVW
|
||||||
CVW = {
|
CVW = {
|
||||||
ClassName = "CVW",
|
ClassName = "CVW",
|
||||||
@@ -76,7 +76,7 @@ CVW.version="0.0.2"
|
|||||||
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
||||||
-- TODO list
|
-- TODO list
|
||||||
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
||||||
|
|
||||||
-- TODO: A lot!
|
-- TODO: A lot!
|
||||||
|
|
||||||
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
||||||
@@ -92,19 +92,19 @@ function CVW:New(carriername, alias)
|
|||||||
|
|
||||||
-- Inherit everything from WAREHOUSE class.
|
-- Inherit everything from WAREHOUSE class.
|
||||||
local self=BASE:Inherit(self, WAREHOUSE:New(carriername, alias)) -- #CVW
|
local self=BASE:Inherit(self, WAREHOUSE:New(carriername, alias)) -- #CVW
|
||||||
|
|
||||||
if not self.carrier then
|
if not self.carrier then
|
||||||
BASE:E(string.format("ERROR: Could not find carrier %s!", carriername))
|
BASE:E(string.format("ERROR: Could not find carrier %s!", carriername))
|
||||||
return nil
|
return nil
|
||||||
end
|
end
|
||||||
|
|
||||||
self.carriername=carriername
|
self.carriername=carriername
|
||||||
|
|
||||||
self.group=self.carrier:GetGroup()
|
self.group=self.carrier:GetGroup()
|
||||||
|
|
||||||
self.squadrons={}
|
self.squadrons={}
|
||||||
|
|
||||||
|
|
||||||
-- Set some string id for output to DCS.log file.
|
-- Set some string id for output to DCS.log file.
|
||||||
self.sid=string.format("CVW %s |", self.carriername)
|
self.sid=string.format("CVW %s |", self.carriername)
|
||||||
|
|
||||||
@@ -115,7 +115,7 @@ function CVW:New(carriername, alias)
|
|||||||
self:AddTransition("*", "RequestIntercept", "*") -- Request Intercept.
|
self:AddTransition("*", "RequestIntercept", "*") -- Request Intercept.
|
||||||
self:AddTransition("*", "RequestCAS", "*") -- Request Intercept.
|
self:AddTransition("*", "RequestCAS", "*") -- Request Intercept.
|
||||||
self:AddTransition("*", "RequestSEAD", "*") -- Request Intercept.
|
self:AddTransition("*", "RequestSEAD", "*") -- Request Intercept.
|
||||||
|
|
||||||
------------------------
|
------------------------
|
||||||
--- Pseudo Functions ---
|
--- Pseudo Functions ---
|
||||||
------------------------
|
------------------------
|
||||||
@@ -144,7 +144,7 @@ function CVW:New(carriername, alias)
|
|||||||
--- Triggers the FSM event "SkipperStatus" after a delay.
|
--- Triggers the FSM event "SkipperStatus" after a delay.
|
||||||
-- @function [parent=#CVW] __AirwingStatus
|
-- @function [parent=#CVW] __AirwingStatus
|
||||||
-- @param #CVW self
|
-- @param #CVW self
|
||||||
-- @param #number delay Delay in seconds.
|
-- @param #number delay Delay in seconds.
|
||||||
|
|
||||||
|
|
||||||
-- Debug trace.
|
-- Debug trace.
|
||||||
@@ -154,8 +154,8 @@ function CVW:New(carriername, alias)
|
|||||||
BASE:TraceClass(self.ClassName)
|
BASE:TraceClass(self.ClassName)
|
||||||
BASE:TraceLevel(1)
|
BASE:TraceLevel(1)
|
||||||
end
|
end
|
||||||
|
|
||||||
return self
|
return self
|
||||||
end
|
end
|
||||||
|
|
||||||
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
||||||
@@ -179,28 +179,30 @@ end
|
|||||||
--- Add squadron
|
--- Add squadron
|
||||||
-- @param #CVW self
|
-- @param #CVW self
|
||||||
-- @param #string name Name of the squadron, e.g. VFA-37.
|
-- @param #string name Name of the squadron, e.g. VFA-37.
|
||||||
|
-- @param #table Table of tasks.
|
||||||
-- @return #CVW self
|
-- @return #CVW self
|
||||||
function CVW:AddSquadron(name)
|
function CVW:AddSquadron(name, tasks)
|
||||||
|
|
||||||
local squadron={} --#CVW.Squadron
|
local squadron={} --#CVW.Squadron
|
||||||
|
|
||||||
squadron.name=name
|
squadron.name=name
|
||||||
squadron.assets={}
|
squadron.assets={}
|
||||||
|
squadron.tasks=tasks or {}
|
||||||
|
|
||||||
table.insert(self.squadrons, squadron)
|
table.insert(self.squadrons, squadron)
|
||||||
end
|
end
|
||||||
|
|
||||||
--- Add flight group to squadron.
|
--- Add flight group to squadron.
|
||||||
-- @param #CVW self
|
-- @param #CVW self
|
||||||
-- @param #CVW.Squadron squadron Air wing squadron
|
-- @param #CVW.Squadron squadron The squadron object.
|
||||||
-- @param Wrapper.Group#GROUP flightgroup Flight group.
|
-- @param Wrapper.Group#GROUP flightgroup The flight group object.
|
||||||
-- @param #number ngroups Number of groups to be added.
|
-- @param #number ngroups Number of groups to add.
|
||||||
-- @param #string livery Livery for group.
|
-- @param #string livery The livery for all added flight group.
|
||||||
-- @return #CVW self
|
-- @return #CVW self
|
||||||
function CVW:AddFlightToSquadron(squadron, flightgroup, ngroups, livery)
|
function CVW:AddFlightToSquadron(squadron, flightgroup, ngroups, livery)
|
||||||
|
|
||||||
self:AddAsset(flightgroup, ngroups, nil, nil, nil, nil, nil, {livery}, squadron.name)
|
self:AddAsset(flightgroup, ngroups, nil, nil, nil, nil, nil, {livery}, squadron.name)
|
||||||
|
|
||||||
function self:OnAfterNewAsset(From,Event,To,asset,assignment)
|
function self:OnAfterNewAsset(From,Event,To,asset,assignment)
|
||||||
if assignment==squadron.name then
|
if assignment==squadron.name then
|
||||||
table.insert(squadron.assets, asset)
|
table.insert(squadron.assets, asset)
|
||||||
@@ -237,14 +239,14 @@ function CVW:onafterStart(From, Event, To)
|
|||||||
|
|
||||||
-- Info.
|
-- Info.
|
||||||
self:I(self.sid..string.format("Starting CVW v%s for carrier %s on map %s.", CVW.version, self.carriername, self.theatre))
|
self:I(self.sid..string.format("Starting CVW v%s for carrier %s on map %s.", CVW.version, self.carriername, self.theatre))
|
||||||
|
|
||||||
-- Add F10 radio menu.
|
-- Add F10 radio menu.
|
||||||
self:_SetMenuCoalition()
|
self:_SetMenuCoalition()
|
||||||
|
|
||||||
for _,_squadron in pairs(self.squadrons) do
|
for _,_squadron in pairs(self.squadrons) do
|
||||||
local squadron=_squadron --#CVW.Squadron
|
local squadron=_squadron --#CVW.Squadron
|
||||||
self:_AddSquadonMenu(squadron)
|
self:_AddSquadonMenu(squadron)
|
||||||
|
|
||||||
end
|
end
|
||||||
|
|
||||||
-- Init status updates.
|
-- Init status updates.
|
||||||
@@ -281,19 +283,19 @@ end
|
|||||||
function CVW:onafterRequestCAP(From, Event, To, squadron, coordinate)
|
function CVW:onafterRequestCAP(From, Event, To, squadron, coordinate)
|
||||||
|
|
||||||
local n=self:GetNumberOfAssets(WAREHOUSE.Descriptor.ASSIGNMENT, "CAP", false)
|
local n=self:GetNumberOfAssets(WAREHOUSE.Descriptor.ASSIGNMENT, "CAP", false)
|
||||||
|
|
||||||
if n>0 then
|
if n>0 then
|
||||||
|
|
||||||
self:__AddRequest(1, self, WAREHOUSE.Descriptor.ASSIGNMENT, squadron.name, 1, nil, nil, nil, CVW.Task.INTERCEPT)
|
self:__AddRequest(1, self, WAREHOUSE.Descriptor.ASSIGNMENT, squadron.name, 1, nil, nil, nil, CVW.Task.INTERCEPT)
|
||||||
|
|
||||||
function self:OnAfterSelfRequest(From,Event,To,Groupset,Request)
|
function self:OnAfterSelfRequest(From,Event,To,Groupset,Request)
|
||||||
|
|
||||||
if Request.assignment==CVW.Task.INTERCEPT then
|
if Request.assignment==CVW.Task.INTERCEPT then
|
||||||
local request=Request --Functional.Warehouse#WAREHOUSE.Pendingitem
|
local request=Request --Functional.Warehouse#WAREHOUSE.Pendingitem
|
||||||
local groupset=Groupset --Core.Set#SET_GROUP
|
local groupset=Groupset --Core.Set#SET_GROUP
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
end
|
end
|
||||||
|
|
||||||
end
|
end
|
||||||
@@ -306,21 +308,21 @@ end
|
|||||||
-- @param #number leg Length of race track pattern leg.
|
-- @param #number leg Length of race track pattern leg.
|
||||||
-- @param #number speed Speed in knots.
|
-- @param #number speed Speed in knots.
|
||||||
function CVW:LaunchCAP(group, capcoord, alt, leg, heading, speed)
|
function CVW:LaunchCAP(group, capcoord, alt, leg, heading, speed)
|
||||||
|
|
||||||
local alt=UTILS.FeetToMeters(20000)
|
local alt=UTILS.FeetToMeters(20000)
|
||||||
|
|
||||||
-- Task orbit.
|
-- Task orbit.
|
||||||
local taskOrbit=group:TaskOrbit(capcoord, alt, UTILS.KnotsToMps(400), capcoord:Translate(UTILS.NMToMeters(15), 0))
|
local taskOrbit=group:TaskOrbit(capcoord, alt, UTILS.KnotsToMps(400), capcoord:Translate(UTILS.NMToMeters(15), 0))
|
||||||
|
|
||||||
local wp={}
|
local wp={}
|
||||||
wp[1]=self:GetCoordinate():WaypointAirTakeOffParking()
|
wp[1]=self:GetCoordinate():WaypointAirTakeOffParking()
|
||||||
wp[2]=self:GetCoordinate():SetAltitude(alt):WaypointAirTurningPoint(COORDINATE.WaypointAltType.BARO, UTILS.KnotsToKmph(350), {taskOrbit}, "CAP")
|
wp[2]=self:GetCoordinate():SetAltitude(alt):WaypointAirTurningPoint(COORDINATE.WaypointAltType.BARO, UTILS.KnotsToKmph(350), {taskOrbit}, "CAP")
|
||||||
|
|
||||||
-- Start uncontrolled group.
|
-- Start uncontrolled group.
|
||||||
group:StartUncontrolled()
|
group:StartUncontrolled()
|
||||||
|
|
||||||
--airboss:SetExcludeAI()
|
--airboss:SetExcludeAI()
|
||||||
|
|
||||||
-- Route group.
|
-- Route group.
|
||||||
group:Route(wp)
|
group:Route(wp)
|
||||||
end
|
end
|
||||||
@@ -342,16 +344,16 @@ function CVW:_SetMenuCoalition()
|
|||||||
|
|
||||||
-- Get coalition.
|
-- Get coalition.
|
||||||
local Coalition=self:GetCoalition()
|
local Coalition=self:GetCoalition()
|
||||||
|
|
||||||
-- Init menu table.
|
-- Init menu table.
|
||||||
self.menu=self.menu or {}
|
self.menu=self.menu or {}
|
||||||
|
|
||||||
-- Init menu coalition table.
|
-- Init menu coalition table.
|
||||||
self.menu[Coalition]=self.menu[Coalition] or {}
|
self.menu[Coalition]=self.menu[Coalition] or {}
|
||||||
|
|
||||||
-- Shortcut.
|
-- Shortcut.
|
||||||
local menu=self.menu[Coalition]
|
local menu=self.menu[Coalition]
|
||||||
|
|
||||||
if self.menusingle then
|
if self.menusingle then
|
||||||
-- F10/Skipper/...
|
-- F10/Skipper/...
|
||||||
if not menu.Skipper then
|
if not menu.Skipper then
|
||||||
@@ -363,19 +365,19 @@ function CVW:_SetMenuCoalition()
|
|||||||
menu.Root=MENU_COALITION:New(Coalition, "CVW")
|
menu.Root=MENU_COALITION:New(Coalition, "CVW")
|
||||||
end
|
end
|
||||||
menu.Skipper=MENU_COALITION:New(Coalition, self.alias, menu.Root)
|
menu.Skipper=MENU_COALITION:New(Coalition, self.alias, menu.Root)
|
||||||
end
|
end
|
||||||
|
|
||||||
-------------------
|
-------------------
|
||||||
-- Squadron Menu --
|
-- Squadron Menu --
|
||||||
-------------------
|
-------------------
|
||||||
|
|
||||||
menu.Squadron={}
|
menu.Squadron={}
|
||||||
menu.Squadron.Main= MENU_COALITION:New(Coalition, "Squadrons", menu.Skipper)
|
menu.Squadron.Main= MENU_COALITION:New(Coalition, "Squadrons", menu.Skipper)
|
||||||
|
|
||||||
menu.Warehouse=MENU_COALITION:New(Coalition, "Warehouse", menu.Skipper)
|
menu.Warehouse=MENU_COALITION:New(Coalition, "Warehouse", menu.Skipper)
|
||||||
menu.Warehouse_Reports = MENU_COALITION_COMMAND:New(Coalition, "Reports On/Off", menu.Warehouse, self.WarehouseReportsToggle, self)
|
menu.Warehouse_Reports = MENU_COALITION_COMMAND:New(Coalition, "Reports On/Off", menu.Warehouse, self.WarehouseReportsToggle, self)
|
||||||
menu.Warehouse_Assets = MENU_COALITION_COMMAND:New(Coalition, "Report Assets", menu.Warehouse, self.ReportWarehouseStock, self)
|
menu.Warehouse_Assets = MENU_COALITION_COMMAND:New(Coalition, "Report Assets", menu.Warehouse, self.ReportWarehouseStock, self)
|
||||||
|
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
||||||
@@ -387,12 +389,12 @@ function CVW:_AddSquadonMenu(squadron)
|
|||||||
local Coalition=self:GetCoalition()
|
local Coalition=self:GetCoalition()
|
||||||
|
|
||||||
local root=self.menu[Coalition].Squadrons.Main
|
local root=self.menu[Coalition].Squadrons.Main
|
||||||
|
|
||||||
local menu=MENU_COALITION:New(Coalition, squadron.name, root)
|
local menu=MENU_COALITION:New(Coalition, squadron.name, root)
|
||||||
|
|
||||||
MENU_COALITION_COMMAND:New(Coalition, "Report", menu, self._Report, self, squadron)
|
MENU_COALITION_COMMAND:New(Coalition, "Report", menu, self._Report, self, squadron)
|
||||||
MENU_COALITION_COMMAND:New(Coalition, "Launch CAP", menu, self._LaunchCAP, self, squadron)
|
MENU_COALITION_COMMAND:New(Coalition, "Launch CAP", menu, self._LaunchCAP, self, squadron)
|
||||||
|
|
||||||
-- Set menu.
|
-- Set menu.
|
||||||
squadron.menu=menu
|
squadron.menu=menu
|
||||||
|
|
||||||
@@ -402,7 +404,7 @@ end
|
|||||||
--- Warehouse reports on/off.
|
--- Warehouse reports on/off.
|
||||||
-- @param #CVW self
|
-- @param #CVW self
|
||||||
function CVW:WarehouseReportsToggle()
|
function CVW:WarehouseReportsToggle()
|
||||||
self.warehouse.Report=not self.warehouse.Report
|
self.warehouse.Report=not self.warehouse.Report
|
||||||
MESSAGE:New(string.format("Warehouse reports are now %s", tostring(self.warehouse.Report)), 10, "CVW", true):ToCoalition(self:GetCoalition())
|
MESSAGE:New(string.format("Warehouse reports are now %s", tostring(self.warehouse.Report)), 10, "CVW", true):ToCoalition(self:GetCoalition())
|
||||||
end
|
end
|
||||||
|
|
||||||
@@ -421,52 +423,52 @@ function CVW:LaunchIntercept(intruder)
|
|||||||
|
|
||||||
-- Get number of aircraft.
|
-- Get number of aircraft.
|
||||||
local n=self:GetNumberOfAssets(WAREHOUSE.Descriptor.ASSIGNMENT, "Intercept", false)
|
local n=self:GetNumberOfAssets(WAREHOUSE.Descriptor.ASSIGNMENT, "Intercept", false)
|
||||||
|
|
||||||
if n>0 then
|
if n>0 then
|
||||||
|
|
||||||
self.warehouse:AddRequest(self.warehouse, WAREHOUSE.Descriptor.ASSIGNMENT, "Intercept", 1, nil, nil, nil, "Intercept")
|
self.warehouse:AddRequest(self.warehouse, WAREHOUSE.Descriptor.ASSIGNMENT, "Intercept", 1, nil, nil, nil, "Intercept")
|
||||||
|
|
||||||
local capcoord=intruder.group:GetCoordinate()
|
local capcoord=intruder.group:GetCoordinate()
|
||||||
|
|
||||||
capcoord:MarkToAll("Intruder coord")
|
capcoord:MarkToAll("Intruder coord")
|
||||||
|
|
||||||
function self.warehouse.OnAfterSelfRequest(warehouse, From, Event, To, Groupset, Request)
|
function self.warehouse.OnAfterSelfRequest(warehouse, From, Event, To, Groupset, Request)
|
||||||
local request=Request --Functional.Warehouse#WAREHOUSE.Pendingitem
|
local request=Request --Functional.Warehouse#WAREHOUSE.Pendingitem
|
||||||
local groupset=Groupset --Core.Set#SET_GROUP
|
local groupset=Groupset --Core.Set#SET_GROUP
|
||||||
|
|
||||||
for _,_group in pairs(groupset:GetSet()) do
|
for _,_group in pairs(groupset:GetSet()) do
|
||||||
local group=_group --Wrapper.Group#GROUP
|
local group=_group --Wrapper.Group#GROUP
|
||||||
|
|
||||||
if request.assignment=="Intercept" then
|
if request.assignment=="Intercept" then
|
||||||
|
|
||||||
-- Task orbit.
|
-- Task orbit.
|
||||||
local tasks={}
|
local tasks={}
|
||||||
|
|
||||||
for _,unit in pairs(intruder.group:GetUnits()) do
|
for _,unit in pairs(intruder.group:GetUnits()) do
|
||||||
tasks[#tasks+1]=group:TaskAttackUnit(unit)
|
tasks[#tasks+1]=group:TaskAttackUnit(unit)
|
||||||
end
|
end
|
||||||
|
|
||||||
local speed=group:GetSpeedMax()
|
local speed=group:GetSpeedMax()
|
||||||
local altitude=intruder.group:GetAltitude()
|
local altitude=intruder.group:GetAltitude()
|
||||||
|
|
||||||
-- Create waypoints.
|
-- Create waypoints.
|
||||||
local wp={}
|
local wp={}
|
||||||
wp[1]=self:GetCoordinate():WaypointAirTakeOffParking()
|
wp[1]=self:GetCoordinate():WaypointAirTakeOffParking()
|
||||||
wp[2]=self:GetCoordinate():SetAltitude(altitude):WaypointAirTurningPoint(COORDINATE.WaypointAltType.BARO, speed, {tasks}, "Attack Intruder")
|
wp[2]=self:GetCoordinate():SetAltitude(altitude):WaypointAirTurningPoint(COORDINATE.WaypointAltType.BARO, speed, {tasks}, "Attack Intruder")
|
||||||
|
|
||||||
-- Start uncontrolled group.
|
-- Start uncontrolled group.
|
||||||
group:StartUncontrolled()
|
group:StartUncontrolled()
|
||||||
|
|
||||||
--airboss:SetExcludeAI()
|
--airboss:SetExcludeAI()
|
||||||
|
|
||||||
-- Route group
|
-- Route group
|
||||||
group:Route(wp)
|
group:Route(wp)
|
||||||
end
|
end
|
||||||
|
|
||||||
end
|
end
|
||||||
|
|
||||||
end
|
end
|
||||||
|
|
||||||
else
|
else
|
||||||
MESSAGE:New("No INTERCEPT fighters currently available", 5, "CVW"):ToCoalition(self:GetCoalition())
|
MESSAGE:New("No INTERCEPT fighters currently available", 5, "CVW"):ToCoalition(self:GetCoalition())
|
||||||
end
|
end
|
||||||
@@ -485,7 +487,7 @@ function CVW:_SortIntruders()
|
|||||||
local b=_b --#CVW.Intruder
|
local b=_b --#CVW.Intruder
|
||||||
return a.threadlevel>b.threadlevel
|
return a.threadlevel>b.threadlevel
|
||||||
end
|
end
|
||||||
|
|
||||||
table.sort(self.intruders, _sort)
|
table.sort(self.intruders, _sort)
|
||||||
end
|
end
|
||||||
|
|
||||||
@@ -496,7 +498,7 @@ end
|
|||||||
function CVW:_UpdateIntruderMenu()
|
function CVW:_UpdateIntruderMenu()
|
||||||
|
|
||||||
for _,_intruder in ipairs(self.intruders) do
|
for _,_intruder in ipairs(self.intruders) do
|
||||||
local intruder=_intruder --#CVW.Intruder
|
local intruder=_intruder --#CVW.Intruder
|
||||||
self:_AddIntruderMenu(intruder)
|
self:_AddIntruderMenu(intruder)
|
||||||
end
|
end
|
||||||
|
|
||||||
@@ -509,9 +511,9 @@ function CVW:_RemoveIntruderMenu(intruder)
|
|||||||
|
|
||||||
if intruder.menu then
|
if intruder.menu then
|
||||||
local menu=intruder.menu --Core.Menu#MENU_COALITION
|
local menu=intruder.menu --Core.Menu#MENU_COALITION
|
||||||
|
|
||||||
menu:Remove()
|
menu:Remove()
|
||||||
|
|
||||||
intruder.menu=nil
|
intruder.menu=nil
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user