mirror of
https://github.com/FlightControl-Master/MOOSE.git
synced 2026-07-25 06:53:05 +00:00
Compare commits
8 Commits
FF/Ops
..
589e65963f
| Author | SHA1 | Date | |
|---|---|---|---|
| 589e65963f | |||
| af4f20af67 | |||
| 98ed7d50c1 | |||
| 626b12f486 | |||
| 8c60a8c678 | |||
| 867f919d5f | |||
| f769a0deb5 | |||
| 7e9dd9deff |
@@ -92,8 +92,6 @@ DATABASE = {
|
|||||||
ZONES_GOAL = {},
|
ZONES_GOAL = {},
|
||||||
WAREHOUSES = {},
|
WAREHOUSES = {},
|
||||||
FLIGHTGROUPS = {},
|
FLIGHTGROUPS = {},
|
||||||
COHORTS={},
|
|
||||||
LEGIONS={},
|
|
||||||
FLIGHTCONTROLS = {},
|
FLIGHTCONTROLS = {},
|
||||||
OPSZONES = {},
|
OPSZONES = {},
|
||||||
PATHLINES = {},
|
PATHLINES = {},
|
||||||
@@ -2089,40 +2087,6 @@ function DATABASE:FindOpsGroupFromUnit(unitname)
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
--
|
|
||||||
|
|
||||||
--- Add an OPS COHORT (SQUADRON, PLATOON, FLOTILLA) to the data base.
|
|
||||||
-- @param #DATABASE self
|
|
||||||
-- @param Ops.Cohort#COHORT cohort The cohort added to the DB.
|
|
||||||
function DATABASE:AddCohort(cohort)
|
|
||||||
self.COHORTS[cohort.name]=cohort
|
|
||||||
end
|
|
||||||
|
|
||||||
--- Find an OPS COHORT (SQUADRON, PLATOON, FLOTILLA) in the data base.
|
|
||||||
-- @param #DATABASE self
|
|
||||||
-- @param #string cohortname Name of the cohort.
|
|
||||||
-- @return Ops.Cohort#COHORT Cohort object.
|
|
||||||
function DATABASE:FindCohort(cohortname)
|
|
||||||
return self.COHORTS[cohortname]
|
|
||||||
end
|
|
||||||
|
|
||||||
--- Add an OPS LEGION (AIRWING, BRIGADE, FLEET) to the data base.
|
|
||||||
-- @param #DATABASE self
|
|
||||||
-- @param Ops.Legion#LEGION legion The legion added to the DB.
|
|
||||||
function DATABASE:AddLegion(legion)
|
|
||||||
self.LEGIONS[legion.alias]=legion
|
|
||||||
end
|
|
||||||
|
|
||||||
--- Find an OPS LEGION (AIRWING, BRIGADE, FLEET) in the data base.
|
|
||||||
-- @param #DATABASE self
|
|
||||||
-- @param #string legionname Name of the legion.
|
|
||||||
-- @return Ops.Legion#LEGION Legion object.
|
|
||||||
function DATABASE:FindLegion(legionname)
|
|
||||||
return self.LEGIONS[legionname]
|
|
||||||
end
|
|
||||||
|
|
||||||
--
|
|
||||||
|
|
||||||
--- Add a flight control to the data base.
|
--- Add a flight control to the data base.
|
||||||
-- @param #DATABASE self
|
-- @param #DATABASE self
|
||||||
-- @param OPS.FlightControl#FLIGHTCONTROL flightcontrol
|
-- @param OPS.FlightControl#FLIGHTCONTROL flightcontrol
|
||||||
|
|||||||
@@ -246,11 +246,11 @@ function SCHEDULEDISPATCHER:AddSchedule( Scheduler, ScheduleFunction, ScheduleAr
|
|||||||
-- self:T3( { Repeat = CallID, CurrentTime, ScheduleTime, ScheduleArguments } )
|
-- self:T3( { Repeat = CallID, CurrentTime, ScheduleTime, ScheduleArguments } )
|
||||||
return ScheduleTime -- returns the next time the function needs to be called.
|
return ScheduleTime -- returns the next time the function needs to be called.
|
||||||
else
|
else
|
||||||
self:_Reclaim( Scheduler, CallID )
|
self:Stop( Scheduler, CallID )
|
||||||
end
|
end
|
||||||
|
|
||||||
else
|
else
|
||||||
self:_Reclaim( Scheduler, CallID )
|
self:Stop( Scheduler, CallID )
|
||||||
end
|
end
|
||||||
else
|
else
|
||||||
self:I( "<<<>" .. Name .. ":" .. Line .. " (" .. Source .. ")" )
|
self:I( "<<<>" .. Name .. ":" .. Line .. " (" .. Source .. ")" )
|
||||||
|
|||||||
@@ -290,9 +290,6 @@ function AIRWING:New(warehousename, airwingname)
|
|||||||
-- @param Ops.FlightGroup#FLIGHTGROUP FlightGroup The FLIGHTGROUP on mission.
|
-- @param Ops.FlightGroup#FLIGHTGROUP FlightGroup The FLIGHTGROUP on mission.
|
||||||
-- @param Ops.Auftrag#AUFTRAG Mission The mission.
|
-- @param Ops.Auftrag#AUFTRAG Mission The mission.
|
||||||
|
|
||||||
-- Add legion to DB
|
|
||||||
_DATABASE:AddLegion(self)
|
|
||||||
|
|
||||||
return self
|
return self
|
||||||
end
|
end
|
||||||
|
|
||||||
@@ -544,47 +541,6 @@ function AIRWING:AddPayloadCapability(Payload, MissionTypes, Performance)
|
|||||||
return self
|
return self
|
||||||
end
|
end
|
||||||
|
|
||||||
--- Filter available payloads for a given aircraft type and mission type.
|
|
||||||
-- @param #AIRWING self
|
|
||||||
-- @param #string UnitType The type of the unit.
|
|
||||||
-- @param #string MissionType The mission type.
|
|
||||||
-- @param #table Payloads Specific payloads only to be considered.
|
|
||||||
-- @return #AIRWING.Payload Payload table or *nil*.
|
|
||||||
function AIRWING:_FilterPlayloads(UnitType, MissionType, Payloads)
|
|
||||||
|
|
||||||
local function _checkPayloads(payload)
|
|
||||||
if Payloads then
|
|
||||||
for _,Payload in pairs(Payloads) do
|
|
||||||
if Payload.uid==payload.uid then
|
|
||||||
return true
|
|
||||||
end
|
|
||||||
end
|
|
||||||
else
|
|
||||||
-- Payload was not specified.
|
|
||||||
return nil
|
|
||||||
end
|
|
||||||
return false
|
|
||||||
end
|
|
||||||
|
|
||||||
-- Pre-selection: filter out only those payloads that are valid for the airframe and mission type and are available.
|
|
||||||
local payloads={}
|
|
||||||
|
|
||||||
for _,_payload in pairs(self.payloads) do
|
|
||||||
local payload=_payload --#AIRWING.Payload
|
|
||||||
|
|
||||||
local specialpayload=_checkPayloads(payload)
|
|
||||||
local compatible=AUFTRAG.CheckMissionCapability(MissionType, payload.capabilities)
|
|
||||||
|
|
||||||
local goforit = specialpayload or (specialpayload==nil and compatible)
|
|
||||||
|
|
||||||
if payload.aircrafttype==UnitType and payload.navail>0 and goforit then
|
|
||||||
table.insert(payloads, payload)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
return payloads
|
|
||||||
end
|
|
||||||
|
|
||||||
--- Fetch a payload from the airwing resources for a given unit and mission type.
|
--- Fetch a payload from the airwing resources for a given unit and mission type.
|
||||||
-- The payload with the highest priority is preferred.
|
-- The payload with the highest priority is preferred.
|
||||||
-- @param #AIRWING self
|
-- @param #AIRWING self
|
||||||
@@ -633,7 +589,34 @@ function AIRWING:FetchPayloadFromStock(UnitType, MissionType, Payloads)
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
local payloads=self:_FilterPlayloads(UnitType, MissionType, Payloads)
|
local function _checkPayloads(payload)
|
||||||
|
if Payloads then
|
||||||
|
for _,Payload in pairs(Payloads) do
|
||||||
|
if Payload.uid==payload.uid then
|
||||||
|
return true
|
||||||
|
end
|
||||||
|
end
|
||||||
|
else
|
||||||
|
-- Payload was not specified.
|
||||||
|
return nil
|
||||||
|
end
|
||||||
|
return false
|
||||||
|
end
|
||||||
|
|
||||||
|
-- Pre-selection: filter out only those payloads that are valid for the airframe and mission type and are available.
|
||||||
|
local payloads={}
|
||||||
|
for _,_payload in pairs(self.payloads) do
|
||||||
|
local payload=_payload --#AIRWING.Payload
|
||||||
|
|
||||||
|
local specialpayload=_checkPayloads(payload)
|
||||||
|
local compatible=AUFTRAG.CheckMissionCapability(MissionType, payload.capabilities)
|
||||||
|
|
||||||
|
local goforit = specialpayload or (specialpayload==nil and compatible)
|
||||||
|
|
||||||
|
if payload.aircrafttype==UnitType and payload.navail>0 and goforit then
|
||||||
|
table.insert(payloads, payload)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
-- Debug.
|
-- Debug.
|
||||||
if self.verbose>=4 then
|
if self.verbose>=4 then
|
||||||
|
|||||||
@@ -5120,6 +5120,7 @@ end
|
|||||||
-- FSM Functions
|
-- FSM Functions
|
||||||
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
|
||||||
--- On after "Planned" event.
|
--- On after "Planned" event.
|
||||||
-- @param #AUFTRAG self
|
-- @param #AUFTRAG self
|
||||||
-- @param #string From From state.
|
-- @param #string From From state.
|
||||||
|
|||||||
@@ -150,9 +150,6 @@ function BRIGADE:New(WarehouseName, BrigadeName)
|
|||||||
-- @param Ops.ArmyGroup#ARMYGROUP ArmyGroup The ARMYGROUP on mission.
|
-- @param Ops.ArmyGroup#ARMYGROUP ArmyGroup The ARMYGROUP on mission.
|
||||||
-- @param Ops.Auftrag#AUFTRAG Mission The mission.
|
-- @param Ops.Auftrag#AUFTRAG Mission The mission.
|
||||||
|
|
||||||
-- Add legion to DB
|
|
||||||
_DATABASE:AddLegion(self)
|
|
||||||
|
|
||||||
return self
|
return self
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|||||||
@@ -135,6 +135,7 @@
|
|||||||
-- local mywing = EASYGCICAP:New("Blue CAP Operations",AIRBASE.Caucasus.Kutaisi,"blue","Blue EWR")
|
-- local mywing = EASYGCICAP:New("Blue CAP Operations",AIRBASE.Caucasus.Kutaisi,"blue","Blue EWR")
|
||||||
--
|
--
|
||||||
-- -- Add a CAP patrol point belonging to our airbase, we'll be at 30k ft doing 400 kn, initial direction 90 degrees (East), leg 20NM
|
-- -- Add a CAP patrol point belonging to our airbase, we'll be at 30k ft doing 400 kn, initial direction 90 degrees (East), leg 20NM
|
||||||
|
-- -- NOTE - Skip this function and do not create CAP Points if you want GCI behaviour only.
|
||||||
-- mywing:AddPatrolPointCAP(AIRBASE.Caucasus.Kutaisi,ZONE:FindByName("Blue Zone 1"):GetCoordinate(),30000,400,90,20)
|
-- mywing:AddPatrolPointCAP(AIRBASE.Caucasus.Kutaisi,ZONE:FindByName("Blue Zone 1"):GetCoordinate(),30000,400,90,20)
|
||||||
--
|
--
|
||||||
-- -- Add a Squadron with template "Blue Sq1 M2000c", 20 airframes, skill good, Modex starting with 102 and skin "Vendee Jeanne"
|
-- -- Add a Squadron with template "Blue Sq1 M2000c", 20 airframes, skill good, Modex starting with 102 and skin "Vendee Jeanne"
|
||||||
@@ -190,9 +191,10 @@
|
|||||||
-- * @{#EASYGCICAP.SetDefaultResurrection}: Set how many seconds the AirWing stays inoperable after the AirWing STATIC HQ ist destroyed, default 900 secs.
|
-- * @{#EASYGCICAP.SetDefaultResurrection}: Set how many seconds the AirWing stays inoperable after the AirWing STATIC HQ ist destroyed, default 900 secs.
|
||||||
-- * @{#EASYGCICAP.SetDefaultCAPSpeed}: Set how many knots the CAP flights should do (will be altitude corrected), default 300 kn.
|
-- * @{#EASYGCICAP.SetDefaultCAPSpeed}: Set how many knots the CAP flights should do (will be altitude corrected), default 300 kn.
|
||||||
-- * @{#EASYGCICAP.SetDefaultCAPAlt}: Set at which altitude (ASL) the CAP planes will fly, default 25,000 ft.
|
-- * @{#EASYGCICAP.SetDefaultCAPAlt}: Set at which altitude (ASL) the CAP planes will fly, default 25,000 ft.
|
||||||
|
-- * @{#EASYGCICAP.SetDefaultINTERCEPTAlt}: Set at which altitude (ASL) the Intercept planes will fly, default 25,000 ft.
|
||||||
-- * @{#EASYGCICAP.SetDefaultCAPDirection}: Set the initial direction from the CAP point the planes will fly in degrees, default is 90°.
|
-- * @{#EASYGCICAP.SetDefaultCAPDirection}: Set the initial direction from the CAP point the planes will fly in degrees, default is 90°.
|
||||||
-- * @{#EASYGCICAP.SetDefaultCAPLeg}: Set the length of the CAP leg, default is 15 NM.
|
-- * @{#EASYGCICAP.SetDefaultCAPLeg}: Set the length of the CAP leg, default is 15 NM.
|
||||||
-- * @{#EASYGCICAP.SetDefaultCAPGrouping}: Set how many planes will be spawned per mission (CVAP/GCI), defaults to 2.
|
-- * @{#EASYGCICAP.SetDefaultCAPGrouping}: Set how many planes will be spawned per mission (CAP/GCI), defaults to 2.
|
||||||
-- * @{#EASYGCICAP.SetDefaultMissionRange}: Set how many NM the planes can go from the home base, defaults to 100.
|
-- * @{#EASYGCICAP.SetDefaultMissionRange}: Set how many NM the planes can go from the home base, defaults to 100.
|
||||||
-- * @{#EASYGCICAP.SetDefaultNumberAlert5Standby}: Set how many planes will be spawned on cold standby (Alert5), default 2.
|
-- * @{#EASYGCICAP.SetDefaultNumberAlert5Standby}: Set how many planes will be spawned on cold standby (Alert5), default 2.
|
||||||
-- * @{#EASYGCICAP.SetDefaultEngageRange}: Set max engage range for CAP flights if they detect intruders, defaults to 50.
|
-- * @{#EASYGCICAP.SetDefaultEngageRange}: Set max engage range for CAP flights if they detect intruders, defaults to 50.
|
||||||
@@ -286,7 +288,7 @@ EASYGCICAP = {
|
|||||||
|
|
||||||
--- EASYGCICAP class version.
|
--- EASYGCICAP class version.
|
||||||
-- @field #string version
|
-- @field #string version
|
||||||
EASYGCICAP.version="0.1.36"
|
EASYGCICAP.version="0.1.38"
|
||||||
|
|
||||||
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
||||||
--
|
--
|
||||||
@@ -587,6 +589,17 @@ function EASYGCICAP:SetDefaultCAPAlt(Altitude)
|
|||||||
return self
|
return self
|
||||||
end
|
end
|
||||||
|
|
||||||
|
--- Set default INTERCEPT Altitude in feet
|
||||||
|
-- @param #EASYGCICAP self
|
||||||
|
-- @param #number Altitude (Optional) Altitude defaults to 25000
|
||||||
|
-- @return #EASYGCICAP self
|
||||||
|
function EASYGCICAP:SetDefaultINTERCEPTAlt(Altitude)
|
||||||
|
self:T(self.lid.."SetDefaultINTERCEPTAlt")
|
||||||
|
self.interceptalt = Altitude or 25000
|
||||||
|
return self
|
||||||
|
end
|
||||||
|
--
|
||||||
|
|
||||||
--- Set default CAP lieg initial direction in degrees
|
--- Set default CAP lieg initial direction in degrees
|
||||||
-- @param #EASYGCICAP self
|
-- @param #EASYGCICAP self
|
||||||
-- @param #number Direction (Optional) Direction defaults to 90 (East)
|
-- @param #number Direction (Optional) Direction defaults to 90 (East)
|
||||||
@@ -754,6 +767,15 @@ end
|
|||||||
function EASYGCICAP:_AddAirwing(Airbasename, Alias)
|
function EASYGCICAP:_AddAirwing(Airbasename, Alias)
|
||||||
self:T(self.lid.."_AddAirwing "..Airbasename)
|
self:T(self.lid.."_AddAirwing "..Airbasename)
|
||||||
|
|
||||||
|
-- Gather Some Stats
|
||||||
|
local function counttable(tbl)
|
||||||
|
local count = 0
|
||||||
|
for _,_data in pairs(tbl) do
|
||||||
|
count = count + 1
|
||||||
|
end
|
||||||
|
return count
|
||||||
|
end
|
||||||
|
|
||||||
local CapFormation = self.CapFormation
|
local CapFormation = self.CapFormation
|
||||||
local DespawnAfterLanding = self.DespawnAfterLanding
|
local DespawnAfterLanding = self.DespawnAfterLanding
|
||||||
local DespawnAfterHolding = self.DespawnAfterHolding
|
local DespawnAfterHolding = self.DespawnAfterHolding
|
||||||
@@ -772,7 +794,11 @@ function EASYGCICAP:_AddAirwing(Airbasename, Alias)
|
|||||||
CAP_Wing:SetMarker(false)
|
CAP_Wing:SetMarker(false)
|
||||||
CAP_Wing:SetAirbase(AIRBASE:FindByName(Airbasename))
|
CAP_Wing:SetAirbase(AIRBASE:FindByName(Airbasename))
|
||||||
CAP_Wing:SetRespawnAfterDestroyed()
|
CAP_Wing:SetRespawnAfterDestroyed()
|
||||||
CAP_Wing:SetNumberCAP(self.capgrouping)
|
|
||||||
|
--- #DONE avoid wings with no CAP points starting CAP anyhow; AirWing uses this to start CAP and creates points when there are none.
|
||||||
|
if counttable(self.ManagedCP) >0 then
|
||||||
|
CAP_Wing:SetNumberCAP(self.capgrouping)
|
||||||
|
end
|
||||||
CAP_Wing:SetCapCloseRaceTrack(true)
|
CAP_Wing:SetCapCloseRaceTrack(true)
|
||||||
|
|
||||||
if self.showpatrolpointmarks then
|
if self.showpatrolpointmarks then
|
||||||
@@ -1039,7 +1065,7 @@ function EASYGCICAP:_SetCAPPatrolPoints()
|
|||||||
MESSAGE:New(self.lid.."You are trying to create a CAP point for which there is no wing! "..tostring(data.AirbaseName),30,"CHECK"):ToAllIf(self.debug):ToLog()
|
MESSAGE:New(self.lid.."You are trying to create a CAP point for which there is no wing! "..tostring(data.AirbaseName),30,"CHECK"):ToAllIf(self.debug):ToLog()
|
||||||
return
|
return
|
||||||
end
|
end
|
||||||
local Wing = self.wings[data.AirbaseName][1] -- Ops.Airwing#AIRWING
|
local Wing = self.wings[data.AirbaseName][1] -- Ops.AirWing#AIRWING
|
||||||
local Coordinate = data.Coordinate
|
local Coordinate = data.Coordinate
|
||||||
local Altitude = data.Altitude
|
local Altitude = data.Altitude
|
||||||
local Speed = data.Speed
|
local Speed = data.Speed
|
||||||
@@ -1505,6 +1531,7 @@ function EASYGCICAP:_AssignIntercept(Cluster)
|
|||||||
local overhead = self.overhead
|
local overhead = self.overhead
|
||||||
local capspeed = self.capspeed + 100
|
local capspeed = self.capspeed + 100
|
||||||
local capalt = self.capalt
|
local capalt = self.capalt
|
||||||
|
local interalt = self.interceptalt or self.capalt
|
||||||
local maxsize = self.maxinterceptsize
|
local maxsize = self.maxinterceptsize
|
||||||
local repeatsonfailure = self.repeatsonfailure
|
local repeatsonfailure = self.repeatsonfailure
|
||||||
|
|
||||||
@@ -1592,6 +1619,7 @@ function EASYGCICAP:_AssignIntercept(Cluster)
|
|||||||
:SetRepeatOnFailure(repeats)
|
:SetRepeatOnFailure(repeats)
|
||||||
:SetMissionSpeed(UTILS.KnotsToAltKIAS(capspeed,capalt))
|
:SetMissionSpeed(UTILS.KnotsToAltKIAS(capspeed,capalt))
|
||||||
:SetMissionAltitude(capalt)
|
:SetMissionAltitude(capalt)
|
||||||
|
:SetEngageAltitude(interalt)
|
||||||
|
|
||||||
if nogozoneset:Count() > 0 then
|
if nogozoneset:Count() > 0 then
|
||||||
InterceptAuftrag:AddConditionSuccess(
|
InterceptAuftrag:AddConditionSuccess(
|
||||||
|
|||||||
@@ -167,9 +167,6 @@ function FLEET:New(WarehouseName, FleetName)
|
|||||||
-- @param Ops.NavyGroup#NAVYGROUP NavyGroup The NAVYGROUP on mission.
|
-- @param Ops.NavyGroup#NAVYGROUP NavyGroup The NAVYGROUP on mission.
|
||||||
-- @param Ops.Auftrag#AUFTRAG Mission The mission.
|
-- @param Ops.Auftrag#AUFTRAG Mission The mission.
|
||||||
|
|
||||||
-- Add legion to DB
|
|
||||||
_DATABASE:AddLegion(self)
|
|
||||||
|
|
||||||
return self
|
return self
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|||||||
@@ -73,9 +73,6 @@ function FLOTILLA:New(TemplateGroupName, Ngroups, FlotillaName)
|
|||||||
-- Get initial ammo.
|
-- Get initial ammo.
|
||||||
self.ammo=self:_CheckAmmo()
|
self.ammo=self:_CheckAmmo()
|
||||||
|
|
||||||
-- Add cohort to DB
|
|
||||||
_DATABASE:AddCohort(self)
|
|
||||||
|
|
||||||
return self
|
return self
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|||||||
@@ -306,6 +306,7 @@ function LEGION:New(WarehouseName, LegionName)
|
|||||||
-- @param Ops.Cohort#COHORT Cohort The cohort the asset belongs to.
|
-- @param Ops.Cohort#COHORT Cohort The cohort the asset belongs to.
|
||||||
-- @param Functional.Warehouse#WAREHOUSE.Assetitem Asset The asset that returned.
|
-- @param Functional.Warehouse#WAREHOUSE.Assetitem Asset The asset that returned.
|
||||||
|
|
||||||
|
|
||||||
return self
|
return self
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|||||||
@@ -72,9 +72,6 @@ function PLATOON:New(TemplateGroupName, Ngroups, PlatoonName)
|
|||||||
-- Get ammo.
|
-- Get ammo.
|
||||||
self.ammo=self:_CheckAmmo()
|
self.ammo=self:_CheckAmmo()
|
||||||
|
|
||||||
-- Add cohort to DB
|
|
||||||
_DATABASE:AddCohort(self)
|
|
||||||
|
|
||||||
return self
|
return self
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|||||||
@@ -116,9 +116,6 @@ function SQUADRON:New(TemplateGroupName, Ngroups, SquadronName)
|
|||||||
|
|
||||||
-- See COHORT class
|
-- See COHORT class
|
||||||
|
|
||||||
-- Add cohort to DB
|
|
||||||
_DATABASE:AddCohort(self)
|
|
||||||
|
|
||||||
return self
|
return self
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|||||||
@@ -153,7 +153,7 @@ _TARGETID=0
|
|||||||
|
|
||||||
--- TARGET class version.
|
--- TARGET class version.
|
||||||
-- @field #string version
|
-- @field #string version
|
||||||
TARGET.version="0.8.0"
|
TARGET.version="0.7.1"
|
||||||
|
|
||||||
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
||||||
-- TODO list
|
-- TODO list
|
||||||
@@ -206,9 +206,6 @@ function TARGET:New(TargetObject)
|
|||||||
self:AddTransition("*", "Status", "*") -- Status update.
|
self:AddTransition("*", "Status", "*") -- Status update.
|
||||||
self:AddTransition("*", "Stop", "Stopped") -- Stop FSM.
|
self:AddTransition("*", "Stop", "Stopped") -- Stop FSM.
|
||||||
|
|
||||||
self:AddTransition("*", "ElementDestroyed", "*") -- A target element was destroyed.
|
|
||||||
self:AddTransition("*", "ElementDead", "*") -- A target element is dead (destroyed or despawned).
|
|
||||||
|
|
||||||
self:AddTransition("*", "ObjectDamaged", "*") -- A target object was damaged.
|
self:AddTransition("*", "ObjectDamaged", "*") -- A target object was damaged.
|
||||||
self:AddTransition("*", "ObjectDestroyed", "*") -- A target object was destroyed.
|
self:AddTransition("*", "ObjectDestroyed", "*") -- A target object was destroyed.
|
||||||
self:AddTransition("*", "ObjectDead", "*") -- A target object is dead (destroyed or despawned).
|
self:AddTransition("*", "ObjectDead", "*") -- A target object is dead (destroyed or despawned).
|
||||||
@@ -248,19 +245,6 @@ function TARGET:New(TargetObject)
|
|||||||
-- @param #number delay Delay in seconds.
|
-- @param #number delay Delay in seconds.
|
||||||
|
|
||||||
|
|
||||||
--- Triggers the FSM event "ElementDestroyed".
|
|
||||||
-- @function [parent=#TARGET] ElementDestroyed
|
|
||||||
-- @param #TARGET self
|
|
||||||
-- @param #string ElementName Name of the element.
|
|
||||||
-- @param #TARGET.Object Target Target object.
|
|
||||||
|
|
||||||
--- Triggers the FSM event "ElementDead".
|
|
||||||
-- @function [parent=#TARGET] ElementDead
|
|
||||||
-- @param #TARGET self
|
|
||||||
-- @param #string ElementName Name of the element.
|
|
||||||
-- @param #TARGET.Object Target Target object.
|
|
||||||
|
|
||||||
|
|
||||||
--- Triggers the FSM event "ObjectDamaged".
|
--- Triggers the FSM event "ObjectDamaged".
|
||||||
-- @function [parent=#TARGET] ObjectDamaged
|
-- @function [parent=#TARGET] ObjectDamaged
|
||||||
-- @param #TARGET self
|
-- @param #TARGET self
|
||||||
@@ -659,19 +643,6 @@ function TARGET:onafterStatus(From, Event, To)
|
|||||||
-- FSM state.
|
-- FSM state.
|
||||||
local fsmstate=self:GetState()
|
local fsmstate=self:GetState()
|
||||||
|
|
||||||
-- First we check any target has been destroyed and the dead/unitlost event was not fired
|
|
||||||
for i,_target in pairs(self.targets) do
|
|
||||||
local target=_target --#TARGET.Object
|
|
||||||
local life=self:GetTargetLife(target)
|
|
||||||
if life<1 and target.Status~=TARGET.ObjectStatus.DEAD then
|
|
||||||
self:E(self.lid..string.format("FF life is zero but no object dead event fired ==> waiting for target object %s events!", tostring(target.Name)))
|
|
||||||
-- We wait 60 seconds for the events to occur
|
|
||||||
self:__Status(-60)
|
|
||||||
return self
|
|
||||||
end
|
|
||||||
|
|
||||||
end
|
|
||||||
|
|
||||||
-- Update damage.
|
-- Update damage.
|
||||||
local damaged=false
|
local damaged=false
|
||||||
for i,_target in pairs(self.targets) do
|
for i,_target in pairs(self.targets) do
|
||||||
@@ -765,61 +736,6 @@ end
|
|||||||
-- FSM Events
|
-- FSM Events
|
||||||
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
||||||
|
|
||||||
--- On after "ElementDestroyed" event.
|
|
||||||
-- @param #TARGET self
|
|
||||||
-- @param #string From From state.
|
|
||||||
-- @param #string Event Event.
|
|
||||||
-- @param #string To To state.
|
|
||||||
-- @param #string Name Name of the element.
|
|
||||||
-- @param #TARGET.Object Target Target object.
|
|
||||||
function TARGET:onafterElementDestroyed(From, Event, To, Name, Target)
|
|
||||||
-- Debug message.
|
|
||||||
self:T(self.lid..string.format("Element %s of target object %s destroyed", Name, Target.Name))
|
|
||||||
|
|
||||||
-- Increase destroyed counter.
|
|
||||||
Target.Ndestroyed=Target.Ndestroyed+1
|
|
||||||
|
|
||||||
-- Increase dead counter.
|
|
||||||
self.Ndestroyed=self.Ndestroyed+1
|
|
||||||
|
|
||||||
self:ElementDead(Name, Target)
|
|
||||||
|
|
||||||
return self
|
|
||||||
end
|
|
||||||
|
|
||||||
|
|
||||||
--- On after "ElementDead" event.
|
|
||||||
-- @param #TARGET self
|
|
||||||
-- @param #string From From state.
|
|
||||||
-- @param #string Event Event.
|
|
||||||
-- @param #string To To state.
|
|
||||||
-- @param #string Name Name of the element.
|
|
||||||
-- @param #TARGET.Object Target Target object.
|
|
||||||
function TARGET:onafterElementDead(From, Event, To, Name, Target)
|
|
||||||
-- Debug message.
|
|
||||||
self:T(self.lid..string.format("Element %s of target object %s dead", Name, Target.Name))
|
|
||||||
|
|
||||||
-- Increase dead counter.
|
|
||||||
Target.Ndead=Target.Ndead+1
|
|
||||||
|
|
||||||
-- Increase dead counter.
|
|
||||||
self.Ndead=self.Ndead+1
|
|
||||||
|
|
||||||
-- All dead ==> Trigger event.
|
|
||||||
if Target.Ndestroyed==Target.N0 then
|
|
||||||
|
|
||||||
self:ObjectDestroyed(Target)
|
|
||||||
|
|
||||||
elseif Target.Ndead==Target.N0 then
|
|
||||||
|
|
||||||
self:ObjectDead(Target)
|
|
||||||
|
|
||||||
end
|
|
||||||
|
|
||||||
return self
|
|
||||||
end
|
|
||||||
|
|
||||||
|
|
||||||
--- On after "ObjectDamaged" event.
|
--- On after "ObjectDamaged" event.
|
||||||
-- @param #TARGET self
|
-- @param #TARGET self
|
||||||
-- @param #string From From state.
|
-- @param #string From From state.
|
||||||
@@ -845,6 +761,11 @@ function TARGET:onafterObjectDestroyed(From, Event, To, Target)
|
|||||||
-- Debug message.
|
-- Debug message.
|
||||||
self:T(self.lid..string.format("Object %s destroyed", Target.Name))
|
self:T(self.lid..string.format("Object %s destroyed", Target.Name))
|
||||||
|
|
||||||
|
-- Increase destroyed counter.
|
||||||
|
self.Ndestroyed=self.Ndestroyed+1
|
||||||
|
|
||||||
|
Target.Ndestroyed=Target.Ndestroyed+1
|
||||||
|
|
||||||
Target.Life=0
|
Target.Life=0
|
||||||
|
|
||||||
-- Call object dead event.
|
-- Call object dead event.
|
||||||
@@ -867,9 +788,15 @@ function TARGET:onafterObjectDead(From, Event, To, Target)
|
|||||||
-- Set target status.
|
-- Set target status.
|
||||||
Target.Status=TARGET.ObjectStatus.DEAD
|
Target.Status=TARGET.ObjectStatus.DEAD
|
||||||
|
|
||||||
|
-- Increase dead object counter
|
||||||
|
Target.Ndead=Target.Ndead+1
|
||||||
|
|
||||||
-- Set target object life to 0.
|
-- Set target object life to 0.
|
||||||
Target.Life=0
|
Target.Life=0
|
||||||
|
|
||||||
|
-- Increase dead counter.
|
||||||
|
self.Ndead=self.Ndead+1
|
||||||
|
|
||||||
-- Check if anyone is alive?
|
-- Check if anyone is alive?
|
||||||
local dead=true
|
local dead=true
|
||||||
for _,_target in pairs(self.targets) do
|
for _,_target in pairs(self.targets) do
|
||||||
@@ -962,21 +889,54 @@ function TARGET:OnEventUnitDeadOrLost(EventData)
|
|||||||
-- Add to the list of casualties.
|
-- Add to the list of casualties.
|
||||||
table.insert(self.casualties, Name)
|
table.insert(self.casualties, Name)
|
||||||
|
|
||||||
-- Get target from Group or Unit.
|
-- Try to get target Group.
|
||||||
local target=self:GetTargetByName(EventData.IniGroupName) or self:GetTargetByName(EventData.IniUnitName)
|
local target=self:GetTargetByName(EventData.IniGroupName)
|
||||||
|
|
||||||
|
-- Try unit target.
|
||||||
|
if not target then
|
||||||
|
target=self:GetTargetByName(EventData.IniUnitName)
|
||||||
|
end
|
||||||
|
|
||||||
-- Check if we could find a target object.
|
-- Check if we could find a target object.
|
||||||
if target then
|
if target then
|
||||||
|
|
||||||
-- Increase dead/destroyed counter
|
local Ndead=target.Ndead
|
||||||
|
local Ndestroyed=target.Ndestroyed
|
||||||
if EventData.id==EVENTS.RemoveUnit then
|
if EventData.id==EVENTS.RemoveUnit then
|
||||||
self:ElementDead(Name, target)
|
Ndead=Ndead+1
|
||||||
else
|
else
|
||||||
self:ElementDestroyed(Name, target)
|
Ndestroyed=Ndestroyed+1
|
||||||
|
Ndead=Ndead+1
|
||||||
|
end
|
||||||
|
|
||||||
|
|
||||||
|
-- Check if ALL objects are dead
|
||||||
|
if Ndead==target.N0 then
|
||||||
|
|
||||||
|
if Ndestroyed>=target.N0 then
|
||||||
|
|
||||||
|
-- Debug message.
|
||||||
|
self:T2(self.lid..string.format("EVENT ID=%d: target %s dead/lost ==> destroyed", EventData.id, tostring(target.Name)))
|
||||||
|
|
||||||
|
target.Life = 0
|
||||||
|
|
||||||
|
-- Trigger object destroyed event. This sets the Life to zero and increases Ndestroyed
|
||||||
|
self:ObjectDestroyed(target)
|
||||||
|
|
||||||
|
else
|
||||||
|
|
||||||
|
-- Debug message.
|
||||||
|
self:T2(self.lid..string.format("EVENT ID=%d: target %s removed ==> dead", EventData.id, tostring(target.Name)))
|
||||||
|
|
||||||
|
target.Life = 0
|
||||||
|
|
||||||
|
-- Trigger object dead event. This sets the Life to zero and increases Ndead counter
|
||||||
|
self:ObjectDead(target)
|
||||||
|
|
||||||
|
end
|
||||||
|
|
||||||
end
|
end
|
||||||
|
|
||||||
else
|
|
||||||
self:E(self.lid..string.format("ERROR: Could not get target from IniGroup or IniUnit name when event Dead or UnitLost occured! Stats are not correctly updated :("))
|
|
||||||
end -- Event belongs to this TARGET
|
end -- Event belongs to this TARGET
|
||||||
|
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -2108,7 +2108,7 @@ function MSRS:_HoundTextToSpeech(Message,Frequencies,Modulations,Volume,Label,Co
|
|||||||
|
|
||||||
local ffs = {}
|
local ffs = {}
|
||||||
for _,_f in pairs(Frequencies) do
|
for _,_f in pairs(Frequencies) do
|
||||||
table.insert(ffs,string.format("%.1f",_f))
|
table.insert(ffs,string.format("%.3f",_f))
|
||||||
end
|
end
|
||||||
|
|
||||||
local freqs = table.concat(ffs, ",")
|
local freqs = table.concat(ffs, ",")
|
||||||
@@ -2214,7 +2214,7 @@ function MSRS:_HoundTestTone(Frequencies, Modulations, Coalition)
|
|||||||
|
|
||||||
local ffs = {}
|
local ffs = {}
|
||||||
for _,_f in pairs(Frequencies or self.frequencies) do
|
for _,_f in pairs(Frequencies or self.frequencies) do
|
||||||
table.insert(ffs,string.format("%.1f",_f))
|
table.insert(ffs,string.format("%.3f",_f))
|
||||||
end
|
end
|
||||||
|
|
||||||
local freqs = table.concat(ffs, ",")
|
local freqs = table.concat(ffs, ",")
|
||||||
@@ -2291,7 +2291,7 @@ function MSRS:RadioJammerOn(Frequencies, Modulations, Coalition, Noisetype, Volu
|
|||||||
|
|
||||||
local ffs = {}
|
local ffs = {}
|
||||||
for _,_f in pairs(Frequencies or self.frequencies) do
|
for _,_f in pairs(Frequencies or self.frequencies) do
|
||||||
table.insert(ffs,string.format("%.1f",_f))
|
table.insert(ffs,string.format("%.3f",_f))
|
||||||
end
|
end
|
||||||
|
|
||||||
local freqs = table.concat(ffs, ",")
|
local freqs = table.concat(ffs, ",")
|
||||||
|
|||||||
@@ -523,7 +523,7 @@ ENUMS.ReportingName =
|
|||||||
Tornado = "Tornado",
|
Tornado = "Tornado",
|
||||||
-- Transport / Bomber / Others
|
-- Transport / Bomber / Others
|
||||||
Atlas = "A400",
|
Atlas = "A400",
|
||||||
Lancer = "B1-B",
|
Lancer = "B-1B",
|
||||||
Stratofortress = "B-52H",
|
Stratofortress = "B-52H",
|
||||||
Herc = "C-130",
|
Herc = "C-130",
|
||||||
Hercules = "C-130J-30",
|
Hercules = "C-130J-30",
|
||||||
@@ -568,7 +568,7 @@ ENUMS.ReportingName =
|
|||||||
Apache = "AH-64",
|
Apache = "AH-64",
|
||||||
Chinook = "CH-47",
|
Chinook = "CH-47",
|
||||||
Sea_Stallion = "CH-53",
|
Sea_Stallion = "CH-53",
|
||||||
Kiowa = "OH-58",
|
Kiowa = "OH58D",
|
||||||
Seahawk = "SH-60",
|
Seahawk = "SH-60",
|
||||||
Blackhawk = "UH-60",
|
Blackhawk = "UH-60",
|
||||||
Sea_King = "S-61",
|
Sea_King = "S-61",
|
||||||
|
|||||||
@@ -2379,6 +2379,11 @@ function UTILS.IsLoadingDoorOpen( unit_name )
|
|||||||
return true
|
return true
|
||||||
end
|
end
|
||||||
|
|
||||||
|
if type_name == "Ka-50_3" and unit:getDrawArgumentValue(38) == 1 then
|
||||||
|
BASE:T(unit_name .. " cockpit door is open")
|
||||||
|
return true
|
||||||
|
end
|
||||||
|
|
||||||
if type_name=="C-130J-30" and (unit:getDrawArgumentValue(86)==1)then
|
if type_name=="C-130J-30" and (unit:getDrawArgumentValue(86)==1)then
|
||||||
BASE:T(unit_name.." rear doors are open")
|
BASE:T(unit_name.." rear doors are open")
|
||||||
return true
|
return true
|
||||||
|
|||||||
Reference in New Issue
Block a user