From 63ba44dca2b35e5196747a394b3301a9d5498796 Mon Sep 17 00:00:00 2001 From: FlightControl_Master Date: Sat, 21 Oct 2017 07:42:19 +0200 Subject: [PATCH 1/3] * Create GROUP Templates out of the fly, so even when not in the mission. * Added smoke Altitude and AngleOffset to ZONE_RADIUS for Smoke --- Moose Development/Moose/Core/Database.lua | 61 ++++++++++------------- Moose Development/Moose/Core/Spawn.lua | 14 ++++-- Moose Development/Moose/Core/Zone.lua | 18 +++++-- Moose Development/Moose/Wrapper/Group.lua | 28 ++++++++++- 4 files changed, 73 insertions(+), 48 deletions(-) diff --git a/Moose Development/Moose/Core/Database.lua b/Moose Development/Moose/Core/Database.lua index bf8ef630e..5a932326d 100644 --- a/Moose Development/Moose/Core/Database.lua +++ b/Moose Development/Moose/Core/Database.lua @@ -2,8 +2,19 @@ -- -- ==== -- --- 1) @{#DATABASE} class, extends @{Base#BASE} --- =================================================== +-- ### Author: **Sven Van de Velde (FlightControl)** +-- ### Contributions: +-- +-- ==== +-- +-- @module Database + + +--- @type DATABASE +-- @extends Core.Base#BASE + +--- # DATABASE class, extends @{Base#BASE} +-- -- Mission designers can use the DATABASE class to refer to: -- -- * STATICS @@ -17,35 +28,10 @@ -- -- On top, for internal MOOSE administration purposes, the DATBASE administers the Unit and Group TEMPLATES as defined within the Mission Editor. -- --- Moose will automatically create one instance of the DATABASE class into the **global** object _DATABASE. --- Moose refers to _DATABASE within the framework extensively, but you can also refer to the _DATABASE object within your missions if required. +-- The singleton object **_DATABASE** is automatically created by MOOSE, that administers all objects within the mission. +-- Moose refers to **_DATABASE** within the framework extensively, but you can also refer to the _DATABASE object within your missions if required. -- --- 1.1) DATABASE iterators --- ----------------------- --- You can iterate the database with the available iterator methods. --- The iterator methods will walk the DATABASE set, and call for each element within the set a function that you provide. --- The following iterator methods are currently available within the DATABASE: --- --- * @{#DATABASE.ForEachUnit}: Calls a function for each @{UNIT} it finds within the DATABASE. --- * @{#DATABASE.ForEachGroup}: Calls a function for each @{GROUP} it finds within the DATABASE. --- * @{#DATABASE.ForEachPlayer}: Calls a function for each alive player it finds within the DATABASE. --- * @{#DATABASE.ForEachPlayerJoined}: Calls a function for each joined player it finds within the DATABASE. --- * @{#DATABASE.ForEachClient}: Calls a function for each @{CLIENT} it finds within the DATABASE. --- * @{#DATABASE.ForEachClientAlive}: Calls a function for each alive @{CLIENT} it finds within the DATABASE. --- --- === --- --- --- ### Author: **Sven Van de Velde (FlightControl)** --- ### Contributions: --- --- ==== --- @module Database - - ---- DATABASE class --- @type DATABASE --- @extends Core.Base#BASE +-- @field #DATABASE DATABASE = { ClassName = "DATABASE", Templates = { @@ -418,10 +404,13 @@ end --- Private method that registers new Group Templates within the DATABASE Object. -- @param #DATABASE self -- @param #table GroupTemplate +-- @param Dcs.DCScoalition#coalition.side CoalitionSide The coalition.side of the object. +-- @param Dcs.DCSObject#Object.Category CategoryID The Object.category of the object. +-- @param Dcs.DCScountry#country.id CountryID the country.id of the object -- @return #DATABASE self -function DATABASE:_RegisterGroupTemplate( GroupTemplate, CoalitionID, CategoryID, CountryID ) +function DATABASE:_RegisterGroupTemplate( GroupTemplate, CoalitionSide, CategoryID, CountryID, GroupName ) - local GroupTemplateName = env.getValueDictByKey(GroupTemplate.name) + local GroupTemplateName = GroupName or env.getValueDictByKey( GroupTemplate.name ) local TraceTable = {} @@ -436,7 +425,7 @@ function DATABASE:_RegisterGroupTemplate( GroupTemplate, CoalitionID, CategoryID end GroupTemplate.CategoryID = CategoryID - GroupTemplate.CoalitionID = CoalitionID + GroupTemplate.CoalitionID = CoalitionSide GroupTemplate.CountryID = CountryID self.Templates.Groups[GroupTemplateName].GroupName = GroupTemplateName @@ -445,7 +434,7 @@ function DATABASE:_RegisterGroupTemplate( GroupTemplate, CoalitionID, CategoryID self.Templates.Groups[GroupTemplateName].UnitCount = #GroupTemplate.units self.Templates.Groups[GroupTemplateName].Units = GroupTemplate.units self.Templates.Groups[GroupTemplateName].CategoryID = CategoryID - self.Templates.Groups[GroupTemplateName].CoalitionID = CoalitionID + self.Templates.Groups[GroupTemplateName].CoalitionID = CoalitionSide self.Templates.Groups[GroupTemplateName].CountryID = CountryID @@ -472,13 +461,13 @@ function DATABASE:_RegisterGroupTemplate( GroupTemplate, CoalitionID, CategoryID self.Templates.Units[UnitTemplate.name].GroupTemplate = GroupTemplate self.Templates.Units[UnitTemplate.name].GroupId = GroupTemplate.groupId self.Templates.Units[UnitTemplate.name].CategoryID = CategoryID - self.Templates.Units[UnitTemplate.name].CoalitionID = CoalitionID + self.Templates.Units[UnitTemplate.name].CoalitionID = CoalitionSide self.Templates.Units[UnitTemplate.name].CountryID = CountryID if UnitTemplate.skill and (UnitTemplate.skill == "Client" or UnitTemplate.skill == "Player") then self.Templates.ClientsByName[UnitTemplate.name] = UnitTemplate self.Templates.ClientsByName[UnitTemplate.name].CategoryID = CategoryID - self.Templates.ClientsByName[UnitTemplate.name].CoalitionID = CoalitionID + self.Templates.ClientsByName[UnitTemplate.name].CoalitionID = CoalitionSide self.Templates.ClientsByName[UnitTemplate.name].CountryID = CountryID self.Templates.ClientsByID[UnitTemplate.unitId] = UnitTemplate end diff --git a/Moose Development/Moose/Core/Spawn.lua b/Moose Development/Moose/Core/Spawn.lua index d82fb5edb..23b38b24f 100644 --- a/Moose Development/Moose/Core/Spawn.lua +++ b/Moose Development/Moose/Core/Spawn.lua @@ -298,7 +298,7 @@ function SPAWN:New( SpawnTemplatePrefix ) local self = BASE:Inherit( self, BASE:New() ) -- #SPAWN self:F( { SpawnTemplatePrefix } ) - local TemplateGroup = Group.getByName( SpawnTemplatePrefix ) + local TemplateGroup = GROUP:FindByName( SpawnTemplatePrefix ) if TemplateGroup then self.SpawnTemplatePrefix = SpawnTemplatePrefix self.SpawnIndex = 0 @@ -342,7 +342,7 @@ function SPAWN:NewWithAlias( SpawnTemplatePrefix, SpawnAliasPrefix ) local self = BASE:Inherit( self, BASE:New() ) self:F( { SpawnTemplatePrefix, SpawnAliasPrefix } ) - local TemplateGroup = Group.getByName( SpawnTemplatePrefix ) + local TemplateGroup = GROUP:FindByName( SpawnTemplatePrefix ) if TemplateGroup then self.SpawnTemplatePrefix = SpawnTemplatePrefix self.SpawnAliasPrefix = SpawnAliasPrefix @@ -1244,14 +1244,18 @@ function SPAWN:SpawnFromVec3( Vec3, SpawnIndex ) local TY = Vec3.z + ( SY - BY ) SpawnTemplate.units[UnitID].x = TX SpawnTemplate.units[UnitID].y = TY - SpawnTemplate.units[UnitID].alt = Vec3.y + if SpawnTemplate.CategoryID ~= Group.Category.SHIP then + SpawnTemplate.units[UnitID].alt = Vec3.y + end self:T( 'After Translation SpawnTemplate.units['..UnitID..'].x = ' .. SpawnTemplate.units[UnitID].x .. ', SpawnTemplate.units['..UnitID..'].y = ' .. SpawnTemplate.units[UnitID].y ) end SpawnTemplate.route.points[1].x = Vec3.x SpawnTemplate.route.points[1].y = Vec3.z - SpawnTemplate.route.points[1].alt = Vec3.y - + if SpawnTemplate.CategoryID ~= Group.Category.SHIP then + SpawnTemplate.route.points[1].alt = Vec3.y + end + SpawnTemplate.x = Vec3.x SpawnTemplate.y = Vec3.z diff --git a/Moose Development/Moose/Core/Zone.lua b/Moose Development/Moose/Core/Zone.lua index 245360fb6..a47761cb9 100644 --- a/Moose Development/Moose/Core/Zone.lua +++ b/Moose Development/Moose/Core/Zone.lua @@ -458,12 +458,17 @@ end -- @param #ZONE_RADIUS self -- @param Utilities.Utils#SMOKECOLOR SmokeColor The smoke color. -- @param #number Points (optional) The amount of points in the circle. +-- @param #number AddHeight (optional) The height to be added for the smoke. +-- @param #number AddOffSet (optional) The angle to be added for the smoking start position. -- @return #ZONE_RADIUS self -function ZONE_RADIUS:SmokeZone( SmokeColor, Points ) +function ZONE_RADIUS:SmokeZone( SmokeColor, Points, AddHeight, AngleOffset ) self:F2( SmokeColor ) local Point = {} local Vec2 = self:GetVec2() + + AddHeight = AddHeight or 0 + AngleOffset = AngleOffset or 0 Points = Points and Points or 360 @@ -471,10 +476,10 @@ function ZONE_RADIUS:SmokeZone( SmokeColor, Points ) local RadialBase = math.pi*2 for Angle = 0, 360, 360 / Points do - local Radial = Angle * RadialBase / 360 + local Radial = ( Angle + AngleOffset ) * RadialBase / 360 Point.x = Vec2.x + math.cos( Radial ) * self:GetRadius() Point.y = Vec2.y + math.sin( Radial ) * self:GetRadius() - POINT_VEC2:New( Point.x, Point.y ):Smoke( SmokeColor ) + POINT_VEC2:New( Point.x, Point.y, AddHeight ):Smoke( SmokeColor ) end return self @@ -486,13 +491,16 @@ end -- @param Utilities.Utils#FLARECOLOR FlareColor The flare color. -- @param #number Points (optional) The amount of points in the circle. -- @param Dcs.DCSTypes#Azimuth Azimuth (optional) Azimuth The azimuth of the flare. +-- @param #number AddHeight (optional) The height to be added for the smoke. -- @return #ZONE_RADIUS self -function ZONE_RADIUS:FlareZone( FlareColor, Points, Azimuth ) +function ZONE_RADIUS:FlareZone( FlareColor, Points, Azimuth, AddHeight ) self:F2( { FlareColor, Azimuth } ) local Point = {} local Vec2 = self:GetVec2() + AddHeight = AddHeight or 0 + Points = Points and Points or 360 local Angle @@ -502,7 +510,7 @@ function ZONE_RADIUS:FlareZone( FlareColor, Points, Azimuth ) local Radial = Angle * RadialBase / 360 Point.x = Vec2.x + math.cos( Radial ) * self:GetRadius() Point.y = Vec2.y + math.sin( Radial ) * self:GetRadius() - POINT_VEC2:New( Point.x, Point.y ):Flare( FlareColor, Azimuth ) + POINT_VEC2:New( Point.x, Point.y, AddHeight ):Flare( FlareColor, Azimuth ) end return self diff --git a/Moose Development/Moose/Wrapper/Group.lua b/Moose Development/Moose/Wrapper/Group.lua index c4074bb7c..90d239b75 100644 --- a/Moose Development/Moose/Wrapper/Group.lua +++ b/Moose Development/Moose/Wrapper/Group.lua @@ -110,9 +110,33 @@ GROUPTEMPLATE.Takeoff = { [GROUP.Takeoff.Cold] = { "TakeOffParking", "From Parking Area" } } ---- Create a new GROUP from a DCSGroup +--- Create a new GROUP from a given GroupTemplate as a parameter. +-- Note that the GroupTemplate is NOT spawned into the mission. +-- It is merely added to the @{Database}. -- @param #GROUP self --- @param Dcs.DCSWrapper.Group#Group GroupName The DCS Group name +-- @param #table GroupTemplate The GroupTemplate Structure exactly as defined within the mission editor. +-- @param Dcs.DCScoalition#coalition.side CoalitionSide The coalition.side of the group. +-- @param Dcs.DCSGroup#Group.Category CategoryID The Group.Category of the group. +-- @param Dcs.DCScountry#country.id CountryID the country.id of the group. +-- @return #GROUP self +function GROUP:NewTemplate( GroupTemplate, CoalitionSide, CategoryID, CountryID ) + local GroupName = GroupTemplate.name + _DATABASE:_RegisterGroupTemplate( GroupTemplate, CategoryID, CountryID, CoalitionSide, GroupName ) + self = BASE:Inherit( self, CONTROLLABLE:New( GroupName ) ) + self:F2( GroupName ) + self.GroupName = GroupName + + _DATABASE:AddGroup( GroupName ) + + self:SetEventPriority( 4 ) + return self +end + + + +--- Create a new GROUP from an existing Group in the Mission. +-- @param #GROUP self +-- @param #string GroupName The Group name -- @return #GROUP self function GROUP:Register( GroupName ) self = BASE:Inherit( self, CONTROLLABLE:New( GroupName ) ) From b7528dad2e7030d59dd6dc5730b44cadfe002e22 Mon Sep 17 00:00:00 2001 From: FlightControl_Master Date: Sat, 21 Oct 2017 12:04:05 +0200 Subject: [PATCH 2/3] Improved airbase police --- Moose Development/Moose/Core/Database.lua | 2 + .../Moose/Functional/AirbasePolice.lua | 423 +++--------------- Moose Mission Setup/Moose.lua | 2 +- Moose Mission Setup/Moose_.lua | 2 +- docs/Documentation/AI_A2A.html | 1 - docs/Documentation/AirbasePolice.html | 119 +++-- docs/Documentation/Cargo.html | 2 +- docs/Documentation/Designate.html | 3 +- docs/Documentation/Detection.html | 2 +- docs/Documentation/Movement.html | 4 + docs/Documentation/Positionable.html | 1 + docs/Documentation/Settings.html | 2 +- docs/Documentation/Spawn.html | 30 +- docs/Documentation/Task_Cargo.html | 2 +- 14 files changed, 147 insertions(+), 448 deletions(-) diff --git a/Moose Development/Moose/Core/Database.lua b/Moose Development/Moose/Core/Database.lua index bf8ef630e..2dad882c9 100644 --- a/Moose Development/Moose/Core/Database.lua +++ b/Moose Development/Moose/Core/Database.lua @@ -1155,3 +1155,5 @@ end + + diff --git a/Moose Development/Moose/Functional/AirbasePolice.lua b/Moose Development/Moose/Functional/AirbasePolice.lua index 3e95d65ec..35fa2ca46 100644 --- a/Moose Development/Moose/Functional/AirbasePolice.lua +++ b/Moose Development/Moose/Functional/AirbasePolice.lua @@ -23,13 +23,16 @@ AIRBASEPOLICE_BASE = { AirbaseNames = nil, } +--- @type AIRBASEPOLICE_BASE.AirbaseNames +-- @list <#string> + --- 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 ) +function AIRBASEPOLICE_BASE:New( SetClient, Airbases, AirbaseList ) -- Inherits from BASE local self = BASE:Inherit( self, BASE:New() ) @@ -37,12 +40,21 @@ function AIRBASEPOLICE_BASE:New( SetClient, Airbases ) self.SetClient = SetClient self.Airbases = Airbases + + self.AirbaseList = AirbaseList for AirbaseID, Airbase in pairs( self.Airbases ) do - Airbase.ZoneBoundary = ZONE_POLYGON_BASE:New( "Boundary", Airbase.PointsBoundary ):SmokeZone(SMOKECOLOR.White):Flush() + Airbase.ZoneBoundary = _DATABASE:FindAirbase( AirbaseID ):GetZone() + Airbase.ZoneRunways = {} for PointsRunwayID, PointsRunway in pairs( Airbase.PointsRunways ) do - Airbase.ZoneRunways[PointsRunwayID] = ZONE_POLYGON_BASE:New( "Runway " .. PointsRunwayID, PointsRunway ):SmokeZone(SMOKECOLOR.Red):Flush() - end + Airbase.ZoneRunways[PointsRunwayID] = ZONE_POLYGON_BASE:New( "Runway " .. PointsRunwayID, PointsRunway ) + end + Airbase.Monitor = self.AirbaseList and false or true -- When AirbaseList is not given, monitor every Airbase, otherwise don't monitor any (yet). + end + + -- Now activate the monitoring for the airbases that need to be monitored. + for AirbaseID, AirbaseName in pairs( self.AirbaseList or {} ) do + self.Airbases[AirbaseName].Monitor = true end -- -- Template @@ -70,34 +82,31 @@ function AIRBASEPOLICE_BASE:New( SetClient, Airbases ) return self end ---- @type AIRBASEPOLICE_BASE.AirbaseNames --- @list <#string> ---- Monitor a table of airbase names. +--- Smoke the airbases runways. -- @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. +-- @param Utilities.Utils#SMOKECOLOR SmokeColor The color of the smoke around the runways. -- @return #AIRBASEPOLICE_BASE self -function AIRBASEPOLICE_BASE:Monitor( AirbaseNames ) +function AIRBASEPOLICE_BASE:SmokeRunways( SmokeColor ) - if AirbaseNames then - if type( AirbaseNames ) == "table" then - self.AirbaseNames = AirbaseNames - else - self.AirbaseNames = { AirbaseNames } - end + for AirbaseID, Airbase in pairs( self.Airbases ) do + for PointsRunwayID, PointsRunway in pairs( Airbase.PointsRunways ) do + Airbase.ZoneRunways[PointsRunwayID]:SmokeZone( SmokeColor ) + end end end + --- @param #AIRBASEPOLICE_BASE self function AIRBASEPOLICE_BASE:_AirbaseMonitor() - for AirbaseID, Airbase in pairs( self.Airbases ) do + for AirbaseID, AirbaseMeta in pairs( self.Airbases ) do - if not self.AirbaseNames or self.AirbaseNames[AirbaseID] then + if AirbaseMeta.Monitor == true then self:E( AirbaseID ) - self.SetClient:ForEachClientInZone( Airbase.ZoneBoundary, + self.SetClient:ForEachClientInZone( AirbaseMeta.ZoneBoundary, --- @param Wrapper.Client#CLIENT Client function( Client ) @@ -105,7 +114,7 @@ function AIRBASEPOLICE_BASE:_AirbaseMonitor() self:E( Client.UnitName ) if Client:IsAlive() then local NotInRunwayZone = true - for ZoneRunwayID, ZoneRunway in pairs( Airbase.ZoneRunways ) do + for ZoneRunwayID, ZoneRunway in pairs( AirbaseMeta.ZoneRunways ) do NotInRunwayZone = ( Client:IsNotInZone( ZoneRunway ) == true ) and NotInRunwayZone or false end @@ -113,7 +122,7 @@ function AIRBASEPOLICE_BASE:_AirbaseMonitor() 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" ) + Client:Message( "Welcome at " .. AirbaseID .. ". The maximum taxiing speed is " .. AirbaseMeta.MaximumSpeed " km/h.", 20, "ATC" ) self:SetState( self, "Taxi", true ) end @@ -128,7 +137,7 @@ function AIRBASEPOLICE_BASE:_AirbaseMonitor() if IsAboveRunway and IsOnGround then - if Velocity > Airbase.MaximumSpeed then + if Velocity > AirbaseMeta.MaximumSpeed then local IsSpeeding = Client:GetState( self, "Speeding" ) if IsSpeeding == true then @@ -136,10 +145,11 @@ function AIRBASEPOLICE_BASE:_AirbaseMonitor() self:T( SpeedingWarnings ) if SpeedingWarnings <= 3 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 .. " / 3" ) + Client:Message( "Warning " .. SpeedingWarnings .. "/3! Airbase traffic rule violation! Slow down now! Your speed is " .. + string.format( "%2.0f km/h", Velocity ), 5, "ATC" ) Client:SetState( self, "Warnings", SpeedingWarnings + 1 ) else - MESSAGE:New( "Player " .. Client:GetPlayerName() .. " is being kicked from the airbase, due to a speeding violation ...", 10, "Airbase Police" ):ToAll() + MESSAGE:New( "Penalty! Player " .. Client:GetPlayerName() .. " is kicked, due to a severe airbase traffic rule violation ...", 10, "ATC" ):ToAll() --- @param Wrapper.Client#CLIENT Client Client:Destroy() Client:SetState( self, "Speeding", false ) @@ -147,7 +157,7 @@ function AIRBASEPOLICE_BASE:_AirbaseMonitor() end else - Client:Message( "You are speeding on the taxiway, slow down now! Your current velocity is " .. string.format( "%2.0f km/h", Velocity ), 5, "Attention! " ) + Client:Message( "Attention! You are speeding on the taxiway, slow down! Your speed is " .. string.format( "%2.0f km/h", Velocity ), 5, "ATC" ) Client:SetState( self, "Speeding", true ) Client:SetState( self, "Warnings", 1 ) end @@ -257,16 +267,7 @@ end 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,}, - }, + [AIRBASE.Caucasus.Anapa_Vityazevo] = { PointsRunways = { [1] = { [1]={["y"]=242140.57142858,["x"]=-6478.8571428583,}, @@ -276,19 +277,9 @@ AIRBASEPOLICE_CAUCASUS = { [5]={["y"]=242140.57142858,["x"]=-6480.0000000011,} }, }, - 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,}, - }, + [AIRBASE.Caucasus.Batumi] = { PointsRunways = { [1] = { [1]={["y"]=616442.28571429,["x"]=-355090.28571429,}, @@ -307,20 +298,9 @@ AIRBASEPOLICE_CAUCASUS = { [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,}, - }, + [AIRBASE.Caucasus.Beslan] = { PointsRunways = { [1] = { [1]={["y"]=842104.57142857,["x"]=-148460.57142857,}, @@ -330,20 +310,9 @@ AIRBASEPOLICE_CAUCASUS = { [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,}, - }, + [AIRBASE.Caucasus.Gelendzhik] = { PointsRunways = { [1] = { [1]={["y"]=297834.00000001,["x"]=-51107.428571429,}, @@ -353,20 +322,9 @@ AIRBASEPOLICE_CAUCASUS = { [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,}, - }, + [AIRBASE.Caucasus.Gudauta] = { PointsRunways = { [1] = { [1]={["y"]=517096.57142857,["x"]=-197804.57142857,}, @@ -376,20 +334,9 @@ AIRBASEPOLICE_CAUCASUS = { [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,}, - }, + [AIRBASE.Caucasus.Kobuleti] = { PointsRunways = { [1] = { [1]={["y"]=634509.71428571,["x"]=-318339.42857144,}, @@ -399,20 +346,9 @@ AIRBASEPOLICE_CAUCASUS = { [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,}, - }, + [AIRBASE.Caucasus.Krasnodar_Center] = { PointsRunways = { [1] = { [1]={["y"]=369205.42857144,["x"]=11789.142857142,}, @@ -422,24 +358,9 @@ AIRBASEPOLICE_CAUCASUS = { [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,}, - }, + [AIRBASE.Caucasus.Krasnodar_Pashkovsky] = { PointsRunways = { [1] = { [1]={["y"]=385891.14285715,["x"]=8416.5714285703,}, @@ -456,18 +377,9 @@ AIRBASEPOLICE_CAUCASUS = { [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,}, - }, + [AIRBASE.Caucasus.Krymsk] = { PointsRunways = { [1] = { [1]={["y"]=293522.00000001,["x"]=-7567.4285714297,}, @@ -477,18 +389,9 @@ AIRBASEPOLICE_CAUCASUS = { [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,}, - }, + [AIRBASE.Caucasus.Kutaisi] = { PointsRunways = { [1] = { [1]={["y"]=682638,["x"]=-285202.28571429,}, @@ -498,19 +401,9 @@ AIRBASEPOLICE_CAUCASUS = { [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,}, - }, + [AIRBASE.Caucasus.Maykop_Khanskaya] = { PointsRunways = { [1] = { [1]={["y"]=457005.42857143,["x"]=-27668.000000001,}, @@ -520,22 +413,9 @@ AIRBASEPOLICE_CAUCASUS = { [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,}, - }, + [AIRBASE.Caucasus.Mineralnye_Vody] = { PointsRunways = { [1] = { [1]={["y"]=703904,["x"]=-50352.571428573,}, @@ -545,20 +425,9 @@ AIRBASEPOLICE_CAUCASUS = { [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,}, - }, + [AIRBASE.Caucasus.Mozdok] = { PointsRunways = { [1] = { [1]={["y"]=832201.14285715,["x"]=-83699.428571431,}, @@ -568,20 +437,9 @@ AIRBASEPOLICE_CAUCASUS = { [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,}, - }, + [AIRBASE.Caucasus.Nalchik] = { PointsRunways = { [1] = { [1]={["y"]=759454.28571429,["x"]=-125551.42857143,}, @@ -591,19 +449,9 @@ AIRBASEPOLICE_CAUCASUS = { [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,}, - }, + [AIRBASE.Caucasus.Novorossiysk] = { PointsRunways = { [1] = { [1]={["y"]=278673.14285716,["x"]=-41615.142857144,}, @@ -613,20 +461,9 @@ AIRBASEPOLICE_CAUCASUS = { [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,}, - }, + [AIRBASE.Caucasus.Senaki_Kolkhi] = { PointsRunways = { [1] = { [1]={["y"]=646060.85714285,["x"]=-281736,}, @@ -636,20 +473,9 @@ AIRBASEPOLICE_CAUCASUS = { [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,}, - }, + [AIRBASE.Caucasus.Sochi_Adler] = { PointsRunways = { [1] = { [1]={["y"]=460831.42857143,["x"]=-165180,}, @@ -666,18 +492,9 @@ AIRBASEPOLICE_CAUCASUS = { [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,}, - }, + [AIRBASE.Caucasus.Soganlug] = { PointsRunways = { [1] = { [1]={["y"]=894525.71428571,["x"]=-316964,}, @@ -687,19 +504,9 @@ AIRBASEPOLICE_CAUCASUS = { [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,}, - }, + [AIRBASE.Caucasus.Sukhumi_Babushara] = { PointsRunways = { [1] = { [1]={["y"]=562684,["x"]=-219779.71428571,}, @@ -709,20 +516,9 @@ AIRBASEPOLICE_CAUCASUS = { [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,}, - }, + [AIRBASE.Caucasus.Tbilisi_Lochini] = { PointsRunways = { [1] = { [1]={["y"]=895261.14285715,["x"]=-314652.28571428,}, @@ -739,21 +535,9 @@ AIRBASEPOLICE_CAUCASUS = { [5]={["y"]=895606,["x"]=-314724.85714286,} }, }, - 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,}, - }, + [AIRBASE.Caucasus.Vaziani] = { PointsRunways = { [1] = { [1]={["y"]=902239.14285714,["x"]=-318190.85714286,}, @@ -763,8 +547,6 @@ AIRBASEPOLICE_CAUCASUS = { [5]={["y"]=902247.71428571,["x"]=-318190.85714286,}, }, }, - ZoneBoundary = {}, - ZoneRunways = {}, MaximumSpeed = 50, }, }, @@ -773,11 +555,14 @@ AIRBASEPOLICE_CAUCASUS = { --- 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. +-- @param AirbaseNames A list {} of airbase names (Use AIRBASE.Caucasus enumerator). -- @return #AIRBASEPOLICE_CAUCASUS self -function AIRBASEPOLICE_CAUCASUS:New( SetClient ) +function AIRBASEPOLICE_CAUCASUS:New( SetClient, AirbaseNames ) -- Inherits from BASE - local self = BASE:Inherit( self, AIRBASEPOLICE_BASE:New( SetClient, self.Airbases ) ) + local self = BASE:Inherit( self, AIRBASEPOLICE_BASE:New( SetClient, self.Airbases, AirbaseNames ) ) + + -- -- AnapaVityazevo -- local AnapaVityazevoBoundary = GROUP:FindByName( "AnapaVityazevo Boundary" ) @@ -1053,27 +838,7 @@ end AIRBASEPOLICE_NEVADA = { ClassName = "AIRBASEPOLICE_NEVADA", Airbases = { - Nellis = { - PointsBoundary = { - [1]={["y"]=-17814.714285714,["x"]=-399823.14285714,}, - [2]={["y"]=-16875.857142857,["x"]=-398763.14285714,}, - [3]={["y"]=-16251.571428571,["x"]=-398988.85714286,}, - [4]={["y"]=-16163,["x"]=-398693.14285714,}, - [5]={["y"]=-16328.714285714,["x"]=-398034.57142857,}, - [6]={["y"]=-15943,["x"]=-397571.71428571,}, - [7]={["y"]=-15711.571428571,["x"]=-397551.71428571,}, - [8]={["y"]=-15748.714285714,["x"]=-396806,}, - [9]={["y"]=-16288.714285714,["x"]=-396517.42857143,}, - [10]={["y"]=-16751.571428571,["x"]=-396308.85714286,}, - [11]={["y"]=-17263,["x"]=-396234.57142857,}, - [12]={["y"]=-17577.285714286,["x"]=-396640.28571429,}, - [13]={["y"]=-17614.428571429,["x"]=-397400.28571429,}, - [14]={["y"]=-19405.857142857,["x"]=-399428.85714286,}, - [15]={["y"]=-19234.428571429,["x"]=-399683.14285714,}, - [16]={["y"]=-18708.714285714,["x"]=-399408.85714286,}, - [17]={["y"]=-18397.285714286,["x"]=-399657.42857143,}, - [18]={["y"]=-17814.428571429,["x"]=-399823.42857143,}, - }, + [AIRBASE.Nevada.Nellis_AFB] = { PointsRunways = { [1] = { [1]={["y"]=-18687,["x"]=-399380.28571429,}, @@ -1090,28 +855,9 @@ AIRBASEPOLICE_NEVADA = { [5]={["y"]=-18451.571428572,["x"]=-399580.85714285,}, }, }, - ZoneBoundary = {}, - ZoneRunways = {}, MaximumSpeed = 50, }, - McCarran = { - PointsBoundary = { - [1]={["y"]=-29455.285714286,["x"]=-416277.42857142,}, - [2]={["y"]=-28860.142857143,["x"]=-416492,}, - [3]={["y"]=-25044.428571429,["x"]=-416344.85714285,}, - [4]={["y"]=-24580.142857143,["x"]=-415959.14285714,}, - [5]={["y"]=-25073,["x"]=-415630.57142857,}, - [6]={["y"]=-25087.285714286,["x"]=-415130.57142857,}, - [7]={["y"]=-25830.142857143,["x"]=-414866.28571428,}, - [8]={["y"]=-26658.714285715,["x"]=-414880.57142857,}, - [9]={["y"]=-26973,["x"]=-415273.42857142,}, - [10]={["y"]=-27380.142857143,["x"]=-415187.71428571,}, - [11]={["y"]=-27715.857142857,["x"]=-414144.85714285,}, - [12]={["y"]=-27551.571428572,["x"]=-413473.42857142,}, - [13]={["y"]=-28630.142857143,["x"]=-413201.99999999,}, - [14]={["y"]=-29494.428571429,["x"]=-415437.71428571,}, - [15]={["y"]=-29455.571428572,["x"]=-416277.71428571,}, - }, + [AIRBASE.Nevada.McCarran_International_Airport] = { PointsRunways = { [1] = { [1]={["y"]=-29408.428571429,["x"]=-416016.28571428,}, @@ -1142,28 +888,9 @@ AIRBASEPOLICE_NEVADA = { [5]={["y"]=-29073.000000001,["x"]=-416386.85714284,}, }, }, - ZoneBoundary = {}, - ZoneRunways = {}, MaximumSpeed = 50, }, - Creech = { - PointsBoundary = { - [1]={["y"]=-74522.714285715,["x"]=-360887.99999998,}, - [2]={["y"]=-74197,["x"]=-360556.57142855,}, - [3]={["y"]=-74402.714285715,["x"]=-359639.42857141,}, - [4]={["y"]=-74637,["x"]=-359279.42857141,}, - [5]={["y"]=-75759.857142857,["x"]=-359005.14285712,}, - [6]={["y"]=-75834.142857143,["x"]=-359045.14285712,}, - [7]={["y"]=-75902.714285714,["x"]=-359782.28571427,}, - [8]={["y"]=-76099.857142857,["x"]=-360399.42857141,}, - [9]={["y"]=-77314.142857143,["x"]=-360219.42857141,}, - [10]={["y"]=-77728.428571429,["x"]=-360445.14285713,}, - [11]={["y"]=-77585.571428571,["x"]=-360585.14285713,}, - [12]={["y"]=-76471.285714286,["x"]=-360819.42857141,}, - [13]={["y"]=-76325.571428571,["x"]=-360942.28571427,}, - [14]={["y"]=-74671.857142857,["x"]=-360927.7142857,}, - [15]={["y"]=-74522.714285714,["x"]=-360888.85714284,}, - }, + [AIRBASE.Nevada.Creech_AFB] = { PointsRunways = { [1] = { [1]={["y"]=-74237.571428571,["x"]=-360591.7142857,}, @@ -1180,24 +907,9 @@ AIRBASEPOLICE_NEVADA = { [5]={["y"]=-75807.285714287,["x"]=-359073.42857142,}, }, }, - ZoneBoundary = {}, - ZoneRunways = {}, MaximumSpeed = 50, }, - GroomLake = { - PointsBoundary = { - [1]={["y"]=-88916.714285714,["x"]=-289102.28571425,}, - [2]={["y"]=-87023.571428572,["x"]=-290388.57142857,}, - [3]={["y"]=-85916.428571429,["x"]=-290674.28571428,}, - [4]={["y"]=-87645.000000001,["x"]=-286567.14285714,}, - [5]={["y"]=-88380.714285715,["x"]=-286388.57142857,}, - [6]={["y"]=-89670.714285715,["x"]=-283524.28571428,}, - [7]={["y"]=-89797.857142858,["x"]=-283567.14285714,}, - [8]={["y"]=-88635.000000001,["x"]=-286749.99999999,}, - [9]={["y"]=-89177.857142858,["x"]=-287207.14285714,}, - [10]={["y"]=-89092.142857144,["x"]=-288892.85714285,}, - [11]={["y"]=-88917.000000001,["x"]=-289102.85714285,}, - }, + [AIRBASE.Nevada.Groom_Lake_AFB] = { PointsRunways = { [1] = { [1]={["y"]=-86039.000000001,["x"]=-290606.28571428,}, @@ -1214,8 +926,6 @@ AIRBASEPOLICE_NEVADA = { [5]={["y"]=-86808.142857143,["x"]=-290375.7142857,}, }, }, - ZoneBoundary = {}, - ZoneRunways = {}, MaximumSpeed = 50, }, }, @@ -1224,11 +934,12 @@ AIRBASEPOLICE_NEVADA = { --- Creates a new AIRBASEPOLICE_NEVADA object. -- @param #AIRBASEPOLICE_NEVADA 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 AirbaseNames A list {} of airbase names (Use AIRBASE.Nevada enumerator). -- @return #AIRBASEPOLICE_NEVADA self -function AIRBASEPOLICE_NEVADA:New( SetClient ) +function AIRBASEPOLICE_NEVADA:New( SetClient, AirbaseNames ) -- Inherits from BASE - local self = BASE:Inherit( self, AIRBASEPOLICE_BASE:New( SetClient, self.Airbases ) ) + local self = BASE:Inherit( self, AIRBASEPOLICE_BASE:New( SetClient, self.Airbases, AirbaseNames ) ) -- -- Nellis -- local NellisBoundary = GROUP:FindByName( "Nellis Boundary" ) diff --git a/Moose Mission Setup/Moose.lua b/Moose Mission Setup/Moose.lua index c80cf58af..f5c80b970 100644 --- a/Moose Mission Setup/Moose.lua +++ b/Moose Mission Setup/Moose.lua @@ -1,5 +1,5 @@ env.info( '*** MOOSE DYNAMIC INCLUDE START *** ' ) -env.info( 'Moose Generation Timestamp: 20171010_2141' ) +env.info( 'Moose Generation Timestamp: 20171021_1203' ) local base = _G diff --git a/Moose Mission Setup/Moose_.lua b/Moose Mission Setup/Moose_.lua index 03468a43a..f76d65845 100644 --- a/Moose Mission Setup/Moose_.lua +++ b/Moose Mission Setup/Moose_.lua @@ -1,5 +1,5 @@ env.info('*** MOOSE DYNAMIC INCLUDE START *** ') -env.info('Moose Generation Timestamp: 20171010_2141') +env.info('Moose Generation Timestamp: 20171021_1203') local base=_G __Moose={} __Moose.Include=function(IncludeFile) diff --git a/docs/Documentation/AI_A2A.html b/docs/Documentation/AI_A2A.html index 67ca9d37e..54b845efc 100644 --- a/docs/Documentation/AI_A2A.html +++ b/docs/Documentation/AI_A2A.html @@ -671,7 +671,6 @@
- #number AI_A2A.IdleCount diff --git a/docs/Documentation/AirbasePolice.html b/docs/Documentation/AirbasePolice.html index 81a4fe47e..c00793f61 100644 --- a/docs/Documentation/AirbasePolice.html +++ b/docs/Documentation/AirbasePolice.html @@ -165,19 +165,7 @@

Type AIRBASEPOLICE_BASE

- - - - - - - - - + @@ -186,6 +174,12 @@ + + + + @@ -199,7 +193,7 @@

Type AIRBASEPOLICE_CAUCASUS

AIRBASEPOLICE_BASE.AirbaseNames - -
AIRBASEPOLICE_BASE:Monitor(AirbaseNames) -

Monitor a table of airbase names.

-
AIRBASEPOLICE_BASE:New(SetClient, Airbases)AIRBASEPOLICE_BASE:New(SetClient, Airbases, AirbaseList)

Creates a new AIRBASEPOLICE_BASE object.

AIRBASEPOLICE_BASE.SetClient +
AIRBASEPOLICE_BASE:SmokeRunways(SmokeColor) +

Smoke the airbases runways.

- + @@ -209,7 +203,7 @@

Type AIRBASEPOLICE_NEVADA

AIRBASEPOLICE_CAUCASUS:New(SetClient)AIRBASEPOLICE_CAUCASUS:New(SetClient, AirbaseNames)

Creates a new AIRBASEPOLICE_CAUCASUS object.

- + @@ -418,49 +412,8 @@ AirbasePoliceCaucasus = AIRBASEPOLICE_NEVADA:New( AllClientsSet )
- - -AIRBASEPOLICE_BASE.AirbaseNames - -
-
- - - -
-
-
-
- - -AIRBASEPOLICE_BASE:Monitor(AirbaseNames) - -
-
- -

Monitor a table of airbase names.

- -

Parameter

-
    -
  • - -

    #AIRBASEPOLICE_BASE.AirbaseNames AirbaseNames : -A list of AirbaseNames to monitor. If this parameters is nil, then all airbases will be monitored.

    - -
  • -
-

Return value

- -

#AIRBASEPOLICE_BASE: -self

- -
-
-
-
- -AIRBASEPOLICE_BASE:New(SetClient, Airbases) +AIRBASEPOLICE_BASE:New(SetClient, Airbases, AirbaseList)
@@ -480,6 +433,11 @@ A SET_CLIENT object that will contain the CLIENT objects to be monitored if they

Airbases : A table of Airbase Names.

+ +
  • + +

    AirbaseList :

    +
  • Return value

    @@ -501,6 +459,33 @@ self

    +
    +
    +
    +
    + + +AIRBASEPOLICE_BASE:SmokeRunways(SmokeColor) + +
    +
    + +

    Smoke the airbases runways.

    + +

    Parameter

    + +

    Return value

    + +

    #AIRBASEPOLICE_BASE: +self

    +
    @@ -525,20 +510,26 @@ self

    -AIRBASEPOLICE_CAUCASUS:New(SetClient) +AIRBASEPOLICE_CAUCASUS:New(SetClient, AirbaseNames)

    Creates a new AIRBASEPOLICE_CAUCASUS object.

    -

    Parameter

    +

    Parameters

    • SetClient : A SET_CLIENT object that will contain the CLIENT objects to be monitored if they follow the rules of the airbase.

      +
    • +
    • + +

      AirbaseNames : +A list {} of airbase names (Use AIRBASE.Caucasus enumerator).

      +

    Return value

    @@ -555,20 +546,26 @@ self

    -AIRBASEPOLICE_NEVADA:New(SetClient) +AIRBASEPOLICE_NEVADA:New(SetClient, AirbaseNames)

    Creates a new AIRBASEPOLICE_NEVADA object.

    -

    Parameter

    +

    Parameters

    • SetClient : A SET_CLIENT object that will contain the CLIENT objects to be monitored if they follow the rules of the airbase.

      +
    • +
    • + +

      AirbaseNames : +A list {} of airbase names (Use AIRBASE.Nevada enumerator).

      +

    Return value

    diff --git a/docs/Documentation/Cargo.html b/docs/Documentation/Cargo.html index ea6e33cb9..06e19e514 100644 --- a/docs/Documentation/Cargo.html +++ b/docs/Documentation/Cargo.html @@ -2269,6 +2269,7 @@ The amount of seconds to delay the action.

    + CARGO_CRATE.CargoCarrier @@ -3804,7 +3805,6 @@ The range till cargo will board.

    - #number CARGO_UNIT.RunCount diff --git a/docs/Documentation/Designate.html b/docs/Documentation/Designate.html index acd819583..8292e8e22 100644 --- a/docs/Documentation/Designate.html +++ b/docs/Documentation/Designate.html @@ -1106,7 +1106,7 @@ function below will use the range 1-7 just in case

    - #number + DESIGNATE.LaseDuration @@ -1160,7 +1160,6 @@ function below will use the range 1-7 just in case

    - DESIGNATE.LaserCodes diff --git a/docs/Documentation/Detection.html b/docs/Documentation/Detection.html index 477b2312e..1f6111db1 100644 --- a/docs/Documentation/Detection.html +++ b/docs/Documentation/Detection.html @@ -4061,7 +4061,7 @@ Return false to cancel Transition.

    - #number + DETECTION_BASE.RefreshTimeInterval diff --git a/docs/Documentation/Movement.html b/docs/Documentation/Movement.html index 3d57bc058..a14e4464c 100644 --- a/docs/Documentation/Movement.html +++ b/docs/Documentation/Movement.html @@ -237,6 +237,7 @@ on defined intervals (currently every minute).

    + #number MOVEMENT.AliveUnits @@ -245,6 +246,9 @@ on defined intervals (currently every minute).

    + +

    Contains the counter how many units are currently alive

    +
    diff --git a/docs/Documentation/Positionable.html b/docs/Documentation/Positionable.html index 0cddcefeb..3d38d59aa 100644 --- a/docs/Documentation/Positionable.html +++ b/docs/Documentation/Positionable.html @@ -1983,6 +1983,7 @@ The height in meters to add to the altitude of the positionable.

    + Core.Spot#SPOT POSITIONABLE.Spot diff --git a/docs/Documentation/Settings.html b/docs/Documentation/Settings.html index 200c0b2e4..15ac19c6a 100644 --- a/docs/Documentation/Settings.html +++ b/docs/Documentation/Settings.html @@ -1250,7 +1250,7 @@ true if metric.

    - #boolean + SETTINGS.Metric diff --git a/docs/Documentation/Spawn.html b/docs/Documentation/Spawn.html index a681b4c38..749b3fc74 100644 --- a/docs/Documentation/Spawn.html +++ b/docs/Documentation/Spawn.html @@ -848,12 +848,6 @@ and any spaces before and after the resulting name are removed.

    - - - -
    AIRBASEPOLICE_NEVADA:New(SetClient)AIRBASEPOLICE_NEVADA:New(SetClient, AirbaseNames)

    Creates a new AIRBASEPOLICE_NEVADA object.

    SPAWN:_TranslateRotate(SpawnIndex, SpawnRootX, SpawnRootY, SpawnX, SpawnY, SpawnAngle) -
    SPAWN.uncontrolled -
    @@ -2314,6 +2308,9 @@ The group that was spawned. You can use this group for further actions.

    + +

    Don't repeat the group from Take-Off till Landing and back Take-Off by ReSpawning.

    +
    @@ -2888,6 +2885,9 @@ when nothing was spawned.

    + +

    Overwrite unit names by default with group name.

    +
    @@ -3285,7 +3285,7 @@ Spawn_BE_KA50 = SPAWN:New( 'BE KA-50@RAMP-Ground Defense' ):Schedule( 600, 0.5 )
    - + #boolean SPAWN.SpawnUnControlled @@ -3309,7 +3309,7 @@ Spawn_BE_KA50 = SPAWN:New( 'BE KA-50@RAMP-Ground Defense' ):Schedule( 600, 0.5 ) -

    When the first Spawn executes, all the Groups need to be made visible before start.

    +

    Flag that indicates if all the Groups of the SpawnGroup need to be visible when Spawned.

    @@ -3889,20 +3889,6 @@ True = Continue Scheduler

    - -
    -
    -
    - - - -SPAWN.uncontrolled - -
    -
    - - -
    diff --git a/docs/Documentation/Task_Cargo.html b/docs/Documentation/Task_Cargo.html index 40b927b18..00d9af5e6 100644 --- a/docs/Documentation/Task_Cargo.html +++ b/docs/Documentation/Task_Cargo.html @@ -562,7 +562,7 @@ based on the tasking capabilities defined in Task#TA
    - Core.Cargo#CARGO_GROUP + Core.Cargo#CARGO FSM_PROCESS.Cargo From 140f81b69520c17cb5d954d73705ada0ac5a85e5 Mon Sep 17 00:00:00 2001 From: FlightControl_Master Date: Sun, 22 Oct 2017 22:39:29 +0200 Subject: [PATCH 3/3] * Added all airbases of Nevada. * Added all airbases of Normandy. --- .../Moose/Functional/AirbasePolice.lua | 1214 +++++++++++++++-- 1 file changed, 1105 insertions(+), 109 deletions(-) diff --git a/Moose Development/Moose/Functional/AirbasePolice.lua b/Moose Development/Moose/Functional/AirbasePolice.lua index 35fa2ca46..e764123af 100644 --- a/Moose Development/Moose/Functional/AirbasePolice.lua +++ b/Moose Development/Moose/Functional/AirbasePolice.lua @@ -838,54 +838,19 @@ end AIRBASEPOLICE_NEVADA = { ClassName = "AIRBASEPOLICE_NEVADA", Airbases = { - [AIRBASE.Nevada.Nellis_AFB] = { + [AIRBASE.Nevada.Boulder_City_Airport] = { PointsRunways = { [1] = { - [1]={["y"]=-18687,["x"]=-399380.28571429,}, - [2]={["y"]=-18620.714285714,["x"]=-399436.85714286,}, - [3]={["y"]=-16217.857142857,["x"]=-396596.85714286,}, - [4]={["y"]=-16300.142857143,["x"]=-396530,}, - [5]={["y"]=-18687,["x"]=-399380.85714286,}, + [1] = {["y"]=-1317.841714286,["x"]=-429014.92857142,}, + [2] = {["y"]=-951.26228571458,["x"]=-430310.21142856,}, + [3] = {["y"]=-978.11942857172,["x"]=-430317.06857142,}, + [4] = {["y"]=-1347.5088571432,["x"]=-429023.98485713,}, }, [2] = { - [1]={["y"]=-18451.571428572,["x"]=-399580.57142857,}, - [2]={["y"]=-18392.142857143,["x"]=-399628.57142857,}, - [3]={["y"]=-16011,["x"]=-396806.85714286,}, - [4]={["y"]=-16074.714285714,["x"]=-396751.71428572,}, - [5]={["y"]=-18451.571428572,["x"]=-399580.85714285,}, - }, - }, - MaximumSpeed = 50, - }, - [AIRBASE.Nevada.McCarran_International_Airport] = { - PointsRunways = { - [1] = { - [1]={["y"]=-29408.428571429,["x"]=-416016.28571428,}, - [2]={["y"]=-29408.142857144,["x"]=-416105.42857142,}, - [3]={["y"]=-24680.714285715,["x"]=-416003.14285713,}, - [4]={["y"]=-24681.857142858,["x"]=-415926.57142856,}, - [5]={["y"]=-29408.42857143,["x"]=-416016.57142856,}, - }, - [2] = { - [1]={["y"]=-28575.571428572,["x"]=-416303.14285713,}, - [2]={["y"]=-28575.571428572,["x"]=-416382.57142856,}, - [3]={["y"]=-25111.000000001,["x"]=-416309.7142857,}, - [4]={["y"]=-25111.000000001,["x"]=-416249.14285713,}, - [5]={["y"]=-28575.571428572,["x"]=-416303.7142857,}, - }, - [3] = { - [1]={["y"]=-29331.000000001,["x"]=-416275.42857141,}, - [2]={["y"]=-29259.000000001,["x"]=-416306.85714284,}, - [3]={["y"]=-28005.571428572,["x"]=-413449.7142857,}, - [4]={["y"]=-28068.714285715,["x"]=-413422.85714284,}, - [5]={["y"]=-29331.000000001,["x"]=-416275.7142857,}, - }, - [4] = { - [1]={["y"]=-29073.285714286,["x"]=-416386.57142856,}, - [2]={["y"]=-28997.285714286,["x"]=-416417.42857141,}, - [3]={["y"]=-27697.571428572,["x"]=-413464.57142856,}, - [4]={["y"]=-27767.857142858,["x"]=-413434.28571427,}, - [5]={["y"]=-29073.000000001,["x"]=-416386.85714284,}, + [1] = {["y"]=-1879.955714286,["x"]=-429783.83742856,}, + [2] = {["y"]=-256.25257142886,["x"]=-430023.63542856,}, + [3] = {["y"]=-260.25257142886,["x"]=-430048.77828571,}, + [4] = {["y"]=-1883.955714286,["x"]=-429807.83742856,}, }, }, MaximumSpeed = 50, @@ -893,18 +858,27 @@ AIRBASEPOLICE_NEVADA = { [AIRBASE.Nevada.Creech_AFB] = { PointsRunways = { [1] = { - [1]={["y"]=-74237.571428571,["x"]=-360591.7142857,}, - [2]={["y"]=-74234.428571429,["x"]=-360493.71428571,}, - [3]={["y"]=-77605.285714286,["x"]=-360399.14285713,}, - [4]={["y"]=-77608.714285715,["x"]=-360498.85714285,}, - [5]={["y"]=-74237.857142857,["x"]=-360591.7142857,}, + [1] = {["y"]=-74234.729142857,["x"]=-360501.80857143,}, + [2] = {["y"]=-77606.122285714,["x"]=-360417.86542857,}, + [3] = {["y"]=-77608.578,["x"]=-360486.13428571,}, + [4] = {["y"]=-74237.930571428,["x"]=-360586.25628571,}, }, [2] = { - [1]={["y"]=-75807.571428572,["x"]=-359073.42857142,}, - [2]={["y"]=-74770.142857144,["x"]=-360581.71428571,}, - [3]={["y"]=-74641.285714287,["x"]=-360585.42857142,}, - [4]={["y"]=-75734.142857144,["x"]=-359023.14285714,}, - [5]={["y"]=-75807.285714287,["x"]=-359073.42857142,}, + [1] = {["y"]=-75807.571428572,["x"]=-359073.42857142,}, + [2] = {["y"]=-74770.142857144,["x"]=-360581.71428571,}, + [3] = {["y"]=-74641.285714287,["x"]=-360585.42857142,}, + [4] = {["y"]=-75734.142857144,["x"]=-359023.14285714,}, + }, + }, + MaximumSpeed = 50, + }, + [AIRBASE.Nevada.Echo_Bay] = { + PointsRunways = { + [1] = { + [1] = {["y"]=33182.919428572,["x"]=-388698.21657142,}, + [2] = {["y"]=34202.543142857,["x"]=-388469.55485714,}, + [3] = {["y"]=34207.686,["x"]=-388488.69771428,}, + [4] = {["y"]=33185.422285715,["x"]=-388717.82228571,}, }, }, MaximumSpeed = 50, @@ -912,18 +886,196 @@ AIRBASEPOLICE_NEVADA = { [AIRBASE.Nevada.Groom_Lake_AFB] = { PointsRunways = { [1] = { - [1]={["y"]=-86039.000000001,["x"]=-290606.28571428,}, - [2]={["y"]=-85965.285714287,["x"]=-290573.99999999,}, - [3]={["y"]=-87692.714285715,["x"]=-286634.85714285,}, - [4]={["y"]=-87756.714285715,["x"]=-286663.99999999,}, - [5]={["y"]=-86038.714285715,["x"]=-290606.85714285,}, + [1] = {["y"]=-85971.465428571,["x"]=-290567.77,}, + [2] = {["y"]=-87691.155428571,["x"]=-286637.75428571,}, + [3] = {["y"]=-87756.714285715,["x"]=-286663.99999999,}, + [4] = {["y"]=-86035.940285714,["x"]=-290598.81314286,}, }, [2] = { - [1]={["y"]=-86808.428571429,["x"]=-290375.7142857,}, - [2]={["y"]=-86732.714285715,["x"]=-290344.28571427,}, - [3]={["y"]=-89672.714285714,["x"]=-283546.57142855,}, - [4]={["y"]=-89772.142857143,["x"]=-283587.71428569,}, - [5]={["y"]=-86808.142857143,["x"]=-290375.7142857,}, + [1] = {["y"]=-86741.547142857,["x"]=-290353.31971428,}, + [2] = {["y"]=-89672.714285714,["x"]=-283546.57142855,}, + [3] = {["y"]=-89772.142857143,["x"]=-283587.71428569,}, + [4] = {["y"]=-86799.623714285,["x"]=-290374.16771428,}, + }, + }, + MaximumSpeed = 50, + }, + [AIRBASE.Nevada.Henderson_Executive_Airport] = { + PointsRunways = { + [1] = { + [1] = {["y"]=-25837.500571429,["x"]=-426404.25257142,}, + [2] = {["y"]=-25843.509428571,["x"]=-428752.67942856,}, + [3] = {["y"]=-25902.343714286,["x"]=-428749.96399999,}, + [4] = {["y"]=-25934.667142857,["x"]=-426411.45657142,}, + }, + [2] = { + [1] = {["y"]=-25650.296285714,["x"]=-426510.17971428,}, + [2] = {["y"]=-25632.443428571,["x"]=-428297.11428571,}, + [3] = {["y"]=-25686.690285714,["x"]=-428299.37457142,}, + [4] = {["y"]=-25708.296285714,["x"]=-426515.15114285,}, + }, + }, + MaximumSpeed = 50, + }, + [AIRBASE.Nevada.Jean_Airport] = { + PointsRunways = { + [1] = { + [1] = {["y"]=-42549.187142857,["x"]=-449663.23257143,}, + [2] = {["y"]=-43367.466285714,["x"]=-451044.77657143,}, + [3] = {["y"]=-43395.180571429,["x"]=-451028.20514286,}, + [4] = {["y"]=-42579.893142857,["x"]=-449648.18371428,}, + }, + [2] = { + [1] = {["y"]=-42588.359428572,["x"]=-449900.14342857,}, + [2] = {["y"]=-43349.698285714,["x"]=-451185.46857143,}, + [3] = {["y"]=-43369.624571429,["x"]=-451173.49342857,}, + [4] = {["y"]=-42609.216571429,["x"]=-449891.28628571,}, + }, + }, + MaximumSpeed = 50, + }, + [AIRBASE.Nevada.Laughlin_Airport] = { + PointsRunways = { + [1] = { + [1] = {["y"]=28231.600857143,["x"]=-515555.94114286,}, + [2] = {["y"]=28453.728285714,["x"]=-518170.78885714,}, + [3] = {["y"]=28370.788285714,["x"]=-518176.25742857,}, + [4] = {["y"]=28138.022857143,["x"]=-515573.07514286,}, + }, + [2] = { + [1] = {["y"]=28231.600857143,["x"]=-515555.94114286,}, + [2] = {["y"]=28453.728285714,["x"]=-518170.78885714,}, + [3] = {["y"]=28370.788285714,["x"]=-518176.25742857,}, + [4] = {["y"]=28138.022857143,["x"]=-515573.07514286,}, + }, + }, + MaximumSpeed = 50, + }, + [AIRBASE.Nevada.McCarran_International_Airport] = { + PointsRunways = { + [1] = { + [1] = {["y"]=-29406.035714286,["x"]=-416102.48199999,}, + [2] = {["y"]=-24680.714285715,["x"]=-416003.14285713,}, + [3] = {["y"]=-24681.857142858,["x"]=-415926.57142856,}, + [4] = {["y"]=-29408.42857143,["x"]=-416016.57142856,}, + }, + [2] = { + [1] = {["y"]=-28567.221714286,["x"]=-416378.61799999,}, + [2] = {["y"]=-25109.912285714,["x"]=-416309.92914285,}, + [3] = {["y"]=-25112.508,["x"]=-416240.78714285,}, + [4] = {["y"]=-28576.247428571,["x"]=-416308.49514285,}, + }, + [3] = { + [1] = {["y"]=-29255.953142857,["x"]=-416307.10657142,}, + [2] = {["y"]=-28005.571428572,["x"]=-413449.7142857,}, + [3] = {["y"]=-28068.714285715,["x"]=-413422.85714284,}, + [4] = {["y"]=-29331.000000001,["x"]=-416275.7142857,}, + }, + [4] = { + [1] = {["y"]=-28994.901714286,["x"]=-416423.0522857,}, + [2] = {["y"]=-27697.571428572,["x"]=-413464.57142856,}, + [3] = {["y"]=-27767.857142858,["x"]=-413434.28571427,}, + [4] = {["y"]=-29073.000000001,["x"]=-416386.85714284,}, + }, + }, + MaximumSpeed = 50, + }, + [AIRBASE.Nevada.Mesquite] = { + PointsRunways = { + [1] = { + [1] = {["y"]=68188.340285714,["x"]=-330302.54742857,}, + [2] = {["y"]=68911.303428571,["x"]=-328920.76571429,}, + [3] = {["y"]=68936.927142857,["x"]=-328933.888,}, + [4] = {["y"]=68212.460285714,["x"]=-330317.19171429,}, + }, + }, + }, + [AIRBASE.Nevada.Mina_Airport_3Q0] = { + PointsRunways = { + [1] = { + [1] = {["y"]=-290054.57371429,["x"]=-160930.02228572,}, + [2] = {["y"]=-289469.77457143,["x"]=-162048.73571429,}, + [3] = {["y"]=-289520.06028572,["x"]=-162074.73571429,}, + [4] = {["y"]=-290104.69085714,["x"]=-160956.19457143,}, + }, + }, + MaximumSpeed = 50, + }, + [AIRBASE.Nevada.Nellis_AFB] = { + PointsRunways = { + [1] = { + [1] = {["y"]=-18614.218571428,["x"]=-399437.91085714,}, + [2] = {["y"]=-16217.857142857,["x"]=-396596.85714286,}, + [3] = {["y"]=-16300.142857143,["x"]=-396530,}, + [4] = {["y"]=-18692.543428571,["x"]=-399381.31114286,}, + }, + [2] = { + [1] = {["y"]=-18388.948857143,["x"]=-399630.51828571,}, + [2] = {["y"]=-16011,["x"]=-396806.85714286,}, + [3] = {["y"]=-16074.714285714,["x"]=-396751.71428572,}, + [4] = {["y"]=-18451.571428572,["x"]=-399580.85714285,}, + }, + }, + MaximumSpeed = 50, + }, + [AIRBASE.Nevada.Pahute_Mesa_Airstrip] = { + PointsRunways = { + [1] = { + [1] = {["y"]=-132690.40942857,["x"]=-302733.53085714,}, + [2] = {["y"]=-133112.43228571,["x"]=-304499.70742857,}, + [3] = {["y"]=-133179.91685714,["x"]=-304485.544,}, + [4] = {["y"]=-132759.988,["x"]=-302723.326,}, + }, + }, + MaximumSpeed = 50, + }, + [AIRBASE.Nevada.Tonopah_Test_Range_Airfield] = { + PointsRunways = { + [1] = { + [1] = {["y"]=-175389.162,["x"]=-224778.07685715,}, + [2] = {["y"]=-173942.15485714,["x"]=-228210.27571429,}, + [3] = {["y"]=-174001.77085714,["x"]=-228233.60371429,}, + [4] = {["y"]=-175452.38685714,["x"]=-224806.84200001,}, + }, + }, + MaximumSpeed = 50, + }, + [AIRBASE.Nevada.Tonopah_Airport] = { + PointsRunways = { + [1] = { + [1] = {["y"]=-202128.25228571,["x"]=-196701.34314286,}, + [2] = {["y"]=-201562.40828571,["x"]=-198814.99714286,}, + [3] = {["y"]=-201591.44828571,["x"]=-198820.93714286,}, + [4] = {["y"]=-202156.06828571,["x"]=-196707.68714286,}, + }, + [2] = { + [1] = {["y"]=-202084.57171428,["x"]=-196722.02228572,}, + [2] = {["y"]=-200592.75485714,["x"]=-197768.05571429,}, + [3] = {["y"]=-200605.37285714,["x"]=-197783.49228572,}, + [4] = {["y"]=-202097.14314285,["x"]=-196739.16514286,}, + }, + }, + MaximumSpeed = 50, + }, + [AIRBASE.Nevada.North_Las_Vegas] = { + PointsRunways = { + [1] = { + [1] = {["y"]=-32599.017714286,["x"]=-400913.26485714,}, + [2] = {["y"]=-30881.068857143,["x"]=-400837.94628571,}, + [3] = {["y"]=-30879.354571428,["x"]=-400873.08914285,}, + [4] = {["y"]=-32595.966285714,["x"]=-400947.13571428,}, + }, + [2] = { + [1] = {["y"]=-32499.448571428,["x"]=-400690.99514285,}, + [2] = {["y"]=-31247.514857143,["x"]=-401868.95571428,}, + [3] = {["y"]=-31271.802857143,["x"]=-401894.97857142,}, + [4] = {["y"]=-32520.02,["x"]=-400716.99514285,}, + }, + [3] = { + [1] = {["y"]=-31865.254857143,["x"]=-400999.74057143,}, + [2] = {["y"]=-30893.604,["x"]=-401908.85742857,}, + [3] = {["y"]=-30915.578857143,["x"]=-401936.03685714,}, + [4] = {["y"]=-31884.969142858,["x"]=-401020.59771429,}, }, }, MaximumSpeed = 50, @@ -941,54 +1093,898 @@ function AIRBASEPOLICE_NEVADA:New( SetClient, AirbaseNames ) -- Inherits from BASE local self = BASE:Inherit( self, AIRBASEPOLICE_BASE:New( SetClient, self.Airbases, AirbaseNames ) ) --- -- Nellis --- local NellisBoundary = GROUP:FindByName( "Nellis Boundary" ) --- self.Airbases.Nellis.ZoneBoundary = ZONE_POLYGON:New( "Nellis Boundary", NellisBoundary ):SmokeZone(SMOKECOLOR.White):Flush() --- --- local NellisRunway1 = GROUP:FindByName( "Nellis Runway 1" ) --- self.Airbases.Nellis.ZoneRunways[1] = ZONE_POLYGON:New( "Nellis Runway 1", NellisRunway1 ):SmokeZone(SMOKECOLOR.Red):Flush() --- --- local NellisRunway2 = GROUP:FindByName( "Nellis Runway 2" ) --- self.Airbases.Nellis.ZoneRunways[2] = ZONE_POLYGON:New( "Nellis Runway 2", NellisRunway2 ):SmokeZone(SMOKECOLOR.Red):Flush() --- --- -- McCarran --- local McCarranBoundary = GROUP:FindByName( "McCarran Boundary" ) --- self.Airbases.McCarran.ZoneBoundary = ZONE_POLYGON:New( "McCarran Boundary", McCarranBoundary ):SmokeZone(SMOKECOLOR.White):Flush() --- --- local McCarranRunway1 = GROUP:FindByName( "McCarran Runway 1" ) --- self.Airbases.McCarran.ZoneRunways[1] = ZONE_POLYGON:New( "McCarran Runway 1", McCarranRunway1 ):SmokeZone(SMOKECOLOR.Red):Flush() --- --- local McCarranRunway2 = GROUP:FindByName( "McCarran Runway 2" ) --- self.Airbases.McCarran.ZoneRunways[2] = ZONE_POLYGON:New( "McCarran Runway 2", McCarranRunway2 ):SmokeZone(SMOKECOLOR.Red):Flush() --- --- local McCarranRunway3 = GROUP:FindByName( "McCarran Runway 3" ) --- self.Airbases.McCarran.ZoneRunways[3] = ZONE_POLYGON:New( "McCarran Runway 3", McCarranRunway3 ):SmokeZone(SMOKECOLOR.Red):Flush() --- --- local McCarranRunway4 = GROUP:FindByName( "McCarran Runway 4" ) --- self.Airbases.McCarran.ZoneRunways[4] = ZONE_POLYGON:New( "McCarran Runway 4", McCarranRunway4 ):SmokeZone(SMOKECOLOR.Red):Flush() --- --- -- Creech --- local CreechBoundary = GROUP:FindByName( "Creech Boundary" ) --- self.Airbases.Creech.ZoneBoundary = ZONE_POLYGON:New( "Creech Boundary", CreechBoundary ):SmokeZone(SMOKECOLOR.White):Flush() --- --- local CreechRunway1 = GROUP:FindByName( "Creech Runway 1" ) --- self.Airbases.Creech.ZoneRunways[1] = ZONE_POLYGON:New( "Creech Runway 1", CreechRunway1 ):SmokeZone(SMOKECOLOR.Red):Flush() --- --- local CreechRunway2 = GROUP:FindByName( "Creech Runway 2" ) --- self.Airbases.Creech.ZoneRunways[2] = ZONE_POLYGON:New( "Creech Runway 2", CreechRunway2 ):SmokeZone(SMOKECOLOR.Red):Flush() --- --- -- Groom Lake --- local GroomLakeBoundary = GROUP:FindByName( "GroomLake Boundary" ) --- self.Airbases.GroomLake.ZoneBoundary = ZONE_POLYGON:New( "GroomLake Boundary", GroomLakeBoundary ):SmokeZone(SMOKECOLOR.White):Flush() --- --- local GroomLakeRunway1 = GROUP:FindByName( "GroomLake Runway 1" ) --- self.Airbases.GroomLake.ZoneRunways[1] = ZONE_POLYGON:New( "GroomLake Runway 1", GroomLakeRunway1 ):SmokeZone(SMOKECOLOR.Red):Flush() --- --- local GroomLakeRunway2 = GROUP:FindByName( "GroomLake Runway 2" ) --- self.Airbases.GroomLake.ZoneRunways[2] = ZONE_POLYGON:New( "GroomLake Runway 2", GroomLakeRunway2 ):SmokeZone(SMOKECOLOR.Red):Flush() + + -- These lines here are for the demonstration mission. + -- They create in the dcs.log the coordinates of the runway polygons, that are then + -- taken by the moose designer from the dcs.log and reworked to define the + -- Airbases structure, which is part of the class. + -- When new airbases are added or airbases are changed on the map, + -- the MOOSE designer willde-comment this section and apply the changes in the demo + -- mission, and do a re-run to create a new dcs.log, and then add the changed coordinates + -- in the Airbases structure. + -- So, this needs to stay commented normally once a map has been finished. + + --[[ + + -- Boulder + do + local VillagePrefix = "Boulder" + local Runway1 = GROUP:FindByName( VillagePrefix .. " 1" ) + local Zone1 = ZONE_POLYGON:New( VillagePrefix .. " 1", Runway1 ):SmokeZone(SMOKECOLOR.Red):Flush() + local Runway2 = GROUP:FindByName( VillagePrefix .. " 2" ) + local Zone2 = ZONE_POLYGON:New( VillagePrefix .. " 2", Runway2 ):SmokeZone(SMOKECOLOR.Red):Flush() + end + + -- Creech + do + local VillagePrefix = "Creech" + local Runway1 = GROUP:FindByName( VillagePrefix .. " 1" ) + local Zone1 = ZONE_POLYGON:New( VillagePrefix .. " 1", Runway1 ):SmokeZone(SMOKECOLOR.Red):Flush() + local Runway2 = GROUP:FindByName( VillagePrefix .. " 2" ) + local Zone2 = ZONE_POLYGON:New( VillagePrefix .. " 2", Runway2 ):SmokeZone(SMOKECOLOR.Red):Flush() + end + + -- Echo + do + local VillagePrefix = "Echo" + local Runway1 = GROUP:FindByName( VillagePrefix .. " 1" ) + local Zone1 = ZONE_POLYGON:New( VillagePrefix .. " 1", Runway1 ):SmokeZone(SMOKECOLOR.Red):Flush() + end + + -- Groom Lake + do + local VillagePrefix = "GroomLake" + local Runway1 = GROUP:FindByName( VillagePrefix .. " 1" ) + local Zone1 = ZONE_POLYGON:New( VillagePrefix .. " 1", Runway1 ):SmokeZone(SMOKECOLOR.Red):Flush() + local Runway2 = GROUP:FindByName( VillagePrefix .. " 2" ) + local Zone2 = ZONE_POLYGON:New( VillagePrefix .. " 2", Runway2 ):SmokeZone(SMOKECOLOR.Red):Flush() + end + + -- Henderson + do + local VillagePrefix = "Henderson" + local Runway1 = GROUP:FindByName( VillagePrefix .. " 1" ) + local Zone1 = ZONE_POLYGON:New( VillagePrefix .. " 1", Runway1 ):SmokeZone(SMOKECOLOR.Red):Flush() + local Runway2 = GROUP:FindByName( VillagePrefix .. " 2" ) + local Zone2 = ZONE_POLYGON:New( VillagePrefix .. " 2", Runway2 ):SmokeZone(SMOKECOLOR.Red):Flush() + end + + -- Jean + do + local VillagePrefix = "Jean" + local Runway1 = GROUP:FindByName( VillagePrefix .. " 1" ) + local Zone1 = ZONE_POLYGON:New( VillagePrefix .. " 1", Runway1 ):SmokeZone(SMOKECOLOR.Red):Flush() + local Runway2 = GROUP:FindByName( VillagePrefix .. " 2" ) + local Zone2 = ZONE_POLYGON:New( VillagePrefix .. " 2", Runway2 ):SmokeZone(SMOKECOLOR.Red):Flush() + end + + -- Laughlin + do + local VillagePrefix = "Laughlin" + local Runway1 = GROUP:FindByName( VillagePrefix .. " 1" ) + local Zone1 = ZONE_POLYGON:New( VillagePrefix .. " 1", Runway1 ):SmokeZone(SMOKECOLOR.Red):Flush() + end + + -- Lincoln + do + local VillagePrefix = "Laughlin" + local Runway1 = GROUP:FindByName( VillagePrefix .. " 1" ) + local Zone1 = ZONE_POLYGON:New( VillagePrefix .. " 1", Runway1 ):SmokeZone(SMOKECOLOR.Red):Flush() + end + + -- McCarran + do + local VillagePrefix = "McCarran" + local Runway1 = GROUP:FindByName( VillagePrefix .. " 1" ) + local Zone1 = ZONE_POLYGON:New( VillagePrefix .. " 1", Runway1 ):SmokeZone(SMOKECOLOR.Red):Flush() + local Runway2 = GROUP:FindByName( VillagePrefix .. " 2" ) + local Zone2 = ZONE_POLYGON:New( VillagePrefix .. " 2", Runway2 ):SmokeZone(SMOKECOLOR.Red):Flush() + local Runway3 = GROUP:FindByName( VillagePrefix .. " 3" ) + local Zone3 = ZONE_POLYGON:New( VillagePrefix .. " 3", Runway3 ):SmokeZone(SMOKECOLOR.Red):Flush() + local Runway4 = GROUP:FindByName( VillagePrefix .. " 4" ) + local Zone4 = ZONE_POLYGON:New( VillagePrefix .. " 4", Runway4 ):SmokeZone(SMOKECOLOR.Red):Flush() + end + + -- Mesquite + do + local VillagePrefix = "Mesquite" + local Runway1 = GROUP:FindByName( VillagePrefix .. " 1" ) + local Zone1 = ZONE_POLYGON:New( VillagePrefix .. " 1", Runway1 ):SmokeZone(SMOKECOLOR.Red):Flush() + end + + -- Mina + do + local VillagePrefix = "Mina" + local Runway1 = GROUP:FindByName( VillagePrefix .. " 1" ) + local Zone1 = ZONE_POLYGON:New( VillagePrefix .. " 1", Runway1 ):SmokeZone(SMOKECOLOR.Red):Flush() + end + + -- Nellis + do + local VillagePrefix = "Nellis" + local Runway1 = GROUP:FindByName( VillagePrefix .. " 1" ) + local Zone1 = ZONE_POLYGON:New( VillagePrefix .. " 1", Runway1 ):SmokeZone(SMOKECOLOR.Red):Flush() + local Runway2 = GROUP:FindByName( VillagePrefix .. " 2" ) + local Zone2 = ZONE_POLYGON:New( VillagePrefix .. " 2", Runway2 ):SmokeZone(SMOKECOLOR.Red):Flush() + end + + -- Pahute + do + local VillagePrefix = "Pahute" + local Runway1 = GROUP:FindByName( VillagePrefix .. " 1" ) + local Zone1 = ZONE_POLYGON:New( VillagePrefix .. " 1", Runway1 ):SmokeZone(SMOKECOLOR.Red):Flush() + end + + -- TonopahTR + do + local VillagePrefix = "TonopahTR" + local Runway1 = GROUP:FindByName( VillagePrefix .. " 1" ) + local Zone1 = ZONE_POLYGON:New( VillagePrefix .. " 1", Runway1 ):SmokeZone(SMOKECOLOR.Red):Flush() + end + + -- Tonopah + do + local VillagePrefix = "Tonopah" + local Runway1 = GROUP:FindByName( VillagePrefix .. " 1" ) + local Zone1 = ZONE_POLYGON:New( VillagePrefix .. " 1", Runway1 ):SmokeZone(SMOKECOLOR.Red):Flush() + local Runway2 = GROUP:FindByName( VillagePrefix .. " 2" ) + local Zone2 = ZONE_POLYGON:New( VillagePrefix .. " 2", Runway2 ):SmokeZone(SMOKECOLOR.Red):Flush() + end + + -- Vegas + do + local VillagePrefix = "Vegas" + local Runway1 = GROUP:FindByName( VillagePrefix .. " 1" ) + local Zone1 = ZONE_POLYGON:New( VillagePrefix .. " 1", Runway1 ):SmokeZone(SMOKECOLOR.Red):Flush() + local Runway2 = GROUP:FindByName( VillagePrefix .. " 2" ) + local Zone2 = ZONE_POLYGON:New( VillagePrefix .. " 2", Runway2 ):SmokeZone(SMOKECOLOR.Red):Flush() + local Runway3 = GROUP:FindByName( VillagePrefix .. " 3" ) + local Zone3 = ZONE_POLYGON:New( VillagePrefix .. " 3", Runway3 ):SmokeZone(SMOKECOLOR.Red):Flush() + end + + --]] + end +--- @type AIRBASEPOLICE_NORMANDY +-- @extends Functional.AirbasePolice#AIRBASEPOLICE_BASE + + +--- # AIRBASEPOLICE_NORMANDY, extends @{#AIRBASEPOLICE_BASE} +-- +-- ![Banner Image](..\Presentations\AIRBASEPOLICE\Dia1.JPG) +-- +-- The AIRBASEPOLICE_NORMANDY class monitors the speed of the airplanes at the airbase during taxi. +-- The pilots may not drive faster than the maximum speed for the airbase, or they will be despawned. +-- +-- The pilot will receive 3 times a warning during speeding. After the 3rd warning, if the pilot is still driving +-- faster than the maximum allowed speed, the pilot will be kicked. +-- +-- Different airbases have different maximum speeds, according safety regulations. +-- +-- # Airbases monitored +-- +-- The following airbases are monitored at the Caucasus region: +-- +-- * Nellis +-- * McCarran +-- * Creech +-- * GroomLake +-- +-- +-- # Installation +-- +-- ## In Single Player Missions +-- +-- AIRBASEPOLICE is fully functional in single player. +-- +-- ## In Multi Player Missions +-- +-- AIRBASEPOLICE is NOT functional in multi player, for client machines connecting to the server, running the mission. +-- Due to a bug in DCS since release 1.5, the despawning of clients are not anymore working in multi player. +-- To work around this problem, a much better solution has been made, using the slot blocker script designed +-- by Ciribob. With the help of Ciribob, this script has been extended to also kick client players while in flight. +-- AIRBASEPOLICE is communicating with this modified script to kick players! +-- +-- Install the file **SimpleSlotBlockGameGUI.lua** on the server, following the installation instructions described by Ciribob. +-- +-- [Simple Slot Blocker from Ciribob & FlightControl](https://github.com/ciribob/DCS-SimpleSlotBlock) +-- +-- # Script it! +-- +-- ## 1. AIRBASEPOLICE_NORMANDY Constructor +-- +-- Creates a new AIRBASEPOLICE_NORMANDY object that will monitor pilots taxiing behaviour. +-- +-- -- This creates a new AIRBASEPOLICE_NORMANDY object. +-- +-- -- Create a set of all clients in the mission. +-- AllClientsSet = SET_CLIENT:New():FilterStart() +-- +-- -- Monitor for these clients the airbases. +-- AirbasePoliceCaucasus = AIRBASEPOLICE_NORMANDY:New( AllClientsSet ) +-- +-- @field #AIRBASEPOLICE_NORMANDY +AIRBASEPOLICE_NORMANDY = { + ClassName = "AIRBASEPOLICE_NORMANDY", + Airbases = { + [AIRBASE.Normandy.Azeville] = { + PointsRunways = { + [1] = { + [1]={["y"]=-74194.387714285,["x"]=-2691.1399999998,}, + [2]={["y"]=-73160.282571428,["x"]=-2310.0274285712,}, + [3]={["y"]=-73141.711142857,["x"]=-2357.7417142855,}, + [4]={["y"]=-74176.959142857,["x"]=-2741.997142857,}, + }, + }, + MaximumSpeed = 40, + }, + [AIRBASE.Normandy.Bazenville] = { + PointsRunways = { + [1] = { + [1]={["y"]=-19246.209999999,["x"]=-21246.748,}, + [2]={["y"]=-17883.70142857,["x"]=-20219.009714285,}, + [3]={["y"]=-17855.415714285,["x"]=-20256.438285714,}, + [4]={["y"]=-19217.791999999,["x"]=-21283.597714285,}, + }, + }, + MaximumSpeed = 40, + }, + [AIRBASE.Normandy.Beny_sur_Mer] = { + PointsRunways = { + [1] = { + [1]={["y"]=-8592.7442857133,["x"]=-20386.15542857,}, + [2]={["y"]=-8404.4931428561,["x"]=-21744.113142856,}, + [3]={["y"]=-8267.9917142847,["x"]=-21724.97742857,}, + [4]={["y"]=-8451.0482857133,["x"]=-20368.87542857,}, + }, + }, + MaximumSpeed = 40, + }, + [AIRBASE.Normandy.Beuzeville] = { + PointsRunways = { + [1] = { + [1]={["y"]=-71552.573428571,["x"]=-8744.3688571427,}, + [2]={["y"]=-72577.765714285,["x"]=-9638.5682857141,}, + [3]={["y"]=-72609.304285714,["x"]=-9601.2954285712,}, + [4]={["y"]=-71585.849428571,["x"]=-8709.9648571426,}, + }, + }, + MaximumSpeed = 40, + }, + [AIRBASE.Normandy.Biniville] = { + PointsRunways = { + [1] = { + [1]={["y"]=-84757.320285714,["x"]=-7377.1354285713,}, + [2]={["y"]=-84271.482,["x"]=-7956.4859999999,}, + [3]={["y"]=-84299.482,["x"]=-7981.6288571427,}, + [4]={["y"]=-84784.969714286,["x"]=-7402.0588571427,}, + }, + }, + MaximumSpeed = 40, + }, + [AIRBASE.Normandy.Brucheville] = { + PointsRunways = { + [1] = { + [1]={["y"]=-65546.792857142,["x"]=-14615.640857143,}, + [2]={["y"]=-66914.692,["x"]=-15232.713714285,}, + [3]={["y"]=-66896.527714285,["x"]=-15271.948571428,}, + [4]={["y"]=-65528.393714285,["x"]=-14657.995714286,}, + }, + }, + MaximumSpeed = 40, + }, + [AIRBASE.Normandy.Cardonville] = { + PointsRunways = { + [1] = { + [1]={["y"]=-54280.445428571,["x"]=-15843.749142857,}, + [2]={["y"]=-53646.998571428,["x"]=-17143.012285714,}, + [3]={["y"]=-53683.93,["x"]=-17161.317428571,}, + [4]={["y"]=-54323.354571428,["x"]=-15855.004,}, + }, + }, + MaximumSpeed = 40, + }, + [AIRBASE.Normandy.Carpiquet] = { + PointsRunways = { + [1] = { + [1]={["y"]=-10751.325714285,["x"]=-34229.494,}, + [2]={["y"]=-9283.5279999993,["x"]=-35192.352857142,}, + [3]={["y"]=-9325.2005714274,["x"]=-35260.967714285,}, + [4]={["y"]=-10794.90942857,["x"]=-34287.041428571,}, + }, + }, + MaximumSpeed = 40, + }, + [AIRBASE.Normandy.Chailey] = { + PointsRunways = { + [1] = { + [1]={["y"]=12895.585714292,["x"]=164683.05657144,}, + [2]={["y"]=11410.727142863,["x"]=163606.54485715,}, + [3]={["y"]=11363.012857149,["x"]=163671.97342858,}, + [4]={["y"]=12797.537142863,["x"]=164711.01857144,}, + [5]={["y"]=12862.902857149,["x"]=164726.99685715,}, + }, + [2] = { + [1]={["y"]=11805.316000006,["x"]=164502.90971429,}, + [2]={["y"]=11997.280857149,["x"]=163032.65542858,}, + [3]={["y"]=11918.640857149,["x"]=163023.04657144,}, + [4]={["y"]=11726.973428578,["x"]=164489.94257143,}, + }, + }, + MaximumSpeed = 40, + }, + [AIRBASE.Normandy.Chippelle] = { + PointsRunways = { + [1] = { + [1]={["y"]=-48540.313999999,["x"]=-28884.795999999,}, + [2]={["y"]=-47251.820285713,["x"]=-28140.128571427,}, + [3]={["y"]=-47274.551714285,["x"]=-28103.758285713,}, + [4]={["y"]=-48555.657714285,["x"]=-28839.90142857,}, + }, + }, + MaximumSpeed = 40, + }, + [AIRBASE.Normandy.Cretteville] = { + PointsRunways = { + [1] = { + [1]={["y"]=-78351.723142857,["x"]=-18177.725428571,}, + [2]={["y"]=-77220.322285714,["x"]=-19125.687714286,}, + [3]={["y"]=-77247.899428571,["x"]=-19158.49,}, + [4]={["y"]=-78380.008857143,["x"]=-18208.011142857,}, + }, + }, + MaximumSpeed = 40, + }, + [AIRBASE.Normandy.Cricqueville_en_Bessin] = { + PointsRunways = { + [1] = { + [1]={["y"]=-50875.034571428,["x"]=-14322.404571428,}, + [2]={["y"]=-50681.148571428,["x"]=-15825.258,}, + [3]={["y"]=-50717.434285713,["x"]=-15829.829428571,}, + [4]={["y"]=-50910.569428571,["x"]=-14327.562857142,}, + }, + }, + MaximumSpeed = 40, + }, + [AIRBASE.Normandy.Deux_Jumeaux] = { + PointsRunways = { + [1] = { + [1]={["y"]=-49575.410857142,["x"]=-16575.161142857,}, + [2]={["y"]=-48149.077999999,["x"]=-16952.193428571,}, + [3]={["y"]=-48159.935142856,["x"]=-16996.764857142,}, + [4]={["y"]=-49584.839428571,["x"]=-16617.732571428,}, + }, + }, + MaximumSpeed = 40, + }, + [AIRBASE.Normandy.Evreux] = { + PointsRunways = { + [1] = { + [1]={["y"]=112906.84828572,["x"]=-45585.824857142,}, + [2]={["y"]=112050.38228572,["x"]=-46811.871999999,}, + [3]={["y"]=111980.05371429,["x"]=-46762.173142856,}, + [4]={["y"]=112833.54542857,["x"]=-45540.010571428,}, + }, + [2] = { + [1]={["y"]=112046.02085714,["x"]=-45091.056571428,}, + [2]={["y"]=112488.668,["x"]=-46623.617999999,}, + [3]={["y"]=112405.66914286,["x"]=-46647.419142856,}, + [4]={["y"]=111966.03657143,["x"]=-45112.604285713,}, + }, + }, + MaximumSpeed = 40, + }, + [AIRBASE.Normandy.Ford] = { + PointsRunways = { + [1] = { + [1]={["y"]=-26506.13971428,["x"]=147514.39971429,}, + [2]={["y"]=-25012.977428565,["x"]=147566.14485715,}, + [3]={["y"]=-25009.851428565,["x"]=147482.63600001,}, + [4]={["y"]=-26503.693999994,["x"]=147427.33228572,}, + }, + [2] = { + [1]={["y"]=-25169.701999994,["x"]=148421.09257143,}, + [2]={["y"]=-26092.421999994,["x"]=147190.89628572,}, + [3]={["y"]=-26158.136285708,["x"]=147240.89628572,}, + [4]={["y"]=-25252.357999994,["x"]=148448.64457143,}, + }, + }, + MaximumSpeed = 40, + }, + [AIRBASE.Normandy.Funtington] = { + PointsRunways = { + [1] = { + [1]={["y"]=-44698.388571423,["x"]=152952.17257143,}, + [2]={["y"]=-46452.993142851,["x"]=152388.77885714,}, + [3]={["y"]=-46476.361142851,["x"]=152470.05885714,}, + [4]={["y"]=-44787.256571423,["x"]=153009.52,}, + [5]={["y"]=-44715.581428566,["x"]=153002.08714286,}, + }, + [2] = { + [1]={["y"]=-45792.665999994,["x"]=153123.894,}, + [2]={["y"]=-46068.084857137,["x"]=151665.98342857,}, + [3]={["y"]=-46148.632285708,["x"]=151681.58685714,}, + [4]={["y"]=-45871.25971428,["x"]=153136.82714286,}, + }, + }, + MaximumSpeed = 40, + }, + [AIRBASE.Normandy.Lantheuil] = { + PointsRunways = { + [1] = { + [1]={["y"]=-17158.84542857,["x"]=-24602.999428571,}, + [2]={["y"]=-15978.59342857,["x"]=-23922.978571428,}, + [3]={["y"]=-15932.021999999,["x"]=-24004.121428571,}, + [4]={["y"]=-17090.734857142,["x"]=-24673.248,}, + }, + }, + MaximumSpeed = 40, + }, + [AIRBASE.Normandy.Lessay] = { + PointsRunways = { + [1] = { + [1]={["y"]=-87667.304571429,["x"]=-33220.165714286,}, + [2]={["y"]=-86146.607714286,["x"]=-34248.483142857,}, + [3]={["y"]=-86191.538285714,["x"]=-34316.991142857,}, + [4]={["y"]=-87712.212,["x"]=-33291.774857143,}, + }, + [2] = { + [1]={["y"]=-87125.123142857,["x"]=-34183.682571429,}, + [2]={["y"]=-85803.278285715,["x"]=-33498.428857143,}, + [3]={["y"]=-85768.408285715,["x"]=-33570.13,}, + [4]={["y"]=-87087.688571429,["x"]=-34258.272285715,}, + }, + }, + MaximumSpeed = 40, + }, + [AIRBASE.Normandy.Lignerolles] = { + PointsRunways = { + [1] = { + [1]={["y"]=-35279.611714285,["x"]=-35232.026857142,}, + [2]={["y"]=-33804.948857142,["x"]=-35770.713999999,}, + [3]={["y"]=-33789.876285713,["x"]=-35726.655714284,}, + [4]={["y"]=-35263.548285713,["x"]=-35192.75542857,}, + }, + }, + MaximumSpeed = 40, + }, + [AIRBASE.Normandy.Longues_sur_Mer] = { + PointsRunways = { + [1] = { + [1]={["y"]=-29444.070285713,["x"]=-16334.105428571,}, + [2]={["y"]=-28265.52942857,["x"]=-17011.557999999,}, + [3]={["y"]=-28344.74742857,["x"]=-17143.587999999,}, + [4]={["y"]=-29529.616285713,["x"]=-16477.766571428,}, + }, + }, + MaximumSpeed = 40, + }, + [AIRBASE.Normandy.Maupertus] = { + PointsRunways = { + [1] = { + [1]={["y"]=-85605.340857143,["x"]=16175.267714286,}, + [2]={["y"]=-84132.567142857,["x"]=15895.905714286,}, + [3]={["y"]=-84139.995142857,["x"]=15847.623714286,}, + [4]={["y"]=-85613.626571429,["x"]=16132.410571429,}, + }, + }, + MaximumSpeed = 40, + }, + [AIRBASE.Normandy.Meautis] = { + PointsRunways = { + [1] = { + [1]={["y"]=-72642.527714286,["x"]=-24593.622285714,}, + [2]={["y"]=-71298.672571429,["x"]=-24352.651142857,}, + [3]={["y"]=-71290.101142857,["x"]=-24398.365428571,}, + [4]={["y"]=-72631.715714286,["x"]=-24639.966857143,}, + }, + }, + MaximumSpeed = 40, + }, + [AIRBASE.Normandy.Le_Molay] = { + PointsRunways = { + [1] = { + [1]={["y"]=-41876.526857142,["x"]=-26701.052285713,}, + [2]={["y"]=-40979.545714285,["x"]=-25675.045999999,}, + [3]={["y"]=-41017.687428571,["x"]=-25644.272571427,}, + [4]={["y"]=-41913.638285713,["x"]=-26665.137999999,}, + }, + }, + MaximumSpeed = 40, + }, + [AIRBASE.Normandy.Needs_Oar_Point] = { + PointsRunways = { + [1] = { + [1]={["y"]=-83882.441142851,["x"]=141429.83314286,}, + [2]={["y"]=-85138.159428566,["x"]=140187.52828572,}, + [3]={["y"]=-85208.323428566,["x"]=140161.04371429,}, + [4]={["y"]=-85245.751999994,["x"]=140201.61514286,}, + [5]={["y"]=-83939.966571423,["x"]=141485.22085714,}, + }, + [2] = { + [1]={["y"]=-84528.76571428,["x"]=141988.01428572,}, + [2]={["y"]=-84116.98971428,["x"]=140565.78685714,}, + [3]={["y"]=-84199.35771428,["x"]=140541.14685714,}, + [4]={["y"]=-84605.051428566,["x"]=141966.01428572,}, + }, + }, + MaximumSpeed = 40, + }, + [AIRBASE.Normandy.Picauville] = { + PointsRunways = { + [1] = { + [1]={["y"]=-80808.838571429,["x"]=-11834.554571428,}, + [2]={["y"]=-79531.574285714,["x"]=-12311.274,}, + [3]={["y"]=-79549.355428571,["x"]=-12356.928285714,}, + [4]={["y"]=-80827.815142857,["x"]=-11901.835142857,}, + }, + }, + MaximumSpeed = 40, + }, + [AIRBASE.Normandy.Rucqueville] = { + PointsRunways = { + [1] = { + [1]={["y"]=-20023.988857141,["x"]=-26569.565428571,}, + [2]={["y"]=-18688.92542857,["x"]=-26571.086571428,}, + [3]={["y"]=-18688.012571427,["x"]=-26611.252285713,}, + [4]={["y"]=-20022.218857141,["x"]=-26608.505428571,}, + }, + }, + MaximumSpeed = 40, + }, + [AIRBASE.Normandy.Saint_Pierre_du_Mont] = { + PointsRunways = { + [1] = { + [1]={["y"]=-48015.384571428,["x"]=-11886.631714285,}, + [2]={["y"]=-46540.412285713,["x"]=-11945.226571428,}, + [3]={["y"]=-46541.349999999,["x"]=-11991.174571428,}, + [4]={["y"]=-48016.837142856,["x"]=-11929.371142857,}, + }, + }, + MaximumSpeed = 40, + }, + [AIRBASE.Normandy.Sainte_Croix_sur_Mer] = { + PointsRunways = { + [1] = { + [1]={["y"]=-15877.817999999,["x"]=-18812.579999999,}, + [2]={["y"]=-14464.377142856,["x"]=-18807.46,}, + [3]={["y"]=-14463.879714285,["x"]=-18759.706857142,}, + [4]={["y"]=-15878.229142856,["x"]=-18764.071428571,}, + }, + }, + MaximumSpeed = 40, + }, + [AIRBASE.Normandy.Sainte_Laurent_sur_Mer] = { + PointsRunways = { + [1] = { + [1]={["y"]=-41676.834857142,["x"]=-14475.109428571,}, + [2]={["y"]=-40566.11142857,["x"]=-14817.319999999,}, + [3]={["y"]=-40579.543999999,["x"]=-14860.059999999,}, + [4]={["y"]=-41687.120571427,["x"]=-14509.680857142,}, + }, + }, + MaximumSpeed = 40, + }, + [AIRBASE.Normandy.Sommervieu] = { + PointsRunways = { + [1] = { + [1]={["y"]=-26821.913714284,["x"]=-21390.466571427,}, + [2]={["y"]=-25465.308857142,["x"]=-21296.859999999,}, + [3]={["y"]=-25462.451714284,["x"]=-21343.717142856,}, + [4]={["y"]=-26818.002285713,["x"]=-21440.532857142,}, + }, + }, + MaximumSpeed = 40, + }, + [AIRBASE.Normandy.Tangmere] = { + PointsRunways = { + [1] = { + [1]={["y"]=-34684.581142851,["x"]=150459.61657143,}, + [2]={["y"]=-33250.625428566,["x"]=149954.17,}, + [3]={["y"]=-33275.724285708,["x"]=149874.69028572,}, + [4]={["y"]=-34709.020571423,["x"]=150377.93742857,}, + }, + [2] = { + [1]={["y"]=-33103.438857137,["x"]=150812.72542857,}, + [2]={["y"]=-34410.246285708,["x"]=150009.73142857,}, + [3]={["y"]=-34453.535142851,["x"]=150082.02685714,}, + [4]={["y"]=-33176.545999994,["x"]=150870.22542857,}, + }, + }, + MaximumSpeed = 40, + }, + }, +} + + +--- Creates a new AIRBASEPOLICE_NORMANDY object. +-- @param #AIRBASEPOLICE_NORMANDY 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 AirbaseNames A list {} of airbase names (Use AIRBASE.Normandy enumerator). +-- @return #AIRBASEPOLICE_NORMANDY self +function AIRBASEPOLICE_NORMANDY:New( SetClient, AirbaseNames ) + + -- Inherits from BASE + local self = BASE:Inherit( self, AIRBASEPOLICE_BASE:New( SetClient, self.Airbases, AirbaseNames ) ) + + -- These lines here are for the demonstration mission. + -- They create in the dcs.log the coordinates of the runway polygons, that are then + -- taken by the moose designer from the dcs.log and reworked to define the + -- Airbases structure, which is part of the class. + -- When new airbases are added or airbases are changed on the map, + -- the MOOSE designer willde-comment this section and apply the changes in the demo + -- mission, and do a re-run to create a new dcs.log, and then add the changed coordinates + -- in the Airbases structure. + -- So, this needs to stay commented normally once a map has been finished. + + --[[ + + -- Azeville + do + local VillagePrefix = "Azeville" + local Runway1 = GROUP:FindByName( VillagePrefix .. " 1" ) + local Zone1 = ZONE_POLYGON:New( VillagePrefix .. " 1", Runway1 ):SmokeZone(SMOKECOLOR.Red):Flush() + end + + + -- Bazenville + do + local VillagePrefix = "Bazenville" + local Runway1 = GROUP:FindByName( VillagePrefix .. " 1" ) + local Zone1 = ZONE_POLYGON:New( VillagePrefix .. " 1", Runway1 ):SmokeZone(SMOKECOLOR.Red):Flush() + end + + + -- Beny + do + local VillagePrefix = "Beny" + local Runway1 = GROUP:FindByName( VillagePrefix .. " 1" ) + local Zone1 = ZONE_POLYGON:New( VillagePrefix .. " 1", Runway1 ):SmokeZone(SMOKECOLOR.Red):Flush() + end + + + -- Beuzeville + do + local VillagePrefix = "Beuzeville" + local Runway1 = GROUP:FindByName( VillagePrefix .. " 1" ) + local Zone1 = ZONE_POLYGON:New( VillagePrefix .. " 1", Runway1 ):SmokeZone(SMOKECOLOR.Red):Flush() + end + + + -- Biniville + do + local VillagePrefix = "Biniville" + local Runway1 = GROUP:FindByName( VillagePrefix .. " 1" ) + local Zone1 = ZONE_POLYGON:New( VillagePrefix .. " 1", Runway1 ):SmokeZone(SMOKECOLOR.Red):Flush() + end + + + -- Brucheville + do + local VillagePrefix = "Brucheville" + local Runway1 = GROUP:FindByName( VillagePrefix .. " 1" ) + local Zone1 = ZONE_POLYGON:New( VillagePrefix .. " 1", Runway1 ):SmokeZone(SMOKECOLOR.Red):Flush() + end + + + -- Cardonville + do + local VillagePrefix = "Cardonville" + local Runway1 = GROUP:FindByName( VillagePrefix .. " 1" ) + local Zone1 = ZONE_POLYGON:New( VillagePrefix .. " 1", Runway1 ):SmokeZone(SMOKECOLOR.Red):Flush() + end + + + -- Carpiquet + do + local VillagePrefix = "Carpiquet" + local Runway1 = GROUP:FindByName( VillagePrefix .. " 1" ) + local Zone1 = ZONE_POLYGON:New( VillagePrefix .. " 1", Runway1 ):SmokeZone(SMOKECOLOR.Red):Flush() + end + + + -- Chailey + do + local VillagePrefix = "Chailey" + local Runway1 = GROUP:FindByName( VillagePrefix .. " 1" ) + local Zone1 = ZONE_POLYGON:New( VillagePrefix .. " 1", Runway1 ):SmokeZone(SMOKECOLOR.Red):Flush() + local Runway2 = GROUP:FindByName( VillagePrefix .. " 2" ) + local Zone2 = ZONE_POLYGON:New( VillagePrefix .. " 2", Runway2 ):SmokeZone(SMOKECOLOR.Red):Flush() + end + + + -- Chippelle + do + local VillagePrefix = "Chippelle" + local Runway1 = GROUP:FindByName( VillagePrefix .. " 1" ) + local Zone1 = ZONE_POLYGON:New( VillagePrefix .. " 1", Runway1 ):SmokeZone(SMOKECOLOR.Red):Flush() + end + + + -- Cretteville + do + local VillagePrefix = "Cretteville" + local Runway1 = GROUP:FindByName( VillagePrefix .. " 1" ) + local Zone1 = ZONE_POLYGON:New( VillagePrefix .. " 1", Runway1 ):SmokeZone(SMOKECOLOR.Red):Flush() + end + + + -- Cricqueville + do + local VillagePrefix = "Cricqueville" + local Runway1 = GROUP:FindByName( VillagePrefix .. " 1" ) + local Zone1 = ZONE_POLYGON:New( VillagePrefix .. " 1", Runway1 ):SmokeZone(SMOKECOLOR.Red):Flush() + end + + + -- Deux + do + local VillagePrefix = "Deux" + local Runway1 = GROUP:FindByName( VillagePrefix .. " 1" ) + local Zone1 = ZONE_POLYGON:New( VillagePrefix .. " 1", Runway1 ):SmokeZone(SMOKECOLOR.Red):Flush() + end + + + -- Evreux + do + local VillagePrefix = "Evreux" + local Runway1 = GROUP:FindByName( VillagePrefix .. " 1" ) + local Zone1 = ZONE_POLYGON:New( VillagePrefix .. " 1", Runway1 ):SmokeZone(SMOKECOLOR.Red):Flush() + local Runway2 = GROUP:FindByName( VillagePrefix .. " 2" ) + local Zone2 = ZONE_POLYGON:New( VillagePrefix .. " 2", Runway2 ):SmokeZone(SMOKECOLOR.Red):Flush() + end + + + -- Ford + do + local VillagePrefix = "Ford" + local Runway1 = GROUP:FindByName( VillagePrefix .. " 1" ) + local Zone1 = ZONE_POLYGON:New( VillagePrefix .. " 1", Runway1 ):SmokeZone(SMOKECOLOR.Red):Flush() + local Runway2 = GROUP:FindByName( VillagePrefix .. " 2" ) + local Zone2 = ZONE_POLYGON:New( VillagePrefix .. " 2", Runway2 ):SmokeZone(SMOKECOLOR.Red):Flush() + end + + + -- Funtington + do + local VillagePrefix = "Funtington" + local Runway1 = GROUP:FindByName( VillagePrefix .. " 1" ) + local Zone1 = ZONE_POLYGON:New( VillagePrefix .. " 1", Runway1 ):SmokeZone(SMOKECOLOR.Red):Flush() + local Runway2 = GROUP:FindByName( VillagePrefix .. " 2" ) + local Zone2 = ZONE_POLYGON:New( VillagePrefix .. " 2", Runway2 ):SmokeZone(SMOKECOLOR.Red):Flush() + end + + + -- Lantheuil + do + local VillagePrefix = "Lantheuil" + local Runway1 = GROUP:FindByName( VillagePrefix .. " 1" ) + local Zone1 = ZONE_POLYGON:New( VillagePrefix .. " 1", Runway1 ):SmokeZone(SMOKECOLOR.Red):Flush() + end + + + -- Lessay + do + local VillagePrefix = "Lessay" + local Runway1 = GROUP:FindByName( VillagePrefix .. " 1" ) + local Zone1 = ZONE_POLYGON:New( VillagePrefix .. " 1", Runway1 ):SmokeZone(SMOKECOLOR.Red):Flush() + local Runway2 = GROUP:FindByName( VillagePrefix .. " 2" ) + local Zone2 = ZONE_POLYGON:New( VillagePrefix .. " 2", Runway2 ):SmokeZone(SMOKECOLOR.Red):Flush() + end + + + -- Lignerolles + do + local VillagePrefix = "Lignerolles" + local Runway1 = GROUP:FindByName( VillagePrefix .. " 1" ) + local Zone1 = ZONE_POLYGON:New( VillagePrefix .. " 1", Runway1 ):SmokeZone(SMOKECOLOR.Red):Flush() + end + + + -- Longues + do + local VillagePrefix = "Longues" + local Runway1 = GROUP:FindByName( VillagePrefix .. " 1" ) + local Zone1 = ZONE_POLYGON:New( VillagePrefix .. " 1", Runway1 ):SmokeZone(SMOKECOLOR.Red):Flush() + end + + + -- Maupertus + do + local VillagePrefix = "Maupertus" + local Runway1 = GROUP:FindByName( VillagePrefix .. " 1" ) + local Zone1 = ZONE_POLYGON:New( VillagePrefix .. " 1", Runway1 ):SmokeZone(SMOKECOLOR.Red):Flush() + end + + + -- Meautis + do + local VillagePrefix = "Meautis" + local Runway1 = GROUP:FindByName( VillagePrefix .. " 1" ) + local Zone1 = ZONE_POLYGON:New( VillagePrefix .. " 1", Runway1 ):SmokeZone(SMOKECOLOR.Red):Flush() + end + + + -- Molay + do + local VillagePrefix = "Molay" + local Runway1 = GROUP:FindByName( VillagePrefix .. " 1" ) + local Zone1 = ZONE_POLYGON:New( VillagePrefix .. " 1", Runway1 ):SmokeZone(SMOKECOLOR.Red):Flush() + end + + + -- Oar + do + local VillagePrefix = "Oar" + local Runway1 = GROUP:FindByName( VillagePrefix .. " 1" ) + local Zone1 = ZONE_POLYGON:New( VillagePrefix .. " 1", Runway1 ):SmokeZone(SMOKECOLOR.Red):Flush() + local Runway2 = GROUP:FindByName( VillagePrefix .. " 2" ) + local Zone2 = ZONE_POLYGON:New( VillagePrefix .. " 2", Runway2 ):SmokeZone(SMOKECOLOR.Red):Flush() + end + + + -- Picauville + do + local VillagePrefix = "Picauville" + local Runway1 = GROUP:FindByName( VillagePrefix .. " 1" ) + local Zone1 = ZONE_POLYGON:New( VillagePrefix .. " 1", Runway1 ):SmokeZone(SMOKECOLOR.Red):Flush() + end + + + -- Rucqueville + do + local VillagePrefix = "Rucqueville" + local Runway1 = GROUP:FindByName( VillagePrefix .. " 1" ) + local Zone1 = ZONE_POLYGON:New( VillagePrefix .. " 1", Runway1 ):SmokeZone(SMOKECOLOR.Red):Flush() + end + + + -- SaintPierre + do + local VillagePrefix = "SaintPierre" + local Runway1 = GROUP:FindByName( VillagePrefix .. " 1" ) + local Zone1 = ZONE_POLYGON:New( VillagePrefix .. " 1", Runway1 ):SmokeZone(SMOKECOLOR.Red):Flush() + end + + + -- SainteCroix + do + local VillagePrefix = "SainteCroix" + local Runway1 = GROUP:FindByName( VillagePrefix .. " 1" ) + local Zone1 = ZONE_POLYGON:New( VillagePrefix .. " 1", Runway1 ):SmokeZone(SMOKECOLOR.Red):Flush() + end + + + --SainteLaurent + do + local VillagePrefix = "SainteLaurent" + local Runway1 = GROUP:FindByName( VillagePrefix .. " 1" ) + local Zone1 = ZONE_POLYGON:New( VillagePrefix .. " 1", Runway1 ):SmokeZone(SMOKECOLOR.Red):Flush() + end + + + -- Sommervieu + do + local VillagePrefix = "Sommervieu" + local Runway1 = GROUP:FindByName( VillagePrefix .. " 1" ) + local Zone1 = ZONE_POLYGON:New( VillagePrefix .. " 1", Runway1 ):SmokeZone(SMOKECOLOR.Red):Flush() + end + + + -- Tangmere + do + local VillagePrefix = "Tangmere" + local Runway1 = GROUP:FindByName( VillagePrefix .. " 1" ) + local Zone1 = ZONE_POLYGON:New( VillagePrefix .. " 1", Runway1 ):SmokeZone(SMOKECOLOR.Red):Flush() + local Runway2 = GROUP:FindByName( VillagePrefix .. " 2" ) + local Zone2 = ZONE_POLYGON:New( VillagePrefix .. " 2", Runway2 ):SmokeZone(SMOKECOLOR.Red):Flush() + end + + --]] + +end