* Renamed AIRBASE POLICE to ATC GROUND

* Fixed issues with landing and departing.
This commit is contained in:
FlightControl_Master 2017-10-26 11:13:11 +02:00
parent a8c5ccd4ad
commit 8002febf09
18 changed files with 1777 additions and 2524 deletions

View File

@ -1,4 +1,4 @@
--- **Functional** -- The AIRBASEPOLICE classes monitor airbase traffic and regulate speed while taxiing.
--- **Functional** -- The ATC_GROUND classes monitor airbase traffic and regulate speed while taxiing.
--
-- ===
--
@ -7,34 +7,34 @@
--
-- ===
--
-- @module AirbasePolice
-- @module ATC_Ground
--- @type AIRBASEPOLICE_BASE
--- @type ATC_GROUND
-- @field Core.Set#SET_CLIENT SetClient
-- @extends Core.Base#BASE
--- Base class for AIRBASEPOLICE implementations.
-- @field #AIRBASEPOLICE_BASE
AIRBASEPOLICE_BASE = {
ClassName = "AIRBASEPOLICE_BASE",
--- Base class for ATC_GROUND implementations.
-- @field #ATC_GROUND
ATC_GROUND = {
ClassName = "ATC_GROUND",
SetClient = nil,
Airbases = nil,
AirbaseNames = nil,
}
--- @type AIRBASEPOLICE_BASE.AirbaseNames
--- @type ATC_GROUND.AirbaseNames
-- @list <#string>
--- Creates a new AIRBASEPOLICE_BASE object.
-- @param #AIRBASEPOLICE_BASE self
--- Creates a new ATC_GROUND object.
-- @param #ATC_GROUND self
-- @param Airbases A table of Airbase Names.
-- @return #AIRBASEPOLICE_BASE self
function AIRBASEPOLICE_BASE:New( Airbases, AirbaseList )
-- @return #ATC_GROUND self
function ATC_GROUND:New( Airbases, AirbaseList )
-- Inherits from BASE
local self = BASE:Inherit( self, BASE:New() ) -- #AIRBASEPOLICE_BASE
local self = BASE:Inherit( self, BASE:New() ) -- #ATC_GROUND
self:E( { self.ClassName, Airbases } )
self.Airbases = Airbases
@ -88,10 +88,10 @@ end
--- Smoke the airbases runways.
-- @param #AIRBASEPOLICE_BASE self
-- @param #ATC_GROUND self
-- @param Utilities.Utils#SMOKECOLOR SmokeColor The color of the smoke around the runways.
-- @return #AIRBASEPOLICE_BASE self
function AIRBASEPOLICE_BASE:SmokeRunways( SmokeColor )
-- @return #ATC_GROUND self
function ATC_GROUND:SmokeRunways( SmokeColor )
for AirbaseID, Airbase in pairs( self.Airbases ) do
for PointsRunwayID, PointsRunway in pairs( Airbase.PointsRunways ) do
@ -102,27 +102,27 @@ end
--- Set the maximum speed in Kmph until the player gets kicked.
-- @param #AIRBASEPOLICE_BASE self
-- @param #ATC_GROUND self
-- @param #number KickSpeed Set the maximum speed in Kmph until the player gets kicked.
-- @return #AIRBASEPOLICE_BASE self
function AIRBASEPOLICE_BASE:SetKickSpeedKmph( KickSpeed )
-- @return #ATC_GROUND self
function ATC_GROUND:SetKickSpeedKmph( KickSpeed )
self.KickSpeed = UTILS.KmphToMps( KickSpeed )
end
--- Set the maximum speed in Miph until the player gets kicked.
-- @param #AIRBASEPOLICE_BASE self
-- @param #ATC_GROUND self
-- @param #number KickSpeedMiph Set the maximum speed in Mph until the player gets kicked.
-- @return #AIRBASEPOLICE_BASE self
function AIRBASEPOLICE_BASE:SetKickSpeedMiph( KickSpeedMiph )
-- @return #ATC_GROUND self
function ATC_GROUND:SetKickSpeedMiph( KickSpeedMiph )
self.KickSpeed = UTILS.MiphToMps( KickSpeedMiph )
end
--- @param #AIRBASEPOLICE_BASE self
function AIRBASEPOLICE_BASE:_AirbaseMonitor()
--- @param #ATC_GROUND self
function ATC_GROUND:_AirbaseMonitor()
self:E( "In Scheduler")
@ -144,94 +144,96 @@ function AIRBASEPOLICE_BASE:_AirbaseMonitor()
NotInRunwayZone = ( Client:IsNotInZone( ZoneRunway ) == true ) and NotInRunwayZone or false
end
local IsOnGround = Client:InAir() == false
if NotInRunwayZone then
local Taxi = Client:GetState( self, "Taxi" )
self:E( Taxi )
if Taxi == false then
Client:Message( "Welcome at " .. AirbaseID .. ". The maximum taxiing speed is " .. AirbaseMeta.MaximumSpeed .. " km/h.", 20, "ATC" )
Client:SetState( self, "Taxi", true )
end
-- TODO: GetVelocityKMH function usage
local Velocity = VELOCITY_POSITIONABLE:New( Client )
--MESSAGE:New( "Velocity = " .. Velocity:ToString(), 1 ):ToAll()
local IsAboveRunway = Client:IsAboveRunway()
local IsOnGround = Client:InAir() == false
self:T( IsAboveRunway, IsOnGround )
if IsOnGround then
if Velocity:Get() > self.KickSpeed then
MESSAGE:New( "Penalty! Player " .. Client:GetPlayerName() .. " is kicked, due to a severe airbase traffic rule violation ...", 10, "ATC" ):ToAll()
Client:Destroy()
Client:SetState( self, "Speeding", false )
Client:SetState( self, "Warnings", 0 )
local Taxi = Client:GetState( self, "Taxi" )
self:E( Taxi )
if Taxi == false then
Client:Message( "Welcome at " .. AirbaseID .. ". The maximum taxiing speed is " .. AirbaseMeta.MaximumSpeed .. " km/h.", 20, "ATC" )
Client:SetState( self, "Taxi", true )
end
-- TODO: GetVelocityKMH function usage
local Velocity = VELOCITY_POSITIONABLE:New( Client )
--MESSAGE:New( "Velocity = " .. Velocity:ToString(), 1 ):ToAll()
local IsAboveRunway = Client:IsAboveRunway()
self:T( IsAboveRunway, IsOnGround )
if IsOnGround then
if Velocity:Get() > self.KickSpeed then
MESSAGE:New( "Penalty! Player " .. Client:GetPlayerName() .. " is kicked, due to a severe airbase traffic rule violation ...", 10, "ATC" ):ToAll()
Client:Destroy()
Client:SetState( self, "Speeding", false )
Client:SetState( self, "Warnings", 0 )
end
end
if IsOnGround then
if Velocity:GetKmph() > AirbaseMeta.MaximumSpeed then
local IsSpeeding = Client:GetState( self, "Speeding" )
if IsSpeeding == true then
local SpeedingWarnings = Client:GetState( self, "Warnings" )
self:T( SpeedingWarnings )
if SpeedingWarnings <= 3 then
Client:Message( "Warning " .. SpeedingWarnings .. "/3! Airbase traffic rule violation! Slow down now! Your speed is " ..
string.format( "%s", Velocity:ToString() ), 5, "ATC" )
Client:SetState( self, "Warnings", SpeedingWarnings + 1 )
else
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 )
Client:SetState( self, "Warnings", 0 )
end
else
Client:Message( "Attention! You are speeding on the taxiway, slow down! Your speed is " .. string.format( "%s", Velocity:ToString() ), 5, "ATC" )
Client:SetState( self, "Speeding", true )
Client:SetState( self, "Warnings", 1 )
end
else
Client:SetState( self, "Speeding", false )
Client:SetState( self, "Warnings", 0 )
end
end
end
if IsOnGround then
if Velocity:GetKmph() > AirbaseMeta.MaximumSpeed then
local IsSpeeding = Client:GetState( self, "Speeding" )
if IsSpeeding == true then
local SpeedingWarnings = Client:GetState( self, "Warnings" )
self:T( SpeedingWarnings )
if SpeedingWarnings <= 3 then
Client:Message( "Warning " .. SpeedingWarnings .. "/3! Airbase traffic rule violation! Slow down now! Your speed is " ..
string.format( "%s", Velocity:ToString() ), 5, "ATC" )
Client:SetState( self, "Warnings", SpeedingWarnings + 1 )
if IsOnGround and not IsAboveRunway then
local IsOffRunway = Client:GetState( self, "IsOffRunway" )
if IsOffRunway == true then
local OffRunwayWarnings = Client:GetState( self, "OffRunwayWarnings" )
self:T( OffRunwayWarnings )
if OffRunwayWarnings <= 3 then
Client:Message( "Warning " .. OffRunwayWarnings .. "/3! Airbase traffic rule violation! Get back on the taxi immediately!", 5, "ATC" )
Client:SetState( self, "OffRunwayWarnings", OffRunwayWarnings + 1 )
else
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 )
Client:SetState( self, "Warnings", 0 )
Client:SetState( self, "IsOffRunway", false )
Client:SetState( self, "OffRunwayWarnings", 0 )
end
else
Client:Message( "Attention! You are speeding on the taxiway, slow down! Your speed is " .. string.format( "%s", Velocity:ToString() ), 5, "ATC" )
Client:SetState( self, "Speeding", true )
Client:SetState( self, "Warnings", 1 )
Client:Message( "Attention! You are off the taxiway. Get back on the taxiway immediately!", 5, "ATC" )
Client:SetState( self, "IsOffRunway", true )
Client:SetState( self, "OffRunwayWarnings", 1 )
end
else
Client:SetState( self, "Speeding", false )
Client:SetState( self, "Warnings", 0 )
Client:SetState( self, "IsOffRunway", false )
Client:SetState( self, "OffRunwayWarnings", 0 )
end
end
if IsOnGround and not IsAboveRunway then
local IsOffRunway = Client:GetState( self, "IsOffRunway" )
if IsOffRunway == true then
local OffRunwayWarnings = Client:GetState( self, "OffRunwayWarnings" )
self:T( OffRunwayWarnings )
if OffRunwayWarnings <= 3 then
Client:Message( "Warning " .. OffRunwayWarnings .. "/3! Airbase traffic rule violation! Get back on the taxi immediately!", 5, "ATC" )
Client:SetState( self, "OffRunwayWarnings", OffRunwayWarnings + 1 )
else
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, "IsOffRunway", false )
Client:SetState( self, "OffRunwayWarnings", 0 )
end
else
Client:Message( "Attention! You are off the taxiway. Get back on the taxiway immediately!", 5, "ATC" )
Client:SetState( self, "IsOffRunway", true )
Client:SetState( self, "OffRunwayWarnings", 1 )
end
else
Client:SetState( self, "IsOffRunway", false )
Client:SetState( self, "OffRunwayWarnings", 0 )
end
else
Client:SetState( self, "Speeding", false )
Client:SetState( self, "Warnings", 0 )
@ -243,6 +245,8 @@ function AIRBASEPOLICE_BASE:_AirbaseMonitor()
Client:SetState( self, "Taxi", false )
end
end
else
Client:SetState( self, "Taxi", false )
end
end
)
@ -253,14 +257,14 @@ function AIRBASEPOLICE_BASE:_AirbaseMonitor()
end
--- @type AIRBASEPOLICE_CAUCASUS
-- @extends #AIRBASEPOLICE_BASE
--- @type ATC_GROUND_CAUCASUS
-- @extends #ATC_GROUND
--- # AIRBASEPOLICE_CAUCASUS, extends @{#AIRBASEPOLICE_BASE}
--- # ATC_GROUND_CAUCASUS, extends @{#ATC_GROUND}
--
-- ![Banner Image](..\Presentations\AIRBASEPOLICE\Dia1.JPG)
-- ![Banner Image](..\Presentations\ATC_GROUND\Dia1.JPG)
--
-- The AIRBASEPOLICE_CAUCASUS class monitors the speed of the airplanes at the airbase during taxi.
-- The ATC_GROUND_CAUCASUS 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 maximum speed for the airbases at Caucasus is **50 km/h**.
@ -272,44 +276,45 @@ end
--
-- # Airbases monitored
--
-- The following airbases are monitored at the Caucasus region:
-- The following airbases are monitored at the Caucasus region.
-- Use the AIRBASE.Caucasus enumeration to select the airbases to be monitored.
--
-- * Anapa Vityazevo
-- * Batumi
-- * Beslan
-- * Gelendzhik
-- * Gudauta
-- * Kobuleti
-- * Krasnodar Center
-- * Krasnodar Pashkovsky
-- * Krymsk
-- * Kutaisi
-- * Maykop Khanskaya
-- * Mineralnye Vody
-- * Mozdok
-- * Nalchik
-- * Novorossiysk
-- * Senaki Kolkhi
-- * Sochi Adler
-- * Soganlug
-- * Sukhumi Babushara
-- * Tbilisi Lochini
-- * Vaziani
-- * ´AIRBASE.Caucasus.Anapa_Vityazevo´
-- * ´AIRBASE.Caucasus.Batumi´
-- * ´AIRBASE.Caucasus.Beslan´
-- * ´AIRBASE.Caucasus.Gelendzhik´
-- * ´AIRBASE.Caucasus.Gudauta´
-- * ´AIRBASE.Caucasus.Kobuleti´
-- * ´AIRBASE.Caucasus.Krasnodar_Center´
-- * ´AIRBASE.Caucasus.Krasnodar_Pashkovsky´
-- * ´AIRBASE.Caucasus.Krymsk´
-- * ´AIRBASE.Caucasus.Kutaisi´
-- * ´AIRBASE.Caucasus.Maykop_Khanskaya´
-- * ´AIRBASE.Caucasus.Mineralnye_Vody´
-- * ´AIRBASE.Caucasus.Mozdok´
-- * ´AIRBASE.Caucasus.Nalchik´
-- * ´AIRBASE.Caucasus.Novorossiysk´
-- * ´AIRBASE.Caucasus.Senaki_Kolkhi´
-- * ´AIRBASE.Caucasus.Sochi_Adler´
-- * ´AIRBASE.Caucasus.Soganlug´
-- * ´AIRBASE.Caucasus.Sukhumi_Babushara´
-- * ´AIRBASE.Caucasus.Tbilisi_Lochini´
-- * ´AIRBASE.Caucasus.Vaziani´
--
--
-- # Installation
--
-- ## In Single Player Missions
--
-- AIRBASEPOLICE is fully functional in single player.
-- ATC_GROUND 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.
-- ATC_GROUND 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!
-- ATC_GROUND is communicating with this modified script to kick players!
--
-- Install the file **SimpleSlotBlockGameGUI.lua** on the server, following the installation instructions described by Ciribob.
--
@ -317,18 +322,26 @@ end
--
-- # Script it!
--
-- ## 1. AIRBASEPOLICE_CAUCASUS Constructor
-- ## 1. ATC_GROUND_CAUCASUS Constructor
--
-- Creates a new AIRBASEPOLICE_CAUCASUS object that will monitor pilots taxiing behaviour.
-- Creates a new ATC_GROUND_CAUCASUS object that will monitor pilots taxiing behaviour.
--
-- -- This creates a new AIRBASEPOLICE_CAUCASUS object.
-- -- This creates a new ATC_GROUND_CAUCASUS object.
--
-- -- Monitor for these clients the airbases.
-- AirbasePoliceCaucasus = AIRBASEPOLICE_CAUCASUS:New()
-- -- Monitor all the airbases.
-- AirbasePoliceCaucasus = ATC_GROUND_CAUCASUS:New()
--
-- -- Monitor specific airbases only.
--
-- @field #AIRBASEPOLICE_CAUCASUS
AIRBASEPOLICE_CAUCASUS = {
ClassName = "AIRBASEPOLICE_CAUCASUS",
-- ATC_Ground = ATC_GROUND_CAUCASUS:New(
-- { AIRBASE.Caucasus.Gelendzhik,
-- AIRBASE.Caucasus.Krymsk
-- }
-- )
--
-- @field #ATC_GROUND_CAUCASUS
ATC_GROUND_CAUCASUS = {
ClassName = "ATC_GROUND_CAUCASUS",
Airbases = {
[AIRBASE.Caucasus.Anapa_Vityazevo] = {
PointsRunways = {
@ -615,14 +628,14 @@ AIRBASEPOLICE_CAUCASUS = {
},
}
--- Creates a new AIRBASEPOLICE_CAUCASUS object.
-- @param #AIRBASEPOLICE_CAUCASUS self
--- Creates a new ATC_GROUND_CAUCASUS object.
-- @param #ATC_GROUND_CAUCASUS self
-- @param AirbaseNames A list {} of airbase names (Use AIRBASE.Caucasus enumerator).
-- @return #AIRBASEPOLICE_CAUCASUS self
function AIRBASEPOLICE_CAUCASUS:New( AirbaseNames )
-- @return #ATC_GROUND_CAUCASUS self
function ATC_GROUND_CAUCASUS:New( AirbaseNames )
-- Inherits from BASE
local self = BASE:Inherit( self, AIRBASEPOLICE_BASE:New( self.Airbases, AirbaseNames ) )
local self = BASE:Inherit( self, ATC_GROUND:New( self.Airbases, AirbaseNames ) )
@ -838,15 +851,15 @@ end
--- @type AIRBASEPOLICE_NEVADA
-- @extends Functional.AirbasePolice#AIRBASEPOLICE_BASE
--- @type ATC_GROUND_NEVADA
-- @extends Functional.AirbasePolice#ATC_GROUND
--- # AIRBASEPOLICE_NEVADA, extends @{#AIRBASEPOLICE_BASE}
--- # ATC_GROUND_NEVADA, extends @{#ATC_GROUND}
--
-- ![Banner Image](..\Presentations\AIRBASEPOLICE\Dia1.JPG)
-- ![Banner Image](..\Presentations\ATC_GROUND\Dia1.JPG)
--
-- The AIRBASEPOLICE_NEVADA class monitors the speed of the airplanes at the airbase during taxi.
-- The ATC_GROUND_NEVADA 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
@ -856,27 +869,41 @@ end
--
-- # Airbases monitored
--
-- The following airbases are monitored at the Caucasus region:
-- The following airbases are monitored at the Nevada region.
-- Use the AIRBASE.Nevada enumeration to select the airbases to be monitored.
--
-- * Nellis
-- * McCarran
-- * Creech
-- * GroomLake
--
-- * `AIRBASE.Nevada.Beatty_Airport`
-- * `AIRBASE.Nevada.Boulder_City_Airport`
-- * `AIRBASE.Nevada.Creech_AFB`
-- * `AIRBASE.Nevada.Echo_Bay`
-- * `AIRBASE.Nevada.Groom_Lake_AFB`
-- * `AIRBASE.Nevada.Henderson_Executive_Airport`
-- * `AIRBASE.Nevada.Jean_Airport`
-- * `AIRBASE.Nevada.Laughlin_Airport`
-- * `AIRBASE.Nevada.Lincoln_County`
-- * `AIRBASE.Nevada.McCarran_International_Airport`
-- * `AIRBASE.Nevada.Mellan_Airstrip`
-- * `AIRBASE.Nevada.Mesquite`
-- * `AIRBASE.Nevada.Mina_Airport_3Q0`
-- * `AIRBASE.Nevada.Nellis_AFB`
-- * `AIRBASE.Nevada.North_Las_Vegas`
-- * `AIRBASE.Nevada.Pahute_Mesa_Airstrip`
-- * `AIRBASE.Nevada.Tonopah_Airport`
-- * `AIRBASE.Nevada.Tonopah_Test_Range_Airfield`
--
-- # Installation
--
-- ## In Single Player Missions
--
-- AIRBASEPOLICE is fully functional in single player.
-- ATC_GROUND 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.
-- ATC_GROUND 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!
-- ATC_GROUND is communicating with this modified script to kick players!
--
-- Install the file **SimpleSlotBlockGameGUI.lua** on the server, following the installation instructions described by Ciribob.
--
@ -884,18 +911,29 @@ end
--
-- # Script it!
--
-- ## 1. AIRBASEPOLICE_NEVADA Constructor
-- ## 1. ATC_GROUND_NEVADA Constructor
--
-- Creates a new AIRBASEPOLICE_NEVADA object that will monitor pilots taxiing behaviour.
-- Creates a new ATC_GROUND_NEVADA object that will monitor pilots taxiing behaviour.
--
-- -- This creates a new AIRBASEPOLICE_NEVADA object.
-- -- This creates a new ATC_GROUND_NEVADA object.
--
-- -- Monitor for these clients the airbases.
-- AirbasePoliceCaucasus = AIRBASEPOLICE_NEVADA:New()
-- -- Monitor all the airbases.
-- AirbasePoliceCaucasus = ATC_GROUND_NEVADA:New()
--
-- @field #AIRBASEPOLICE_NEVADA
AIRBASEPOLICE_NEVADA = {
ClassName = "AIRBASEPOLICE_NEVADA",
--
-- -- Monitor specific airbases.
-- ATC_Ground = ATC_GROUND_NEVADA:New(
-- { AIRBASE.Nevada.Laughlin_Airport,
-- AIRBASE.Nevada.Mellan_Airstrip,
-- AIRBASE.Nevada.Lincoln_County,
-- AIRBASE.Nevada.North_Las_Vegas,
-- AIRBASE.Nevada.McCarran_International_Airport
-- }
-- )
--
-- @field #ATC_GROUND_NEVADA
ATC_GROUND_NEVADA = {
ClassName = "ATC_GROUND_NEVADA",
Airbases = {
[AIRBASE.Nevada.Beatty_Airport] = {
@ -1165,14 +1203,14 @@ AIRBASEPOLICE_NEVADA = {
},
}
--- Creates a new AIRBASEPOLICE_NEVADA object.
-- @param #AIRBASEPOLICE_NEVADA self
--- Creates a new ATC_GROUND_NEVADA object.
-- @param #ATC_GROUND_NEVADA self
-- @param AirbaseNames A list {} of airbase names (Use AIRBASE.Nevada enumerator).
-- @return #AIRBASEPOLICE_NEVADA self
function AIRBASEPOLICE_NEVADA:New( AirbaseNames )
-- @return #ATC_GROUND_NEVADA self
function ATC_GROUND_NEVADA:New( AirbaseNames )
-- Inherits from BASE
local self = BASE:Inherit( self, AIRBASEPOLICE_BASE:New( self.Airbases, AirbaseNames ) )
local self = BASE:Inherit( self, ATC_GROUND:New( self.Airbases, AirbaseNames ) )
@ -1335,15 +1373,15 @@ function AIRBASEPOLICE_NEVADA:New( AirbaseNames )
end
--- @type AIRBASEPOLICE_NORMANDY
-- @extends Functional.AirbasePolice#AIRBASEPOLICE_BASE
--- @type ATC_GROUND_NORMANDY
-- @extends Functional.AirbasePolice#ATC_GROUND
--- # AIRBASEPOLICE_NORMANDY, extends @{#AIRBASEPOLICE_BASE}
--- # ATC_GROUND_NORMANDY, extends @{#ATC_GROUND}
--
-- ![Banner Image](..\Presentations\AIRBASEPOLICE\Dia1.JPG)
-- ![Banner Image](..\Presentations\ATC_GROUND\Dia1.JPG)
--
-- The AIRBASEPOLICE_NORMANDY class monitors the speed of the airplanes at the airbase during taxi.
-- The ATC_GROUND_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
@ -1353,27 +1391,54 @@ end
--
-- # Airbases monitored
--
-- The following airbases are monitored at the Caucasus region:
-- The following airbases are monitored at the Normandy region.
-- Use the AIRBASE.Normandy enumeration to select the airbases to be monitored.
--
-- * Nellis
-- * McCarran
-- * Creech
-- * GroomLake
--
-- * ´AIRBASE.Normandy.Azeville´
-- * ´AIRBASE.Normandy.Bazenville´
-- * ´AIRBASE.Normandy.Beny_sur_Mer´
-- * ´AIRBASE.Normandy.Beuzeville´
-- * ´AIRBASE.Normandy.Biniville´
-- * ´AIRBASE.Normandy.Brucheville´
-- * ´AIRBASE.Normandy.Cardonville´
-- * ´AIRBASE.Normandy.Carpiquet´
-- * ´AIRBASE.Normandy.Chailey´
-- * ´AIRBASE.Normandy.Chippelle´
-- * ´AIRBASE.Normandy.Cretteville´
-- * ´AIRBASE.Normandy.Cricqueville_en_Bessin´
-- * ´AIRBASE.Normandy.Deux_Jumeaux´
-- * ´AIRBASE.Normandy.Evreux´
-- * ´AIRBASE.Normandy.Ford´
-- * ´AIRBASE.Normandy.Funtington´
-- * ´AIRBASE.Normandy.Lantheuil´
-- * ´AIRBASE.Normandy.Le_Molay´
-- * ´AIRBASE.Normandy.Lessay´
-- * ´AIRBASE.Normandy.Lignerolles´
-- * ´AIRBASE.Normandy.Longues_sur_Mer´
-- * ´AIRBASE.Normandy.Maupertus´
-- * ´AIRBASE.Normandy.Meautis´
-- * ´AIRBASE.Normandy.Needs_Oar_Point´
-- * ´AIRBASE.Normandy.Picauville´
-- * ´AIRBASE.Normandy.Rucqueville´
-- * ´AIRBASE.Normandy.Saint_Pierre_du_Mont´
-- * ´AIRBASE.Normandy.Sainte_Croix_sur_Mer´
-- * ´AIRBASE.Normandy.Sainte_Laurent_sur_Mer´
-- * ´AIRBASE.Normandy.Sommervieu´
-- * ´AIRBASE.Normandy.Tangmere´
--
-- # Installation
--
-- ## In Single Player Missions
--
-- AIRBASEPOLICE is fully functional in single player.
-- ATC_GROUND 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.
-- ATC_GROUND 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!
-- ATC_GROUND is communicating with this modified script to kick players!
--
-- Install the file **SimpleSlotBlockGameGUI.lua** on the server, following the installation instructions described by Ciribob.
--
@ -1381,18 +1446,25 @@ end
--
-- # Script it!
--
-- ## 1. AIRBASEPOLICE_NORMANDY Constructor
-- ## 1. ATC_GROUND_NORMANDY Constructor
--
-- Creates a new AIRBASEPOLICE_NORMANDY object that will monitor pilots taxiing behaviour.
-- Creates a new ATC_GROUND_NORMANDY object that will monitor pilots taxiing behaviour.
--
-- -- This creates a new AIRBASEPOLICE_NORMANDY object.
-- -- This creates a new ATC_GROUND_NORMANDY object.
--
-- -- Monitor for these clients the airbases.
-- AirbasePoliceCaucasus = AIRBASEPOLICE_NORMANDY:New()
-- AirbasePoliceCaucasus = ATC_GROUND_NORMANDY:New()
--
-- ATC_Ground = ATC_GROUND_NORMANDY:New(
-- { AIRBASE.Normandy.Chippelle,
-- AIRBASE.Normandy.Beuzeville
-- }
-- )
--
--
-- @field #AIRBASEPOLICE_NORMANDY
AIRBASEPOLICE_NORMANDY = {
ClassName = "AIRBASEPOLICE_NORMANDY",
-- @field #ATC_GROUND_NORMANDY
ATC_GROUND_NORMANDY = {
ClassName = "ATC_GROUND_NORMANDY",
Airbases = {
[AIRBASE.Normandy.Azeville] = {
PointsRunways = {
@ -1784,14 +1856,14 @@ AIRBASEPOLICE_NORMANDY = {
}
--- Creates a new AIRBASEPOLICE_NORMANDY object.
-- @param #AIRBASEPOLICE_NORMANDY self
--- Creates a new ATC_GROUND_NORMANDY object.
-- @param #ATC_GROUND_NORMANDY self
-- @param AirbaseNames A list {} of airbase names (Use AIRBASE.Normandy enumerator).
-- @return #AIRBASEPOLICE_NORMANDY self
function AIRBASEPOLICE_NORMANDY:New( AirbaseNames )
-- @return #ATC_GROUND_NORMANDY self
function ATC_GROUND_NORMANDY:New( AirbaseNames )
-- Inherits from BASE
local self = BASE:Inherit( self, AIRBASEPOLICE_BASE:New( self.Airbases, AirbaseNames ) )
local self = BASE:Inherit( self, ATC_GROUND:New( 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

View File

@ -149,7 +149,7 @@ function AIRBASE:Register( AirbaseName )
local self = BASE:Inherit( self, POSITIONABLE:New( AirbaseName ) )
self.AirbaseName = AirbaseName
self.AirbaseZone = ZONE_RADIUS:New( AirbaseName, self:GetVec2(), 8000 )
self.AirbaseZone = ZONE_RADIUS:New( AirbaseName, self:GetVec2(), 2000 )
return self
end

View File

@ -41,7 +41,7 @@ Functional/Movement.lua
Functional/Sead.lua
Functional/Escort.lua
Functional/MissileTrainer.lua
Functional/AirbasePolice.lua
Functional/ATC_Ground.lua
Functional/Detection.lua
Functional/Designate.lua
Functional/RAT.lua

View File

@ -1,5 +1,5 @@
env.info( '*** MOOSE DYNAMIC INCLUDE START *** ' )
env.info( 'Moose Generation Timestamp: 20171023_1007' )
env.info( 'Moose Generation Timestamp: 20171026_0958' )
local base = _G
@ -61,7 +61,7 @@ __Moose.Include( 'Functional/Movement.lua' )
__Moose.Include( 'Functional/Sead.lua' )
__Moose.Include( 'Functional/Escort.lua' )
__Moose.Include( 'Functional/MissileTrainer.lua' )
__Moose.Include( 'Functional/AirbasePolice.lua' )
__Moose.Include( 'Functional/ATC_Ground.lua' )
__Moose.Include( 'Functional/Detection.lua' )
__Moose.Include( 'Functional/Designate.lua' )
__Moose.Include( 'Functional/RAT.lua' )

View File

@ -1,5 +1,5 @@
env.info('*** MOOSE DYNAMIC INCLUDE START *** ')
env.info('Moose Generation Timestamp: 20171023_1007')
env.info('Moose Generation Timestamp: 20171026_0958')
local base=_G
__Moose={}
__Moose.Include=function(IncludeFile)
@ -56,7 +56,7 @@ __Moose.Include('Functional/Movement.lua')
__Moose.Include('Functional/Sead.lua')
__Moose.Include('Functional/Escort.lua')
__Moose.Include('Functional/MissileTrainer.lua')
__Moose.Include('Functional/AirbasePolice.lua')
__Moose.Include('Functional/ATC_Ground.lua')
__Moose.Include('Functional/Detection.lua')
__Moose.Include('Functional/Designate.lua')
__Moose.Include('Functional/RAT.lua')

View File

@ -671,6 +671,7 @@
<dl class="function">
<dt>
<em>#number</em>
<a id="#(AI_A2A).IdleCount" >
<strong>AI_A2A.IdleCount</strong>
</a>

View File

@ -115,7 +115,7 @@
<div id="content">
<h1>Module <code>AirbasePolice</code></h1>
<p><strong>Functional</strong> -- The AIRBASEPOLICE classes monitor airbase traffic and regulate speed while taxiing.</p>
<p><strong>Functional</strong> -- The ATC_GROUND classes monitor airbase traffic and regulate speed while taxiing.</p>
@ -132,27 +132,37 @@
<tr>
<td class="name" nowrap="nowrap"><a href="#AIRBASEPOLICE_BASE">AIRBASEPOLICE_BASE</a></td>
<td class="summary">
<p>Base class for AIRBASEPOLICE implementations.</p>
<p>Base class for ATC_GROUND implementations.</p>
</td>
</tr>
<tr>
<td class="name" nowrap="nowrap"><a href="#AIRBASEPOLICE_CAUCASUS">AIRBASEPOLICE_CAUCASUS</a></td>
<td class="name" nowrap="nowrap"><a href="#ATC_GROUND_CAUCASUS">ATC_GROUND_CAUCASUS</a></td>
<td class="summary">
<h1>AIRBASEPOLICE_CAUCASUS, extends <a href="##(AIRBASEPOLICE_BASE)">#AIRBASEPOLICE_BASE</a></h1>
<h1>ATC<em>GROUND</em>CAUCASUS, extends <a href="##(AIRBASEPOLICE_BASE)">#AIRBASEPOLICE_BASE</a></h1>
<p><img src="..\Presentations\AIRBASEPOLICE\Dia1.JPG" alt="Banner Image"/></p>
<p><img src="..\Presentations\ATC_GROUND\Dia1.JPG" alt="Banner Image"/></p>
<p>The AIRBASEPOLICE_CAUCASUS class monitors the speed of the airplanes at the airbase during taxi.</p>
<p>The ATC<em>GROUND</em>CAUCASUS class monitors the speed of the airplanes at the airbase during taxi.</p>
</td>
</tr>
<tr>
<td class="name" nowrap="nowrap"><a href="#AIRBASEPOLICE_NEVADA">AIRBASEPOLICE_NEVADA</a></td>
<td class="name" nowrap="nowrap"><a href="#ATC_GROUND_NEVADA">ATC_GROUND_NEVADA</a></td>
<td class="summary">
<h1>AIRBASEPOLICE_NEVADA, extends <a href="##(AIRBASEPOLICE_BASE)">#AIRBASEPOLICE_BASE</a></h1>
<h1>ATC<em>GROUND</em>NEVADA, extends <a href="##(AIRBASEPOLICE_BASE)">#AIRBASEPOLICE_BASE</a></h1>
<p><img src="..\Presentations\AIRBASEPOLICE\Dia1.JPG" alt="Banner Image"/></p>
<p><img src="..\Presentations\ATC_GROUND\Dia1.JPG" alt="Banner Image"/></p>
<p>The AIRBASEPOLICE_NEVADA class monitors the speed of the airplanes at the airbase during taxi.</p>
<p>The ATC<em>GROUND</em>NEVADA class monitors the speed of the airplanes at the airbase during taxi.</p>
</td>
</tr>
<tr>
<td class="name" nowrap="nowrap"><a href="#ATC_GROUND_NORMANDY">ATC_GROUND_NORMANDY</a></td>
<td class="summary">
<h1>ATC<em>GROUND</em>NORMANDY, extends <a href="##(AIRBASEPOLICE_BASE)">#AIRBASEPOLICE_BASE</a></h1>
<p><img src="..\Presentations\ATC_GROUND\Dia1.JPG" alt="Banner Image"/></p>
<p>The ATC<em>GROUND</em>NORMANDY class monitors the speed of the airplanes at the airbase during taxi.</p>
</td>
</tr>
<tr>
@ -165,7 +175,31 @@
<h2><a id="#(AIRBASEPOLICE_BASE)">Type <code>AIRBASEPOLICE_BASE</code></a></h2>
<table class="function_list">
<tr>
<td class="name" nowrap="nowrap"><a href="##(AIRBASEPOLICE_BASE).New">AIRBASEPOLICE_BASE:New(SetClient, Airbases, AirbaseList)</a></td>
<td class="name" nowrap="nowrap"><a href="##(AIRBASEPOLICE_BASE).AirbaseList">AIRBASEPOLICE_BASE.AirbaseList</a></td>
<td class="summary">
</td>
</tr>
<tr>
<td class="name" nowrap="nowrap"><a href="##(AIRBASEPOLICE_BASE).AirbaseMonitor">AIRBASEPOLICE_BASE.AirbaseMonitor</a></td>
<td class="summary">
</td>
</tr>
<tr>
<td class="name" nowrap="nowrap"><a href="##(AIRBASEPOLICE_BASE).Airbases">AIRBASEPOLICE_BASE.Airbases</a></td>
<td class="summary">
</td>
</tr>
<tr>
<td class="name" nowrap="nowrap"><a href="##(AIRBASEPOLICE_BASE).KickSpeed">AIRBASEPOLICE_BASE.KickSpeed</a></td>
<td class="summary">
</td>
</tr>
<tr>
<td class="name" nowrap="nowrap"><a href="##(AIRBASEPOLICE_BASE).New">AIRBASEPOLICE_BASE:New(Airbases, AirbaseList)</a></td>
<td class="summary">
<p>Creates a new AIRBASEPOLICE_BASE object.</p>
</td>
@ -174,6 +208,18 @@
<td class="name" nowrap="nowrap"><a href="##(AIRBASEPOLICE_BASE).SetClient">AIRBASEPOLICE_BASE.SetClient</a></td>
<td class="summary">
</td>
</tr>
<tr>
<td class="name" nowrap="nowrap"><a href="##(AIRBASEPOLICE_BASE).SetKickSpeedKmph">AIRBASEPOLICE_BASE:SetKickSpeedKmph(KickSpeed)</a></td>
<td class="summary">
<p>Set the maximum speed in Kmph until the player gets kicked.</p>
</td>
</tr>
<tr>
<td class="name" nowrap="nowrap"><a href="##(AIRBASEPOLICE_BASE).SetKickSpeedMiph">AIRBASEPOLICE_BASE:SetKickSpeedMiph(KickSpeedMiph)</a></td>
<td class="summary">
<p>Set the maximum speed in Miph until the player gets kicked.</p>
</td>
</tr>
<tr>
@ -190,22 +236,32 @@
</tr>
</table>
<h2><a id="#(AIRBASEPOLICE_CAUCASUS)">Type <code>AIRBASEPOLICE_CAUCASUS</code></a></h2>
<h2><a id="#(ATC_GROUND_CAUCASUS)">Type <code>ATC_GROUND_CAUCASUS</code></a></h2>
<table class="function_list">
<tr>
<td class="name" nowrap="nowrap"><a href="##(AIRBASEPOLICE_CAUCASUS).New">AIRBASEPOLICE_CAUCASUS:New(SetClient, AirbaseNames)</a></td>
<td class="name" nowrap="nowrap"><a href="##(ATC_GROUND_CAUCASUS).New">ATC_GROUND_CAUCASUS:New(AirbaseNames)</a></td>
<td class="summary">
<p>Creates a new AIRBASEPOLICE_CAUCASUS object.</p>
<p>Creates a new ATC<em>GROUND</em>CAUCASUS object.</p>
</td>
</tr>
</table>
<h2><a id="#(AIRBASEPOLICE_NEVADA)">Type <code>AIRBASEPOLICE_NEVADA</code></a></h2>
<h2><a id="#(ATC_GROUND_NEVADA)">Type <code>ATC_GROUND_NEVADA</code></a></h2>
<table class="function_list">
<tr>
<td class="name" nowrap="nowrap"><a href="##(AIRBASEPOLICE_NEVADA).New">AIRBASEPOLICE_NEVADA:New(SetClient, AirbaseNames)</a></td>
<td class="name" nowrap="nowrap"><a href="##(ATC_GROUND_NEVADA).New">ATC_GROUND_NEVADA:New(AirbaseNames)</a></td>
<td class="summary">
<p>Creates a new AIRBASEPOLICE_NEVADA object.</p>
<p>Creates a new ATC<em>GROUND</em>NEVADA object.</p>
</td>
</tr>
</table>
<h2><a id="#(ATC_GROUND_NORMANDY)">Type <code>ATC_GROUND_NORMANDY</code></a></h2>
<table class="function_list">
<tr>
<td class="name" nowrap="nowrap"><a href="##(ATC_GROUND_NORMANDY).New">ATC_GROUND_NORMANDY:New(AirbaseNames)</a></td>
<td class="summary">
<p>Creates a new ATC<em>GROUND</em>NORMANDY object.</p>
</td>
</tr>
</table>
@ -221,25 +277,25 @@
</dt>
<dd>
<p>Base class for AIRBASEPOLICE implementations.</p>
<p>Base class for ATC_GROUND implementations.</p>
</dd>
</dl>
<dl class="function">
<dt>
<em><a href="##(AIRBASEPOLICE_CAUCASUS)">#AIRBASEPOLICE_CAUCASUS</a></em>
<a id="AIRBASEPOLICE_CAUCASUS" >
<strong>AIRBASEPOLICE_CAUCASUS</strong>
<em><a href="##(ATC_GROUND_CAUCASUS)">#ATC_GROUND_CAUCASUS</a></em>
<a id="ATC_GROUND_CAUCASUS" >
<strong>ATC_GROUND_CAUCASUS</strong>
</a>
</dt>
<dd>
<h1>AIRBASEPOLICE_CAUCASUS, extends <a href="##(AIRBASEPOLICE_BASE)">#AIRBASEPOLICE_BASE</a></h1>
<h1>ATC<em>GROUND</em>CAUCASUS, extends <a href="##(AIRBASEPOLICE_BASE)">#AIRBASEPOLICE_BASE</a></h1>
<p><img src="..\Presentations\AIRBASEPOLICE\Dia1.JPG" alt="Banner Image"/></p>
<p><img src="..\Presentations\ATC_GROUND\Dia1.JPG" alt="Banner Image"/></p>
<p>The AIRBASEPOLICE_CAUCASUS class monitors the speed of the airplanes at the airbase during taxi.</p>
<p>The ATC<em>GROUND</em>CAUCASUS class monitors the speed of the airplanes at the airbase during taxi.</p>
<p>The pilots may not drive faster than the maximum speed for the airbase, or they will be despawned.</p>
@ -253,30 +309,31 @@ faster than the maximum allowed speed, the pilot will be kicked.</p>
<h1>Airbases monitored</h1>
<p>The following airbases are monitored at the Caucasus region:</p>
<p>The following airbases are monitored at the Caucasus region.
Use the AIRBASE.Caucasus enumeration to select the airbases to be monitored.</p>
<ul>
<li>Anapa Vityazevo</li>
<li>Batumi</li>
<li>Beslan</li>
<li>Gelendzhik</li>
<li>Gudauta</li>
<li>Kobuleti</li>
<li>Krasnodar Center</li>
<li>Krasnodar Pashkovsky</li>
<li>Krymsk</li>
<li>Kutaisi</li>
<li>Maykop Khanskaya</li>
<li>Mineralnye Vody</li>
<li>Mozdok</li>
<li>Nalchik</li>
<li>Novorossiysk</li>
<li>Senaki Kolkhi</li>
<li>Sochi Adler</li>
<li>Soganlug</li>
<li>Sukhumi Babushara</li>
<li>Tbilisi Lochini</li>
<li>Vaziani</li>
<li>´AIRBASE.Caucasus.Anapa_Vityazevo´</li>
<li>´AIRBASE.Caucasus.Batumi´</li>
<li>´AIRBASE.Caucasus.Beslan´</li>
<li>´AIRBASE.Caucasus.Gelendzhik´</li>
<li>´AIRBASE.Caucasus.Gudauta´</li>
<li>´AIRBASE.Caucasus.Kobuleti´</li>
<li>´AIRBASE.Caucasus.Krasnodar_Center´</li>
<li>´AIRBASE.Caucasus.Krasnodar_Pashkovsky´</li>
<li>´AIRBASE.Caucasus.Krymsk´</li>
<li>´AIRBASE.Caucasus.Kutaisi´</li>
<li>´AIRBASE.Caucasus.Maykop_Khanskaya´</li>
<li>´AIRBASE.Caucasus.Mineralnye_Vody´</li>
<li>´AIRBASE.Caucasus.Mozdok´</li>
<li>´AIRBASE.Caucasus.Nalchik´</li>
<li>´AIRBASE.Caucasus.Novorossiysk´</li>
<li>´AIRBASE.Caucasus.Senaki_Kolkhi´</li>
<li>´AIRBASE.Caucasus.Sochi_Adler´</li>
<li>´AIRBASE.Caucasus.Soganlug´</li>
<li>´AIRBASE.Caucasus.Sukhumi_Babushara´</li>
<li>´AIRBASE.Caucasus.Tbilisi_Lochini´</li>
<li>´AIRBASE.Caucasus.Vaziani´</li>
</ul>
@ -284,15 +341,15 @@ faster than the maximum allowed speed, the pilot will be kicked.</p>
<h2>In Single Player Missions</h2>
<p>AIRBASEPOLICE is fully functional in single player.</p>
<p>ATC_GROUND is fully functional in single player.</p>
<h2>In Multi Player Missions</h2>
<p>AIRBASEPOLICE is NOT functional in multi player, for client machines connecting to the server, running the mission.
<p>ATC<em>GROUND 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 <strong>Ciribob</strong>, this script has been extended to also kick client players while in flight.
AIRBASEPOLICE is communicating with this modified script to kick players!</p>
ATC</em>GROUND is communicating with this modified script to kick players!</p>
<p>Install the file <strong>SimpleSlotBlockGameGUI.lua</strong> on the server, following the installation instructions described by Ciribob.</p>
@ -300,37 +357,42 @@ AIRBASEPOLICE is communicating with this modified script to kick players!</p>
<h1>Script it!</h1>
<h2>1. AIRBASEPOLICE_CAUCASUS Constructor</h2>
<h2>1. ATC<em>GROUND</em>CAUCASUS Constructor</h2>
<p>Creates a new AIRBASEPOLICE_CAUCASUS object that will monitor pilots taxiing behaviour.</p>
<p>Creates a new ATC<em>GROUND</em>CAUCASUS object that will monitor pilots taxiing behaviour.</p>
<pre><code>-- This creates a new AIRBASEPOLICE_CAUCASUS object.
<pre><code>-- This creates a new ATC_GROUND_CAUCASUS object.
-- Create a set of all clients in the mission.
AllClientsSet = SET_CLIENT:New():FilterStart()
-- Monitor all the airbases.
AirbasePoliceCaucasus = ATC_GROUND_CAUCASUS:New()
-- Monitor specific airbases only.
ATC_Ground = ATC_GROUND_CAUCASUS:New(
{ AIRBASE.Caucasus.Gelendzhik,
AIRBASE.Caucasus.Krymsk
}
)
-- Monitor for these clients the airbases.
AirbasePoliceCaucasus = AIRBASEPOLICE_CAUCASUS:New( AllClientsSet )
</code></pre>
</dd>
</dl>
<dl class="function">
<dt>
<em><a href="##(AIRBASEPOLICE_NEVADA)">#AIRBASEPOLICE_NEVADA</a></em>
<a id="AIRBASEPOLICE_NEVADA" >
<strong>AIRBASEPOLICE_NEVADA</strong>
<em><a href="##(ATC_GROUND_NEVADA)">#ATC_GROUND_NEVADA</a></em>
<a id="ATC_GROUND_NEVADA" >
<strong>ATC_GROUND_NEVADA</strong>
</a>
</dt>
<dd>
<h1>AIRBASEPOLICE_NEVADA, extends <a href="##(AIRBASEPOLICE_BASE)">#AIRBASEPOLICE_BASE</a></h1>
<h1>ATC<em>GROUND</em>NEVADA, extends <a href="##(AIRBASEPOLICE_BASE)">#AIRBASEPOLICE_BASE</a></h1>
<p><img src="..\Presentations\AIRBASEPOLICE\Dia1.JPG" alt="Banner Image"/></p>
<p><img src="..\Presentations\ATC_GROUND\Dia1.JPG" alt="Banner Image"/></p>
<p>The AIRBASEPOLICE_NEVADA class monitors the speed of the airplanes at the airbase during taxi.</p>
<p>The ATC<em>GROUND</em>NEVADA class monitors the speed of the airplanes at the airbase during taxi.</p>
<p>The pilots may not drive faster than the maximum speed for the airbase, or they will be despawned.</p>
@ -342,29 +404,43 @@ faster than the maximum allowed speed, the pilot will be kicked.</p>
<h1>Airbases monitored</h1>
<p>The following airbases are monitored at the Caucasus region:</p>
<p>The following airbases are monitored at the Nevada region.
Use the AIRBASE.Nevada enumeration to select the airbases to be monitored.</p>
<ul>
<li>Nellis</li>
<li>McCarran</li>
<li>Creech</li>
<li>GroomLake</li>
<li><code>AIRBASE.Nevada.Beatty_Airport</code></li>
<li><code>AIRBASE.Nevada.Boulder_City_Airport</code></li>
<li><code>AIRBASE.Nevada.Creech_AFB</code></li>
<li><code>AIRBASE.Nevada.Echo_Bay</code></li>
<li><code>AIRBASE.Nevada.Groom_Lake_AFB</code></li>
<li><code>AIRBASE.Nevada.Henderson_Executive_Airport</code></li>
<li><code>AIRBASE.Nevada.Jean_Airport</code></li>
<li><code>AIRBASE.Nevada.Laughlin_Airport</code></li>
<li><code>AIRBASE.Nevada.Lincoln_County</code></li>
<li><code>AIRBASE.Nevada.McCarran_International_Airport</code></li>
<li><code>AIRBASE.Nevada.Mellan_Airstrip</code></li>
<li><code>AIRBASE.Nevada.Mesquite</code></li>
<li><code>AIRBASE.Nevada.Mina_Airport_3Q0</code></li>
<li><code>AIRBASE.Nevada.Nellis_AFB</code></li>
<li><code>AIRBASE.Nevada.North_Las_Vegas</code></li>
<li><code>AIRBASE.Nevada.Pahute_Mesa_Airstrip</code></li>
<li><code>AIRBASE.Nevada.Tonopah_Airport</code></li>
<li><code>AIRBASE.Nevada.Tonopah_Test_Range_Airfield</code></li>
</ul>
<h1>Installation</h1>
<h2>In Single Player Missions</h2>
<p>AIRBASEPOLICE is fully functional in single player.</p>
<p>ATC_GROUND is fully functional in single player.</p>
<h2>In Multi Player Missions</h2>
<p>AIRBASEPOLICE is NOT functional in multi player, for client machines connecting to the server, running the mission.
<p>ATC<em>GROUND 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!</p>
ATC</em>GROUND is communicating with this modified script to kick players!</p>
<p>Install the file <strong>SimpleSlotBlockGameGUI.lua</strong> on the server, following the installation instructions described by Ciribob.</p>
@ -372,20 +448,131 @@ AIRBASEPOLICE is communicating with this modified script to kick players!</p>
<h1>Script it!</h1>
<h2>1. AIRBASEPOLICE_NEVADA Constructor</h2>
<h2>1. ATC<em>GROUND</em>NEVADA Constructor</h2>
<p>Creates a new AIRBASEPOLICE_NEVADA object that will monitor pilots taxiing behaviour.</p>
<p>Creates a new ATC<em>GROUND</em>NEVADA object that will monitor pilots taxiing behaviour.</p>
<pre><code>-- This creates a new AIRBASEPOLICE_NEVADA object.
<pre><code>-- This creates a new ATC_GROUND_NEVADA object.
-- Create a set of all clients in the mission.
AllClientsSet = SET_CLIENT:New():FilterStart()
-- Monitor all the airbases.
AirbasePoliceCaucasus = ATC_GROUND_NEVADA:New()
-- Monitor specific airbases.
ATC_Ground = ATC_GROUND_NEVADA:New(
{ AIRBASE.Nevada.Laughlin_Airport,
AIRBASE.Nevada.Mellan_Airstrip,
AIRBASE.Nevada.Lincoln_County,
AIRBASE.Nevada.North_Las_Vegas,
AIRBASE.Nevada.McCarran_International_Airport
}
)
</code></pre>
</dd>
</dl>
<dl class="function">
<dt>
<em><a href="##(ATC_GROUND_NORMANDY)">#ATC_GROUND_NORMANDY</a></em>
<a id="ATC_GROUND_NORMANDY" >
<strong>ATC_GROUND_NORMANDY</strong>
</a>
</dt>
<dd>
<h1>ATC<em>GROUND</em>NORMANDY, extends <a href="##(AIRBASEPOLICE_BASE)">#AIRBASEPOLICE_BASE</a></h1>
<p><img src="..\Presentations\ATC_GROUND\Dia1.JPG" alt="Banner Image"/></p>
<p>The ATC<em>GROUND</em>NORMANDY class monitors the speed of the airplanes at the airbase during taxi.</p>
<p>The pilots may not drive faster than the maximum speed for the airbase, or they will be despawned.</p>
<p>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.</p>
<p>Different airbases have different maximum speeds, according safety regulations.</p>
<h1>Airbases monitored</h1>
<p>The following airbases are monitored at the Normandy region.
Use the AIRBASE.Normandy enumeration to select the airbases to be monitored.</p>
<ul>
<li>´AIRBASE.Normandy.Azeville´</li>
<li>´AIRBASE.Normandy.Bazenville´</li>
<li>´AIRBASE.Normandy.Beny<em>sur</em>Mer´</li>
<li>´AIRBASE.Normandy.Beuzeville´</li>
<li>´AIRBASE.Normandy.Biniville´</li>
<li>´AIRBASE.Normandy.Brucheville´</li>
<li>´AIRBASE.Normandy.Cardonville´</li>
<li>´AIRBASE.Normandy.Carpiquet´</li>
<li>´AIRBASE.Normandy.Chailey´</li>
<li>´AIRBASE.Normandy.Chippelle´</li>
<li>´AIRBASE.Normandy.Cretteville´</li>
<li>´AIRBASE.Normandy.Cricqueville<em>en</em>Bessin´</li>
<li>´AIRBASE.Normandy.Deux_Jumeaux´</li>
<li>´AIRBASE.Normandy.Evreux´</li>
<li>´AIRBASE.Normandy.Ford´</li>
<li>´AIRBASE.Normandy.Funtington´</li>
<li>´AIRBASE.Normandy.Lantheuil´</li>
<li>´AIRBASE.Normandy.Le_Molay´</li>
<li>´AIRBASE.Normandy.Lessay´</li>
<li>´AIRBASE.Normandy.Lignerolles´</li>
<li>´AIRBASE.Normandy.Longues<em>sur</em>Mer´</li>
<li>´AIRBASE.Normandy.Maupertus´</li>
<li>´AIRBASE.Normandy.Meautis´</li>
<li>´AIRBASE.Normandy.Needs<em>Oar</em>Point´</li>
<li>´AIRBASE.Normandy.Picauville´</li>
<li>´AIRBASE.Normandy.Rucqueville´</li>
<li>´AIRBASE.Normandy.Saint<em>Pierre</em>du_Mont´</li>
<li>´AIRBASE.Normandy.Sainte<em>Croix</em>sur_Mer´</li>
<li>´AIRBASE.Normandy.Sainte<em>Laurent</em>sur_Mer´</li>
<li>´AIRBASE.Normandy.Sommervieu´</li>
<li>´AIRBASE.Normandy.Tangmere´</li>
</ul>
<h1>Installation</h1>
<h2>In Single Player Missions</h2>
<p>ATC_GROUND is fully functional in single player.</p>
<h2>In Multi Player Missions</h2>
<p>ATC<em>GROUND 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.
ATC</em>GROUND is communicating with this modified script to kick players!</p>
<p>Install the file <strong>SimpleSlotBlockGameGUI.lua</strong> on the server, following the installation instructions described by Ciribob.</p>
<p><a href="https://github.com/ciribob/DCS-SimpleSlotBlock">Simple Slot Blocker from Ciribob &amp; FlightControl</a></p>
<h1>Script it!</h1>
<h2>1. ATC<em>GROUND</em>NORMANDY Constructor</h2>
<p>Creates a new ATC<em>GROUND</em>NORMANDY object that will monitor pilots taxiing behaviour.</p>
<pre><code>-- This creates a new ATC_GROUND_NORMANDY object.
-- Monitor for these clients the airbases.
AirbasePoliceCaucasus = AIRBASEPOLICE_NEVADA:New( AllClientsSet )
AirbasePoliceCaucasus = ATC_GROUND_NORMANDY:New()
ATC_Ground = ATC_GROUND_NORMANDY:New(
{ AIRBASE.Normandy.Chippelle,
AIRBASE.Normandy.Beuzeville
}
)
</code></pre>
</dd>
</dl>
<dl class="function">
@ -412,8 +599,64 @@ AirbasePoliceCaucasus = AIRBASEPOLICE_NEVADA:New( AllClientsSet )
<dl class="function">
<dt>
<em></em>
<a id="#(AIRBASEPOLICE_BASE).AirbaseList" >
<strong>AIRBASEPOLICE_BASE.AirbaseList</strong>
</a>
</dt>
<dd>
</dd>
</dl>
<dl class="function">
<dt>
<em></em>
<a id="#(AIRBASEPOLICE_BASE).AirbaseMonitor" >
<strong>AIRBASEPOLICE_BASE.AirbaseMonitor</strong>
</a>
</dt>
<dd>
</dd>
</dl>
<dl class="function">
<dt>
<em></em>
<a id="#(AIRBASEPOLICE_BASE).Airbases" >
<strong>AIRBASEPOLICE_BASE.Airbases</strong>
</a>
</dt>
<dd>
</dd>
</dl>
<dl class="function">
<dt>
<em></em>
<a id="#(AIRBASEPOLICE_BASE).KickSpeed" >
<strong>AIRBASEPOLICE_BASE.KickSpeed</strong>
</a>
</dt>
<dd>
</dd>
</dl>
<dl class="function">
<dt>
<a id="#(AIRBASEPOLICE_BASE).New" >
<strong>AIRBASEPOLICE_BASE:New(SetClient, Airbases, AirbaseList)</strong>
<strong>AIRBASEPOLICE_BASE:New(Airbases, AirbaseList)</strong>
</a>
</dt>
<dd>
@ -424,12 +667,6 @@ AirbasePoliceCaucasus = AIRBASEPOLICE_NEVADA:New( AllClientsSet )
<ul>
<li>
<p><code><em> SetClient </em></code>:
A SET_CLIENT object that will contain the CLIENT objects to be monitored if they follow the rules of the airbase.</p>
</li>
<li>
<p><code><em> Airbases </em></code>:
A table of Airbase Names.</p>
@ -459,6 +696,60 @@ self</p>
</dd>
</dl>
<dl class="function">
<dt>
<a id="#(AIRBASEPOLICE_BASE).SetKickSpeedKmph" >
<strong>AIRBASEPOLICE_BASE:SetKickSpeedKmph(KickSpeed)</strong>
</a>
</dt>
<dd>
<p>Set the maximum speed in Kmph until the player gets kicked.</p>
<h3>Parameter</h3>
<ul>
<li>
<p><code><em>#number KickSpeed </em></code>:
Set the maximum speed in Kmph until the player gets kicked.</p>
</li>
</ul>
<h3>Return value</h3>
<p><em><a href="##(AIRBASEPOLICE_BASE)">#AIRBASEPOLICE_BASE</a>:</em>
self</p>
</dd>
</dl>
<dl class="function">
<dt>
<a id="#(AIRBASEPOLICE_BASE).SetKickSpeedMiph" >
<strong>AIRBASEPOLICE_BASE:SetKickSpeedMiph(KickSpeedMiph)</strong>
</a>
</dt>
<dd>
<p>Set the maximum speed in Miph until the player gets kicked.</p>
<h3>Parameter</h3>
<ul>
<li>
<p><code><em>#number KickSpeedMiph </em></code>:
Set the maximum speed in Mph until the player gets kicked.</p>
</li>
</ul>
<h3>Return value</h3>
<p><em><a href="##(AIRBASEPOLICE_BASE)">#AIRBASEPOLICE_BASE</a>:</em>
self</p>
</dd>
</dl>
<dl class="function">
@ -504,29 +795,23 @@ self</p>
<h2><a id="#(AIRBASEPOLICE_BASE.AirbaseNames)" >Type <code>AIRBASEPOLICE_BASE.AirbaseNames</code></a></h2>
<h2><a id="#(AIRBASEPOLICE_CAUCASUS)" >Type <code>AIRBASEPOLICE_CAUCASUS</code></a></h2>
<h2><a id="#(ATC_GROUND_CAUCASUS)" >Type <code>ATC_GROUND_CAUCASUS</code></a></h2>
<h3>Field(s)</h3>
<dl class="function">
<dt>
<a id="#(AIRBASEPOLICE_CAUCASUS).New" >
<strong>AIRBASEPOLICE_CAUCASUS:New(SetClient, AirbaseNames)</strong>
<a id="#(ATC_GROUND_CAUCASUS).New" >
<strong>ATC_GROUND_CAUCASUS:New(AirbaseNames)</strong>
</a>
</dt>
<dd>
<p>Creates a new AIRBASEPOLICE_CAUCASUS object.</p>
<p>Creates a new ATC<em>GROUND</em>CAUCASUS object.</p>
<h3>Parameters</h3>
<h3>Parameter</h3>
<ul>
<li>
<p><code><em> SetClient </em></code>:
A SET_CLIENT object that will contain the CLIENT objects to be monitored if they follow the rules of the airbase.</p>
</li>
<li>
<p><code><em> AirbaseNames </em></code>:
A list {} of airbase names (Use AIRBASE.Caucasus enumerator).</p>
@ -534,35 +819,29 @@ A list {} of airbase names (Use AIRBASE.Caucasus enumerator).</p>
</ul>
<h3>Return value</h3>
<p><em><a href="##(AIRBASEPOLICE_CAUCASUS)">#AIRBASEPOLICE_CAUCASUS</a>:</em>
<p><em><a href="##(ATC_GROUND_CAUCASUS)">#ATC<em>GROUND</em>CAUCASUS</a>:</em>
self</p>
</dd>
</dl>
<h2><a id="#(AIRBASEPOLICE_NEVADA)" >Type <code>AIRBASEPOLICE_NEVADA</code></a></h2>
<h2><a id="#(ATC_GROUND_NEVADA)" >Type <code>ATC_GROUND_NEVADA</code></a></h2>
<h3>Field(s)</h3>
<dl class="function">
<dt>
<a id="#(AIRBASEPOLICE_NEVADA).New" >
<strong>AIRBASEPOLICE_NEVADA:New(SetClient, AirbaseNames)</strong>
<a id="#(ATC_GROUND_NEVADA).New" >
<strong>ATC_GROUND_NEVADA:New(AirbaseNames)</strong>
</a>
</dt>
<dd>
<p>Creates a new AIRBASEPOLICE_NEVADA object.</p>
<p>Creates a new ATC<em>GROUND</em>NEVADA object.</p>
<h3>Parameters</h3>
<h3>Parameter</h3>
<ul>
<li>
<p><code><em> SetClient </em></code>:
A SET_CLIENT object that will contain the CLIENT objects to be monitored if they follow the rules of the airbase.</p>
</li>
<li>
<p><code><em> AirbaseNames </em></code>:
A list {} of airbase names (Use AIRBASE.Nevada enumerator).</p>
@ -570,7 +849,37 @@ A list {} of airbase names (Use AIRBASE.Nevada enumerator).</p>
</ul>
<h3>Return value</h3>
<p><em><a href="##(AIRBASEPOLICE_NEVADA)">#AIRBASEPOLICE_NEVADA</a>:</em>
<p><em><a href="##(ATC_GROUND_NEVADA)">#ATC<em>GROUND</em>NEVADA</a>:</em>
self</p>
</dd>
</dl>
<h2><a id="#(ATC_GROUND_NORMANDY)" >Type <code>ATC_GROUND_NORMANDY</code></a></h2>
<h3>Field(s)</h3>
<dl class="function">
<dt>
<a id="#(ATC_GROUND_NORMANDY).New" >
<strong>ATC_GROUND_NORMANDY:New(AirbaseNames)</strong>
</a>
</dt>
<dd>
<p>Creates a new ATC<em>GROUND</em>NORMANDY object.</p>
<h3>Parameter</h3>
<ul>
<li>
<p><code><em> AirbaseNames </em></code>:
A list {} of airbase names (Use AIRBASE.Normandy enumerator).</p>
</li>
</ul>
<h3>Return value</h3>
<p><em><a href="##(ATC_GROUND_NORMANDY)">#ATC<em>GROUND</em>NORMANDY</a>:</em>
self</p>
</dd>

File diff suppressed because it is too large Load Diff

View File

@ -3805,6 +3805,7 @@ The range till cargo will board.</p>
<dl class="function">
<dt>
<em>#number</em>
<a id="#(CARGO_UNIT).RunCount" >
<strong>CARGO_UNIT.RunCount</strong>
</a>

View File

@ -1106,7 +1106,7 @@ function below will use the range 1-7 just in case</p>
<dl class="function">
<dt>
<em></em>
<em>#number</em>
<a id="#(DESIGNATE).LaseDuration" >
<strong>DESIGNATE.LaseDuration</strong>
</a>

View File

@ -2469,7 +2469,6 @@ The index of the DetectedItem.</p>
<dl class="function">
<dt>
<em>#number</em>
<a id="#(DETECTION_BASE).DetectedItemCount" >
<strong>DETECTION_BASE.DetectedItemCount</strong>
</a>
@ -2483,7 +2482,6 @@ The index of the DetectedItem.</p>
<dl class="function">
<dt>
<em>#number</em>
<a id="#(DETECTION_BASE).DetectedItemMax" >
<strong>DETECTION_BASE.DetectedItemMax</strong>
</a>

View File

@ -1608,7 +1608,7 @@ A string defining the start state.</p>
<dl class="function">
<dt>
<em></em>
<em>#string</em>
<a id="#(FSM)._StartState" >
<strong>FSM._StartState</strong>
</a>
@ -1907,7 +1907,6 @@ A string defining the start state.</p>
<dl class="function">
<dt>
<em></em>
<a id="#(FSM).current" >
<strong>FSM.current</strong>
</a>

View File

@ -314,7 +314,7 @@
<tr>
<td class="name" nowrap="nowrap"><a href="##(POSITIONABLE).GetVelocity">POSITIONABLE:GetVelocity()</a></td>
<td class="summary">
<p>Returns the POSITIONABLE velocity vector.</p>
<p>Returns the a <a href="Velocity.html">Velocity</a> object from the positionable.</p>
</td>
</tr>
<tr>
@ -327,6 +327,12 @@
<td class="name" nowrap="nowrap"><a href="##(POSITIONABLE).GetVelocityMPS">POSITIONABLE:GetVelocityMPS()</a></td>
<td class="summary">
<p>Returns the POSITIONABLE velocity in meters per second.</p>
</td>
</tr>
<tr>
<td class="name" nowrap="nowrap"><a href="##(POSITIONABLE).GetVelocityVec3">POSITIONABLE:GetVelocityVec3()</a></td>
<td class="summary">
<p>Returns the POSITIONABLE velocity Vec3 vector.</p>
</td>
</tr>
<tr>
@ -1208,14 +1214,14 @@ The POSITIONABLE is not existing or alive. </p>
</dt>
<dd>
<p>Returns the POSITIONABLE velocity vector.</p>
<p>Returns the a <a href="Velocity.html">Velocity</a> object from the positionable.</p>
<h3>Return values</h3>
<ol>
<li>
<p><em><a href="Dcs.DCSTypes.html##(Vec3)">Dcs.DCSTypes#Vec3</a>:</em>
The velocity vector</p>
<p><em><a href="Core.Velocity.html##(VELOCITY)">Core.Velocity#VELOCITY</a>:</em>
Velocity The Velocity object.</p>
</li>
<li>
@ -1266,6 +1272,34 @@ The velocity in meters per second.</p>
<dl class="function">
<dt>
<a id="#(POSITIONABLE).GetVelocityVec3" >
<strong>POSITIONABLE:GetVelocityVec3()</strong>
</a>
</dt>
<dd>
<p>Returns the POSITIONABLE velocity Vec3 vector.</p>
<h3>Return values</h3>
<ol>
<li>
<p><em><a href="Dcs.DCSTypes.html##(Vec3)">Dcs.DCSTypes#Vec3</a>:</em>
The velocity Vec3 vector</p>
</li>
<li>
<p><em>#nil:</em>
The POSITIONABLE is not existing or alive. </p>
</li>
</ol>
</dd>
</dl>
<dl class="function">
<dt>
<a id="#(POSITIONABLE).HasCargo" >
<strong>POSITIONABLE:HasCargo(Cargo)</strong>
</a>

View File

@ -236,6 +236,22 @@
<li>Countries</li>
<li>Starting with certain prefix strings.</li>
</ul>
</td>
</tr>
<tr>
<td class="name" nowrap="nowrap"><a href="#SET_PLAYER">SET_PLAYER</a></td>
<td class="summary">
<h1>4) SET_PLAYER class, extends <a href="Set.html##(SET_BASE)">Set#SET_BASE</a></h1>
<p>Mission designers can use the <a href="Set.html##(SET_PLAYER)">Set#SET_PLAYER</a> class to build sets of units belonging to alive players:</p>
<h2>4.1) SET_PLAYER constructor</h2>
<p>Create a new SET_PLAYER object with the <a href="##(SET_PLAYER).New">SET_PLAYER.New</a> method:</p>
<ul>
<li><a href="##(SET_PLAYER).New">SET_PLAYER.New</a>: Creates a new SET_PLAYER object.</li>
</ul>
</td>
</tr>
<tr>
@ -951,6 +967,106 @@ mission designer to add a dedicated method</p>
<td class="name" nowrap="nowrap"><a href="##(SET_GROUP)._EventOnDeadOrCrash">SET_GROUP:_EventOnDeadOrCrash(Event)</a></td>
<td class="summary">
<p>Handles the OnDead or OnCrash event for alive groups set.</p>
</td>
</tr>
</table>
<h2><a id="#(SET_PLAYER)">Type <code>SET_PLAYER</code></a></h2>
<table class="function_list">
<tr>
<td class="name" nowrap="nowrap"><a href="##(SET_PLAYER).AddClientsByName">SET_PLAYER:AddClientsByName(AddClientNames)</a></td>
<td class="summary">
<p>Add CLIENT(s) to SET_PLAYER.</p>
</td>
</tr>
<tr>
<td class="name" nowrap="nowrap"><a href="##(SET_PLAYER).AddInDatabase">SET_PLAYER:AddInDatabase(Event)</a></td>
<td class="summary">
<p>Handles the Database to check on an event (birth) that the Object was added in the Database.</p>
</td>
</tr>
<tr>
<td class="name" nowrap="nowrap"><a href="##(SET_PLAYER).FilterCategories">SET_PLAYER:FilterCategories(Categories)</a></td>
<td class="summary">
<p>Builds a set of clients out of categories joined by players.</p>
</td>
</tr>
<tr>
<td class="name" nowrap="nowrap"><a href="##(SET_PLAYER).FilterCoalitions">SET_PLAYER:FilterCoalitions(Coalitions)</a></td>
<td class="summary">
<p>Builds a set of clients of coalitions joined by specific players.</p>
</td>
</tr>
<tr>
<td class="name" nowrap="nowrap"><a href="##(SET_PLAYER).FilterCountries">SET_PLAYER:FilterCountries(Countries)</a></td>
<td class="summary">
<p>Builds a set of clients of defined countries.</p>
</td>
</tr>
<tr>
<td class="name" nowrap="nowrap"><a href="##(SET_PLAYER).FilterPrefixes">SET_PLAYER:FilterPrefixes(Prefixes)</a></td>
<td class="summary">
<p>Builds a set of clients of defined client prefixes.</p>
</td>
</tr>
<tr>
<td class="name" nowrap="nowrap"><a href="##(SET_PLAYER).FilterStart">SET_PLAYER:FilterStart()</a></td>
<td class="summary">
<p>Starts the filtering.</p>
</td>
</tr>
<tr>
<td class="name" nowrap="nowrap"><a href="##(SET_PLAYER).FilterTypes">SET_PLAYER:FilterTypes(Types)</a></td>
<td class="summary">
<p>Builds a set of clients of defined client types joined by players.</p>
</td>
</tr>
<tr>
<td class="name" nowrap="nowrap"><a href="##(SET_PLAYER).FindClient">SET_PLAYER:FindClient(PlayerName)</a></td>
<td class="summary">
<p>Finds a Client based on the Player Name.</p>
</td>
</tr>
<tr>
<td class="name" nowrap="nowrap"><a href="##(SET_PLAYER).FindInDatabase">SET_PLAYER:FindInDatabase(Event)</a></td>
<td class="summary">
<p>Handles the Database to check on any event that Object exists in the Database.</p>
</td>
</tr>
<tr>
<td class="name" nowrap="nowrap"><a href="##(SET_PLAYER).ForEachPlayer">SET_PLAYER:ForEachPlayer(IteratorFunction, ...)</a></td>
<td class="summary">
<p>Iterate the SET_PLAYER and call an interator function for each <strong>alive</strong> CLIENT, providing the CLIENT and optional parameters.</p>
</td>
</tr>
<tr>
<td class="name" nowrap="nowrap"><a href="##(SET_PLAYER).ForEachPlayerInZone">SET_PLAYER:ForEachPlayerInZone(ZoneObject, IteratorFunction, ...)</a></td>
<td class="summary">
<p>Iterate the SET_PLAYER and call an iterator function for each <strong>alive</strong> CLIENT presence completely in a <a href="Zone.html">Zone</a>, providing the CLIENT and optional parameters to the called function.</p>
</td>
</tr>
<tr>
<td class="name" nowrap="nowrap"><a href="##(SET_PLAYER).ForEachPlayerNotInZone">SET_PLAYER:ForEachPlayerNotInZone(ZoneObject, IteratorFunction, ...)</a></td>
<td class="summary">
<p>Iterate the SET_PLAYER and call an iterator function for each <strong>alive</strong> CLIENT presence not in a <a href="Zone.html">Zone</a>, providing the CLIENT and optional parameters to the called function.</p>
</td>
</tr>
<tr>
<td class="name" nowrap="nowrap"><a href="##(SET_PLAYER).IsIncludeObject">SET_PLAYER:IsIncludeObject(MClient)</a></td>
<td class="summary">
</td>
</tr>
<tr>
<td class="name" nowrap="nowrap"><a href="##(SET_PLAYER).New">SET_PLAYER:New()</a></td>
<td class="summary">
<p>Creates a new SET_PLAYER object, building a set of clients belonging to a coalitions, categories, countries, types or with defined prefix names.</p>
</td>
</tr>
<tr>
<td class="name" nowrap="nowrap"><a href="##(SET_PLAYER).RemoveClientsByName">SET_PLAYER:RemoveClientsByName(RemoveClientNames)</a></td>
<td class="summary">
<p>Remove CLIENT(s) from SET_PLAYER.</p>
</td>
</tr>
</table>
@ -1664,6 +1780,69 @@ The following iterator methods are currently available within the SET</em>GROUP:
<hr/>
</dd>
</dl>
<dl class="function">
<dt>
<em><a href="##(SET_PLAYER)">#SET_PLAYER</a></em>
<a id="SET_PLAYER" >
<strong>SET_PLAYER</strong>
</a>
</dt>
<dd>
<h1>4) SET_PLAYER class, extends <a href="Set.html##(SET_BASE)">Set#SET_BASE</a></h1>
<p>Mission designers can use the <a href="Set.html##(SET_PLAYER)">Set#SET_PLAYER</a> class to build sets of units belonging to alive players:</p>
<h2>4.1) SET_PLAYER constructor</h2>
<p>Create a new SET_PLAYER object with the <a href="##(SET_PLAYER).New">SET_PLAYER.New</a> method:</p>
<ul>
<li><a href="##(SET_PLAYER).New">SET_PLAYER.New</a>: Creates a new SET_PLAYER object.</li>
</ul>
<p> </p>
<h2>4.3) SET_PLAYER filter criteria</h2>
<p>You can set filter criteria to define the set of clients within the SET_PLAYER.
Filter criteria are defined by:</p>
<ul>
<li><a href="##(SET_PLAYER).FilterCoalitions">SET_PLAYER.FilterCoalitions</a>: Builds the SET_PLAYER with the clients belonging to the coalition(s).</li>
<li><a href="##(SET_PLAYER).FilterCategories">SET_PLAYER.FilterCategories</a>: Builds the SET_PLAYER with the clients belonging to the category(ies).</li>
<li><a href="##(SET_PLAYER).FilterTypes">SET_PLAYER.FilterTypes</a>: Builds the SET_PLAYER with the clients belonging to the client type(s).</li>
<li><a href="##(SET_PLAYER).FilterCountries">SET_PLAYER.FilterCountries</a>: Builds the SET_PLAYER with the clients belonging to the country(ies).</li>
<li><a href="##(SET_PLAYER).FilterPrefixes">SET_PLAYER.FilterPrefixes</a>: Builds the SET_PLAYER with the clients starting with the same prefix string(s).</li>
</ul>
<p>Once the filter criteria have been set for the SET_PLAYER, you can start filtering using:</p>
<ul>
<li><a href="##(SET_PLAYER).FilterStart">SET_PLAYER.FilterStart</a>: Starts the filtering of the clients within the SET_PLAYER.</li>
</ul>
<p>Planned filter criteria within development are (so these are not yet available):</p>
<ul>
<li><a href="##(SET_PLAYER).FilterZones">SET_PLAYER.FilterZones</a>: Builds the SET_PLAYER with the clients within a <a href="Zone.html##(ZONE)">Zone#ZONE</a>.</li>
</ul>
<h2>4.4) SET_PLAYER iterators</h2>
<p>Once the filters have been defined and the SET<em>PLAYER has been built, you can iterate the SET</em>PLAYER with the available iterator methods.
The iterator methods will walk the SET<em>PLAYER set, and call for each element within the set a function that you provide.
The following iterator methods are currently available within the SET</em>PLAYER:</p>
<ul>
<li><a href="##(SET_PLAYER).ForEachClient">SET_PLAYER.ForEachClient</a>: Calls a function for each alive client it finds within the SET_PLAYER.</li>
</ul>
<hr/>
</dd>
</dl>
<dl class="function">
@ -4828,6 +5007,491 @@ A single name or an array of GROUP names.</p>
</li>
</ul>
</dd>
</dl>
<h2><a id="#(SET_PLAYER)" >Type <code>SET_PLAYER</code></a></h2>
<h3>Field(s)</h3>
<dl class="function">
<dt>
<a id="#(SET_PLAYER).AddClientsByName" >
<strong>SET_PLAYER:AddClientsByName(AddClientNames)</strong>
</a>
</dt>
<dd>
<p>Add CLIENT(s) to SET_PLAYER.</p>
<h3>Parameter</h3>
<ul>
<li>
<p><code><em>#string AddClientNames </em></code>:
A single name or an array of CLIENT names.</p>
</li>
</ul>
<h3>Return value</h3>
<p>self</p>
</dd>
</dl>
<dl class="function">
<dt>
<a id="#(SET_PLAYER).AddInDatabase" >
<strong>SET_PLAYER:AddInDatabase(Event)</strong>
</a>
</dt>
<dd>
<p>Handles the Database to check on an event (birth) that the Object was added in the Database.</p>
<p>This is required, because sometimes the <em>DATABASE birth event gets called later than the SET</em>BASE birth event!</p>
<h3>Parameter</h3>
<ul>
<li>
<p><code><em><a href="Core.Event.html##(EVENTDATA)">Core.Event#EVENTDATA</a> Event </em></code>: </p>
</li>
</ul>
<h3>Return values</h3>
<ol>
<li>
<p><em>#string:</em>
The name of the CLIENT</p>
</li>
<li>
<p><em>#table:</em>
The CLIENT</p>
</li>
</ol>
</dd>
</dl>
<dl class="function">
<dt>
<a id="#(SET_PLAYER).FilterCategories" >
<strong>SET_PLAYER:FilterCategories(Categories)</strong>
</a>
</dt>
<dd>
<p>Builds a set of clients out of categories joined by players.</p>
<p>Possible current categories are plane, helicopter, ground, ship.</p>
<h3>Parameter</h3>
<ul>
<li>
<p><code><em>#string Categories </em></code>:
Can take the following values: "plane", "helicopter", "ground", "ship".</p>
</li>
</ul>
<h3>Return value</h3>
<p><em><a href="##(SET_PLAYER)">#SET_PLAYER</a>:</em>
self</p>
</dd>
</dl>
<dl class="function">
<dt>
<a id="#(SET_PLAYER).FilterCoalitions" >
<strong>SET_PLAYER:FilterCoalitions(Coalitions)</strong>
</a>
</dt>
<dd>
<p>Builds a set of clients of coalitions joined by specific players.</p>
<p>Possible current coalitions are red, blue and neutral.</p>
<h3>Parameter</h3>
<ul>
<li>
<p><code><em>#string Coalitions </em></code>:
Can take the following values: "red", "blue", "neutral".</p>
</li>
</ul>
<h3>Return value</h3>
<p><em><a href="##(SET_PLAYER)">#SET_PLAYER</a>:</em>
self</p>
</dd>
</dl>
<dl class="function">
<dt>
<a id="#(SET_PLAYER).FilterCountries" >
<strong>SET_PLAYER:FilterCountries(Countries)</strong>
</a>
</dt>
<dd>
<p>Builds a set of clients of defined countries.</p>
<p>Possible current countries are those known within DCS world.</p>
<h3>Parameter</h3>
<ul>
<li>
<p><code><em>#string Countries </em></code>:
Can take those country strings known within DCS world.</p>
</li>
</ul>
<h3>Return value</h3>
<p><em><a href="##(SET_PLAYER)">#SET_PLAYER</a>:</em>
self</p>
</dd>
</dl>
<dl class="function">
<dt>
<a id="#(SET_PLAYER).FilterPrefixes" >
<strong>SET_PLAYER:FilterPrefixes(Prefixes)</strong>
</a>
</dt>
<dd>
<p>Builds a set of clients of defined client prefixes.</p>
<p>All the clients starting with the given prefixes will be included within the set.</p>
<h3>Parameter</h3>
<ul>
<li>
<p><code><em>#string Prefixes </em></code>:
The prefix of which the client name starts with.</p>
</li>
</ul>
<h3>Return value</h3>
<p><em><a href="##(SET_PLAYER)">#SET_PLAYER</a>:</em>
self</p>
</dd>
</dl>
<dl class="function">
<dt>
<a id="#(SET_PLAYER).FilterStart" >
<strong>SET_PLAYER:FilterStart()</strong>
</a>
</dt>
<dd>
<p>Starts the filtering.</p>
<h3>Return value</h3>
<p><em><a href="##(SET_PLAYER)">#SET_PLAYER</a>:</em>
self</p>
</dd>
</dl>
<dl class="function">
<dt>
<a id="#(SET_PLAYER).FilterTypes" >
<strong>SET_PLAYER:FilterTypes(Types)</strong>
</a>
</dt>
<dd>
<p>Builds a set of clients of defined client types joined by players.</p>
<p>Possible current types are those types known within DCS world.</p>
<h3>Parameter</h3>
<ul>
<li>
<p><code><em>#string Types </em></code>:
Can take those type strings known within DCS world.</p>
</li>
</ul>
<h3>Return value</h3>
<p><em><a href="##(SET_PLAYER)">#SET_PLAYER</a>:</em>
self</p>
</dd>
</dl>
<dl class="function">
<dt>
<a id="#(SET_PLAYER).FindClient" >
<strong>SET_PLAYER:FindClient(PlayerName)</strong>
</a>
</dt>
<dd>
<p>Finds a Client based on the Player Name.</p>
<h3>Parameter</h3>
<ul>
<li>
<p><code><em>#string PlayerName </em></code>: </p>
</li>
</ul>
<h3>Return value</h3>
<p><em><a href="Wrapper.Client.html##(CLIENT)">Wrapper.Client#CLIENT</a>:</em>
The found Client.</p>
</dd>
</dl>
<dl class="function">
<dt>
<a id="#(SET_PLAYER).FindInDatabase" >
<strong>SET_PLAYER:FindInDatabase(Event)</strong>
</a>
</dt>
<dd>
<p>Handles the Database to check on any event that Object exists in the Database.</p>
<p>This is required, because sometimes the <em>DATABASE event gets called later than the SET</em>BASE event or vise versa!</p>
<h3>Parameter</h3>
<ul>
<li>
<p><code><em><a href="Core.Event.html##(EVENTDATA)">Core.Event#EVENTDATA</a> Event </em></code>: </p>
</li>
</ul>
<h3>Return values</h3>
<ol>
<li>
<p><em>#string:</em>
The name of the CLIENT</p>
</li>
<li>
<p><em>#table:</em>
The CLIENT</p>
</li>
</ol>
</dd>
</dl>
<dl class="function">
<dt>
<a id="#(SET_PLAYER).ForEachPlayer" >
<strong>SET_PLAYER:ForEachPlayer(IteratorFunction, ...)</strong>
</a>
</dt>
<dd>
<p>Iterate the SET_PLAYER and call an interator function for each <strong>alive</strong> CLIENT, providing the CLIENT and optional parameters.</p>
<h3>Parameters</h3>
<ul>
<li>
<p><code><em>#function IteratorFunction </em></code>:
The function that will be called when there is an alive CLIENT in the SET_PLAYER. The function needs to accept a CLIENT parameter.</p>
</li>
<li>
<p><code><em> ... </em></code>: </p>
</li>
</ul>
<h3>Return value</h3>
<p><em><a href="##(SET_PLAYER)">#SET_PLAYER</a>:</em>
self</p>
</dd>
</dl>
<dl class="function">
<dt>
<a id="#(SET_PLAYER).ForEachPlayerInZone" >
<strong>SET_PLAYER:ForEachPlayerInZone(ZoneObject, IteratorFunction, ...)</strong>
</a>
</dt>
<dd>
<p>Iterate the SET_PLAYER and call an iterator function for each <strong>alive</strong> CLIENT presence completely in a <a href="Zone.html">Zone</a>, providing the CLIENT and optional parameters to the called function.</p>
<h3>Parameters</h3>
<ul>
<li>
<p><code><em><a href="Core.Zone.html##(ZONE)">Core.Zone#ZONE</a> ZoneObject </em></code>:
The Zone to be tested for.</p>
</li>
<li>
<p><code><em>#function IteratorFunction </em></code>:
The function that will be called when there is an alive CLIENT in the SET_PLAYER. The function needs to accept a CLIENT parameter.</p>
</li>
<li>
<p><code><em> ... </em></code>: </p>
</li>
</ul>
<h3>Return value</h3>
<p><em><a href="##(SET_PLAYER)">#SET_PLAYER</a>:</em>
self</p>
</dd>
</dl>
<dl class="function">
<dt>
<a id="#(SET_PLAYER).ForEachPlayerNotInZone" >
<strong>SET_PLAYER:ForEachPlayerNotInZone(ZoneObject, IteratorFunction, ...)</strong>
</a>
</dt>
<dd>
<p>Iterate the SET_PLAYER and call an iterator function for each <strong>alive</strong> CLIENT presence not in a <a href="Zone.html">Zone</a>, providing the CLIENT and optional parameters to the called function.</p>
<h3>Parameters</h3>
<ul>
<li>
<p><code><em><a href="Core.Zone.html##(ZONE)">Core.Zone#ZONE</a> ZoneObject </em></code>:
The Zone to be tested for.</p>
</li>
<li>
<p><code><em>#function IteratorFunction </em></code>:
The function that will be called when there is an alive CLIENT in the SET_PLAYER. The function needs to accept a CLIENT parameter.</p>
</li>
<li>
<p><code><em> ... </em></code>: </p>
</li>
</ul>
<h3>Return value</h3>
<p><em><a href="##(SET_PLAYER)">#SET_PLAYER</a>:</em>
self</p>
</dd>
</dl>
<dl class="function">
<dt>
<a id="#(SET_PLAYER).IsIncludeObject" >
<strong>SET_PLAYER:IsIncludeObject(MClient)</strong>
</a>
</dt>
<dd>
<h3>Parameter</h3>
<ul>
<li>
<p><code><em><a href="Wrapper.Client.html##(CLIENT)">Wrapper.Client#CLIENT</a> MClient </em></code>: </p>
</li>
</ul>
<h3>Return value</h3>
<p><em><a href="##(SET_PLAYER)">#SET_PLAYER</a>:</em>
self</p>
</dd>
</dl>
<dl class="function">
<dt>
<a id="#(SET_PLAYER).New" >
<strong>SET_PLAYER:New()</strong>
</a>
</dt>
<dd>
<p>Creates a new SET_PLAYER object, building a set of clients belonging to a coalitions, categories, countries, types or with defined prefix names.</p>
<h3>Return value</h3>
<p><em><a href="##(SET_PLAYER)">#SET_PLAYER</a>:</em></p>
<h3>Usage:</h3>
<pre class="example"><code>-- Define a new SET_PLAYER Object. This DBObject will contain a reference to all Clients.
DBObject = SET_PLAYER:New()</code></pre>
</dd>
</dl>
<dl class="function">
<dt>
<a id="#(SET_PLAYER).RemoveClientsByName" >
<strong>SET_PLAYER:RemoveClientsByName(RemoveClientNames)</strong>
</a>
</dt>
<dd>
<p>Remove CLIENT(s) from SET_PLAYER.</p>
<h3>Parameter</h3>
<ul>
<li>
<p><code><em><a href="Wrapper.Client.html##(CLIENT)">Wrapper.Client#CLIENT</a> RemoveClientNames </em></code>:
A single name or an array of CLIENT names.</p>
</li>
</ul>
<h3>Return value</h3>
<p>self</p>
</dd>
</dl>

View File

@ -2308,9 +2308,6 @@ The group that was spawned. You can use this group for further actions.</p>
<p> Don't repeat the group from Take-Off till Landing and back Take-Off by ReSpawning.</p>
</dd>
</dl>
<dl class="function">
@ -2885,9 +2882,6 @@ when nothing was spawned.</p>
<p> Overwrite unit names by default with group name.</p>
</dd>
</dl>
<dl class="function">
@ -3285,7 +3279,7 @@ Spawn_BE_KA50 = SPAWN:New( 'BE KA-50@RAMP-Ground Defense' ):Schedule( 600, 0.5 )
<dl class="function">
<dt>
<em>#boolean</em>
<em></em>
<a id="#(SPAWN).SpawnUnControlled" >
<strong>SPAWN.SpawnUnControlled</strong>
</a>

View File

@ -562,7 +562,7 @@ based on the tasking capabilities defined in <a href="Task.html##(TASK)">Task#TA
<dl class="function">
<dt>
<em><a href="Core.Cargo.html##(CARGO)">Core.Cargo#CARGO</a></em>
<em><a href="Core.Cargo.html##(CARGO_GROUP)">Core.Cargo#CARGO_GROUP</a></em>
<a id="#(FSM_PROCESS).Cargo" >
<strong>FSM_PROCESS.Cargo</strong>
</a>

View File

@ -317,6 +317,12 @@ which are excellent tools to be reused in an OO environment!.</p>
<td class="name" nowrap="nowrap"><a href="##(UTILS).MetersToNM">UTILS.MetersToNM(meters)</a></td>
<td class="summary">
</td>
</tr>
<tr>
<td class="name" nowrap="nowrap"><a href="##(UTILS).MiphToMps">UTILS.MiphToMps(miph)</a></td>
<td class="summary">
</td>
</tr>
<tr>
@ -329,6 +335,12 @@ which are excellent tools to be reused in an OO environment!.</p>
<td class="name" nowrap="nowrap"><a href="##(UTILS).MpsToKnots">UTILS.MpsToKnots(mps)</a></td>
<td class="summary">
</td>
</tr>
<tr>
<td class="name" nowrap="nowrap"><a href="##(UTILS).MpsToMiph">UTILS.MpsToMiph(mps)</a></td>
<td class="summary">
</td>
</tr>
<tr>
@ -910,6 +922,27 @@ is the name of the class to evaluate (can be either a string or a Moose class)</
<dl class="function">
<dt>
<a id="#(UTILS).MiphToMps" >
<strong>UTILS.MiphToMps(miph)</strong>
</a>
</dt>
<dd>
<h3>Parameter</h3>
<ul>
<li>
<p><code><em> miph </em></code>: </p>
</li>
</ul>
</dd>
</dl>
<dl class="function">
<dt>
<a id="#(UTILS).MpsToKmph" >
<strong>UTILS.MpsToKmph(mps)</strong>
</a>
@ -939,6 +972,27 @@ is the name of the class to evaluate (can be either a string or a Moose class)</
<h3>Parameter</h3>
<ul>
<li>
<p><code><em> mps </em></code>: </p>
</li>
</ul>
</dd>
</dl>
<dl class="function">
<dt>
<a id="#(UTILS).MpsToMiph" >
<strong>UTILS.MpsToMiph(mps)</strong>
</a>
</dt>
<dd>
<h3>Parameter</h3>
<ul>
<li>

View File

@ -276,7 +276,7 @@ even when there are hardly any players in the mission.</strong></p>
<tr>
<td class="name" nowrap="nowrap"><a href="AirbasePolice.html">AirbasePolice</a></td>
<td class="summary">
<p><strong>Functional</strong> -- The AIRBASEPOLICE classes monitor airbase traffic and regulate speed while taxiing.</p>
<p><strong>Functional</strong> -- The ATC_GROUND classes monitor airbase traffic and regulate speed while taxiing.</p>
</td>
</tr>
<tr>
@ -288,7 +288,7 @@ even when there are hardly any players in the mission.</strong></p>
<tr>
<td class="name" nowrap="nowrap"><a href="Base.html">Base</a></td>
<td class="summary">
<p><strong>Core</strong> -- BASE forms <strong>the basis of the MOOSE framework</strong>.</p>
<p><strong>Core</strong> -- VELOCITY models a speed, which can be expressed in various formats according the Settings.</p>
</td>
</tr>
<tr>