This commit is contained in:
FlightControl 2016-06-13 18:47:38 +02:00
parent 32a179d0b6
commit 61f55b3bd8
30 changed files with 1095 additions and 40401 deletions

View File

@ -1,89 +1,930 @@
--- 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
--- @type AIRBASEPOLICE_BASE
-- @field Set#SET_CLIENT SetClient
-- @extends Base#BASE
AIRBASEPOLICE = {
ClassName = "AIRBASEPOLICE",
PolygonsTaxiways = {},
PolygonsRunways = {},
AIRBASEPOLICE_BASE = {
ClassName = "AIRBASEPOLICE_BASE",
SetClient = nil,
Airbases = nil,
AirbaseNames = nil,
}
--- Creates a new AIRBASEPOLICE object.
-- @param #AIRBASEPOLICE self
--- 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.
-- @return #AIRBASEPOLICE self
function AIRBASEPOLICE:New( SetClient )
-- @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
local PolygonBatumiTaxiwaysGroup1 = GROUP:FindByName( "Polygon Batumi Taxiway 1" )
self.PolygonsTaxiways[#self.PolygonsTaxiways+1] = ZONE_POLYGON:New( "Batumi Taxiway", PolygonBatumiTaxiwaysGroup1 ):SmokeZone(POINT_VEC3.SmokeColor.White)
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
local PolygonBatumiRunwaysGroup1 = GROUP:FindByName( "Polygon Batumi Runway 1" )
self.PolygonsRunways[#self.PolygonsRunways+1] = ZONE_POLYGON:New( "Batumi Runway", PolygonBatumiRunwaysGroup1 ):SmokeZone(POINT_VEC3.SmokeColor.Red)
-- -- 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, 5, 0 )
self.AirbaseMonitor = SCHEDULER:New( self, self._AirbaseMonitor, {}, 0, 2, 0.05 )
return self
end
--- @param #AIRBASEPOLICE self
function AIRBASEPOLICE:_AirbaseMonitor()
--- @type AIRBASEPOLICE_BASE.AirbaseNames
-- @list <#string>
for PolygonTaxiID, PolygonTaxi in pairs( self.PolygonsTaxiways ) do
self.SetClient:ForEachClientInZone( PolygonTaxi,
--- 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 > 10 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
--- @param Client#CLIENT Client
function( Client )
if Client:IsAlive() then
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 > 10 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, "Speeding", "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, "Speeding", "Attention! " )
Client:SetState( self, "Speeding", true )
Client:SetState( self, "Warnings", 1 )
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
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] = {
[1]={["y"]=242140.57142858,["x"]=-6478.8571428583,},
[2]={["y"]=242188.57142858,["x"]=-6522.0000000011,},
[3]={["y"]=244124.2857143,["x"]=-4344.0000000011,},
[4]={["y"]=244068.2857143,["x"]=-4296.5714285726,},
[5]={["y"]=242140.57142858,["x"]=-6480.0000000011,},
},
},
ZoneBoundary = {},
ZoneRunways = {},
MaximumSpeed = 40,
},
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"]=616451.42857142,["x"]=-355103.14285715,},
[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 = 40,
},
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 = 40,
},
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 = 40,
},
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 = 40,
},
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 = 45,
},
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 = 40,
},
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 = 40,
},
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 = 40,
},
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 = 40,
},
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 = 40,
},
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 = 40,
},
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 = 40,
},
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 = 40,
},
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 = 40,
},
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 = 40,
},
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 = 40,
},
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 = 40,
},
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 = 40,
},
},
}
--- 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

@ -333,6 +333,7 @@ function BASE:SetState( Object, StateName, State )
end
self.States[ClassNameAndID][StateName] = State
self:E( { "SetState " .. ClassNameAndID .. "." .. StateName, State } )
return self.States[ClassNameAndID][StateName]
end
@ -341,6 +342,7 @@ function BASE:GetState( Object, StateName )
local ClassNameAndID = Object:GetClassNameAndID()
if self.States[ClassNameAndID] then
self:E( { " GetState " .. ClassNameAndID .. "." .. StateName, self.States[ClassNameAndID][StateName] } )
return self.States[ClassNameAndID][StateName]
end

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

@ -173,7 +173,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 +187,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
@ -420,7 +420,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 +435,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 +453,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

@ -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

@ -633,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}.
@ -646,10 +650,14 @@ end
function UNIT:IsNotInZone( Zone )
self:F2( { self.UnitName, Zone } )
local IsInZone = not Zone:IsPointVec3InZone( self:GetPointVec3() )
if self:IsAlive() then
local IsInZone = not Zone:IsPointVec3InZone( self:GetPointVec3() )
self:T( { IsInZone } )
return IsInZone
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

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -1,6 +1,3 @@
local PlanesClientSet = SET_CLIENT:New():FilterCategories( "plane" ):FilterStart()
local AirbasePolice = AIRBASEPOLICE:New( PlanesClientSet )
local PolygonBatumiTaxiwaysGroup1 = GROUP:FindByName( "Polygon Batumi Taxiways" )
local PolygonBatumiTaxi = ZONE_POLYGON:New( "Batumi Taxi", PolygonBatumiTaxiwaysGroup1 ):SmokeZone(POINT_VEC3.SmokeColor.White)
local AirbasePolice = AIRBASEPOLICE_CAUCASUS:New( PlanesClientSet )