Merge remote-tracking branch 'refs/remotes/origin/master' into Bugfix

This commit is contained in:
FlightControl 2016-06-15 18:57:36 +02:00
commit 2a619c33ec
93 changed files with 2909 additions and 930 deletions

View File

@ -17,4 +17,10 @@
-- @param #Vec2 point point on the ground.
-- @return DCSTypes#Distance
--- returns surface type at the given point.
-- @function [parent=#land] getSurfaceType
-- @param #Vec2 point Point on the land.
-- @return #land.SurfaceType
land = {} --#land

View File

@ -0,0 +1,925 @@
--- This module contains the AIRBASEPOLICE classes.
--
-- ===
--
-- 1) @{AirbasePolice#AIRBASEPOLICE_BASE} class, extends @{Base#BASE}
-- ==================================================================
-- The @{AirbasePolice#AIRBASEPOLICE_BASE} class provides the main methods to monitor CLIENT behaviour at airbases.
-- CLIENTS should not be allowed to:
--
-- * Don't taxi faster than 40 km/h.
-- * Don't take-off on taxiways.
-- * Avoid to hit other planes on the airbase.
-- * Obey ground control orders.
--
-- 2) @{AirbasePolice#AIRBASEPOLICE_CAUCASUS} class, extends @{AirbasePolice#AIRBASEPOLICE_BASE}
-- =============================================================================================
-- All the airbases on the caucasus map can be monitored using this class.
-- If you want to monitor specific airbases, you need to use the @{#AIRBASEPOLICE_BASE.Monitor}() method, which takes a table or airbase names.
-- The following names can be given:
-- * AnapaVityazevo
-- * Batumi
-- * Beslan
-- * Gelendzhik
-- * Gudauta
-- * Kobuleti
-- * KrasnodarCenter
-- * KrasnodarPashkovsky
-- * Krymsk
-- * Kutaisi
-- * MaykopKhanskaya
-- * MineralnyeVody
-- * Mozdok
-- * Nalchik
-- * Novorossiysk
-- * SenakiKolkhi
-- * SochiAdler
-- * Soganlug
-- * SukhumiBabushara
-- * TbilisiLochini
-- * Vaziani
--
-- @module AirbasePolice
-- @author FlightControl
--- @type AIRBASEPOLICE_BASE
-- @field Set#SET_CLIENT SetClient
-- @extends Base#BASE
AIRBASEPOLICE_BASE = {
ClassName = "AIRBASEPOLICE_BASE",
SetClient = nil,
Airbases = nil,
AirbaseNames = nil,
}
--- Creates a new AIRBASEPOLICE_BASE object.
-- @param #AIRBASEPOLICE_BASE self
-- @param SetClient A SET_CLIENT object that will contain the CLIENT objects to be monitored if they follow the rules of the airbase.
-- @param Airbases A table of Airbase Names.
-- @return #AIRBASEPOLICE_BASE self
function AIRBASEPOLICE_BASE:New( SetClient, Airbases )
-- Inherits from BASE
local self = BASE:Inherit( self, BASE:New() )
self:E( { self.ClassName, SetClient, Airbases } )
self.SetClient = SetClient
self.Airbases = Airbases
for AirbaseID, Airbase in pairs( self.Airbases ) do
Airbase.ZoneBoundary = ZONE_POLYGON_BASE:New( "Boundary", Airbase.PointsBoundary ):SmokeZone(POINT_VEC3.SmokeColor.White):Flush()
for PointsRunwayID, PointsRunway in pairs( Airbase.PointsRunways ) do
Airbase.ZoneRunways[PointsRunwayID] = ZONE_POLYGON_BASE:New( "Runway " .. PointsRunwayID, PointsRunway ):SmokeZone(POINT_VEC3.SmokeColor.Red):Flush()
end
end
-- -- Template
-- local TemplateBoundary = GROUP:FindByName( "Template Boundary" )
-- self.Airbases.Template.ZoneBoundary = ZONE_POLYGON:New( "Template Boundary", TemplateBoundary ):SmokeZone(POINT_VEC3.SmokeColor.White):Flush()
--
-- local TemplateRunway1 = GROUP:FindByName( "Template Runway 1" )
-- self.Airbases.Template.ZoneRunways[1] = ZONE_POLYGON:New( "Template Runway 1", TemplateRunway1 ):SmokeZone(POINT_VEC3.SmokeColor.Red):Flush()
self.SetClient:ForEachClient(
--- @param Client#CLIENT Client
function( Client )
Client:SetState( self, "Speeding", false )
Client:SetState( self, "Warnings", 0)
Client:SetState( self, "Taxi", false )
end
)
self.AirbaseMonitor = SCHEDULER:New( self, self._AirbaseMonitor, {}, 0, 2, 0.05 )
return self
end
--- @type AIRBASEPOLICE_BASE.AirbaseNames
-- @list <#string>
--- Monitor a table of airbase names.
-- @param #AIRBASEPOLICE_BASE self
-- @param #AIRBASEPOLICE_BASE.AirbaseNames AirbaseNames A list of AirbaseNames to monitor. If this parameters is nil, then all airbases will be monitored.
-- @return #AIRBASEPOLICE_BASE self
function AIRBASEPOLICE_BASE:Monitor( AirbaseNames )
if AirbaseNames then
if type( AirbaseNames ) == "table" then
self.AirbaseNames = AirbaseNames
else
self.AirbaseNames = { AirbaseNames }
end
end
end
--- @param #AIRBASEPOLICE_BASE self
function AIRBASEPOLICE_BASE:_AirbaseMonitor()
for AirbaseID, Airbase in pairs( self.Airbases ) do
if not self.AirbaseNames or self.AirbaseNames[AirbaseID] then
self:E( AirbaseID )
self.SetClient:ForEachClientInZone( Airbase.ZoneBoundary,
--- @param Client#CLIENT Client
function( Client )
self:E( Client.UnitName )
if Client:IsAlive() then
local NotInRunwayZone = true
for ZoneRunwayID, ZoneRunway in pairs( Airbase.ZoneRunways ) do
NotInRunwayZone = ( Client:IsNotInZone( ZoneRunway ) == true ) and NotInRunwayZone or false
end
if NotInRunwayZone then
local Taxi = self:GetState( self, "Taxi" )
self:E( Taxi )
if Taxi == false then
Client:Message( "Welcome at " .. AirbaseID .. ". The maximum taxiing speed is " .. Airbase.MaximumSpeed " km/h.", 20, "ATC" )
self:SetState( self, "Taxi", true )
end
local VelocityVec3 = Client:GetVelocity()
local Velocity = math.abs(VelocityVec3.x) + math.abs(VelocityVec3.y) + math.abs(VelocityVec3.z)
local IsAboveRunway = Client:IsAboveRunway()
local IsOnGround = Client:InAir() == false
self:T( IsAboveRunway, IsOnGround )
if IsAboveRunway and IsOnGround then
if Velocity > Airbase.MaximumSpeed then
local IsSpeeding = Client:GetState( self, "Speeding" )
if IsSpeeding == true then
local SpeedingWarnings = Client:GetState( self, "Warnings" )
self:T( SpeedingWarnings )
if SpeedingWarnings <= 5 then
Client:Message( "You are speeding on the taxiway! Slow down or you will be removed from this airbase! Your current velocity is " .. string.format( "%2.0f km/h", Velocity ), 5, "Warning " .. SpeedingWarnings .. " / 5" )
Client:SetState( self, "Warnings", SpeedingWarnings + 1 )
else
MESSAGE:New( "Player " .. Client:GetPlayerName() .. " has been removed from the airbase, due to a speeding violation ...", 10, "Airbase Police" ):ToAll()
Client:GetGroup():Destroy()
Client:SetState( self, "Speeding", false )
Client:SetState( self, "Warnings", 0 )
end
else
Client:Message( "You are speeding on the taxiway! Slow down please ...! Your current velocity is " .. string.format( "%2.0f km/h", Velocity ), 5, "Attention! " )
Client:SetState( self, "Speeding", true )
Client:SetState( self, "Warnings", 1 )
end
else
Client:SetState( self, "Speeding", false )
Client:SetState( self, "Warnings", 0 )
end
end
else
Client:SetState( self, "Speeding", false )
Client:SetState( self, "Warnings", 0 )
local Taxi = self:GetState( self, "Taxi" )
if Taxi == true then
Client:Message( "You have progressed to the runway ... Await take-off clearance ...", 20, "ATC" )
self:SetState( self, "Taxi", false )
end
end
end
end
)
end
end
return true
end
--- @type AIRBASEPOLICE_CAUCASUS
-- @field Set#SET_CLIENT SetClient
-- @extends #AIRBASEPOLICE_BASE
AIRBASEPOLICE_CAUCASUS = {
ClassName = "AIRBASEPOLICE_CAUCASUS",
Airbases = {
AnapaVityazevo = {
PointsBoundary = {
[1]={["y"]=242234.85714287,["x"]=-6616.5714285726,},
[2]={["y"]=241060.57142858,["x"]=-5585.142857144,},
[3]={["y"]=243806.2857143,["x"]=-3962.2857142868,},
[4]={["y"]=245240.57142858,["x"]=-4816.5714285726,},
[5]={["y"]=244783.42857144,["x"]=-5630.8571428583,},
[6]={["y"]=243800.57142858,["x"]=-5065.142857144,},
[7]={["y"]=242232.00000001,["x"]=-6622.2857142868,},
},
PointsRunways = {
[1] = {
},
},
ZoneBoundary = {},
ZoneRunways = {},
MaximumSpeed = 50,
},
Batumi = {
PointsBoundary = {
[1]={["y"]=617567.14285714,["x"]=-355313.14285715,},
[2]={["y"]=616181.42857142,["x"]=-354800.28571429,},
[3]={["y"]=616007.14285714,["x"]=-355128.85714286,},
[4]={["y"]=618230,["x"]=-356914.57142858,},
[5]={["y"]=618727.14285714,["x"]=-356166,},
[6]={["y"]=617572.85714285,["x"]=-355308.85714286,},
},
PointsRunways = {
[1] = {
[1]={["y"]=616442.28571429,["x"]=-355090.28571429,},
[2]={["y"]=618450.57142857,["x"]=-356522,},
[3]={["y"]=618407.71428571,["x"]=-356584.85714286,},
[4]={["y"]=618361.99999999,["x"]=-356554.85714286,},
[5]={["y"]=618324.85714285,["x"]=-356599.14285715,},
[6]={["y"]=618250.57142856,["x"]=-356543.42857143,},
[7]={["y"]=618257.7142857,["x"]=-356496.28571429,},
[8]={["y"]=618237.7142857,["x"]=-356459.14285715,},
[9]={["y"]=616555.71428571,["x"]=-355258.85714286,},
[10]={["y"]=616486.28571428,["x"]=-355280.57142858,},
[11]={["y"]=616410.57142856,["x"]=-355227.71428572,},
[12]={["y"]=616441.99999999,["x"]=-355179.14285715,},
[13]={["y"]=616401.99999999,["x"]=-355147.71428572,},
[14]={["y"]=616441.42857142,["x"]=-355092.57142858,},
},
},
ZoneBoundary = {},
ZoneRunways = {},
MaximumSpeed = 50,
},
Beslan = {
PointsBoundary = {
[1]={["y"]=842082.57142857,["x"]=-148445.14285715,},
[2]={["y"]=845237.71428572,["x"]=-148639.71428572,},
[3]={["y"]=845232,["x"]=-148765.42857143,},
[4]={["y"]=844220.57142857,["x"]=-149168.28571429,},
[5]={["y"]=843274.85714286,["x"]=-149125.42857143,},
[6]={["y"]=842077.71428572,["x"]=-148554,},
[7]={["y"]=842083.42857143,["x"]=-148445.42857143,},
},
PointsRunways = {
[1] = {
[1]={["y"]=842104.57142857,["x"]=-148460.57142857,},
[2]={["y"]=845225.71428572,["x"]=-148656,},
[3]={["y"]=845220.57142858,["x"]=-148750,},
[4]={["y"]=842098.85714286,["x"]=-148556.28571429,},
[5]={["y"]=842104,["x"]=-148460.28571429,},
},
},
ZoneBoundary = {},
ZoneRunways = {},
MaximumSpeed = 50,
},
Gelendzhik = {
PointsBoundary = {
[1]={["y"]=297856.00000001,["x"]=-51151.428571429,},
[2]={["y"]=299044.57142858,["x"]=-49720.000000001,},
[3]={["y"]=298861.71428572,["x"]=-49580.000000001,},
[4]={["y"]=298198.85714286,["x"]=-49842.857142858,},
[5]={["y"]=297990.28571429,["x"]=-50151.428571429,},
[6]={["y"]=297696.00000001,["x"]=-51054.285714286,},
[7]={["y"]=297850.28571429,["x"]=-51160.000000001,},
},
PointsRunways = {
[1] = {
[1]={["y"]=297834.00000001,["x"]=-51107.428571429,},
[2]={["y"]=297786.57142858,["x"]=-51068.857142858,},
[3]={["y"]=298946.57142858,["x"]=-49686.000000001,},
[4]={["y"]=298993.14285715,["x"]=-49725.714285715,},
[5]={["y"]=297835.14285715,["x"]=-51107.714285715,},
},
},
ZoneBoundary = {},
ZoneRunways = {},
MaximumSpeed = 50,
},
Gudauta = {
PointsBoundary = {
[1]={["y"]=517246.57142857,["x"]=-197850.28571429,},
[2]={["y"]=516749.42857142,["x"]=-198070.28571429,},
[3]={["y"]=515755.14285714,["x"]=-197598.85714286,},
[4]={["y"]=515369.42857142,["x"]=-196538.85714286,},
[5]={["y"]=515623.71428571,["x"]=-195618.85714286,},
[6]={["y"]=515946.57142857,["x"]=-195510.28571429,},
[7]={["y"]=517243.71428571,["x"]=-197858.85714286,},
},
PointsRunways = {
[1] = {
[1]={["y"]=517096.57142857,["x"]=-197804.57142857,},
[2]={["y"]=515880.85714285,["x"]=-195590.28571429,},
[3]={["y"]=515812.28571428,["x"]=-195628.85714286,},
[4]={["y"]=517036.57142857,["x"]=-197834.57142857,},
[5]={["y"]=517097.99999999,["x"]=-197807.42857143,},
},
},
ZoneBoundary = {},
ZoneRunways = {},
MaximumSpeed = 50,
},
Kobuleti = {
PointsBoundary = {
[1]={["y"]=634427.71428571,["x"]=-318290.28571429,},
[2]={["y"]=635033.42857143,["x"]=-317550.2857143,},
[3]={["y"]=635864.85714286,["x"]=-317333.14285715,},
[4]={["y"]=636967.71428571,["x"]=-317261.71428572,},
[5]={["y"]=637144.85714286,["x"]=-317913.14285715,},
[6]={["y"]=634630.57142857,["x"]=-318687.42857144,},
[7]={["y"]=634424.85714286,["x"]=-318290.2857143,},
},
PointsRunways = {
[1] = {
[1]={["y"]=634509.71428571,["x"]=-318339.42857144,},
[2]={["y"]=636767.42857143,["x"]=-317516.57142858,},
[3]={["y"]=636790,["x"]=-317575.71428572,},
[4]={["y"]=634531.42857143,["x"]=-318398.00000001,},
[5]={["y"]=634510.28571429,["x"]=-318339.71428572,},
},
},
ZoneBoundary = {},
ZoneRunways = {},
MaximumSpeed = 50,
},
KrasnodarCenter = {
PointsBoundary = {
[1]={["y"]=366680.28571429,["x"]=11699.142857142,},
[2]={["y"]=366654.28571429,["x"]=11225.142857142,},
[3]={["y"]=367497.14285715,["x"]=11082.285714285,},
[4]={["y"]=368025.71428572,["x"]=10396.57142857,},
[5]={["y"]=369854.28571429,["x"]=11367.999999999,},
[6]={["y"]=369840.00000001,["x"]=11910.857142856,},
[7]={["y"]=366682.57142858,["x"]=11697.999999999,},
},
PointsRunways = {
[1] = {
[1]={["y"]=369205.42857144,["x"]=11789.142857142,},
[2]={["y"]=369209.71428572,["x"]=11714.857142856,},
[3]={["y"]=366699.71428572,["x"]=11581.714285713,},
[4]={["y"]=366698.28571429,["x"]=11659.142857142,},
[5]={["y"]=369208.85714286,["x"]=11788.57142857,},
},
},
ZoneBoundary = {},
ZoneRunways = {},
MaximumSpeed = 50,
},
KrasnodarPashkovsky = {
PointsBoundary = {
[1]={["y"]=386754,["x"]=6476.5714285703,},
[2]={["y"]=389182.57142858,["x"]=8722.2857142846,},
[3]={["y"]=388832.57142858,["x"]=9086.5714285703,},
[4]={["y"]=386961.14285715,["x"]=7707.9999999989,},
[5]={["y"]=385404,["x"]=9179.4285714274,},
[6]={["y"]=383239.71428572,["x"]=7386.5714285703,},
[7]={["y"]=383954,["x"]=6486.5714285703,},
[8]={["y"]=385775.42857143,["x"]=8097.9999999989,},
[9]={["y"]=386804,["x"]=7319.4285714274,},
[10]={["y"]=386375.42857143,["x"]=6797.9999999989,},
[11]={["y"]=386746.85714286,["x"]=6472.2857142846,},
},
PointsRunways = {
[1] = {
[1]={["y"]=385891.14285715,["x"]=8416.5714285703,},
[2]={["y"]=385842.28571429,["x"]=8467.9999999989,},
[3]={["y"]=384180.85714286,["x"]=6917.1428571417,},
[4]={["y"]=384228.57142858,["x"]=6867.7142857132,},
[5]={["y"]=385891.14285715,["x"]=8416.5714285703,},
},
[2] = {
[1]={["y"]=386714.85714286,["x"]=6674.857142856,},
[2]={["y"]=386757.71428572,["x"]=6627.7142857132,},
[3]={["y"]=389028.57142858,["x"]=8741.4285714275,},
[4]={["y"]=388981.71428572,["x"]=8790.5714285703,},
[5]={["y"]=386714.57142858,["x"]=6674.5714285703,},
},
},
ZoneBoundary = {},
ZoneRunways = {},
MaximumSpeed = 50,
},
Krymsk = {
PointsBoundary = {
[1]={["y"]=293338.00000001,["x"]=-7575.4285714297,},
[2]={["y"]=295199.42857144,["x"]=-5434.0000000011,},
[3]={["y"]=295595.14285715,["x"]=-6239.7142857154,},
[4]={["y"]=294152.2857143,["x"]=-8325.4285714297,},
[5]={["y"]=293345.14285715,["x"]=-7596.8571428582,},
},
PointsRunways = {
[1] = {
[1]={["y"]=293522.00000001,["x"]=-7567.4285714297,},
[2]={["y"]=293578.57142858,["x"]=-7616.0000000011,},
[3]={["y"]=295246.00000001,["x"]=-5591.142857144,},
[4]={["y"]=295187.71428573,["x"]=-5546.0000000011,},
[5]={["y"]=293523.14285715,["x"]=-7568.2857142868,},
},
},
ZoneBoundary = {},
ZoneRunways = {},
MaximumSpeed = 50,
},
Kutaisi = {
PointsBoundary = {
[1]={["y"]=682087.42857143,["x"]=-284512.85714286,},
[2]={["y"]=685387.42857143,["x"]=-283662.85714286,},
[3]={["y"]=685294.57142857,["x"]=-284977.14285715,},
[4]={["y"]=682744.57142857,["x"]=-286505.71428572,},
[5]={["y"]=682094.57142857,["x"]=-284527.14285715,},
},
PointsRunways = {
[1] = {
[1]={["y"]=682638,["x"]=-285202.28571429,},
[2]={["y"]=685050.28571429,["x"]=-284507.42857144,},
[3]={["y"]=685068.85714286,["x"]=-284578.85714286,},
[4]={["y"]=682657.42857143,["x"]=-285264.28571429,},
[5]={["y"]=682638.28571429,["x"]=-285202.85714286,},
},
},
ZoneBoundary = {},
ZoneRunways = {},
MaximumSpeed = 50,
},
MaykopKhanskaya = {
PointsBoundary = {
[1]={["y"]=456876.28571429,["x"]=-27665.42857143,},
[2]={["y"]=457800,["x"]=-28392.857142858,},
[3]={["y"]=459368.57142857,["x"]=-26378.571428573,},
[4]={["y"]=459425.71428572,["x"]=-25242.857142858,},
[5]={["y"]=458961.42857143,["x"]=-24964.285714287,},
[6]={["y"]=456878.57142857,["x"]=-27667.714285715,},
},
PointsRunways = {
[1] = {
[1]={["y"]=457005.42857143,["x"]=-27668.000000001,},
[2]={["y"]=459028.85714286,["x"]=-25168.857142858,},
[3]={["y"]=459082.57142857,["x"]=-25216.857142858,},
[4]={["y"]=457060,["x"]=-27714.285714287,},
[5]={["y"]=457004.57142857,["x"]=-27669.714285715,},
},
},
ZoneBoundary = {},
ZoneRunways = {},
MaximumSpeed = 50,
},
MineralnyeVody = {
PointsBoundary = {
[1]={["y"]=703857.14285714,["x"]=-50226.000000002,},
[2]={["y"]=707385.71428571,["x"]=-51911.714285716,},
[3]={["y"]=707595.71428571,["x"]=-51434.857142859,},
[4]={["y"]=707900,["x"]=-51568.857142859,},
[5]={["y"]=707542.85714286,["x"]=-52326.000000002,},
[6]={["y"]=706628.57142857,["x"]=-52568.857142859,},
[7]={["y"]=705142.85714286,["x"]=-51790.285714288,},
[8]={["y"]=703678.57142857,["x"]=-50611.714285716,},
[9]={["y"]=703857.42857143,["x"]=-50226.857142859,},
},
PointsRunways = {
[1] = {
[1]={["y"]=703904,["x"]=-50352.571428573,},
[2]={["y"]=707596.28571429,["x"]=-52094.571428573,},
[3]={["y"]=707560.57142858,["x"]=-52161.714285716,},
[4]={["y"]=703871.71428572,["x"]=-50420.571428573,},
[5]={["y"]=703902,["x"]=-50352.000000002,},
},
},
ZoneBoundary = {},
ZoneRunways = {},
MaximumSpeed = 50,
},
Mozdok = {
PointsBoundary = {
[1]={["y"]=832123.42857143,["x"]=-83608.571428573,},
[2]={["y"]=835916.28571429,["x"]=-83144.285714288,},
[3]={["y"]=835474.28571429,["x"]=-84170.571428573,},
[4]={["y"]=832911.42857143,["x"]=-84470.571428573,},
[5]={["y"]=832487.71428572,["x"]=-85565.714285716,},
[6]={["y"]=831573.42857143,["x"]=-85351.42857143,},
[7]={["y"]=832123.71428572,["x"]=-83610.285714288,},
},
PointsRunways = {
[1] = {
[1]={["y"]=832201.14285715,["x"]=-83699.428571431,},
[2]={["y"]=832212.57142857,["x"]=-83780.571428574,},
[3]={["y"]=835730.28571429,["x"]=-83335.714285717,},
[4]={["y"]=835718.85714286,["x"]=-83246.571428574,},
[5]={["y"]=832200.57142857,["x"]=-83700.000000002,},
},
},
ZoneBoundary = {},
ZoneRunways = {},
MaximumSpeed = 50,
},
Nalchik = {
PointsBoundary = {
[1]={["y"]=759370,["x"]=-125502.85714286,},
[2]={["y"]=761384.28571429,["x"]=-124177.14285714,},
[3]={["y"]=761472.85714286,["x"]=-124325.71428572,},
[4]={["y"]=761092.85714286,["x"]=-125048.57142857,},
[5]={["y"]=760295.71428572,["x"]=-125685.71428572,},
[6]={["y"]=759444.28571429,["x"]=-125734.28571429,},
[7]={["y"]=759375.71428572,["x"]=-125511.42857143,},
},
PointsRunways = {
[1] = {
[1]={["y"]=759454.28571429,["x"]=-125551.42857143,},
[2]={["y"]=759492.85714286,["x"]=-125610.85714286,},
[3]={["y"]=761406.28571429,["x"]=-124304.28571429,},
[4]={["y"]=761361.14285714,["x"]=-124239.71428572,},
[5]={["y"]=759456,["x"]=-125552.57142857,},
},
},
ZoneBoundary = {},
ZoneRunways = {},
MaximumSpeed = 50,
},
Novorossiysk = {
PointsBoundary = {
[1]={["y"]=278677.71428573,["x"]=-41656.571428572,},
[2]={["y"]=278446.2857143,["x"]=-41453.714285715,},
[3]={["y"]=278989.14285716,["x"]=-40188.000000001,},
[4]={["y"]=279717.71428573,["x"]=-39968.000000001,},
[5]={["y"]=280020.57142859,["x"]=-40208.000000001,},
[6]={["y"]=278674.85714287,["x"]=-41660.857142858,},
},
PointsRunways = {
[1] = {
[1]={["y"]=278673.14285716,["x"]=-41615.142857144,},
[2]={["y"]=278625.42857144,["x"]=-41570.571428572,},
[3]={["y"]=279835.42857144,["x"]=-40226.000000001,},
[4]={["y"]=279882.2857143,["x"]=-40270.000000001,},
[5]={["y"]=278672.00000001,["x"]=-41614.857142858,},
},
},
ZoneBoundary = {},
ZoneRunways = {},
MaximumSpeed = 50,
},
SenakiKolkhi = {
PointsBoundary = {
[1]={["y"]=646036.57142857,["x"]=-281778.85714286,},
[2]={["y"]=646045.14285714,["x"]=-281191.71428571,},
[3]={["y"]=647032.28571429,["x"]=-280598.85714285,},
[4]={["y"]=647669.42857143,["x"]=-281273.14285714,},
[5]={["y"]=648323.71428571,["x"]=-281370.28571428,},
[6]={["y"]=648520.85714286,["x"]=-281978.85714285,},
[7]={["y"]=646039.42857143,["x"]=-281783.14285714,},
},
PointsRunways = {
[1] = {
[1]={["y"]=646060.85714285,["x"]=-281736,},
[2]={["y"]=646056.57142857,["x"]=-281631.71428571,},
[3]={["y"]=648442.28571428,["x"]=-281840.28571428,},
[4]={["y"]=648432.28571428,["x"]=-281918.85714286,},
[5]={["y"]=646063.71428571,["x"]=-281738.85714286,},
},
},
ZoneBoundary = {},
ZoneRunways = {},
MaximumSpeed = 50,
},
SochiAdler = {
PointsBoundary = {
[1]={["y"]=460642.28571428,["x"]=-164861.71428571,},
[2]={["y"]=462820.85714285,["x"]=-163368.85714286,},
[3]={["y"]=463649.42857142,["x"]=-163340.28571429,},
[4]={["y"]=463835.14285714,["x"]=-164040.28571429,},
[5]={["y"]=462535.14285714,["x"]=-165654.57142857,},
[6]={["y"]=460678,["x"]=-165247.42857143,},
[7]={["y"]=460635.14285714,["x"]=-164876,},
},
PointsRunways = {
[1] = {
[1]={["y"]=460831.42857143,["x"]=-165180,},
[2]={["y"]=460878.57142857,["x"]=-165257.14285714,},
[3]={["y"]=463663.71428571,["x"]=-163793.14285714,},
[4]={["y"]=463612.28571428,["x"]=-163697.42857143,},
[5]={["y"]=460831.42857143,["x"]=-165177.14285714,},
},
[2] = {
[1]={["y"]=460831.42857143,["x"]=-165180,},
[2]={["y"]=460878.57142857,["x"]=-165257.14285714,},
[3]={["y"]=463663.71428571,["x"]=-163793.14285714,},
[4]={["y"]=463612.28571428,["x"]=-163697.42857143,},
[5]={["y"]=460831.42857143,["x"]=-165177.14285714,},
},
},
ZoneBoundary = {},
ZoneRunways = {},
MaximumSpeed = 50,
},
Soganlug = {
PointsBoundary = {
[1]={["y"]=894530.85714286,["x"]=-316928.28571428,},
[2]={["y"]=896422.28571428,["x"]=-318622.57142857,},
[3]={["y"]=896090.85714286,["x"]=-318934,},
[4]={["y"]=894019.42857143,["x"]=-317119.71428571,},
[5]={["y"]=894533.71428571,["x"]=-316925.42857143,},
},
PointsRunways = {
[1] = {
[1]={["y"]=894525.71428571,["x"]=-316964,},
[2]={["y"]=896363.14285714,["x"]=-318634.28571428,},
[3]={["y"]=896299.14285714,["x"]=-318702.85714286,},
[4]={["y"]=894464,["x"]=-317031.71428571,},
[5]={["y"]=894524.57142857,["x"]=-316963.71428571,},
},
},
ZoneBoundary = {},
ZoneRunways = {},
MaximumSpeed = 50,
},
SukhumiBabushara = {
PointsBoundary = {
[1]={["y"]=562541.14285714,["x"]=-219852.28571429,},
[2]={["y"]=562691.14285714,["x"]=-219395.14285714,},
[3]={["y"]=564326.85714286,["x"]=-219523.71428571,},
[4]={["y"]=566262.57142857,["x"]=-221166.57142857,},
[5]={["y"]=566069.71428571,["x"]=-221580.85714286,},
[6]={["y"]=562534,["x"]=-219873.71428571,},
},
PointsRunways = {
[1] = {
[1]={["y"]=562684,["x"]=-219779.71428571,},
[2]={["y"]=562717.71428571,["x"]=-219718,},
[3]={["y"]=566046.85714286,["x"]=-221376.57142857,},
[4]={["y"]=566012.28571428,["x"]=-221446.57142857,},
[5]={["y"]=562684.57142857,["x"]=-219782.57142857,},
},
},
ZoneBoundary = {},
ZoneRunways = {},
MaximumSpeed = 50,
},
TbilisiLochini = {
PointsBoundary = {
[1]={["y"]=895172.85714286,["x"]=-314667.42857143,},
[2]={["y"]=895337.42857143,["x"]=-314143.14285714,},
[3]={["y"]=895990.28571429,["x"]=-314036,},
[4]={["y"]=897730.28571429,["x"]=-315284.57142857,},
[5]={["y"]=897901.71428571,["x"]=-316284.57142857,},
[6]={["y"]=897684.57142857,["x"]=-316618.85714286,},
[7]={["y"]=895173.14285714,["x"]=-314667.42857143,},
},
PointsRunways = {
[1] = {
[1]={["y"]=895261.14285715,["x"]=-314652.28571428,},
[2]={["y"]=897654.57142857,["x"]=-316523.14285714,},
[3]={["y"]=897711.71428571,["x"]=-316450.28571429,},
[4]={["y"]=895327.42857143,["x"]=-314568.85714286,},
[5]={["y"]=895261.71428572,["x"]=-314656,},
},
},
ZoneBoundary = {},
ZoneRunways = {},
MaximumSpeed = 50,
},
Vaziani = {
PointsBoundary = {
[1]={["y"]=902122,["x"]=-318163.71428572,},
[2]={["y"]=902678.57142857,["x"]=-317594,},
[3]={["y"]=903275.71428571,["x"]=-317405.42857143,},
[4]={["y"]=903418.57142857,["x"]=-317891.14285714,},
[5]={["y"]=904292.85714286,["x"]=-318748.28571429,},
[6]={["y"]=904542,["x"]=-319740.85714286,},
[7]={["y"]=904042,["x"]=-320166.57142857,},
[8]={["y"]=902121.42857143,["x"]=-318164.85714286,},
},
PointsRunways = {
[1] = {
[1]={["y"]=902239.14285714,["x"]=-318190.85714286,},
[2]={["y"]=904014.28571428,["x"]=-319994.57142857,},
[3]={["y"]=904064.85714285,["x"]=-319945.14285715,},
[4]={["y"]=902294.57142857,["x"]=-318146,},
[5]={["y"]=902247.71428571,["x"]=-318190.85714286,},
},
},
ZoneBoundary = {},
ZoneRunways = {},
MaximumSpeed = 50,
},
},
}
--- Creates a new AIRBASEPOLICE_CAUCASUS object.
-- @param #AIRBASEPOLICE_CAUCASUS self
-- @param SetClient A SET_CLIENT object that will contain the CLIENT objects to be monitored if they follow the rules of the airbase.
-- @return #AIRBASEPOLICE_CAUCASUS self
function AIRBASEPOLICE_CAUCASUS:New( SetClient )
-- Inherits from BASE
local self = BASE:Inherit( self, AIRBASEPOLICE_BASE:New( SetClient, self.Airbases ) )
-- -- AnapaVityazevo
-- local AnapaVityazevoBoundary = GROUP:FindByName( "AnapaVityazevo Boundary" )
-- self.Airbases.AnapaVityazevo.ZoneBoundary = ZONE_POLYGON:New( "AnapaVityazevo Boundary", AnapaVityazevoBoundary ):SmokeZone(POINT_VEC3.SmokeColor.White):Flush()
--
-- local AnapaVityazevoRunway1 = GROUP:FindByName( "AnapaVityazevo Runway 1" )
-- self.Airbases.AnapaVityazevo.ZoneRunways[1] = ZONE_POLYGON:New( "AnapaVityazevo Runway 1", AnapaVityazevoRunway1 ):SmokeZone(POINT_VEC3.SmokeColor.Red):Flush()
--
--
--
-- -- Batumi
-- local BatumiBoundary = GROUP:FindByName( "Batumi Boundary" )
-- self.Airbases.Batumi.ZoneBoundary = ZONE_POLYGON:New( "Batumi Boundary", BatumiBoundary ):SmokeZone(POINT_VEC3.SmokeColor.White):Flush()
--
-- local BatumiRunway1 = GROUP:FindByName( "Batumi Runway 1" )
-- self.Airbases.Batumi.ZoneRunways[1] = ZONE_POLYGON:New( "Batumi Runway 1", BatumiRunway1 ):SmokeZone(POINT_VEC3.SmokeColor.Red):Flush()
--
--
--
-- -- Beslan
-- local BeslanBoundary = GROUP:FindByName( "Beslan Boundary" )
-- self.Airbases.Beslan.ZoneBoundary = ZONE_POLYGON:New( "Beslan Boundary", BeslanBoundary ):SmokeZone(POINT_VEC3.SmokeColor.White):Flush()
--
-- local BeslanRunway1 = GROUP:FindByName( "Beslan Runway 1" )
-- self.Airbases.Beslan.ZoneRunways[1] = ZONE_POLYGON:New( "Beslan Runway 1", BeslanRunway1 ):SmokeZone(POINT_VEC3.SmokeColor.Red):Flush()
--
--
--
-- -- Gelendzhik
-- local GelendzhikBoundary = GROUP:FindByName( "Gelendzhik Boundary" )
-- self.Airbases.Gelendzhik.ZoneBoundary = ZONE_POLYGON:New( "Gelendzhik Boundary", GelendzhikBoundary ):SmokeZone(POINT_VEC3.SmokeColor.White):Flush()
--
-- local GelendzhikRunway1 = GROUP:FindByName( "Gelendzhik Runway 1" )
-- self.Airbases.Gelendzhik.ZoneRunways[1] = ZONE_POLYGON:New( "Gelendzhik Runway 1", GelendzhikRunway1 ):SmokeZone(POINT_VEC3.SmokeColor.Red):Flush()
--
--
--
-- -- Gudauta
-- local GudautaBoundary = GROUP:FindByName( "Gudauta Boundary" )
-- self.Airbases.Gudauta.ZoneBoundary = ZONE_POLYGON:New( "Gudauta Boundary", GudautaBoundary ):SmokeZone(POINT_VEC3.SmokeColor.White):Flush()
--
-- local GudautaRunway1 = GROUP:FindByName( "Gudauta Runway 1" )
-- self.Airbases.Gudauta.ZoneRunways[1] = ZONE_POLYGON:New( "Gudauta Runway 1", GudautaRunway1 ):SmokeZone(POINT_VEC3.SmokeColor.Red):Flush()
--
--
--
-- -- Kobuleti
-- local KobuletiBoundary = GROUP:FindByName( "Kobuleti Boundary" )
-- self.Airbases.Kobuleti.ZoneBoundary = ZONE_POLYGON:New( "Kobuleti Boundary", KobuletiBoundary ):SmokeZone(POINT_VEC3.SmokeColor.White):Flush()
--
-- local KobuletiRunway1 = GROUP:FindByName( "Kobuleti Runway 1" )
-- self.Airbases.Kobuleti.ZoneRunways[1] = ZONE_POLYGON:New( "Kobuleti Runway 1", KobuletiRunway1 ):SmokeZone(POINT_VEC3.SmokeColor.Red):Flush()
--
--
--
-- -- KrasnodarCenter
-- local KrasnodarCenterBoundary = GROUP:FindByName( "KrasnodarCenter Boundary" )
-- self.Airbases.KrasnodarCenter.ZoneBoundary = ZONE_POLYGON:New( "KrasnodarCenter Boundary", KrasnodarCenterBoundary ):SmokeZone(POINT_VEC3.SmokeColor.White):Flush()
--
-- local KrasnodarCenterRunway1 = GROUP:FindByName( "KrasnodarCenter Runway 1" )
-- self.Airbases.KrasnodarCenter.ZoneRunways[1] = ZONE_POLYGON:New( "KrasnodarCenter Runway 1", KrasnodarCenterRunway1 ):SmokeZone(POINT_VEC3.SmokeColor.Red):Flush()
--
--
--
-- -- KrasnodarPashkovsky
-- local KrasnodarPashkovskyBoundary = GROUP:FindByName( "KrasnodarPashkovsky Boundary" )
-- self.Airbases.KrasnodarPashkovsky.ZoneBoundary = ZONE_POLYGON:New( "KrasnodarPashkovsky Boundary", KrasnodarPashkovskyBoundary ):SmokeZone(POINT_VEC3.SmokeColor.White):Flush()
--
-- local KrasnodarPashkovskyRunway1 = GROUP:FindByName( "KrasnodarPashkovsky Runway 1" )
-- self.Airbases.KrasnodarPashkovsky.ZoneRunways[1] = ZONE_POLYGON:New( "KrasnodarPashkovsky Runway 1", KrasnodarPashkovskyRunway1 ):SmokeZone(POINT_VEC3.SmokeColor.Red):Flush()
-- local KrasnodarPashkovskyRunway2 = GROUP:FindByName( "KrasnodarPashkovsky Runway 2" )
-- self.Airbases.KrasnodarPashkovsky.ZoneRunways[2] = ZONE_POLYGON:New( "KrasnodarPashkovsky Runway 2", KrasnodarPashkovskyRunway2 ):SmokeZone(POINT_VEC3.SmokeColor.Red):Flush()
--
--
--
-- -- Krymsk
-- local KrymskBoundary = GROUP:FindByName( "Krymsk Boundary" )
-- self.Airbases.Krymsk.ZoneBoundary = ZONE_POLYGON:New( "Krymsk Boundary", KrymskBoundary ):SmokeZone(POINT_VEC3.SmokeColor.White):Flush()
--
-- local KrymskRunway1 = GROUP:FindByName( "Krymsk Runway 1" )
-- self.Airbases.Krymsk.ZoneRunways[1] = ZONE_POLYGON:New( "Krymsk Runway 1", KrymskRunway1 ):SmokeZone(POINT_VEC3.SmokeColor.Red):Flush()
--
--
--
-- -- Kutaisi
-- local KutaisiBoundary = GROUP:FindByName( "Kutaisi Boundary" )
-- self.Airbases.Kutaisi.ZoneBoundary = ZONE_POLYGON:New( "Kutaisi Boundary", KutaisiBoundary ):SmokeZone(POINT_VEC3.SmokeColor.White):Flush()
--
-- local KutaisiRunway1 = GROUP:FindByName( "Kutaisi Runway 1" )
-- self.Airbases.Kutaisi.ZoneRunways[1] = ZONE_POLYGON:New( "Kutaisi Runway 1", KutaisiRunway1 ):SmokeZone(POINT_VEC3.SmokeColor.Red):Flush()
--
--
--
-- -- MaykopKhanskaya
-- local MaykopKhanskayaBoundary = GROUP:FindByName( "MaykopKhanskaya Boundary" )
-- self.Airbases.MaykopKhanskaya.ZoneBoundary = ZONE_POLYGON:New( "MaykopKhanskaya Boundary", MaykopKhanskayaBoundary ):SmokeZone(POINT_VEC3.SmokeColor.White):Flush()
--
-- local MaykopKhanskayaRunway1 = GROUP:FindByName( "MaykopKhanskaya Runway 1" )
-- self.Airbases.MaykopKhanskaya.ZoneRunways[1] = ZONE_POLYGON:New( "MaykopKhanskaya Runway 1", MaykopKhanskayaRunway1 ):SmokeZone(POINT_VEC3.SmokeColor.Red):Flush()
--
--
--
-- -- MineralnyeVody
-- local MineralnyeVodyBoundary = GROUP:FindByName( "MineralnyeVody Boundary" )
-- self.Airbases.MineralnyeVody.ZoneBoundary = ZONE_POLYGON:New( "MineralnyeVody Boundary", MineralnyeVodyBoundary ):SmokeZone(POINT_VEC3.SmokeColor.White):Flush()
--
-- local MineralnyeVodyRunway1 = GROUP:FindByName( "MineralnyeVody Runway 1" )
-- self.Airbases.MineralnyeVody.ZoneRunways[1] = ZONE_POLYGON:New( "MineralnyeVody Runway 1", MineralnyeVodyRunway1 ):SmokeZone(POINT_VEC3.SmokeColor.Red):Flush()
--
--
--
-- -- Mozdok
-- local MozdokBoundary = GROUP:FindByName( "Mozdok Boundary" )
-- self.Airbases.Mozdok.ZoneBoundary = ZONE_POLYGON:New( "Mozdok Boundary", MozdokBoundary ):SmokeZone(POINT_VEC3.SmokeColor.White):Flush()
--
-- local MozdokRunway1 = GROUP:FindByName( "Mozdok Runway 1" )
-- self.Airbases.Mozdok.ZoneRunways[1] = ZONE_POLYGON:New( "Mozdok Runway 1", MozdokRunway1 ):SmokeZone(POINT_VEC3.SmokeColor.Red):Flush()
--
--
--
-- -- Nalchik
-- local NalchikBoundary = GROUP:FindByName( "Nalchik Boundary" )
-- self.Airbases.Nalchik.ZoneBoundary = ZONE_POLYGON:New( "Nalchik Boundary", NalchikBoundary ):SmokeZone(POINT_VEC3.SmokeColor.White):Flush()
--
-- local NalchikRunway1 = GROUP:FindByName( "Nalchik Runway 1" )
-- self.Airbases.Nalchik.ZoneRunways[1] = ZONE_POLYGON:New( "Nalchik Runway 1", NalchikRunway1 ):SmokeZone(POINT_VEC3.SmokeColor.Red):Flush()
--
--
--
-- -- Novorossiysk
-- local NovorossiyskBoundary = GROUP:FindByName( "Novorossiysk Boundary" )
-- self.Airbases.Novorossiysk.ZoneBoundary = ZONE_POLYGON:New( "Novorossiysk Boundary", NovorossiyskBoundary ):SmokeZone(POINT_VEC3.SmokeColor.White):Flush()
--
-- local NovorossiyskRunway1 = GROUP:FindByName( "Novorossiysk Runway 1" )
-- self.Airbases.Novorossiysk.ZoneRunways[1] = ZONE_POLYGON:New( "Novorossiysk Runway 1", NovorossiyskRunway1 ):SmokeZone(POINT_VEC3.SmokeColor.Red):Flush()
--
--
--
-- -- SenakiKolkhi
-- local SenakiKolkhiBoundary = GROUP:FindByName( "SenakiKolkhi Boundary" )
-- self.Airbases.SenakiKolkhi.ZoneBoundary = ZONE_POLYGON:New( "SenakiKolkhi Boundary", SenakiKolkhiBoundary ):SmokeZone(POINT_VEC3.SmokeColor.White):Flush()
--
-- local SenakiKolkhiRunway1 = GROUP:FindByName( "SenakiKolkhi Runway 1" )
-- self.Airbases.SenakiKolkhi.ZoneRunways[1] = ZONE_POLYGON:New( "SenakiKolkhi Runway 1", SenakiKolkhiRunway1 ):SmokeZone(POINT_VEC3.SmokeColor.Red):Flush()
--
--
--
-- -- SochiAdler
-- local SochiAdlerBoundary = GROUP:FindByName( "SochiAdler Boundary" )
-- self.Airbases.SochiAdler.ZoneBoundary = ZONE_POLYGON:New( "SochiAdler Boundary", SochiAdlerBoundary ):SmokeZone(POINT_VEC3.SmokeColor.White):Flush()
--
-- local SochiAdlerRunway1 = GROUP:FindByName( "SochiAdler Runway 1" )
-- self.Airbases.SochiAdler.ZoneRunways[1] = ZONE_POLYGON:New( "SochiAdler Runway 1", SochiAdlerRunway1 ):SmokeZone(POINT_VEC3.SmokeColor.Red):Flush()
-- local SochiAdlerRunway2 = GROUP:FindByName( "SochiAdler Runway 2" )
-- self.Airbases.SochiAdler.ZoneRunways[2] = ZONE_POLYGON:New( "SochiAdler Runway 2", SochiAdlerRunway1 ):SmokeZone(POINT_VEC3.SmokeColor.Red):Flush()
--
--
--
-- -- Soganlug
-- local SoganlugBoundary = GROUP:FindByName( "Soganlug Boundary" )
-- self.Airbases.Soganlug.ZoneBoundary = ZONE_POLYGON:New( "Soganlug Boundary", SoganlugBoundary ):SmokeZone(POINT_VEC3.SmokeColor.White):Flush()
--
-- local SoganlugRunway1 = GROUP:FindByName( "Soganlug Runway 1" )
-- self.Airbases.Soganlug.ZoneRunways[1] = ZONE_POLYGON:New( "Soganlug Runway 1", SoganlugRunway1 ):SmokeZone(POINT_VEC3.SmokeColor.Red):Flush()
--
--
--
-- -- SukhumiBabushara
-- local SukhumiBabusharaBoundary = GROUP:FindByName( "SukhumiBabushara Boundary" )
-- self.Airbases.SukhumiBabushara.ZoneBoundary = ZONE_POLYGON:New( "SukhumiBabushara Boundary", SukhumiBabusharaBoundary ):SmokeZone(POINT_VEC3.SmokeColor.White):Flush()
--
-- local SukhumiBabusharaRunway1 = GROUP:FindByName( "SukhumiBabushara Runway 1" )
-- self.Airbases.SukhumiBabushara.ZoneRunways[1] = ZONE_POLYGON:New( "SukhumiBabushara Runway 1", SukhumiBabusharaRunway1 ):SmokeZone(POINT_VEC3.SmokeColor.Red):Flush()
--
--
--
-- -- TbilisiLochini
-- local TbilisiLochiniBoundary = GROUP:FindByName( "TbilisiLochini Boundary" )
-- self.Airbases.TbilisiLochini.ZoneBoundary = ZONE_POLYGON:New( "TbilisiLochini Boundary", TbilisiLochiniBoundary ):SmokeZone(POINT_VEC3.SmokeColor.White):Flush()
--
-- local TbilisiLochiniRunway1 = GROUP:FindByName( "TbilisiLochini Runway 1" )
-- self.Airbases.TbilisiLochini.ZoneRunways[1] = ZONE_POLYGON:New( "TbilisiLochini Runway 1", TbilisiLochiniRunway1 ):SmokeZone(POINT_VEC3.SmokeColor.Red):Flush()
--
--
--
-- -- Vaziani
-- local VazianiBoundary = GROUP:FindByName( "Vaziani Boundary" )
-- self.Airbases.Vaziani.ZoneBoundary = ZONE_POLYGON:New( "Vaziani Boundary", VazianiBoundary ):SmokeZone(POINT_VEC3.SmokeColor.White):Flush()
--
-- local VazianiRunway1 = GROUP:FindByName( "Vaziani Runway 1" )
-- self.Airbases.Vaziani.ZoneRunways[1] = ZONE_POLYGON:New( "Vaziani Runway 1", VazianiRunway1 ):SmokeZone(POINT_VEC3.SmokeColor.Red):Flush()
--
--
--
-- -- Template
-- local TemplateBoundary = GROUP:FindByName( "Template Boundary" )
-- self.Airbases.Template.ZoneBoundary = ZONE_POLYGON:New( "Template Boundary", TemplateBoundary ):SmokeZone(POINT_VEC3.SmokeColor.White):Flush()
--
-- local TemplateRunway1 = GROUP:FindByName( "Template Runway 1" )
-- self.Airbases.Template.ZoneRunways[1] = ZONE_POLYGON:New( "Template Runway 1", TemplateRunway1 ):SmokeZone(POINT_VEC3.SmokeColor.Red):Flush()
return self
end

View File

@ -1,32 +1,37 @@
--- BASE classes.
--- This module contains the BASE class.
--
-- @{#BASE} class
-- ==============
-- The @{#BASE} class is the super class for most of the classes defined within MOOSE.
-- 1) @{#BASE} class
-- =================
-- The @{#BASE} class is the super class for all the classes defined within MOOSE.
--
-- It handles:
--
-- * The construction and inheritance of child classes.
-- * The tracing of objects during mission execution within the DCS.log file (under saved games folder).
-- * The tracing of objects during mission execution within the **DCS.log** file, under the **"Saved Games\DCS\Logs"** folder.
--
-- Note: Normally you would not use the BASE class unless you are extending the MOOSE framework with new classes.
--
-- BASE Trace functionality
-- ========================
-- 1.1) BASE constructor
-- ---------------------
-- Any class derived from BASE, must use the @{Base#BASE.New) constructor within the @{Base#BASE.Inherit) method.
-- See an example at the @{Base#BASE.New} method how this is done.
--
-- 1.2) BASE Trace functionality
-- -----------------------------
-- The BASE class contains trace methods to trace progress within a mission execution of a certain object.
-- Note that these trace methods are inherited by each MOOSE class interiting BASE.
-- As such, each object created from derived class from BASE can use the tracing functions to trace its execution.
--
-- Trace a function call
-- ---------------------
-- 1.2.1) Tracing functions
-- ------------------------
-- There are basically 3 types of tracing methods available within BASE:
--
-- * @{#BASE.F}: Trace the beginning of a function and its given parameters.
-- * @{#BASE.T}: Trace further logic within a function giving optional variables or parameters.
-- * @{#BASE.E}: Trace an execption within a function giving optional variables or parameters. An exception will always be traced.
-- * @{#BASE.F}: Trace the beginning of a function and its given parameters. An F is indicated at column 44 in the DCS.log file.
-- * @{#BASE.T}: Trace further logic within a function giving optional variables or parameters. A T is indicated at column 44 in the DCS.log file.
-- * @{#BASE.E}: Trace an exception within a function giving optional variables or parameters. An E is indicated at column 44 in the DCS.log file. An exception will always be traced.
--
-- Tracing levels
-- --------------
-- 1.2.2) Tracing levels
-- ---------------------
-- There are 3 tracing levels within MOOSE.
-- These tracing levels were defined to avoid bulks of tracing to be generated by lots of objects.
--
@ -37,8 +42,8 @@
-- * @{#BASE.T2}: Trace further logic within a function giving optional variables or parameters with tracing level 2.
-- * @{#BASE.T3}: Trace further logic within a function giving optional variables or parameters with tracing level 3.
--
-- BASE Inheritance support
-- ========================
-- 1.3) BASE Inheritance support
-- ===========================
-- The following methods are available to support inheritance:
--
-- * @{#BASE.Inherit}: Inherits from a class.
@ -55,16 +60,19 @@
local _TraceOn = true
local _TraceOnOff = true
local _TraceLevel = 1
local _TraceAll = false
local _TraceClass = {}
local _TraceClassMethod = {}
local _ClassID = 0
--- The BASE Class
-- @type BASE
-- @field ClassName The name of the class.
-- @field ClassID The ID number of the class.
-- @field ClassNameAndID The name of the class concatenated with the ID number of the class.
BASE = {
ClassName = "BASE",
ClassID = 0,
@ -86,27 +94,29 @@ FORMATION = {
-- @param #BASE self
-- @return #BASE The new instance of the BASE class.
-- @usage
-- function TASK:New()
-- -- This declares the constructor of the class TASK, inheriting from BASE.
-- --- TASK constructor
-- -- @param #TASK self
-- -- @param Parameter The parameter of the New constructor.
-- -- @return #TASK self
-- function TASK:New( Parameter )
--
-- local self = BASE:Inherit( self, BASE:New() )
--
-- -- assign Task default values during construction
-- self.TaskBriefing = "Task: No Task."
-- self.Time = timer.getTime()
-- self.ExecuteStage = _TransportExecuteStage.NONE
--
-- self.Variable = Parameter
--
-- return self
-- end
-- @todo need to investigate if the deepCopy is really needed... Don't think so.
function BASE:New()
local Child = routines.utils.deepCopy( self )
local Parent = {}
setmetatable( Child, Parent )
Child.__index = Child
self.ClassID = self.ClassID + 1
Child.ClassID = self.ClassID
--Child.AddEvent( Child, S_EVENT_BIRTH, Child.EventBirth )
return Child
local self = routines.utils.deepCopy( self ) -- Create a new self instance
local MetaTable = {}
setmetatable( self, MetaTable )
self.__index = self
_ClassID = _ClassID + 1
self.ClassID = _ClassID
self.ClassNameAndID = string.format( '%s#%09d', self.ClassName, self.ClassID )
return self
end
--- This is the worker method to inherit from a parent class.
@ -142,7 +152,7 @@ end
-- @param #BASE self
-- @return #string The ClassName + ClassID of the class instance.
function BASE:GetClassNameAndID()
return string.format( '%s#%09d', self:GetClassName(), self:GetClassID() )
return self.ClassNameAndID
end
--- Get the ClassName of the class instance.
@ -328,11 +338,12 @@ end
function BASE:SetState( Object, StateName, State )
local ClassNameAndID = Object:GetClassNameAndID()
if not self.States[ClassNameAndID] then
self.States[ClassNameAndID] = {}
end
self.States[ClassNameAndID][StateName] = State
self:E( { ClassNameAndID, StateName, State } )
self:F2( { ClassNameAndID, StateName, State } )
return self.States[ClassNameAndID][StateName]
end
@ -340,10 +351,10 @@ end
function BASE:GetState( Object, StateName )
local ClassNameAndID = Object:GetClassNameAndID()
self:E( { ClassNameAndID } )
if self.States[ClassNameAndID] then
local State = self.States[ClassNameAndID][StateName]
self:E( { ClassNameAndID, StateName, State } )
self:F2( { ClassNameAndID, StateName, State } )
return State
end
@ -363,6 +374,23 @@ end
-- Log a trace (only shown when trace is on)
-- TODO: Make trace function using variable parameters.
--- Set trace on or off
-- Note that when trace is off, no debug statement is performed, increasing performance!
-- When Moose is loaded statically, (as one file), tracing is switched off by default.
-- So tracing must be switched on manually in your mission if you are using Moose statically.
-- When moose is loading dynamically (for moose class development), tracing is switched on by default.
-- @param BASE self
-- @param #boolean TraceOnOff Switch the tracing on or off.
-- @usage
-- -- Switch the tracing On
-- BASE:TraceOn( true )
--
-- -- Switch the tracing Off
-- BASE:TraceOn( false )
function BASE:TraceOnOff( TraceOnOff )
_TraceOnOff = TraceOnOff
end
--- Set trace level
-- @param #BASE self
-- @param #number Level
@ -407,12 +435,12 @@ function BASE:TraceClassMethod( Class, Method )
self:E( "Tracing method " .. Method .. " of class " .. Class )
end
--- Trace a function call. Must be at the beginning of the function logic.
--- Trace a function call. This function is private.
-- @param #BASE self
-- @param Arguments A #table or any field.
function BASE:F( Arguments, DebugInfoCurrentParam, DebugInfoFromParam )
function BASE:_F( Arguments, DebugInfoCurrentParam, DebugInfoFromParam )
if _TraceOn and ( ( _TraceAll == true ) or ( _TraceClass[self.ClassName] or _TraceClassMethod[self.ClassName] ) ) then
if ( _TraceAll == true ) or ( _TraceClass[self.ClassName] or _TraceClassMethod[self.ClassName] ) then
local DebugInfoCurrent = DebugInfoCurrentParam and DebugInfoCurrentParam or debug.getinfo( 2, "nl" )
local DebugInfoFrom = DebugInfoFromParam and DebugInfoFromParam or debug.getinfo( 3, "l" )
@ -436,18 +464,35 @@ function BASE:F( Arguments, DebugInfoCurrentParam, DebugInfoFromParam )
end
end
--- Trace a function call. Must be at the beginning of the function logic.
-- @param #BASE self
-- @param Arguments A #table or any field.
function BASE:F( Arguments )
if _TraceOnOff then
local DebugInfoCurrent = debug.getinfo( 2, "nl" )
local DebugInfoFrom = debug.getinfo( 3, "l" )
if _TraceLevel >= 1 then
self:_F( Arguments, DebugInfoCurrent, DebugInfoFrom )
end
end
end
--- Trace a function call level 2. Must be at the beginning of the function logic.
-- @param #BASE self
-- @param Arguments A #table or any field.
function BASE:F2( Arguments )
local DebugInfoCurrent = debug.getinfo( 2, "nl" )
local DebugInfoFrom = debug.getinfo( 3, "l" )
if _TraceLevel >= 2 then
self:F( Arguments, DebugInfoCurrent, DebugInfoFrom )
end
if _TraceOnOff then
local DebugInfoCurrent = debug.getinfo( 2, "nl" )
local DebugInfoFrom = debug.getinfo( 3, "l" )
if _TraceLevel >= 2 then
self:_F( Arguments, DebugInfoCurrent, DebugInfoFrom )
end
end
end
--- Trace a function call level 3. Must be at the beginning of the function logic.
@ -455,13 +500,14 @@ end
-- @param Arguments A #table or any field.
function BASE:F3( Arguments )
local DebugInfoCurrent = debug.getinfo( 2, "nl" )
local DebugInfoFrom = debug.getinfo( 3, "l" )
if _TraceLevel >= 3 then
self:F( Arguments, DebugInfoCurrent, DebugInfoFrom )
end
if _TraceOnOff then
local DebugInfoCurrent = debug.getinfo( 2, "nl" )
local DebugInfoFrom = debug.getinfo( 3, "l" )
if _TraceLevel >= 3 then
self:_F( Arguments, DebugInfoCurrent, DebugInfoFrom )
end
end
end
--- Trace a function logic.
@ -469,7 +515,7 @@ end
-- @param Arguments A #table or any field.
function BASE:_T( Arguments, DebugInfoCurrentParam, DebugInfoFromParam )
if _TraceOn and ( ( _TraceAll == true ) or ( _TraceClass[self.ClassName] or _TraceClassMethod[self.ClassName] ) ) then
if ( _TraceAll == true ) or ( _TraceClass[self.ClassName] or _TraceClassMethod[self.ClassName] ) then
local DebugInfoCurrent = DebugInfoCurrentParam and DebugInfoCurrentParam or debug.getinfo( 2, "nl" )
local DebugInfoFrom = DebugInfoFromParam and DebugInfoFromParam or debug.getinfo( 3, "l" )
@ -498,13 +544,14 @@ end
-- @param Arguments A #table or any field.
function BASE:T( Arguments )
local DebugInfoCurrent = debug.getinfo( 2, "nl" )
local DebugInfoFrom = debug.getinfo( 3, "l" )
if _TraceLevel >= 1 then
self:_T( Arguments, DebugInfoCurrent, DebugInfoFrom )
end
if _TraceOnOff then
local DebugInfoCurrent = debug.getinfo( 2, "nl" )
local DebugInfoFrom = debug.getinfo( 3, "l" )
if _TraceLevel >= 1 then
self:_T( Arguments, DebugInfoCurrent, DebugInfoFrom )
end
end
end
@ -513,13 +560,14 @@ end
-- @param Arguments A #table or any field.
function BASE:T2( Arguments )
local DebugInfoCurrent = debug.getinfo( 2, "nl" )
local DebugInfoFrom = debug.getinfo( 3, "l" )
if _TraceLevel >= 2 then
self:_T( Arguments, DebugInfoCurrent, DebugInfoFrom )
end
if _TraceOnOff then
local DebugInfoCurrent = debug.getinfo( 2, "nl" )
local DebugInfoFrom = debug.getinfo( 3, "l" )
if _TraceLevel >= 2 then
self:_T( Arguments, DebugInfoCurrent, DebugInfoFrom )
end
end
end
--- Trace a function logic level 3. Can be anywhere within the function logic.
@ -527,13 +575,14 @@ end
-- @param Arguments A #table or any field.
function BASE:T3( Arguments )
local DebugInfoCurrent = debug.getinfo( 2, "nl" )
local DebugInfoFrom = debug.getinfo( 3, "l" )
if _TraceLevel >= 3 then
self:_T( Arguments, DebugInfoCurrent, DebugInfoFrom )
end
if _TraceOnOff then
local DebugInfoCurrent = debug.getinfo( 2, "nl" )
local DebugInfoFrom = debug.getinfo( 3, "l" )
if _TraceLevel >= 3 then
self:_T( Arguments, DebugInfoCurrent, DebugInfoFrom )
end
end
end
--- Log an exception which will be traced always. Can be anywhere within the function logic.

View File

@ -127,7 +127,7 @@ function CARGO_ZONE:ReportCargosToClient( Client, CargoType )
HostMessage = "No Cargo Available."
end
Client:Message( HostMessage, 20, Mission.Name .. "/StageHosts." .. SignalUnitTypeName, SignalUnitTypeName .. ": Reporting Cargo", 10 )
Client:Message( HostMessage, 20, SignalUnitTypeName .. ": Reporting Cargo", 10 )
end
end

View File

@ -37,12 +37,6 @@
-- @module Client
-- @author FlightControl
--- The CLIENT class
-- @type CLIENT
-- @extends Unit#UNIT
@ -131,7 +125,7 @@ function CLIENT:Register( ClientName )
self.ClientAlive2 = false
--self.AliveCheckScheduler = routines.scheduleFunction( self._AliveCheckScheduler, { self }, timer.getTime() + 1, 5 )
self.AliveCheckScheduler = SCHEDULER:New( self, self._AliveCheckScheduler, {}, 1, 5 )
self.AliveCheckScheduler = SCHEDULER:New( self, self._AliveCheckScheduler, { "Client Alive " .. ClientName }, 1, 5 )
self:E( self )
return self
@ -173,7 +167,7 @@ function CLIENT:ShowBriefing()
Briefing = Briefing .. self.ClientBriefing
end
Briefing = Briefing .. " Press [LEFT ALT]+[B] to view the complete mission briefing."
self:Message( Briefing, 60, self.ClientName .. '/ClientBriefing', "Briefing" )
self:Message( Briefing, 60, "Briefing" )
end
return self
@ -187,7 +181,7 @@ function CLIENT:ShowMissionBriefing( MissionBriefing )
self:F( { self.ClientName } )
if MissionBriefing then
self:Message( MissionBriefing, 60, self.ClientName .. '/MissionBriefing', "Mission Briefing" )
self:Message( MissionBriefing, 60, "Mission Briefing" )
end
return self
@ -241,10 +235,11 @@ function CLIENT:Alive( CallBackFunction, ... )
end
--- @param #CLIENT self
function CLIENT:_AliveCheckScheduler()
self:F( { self.ClientName, self.ClientAlive2, self.ClientBriefingShown, self.ClientCallBack } )
function CLIENT:_AliveCheckScheduler( SchedulerName )
self:E( SchedulerName )
self:F( { SchedulerName, self.ClientName, self.ClientAlive2, self.ClientBriefingShown, self.ClientCallBack } )
if self:IsAlive() then -- Polymorphic call of UNIT
if self:IsAlive() then
if self.ClientAlive2 == false then
self:ShowBriefing()
if self.ClientCallBack then
@ -420,7 +415,7 @@ function CLIENT:ShowCargo()
CargoMsg = "empty"
end
self:Message( CargoMsg, 15, self.ClientName .. "/Cargo", "Co-Pilot: Cargo Status", 30 )
self:Message( CargoMsg, 15, "Co-Pilot: Cargo Status", 30 )
end
@ -435,11 +430,11 @@ end
-- @param #CLIENT self
-- @param #string Message is the text describing the message.
-- @param #number MessageDuration is the duration in seconds that the Message should be displayed.
-- @param #string MessageId is a text identifying the Message in the MessageQueue. The Message system overwrites Messages with the same MessageId
-- @param #string MessageCategory is the category of the message (the title).
-- @param #number MessageInterval is the interval in seconds between the display of the @{Message#MESSAGE} when the CLIENT is in the air.
function CLIENT:Message( Message, MessageDuration, MessageId, MessageCategory, MessageInterval )
self:F( { Message, MessageDuration, MessageId, MessageCategory, MessageInterval } )
-- @param #string MessageID is the identifier of the message when displayed with intervals.
function CLIENT:Message( Message, MessageDuration, MessageCategory, MessageInterval, MessageID )
self:F( { Message, MessageDuration, MessageCategory, MessageInterval } )
if not self.MenuMessages then
if self:GetClientGroupID() then
@ -453,29 +448,33 @@ function CLIENT:Message( Message, MessageDuration, MessageId, MessageCategory, M
if MessageCategory == nil then
MessageCategory = "Messages"
end
if self.Messages[MessageId] == nil then
self.Messages[MessageId] = {}
self.Messages[MessageId].MessageId = MessageId
self.Messages[MessageId].MessageTime = timer.getTime()
self.Messages[MessageId].MessageDuration = MessageDuration
if MessageInterval == nil then
self.Messages[MessageId].MessageInterval = 600
else
self.Messages[MessageId].MessageInterval = MessageInterval
end
MESSAGE:New( Message, MessageDuration, MessageCategory ):ToClient( self )
if MessageID ~= nil then
if self.Messages[MessageID] == nil then
self.Messages[MessageID] = {}
self.Messages[MessageID].MessageId = MessageID
self.Messages[MessageID].MessageTime = timer.getTime()
self.Messages[MessageID].MessageDuration = MessageDuration
if MessageInterval == nil then
self.Messages[MessageID].MessageInterval = 600
else
self.Messages[MessageID].MessageInterval = MessageInterval
end
MESSAGE:New( Message, MessageDuration, MessageCategory ):ToClient( self )
else
if self:GetClientGroupDCSUnit() and not self:GetClientGroupDCSUnit():inAir() then
if timer.getTime() - self.Messages[MessageID].MessageTime >= self.Messages[MessageID].MessageDuration + 10 then
MESSAGE:New( Message, MessageDuration , MessageCategory):ToClient( self )
self.Messages[MessageID].MessageTime = timer.getTime()
end
else
if timer.getTime() - self.Messages[MessageID].MessageTime >= self.Messages[MessageID].MessageDuration + self.Messages[MessageID].MessageInterval then
MESSAGE:New( Message, MessageDuration, MessageCategory ):ToClient( self )
self.Messages[MessageID].MessageTime = timer.getTime()
end
end
end
else
if self:GetClientGroupDCSUnit() and not self:GetClientGroupDCSUnit():inAir() then
if timer.getTime() - self.Messages[MessageId].MessageTime >= self.Messages[MessageId].MessageDuration + 10 then
MESSAGE:New( Message, MessageDuration , MessageCategory):ToClient( self )
self.Messages[MessageId].MessageTime = timer.getTime()
end
else
if timer.getTime() - self.Messages[MessageId].MessageTime >= self.Messages[MessageId].MessageDuration + self.Messages[MessageId].MessageInterval then
MESSAGE:New( Message, MessageDuration, MessageCategory ):ToClient( self )
self.Messages[MessageId].MessageTime = timer.getTime()
end
end
end
MESSAGE:New( Message, MessageDuration, MessageCategory ):ToClient( self )
end
end
end

View File

@ -82,11 +82,11 @@ MISSILETRAINER = {
function MISSILETRAINER._Alive( Client, self )
if self.Briefing then
Client:Message( self.Briefing, 15, "HELLO WORLD", "Trainer" )
Client:Message( self.Briefing, 15, "Trainer" )
end
if self.MenusOnOff == true then
Client:Message( "Use the 'Radio Menu' -> 'Other (F10)' -> 'Missile Trainer' menu options to change the Missile Trainer settings (for all players).", 15, "MENU", "Trainer" )
Client:Message( "Use the 'Radio Menu' -> 'Other (F10)' -> 'Missile Trainer' menu options to change the Missile Trainer settings (for all players).", 15, "Trainer" )
Client.MainMenu = MENU_CLIENT:New( Client, "Missile Trainer", nil ) -- Menu#MENU_CLIENT

View File

@ -137,7 +137,7 @@ function MISSION:StatusToClients()
self:F()
if self.MissionReportFlash then
for ClientID, Client in pairs( self._Clients ) do
Client:Message( self.MissionCoalition .. ' "' .. self.Name .. '": ' .. self.MissionStatus .. '! ( ' .. self.MissionPriority .. ' mission ) ', 10, self.Name .. '/Status', "Mission Command: Mission Status")
Client:Message( self.MissionCoalition .. ' "' .. self.Name .. '": ' .. self.MissionStatus .. '! ( ' .. self.MissionPriority .. ' mission ) ', 10, "Mission Command: Mission Status")
end
end
end

View File

@ -36,6 +36,7 @@ Include.File( "Sead" )
Include.File( "Escort" )
Include.File( "MissileTrainer" )
Include.File( "AIBalancer" )
Include.File( "AirbasePolice" )

View File

@ -1,34 +1,34 @@
--- Models time events calling event handing functions.
--
-- @{SCHEDULER} class
-- ===================
-- The @{SCHEDULER} class models time events calling given event handling functions.
--
-- SCHEDULER constructor
-- =====================
--- This module contains the SCHEDULER class.
--
-- 1) @{Scheduler#SCHEDULER} class, extends @{Base#BASE}
-- =====================================================
-- The @{Scheduler#SCHEDULER} class models time events calling given event handling functions.
--
-- 1.1) SCHEDULER constructor
-- --------------------------
-- The SCHEDULER class is quite easy to use:
--
-- * @{#SCHEDULER.New}: Setup a new scheduler and start it with the specified parameters.
--
-- SCHEDULER timer methods
-- =======================
--
-- * @{Scheduler#SCHEDULER.New}: Setup a new scheduler and start it with the specified parameters.
--
-- 1.2) SCHEDULER timer stop and start
-- -----------------------------------
-- The SCHEDULER can be stopped and restarted with the following methods:
--
-- * @{#SCHEDULER.Start}: (Re-)Start the scheduler.
-- * @{#SCHEDULER.Start}: Stop the scheduler.
--
--
-- * @{Scheduler#SCHEDULER.Start}: (Re-)Start the scheduler.
-- * @{Scheduler#SCHEDULER.Stop}: Stop the scheduler.
--
-- @module Scheduler
-- @author FlightControl
--- The SCHEDULER class
-- @type SCHEDULER
-- @field #number ScheduleID the ID of the scheduler.
-- @extends Base#BASE
SCHEDULER = {
ClassName = "SCHEDULER",
}
--- Constructor.
--- SCHEDULER constructor.
-- @param #SCHEDULER self
-- @param #table TimeEventObject Specified for which Moose object the timer is setup. If a value of nil is provided, a scheduler will be setup without an object reference.
-- @param #function TimeEventFunction The event function to be called when a timer event occurs. The event function needs to accept the parameters specified in TimeEventFunctionArguments.
@ -63,10 +63,10 @@ function SCHEDULER:New( TimeEventObject, TimeEventFunction, TimeEventFunctionArg
if StopSeconds then
self.StopSeconds = StopSeconds
end
self.StartTime = timer.getTime()
self:Start()
return self
@ -77,12 +77,12 @@ end
-- @return #SCHEDULER self
function SCHEDULER:Start()
self:F2( self.TimeEventObject )
if self.RepeatSecondsInterval ~= 0 then
self.Repeat = true
end
timer.scheduleFunction( self._Scheduler, self, timer.getTime() + self.StartSeconds + .01 )
if self.RepeatSecondsInterval ~= 0 then
self.Repeat = true
end
self.ScheduleID = timer.scheduleFunction( self._Scheduler, self, timer.getTime() + self.StartSeconds + .01 )
return self
end
@ -91,17 +91,22 @@ end
-- @return #SCHEDULER self
function SCHEDULER:Stop()
self:F2( self.TimeEventObject )
self.Repeat = false
if self.ScheduleID then
timer.removeFunction( self.ScheduleID )
end
self.ScheduleID = nil
return self
end
-- Private Functions
--- @param #SCHEDULER self
function SCHEDULER:_Scheduler()
self:F2( self.TimeEventFunctionArguments )
local ErrorHandler = function( errmsg )
env.info( "Error in SCHEDULER function:" .. errmsg )
@ -110,27 +115,37 @@ function SCHEDULER:_Scheduler()
return errmsg
end
local Status, Result
local Status, Result
if self.TimeEventObject then
Status, Result = xpcall( function() return self.TimeEventFunction( self.TimeEventObject, unpack( self.TimeEventFunctionArguments ) ) end, ErrorHandler )
else
Status, Result = xpcall( function() return self.TimeEventFunction( unpack( self.TimeEventFunctionArguments ) ) end, ErrorHandler )
end
self:T( { Status, Result, self.StartTime, self.RepeatSecondsInterval, self.RandomizationFactor, self.StopSeconds } )
self:T( { self.TimeEventFunctionArguments, Status, Result, self.StartTime, self.RepeatSecondsInterval, self.RandomizationFactor, self.StopSeconds } )
if Status and ( ( Result == nil ) or ( Result and Result ~= false ) ) then
if self.Repeat and ( not self.StopSeconds or ( self.StopSeconds and timer.getTime() <= self.StartTime + self.StopSeconds ) ) then
local ScheduleTime = timer.getTime() + self.RepeatSecondsInterval + math.random( - ( self.RandomizationFactor * self.RepeatSecondsInterval / 2 ), ( self.RandomizationFactor * self.RepeatSecondsInterval / 2 ) ) + 0.01
self:T( { timer.getTime(), ScheduleTime } )
timer.scheduleFunction(
self._Scheduler,
self,
ScheduleTime
)
local ScheduleTime =
timer.getTime() +
self.RepeatSecondsInterval +
math.random(
- ( self.RandomizationFactor * self.RepeatSecondsInterval / 2 ),
( self.RandomizationFactor * self.RepeatSecondsInterval / 2 )
) +
0.01
self:T( { self.TimeEventFunctionArguments, "Repeat:", timer.getTime(), ScheduleTime } )
return ScheduleTime -- returns the next time the function needs to be called.
else
timer.removeFunction( self.ScheduleID )
self.ScheduleID = nil
end
else
timer.removeFunction( self.ScheduleID )
self.ScheduleID = nil
end
return nil
end
@ -140,3 +155,11 @@ end

View File

@ -1464,14 +1464,14 @@ end
-- @param Zone#ZONE ZoneObject The Zone to be tested for.
-- @param #function IteratorFunction The function that will be called when there is an alive CLIENT in the SET_CLIENT. The function needs to accept a CLIENT parameter.
-- @return #SET_CLIENT self
function SET_CLIENT:ForEachClientCompletelyInZone( ZoneObject, IteratorFunction, ... )
function SET_CLIENT:ForEachClientInZone( ZoneObject, IteratorFunction, ... )
self:F2( arg )
self:ForEach( IteratorFunction, arg, self.Set,
--- @param Zone#ZONE_BASE ZoneObject
-- @param Client#CLIENT ClientObject
function( ZoneObject, ClientObject )
if ClientObject:IsCompletelyInZone( ZoneObject ) then
if ClientObject:IsInZone( ZoneObject ) then
return true
else
return false

View File

@ -113,9 +113,9 @@ function STAGESTART:Execute( Mission, Client, Task )
self:F()
local Valid = BASE:Inherited(self):Execute( Mission, Client, Task )
if Task.TaskBriefing then
Client:Message( Task.TaskBriefing, 30, Mission.Name .. "/Stage", "Command" )
Client:Message( Task.TaskBriefing, 30, "Command" )
else
Client:Message( 'Task ' .. Task.TaskNumber .. '.', 30, Mission.Name .. "/Stage", "Command" )
Client:Message( 'Task ' .. Task.TaskNumber .. '.', 30, "Command" )
end
self.StageStartTime = timer.getTime()
return Valid
@ -242,9 +242,9 @@ function STAGEROUTE:Execute( Mission, Client, Task )
end
if Client:IsMultiSeated() then
Client:Message( RouteMessage, self.MSG.TIME, Mission.Name .. "/StageRoute", "Co-Pilot", 20 )
Client:Message( RouteMessage, self.MSG.TIME, "Co-Pilot", 20, "Route" )
else
Client:Message( RouteMessage, self.MSG.TIME, Mission.Name .. "/StageRoute", "Command", 20 )
Client:Message( RouteMessage, self.MSG.TIME, "Command", 20, "Route" )
end
@ -307,9 +307,9 @@ function STAGELANDING:Execute( Mission, Client, Task )
self:F()
if Client:IsMultiSeated() then
Client:Message( "We have arrived at the landing zone.", self.MSG.TIME, Mission.Name .. "/StageArrived", "Co-Pilot", 10 )
Client:Message( "We have arrived at the landing zone.", self.MSG.TIME, "Co-Pilot" )
else
Client:Message( "You have arrived at the landing zone.", self.MSG.TIME, Mission.Name .. "/StageArrived", "Command", 10 )
Client:Message( "You have arrived at the landing zone.", self.MSG.TIME, "Command" )
end
Task.HostUnit = Task.CurrentCargoZone:GetHostUnit()
@ -363,7 +363,7 @@ function STAGELANDING:Execute( Mission, Client, Task )
end
end
Client:Message( HostMessage, self.MSG.TIME, Mission.Name .. "/STAGELANDING.EXEC." .. Host, Host, 10 )
Client:Message( HostMessage, self.MSG.TIME, Host )
end
end
@ -453,7 +453,7 @@ function STAGELANDED:Execute( Mission, Client, Task )
end
Client:Message( 'You have landed within the landing zone. Use the radio menu (F10) to ' .. Task.TEXT[1] .. ' the ' .. Task.CargoType .. '.',
self.MSG.TIME, Mission.Name .. "/STAGELANDED.EXEC" .. Host, Host )
self.MSG.TIME, Host )
if not self.MenusAdded then
Task.Cargo = nil
@ -532,10 +532,10 @@ function STAGEUNLOAD:Execute( Mission, Client, Task )
if Client:IsMultiSeated() then
Client:Message( 'The ' .. Task.CargoType .. ' are being ' .. Task.TEXT[2] .. ' within the landing zone. Wait until the helicopter is ' .. Task.TEXT[3] .. '.',
self.MSG.TIME, Mission.Name .. "/StageUnLoad", "Co-Pilot" )
"Co-Pilot" )
else
Client:Message( 'You are unloading the ' .. Task.CargoType .. ' ' .. Task.TEXT[2] .. ' within the landing zone. Wait until the helicopter is ' .. Task.TEXT[3] .. '.',
self.MSG.TIME, Mission.Name .. "/StageUnLoad", "Command" )
"Command" )
end
Task:RemoveCargoMenus( Client )
end
@ -575,10 +575,10 @@ function STAGEUNLOAD:Validate( Mission, Client, Task )
Task:RemoveCargoMenus( Client )
if Client:IsMultiSeated() then
Client:Message( 'The ' .. Task.CargoType .. " haven't been successfully " .. Task.TEXT[3] .. ' within the landing zone. Task and mission has failed.',
_TransportStageMsgTime.DONE, Mission.Name .. "/StageFailure", "Co-Pilot" )
_TransportStageMsgTime.DONE, "Co-Pilot" )
else
Client:Message( 'The ' .. Task.CargoType .. " haven't been successfully " .. Task.TEXT[3] .. ' within the landing zone. Task and mission has failed.',
_TransportStageMsgTime.DONE, Mission.Name .. "/StageFailure", "Command" )
_TransportStageMsgTime.DONE, "Command" )
end
return 1
end
@ -589,19 +589,19 @@ function STAGEUNLOAD:Validate( Mission, Client, Task )
Task:RemoveCargoMenus( Client )
if Client:IsMultiSeated() then
Client:Message( 'The ' .. Task.CargoType .. " haven't been successfully " .. Task.TEXT[3] .. ' within the landing zone. Task and mission has failed.',
_TransportStageMsgTime.DONE, Mission.Name .. "/StageFailure", "Co-Pilot" )
_TransportStageMsgTime.DONE, "Co-Pilot" )
else
Client:Message( 'The ' .. Task.CargoType .. " haven't been successfully " .. Task.TEXT[3] .. ' within the landing zone. Task and mission has failed.',
_TransportStageMsgTime.DONE, Mission.Name .. "/StageFailure", "Command" )
_TransportStageMsgTime.DONE, "Command" )
end
return 1
end
if Task.ExecuteStage == _TransportExecuteStage.SUCCESS then
if Client:IsMultiSeated() then
Client:Message( 'The ' .. Task.CargoType .. ' have been sucessfully ' .. Task.TEXT[3] .. ' within the landing zone.', _TransportStageMsgTime.DONE, Mission.Name .. "/Stage", "Co-Pilot" )
Client:Message( 'The ' .. Task.CargoType .. ' have been sucessfully ' .. Task.TEXT[3] .. ' within the landing zone.', _TransportStageMsgTime.DONE, "Co-Pilot" )
else
Client:Message( 'The ' .. Task.CargoType .. ' have been sucessfully ' .. Task.TEXT[3] .. ' within the landing zone.', _TransportStageMsgTime.DONE, Mission.Name .. "/Stage", "Command" )
Client:Message( 'The ' .. Task.CargoType .. ' have been sucessfully ' .. Task.TEXT[3] .. ' within the landing zone.', _TransportStageMsgTime.DONE, "Command" )
end
Task:RemoveCargoMenus( Client )
Task.MissionTask:AddGoalCompletion( Task.MissionTask.GoalVerb, Task.CargoName, 1 ) -- We set the cargo as one more goal completed in the mission.
@ -639,7 +639,7 @@ function STAGELOAD:Execute( Mission, Client, Task )
end
Client:Message( 'The ' .. Task.CargoType .. ' are being ' .. Task.TEXT[2] .. ' within the landing zone. Wait until the helicopter is ' .. Task.TEXT[3] .. '.',
_TransportStageMsgTime.EXECUTING, Mission.Name .. "/STAGELOAD.EXEC." .. Host, Host )
_TransportStageMsgTime.EXECUTING, Host )
-- Route the cargo to the Carrier
@ -674,14 +674,14 @@ function STAGELOAD:Executing( Mission, Client, Task )
-- Message to the pilot that cargo has been loaded.
Client:Message( "The cargo " .. Task.Cargo.CargoName .. " has been loaded in our helicopter.",
20, Mission.Name .. "/STAGELANDING.LOADING1." .. Host, Host )
20, Host )
Task.ExecuteStage = _TransportExecuteStage.SUCCESS
Client:ShowCargo()
end
else
Client:Message( "Hook the " .. Task.CargoNames .. " onto the helicopter " .. Task.TEXT[3] .. " within the landing zone.",
_TransportStageMsgTime.EXECUTING, Mission.Name .. "/STAGELOAD.LOADING.1." .. Host, Host , 10 )
_TransportStageMsgTime.EXECUTING, Host )
for CargoID, Cargo in pairs( CARGOS ) do
self:T( "Cargo.CargoName = " .. Cargo.CargoName )
@ -697,7 +697,7 @@ function STAGELOAD:Executing( Mission, Client, Task )
Cargo:StatusLoaded()
Task.Cargo = Cargo
Client:Message( 'The Cargo has been successfully hooked onto the helicopter and is now being sling loaded. Fly outside the landing zone.',
self.MSG.TIME, Mission.Name .. "/STAGELANDING.LOADING.2." .. Host, Host )
self.MSG.TIME, Host )
Task.ExecuteStage = _TransportExecuteStage.SUCCESS
break
end
@ -730,7 +730,7 @@ function STAGELOAD:Validate( Mission, Client, Task )
Task.ExecuteStage = _TransportExecuteStage.FAILED
Task.CargoName = nil
Client:Message( "The " .. Task.CargoType .. " loading has been aborted. You flew outside the pick-up zone while loading. ",
self.MSG.TIME, Mission.Name .. "/STAGELANDING.VALIDATE.1." .. Host, Host )
self.MSG.TIME, Host )
self:T( -1 )
return -1
end
@ -748,7 +748,7 @@ function STAGELOAD:Validate( Mission, Client, Task )
Task.ExecuteStage = _TransportExecuteStage.FAILED
Task.CargoName = nil
Client:Message( "The " .. Task.CargoType .. " loading has been aborted. Re-start the " .. Task.TEXT[3] .. " process. Don't fly outside the pick-up zone.",
self.MSG.TIME, Mission.Name .. "/STAGELANDING.VALIDATE.1." .. Host, Host )
self.MSG.TIME, Host )
self:T( -1 )
return -1
end
@ -759,7 +759,7 @@ function STAGELOAD:Validate( Mission, Client, Task )
Task.ExecuteStage = _TransportExecuteStage.FAILED
Task.CargoName = nil
Client:Message( "The " .. Task.CargoType .. " loading has been aborted. Re-start the " .. Task.TEXT[3] .. " process. Don't fly outside the pick-up zone.",
self.MSG.TIME, Mission.Name .. "/STAGELANDING.VALIDATE.1." .. Host, Host )
self.MSG.TIME, Host )
self:T( -1 )
return -1
end
@ -767,7 +767,7 @@ function STAGELOAD:Validate( Mission, Client, Task )
if Task.ExecuteStage == _TransportExecuteStage.SUCCESS then
Task:RemoveCargoMenus( Client )
Client:Message( "Good Job. The " .. Task.CargoType .. " has been sucessfully " .. Task.TEXT[3] .. " within the landing zone.",
self.MSG.TIME, Mission.Name .. "/STAGELANDING.VALIDATE.3." .. Host, Host )
self.MSG.TIME, Host )
Task.MissionTask:AddGoalCompletion( Task.MissionTask.GoalVerb, Task.CargoName, 1 )
self:T( 1 )
return 1
@ -778,7 +778,7 @@ function STAGELOAD:Validate( Mission, Client, Task )
CargoStatic = StaticObject.getByName( Task.Cargo.CargoStaticName )
if CargoStatic and not routines.IsStaticInZones( CargoStatic, Task.CurrentLandingZoneName ) then
Client:Message( "Good Job. The " .. Task.CargoType .. " has been sucessfully " .. Task.TEXT[3] .. " and flown outside of the landing zone.",
self.MSG.TIME, Mission.Name .. "/STAGELANDING.VALIDATE.4." .. Host, Host )
self.MSG.TIME, Host )
Task.MissionTask:AddGoalCompletion( Task.MissionTask.GoalVerb, Task.Cargo.CargoName, 1 )
self:T( 1 )
return 1
@ -842,9 +842,9 @@ function STAGEARRIVE:Execute( Mission, Client, Task )
self:F()
if Client:IsMultiSeated() then
Client:Message( 'We have arrived at ' .. Task.CurrentLandingZoneName .. ".", self.MSG.TIME, Mission.Name .. "/Stage", "Co-Pilot" )
Client:Message( 'We have arrived at ' .. Task.CurrentLandingZoneName .. ".", self.MSG.TIME, "Co-Pilot" )
else
Client:Message( 'We have arrived at ' .. Task.CurrentLandingZoneName .. ".", self.MSG.TIME, Mission.Name .. "/Stage", "Command" )
Client:Message( 'We have arrived at ' .. Task.CurrentLandingZoneName .. ".", self.MSG.TIME, "Command" )
end
end

View File

@ -131,7 +131,7 @@ function TASK:ShowGoalProgress( Mission, Client )
end
if Mission.MissionReportFlash or Mission.MissionReportShow then
Client:Message( GoalsText, 10, "/TASKPROGRESS" .. self.ClassName, "Mission Command: Task Status", 30 )
Client:Message( GoalsText, 10, "Mission Command: Task Status", 30, "Task status" )
end
end

View File

@ -155,13 +155,13 @@ function UNIT:FindByName( UnitName )
end
function UNIT:GetDCSUnit()
local DCSUnit = Unit.getByName( self.UnitName )
if DCSUnit then
return DCSUnit
end
self:E( "Unit " .. self.UnitName .. " not found!" )
return nil
end
@ -256,6 +256,30 @@ function UNIT:IsActive()
return nil
end
--- Returns if the unit is located above a runway.
-- @param Unit#UNIT self
-- @return #boolean true if Unit is above a runway.
-- @return #nil The DCS Unit is not existing or alive.
function UNIT:IsAboveRunway()
self:F2( self.UnitName )
local DCSUnit = self:GetDCSUnit()
if DCSUnit then
local PointVec2 = self:GetPointVec2()
local SurfaceType = land.getSurfaceType( PointVec2 )
local IsAboveRunway = SurfaceType == land.SurfaceType.RUNWAY
self:T2( IsAboveRunway )
return IsAboveRunway
end
return nil
end
--- Returns name of the player that control the unit or nil if the unit is controlled by A.I.
-- @param Unit#UNIT self
-- @return #string Player Name
@ -324,7 +348,7 @@ function UNIT:GetGroup()
local DCSUnit = self:GetDCSUnit()
if DCSUnit then
local UnitGroup = DCSUnit:getGroup()
local UnitGroup = GROUP:Find( DCSUnit:getGroup() )
return UnitGroup
end
@ -609,10 +633,14 @@ end
function UNIT:IsInZone( Zone )
self:F2( { self.UnitName, Zone } )
local IsInZone = Zone:IsPointVec3InZone( self:GetPointVec3() )
if self:IsAlive() then
local IsInZone = Zone:IsPointVec3InZone( self:GetPointVec3() )
self:T( { IsInZone } )
return IsInZone
self:T( { IsInZone } )
return IsInZone
else
return false
end
end
--- Returns true if the unit is not within a @{Zone}.
@ -622,10 +650,14 @@ end
function UNIT:IsNotInZone( Zone )
self:F2( { self.UnitName, Zone } )
local IsInZone = not Zone:IsPointVec3InZone( self:GetPointVec3() )
self:T( { IsInZone } )
return IsInZone
if self:IsAlive() then
local IsInZone = not Zone:IsPointVec3InZone( self:GetPointVec3() )
self:T( { IsInZone } )
return IsInZone
else
return false
end
end
--- Returns true if the DCS Unit is in the air.

View File

@ -71,6 +71,7 @@
--- The ZONE_BASE class
-- @type ZONE_BASE
-- @field #string ZoneName Name of the zone.
-- @extends Base#BASE
ZONE_BASE = {
ClassName = "ZONE_BASE",
@ -380,43 +381,60 @@ function ZONE_UNIT:GetPointVec2()
return ZonePointVec2
end
-- Polygons
--- The ZONE_POLYGON class defined by a sequence of @{Group#GROUP} waypoints within the Mission Editor, forming a polygon.
-- @type ZONE_POLYGON
--- The ZONE_POLYGON_BASE class defined by an array of @{DCSTypes#Vec2}, forming a polygon.
-- @type ZONE_POLYGON_BASE
-- @field #ZONE_POLYGON_BASE.ListVec2 Polygon The polygon defined by an array of @{DCSTypes#Vec2}.
-- @extends Zone#ZONE_BASE
ZONE_POLYGON = {
ClassName="ZONE_POLYGON",
ZONE_POLYGON_BASE = {
ClassName="ZONE_POLYGON_BASE",
}
--- Constructor to create a ZONE_POLYGON instance, taking the zone name and the name of the @{Group#GROUP} defined within the Mission Editor.
-- The @{Group#GROUP} waypoints define the polygon corners. The first and the last point are automatically connected by ZONE_POLYGON.
-- @param #ZONE_POLYGON self
-- @param #string ZoneName Name of the zone.
-- @param Group#GROUP ZoneGroup The GROUP waypoints as defined within the Mission Editor define the polygon shape.
-- @return #ZONE_POLYGON self
function ZONE_POLYGON:New( ZoneName, ZoneGroup )
local self = BASE:Inherit( self, ZONE_BASE:New( ZoneName ) )
self:F( { ZoneName, ZoneGroup } )
--- A points array.
-- @type ZONE_POLYGON_BASE.ListVec2
-- @list <DCSTypes#Vec2>
--- Constructor to create a ZONE_POLYGON_BASE instance, taking the zone name and an array of @{DCSTypes#Vec2}, forming a polygon.
-- The @{Group#GROUP} waypoints define the polygon corners. The first and the last point are automatically connected.
-- @param #ZONE_POLYGON_BASE self
-- @param #string ZoneName Name of the zone.
-- @param #ZONE_POLYGON_BASE.ListVec2 PointsArray An array of @{DCSTypes#Vec2}, forming a polygon..
-- @return #ZONE_POLYGON_BASE self
function ZONE_POLYGON_BASE:New( ZoneName, PointsArray )
local self = BASE:Inherit( self, ZONE_BASE:New( ZoneName ) )
self:F( { ZoneName, PointsArray } )
local GroupPoints = ZoneGroup:GetTaskRoute()
local i = 0
self.Polygon = {}
for i = 1, #GroupPoints do
for i = 1, #PointsArray do
self.Polygon[i] = {}
self.Polygon[i].x = GroupPoints[i].x
self.Polygon[i].y = GroupPoints[i].y
self.Polygon[i].x = PointsArray[i].x
self.Polygon[i].y = PointsArray[i].y
end
return self
end
--- Flush polygon coordinates as a table in DCS.log.
-- @param #ZONE_POLYGON_BASE self
-- @return #ZONE_POLYGON_BASE self
function ZONE_POLYGON_BASE:Flush()
self:F2()
self:E( { Polygon = self.ZoneName, Coordinates = self.Polygon } )
return self
end
--- Smokes the zone boundaries in a color.
-- @param #ZONE_POLYGON self
-- @param #ZONE_POLYGON_BASE self
-- @param #POINT_VEC3.SmokeColor SmokeColor The smoke color.
-- @return #ZONE_POLYGON self
function ZONE_POLYGON:SmokeZone( SmokeColor )
-- @return #ZONE_POLYGON_BASE self
function ZONE_POLYGON_BASE:SmokeZone( SmokeColor )
self:F2( SmokeColor )
local i
@ -448,10 +466,10 @@ end
--- Returns if a location is within the zone.
-- @param #ZONE_POLYGON self
-- @param #ZONE_POLYGON_BASE self
-- @param DCSTypes#Vec2 PointVec2 The location to test.
-- @return #boolean true if the location is within the zone.
function ZONE_POLYGON:IsPointVec2InZone( PointVec2 )
function ZONE_POLYGON_BASE:IsPointVec2InZone( PointVec2 )
self:F2( PointVec2 )
local i
@ -477,3 +495,29 @@ function ZONE_POLYGON:IsPointVec2InZone( PointVec2 )
return c
end
--- The ZONE_POLYGON class defined by a sequence of @{Group#GROUP} waypoints within the Mission Editor, forming a polygon.
-- @type ZONE_POLYGON
-- @extends Zone#ZONE_POLYGON_BASE
ZONE_POLYGON = {
ClassName="ZONE_POLYGON",
}
--- Constructor to create a ZONE_POLYGON instance, taking the zone name and the name of the @{Group#GROUP} defined within the Mission Editor.
-- The @{Group#GROUP} waypoints define the polygon corners. The first and the last point are automatically connected by ZONE_POLYGON.
-- @param #ZONE_POLYGON self
-- @param #string ZoneName Name of the zone.
-- @param Group#GROUP ZoneGroup The GROUP waypoints as defined within the Mission Editor define the polygon shape.
-- @return #ZONE_POLYGON self
function ZONE_POLYGON:New( ZoneName, ZoneGroup )
local GroupPoints = ZoneGroup:GetTaskRoute()
local self = BASE:Inherit( self, ZONE_POLYGON_BASE:New( ZoneName, GroupPoints ) )
self:F( { ZoneName, ZoneGroup, self.Polygon } )
return self
end

View File

@ -0,0 +1,2 @@
BASE:TraceOnOff( true )

View File

@ -1,13 +1,7 @@
local base = _G
Include = {}
Include.Path = function()
local str = debug.getinfo(2, "S").source
return str:match("(.*/)"):sub(1,-2):gsub("\\","/")
end
Include.Files = {}
Include.File = function( IncludeFile )
end
Include.Files = {}

View File

@ -0,0 +1,2 @@
BASE:TraceOnOff( false )

File diff suppressed because it is too large Load Diff

View File

@ -19,10 +19,11 @@ GOTO End
ECHO Dynamic Moose.lua
REM Create a timestamp with is logged in the DCS.log file.
ECHO env.info( '*** MOOSE DYNAMIC INCLUDE START *** ' ) > Moose.lua
ECHO env.info( 'Moose Generation Timestamp: %2' ) >> Moose.lua
ECHO env.info( '*** MOOSE DYNAMIC INCLUDE START *** ' ) > Moose.lua
ECHO env.info( 'Moose Generation Timestamp: %2' ) >> Moose.lua
COPY /b Moose.lua + "Moose Create Dynamic\Moose_Dynamic_Loader.lua" Moose.lua
COPY /b Moose.lua + "Moose Create Dynamic\Moose_Dynamic_Loader.lua" Moose.lua
COPY /b Moose.lua + "Moose Create Dynamic\Moose_Trace_On.lua" Moose.lua
GOTO End
@ -31,52 +32,54 @@ GOTO End
ECHO Static Moose.lua
REM Create a timestamp with is logged in the DCS.log file.
ECHO env.info( '*** MOOSE STATIC INCLUDE START *** ' ) > Moose.lua
ECHO env.info( 'Moose Generation Timestamp: %2' ) >> Moose.lua
ECHO env.info( '*** MOOSE STATIC INCLUDE START *** ' ) > Moose.lua
ECHO env.info( 'Moose Generation Timestamp: %2' ) >> Moose.lua
COPY /b Moose.lua + "Moose Create Static\Moose_Static_Loader.lua" Moose.lua
COPY /b Moose.lua + "Moose Create Static\Moose_Static_Loader.lua" Moose.lua
COPY /b Moose.lua + %1\Routines.lua Moose.lua
COPY /b Moose.lua + %1\Base.lua Moose.lua
COPY /b Moose.lua + %1\Scheduler.lua Moose.lua
COPY /b Moose.lua + %1\Event.lua Moose.lua
COPY /b Moose.lua + %1\Menu.lua Moose.lua
COPY /b Moose.lua + %1\Group.lua Moose.lua
COPY /b Moose.lua + %1\Unit.lua Moose.lua
COPY /b Moose.lua + %1\Zone.lua Moose.lua
COPY /b Moose.lua + %1\Client.lua Moose.lua
COPY /b Moose.lua + %1\Static.lua Moose.lua
COPY /b Moose.lua + %1\Database.lua Moose.lua
COPY /b Moose.lua + %1\Set.lua Moose.lua
COPY /b Moose.lua + %1\Point.lua Moose.lua
COPY /b Moose.lua + %1\Moose.lua Moose.lua
COPY /b Moose.lua + %1\Scoring.lua Moose.lua
COPY /b Moose.lua + %1\Cargo.lua Moose.lua
COPY /b Moose.lua + %1\Message.lua Moose.lua
COPY /b Moose.lua + %1\Stage.lua Moose.lua
COPY /b Moose.lua + %1\Task.lua Moose.lua
COPY /b Moose.lua + %1\GoHomeTask.lua Moose.lua
COPY /b Moose.lua + %1\DestroyBaseTask.lua Moose.lua
COPY /b Moose.lua + %1\DestroyGroupsTask.lua Moose.lua
COPY /b Moose.lua + %1\DestroyRadarsTask.lua Moose.lua
COPY /b Moose.lua + %1\DestroyUnitTypesTask.lua Moose.lua
COPY /b Moose.lua + %1\PickupTask.lua Moose.lua
COPY /b Moose.lua + %1\DeployTask.lua Moose.lua
COPY /b Moose.lua + %1\NoTask.lua Moose.lua
COPY /b Moose.lua + %1\RouteTask.lua Moose.lua
COPY /b Moose.lua + %1\Mission.lua Moose.lua
COPY /b Moose.lua + %1\CleanUp.lua Moose.lua
COPY /b Moose.lua + %1\Spawn.lua Moose.lua
COPY /b Moose.lua + %1\Movement.lua Moose.lua
COPY /b Moose.lua + %1\Sead.lua Moose.lua
COPY /b Moose.lua + %1\Escort.lua Moose.lua
COPY /b Moose.lua + %1\MissileTrainer.lua Moose.lua
COPY /b Moose.lua + %1\AIBalancer.lua Moose.lua
COPY /b Moose.lua + %1\Routines.lua Moose.lua
COPY /b Moose.lua + %1\Base.lua Moose.lua
COPY /b Moose.lua + %1\Scheduler.lua Moose.lua
COPY /b Moose.lua + %1\Event.lua Moose.lua
COPY /b Moose.lua + %1\Menu.lua Moose.lua
COPY /b Moose.lua + %1\Group.lua Moose.lua
COPY /b Moose.lua + %1\Unit.lua Moose.lua
COPY /b Moose.lua + %1\Zone.lua Moose.lua
COPY /b Moose.lua + %1\Client.lua Moose.lua
COPY /b Moose.lua + %1\Static.lua Moose.lua
COPY /b Moose.lua + %1\Database.lua Moose.lua
COPY /b Moose.lua + %1\Set.lua Moose.lua
COPY /b Moose.lua + %1\Point.lua Moose.lua
COPY /b Moose.lua + %1\Moose.lua Moose.lua
COPY /b Moose.lua + %1\Scoring.lua Moose.lua
COPY /b Moose.lua + %1\Cargo.lua Moose.lua
COPY /b Moose.lua + %1\Message.lua Moose.lua
COPY /b Moose.lua + %1\Stage.lua Moose.lua
COPY /b Moose.lua + %1\Task.lua Moose.lua
COPY /b Moose.lua + %1\GoHomeTask.lua Moose.lua
COPY /b Moose.lua + %1\DestroyBaseTask.lua Moose.lua
COPY /b Moose.lua + %1\DestroyGroupsTask.lua Moose.lua
COPY /b Moose.lua + %1\DestroyRadarsTask.lua Moose.lua
COPY /b Moose.lua + %1\DestroyUnitTypesTask.lua Moose.lua
COPY /b Moose.lua + %1\PickupTask.lua Moose.lua
COPY /b Moose.lua + %1\DeployTask.lua Moose.lua
COPY /b Moose.lua + %1\NoTask.lua Moose.lua
COPY /b Moose.lua + %1\RouteTask.lua Moose.lua
COPY /b Moose.lua + %1\Mission.lua Moose.lua
COPY /b Moose.lua + %1\CleanUp.lua Moose.lua
COPY /b Moose.lua + %1\Spawn.lua Moose.lua
COPY /b Moose.lua + %1\Movement.lua Moose.lua
COPY /b Moose.lua + %1\Sead.lua Moose.lua
COPY /b Moose.lua + %1\Escort.lua Moose.lua
COPY /b Moose.lua + %1\MissileTrainer.lua Moose.lua
COPY /b Moose.lua + %1\AIBalancer.lua Moose.lua
COPY /b Moose.lua + "Moose Create Static\Moose_Trace_Off.lua" Moose.lua
GOTO End
:End
ECHO env.info( '*** MOOSE INCLUDE END *** ' ) >> Moose.lua
ECHO env.info( '*** MOOSE INCLUDE END *** ' ) >> Moose.lua
COPY Moose.lua %3

View File

@ -0,0 +1,3 @@
local PlanesClientSet = SET_CLIENT:New():FilterCategories( "plane" ):FilterStart()
local AirbasePolice = AIRBASEPOLICE_CAUCASUS:New( PlanesClientSet )

View File

@ -19,6 +19,7 @@
<ul>
<li>AIBalancer</li>
<li><a href="Airbase.html">Airbase</a></li>
<li><a href="AirbasePolice.html">AirbasePolice</a></li>
<li><a href="Base.html">Base</a></li>
<li><a href="CARGO.html">CARGO</a></li>
<li><a href="CleanUp.html">CleanUp</a></li>

View File

@ -19,6 +19,7 @@
<ul>
<li><a href="AIBalancer.html">AIBalancer</a></li>
<li>Airbase</li>
<li><a href="AirbasePolice.html">AirbasePolice</a></li>
<li><a href="Base.html">Base</a></li>
<li><a href="CARGO.html">CARGO</a></li>
<li><a href="CleanUp.html">CleanUp</a></li>

View File

@ -0,0 +1,246 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html>
<head>
<link rel="stylesheet" href="stylesheet.css" type="text/css"/>
</head>
<body>
<div id="container">
<div id="product">
<div id="product_logo"></div>
<div id="product_name"><big><b></b></big></div>
<div id="product_description"></div>
</div>
<div id="main">
<div id="navigation">
<h2>Modules</h2>
<ul><li>
<a href="index.html">index</a>
</li></ul>
<ul>
<li><a href="AIBalancer.html">AIBalancer</a></li>
<li><a href="Airbase.html">Airbase</a></li>
<li>AirbasePolice</li>
<li><a href="Base.html">Base</a></li>
<li><a href="CARGO.html">CARGO</a></li>
<li><a href="CleanUp.html">CleanUp</a></li>
<li><a href="Client.html">Client</a></li>
<li><a href="DCSAirbase.html">DCSAirbase</a></li>
<li><a href="DCSCoalitionObject.html">DCSCoalitionObject</a></li>
<li><a href="DCSCommand.html">DCSCommand</a></li>
<li><a href="DCSController.html">DCSController</a></li>
<li><a href="DCSGroup.html">DCSGroup</a></li>
<li><a href="DCSObject.html">DCSObject</a></li>
<li><a href="DCSTask.html">DCSTask</a></li>
<li><a href="DCSTypes.html">DCSTypes</a></li>
<li><a href="DCSUnit.html">DCSUnit</a></li>
<li><a href="DCSWorld.html">DCSWorld</a></li>
<li><a href="DCStimer.html">DCStimer</a></li>
<li><a href="DEPLOYTASK.html">DEPLOYTASK</a></li>
<li><a href="DESTROYBASETASK.html">DESTROYBASETASK</a></li>
<li><a href="DESTROYGROUPSTASK.html">DESTROYGROUPSTASK</a></li>
<li><a href="DESTROYRADARSTASK.html">DESTROYRADARSTASK</a></li>
<li><a href="DESTROYUNITTYPESTASK.html">DESTROYUNITTYPESTASK</a></li>
<li><a href="Database.html">Database</a></li>
<li><a href="Escort.html">Escort</a></li>
<li><a href="Event.html">Event</a></li>
<li><a href="GOHOMETASK.html">GOHOMETASK</a></li>
<li><a href="Group.html">Group</a></li>
<li><a href="MOVEMENT.html">MOVEMENT</a></li>
<li><a href="Menu.html">Menu</a></li>
<li><a href="Message.html">Message</a></li>
<li><a href="MissileTrainer.html">MissileTrainer</a></li>
<li><a href="Mission.html">Mission</a></li>
<li><a href="NOTASK.html">NOTASK</a></li>
<li><a href="PICKUPTASK.html">PICKUPTASK</a></li>
<li><a href="Point.html">Point</a></li>
<li><a href="ROUTETASK.html">ROUTETASK</a></li>
<li><a href="STAGE.html">STAGE</a></li>
<li><a href="Scheduler.html">Scheduler</a></li>
<li><a href="Scoring.html">Scoring</a></li>
<li><a href="Sead.html">Sead</a></li>
<li><a href="Set.html">Set</a></li>
<li><a href="Spawn.html">Spawn</a></li>
<li><a href="Static.html">Static</a></li>
<li><a href="StaticObject.html">StaticObject</a></li>
<li><a href="TASK.html">TASK</a></li>
<li><a href="Unit.html">Unit</a></li>
<li><a href="Zone.html">Zone</a></li>
<li><a href="env.html">env</a></li>
<li><a href="land.html">land</a></li>
<li><a href="routines.html">routines</a></li>
</ul>
</div>
<div id="content">
<h1>Module <code>AirbasePolice</code></h1>
<p>This module contains the AIRBASEPOLICE classes.</p>
<hr/>
<h1>1) <a href="AirbasePolice.html##(AIRBASEPOLICE_BASE)">AirbasePolice#AIRBASEPOLICE_BASE</a> class, extends <a href="Base.html##(BASE)">Base#BASE</a></h1>
<p>The <a href="AirbasePolice.html##(AIRBASEPOLICE_BASE)">AirbasePolice#AIRBASEPOLICE_BASE</a> class provides the main methods to monitor CLIENT behaviour at airbases.
CLIENTS should not be allowed to:</p>
<ul>
<li>Don't taxi faster than 40 km/h.</li>
<li>Don't take-off on taxiways.</li>
<li>Avoid to hit other planes on the airbase.</li>
<li>Obey ground control orders.</li>
</ul>
<h1>2) <a href="AirbasePolice.html##(AIRBASEPOLICE_CAUCASUS)">AirbasePolice#AIRBASEPOLICE_CAUCASUS</a> class, extends <a href="AirbasePolice.html##(AIRBASEPOLICE_BASE)">AirbasePolice#AIRBASEPOLICE_BASE</a></h1>
<p>All the airbases on the caucasus map can be monitored using this class.
If you want to monitor specific airbases, you need to use the <a href="##(AIRBASEPOLICE_BASE).Monitor">AIRBASEPOLICE_BASE.Monitor</a>() method, which takes a table or airbase names.
The following names can be given:
* AnapaVityazevo
* Batumi
* Beslan
* Gelendzhik
* Gudauta
* Kobuleti
* KrasnodarCenter
* KrasnodarPashkovsky
* Krymsk
* Kutaisi
* MaykopKhanskaya
* MineralnyeVody
* Mozdok
* Nalchik
* Novorossiysk
* SenakiKolkhi
* SochiAdler
* Soganlug
* SukhumiBabushara
* TbilisiLochini
* Vaziani
</p>
<h2>Global(s)</h2>
<table class="function_list">
<tr>
<td class="name" nowrap="nowrap"><a href="#AIRBASEPOLICE_BASE">AIRBASEPOLICE_BASE</a></td>
<td class="summary">
</td>
</tr>
<tr>
<td class="name" nowrap="nowrap"><a href="#AIRBASEPOLICE_CAUCASUS">AIRBASEPOLICE_CAUCASUS</a></td>
<td class="summary">
</td>
</tr>
</table>
<h2><a id="#(AIRBASEPOLICE_BASE)">Type <code>AIRBASEPOLICE_BASE</code></a></h2>
<table class="function_list">
<tr>
<td class="name" nowrap="nowrap"><a href="##(AIRBASEPOLICE_BASE).AirbaseNames">AIRBASEPOLICE_BASE.AirbaseNames</a></td>
<td class="summary">
</td>
</tr>
<tr>
<td class="name" nowrap="nowrap"><a href="##(AIRBASEPOLICE_BASE).SetClient">AIRBASEPOLICE_BASE.SetClient</a></td>
<td class="summary">
</td>
</tr>
</table>
<h2><a id="#(AIRBASEPOLICE_CAUCASUS)">Type <code>AIRBASEPOLICE_CAUCASUS</code></a></h2>
<table class="function_list">
<tr>
<td class="name" nowrap="nowrap"><a href="##(AIRBASEPOLICE_CAUCASUS).SetClient">AIRBASEPOLICE_CAUCASUS.SetClient</a></td>
<td class="summary">
</td>
</tr>
</table>
<h2>Global(s)</h2>
<dl class="function">
<dt>
<em></em>
<a id="AIRBASEPOLICE_BASE" >
<strong>AIRBASEPOLICE_BASE</strong>
</a>
</dt>
<dd>
</dd>
</dl>
<dl class="function">
<dt>
<em></em>
<a id="AIRBASEPOLICE_CAUCASUS" >
<strong>AIRBASEPOLICE_CAUCASUS</strong>
</a>
</dt>
<dd>
</dd>
</dl>
<h2><a id="#(AirbasePolice)" >Type <code>AirbasePolice</code></a></h2>
<h2><a id="#(AIRBASEPOLICE_BASE)" >Type <code>AIRBASEPOLICE_BASE</code></a></h2>
<h3>Field(s)</h3>
<dl class="function">
<dt>
<em></em>
<a id="#(AIRBASEPOLICE_BASE).AirbaseNames" >
<strong>AIRBASEPOLICE_BASE.AirbaseNames</strong>
</a>
</dt>
<dd>
</dd>
</dl>
<dl class="function">
<dt>
<em><a href="Set.html##(SET_CLIENT)">Set#SET_CLIENT</a></em>
<a id="#(AIRBASEPOLICE_BASE).SetClient" >
<strong>AIRBASEPOLICE_BASE.SetClient</strong>
</a>
</dt>
<dd>
</dd>
</dl>
<h2><a id="#(AIRBASEPOLICE_BASE.AirbaseNames)" >Type <code>AIRBASEPOLICE_BASE.AirbaseNames</code></a></h2>
<h2><a id="#(AIRBASEPOLICE_CAUCASUS)" >Type <code>AIRBASEPOLICE_CAUCASUS</code></a></h2>
<h3>Field(s)</h3>
<dl class="function">
<dt>
<em><a href="Set.html##(SET_CLIENT)">Set#SET_CLIENT</a></em>
<a id="#(AIRBASEPOLICE_CAUCASUS).SetClient" >
<strong>AIRBASEPOLICE_CAUCASUS.SetClient</strong>
</a>
</dt>
<dd>
</dd>
</dl>
</div>
</div>
</body>
</html>

View File

@ -19,6 +19,7 @@
<ul>
<li><a href="AIBalancer.html">AIBalancer</a></li>
<li><a href="Airbase.html">Airbase</a></li>
<li><a href="AirbasePolice.html">AirbasePolice</a></li>
<li>Base</li>
<li><a href="CARGO.html">CARGO</a></li>
<li><a href="CleanUp.html">CleanUp</a></li>
@ -72,37 +73,40 @@
<div id="content">
<h1>Module <code>Base</code></h1>
<p>BASE classes.</p>
<p>This module contains the BASE class.</p>
<h1><a href="##(BASE)">#BASE</a> class</h1>
<p>The <a href="##(BASE)">#BASE</a> class is the super class for most of the classes defined within MOOSE.</p>
<h1>1) <a href="##(BASE)">#BASE</a> class</h1>
<p>The <a href="##(BASE)">#BASE</a> class is the super class for all the classes defined within MOOSE.</p>
<p>It handles:</p>
<ul>
<li>The construction and inheritance of child classes.</li>
<li>The tracing of objects during mission execution within the DCS.log file (under saved games folder).</li>
<li>The tracing of objects during mission execution within the <strong>DCS.log</strong> file, under the <strong>"Saved Games\DCS\Logs"</strong> folder.</li>
</ul>
<p>Note: Normally you would not use the BASE class unless you are extending the MOOSE framework with new classes.</p>
<h1>BASE Trace functionality</h1>
<h2>1.1) BASE constructor</h2>
<p>Any class derived from BASE, must use the <a href="Base.html##(BASE).New">Base#BASE.New</a> method how this is done.</p>
<h2>1.2) BASE Trace functionality</h2>
<p>The BASE class contains trace methods to trace progress within a mission execution of a certain object.
Note that these trace methods are inherited by each MOOSE class interiting BASE.
As such, each object created from derived class from BASE can use the tracing functions to trace its execution.</p>
<h2>Trace a function call</h2>
<h2>1.2.1) Tracing functions</h2>
<p>There are basically 3 types of tracing methods available within BASE:</p>
<ul>
<li><a href="##(BASE).F">BASE.F</a>: Trace the beginning of a function and its given parameters.</li>
<li><a href="##(BASE).T">BASE.T</a>: Trace further logic within a function giving optional variables or parameters.</li>
<li><a href="##(BASE).E">BASE.E</a>: Trace an execption within a function giving optional variables or parameters. An exception will always be traced.</li>
<li><a href="##(BASE).F">BASE.F</a>: Trace the beginning of a function and its given parameters. An F is indicated at column 44 in the DCS.log file.</li>
<li><a href="##(BASE).T">BASE.T</a>: Trace further logic within a function giving optional variables or parameters. A T is indicated at column 44 in the DCS.log file.</li>
<li><a href="##(BASE).E">BASE.E</a>: Trace an exception within a function giving optional variables or parameters. An E is indicated at column 44 in the DCS.log file. An exception will always be traced.</li>
</ul>
<h2>Tracing levels</h2>
<h2>1.2.2) Tracing levels</h2>
<p>There are 3 tracing levels within MOOSE. <br/>
These tracing levels were defined to avoid bulks of tracing to be generated by lots of objects.</p>
@ -115,7 +119,7 @@ These tracing levels were defined to avoid bulks of tracing to be generated by l
<li><a href="##(BASE).T3">BASE.T3</a>: Trace further logic within a function giving optional variables or parameters with tracing level 3.</li>
</ul>
<h1>BASE Inheritance support</h1>
<h1>1.3) BASE Inheritance support</h1>
<p>The following methods are available to support inheritance:</p>
<ul>
@ -162,6 +166,12 @@ These tracing levels were defined to avoid bulks of tracing to be generated by l
<td class="name" nowrap="nowrap"><a href="##(BASE).ClassName">BASE.ClassName</a></td>
<td class="summary">
<p>The name of the class.</p>
</td>
</tr>
<tr>
<td class="name" nowrap="nowrap"><a href="##(BASE).ClassNameAndID">BASE.ClassNameAndID</a></td>
<td class="summary">
<p>The name of the class concatenated with the ID number of the class.</p>
</td>
</tr>
<tr>
@ -213,7 +223,7 @@ These tracing levels were defined to avoid bulks of tracing to be generated by l
</td>
</tr>
<tr>
<td class="name" nowrap="nowrap"><a href="##(BASE).F">BASE:F(Arguments, DebugInfoCurrentParam, DebugInfoFromParam)</a></td>
<td class="name" nowrap="nowrap"><a href="##(BASE).F">BASE:F(Arguments)</a></td>
<td class="summary">
<p>Trace a function call.</p>
</td>
@ -324,6 +334,20 @@ These tracing levels were defined to avoid bulks of tracing to be generated by l
<td class="name" nowrap="nowrap"><a href="##(BASE).TraceLevel">BASE:TraceLevel(Level)</a></td>
<td class="summary">
<p>Set trace level</p>
</td>
</tr>
<tr>
<td class="name" nowrap="nowrap"><a href="##(BASE).TraceOnOff">BASE.TraceOnOff(BASE, TraceOnOff, self)</a></td>
<td class="summary">
<p>Set trace on or off
Note that when trace is off, no debug statement is performed, increasing performance!
When Moose is loaded statically, (as one file), tracing is switched off by default.</p>
</td>
</tr>
<tr>
<td class="name" nowrap="nowrap"><a href="##(BASE)._F">BASE:_F(Arguments, DebugInfoCurrentParam, DebugInfoFromParam)</a></td>
<td class="summary">
<p>Trace a function call.</p>
</td>
</tr>
<tr>
@ -446,6 +470,19 @@ These tracing levels were defined to avoid bulks of tracing to be generated by l
<dl class="function">
<dt>
<a id="#(BASE).ClassNameAndID" >
<strong>BASE.ClassNameAndID</strong>
</a>
</dt>
<dd>
<p>The name of the class concatenated with the ID number of the class.</p>
</dd>
</dl>
<dl class="function">
<dt>
<a id="#(BASE).ClearState" >
<strong>BASE:ClearState(Object, StateName)</strong>
</a>
@ -638,7 +675,7 @@ A #table or any field.</p>
<dt>
<a id="#(BASE).F" >
<strong>BASE:F(Arguments, DebugInfoCurrentParam, DebugInfoFromParam)</strong>
<strong>BASE:F(Arguments)</strong>
</a>
</dt>
<dd>
@ -648,23 +685,13 @@ A #table or any field.</p>
<p>Must be at the beginning of the function logic.</p>
<h3>Parameters</h3>
<h3>Parameter</h3>
<ul>
<li>
<p><code><em> Arguments </em></code>:
A #table or any field.</p>
</li>
<li>
<p><code><em> DebugInfoCurrentParam </em></code>: </p>
</li>
<li>
<p><code><em> DebugInfoFromParam </em></code>: </p>
</li>
</ul>
</dd>
@ -883,14 +910,16 @@ Any new class needs to be derived from this class for proper inheritance.</p>
The new instance of the BASE class.</p>
<h3>Usage:</h3>
<pre class="example"><code>function TASK:New()
<pre class="example"><code>-- This declares the constructor of the class TASK, inheriting from BASE.
--- TASK constructor
-- @param #TASK self
-- @param Parameter The parameter of the New constructor.
-- @return #TASK self
function TASK:New( Parameter )
local self = BASE:Inherit( self, BASE:New() )
-- assign Task default values during construction
self.TaskBriefing = "Task: No Task."
self.Time = timer.getTime()
self.ExecuteStage = _TransportExecuteStage.NONE
self.Variable = Parameter
return self
end</code></pre>
@ -1110,6 +1139,87 @@ true = trace all methods in MOOSE.</p>
<dl class="function">
<dt>
<a id="#(BASE).TraceOnOff" >
<strong>BASE.TraceOnOff(BASE, TraceOnOff, self)</strong>
</a>
</dt>
<dd>
<p>Set trace on or off
Note that when trace is off, no debug statement is performed, increasing performance!
When Moose is loaded statically, (as one file), tracing is switched off by default.</p>
<p>So tracing must be switched on manually in your mission if you are using Moose statically.
When moose is loading dynamically (for moose class development), tracing is switched on by default.</p>
<h3>Parameters</h3>
<ul>
<li>
<p><code><em> BASE </em></code>:
self</p>
</li>
<li>
<p><code><em>#boolean TraceOnOff </em></code>:
Switch the tracing on or off.</p>
</li>
<li>
<p><code><em> self </em></code>: </p>
</li>
</ul>
<h3>Usage:</h3>
<pre class="example"><code>-- Switch the tracing On
BASE:TraceOn( true )
-- Switch the tracing Off
BASE:TraceOn( false )</code></pre>
</dd>
</dl>
<dl class="function">
<dt>
<a id="#(BASE)._F" >
<strong>BASE:_F(Arguments, DebugInfoCurrentParam, DebugInfoFromParam)</strong>
</a>
</dt>
<dd>
<p>Trace a function call.</p>
<p>This function is private.</p>
<h3>Parameters</h3>
<ul>
<li>
<p><code><em> Arguments </em></code>:
A #table or any field.</p>
</li>
<li>
<p><code><em> DebugInfoCurrentParam </em></code>: </p>
</li>
<li>
<p><code><em> DebugInfoFromParam </em></code>: </p>
</li>
</ul>
</dd>
</dl>
<dl class="function">
<dt>
<a id="#(BASE)._T" >
<strong>BASE:_T(Arguments, DebugInfoCurrentParam, DebugInfoFromParam)</strong>
</a>

View File

@ -19,6 +19,7 @@
<ul>
<li><a href="AIBalancer.html">AIBalancer</a></li>
<li><a href="Airbase.html">Airbase</a></li>
<li><a href="AirbasePolice.html">AirbasePolice</a></li>
<li><a href="Base.html">Base</a></li>
<li>CARGO</li>
<li><a href="CleanUp.html">CleanUp</a></li>

View File

@ -19,6 +19,7 @@
<ul>
<li><a href="AIBalancer.html">AIBalancer</a></li>
<li><a href="Airbase.html">Airbase</a></li>
<li><a href="AirbasePolice.html">AirbasePolice</a></li>
<li><a href="Base.html">Base</a></li>
<li><a href="CARGO.html">CARGO</a></li>
<li>CleanUp</li>

View File

@ -19,6 +19,7 @@
<ul>
<li><a href="AIBalancer.html">AIBalancer</a></li>
<li><a href="Airbase.html">Airbase</a></li>
<li><a href="AirbasePolice.html">AirbasePolice</a></li>
<li><a href="Base.html">Base</a></li>
<li><a href="CARGO.html">CARGO</a></li>
<li><a href="CleanUp.html">CleanUp</a></li>
@ -281,7 +282,7 @@ If the DCS Unit object does not exist or is nil, the CLIENT methods will return
</td>
</tr>
<tr>
<td class="name" nowrap="nowrap"><a href="##(CLIENT).Message">CLIENT:Message(Message, MessageDuration, MessageId, MessageCategory, MessageInterval)</a></td>
<td class="name" nowrap="nowrap"><a href="##(CLIENT).Message">CLIENT:Message(Message, MessageDuration, MessageCategory, MessageInterval, MessageID)</a></td>
<td class="summary">
<p>The main message driver for the CLIENT.</p>
</td>
@ -341,7 +342,7 @@ If the DCS Unit object does not exist or is nil, the CLIENT methods will return
</td>
</tr>
<tr>
<td class="name" nowrap="nowrap"><a href="##(CLIENT)._AliveCheckScheduler">CLIENT:_AliveCheckScheduler()</a></td>
<td class="name" nowrap="nowrap"><a href="##(CLIENT)._AliveCheckScheduler">CLIENT:_AliveCheckScheduler(SchedulerName)</a></td>
<td class="summary">
</td>
@ -882,7 +883,7 @@ true is a transport.</p>
<dt>
<a id="#(CLIENT).Message" >
<strong>CLIENT:Message(Message, MessageDuration, MessageId, MessageCategory, MessageInterval)</strong>
<strong>CLIENT:Message(Message, MessageDuration, MessageCategory, MessageInterval, MessageID)</strong>
</a>
</dt>
<dd>
@ -908,12 +909,6 @@ is the duration in seconds that the Message should be displayed.</p>
</li>
<li>
<p><code><em>#string MessageId </em></code>:
is a text identifying the Message in the MessageQueue. The Message system overwrites Messages with the same MessageId</p>
</li>
<li>
<p><code><em>#string MessageCategory </em></code>:
is the category of the message (the title).</p>
@ -923,6 +918,12 @@ is the category of the message (the title).</p>
<p><code><em>#number MessageInterval </em></code>:
is the interval in seconds between the display of the <a href="Message.html##(MESSAGE)">Message#MESSAGE</a> when the CLIENT is in the air.</p>
</li>
<li>
<p><code><em>#string MessageID </em></code>:
is the identifier of the message when displayed with intervals.</p>
</li>
</ul>
</dd>
@ -1108,13 +1109,21 @@ self</p>
<dt>
<a id="#(CLIENT)._AliveCheckScheduler" >
<strong>CLIENT:_AliveCheckScheduler()</strong>
<strong>CLIENT:_AliveCheckScheduler(SchedulerName)</strong>
</a>
</dt>
<dd>
<h3>Parameter</h3>
<ul>
<li>
<p><code><em> SchedulerName </em></code>: </p>
</li>
</ul>
</dd>
</dl>
<dl class="function">

View File

@ -19,6 +19,7 @@
<ul>
<li><a href="AIBalancer.html">AIBalancer</a></li>
<li><a href="Airbase.html">Airbase</a></li>
<li><a href="AirbasePolice.html">AirbasePolice</a></li>
<li><a href="Base.html">Base</a></li>
<li><a href="CARGO.html">CARGO</a></li>
<li><a href="CleanUp.html">CleanUp</a></li>

View File

@ -19,6 +19,7 @@
<ul>
<li><a href="AIBalancer.html">AIBalancer</a></li>
<li><a href="Airbase.html">Airbase</a></li>
<li><a href="AirbasePolice.html">AirbasePolice</a></li>
<li><a href="Base.html">Base</a></li>
<li><a href="CARGO.html">CARGO</a></li>
<li><a href="CleanUp.html">CleanUp</a></li>

View File

@ -19,6 +19,7 @@
<ul>
<li><a href="AIBalancer.html">AIBalancer</a></li>
<li><a href="Airbase.html">Airbase</a></li>
<li><a href="AirbasePolice.html">AirbasePolice</a></li>
<li><a href="Base.html">Base</a></li>
<li><a href="CARGO.html">CARGO</a></li>
<li><a href="CleanUp.html">CleanUp</a></li>

View File

@ -19,6 +19,7 @@
<ul>
<li><a href="AIBalancer.html">AIBalancer</a></li>
<li><a href="Airbase.html">Airbase</a></li>
<li><a href="AirbasePolice.html">AirbasePolice</a></li>
<li><a href="Base.html">Base</a></li>
<li><a href="CARGO.html">CARGO</a></li>
<li><a href="CleanUp.html">CleanUp</a></li>

View File

@ -19,6 +19,7 @@
<ul>
<li><a href="AIBalancer.html">AIBalancer</a></li>
<li><a href="Airbase.html">Airbase</a></li>
<li><a href="AirbasePolice.html">AirbasePolice</a></li>
<li><a href="Base.html">Base</a></li>
<li><a href="CARGO.html">CARGO</a></li>
<li><a href="CleanUp.html">CleanUp</a></li>

View File

@ -19,6 +19,7 @@
<ul>
<li><a href="AIBalancer.html">AIBalancer</a></li>
<li><a href="Airbase.html">Airbase</a></li>
<li><a href="AirbasePolice.html">AirbasePolice</a></li>
<li><a href="Base.html">Base</a></li>
<li><a href="CARGO.html">CARGO</a></li>
<li><a href="CleanUp.html">CleanUp</a></li>

View File

@ -19,6 +19,7 @@
<ul>
<li><a href="AIBalancer.html">AIBalancer</a></li>
<li><a href="Airbase.html">Airbase</a></li>
<li><a href="AirbasePolice.html">AirbasePolice</a></li>
<li><a href="Base.html">Base</a></li>
<li><a href="CARGO.html">CARGO</a></li>
<li><a href="CleanUp.html">CleanUp</a></li>

View File

@ -19,6 +19,7 @@
<ul>
<li><a href="AIBalancer.html">AIBalancer</a></li>
<li><a href="Airbase.html">Airbase</a></li>
<li><a href="AirbasePolice.html">AirbasePolice</a></li>
<li><a href="Base.html">Base</a></li>
<li><a href="CARGO.html">CARGO</a></li>
<li><a href="CleanUp.html">CleanUp</a></li>

View File

@ -19,6 +19,7 @@
<ul>
<li><a href="AIBalancer.html">AIBalancer</a></li>
<li><a href="Airbase.html">Airbase</a></li>
<li><a href="AirbasePolice.html">AirbasePolice</a></li>
<li><a href="Base.html">Base</a></li>
<li><a href="CARGO.html">CARGO</a></li>
<li><a href="CleanUp.html">CleanUp</a></li>

View File

@ -19,6 +19,7 @@
<ul>
<li><a href="AIBalancer.html">AIBalancer</a></li>
<li><a href="Airbase.html">Airbase</a></li>
<li><a href="AirbasePolice.html">AirbasePolice</a></li>
<li><a href="Base.html">Base</a></li>
<li><a href="CARGO.html">CARGO</a></li>
<li><a href="CleanUp.html">CleanUp</a></li>

View File

@ -19,6 +19,7 @@
<ul>
<li><a href="AIBalancer.html">AIBalancer</a></li>
<li><a href="Airbase.html">Airbase</a></li>
<li><a href="AirbasePolice.html">AirbasePolice</a></li>
<li><a href="Base.html">Base</a></li>
<li><a href="CARGO.html">CARGO</a></li>
<li><a href="CleanUp.html">CleanUp</a></li>

View File

@ -19,6 +19,7 @@
<ul>
<li><a href="AIBalancer.html">AIBalancer</a></li>
<li><a href="Airbase.html">Airbase</a></li>
<li><a href="AirbasePolice.html">AirbasePolice</a></li>
<li><a href="Base.html">Base</a></li>
<li><a href="CARGO.html">CARGO</a></li>
<li><a href="CleanUp.html">CleanUp</a></li>

View File

@ -19,6 +19,7 @@
<ul>
<li><a href="AIBalancer.html">AIBalancer</a></li>
<li><a href="Airbase.html">Airbase</a></li>
<li><a href="AirbasePolice.html">AirbasePolice</a></li>
<li><a href="Base.html">Base</a></li>
<li><a href="CARGO.html">CARGO</a></li>
<li><a href="CleanUp.html">CleanUp</a></li>

View File

@ -19,6 +19,7 @@
<ul>
<li><a href="AIBalancer.html">AIBalancer</a></li>
<li><a href="Airbase.html">Airbase</a></li>
<li><a href="AirbasePolice.html">AirbasePolice</a></li>
<li><a href="Base.html">Base</a></li>
<li><a href="CARGO.html">CARGO</a></li>
<li><a href="CleanUp.html">CleanUp</a></li>

View File

@ -19,6 +19,7 @@
<ul>
<li><a href="AIBalancer.html">AIBalancer</a></li>
<li><a href="Airbase.html">Airbase</a></li>
<li><a href="AirbasePolice.html">AirbasePolice</a></li>
<li><a href="Base.html">Base</a></li>
<li><a href="CARGO.html">CARGO</a></li>
<li><a href="CleanUp.html">CleanUp</a></li>

View File

@ -19,6 +19,7 @@
<ul>
<li><a href="AIBalancer.html">AIBalancer</a></li>
<li><a href="Airbase.html">Airbase</a></li>
<li><a href="AirbasePolice.html">AirbasePolice</a></li>
<li><a href="Base.html">Base</a></li>
<li><a href="CARGO.html">CARGO</a></li>
<li><a href="CleanUp.html">CleanUp</a></li>

View File

@ -19,6 +19,7 @@
<ul>
<li><a href="AIBalancer.html">AIBalancer</a></li>
<li><a href="Airbase.html">Airbase</a></li>
<li><a href="AirbasePolice.html">AirbasePolice</a></li>
<li><a href="Base.html">Base</a></li>
<li><a href="CARGO.html">CARGO</a></li>
<li><a href="CleanUp.html">CleanUp</a></li>
@ -126,7 +127,7 @@ The following iterator methods are currently available within the DATABASE:</p>
</td>
</tr>
<tr>
<td class="name" nowrap="nowrap"><a href="##(DATABASE).AddGroup">DATABASE:AddGroup(DCSGroup, GroupName)</a></td>
<td class="name" nowrap="nowrap"><a href="##(DATABASE).AddGroup">DATABASE:AddGroup(GroupName)</a></td>
<td class="summary">
<p>Adds a GROUP based on the GroupName in the DATABASE.</p>
</td>
@ -138,13 +139,13 @@ The following iterator methods are currently available within the DATABASE:</p>
</td>
</tr>
<tr>
<td class="name" nowrap="nowrap"><a href="##(DATABASE).AddStatic">DATABASE:AddStatic(DCSStatic, DCSStaticName)</a></td>
<td class="name" nowrap="nowrap"><a href="##(DATABASE).AddStatic">DATABASE:AddStatic(DCSStaticName)</a></td>
<td class="summary">
<p>Adds a Static based on the Static Name in the DATABASE.</p>
</td>
</tr>
<tr>
<td class="name" nowrap="nowrap"><a href="##(DATABASE).AddUnit">DATABASE:AddUnit(DCSUnit, DCSUnitName)</a></td>
<td class="name" nowrap="nowrap"><a href="##(DATABASE).AddUnit">DATABASE:AddUnit(DCSUnitName)</a></td>
<td class="summary">
<p>Adds a Unit based on the Unit Name in the DATABASE.</p>
</td>
@ -165,24 +166,6 @@ The following iterator methods are currently available within the DATABASE:</p>
<td class="name" nowrap="nowrap"><a href="##(DATABASE).ClassName">DATABASE.ClassName</a></td>
<td class="summary">
</td>
</tr>
<tr>
<td class="name" nowrap="nowrap"><a href="##(DATABASE).DCSGroups">DATABASE.DCSGroups</a></td>
<td class="summary">
</td>
</tr>
<tr>
<td class="name" nowrap="nowrap"><a href="##(DATABASE).DCSStatics">DATABASE.DCSStatics</a></td>
<td class="summary">
</td>
</tr>
<tr>
<td class="name" nowrap="nowrap"><a href="##(DATABASE).DCSUnits">DATABASE.DCSUnits</a></td>
<td class="summary">
</td>
</tr>
<tr>
@ -243,12 +226,6 @@ The following iterator methods are currently available within the DATABASE:</p>
<td class="name" nowrap="nowrap"><a href="##(DATABASE).ForEachClientAlive">DATABASE:ForEachClientAlive(IteratorFunction, ...)</a></td>
<td class="summary">
<p>Iterate the DATABASE and call an iterator function for each <strong>ALIVE</strong> CLIENT, providing the CLIENT to the function and optional parameters.</p>
</td>
</tr>
<tr>
<td class="name" nowrap="nowrap"><a href="##(DATABASE).ForEachDCSUnit">DATABASE:ForEachDCSUnit(IteratorFunction, ...)</a></td>
<td class="summary">
<p>Iterate the DATABASE and call an iterator function for each <strong>alive</strong> unit, providing the DCSUnit and optional parameters.</p>
</td>
</tr>
<tr>
@ -468,22 +445,17 @@ The following iterator methods are currently available within the DATABASE:</p>
<dt>
<a id="#(DATABASE).AddGroup" >
<strong>DATABASE:AddGroup(DCSGroup, GroupName)</strong>
<strong>DATABASE:AddGroup(GroupName)</strong>
</a>
</dt>
<dd>
<p>Adds a GROUP based on the GroupName in the DATABASE.</p>
<h3>Parameters</h3>
<h3>Parameter</h3>
<ul>
<li>
<p><code><em> DCSGroup </em></code>: </p>
</li>
<li>
<p><code><em> GroupName </em></code>: </p>
</li>
@ -520,22 +492,17 @@ The following iterator methods are currently available within the DATABASE:</p>
<dt>
<a id="#(DATABASE).AddStatic" >
<strong>DATABASE:AddStatic(DCSStatic, DCSStaticName)</strong>
<strong>DATABASE:AddStatic(DCSStaticName)</strong>
</a>
</dt>
<dd>
<p>Adds a Static based on the Static Name in the DATABASE.</p>
<h3>Parameters</h3>
<h3>Parameter</h3>
<ul>
<li>
<p><code><em> DCSStatic </em></code>: </p>
</li>
<li>
<p><code><em> DCSStaticName </em></code>: </p>
</li>
@ -546,22 +513,17 @@ The following iterator methods are currently available within the DATABASE:</p>
<dt>
<a id="#(DATABASE).AddUnit" >
<strong>DATABASE:AddUnit(DCSUnit, DCSUnitName)</strong>
<strong>DATABASE:AddUnit(DCSUnitName)</strong>
</a>
</dt>
<dd>
<p>Adds a Unit based on the Unit Name in the DATABASE.</p>
<h3>Parameters</h3>
<h3>Parameter</h3>
<ul>
<li>
<p><code><em> DCSUnit </em></code>: </p>
</li>
<li>
<p><code><em> DCSUnitName </em></code>: </p>
</li>
@ -608,48 +570,6 @@ The following iterator methods are currently available within the DATABASE:</p>
</dd>
</dl>
<dl class="function">
<dt>
<em></em>
<a id="#(DATABASE).DCSGroups" >
<strong>DATABASE.DCSGroups</strong>
</a>
</dt>
<dd>
</dd>
</dl>
<dl class="function">
<dt>
<em></em>
<a id="#(DATABASE).DCSStatics" >
<strong>DATABASE.DCSStatics</strong>
</a>
</dt>
<dd>
</dd>
</dl>
<dl class="function">
<dt>
<em></em>
<a id="#(DATABASE).DCSUnits" >
<strong>DATABASE.DCSUnits</strong>
</a>
</dt>
<dd>
</dd>
</dl>
<dl class="function">
@ -923,38 +843,6 @@ self</p>
<dl class="function">
<dt>
<a id="#(DATABASE).ForEachDCSUnit" >
<strong>DATABASE:ForEachDCSUnit(IteratorFunction, ...)</strong>
</a>
</dt>
<dd>
<p>Iterate the DATABASE and call an iterator function for each <strong>alive</strong> unit, providing the DCSUnit and optional parameters.</p>
<h3>Parameters</h3>
<ul>
<li>
<p><code><em>#function IteratorFunction </em></code>:
The function that will be called when there is an alive unit in the database. The function needs to accept a DCSUnit parameter.</p>
</li>
<li>
<p><code><em> ... </em></code>: </p>
</li>
</ul>
<h3>Return value</h3>
<p><em><a href="##(DATABASE)">#DATABASE</a>:</em>
self</p>
</dd>
</dl>
<dl class="function">
<dt>
<a id="#(DATABASE).ForEachGroup" >
<strong>DATABASE:ForEachGroup(IteratorFunction, ...)</strong>
</a>

View File

@ -19,6 +19,7 @@
<ul>
<li><a href="AIBalancer.html">AIBalancer</a></li>
<li><a href="Airbase.html">Airbase</a></li>
<li><a href="AirbasePolice.html">AirbasePolice</a></li>
<li><a href="Base.html">Base</a></li>
<li><a href="CARGO.html">CARGO</a></li>
<li><a href="CleanUp.html">CleanUp</a></li>
@ -577,6 +578,12 @@ EscortPlanes = ESCORT:New( EscortClient, EscortGroup, "Desert", "Welcome to the
<td class="name" nowrap="nowrap"><a href="##(ESCORT).ReportTargetsScheduler">ESCORT.ReportTargetsScheduler</a></td>
<td class="summary">
</td>
</tr>
<tr>
<td class="name" nowrap="nowrap"><a href="##(ESCORT).SmokeDirectionVector">ESCORT.SmokeDirectionVector</a></td>
<td class="summary">
</td>
</tr>
<tr>
@ -589,6 +596,12 @@ EscortPlanes = ESCORT:New( EscortClient, EscortGroup, "Desert", "Welcome to the
<td class="name" nowrap="nowrap"><a href="##(ESCORT).TaskPoints">ESCORT.TaskPoints</a></td>
<td class="summary">
</td>
</tr>
<tr>
<td class="name" nowrap="nowrap"><a href="##(ESCORT).TestSmokeDirectionVector">ESCORT:TestSmokeDirectionVector(SmokeDirection)</a></td>
<td class="summary">
<p>This function is for test, it will put on the frequency of the FollowScheduler a red smoke at the direction vector calculated for the escort to fly to.</p>
</td>
</tr>
<tr>
@ -751,7 +764,7 @@ EscortPlanes = ESCORT:New( EscortClient, EscortGroup, "Desert", "Welcome to the
<ul>
<li>
<p><code><em> EscortGroup </em></code>: </p>
<p><code><em><a href="Group.html##(GROUP)">Group#GROUP</a> EscortGroup </em></code>: </p>
</li>
</ul>
@ -762,7 +775,10 @@ EscortPlanes = ESCORT:New( EscortClient, EscortGroup, "Desert", "Welcome to the
<h2><a id="#(Distance)" >Type <code>Distance</code></a></h2>
<h2><a id="#(ESCORT)" >Type <code>ESCORT</code></a></h2>
<h3>Field(s)</h3>
<p>ESCORT class</p>
<h3>Field(s)</h3>
<dl class="function">
<dt>
@ -1910,6 +1926,19 @@ EscortPlanes = ESCORT:New( EscortClient, EscortGroup, "Desert", "Welcome to the
<p>self.ReportTargetsScheduler = routines.scheduleFunction( self._ReportTargetsScheduler, { self }, timer.getTime() + 1, Seconds )</p>
</dd>
</dl>
<dl class="function">
<dt>
<a id="#(ESCORT).SmokeDirectionVector" >
<strong>ESCORT.SmokeDirectionVector</strong>
</a>
</dt>
<dd>
</dd>
</dl>
<dl class="function">
@ -1938,6 +1967,31 @@ EscortPlanes = ESCORT:New( EscortClient, EscortGroup, "Desert", "Welcome to the
</dd>
</dl>
<dl class="function">
<dt>
<a id="#(ESCORT).TestSmokeDirectionVector" >
<strong>ESCORT:TestSmokeDirectionVector(SmokeDirection)</strong>
</a>
</dt>
<dd>
<p>This function is for test, it will put on the frequency of the FollowScheduler a red smoke at the direction vector calculated for the escort to fly to.</p>
<p>This allows to visualize where the escort is flying to.</p>
<h3>Parameter</h3>
<ul>
<li>
<p><code><em>#boolean SmokeDirection </em></code>:
If true, then the direction vector will be smoked.</p>
</li>
</ul>
</dd>
</dl>
<dl class="function">

View File

@ -19,6 +19,7 @@
<ul>
<li><a href="AIBalancer.html">AIBalancer</a></li>
<li><a href="Airbase.html">Airbase</a></li>
<li><a href="AirbasePolice.html">AirbasePolice</a></li>
<li><a href="Base.html">Base</a></li>
<li><a href="CARGO.html">CARGO</a></li>
<li><a href="CleanUp.html">CleanUp</a></li>

View File

@ -19,6 +19,7 @@
<ul>
<li><a href="AIBalancer.html">AIBalancer</a></li>
<li><a href="Airbase.html">Airbase</a></li>
<li><a href="AirbasePolice.html">AirbasePolice</a></li>
<li><a href="Base.html">Base</a></li>
<li><a href="CARGO.html">CARGO</a></li>
<li><a href="CleanUp.html">CleanUp</a></li>

View File

@ -19,6 +19,7 @@
<ul>
<li><a href="AIBalancer.html">AIBalancer</a></li>
<li><a href="Airbase.html">Airbase</a></li>
<li><a href="AirbasePolice.html">AirbasePolice</a></li>
<li><a href="Base.html">Base</a></li>
<li><a href="CARGO.html">CARGO</a></li>
<li><a href="CleanUp.html">CleanUp</a></li>

View File

@ -19,6 +19,7 @@
<ul>
<li><a href="AIBalancer.html">AIBalancer</a></li>
<li><a href="Airbase.html">Airbase</a></li>
<li><a href="AirbasePolice.html">AirbasePolice</a></li>
<li><a href="Base.html">Base</a></li>
<li><a href="CARGO.html">CARGO</a></li>
<li><a href="CleanUp.html">CleanUp</a></li>

View File

@ -19,6 +19,7 @@
<ul>
<li><a href="AIBalancer.html">AIBalancer</a></li>
<li><a href="Airbase.html">Airbase</a></li>
<li><a href="AirbasePolice.html">AirbasePolice</a></li>
<li><a href="Base.html">Base</a></li>
<li><a href="CARGO.html">CARGO</a></li>
<li><a href="CleanUp.html">CleanUp</a></li>

View File

@ -19,6 +19,7 @@
<ul>
<li><a href="AIBalancer.html">AIBalancer</a></li>
<li><a href="Airbase.html">Airbase</a></li>
<li><a href="AirbasePolice.html">AirbasePolice</a></li>
<li><a href="Base.html">Base</a></li>
<li><a href="CARGO.html">CARGO</a></li>
<li><a href="CleanUp.html">CleanUp</a></li>

View File

@ -19,6 +19,7 @@
<ul>
<li><a href="AIBalancer.html">AIBalancer</a></li>
<li><a href="Airbase.html">Airbase</a></li>
<li><a href="AirbasePolice.html">AirbasePolice</a></li>
<li><a href="Base.html">Base</a></li>
<li><a href="CARGO.html">CARGO</a></li>
<li><a href="CleanUp.html">CleanUp</a></li>

View File

@ -19,6 +19,7 @@
<ul>
<li><a href="AIBalancer.html">AIBalancer</a></li>
<li><a href="Airbase.html">Airbase</a></li>
<li><a href="AirbasePolice.html">AirbasePolice</a></li>
<li><a href="Base.html">Base</a></li>
<li><a href="CARGO.html">CARGO</a></li>
<li><a href="CleanUp.html">CleanUp</a></li>

View File

@ -19,6 +19,7 @@
<ul>
<li><a href="AIBalancer.html">AIBalancer</a></li>
<li><a href="Airbase.html">Airbase</a></li>
<li><a href="AirbasePolice.html">AirbasePolice</a></li>
<li><a href="Base.html">Base</a></li>
<li><a href="CARGO.html">CARGO</a></li>
<li><a href="CleanUp.html">CleanUp</a></li>

View File

@ -19,6 +19,7 @@
<ul>
<li><a href="AIBalancer.html">AIBalancer</a></li>
<li><a href="Airbase.html">Airbase</a></li>
<li><a href="AirbasePolice.html">AirbasePolice</a></li>
<li><a href="Base.html">Base</a></li>
<li><a href="CARGO.html">CARGO</a></li>
<li><a href="CleanUp.html">CleanUp</a></li>

View File

@ -19,6 +19,7 @@
<ul>
<li><a href="AIBalancer.html">AIBalancer</a></li>
<li><a href="Airbase.html">Airbase</a></li>
<li><a href="AirbasePolice.html">AirbasePolice</a></li>
<li><a href="Base.html">Base</a></li>
<li><a href="CARGO.html">CARGO</a></li>
<li><a href="CleanUp.html">CleanUp</a></li>

View File

@ -19,6 +19,7 @@
<ul>
<li><a href="AIBalancer.html">AIBalancer</a></li>
<li><a href="Airbase.html">Airbase</a></li>
<li><a href="AirbasePolice.html">AirbasePolice</a></li>
<li><a href="Base.html">Base</a></li>
<li><a href="CARGO.html">CARGO</a></li>
<li><a href="CleanUp.html">CleanUp</a></li>

View File

@ -19,6 +19,7 @@
<ul>
<li><a href="AIBalancer.html">AIBalancer</a></li>
<li><a href="Airbase.html">Airbase</a></li>
<li><a href="AirbasePolice.html">AirbasePolice</a></li>
<li><a href="Base.html">Base</a></li>
<li><a href="CARGO.html">CARGO</a></li>
<li><a href="CleanUp.html">CleanUp</a></li>

View File

@ -19,6 +19,7 @@
<ul>
<li><a href="AIBalancer.html">AIBalancer</a></li>
<li><a href="Airbase.html">Airbase</a></li>
<li><a href="AirbasePolice.html">AirbasePolice</a></li>
<li><a href="Base.html">Base</a></li>
<li><a href="CARGO.html">CARGO</a></li>
<li><a href="CleanUp.html">CleanUp</a></li>
@ -72,26 +73,26 @@
<div id="content">
<h1>Module <code>Scheduler</code></h1>
<p>Models time events calling event handing functions.</p>
<p>This module contains the SCHEDULER class.</p>
<h1><a href="SCHEDULER.html">SCHEDULER</a> class</h1>
<p>The <a href="SCHEDULER.html">SCHEDULER</a> class models time events calling given event handling functions.</p>
<h1>1) <a href="Scheduler.html##(SCHEDULER)">Scheduler#SCHEDULER</a> class, extends <a href="Base.html##(BASE)">Base#BASE</a></h1>
<p>The <a href="Scheduler.html##(SCHEDULER)">Scheduler#SCHEDULER</a> class models time events calling given event handling functions.</p>
<h1>SCHEDULER constructor</h1>
<h2>1.1) SCHEDULER constructor</h2>
<p>The SCHEDULER class is quite easy to use:</p>
<ul>
<li><a href="##(SCHEDULER).New">SCHEDULER.New</a>: Setup a new scheduler and start it with the specified parameters.</li>
<li><a href="Scheduler.html##(SCHEDULER).New">Scheduler#SCHEDULER.New</a>: Setup a new scheduler and start it with the specified parameters.</li>
</ul>
<h1>SCHEDULER timer methods</h1>
<h2>SCHEDULER timer stop and start</h2>
<p>The SCHEDULER can be stopped and restarted with the following methods:</p>
<ul>
<li><a href="##(SCHEDULER).Start">SCHEDULER.Start</a>: (Re-)Start the scheduler.</li>
<li><a href="##(SCHEDULER).Start">SCHEDULER.Start</a>: Stop the scheduler.</li>
<li><a href="Scheduler.html##(SCHEDULER).Start">Scheduler#SCHEDULER.Start</a>: (Re-)Start the scheduler.</li>
<li><a href="Scheduler.html##(SCHEDULER).Stop">Scheduler#SCHEDULER.Stop</a>: Stop the scheduler.</li>
</ul>
@ -115,13 +116,19 @@
<tr>
<td class="name" nowrap="nowrap"><a href="##(SCHEDULER).New">SCHEDULER:New(TimeEventObject, TimeEventFunction, TimeEventFunctionArguments, StartSeconds, RepeatSecondsInterval, RandomizationFactor, StopSeconds)</a></td>
<td class="summary">
<p>Constructor.</p>
<p>SCHEDULER constructor.</p>
</td>
</tr>
<tr>
<td class="name" nowrap="nowrap"><a href="##(SCHEDULER).Repeat">SCHEDULER.Repeat</a></td>
<td class="summary">
</td>
</tr>
<tr>
<td class="name" nowrap="nowrap"><a href="##(SCHEDULER).ScheduleID">SCHEDULER.ScheduleID</a></td>
<td class="summary">
<p>the ID of the scheduler.</p>
</td>
</tr>
<tr>
@ -189,7 +196,7 @@
</dt>
<dd>
<p>Constructor.</p>
<p>SCHEDULER constructor.</p>
<h3>Parameters</h3>
<ul>
@ -255,6 +262,20 @@ self</p>
</dd>
</dl>
<dl class="function">
<dt>
<em>#number</em>
<a id="#(SCHEDULER).ScheduleID" >
<strong>SCHEDULER.ScheduleID</strong>
</a>
</dt>
<dd>
<p>the ID of the scheduler.</p>
</dd>
</dl>
<dl class="function">

View File

@ -19,6 +19,7 @@
<ul>
<li><a href="AIBalancer.html">AIBalancer</a></li>
<li><a href="Airbase.html">Airbase</a></li>
<li><a href="AirbasePolice.html">AirbasePolice</a></li>
<li><a href="Base.html">Base</a></li>
<li><a href="CARGO.html">CARGO</a></li>
<li><a href="CleanUp.html">CleanUp</a></li>

View File

@ -19,6 +19,7 @@
<ul>
<li><a href="AIBalancer.html">AIBalancer</a></li>
<li><a href="Airbase.html">Airbase</a></li>
<li><a href="AirbasePolice.html">AirbasePolice</a></li>
<li><a href="Base.html">Base</a></li>
<li><a href="CARGO.html">CARGO</a></li>
<li><a href="CleanUp.html">CleanUp</a></li>

View File

@ -19,6 +19,7 @@
<ul>
<li><a href="AIBalancer.html">AIBalancer</a></li>
<li><a href="Airbase.html">Airbase</a></li>
<li><a href="AirbasePolice.html">AirbasePolice</a></li>
<li><a href="Base.html">Base</a></li>
<li><a href="CARGO.html">CARGO</a></li>
<li><a href="CleanUp.html">CleanUp</a></li>
@ -489,7 +490,7 @@ The following iterator methods are currently available within the SET</em>CLIENT
</td>
</tr>
<tr>
<td class="name" nowrap="nowrap"><a href="##(SET_CLIENT).ForEachClientCompletelyInZone">SET_CLIENT:ForEachClientCompletelyInZone(ZoneObject, IteratorFunction, ...)</a></td>
<td class="name" nowrap="nowrap"><a href="##(SET_CLIENT).ForEachClientInZone">SET_CLIENT:ForEachClientInZone(ZoneObject, IteratorFunction, ...)</a></td>
<td class="summary">
<p>Iterate the SET_CLIENT and call an iterator function for each <strong>alive</strong> CLIENT presence completely in a <a href="Zone.html">Zone</a>, providing the CLIENT and optional parameters to the called function.</p>
</td>
@ -1573,8 +1574,8 @@ self</p>
<dl class="function">
<dt>
<a id="#(SET_CLIENT).ForEachClientCompletelyInZone" >
<strong>SET_CLIENT:ForEachClientCompletelyInZone(ZoneObject, IteratorFunction, ...)</strong>
<a id="#(SET_CLIENT).ForEachClientInZone" >
<strong>SET_CLIENT:ForEachClientInZone(ZoneObject, IteratorFunction, ...)</strong>
</a>
</dt>
<dd>

View File

@ -19,6 +19,7 @@
<ul>
<li><a href="AIBalancer.html">AIBalancer</a></li>
<li><a href="Airbase.html">Airbase</a></li>
<li><a href="AirbasePolice.html">AirbasePolice</a></li>
<li><a href="Base.html">Base</a></li>
<li><a href="CARGO.html">CARGO</a></li>
<li><a href="CleanUp.html">CleanUp</a></li>

View File

@ -19,6 +19,7 @@
<ul>
<li><a href="AIBalancer.html">AIBalancer</a></li>
<li><a href="Airbase.html">Airbase</a></li>
<li><a href="AirbasePolice.html">AirbasePolice</a></li>
<li><a href="Base.html">Base</a></li>
<li><a href="CARGO.html">CARGO</a></li>
<li><a href="CleanUp.html">CleanUp</a></li>

View File

@ -19,6 +19,7 @@
<ul>
<li><a href="AIBalancer.html">AIBalancer</a></li>
<li><a href="Airbase.html">Airbase</a></li>
<li><a href="AirbasePolice.html">AirbasePolice</a></li>
<li><a href="Base.html">Base</a></li>
<li><a href="CARGO.html">CARGO</a></li>
<li><a href="CleanUp.html">CleanUp</a></li>

View File

@ -19,6 +19,7 @@
<ul>
<li><a href="AIBalancer.html">AIBalancer</a></li>
<li><a href="Airbase.html">Airbase</a></li>
<li><a href="AirbasePolice.html">AirbasePolice</a></li>
<li><a href="Base.html">Base</a></li>
<li><a href="CARGO.html">CARGO</a></li>
<li><a href="CleanUp.html">CleanUp</a></li>

View File

@ -19,6 +19,7 @@
<ul>
<li><a href="AIBalancer.html">AIBalancer</a></li>
<li><a href="Airbase.html">Airbase</a></li>
<li><a href="AirbasePolice.html">AirbasePolice</a></li>
<li><a href="Base.html">Base</a></li>
<li><a href="CARGO.html">CARGO</a></li>
<li><a href="CleanUp.html">CleanUp</a></li>
@ -362,6 +363,12 @@ If you want to obtain the complete <strong>3D position</strong> including ori
<td class="name" nowrap="nowrap"><a href="##(UNIT).InAir">UNIT:InAir()</a></td>
<td class="summary">
<p>Returns true if the DCS Unit is in the air.</p>
</td>
</tr>
<tr>
<td class="name" nowrap="nowrap"><a href="##(UNIT).IsAboveRunway">UNIT:IsAboveRunway()</a></td>
<td class="summary">
<p>Returns if the unit is located above a runway.</p>
</td>
</tr>
<tr>
@ -1418,6 +1425,34 @@ The DCS Unit is not existing or alive. </p>
<dl class="function">
<dt>
<a id="#(UNIT).IsAboveRunway" >
<strong>UNIT:IsAboveRunway()</strong>
</a>
</dt>
<dd>
<p>Returns if the unit is located above a runway.</p>
<h3>Return values</h3>
<ol>
<li>
<p><em>#boolean:</em>
true if Unit is above a runway.</p>
</li>
<li>
<p><em>#nil:</em>
The DCS Unit is not existing or alive. </p>
</li>
</ol>
</dd>
</dl>
<dl class="function">
<dt>
<a id="#(UNIT).IsActive" >
<strong>UNIT:IsActive()</strong>
</a>

View File

@ -19,6 +19,7 @@
<ul>
<li><a href="AIBalancer.html">AIBalancer</a></li>
<li><a href="Airbase.html">Airbase</a></li>
<li><a href="AirbasePolice.html">AirbasePolice</a></li>
<li><a href="Base.html">Base</a></li>
<li><a href="CARGO.html">CARGO</a></li>
<li><a href="CleanUp.html">CleanUp</a></li>
@ -156,6 +157,12 @@
<td class="name" nowrap="nowrap"><a href="#ZONE_POLYGON">ZONE_POLYGON</a></td>
<td class="summary">
</td>
</tr>
<tr>
<td class="name" nowrap="nowrap"><a href="#ZONE_POLYGON_BASE">ZONE_POLYGON_BASE</a></td>
<td class="summary">
</td>
</tr>
<tr>
@ -217,6 +224,12 @@
<td class="name" nowrap="nowrap"><a href="##(ZONE_BASE).SmokeZone">ZONE_BASE:SmokeZone(SmokeColor)</a></td>
<td class="summary">
<p>Smokes the zone boundaries in a color.</p>
</td>
</tr>
<tr>
<td class="name" nowrap="nowrap"><a href="##(ZONE_BASE).ZoneName">ZONE_BASE.ZoneName</a></td>
<td class="summary">
<p>Name of the zone.</p>
</td>
</tr>
</table>
@ -227,12 +240,6 @@
<td class="name" nowrap="nowrap"><a href="##(ZONE_POLYGON).ClassName">ZONE_POLYGON.ClassName</a></td>
<td class="summary">
</td>
</tr>
<tr>
<td class="name" nowrap="nowrap"><a href="##(ZONE_POLYGON).IsPointVec2InZone">ZONE_POLYGON:IsPointVec2InZone(PointVec2)</a></td>
<td class="summary">
<p>Returns if a location is within the zone.</p>
</td>
</tr>
<tr>
@ -241,8 +248,42 @@
<p>Constructor to create a ZONE_POLYGON instance, taking the zone name and the name of the <a href="Group.html##(GROUP)">Group#GROUP</a> defined within the Mission Editor.</p>
</td>
</tr>
</table>
<h2><a id="#(ZONE_POLYGON_BASE)">Type <code>ZONE_POLYGON_BASE</code></a></h2>
<table class="function_list">
<tr>
<td class="name" nowrap="nowrap"><a href="##(ZONE_POLYGON).SmokeZone">ZONE_POLYGON:SmokeZone(SmokeColor)</a></td>
<td class="name" nowrap="nowrap"><a href="##(ZONE_POLYGON_BASE).ClassName">ZONE_POLYGON_BASE.ClassName</a></td>
<td class="summary">
</td>
</tr>
<tr>
<td class="name" nowrap="nowrap"><a href="##(ZONE_POLYGON_BASE).Flush">ZONE_POLYGON_BASE:Flush()</a></td>
<td class="summary">
<p>Flush polygon coordinates as a table in DCS.log.</p>
</td>
</tr>
<tr>
<td class="name" nowrap="nowrap"><a href="##(ZONE_POLYGON_BASE).IsPointVec2InZone">ZONE_POLYGON_BASE:IsPointVec2InZone(PointVec2)</a></td>
<td class="summary">
<p>Returns if a location is within the zone.</p>
</td>
</tr>
<tr>
<td class="name" nowrap="nowrap"><a href="##(ZONE_POLYGON_BASE).New">ZONE_POLYGON_BASE:New(ZoneName, PointsArray)</a></td>
<td class="summary">
<p>Constructor to create a ZONE<em>POLYGON</em>BASE instance, taking the zone name and an array of <a href="DCSTypes.html##(Vec2)">DCSTypes#Vec2</a>, forming a polygon.</p>
</td>
</tr>
<tr>
<td class="name" nowrap="nowrap"><a href="##(ZONE_POLYGON_BASE).Polygon">ZONE_POLYGON_BASE.Polygon</a></td>
<td class="summary">
<p>The polygon defined by an array of <a href="DCSTypes.html##(Vec2)">DCSTypes#Vec2</a>.</p>
</td>
</tr>
<tr>
<td class="name" nowrap="nowrap"><a href="##(ZONE_POLYGON_BASE).SmokeZone">ZONE_POLYGON_BASE:SmokeZone(SmokeColor)</a></td>
<td class="summary">
<p>Smokes the zone boundaries in a color.</p>
</td>
@ -406,6 +447,20 @@
</dd>
</dl>
<dl class="function">
<dt>
<em><a href="##(ZONE_POLYGON_BASE)">#ZONE_POLYGON_BASE</a></em>
<a id="ZONE_POLYGON_BASE" >
<strong>ZONE_POLYGON_BASE</strong>
</a>
</dt>
<dd>
</dd>
</dl>
<dl class="function">
@ -612,6 +667,20 @@ The smoke color.</p>
</li>
</ul>
</dd>
</dl>
<dl class="function">
<dt>
<em>#string</em>
<a id="#(ZONE_BASE).ZoneName" >
<strong>ZONE_BASE.ZoneName</strong>
</a>
</dt>
<dd>
<p>Name of the zone.</p>
</dd>
</dl>
@ -632,33 +701,6 @@ The smoke color.</p>
</dd>
</dl>
<dl class="function">
<dt>
<a id="#(ZONE_POLYGON).IsPointVec2InZone" >
<strong>ZONE_POLYGON:IsPointVec2InZone(PointVec2)</strong>
</a>
</dt>
<dd>
<p>Returns if a location is within the zone.</p>
<h3>Parameter</h3>
<ul>
<li>
<p><code><em><a href="DCSTypes.html##(Vec2)">DCSTypes#Vec2</a> PointVec2 </em></code>:
The location to test.</p>
</li>
</ul>
<h3>Return value</h3>
<p><em>#boolean:</em>
true if the location is within the zone.</p>
</dd>
</dl>
<dl class="function">
@ -697,11 +739,126 @@ self</p>
</dd>
</dl>
<h2><a id="#(ZONE_POLYGON_BASE)" >Type <code>ZONE_POLYGON_BASE</code></a></h2>
<p>The ZONE<em>POLYGON</em>BASE class defined by an array of <a href="DCSTypes.html##(Vec2)">DCSTypes#Vec2</a>, forming a polygon.</p>
<h3>Field(s)</h3>
<dl class="function">
<dt>
<a id="#(ZONE_POLYGON).SmokeZone" >
<strong>ZONE_POLYGON:SmokeZone(SmokeColor)</strong>
<em>#string</em>
<a id="#(ZONE_POLYGON_BASE).ClassName" >
<strong>ZONE_POLYGON_BASE.ClassName</strong>
</a>
</dt>
<dd>
</dd>
</dl>
<dl class="function">
<dt>
<a id="#(ZONE_POLYGON_BASE).Flush" >
<strong>ZONE_POLYGON_BASE:Flush()</strong>
</a>
</dt>
<dd>
<p>Flush polygon coordinates as a table in DCS.log.</p>
<h3>Return value</h3>
<p><em><a href="##(ZONE_POLYGON_BASE)">#ZONE<em>POLYGON</em>BASE</a>:</em>
self</p>
</dd>
</dl>
<dl class="function">
<dt>
<a id="#(ZONE_POLYGON_BASE).IsPointVec2InZone" >
<strong>ZONE_POLYGON_BASE:IsPointVec2InZone(PointVec2)</strong>
</a>
</dt>
<dd>
<p>Returns if a location is within the zone.</p>
<h3>Parameter</h3>
<ul>
<li>
<p><code><em><a href="DCSTypes.html##(Vec2)">DCSTypes#Vec2</a> PointVec2 </em></code>:
The location to test.</p>
</li>
</ul>
<h3>Return value</h3>
<p><em>#boolean:</em>
true if the location is within the zone.</p>
</dd>
</dl>
<dl class="function">
<dt>
<a id="#(ZONE_POLYGON_BASE).New" >
<strong>ZONE_POLYGON_BASE:New(ZoneName, PointsArray)</strong>
</a>
</dt>
<dd>
<p>Constructor to create a ZONE<em>POLYGON</em>BASE instance, taking the zone name and an array of <a href="DCSTypes.html##(Vec2)">DCSTypes#Vec2</a>, forming a polygon.</p>
<p>The <a href="Group.html##(GROUP)">Group#GROUP</a> waypoints define the polygon corners. The first and the last point are automatically connected.</p>
<h3>Parameters</h3>
<ul>
<li>
<p><code><em>#string ZoneName </em></code>:
Name of the zone.</p>
</li>
<li>
<p><code><em><a href="##(ZONE_POLYGON_BASE.ListVec2)">#ZONE<em>POLYGON</em>BASE.ListVec2</a> PointsArray </em></code>:
An array of <a href="DCSTypes.html##(Vec2)">DCSTypes#Vec2</a>, forming a polygon..</p>
</li>
</ul>
<h3>Return value</h3>
<p><em><a href="##(ZONE_POLYGON_BASE)">#ZONE<em>POLYGON</em>BASE</a>:</em>
self</p>
</dd>
</dl>
<dl class="function">
<dt>
<em><a href="##(ZONE_POLYGON_BASE.ListVec2)">#ZONE_POLYGON_BASE.ListVec2</a></em>
<a id="#(ZONE_POLYGON_BASE).Polygon" >
<strong>ZONE_POLYGON_BASE.Polygon</strong>
</a>
</dt>
<dd>
<p>The polygon defined by an array of <a href="DCSTypes.html##(Vec2)">DCSTypes#Vec2</a>.</p>
</dd>
</dl>
<dl class="function">
<dt>
<a id="#(ZONE_POLYGON_BASE).SmokeZone" >
<strong>ZONE_POLYGON_BASE:SmokeZone(SmokeColor)</strong>
</a>
</dt>
<dd>
@ -719,12 +876,17 @@ The smoke color.</p>
</ul>
<h3>Return value</h3>
<p><em><a href="##(ZONE_POLYGON)">#ZONE_POLYGON</a>:</em>
<p><em><a href="##(ZONE_POLYGON_BASE)">#ZONE<em>POLYGON</em>BASE</a>:</em>
self</p>
</dd>
</dl>
<h2><a id="#(ZONE_POLYGON_BASE.ListVec2)" >Type <code>ZONE_POLYGON_BASE.ListVec2</code></a></h2>
<p>A points array.</p>
<h2><a id="#(ZONE_RADIUS)" >Type <code>ZONE_RADIUS</code></a></h2>
<p>The ZONE_RADIUS class, defined by a zone name, a location and a radius.</p>

View File

@ -19,6 +19,7 @@
<ul>
<li><a href="AIBalancer.html">AIBalancer</a></li>
<li><a href="Airbase.html">Airbase</a></li>
<li><a href="AirbasePolice.html">AirbasePolice</a></li>
<li><a href="Base.html">Base</a></li>
<li><a href="CARGO.html">CARGO</a></li>
<li><a href="CleanUp.html">CleanUp</a></li>

View File

@ -19,6 +19,7 @@
<ul>
<li><a href="AIBalancer.html">AIBalancer</a></li>
<li><a href="Airbase.html">Airbase</a></li>
<li><a href="AirbasePolice.html">AirbasePolice</a></li>
<li><a href="Base.html">Base</a></li>
<li><a href="CARGO.html">CARGO</a></li>
<li><a href="CleanUp.html">CleanUp</a></li>
@ -89,12 +90,18 @@
<ul>
<li>Support all DCS Airbase APIs.</li>
</ul>
</td>
</tr>
<tr>
<td class="name" nowrap="nowrap"><a href="AirbasePolice.html">AirbasePolice</a></td>
<td class="summary">
<p>This module contains the AIRBASEPOLICE classes.</p>
</td>
</tr>
<tr>
<td class="name" nowrap="nowrap"><a href="Base.html">Base</a></td>
<td class="summary">
<p>BASE classes.</p>
<p>This module contains the BASE class.</p>
</td>
</tr>
<tr>
@ -304,7 +311,7 @@
<tr>
<td class="name" nowrap="nowrap"><a href="Scheduler.html">Scheduler</a></td>
<td class="summary">
<p>Models time events calling event handing functions.</p>
<p>This module contains the SCHEDULER class.</p>
</td>
</tr>
<tr>

View File

@ -19,6 +19,7 @@
<ul>
<li><a href="AIBalancer.html">AIBalancer</a></li>
<li><a href="Airbase.html">Airbase</a></li>
<li><a href="AirbasePolice.html">AirbasePolice</a></li>
<li><a href="Base.html">Base</a></li>
<li><a href="CARGO.html">CARGO</a></li>
<li><a href="CleanUp.html">CleanUp</a></li>
@ -95,6 +96,12 @@
<td class="name" nowrap="nowrap"><a href="##(land).getHeight">land.getHeight(point)</a></td>
<td class="summary">
<p>Returns altitude MSL of the point.</p>
</td>
</tr>
<tr>
<td class="name" nowrap="nowrap"><a href="##(land).getSurfaceType">land.getSurfaceType(point)</a></td>
<td class="summary">
<p>returns surface type at the given point.</p>
</td>
</tr>
</table>
@ -189,6 +196,33 @@ point on the ground. </p>
<p><em><a href="DCSTypes.html##(Distance)">DCSTypes#Distance</a>:</em></p>
</dd>
</dl>
<dl class="function">
<dt>
<a id="#(land).getSurfaceType" >
<strong>land.getSurfaceType(point)</strong>
</a>
</dt>
<dd>
<p>returns surface type at the given point.</p>
<h3>Parameter</h3>
<ul>
<li>
<p><code><em><a href="##(Vec2)">#Vec2</a> point </em></code>:
Point on the land. </p>
</li>
</ul>
<h3>Return value</h3>
<p><em><a href="##(land.SurfaceType)">#land.SurfaceType</a>:</em></p>
</dd>
</dl>

View File

@ -19,6 +19,7 @@
<ul>
<li><a href="AIBalancer.html">AIBalancer</a></li>
<li><a href="Airbase.html">Airbase</a></li>
<li><a href="AirbasePolice.html">AirbasePolice</a></li>
<li><a href="Base.html">Base</a></li>
<li><a href="CARGO.html">CARGO</a></li>
<li><a href="CleanUp.html">CleanUp</a></li>