From 17f961f7d97b492df004a7ca97f32e9f96bb0b92 Mon Sep 17 00:00:00 2001 From: svenvandevelde Date: Tue, 15 Mar 2016 17:56:41 +0100 Subject: [PATCH] Documentation --- Embedded/Moose_Create_Embedded.bat | 31 ++ {Moose => Embedded}/Moose_Embedded.lua | 13 + MissionScripting/MissionScripting.lua | 10 +- Moose/Client.lua | 1 - Moose/DeployTask.lua | 8 +- Moose/Group.lua | 13 +- Moose/MissionScripting.lua | 37 -- Moose/Moose_Create_Embedded.bat | 31 -- Moose/Spawn.lua | 358 ++++++++----- Test Missions/MOOSE_Spawn_Test.lua | 7 +- Test Missions/MOOSE_Spawn_Test.miz | Bin 45285 -> 45905 bytes doc/classes/BASE.html | 23 +- doc/classes/CARGO.html | 146 +++--- doc/classes/CLEANUP.html | 197 +++++++- doc/classes/CLIENT.html | 226 +++------ doc/classes/DATABASE.html | 47 +- doc/classes/DEPLOYTASK.html | 19 +- doc/classes/DESTROYBASETASK.html | 36 +- doc/classes/DESTROYGROUPSTASK.html | 50 +- doc/classes/DESTROYRADARSTASK.html | 36 +- doc/classes/DESTROYUNITTYPESTASK.html | 51 +- doc/classes/GOHOMETASK.html | 21 +- doc/classes/GROUP.html | 97 ++++ doc/classes/MENU.html | 19 +- doc/classes/MESSAGE.html | 114 +++-- doc/classes/MISSION.html | 101 +--- doc/classes/MOVEMENT.html | 24 +- doc/classes/NOTASK.html | 17 +- doc/classes/PICKUPTASK.html | 19 +- doc/classes/ROUTETASK.html | 25 +- doc/classes/SEAD.html | 23 +- doc/classes/SPAWN.html | 673 ++++++++++++++----------- doc/classes/STAGE.html | 15 +- doc/classes/TASK.html | 49 +- doc/classes/UNIT.html | 97 ++++ doc/classes/ZONE.html | 97 ++++ doc/index.html | 44 +- doc/ldoc.css | 10 +- doc/modules/routines.html | 23 +- doc/modules/trace.html | 19 +- doc/scripts/eStatHandler.html | 19 +- ldoc_errors.txt | 23 +- 42 files changed, 1569 insertions(+), 1300 deletions(-) create mode 100644 Embedded/Moose_Create_Embedded.bat rename {Moose => Embedded}/Moose_Embedded.lua (99%) delete mode 100644 Moose/MissionScripting.lua delete mode 100644 Moose/Moose_Create_Embedded.bat create mode 100644 doc/classes/GROUP.html create mode 100644 doc/classes/UNIT.html create mode 100644 doc/classes/ZONE.html diff --git a/Embedded/Moose_Create_Embedded.bat b/Embedded/Moose_Create_Embedded.bat new file mode 100644 index 000000000..0d28173c2 --- /dev/null +++ b/Embedded/Moose_Create_Embedded.bat @@ -0,0 +1,31 @@ +rem Generate Moose_Embedded.lua + +copy /b ..\Moose\Trace.lua ^ + + ..\Moose\Routines.lua ^ + + ..\Moose\Base.lua ^ + + ..\Moose\Menu.lua ^ + + ..\Moose\Group.lua ^ + + ..\Moose\Unit.lua ^ + + ..\Moose\Zone.lua ^ + + ..\Moose\Database.lua ^ + + ..\Moose\Cargo.lua ^ + + ..\Moose\Client.lua ^ + + ..\Moose\Message.lua ^ + + ..\Moose\Stage.lua ^ + + ..\Moose\Task.lua ^ + + ..\Moose\GoHomeTask.lua ^ + + ..\Moose\DestroyBaseTask.lua ^ + + ..\Moose\DestroyGroupsTask.lua ^ + + ..\Moose\DestroyRadarsTask.lua ^ + + ..\Moose\DestroyUnitTypesTask.lua ^ + + ..\Moose\PickupTask.lua ^ + + ..\Moose\DeployTask.lua ^ + + ..\Moose\NoTask.lua ^ + + ..\Moose\RouteTask.lua ^ + + ..\Moose\Mission.lua ^ + + ..\Moose\CleanUp.lua ^ + + ..\Moose\Spawn.lua ^ + + ..\Moose\Movement.lua ^ + + ..\Moose\Sead.lua ^ + Moose_Embedded.lua /y + \ No newline at end of file diff --git a/Moose/Moose_Embedded.lua b/Embedded/Moose_Embedded.lua similarity index 99% rename from Moose/Moose_Embedded.lua rename to Embedded/Moose_Embedded.lua index 1a27b1b0c..2e0e0ecd1 100644 --- a/Moose/Moose_Embedded.lua +++ b/Embedded/Moose_Embedded.lua @@ -3573,6 +3573,19 @@ function UNIT:IsAlive() end +function UNIT:GetDCSUnit() + self:T( self.DCSUnit ) + + return self.DCSUnit +end + +function UNIT:GetID() + self:T( self.UnitID ) + + return self.UnitID +end + + function UNIT:GetName() self:T( self.UnitName ) diff --git a/MissionScripting/MissionScripting.lua b/MissionScripting/MissionScripting.lua index 08a1e8e73..993b711a4 100644 --- a/MissionScripting/MissionScripting.lua +++ b/MissionScripting/MissionScripting.lua @@ -4,7 +4,7 @@ dofile('Scripts/ScriptingSystem.lua') Include = {} -Include.LoadPath = 'Scripts/MOOSE/MOOSE' +Include.LoadPath = 'Scripts/MOOSE' Include.Files = {} Include.File = function( IncludeFile ) @@ -15,13 +15,11 @@ Include.File = function( IncludeFile ) end end -Include.File( "Trace" ) -Include.File( "Routines" ) Include.File( "Database" ) -Include.File( "StatHandler" ) +--Include.File( "StatHandler" ) --Sanitize Mission Scripting environment ---This makes unavailable some unsecure functions. +--This makes unavailable some unsecure functions. --Mission downloaded from server to client may contain potentialy harmful lua code that may use these functions. --You can remove the code below and make availble these functions at your own risk. @@ -36,4 +34,4 @@ do sanitizeModule('lfs') require = nil loadlib = nil -end +end \ No newline at end of file diff --git a/Moose/Client.lua b/Moose/Client.lua index 3da8dbbc5..8332dc994 100644 --- a/Moose/Client.lua +++ b/Moose/Client.lua @@ -42,7 +42,6 @@ CLIENT = { -- Mission:AddClient( CLIENT:New( 'RU MI-8MTV2*RAMP-Deploy Troops 3' ):Transport() ) -- Mission:AddClient( CLIENT:New( 'RU MI-8MTV2*HOT-Deploy Troops 2' ):Transport() ) -- Mission:AddClient( CLIENT:New( 'RU MI-8MTV2*RAMP-Deploy Troops 4' ):Transport() ) - function CLIENT:New( ClientName, ClientBriefing ) local self = BASE:Inherit( self, BASE:New() ) self:T() diff --git a/Moose/DeployTask.lua b/Moose/DeployTask.lua index 612f1f6ad..811e086eb 100644 --- a/Moose/DeployTask.lua +++ b/Moose/DeployTask.lua @@ -3,6 +3,9 @@ Include.File( "Task" ) +--- A DeployTask +-- @type DEPLOYTASK +-- DEPLOYTASK = { ClassName = "DEPLOYTASK", TEXT = { "Deploy", "deployed", "unloaded" }, @@ -11,8 +14,9 @@ DEPLOYTASK = { --- Creates a new DEPLOYTASK object, which models the sequence of STAGEs to unload a cargo. --- @tparam table{string,...}|string LandingZones Table or name of the zone(s) where Cargo is to be unloaded. --- @tparam CARGO_TYPE CargoType Type of the Cargo. +-- @function [parent=#DEPLOYTASK] New +-- @param #string CargoType Type of the Cargo. +-- @return #DEPLOYTASK The created DeployTask function DEPLOYTASK:New( CargoType ) local self = BASE:Inherit( self, TASK:New() ) self:T() diff --git a/Moose/Group.lua b/Moose/Group.lua index 13859aa4f..4fecbb528 100644 --- a/Moose/Group.lua +++ b/Moose/Group.lua @@ -1,17 +1,20 @@ --- GROUP Classes --- @classmod GROUP +-- @module GROUP +-- @return #GROUP Include.File( "Routines" ) Include.File( "Base" ) Include.File( "Message" ) Include.File( "Unit" ) -GROUPS = {} - - +--- The GROUP class +-- @type GROUP +-- @field ClassName The name of the class. GROUP = { - ClassName="GROUP", + ClassName = "GROUP", } + +GROUPS = {} function GROUP:New( DCSGroup ) local self = BASE:Inherit( self, BASE:New() ) diff --git a/Moose/MissionScripting.lua b/Moose/MissionScripting.lua deleted file mode 100644 index 993b711a4..000000000 --- a/Moose/MissionScripting.lua +++ /dev/null @@ -1,37 +0,0 @@ ---Initialization script for the Mission lua Environment (SSE) - -dofile('Scripts/ScriptingSystem.lua') - -Include = {} - -Include.LoadPath = 'Scripts/MOOSE' -Include.Files = {} - -Include.File = function( IncludeFile ) - if not Include.Files[ IncludeFile ] then - Include.Files[IncludeFile] = IncludeFile - dofile( Include.LoadPath .. "/" .. IncludeFile .. ".lua" ) - env.info( "Include:" .. IncludeFile .. " loaded." ) - end -end - -Include.File( "Database" ) ---Include.File( "StatHandler" ) - ---Sanitize Mission Scripting environment ---This makes unavailable some unsecure functions. ---Mission downloaded from server to client may contain potentialy harmful lua code that may use these functions. ---You can remove the code below and make availble these functions at your own risk. - -local function sanitizeModule(name) - _G[name] = nil - package.loaded[name] = nil -end - -do - --sanitizeModule('os') - --sanitizeModule('io') - sanitizeModule('lfs') - require = nil - loadlib = nil -end \ No newline at end of file diff --git a/Moose/Moose_Create_Embedded.bat b/Moose/Moose_Create_Embedded.bat deleted file mode 100644 index 6eda4668f..000000000 --- a/Moose/Moose_Create_Embedded.bat +++ /dev/null @@ -1,31 +0,0 @@ -rem Generate Moose_Embedded.lua - -copy /b Trace.lua ^ - + Routines.lua ^ - + Base.lua ^ - + Menu.lua ^ - + Group.lua ^ - + Unit.lua ^ - + Zone.lua ^ - + Database.lua ^ - + Cargo.lua ^ - + Client.lua ^ - + Message.lua ^ - + Stage.lua ^ - + Task.lua ^ - + GoHomeTask.lua ^ - + DestroyBaseTask.lua ^ - + DestroyGroupsTask.lua ^ - + DestroyRadarsTask.lua ^ - + DestroyUnitTypesTask.lua ^ - + PickupTask.lua ^ - + DeployTask.lua ^ - + NoTask.lua ^ - + RouteTask.lua ^ - + Mission.lua ^ - + CleanUp.lua ^ - + Spawn.lua ^ - + Movement.lua ^ - + Sead.lua ^ - Moose_Embedded.lua /y - \ No newline at end of file diff --git a/Moose/Spawn.lua b/Moose/Spawn.lua index f991500d9..b3a238e1d 100644 --- a/Moose/Spawn.lua +++ b/Moose/Spawn.lua @@ -1,8 +1,43 @@ ---- Dynamic spawning of Groups and Units. --- @classmod SPAWN --- @author Flightcontrol +--- Dynamic spawning of groups and units. +-- SPAWN: The SPAWN module allows to spawn dynamically new groups, based on pre-defined initialization settings. +-- ============================================================================================================= +-- Spawned groups will follow the following naming convention when instantiated within the DCS World run-time environment: +-- +-- 1. Groups will have the name SpawnTemplatePrefix#ggg, where ggg is a counter from 0 to 999 for each new spawned Group. +-- 2. Units will have the name SpawnTemplatePrefix#ggg-uu, where uu is a counter from 0 to 99 for each new spawned Unit belonging to that Group. +-- +-- Some additional notes that need to remember: +-- +-- * Templates are actually groups defined within the mission editor, with the flag "Late Activation" set. As such, these groups are never used within the mission, but are used by the @{#SPAWN} module. +-- * It is important to defined BEFORE you spawn new groups, a proper initialization of the SPAWN instance is done with the options you want to use. +-- * When designing a mission, NEVER name groups using a "#" within the name of the group Template(s), or the SPAWN module logic won't work anymore. +-- +-- 1. Construction: +-- ---------------- +-- Create a new @{SPAWN object with the @{#SPAWN.New} and the @{#SPAWN.NewWithAlias} methods. +-- +-- 2. Initialization of the SPAWN object. +-- ------------------ +-- A SPAWN instance will behave differently based on the usage of initialization methods: +-- +-- * Limit the amount of groups that can be alive at the same time and that can be dynamically spawned using the @{#SPAWN.Limit} method. +-- * Spawned groups can get their routes randomized using the @{#SPAWN.RandomizeRoute} method. +-- * Using the @{#SPAWN.RandomizeTemplate}, random group templates can be defined so that when a new group is spawned, the group template is selected from one of the templates defined. +-- * Spawing of groups can be scheduled at defined but randomized intervals. Use the @{#SPAWN.Scheduled} method to schedule spawning of groups. +-- +-- 2. Instantiation +-- ------------------------------ +-- +-- @module SPAWN +-- @author FlightControl -MOOSE_Version = "0.1.1.1" + +--- +-- @type SPAWN +-- @field ClassName Contains SPAWN +SPAWN = { + ClassName = "SPAWN", +} Include.File( "Routines" ) Include.File( "Base" ) @@ -11,22 +46,16 @@ Include.File( "Group" ) Include.File( "Zone" ) -SPAWN = { - ClassName = "SPAWN", -} ---- Public --- @section Public ---- Creates the main object to spawn a Group defined in the DCS ME. --- Spawned Groups and Units will follow the following naming convention within the DCS World run-time environment: --- Groups will have the name SpawnTemplatePrefix#ggg, where ggg is a counter from 0 to 999 for each new spawned Group. --- Units will have the name SpawnTemplatePrefix#ggg-uu, where uu is a counter from 0 to 99 for each new spawned Unit belonging to that Group. --- @tparam string SpawnTemplatePrefix is the name of the Group in the ME that defines the Template. That Group must have the flag "Late Activation" set. Note that this SpawnTemplatePrefix name should not contain any # character. --- @treturn SPAWN +--- Creates the main object to spawn a GROUP defined in the DCS ME. +-- @param self +-- @param #string SpawnTemplatePrefix is the name of the Group in the ME that defines the Template. Each new group will have the name starting with SpawnTemplatePrefix. +-- @return #SPAWN -- @usage -- -- NATO helicopters engaging in the battle field. -- Spawn_BE_KA50 = SPAWN:New( 'BE KA-50@RAMP-Ground Defense' ) +-- @usage local Plane = SPAWN:New( "Plane" ) -- Creates a new local variable that can initiate new planes with the name "Plane#ddd" using the template "Plane" as defined within the ME. function SPAWN:New( SpawnTemplatePrefix ) local self = BASE:Inherit( self, BASE:New() ) self:T( { SpawnTemplatePrefix } ) @@ -41,7 +70,7 @@ function SPAWN:New( SpawnTemplatePrefix ) self.SpawnTemplate = self._GetTemplate( self, SpawnTemplatePrefix ) -- Contains the template structure for a Group Spawn from the Mission Editor. Note that this group must have lateActivation always on!!! self.SpawnRepeat = false -- Don't repeat the group from Take-Off till Landing and back Take-Off by ReSpawning. self.UnControlled = false -- When working in UnControlled mode, all planes are Spawned in UnControlled mode before the scheduler starts. - self.SpawnMaxGroupsAlive = 0 -- The maximum amount of groups that can be alive of SpawnTemplatePrefix at the same time. + self.SpawnMaxUnitsAlive = 0 -- The maximum amount of groups that can be alive of SpawnTemplatePrefix at the same time. self.SpawnMaxGroups = 0 -- The maximum amount of groups that can be spawned. self.SpawnRandomize = false -- Sets the randomization flag of new Spawned units to false. self.SpawnVisible = false -- Flag that indicates if all the Groups of the SpawnGroup need to be visible when Spawned. @@ -60,15 +89,15 @@ function SPAWN:New( SpawnTemplatePrefix ) return self end ---- Creates the main object to spawn a Group defined in the DCS ME. --- Spawned Groups and Units will follow the following naming convention within the DCS World run-time environment: --- Groups will have the name SpawnTemplatePrefix#ggg, where ggg is a counter from 0 to 999 for each new spawned Group. --- Units will have the name SpawnTemplatePrefix#ggg-uu, where uu is a counter from 0 to 99 for each new spawned Unit belonging to that Group. --- @tparam string SpawnTemplatePrefix is the name of the Group in the ME that defines the Template. That Group must have the flag "Late Activation" set. Note that this SpawnTemplatePrefix name should not contain any # character. --- @treturn SPAWN +--- Creates a new SPAWN instance to create new groups based on the defined template and using a new alias for each new group. +-- @param self +-- @param #string SpawnTemplatePrefix is the name of the Group in the ME that defines the Template. +-- @param #string SpawnAliasPrefix is the name that will be given to the Group at runtime. +-- @return #SPAWN -- @usage -- -- NATO helicopters engaging in the battle field. --- Spawn_BE_KA50 = SPAWN:New( 'BE KA-50@RAMP-Ground Defense' ) +-- Spawn_BE_KA50 = SPAWN:NewWithAlias( 'BE KA-50@RAMP-Ground Defense', 'Helicopter Attacking a City' ) +-- @usage local PlaneWithAlias = SPAWN:NewWithAlias( "Plane", "Bomber" ) -- Creates a new local variable that can instantiate new planes with the name "Bomber#ddd" using the template "Plane" as defined within the ME. function SPAWN:NewWithAlias( SpawnTemplatePrefix, SpawnAliasPrefix ) local self = BASE:Inherit( self, BASE:New() ) self:T( { SpawnTemplatePrefix, SpawnAliasPrefix } ) @@ -84,7 +113,7 @@ function SPAWN:NewWithAlias( SpawnTemplatePrefix, SpawnAliasPrefix ) self.SpawnTemplate = self._GetTemplate( self, SpawnTemplatePrefix ) -- Contains the template structure for a Group Spawn from the Mission Editor. Note that this group must have lateActivation always on!!! self.SpawnRepeat = false -- Don't repeat the group from Take-Off till Landing and back Take-Off by ReSpawning. self.UnControlled = false -- When working in UnControlled mode, all planes are Spawned in UnControlled mode before the scheduler starts. - self.SpawnMaxGroupsAlive = 0 -- The maximum amount of groups that can be alive of SpawnTemplatePrefix at the same time. + self.SpawnMaxUnitsAlive = 0 -- The maximum amount of groups that can be alive of SpawnTemplatePrefix at the same time. self.SpawnMaxGroups = 0 -- The maximum amount of groups that can be spawned. self.SpawnRandomize = false -- Sets the randomization flag of new Spawned units to false. self.SpawnVisible = false -- Flag that indicates if all the Groups of the SpawnGroup need to be visible when Spawned. @@ -104,10 +133,25 @@ function SPAWN:NewWithAlias( SpawnTemplatePrefix, SpawnAliasPrefix ) end -function SPAWN:Limit( SpawnMaxGroupsAlive, SpawnMaxGroups ) - self:T( { self.SpawnTemplatePrefix, SpawnMaxGroupsAlive, SpawnMaxGroups } ) +--- Limits the Maximum amount of Units that can be alive at the same time, and the maximum amount of groups that can be spawned. +-- Note that this method is exceptionally important to balance the performance of the mission. Depending on the machine etc, a mission can only process a maximum amount of units. +-- If the time interval must be short, but there should not be more Units or Groups alive than a maximum amount of units, then this function should be used... +-- When a @{#SPAWN.New} is executed and the limit of the amount of units alive is reached, then no new spawn will happen of the group, until some of these units of the spawn object will be destroyed. +-- @param self +-- @param #number SpawnMaxUnitsAlive The maximum amount of units that can be alive at runtime. +-- @param #number SpawnMaxGroups The maximum amount of groups that can be spawned. When the limit is reached, then no more actual spawns will happen of the group. +-- This parameter is useful to define a maximum amount of airplanes, ground troops, helicopters, ships etc within a supply area. +-- This parameter accepts the value 0, which defines that there are no maximum group limits, but there are limits on the maximum of units that can be alive at the same time. +-- @return #SPAWN self +-- @usage +-- -- NATO helicopters engaging in the battle field. +-- -- This helicopter group consists of one Unit. So, this group will SPAWN maximum 2 groups simultaneously within the DCSRTE. +-- -- There will be maximum 24 groups spawned during the whole mission lifetime. +-- Spawn_BE_KA50 = SPAWN:New( 'BE KA-50@RAMP-Ground Defense' ):Limit( 2, 24 ) +function SPAWN:Limit( SpawnMaxUnitsAlive, SpawnMaxGroups ) + self:T( { self.SpawnTemplatePrefix, SpawnMaxUnitsAlive, SpawnMaxGroups } ) - self.SpawnMaxGroupsAlive = SpawnMaxGroupsAlive -- The maximum amount of groups that can be alive of SpawnTemplatePrefix at the same time. + self.SpawnMaxUnitsAlive = SpawnMaxUnitsAlive -- The maximum amount of groups that can be alive of SpawnTemplatePrefix at the same time. self.SpawnMaxGroups = SpawnMaxGroups -- The maximum amount of groups that can be spawned. for SpawnGroupID = 1, self.SpawnMaxGroups do @@ -118,18 +162,20 @@ function SPAWN:Limit( SpawnMaxGroupsAlive, SpawnMaxGroups ) end ---- Randomizes a defined route of the Template Group in the ME when the Group is Spawned. This is very useful to define extra variation in the DCS World run-time environment of the behaviour of Groups like Ground Units, Ships, Planes, Helicopters. --- @tparam number SpawnStartPoint is the waypoint where the randomization begins. Note that the StartPoint = 0 equals the point where the Group is Spawned. This parameter is useful to avoid randomization to start from the first waypoint, but a bit further down the route... --- @tparam number SpawnEndPoint is the waypoint where the randomization ends. this parameter is useful to avoid randomization to end at a waypoint earlier than the last waypoint on the route. --- @tparam number SpawnRadius is the radius in meters, that defines the concentric circle in which the randomization of the new waypoint will take place, with the original waypoint located in the middle... --- @treturn SPAWN +--- Randomizes the defined route of the SpawnTemplatePrefix group in the ME. This is very useful to define extra variation of the behaviour of groups. +-- @param self +-- @param #number SpawnStartPoint is the waypoint where the randomization begins. +-- Note that the StartPoint = 0 equaling the point where the group is spawned. +-- @param #number SpawnEndPoint is the waypoint where the randomization ends counting backwards. +-- This parameter is useful to avoid randomization to end at a waypoint earlier than the last waypoint on the route. +-- @param #number SpawnRadius is the radius in meters in which the randomization of the new waypoints, with the original waypoint of the original template located in the middle ... +-- @return #SPAWN -- @usage -- -- NATO helicopters engaging in the battle field. --- -- The KA-50 has waypoints SP, 1, 2, 3, 4, DP. --- -- Waypoints 2 and 3 will only be randomized. The others will remain on their original position with each new ${SPAWN} of the helicopter. --- -- The randomization of waypoint 2 and 3 will take place within a diameter of 4000 meters. +-- -- The KA-50 has waypoints Start point ( =0 or SP ), 1, 2, 3, 4, End point (= 5 or DP). +-- -- Waypoints 2 and 3 will only be randomized. The others will remain on their original position with each new spawn of the helicopter. +-- -- The randomization of waypoint 2 and 3 will take place within a radius of 2000 meters. -- Spawn_BE_KA50 = SPAWN:New( 'BE KA-50@RAMP-Ground Defense' ):RandomizeRoute( 2, 2, 2000 ) - function SPAWN:RandomizeRoute( SpawnStartPoint, SpawnEndPoint, SpawnRadius ) self:T( { self.SpawnTemplatePrefix, SpawnStartPoint, SpawnEndPoint, SpawnRadius } ) @@ -145,6 +191,10 @@ function SPAWN:RandomizeRoute( SpawnStartPoint, SpawnEndPoint, SpawnRadius ) return self end +--- Internal function randomizing the routes. +-- @param self +-- @param #number SpawnIndex The index of the group to be spawned. +-- @return #SPAWN function SPAWN:_RandomizeRoute( SpawnIndex ) self:T( { self.SpawnTemplatePrefix, SpawnIndex, self.SpawnRandomizeRoute, self.SpawnRandomizeRouteStartPoint, self.SpawnRandomizeRouteEndPoint, self.SpawnRandomizeRouteRadius } ) @@ -165,24 +215,25 @@ function SPAWN:_RandomizeRoute( SpawnIndex ) return self end ---- This function is rather complicated to understand. But I'll try to explain... --- This function becomes useful when you need to SPAWN random types of Groups defined within the ME, but they all need to follow the same Template route and have the same SpawnTemplatePrefix name, then this method becomes very useful. --- @tparam table{string,...} SpawnTemplatePrefixTable is a table with the names of the Groups defined within the ME (with late activatio on), from which on a new SPAWN of SpawnTemplatePrefix (the main Group name), a NEW Group will be choosen as the Group to be SPAWNed. --- In other words, this method randomizes between a defined set of Groups the Group to be SPAWNed for each new SPAWN. --- @treturn SPAWN +--- This function is rather complicated to understand. But I'll try to explain. +-- This function becomes useful when you need to spawn groups with random templates of groups defined within the mission editor, +-- but they will all follow the same Template route and have the same prefix name. +-- In other words, this method randomizes between a defined set of groups the template to be used for each new spawn of a group. +-- @param self +-- @param #string SpawnTemplatePrefixTable A table with the names of the groups defined within the mission editor, from which one will be choosen when a new group will be spawned. +-- @return #SPAWN -- @usage -- -- NATO Tank Platoons invading Gori. --- -- Choose between 13 different 'US Tank Platoon' configurations for each new SPAWN the Group to be SPAWNed for the +-- -- Choose between 13 different 'US Tank Platoon' configurations for each new SPAWN the Group to be spawned for the -- -- 'US Tank Platoon Left', 'US Tank Platoon Middle' and 'US Tank Platoon Right' SpawnTemplatePrefixes. -- -- Each new SPAWN will randomize the route, with a defined time interval of 200 seconds with 40% time variation (randomization) and --- -- with a limit set of maximum 12 Units alive simulteneously and 150 Groups to be SPAWNed during the whole mission. +-- -- with a limit set of maximum 12 Units alive simulteneously and 150 Groups to be spawned during the whole mission. -- Spawn_US_Platoon = { 'US Tank Platoon 1', 'US Tank Platoon 2', 'US Tank Platoon 3', 'US Tank Platoon 4', 'US Tank Platoon 5', -- 'US Tank Platoon 6', 'US Tank Platoon 7', 'US Tank Platoon 8', 'US Tank Platoon 9', 'US Tank Platoon 10', -- 'US Tank Platoon 11', 'US Tank Platoon 12', 'US Tank Platoon 13' } -- Spawn_US_Platoon_Left = SPAWN:New( 'US Tank Platoon Left' ):Limit( 12, 150 ):Schedule( 200, 0.4 ):RandomizeTemplate( Spawn_US_Platoon ):RandomizeRoute( 3, 3, 2000 ) -- Spawn_US_Platoon_Middle = SPAWN:New( 'US Tank Platoon Middle' ):Limit( 12, 150 ):Schedule( 200, 0.4 ):RandomizeTemplate( Spawn_US_Platoon ):RandomizeRoute( 3, 3, 2000 ) -- Spawn_US_Platoon_Right = SPAWN:New( 'US Tank Platoon Right' ):Limit( 12, 150 ):Schedule( 200, 0.4 ):RandomizeTemplate( Spawn_US_Platoon ):RandomizeRoute( 3, 3, 2000 ) - function SPAWN:RandomizeTemplate( SpawnTemplatePrefixTable ) self:T( { self.SpawnTemplatePrefix, SpawnTemplatePrefixTable } ) @@ -214,15 +265,17 @@ end ---- When a Group got SPAWNed, it has a life within the DCSRTE. For planes and helicopters, when these Units go home and land on their home airbases and farps, they normally would taxi to the parking spot, shut-down their engines and wait forever until the Group is removed by the DCSRTE. --- This function is used to Re-Spawn automatically (so no extra call is needed anymore) the same Group after it landed. This will enable a SPAWNed group to be Re-SPAWNed after it lands, until it is destroyed... --- Note: When the Group is respawned, it will @{ReSpawn} at the original airbase where it took off. So ensure that the paths for Groups that ReSpawn, always return to the original airbase. --- @treturn SPAWN +--- For planes and helicopters, when these groups go home and land on their home airbases and farps, they normally would taxi to the parking spot, shut-down their engines and wait forever until the Group is removed by the runtime environment. +-- This function is used to re-spawn automatically (so no extra call is needed anymore) the same group after it has landed. +-- This will enable a spawned group to be re-spawned after it lands, until it is destroyed... +-- Note: When the group is respawned, it will re-spawn from the original airbase where it took off. +-- So ensure that the routes for groups that respawn, always return to the original airbase, or players may get confused ... +-- @param self +-- @return #SPAWN self -- @usage -- -- RU Su-34 - AI Ship Attack -- -- Re-SPAWN the Group(s) after each landing and Engine Shut-Down automatically. -- SpawnRU_SU34 = SPAWN:New( 'TF1 RU Su-34 Krymsk@AI - Attack Ships' ):Schedule( 2, 3, 1800, 0.4 ):SpawnUncontrolled():RandomizeRoute( 1, 1, 3000 ):RepeatOnEngineShutDown() - function SPAWN:Repeat() self:T( { self.SpawnTemplatePrefix } ) @@ -239,7 +292,7 @@ function SPAWN:Repeat() end --- Same as the @{Repeat) method. --- @treturn SPAWN +-- @return SPAWN -- @see Repeat function SPAWN:RepeatOnLanding() @@ -252,10 +305,8 @@ function SPAWN:RepeatOnLanding() return self end ---- Same as the @{Repeat) method, but now the Group will respawn after its engines have shut down. --- @treturn SPAWN --- @see Repeat - +--- Same as the @{#SPAWN.Repeat) method, but now the Group will respawn after its engines have shut down. +-- @return SPAWN function SPAWN:RepeatOnEngineShutDown() self:T( { self.SpawnTemplatePrefix } ) @@ -266,30 +317,37 @@ function SPAWN:RepeatOnEngineShutDown() return self end + +--- CleanUp groups when they are still alive, but inactive. +-- When groups are still alive and have become inactive due to damage and are unable to contribute anything, then this group will be removed at defined intervals in seconds. +-- @param self +-- @param #string SpawnCleanUpInterval The interval to check for inactive groups within seconds. +-- @return #SPAWN self +-- @usage Spawn_Helicopter:CleanUp( 20 ) -- CleanUp the spawning of the helicopters every 20 seconds when they become inactive. function SPAWN:CleanUp( SpawnCleanUpInterval ) self:T( { self.SpawnTemplatePrefix, SpawnCleanUpInterval } ) self.SpawnCleanUpInterval = SpawnCleanUpInterval self.SpawnCleanUpTimeStamps = {} - self.CleanUpFunction = routines.scheduleFunction( self._SpawnCleanUpScheduler, { self }, timer.getTime() + 1, 60 ) + self.CleanUpFunction = routines.scheduleFunction( self._SpawnCleanUpScheduler, { self }, timer.getTime() + 1, SpawnCleanUpInterval ) return self end ---- Makes the Groups visible before start (like a batallion). --- @tparam number SpawnZone A @{ZONE} where the group will be positioned. The X and Y coordinates of the zone define the start position. --- @tparam number SpawnAngle The angle in degrees how the Groups and each Unit of the Group will be positioned. --- @tparam number SpawnFormation The formation of the Units within the Group. --- @tparam number SpawnWidth The amount of Groups that will be positioned on the X axis. --- @tparam number SpawnDeltaX The space between each Group on the X-axis. --- @tparam number SpawnDeltaY The space between each Group on the Y-axis. --- @treturn SPAWN +--- Makes the groups visible before start (like a batallion). +-- The method will take the position of the group as the first position in the array. +-- @param self +-- @param #number SpawnAngle The angle in degrees how the groups and each unit of the group will be positioned. +-- @param #number SpawnFormation The formation of the Units within the Group. +-- @param #number SpawnWidth The amount of Groups that will be positioned on the X axis. +-- @param #number SpawnDeltaX The space between each Group on the X-axis. +-- @param #number SpawnDeltaY The space between each Group on the Y-axis. +-- @return #SPAWN self -- @usage --- -- Define an array of Groups within Zone "Start". --- Spawn_BE_Ground = SPAWN:New( 'BE Ground' ):Limit( 2, 24 ):Visible( ZONE:New( "Start" ), 90, "Diamond", 10, 100, 50 ) - +-- -- Define an array of Groups. +-- Spawn_BE_Ground = SPAWN:New( 'BE Ground' ):Limit( 2, 24 ):Visible( 90, "Diamond", 10, 100, 50 ) function SPAWN:SpawnArray( SpawnAngle, SpawnWidth, SpawnDeltaX, SpawnDeltaY ) self:T( { self.SpawnTemplatePrefix, SpawnAngle, SpawnWidth, SpawnDeltaX, SpawnDeltaY } ) @@ -375,12 +433,14 @@ function SPAWN:_TranslateRotate( SpawnIndex, SpawnRootX, SpawnRootY, SpawnX, Spa return self end + +--- Get the next index of the groups to be spawned. This function is complicated, as it is used at several spaces. function SPAWN:GetSpawnIndex( SpawnIndex ) - self:T( { self.SpawnTemplatePrefix, SpawnIndex, self.SpawnMaxGroups, self.SpawnMaxGroupsAlive, self.AliveUnits, #self.SpawnTemplate.units } ) + self:T( { self.SpawnTemplatePrefix, SpawnIndex, self.SpawnMaxGroups, self.SpawnMaxUnitsAlive, self.AliveUnits, #self.SpawnTemplate.units } ) if ( self.SpawnMaxGroups == 0 ) or ( SpawnIndex <= self.SpawnMaxGroups ) then - if ( self.SpawnMaxGroupsAlive == 0 ) or ( self.AliveUnits < self.SpawnMaxGroupsAlive * #self.SpawnTemplate.units ) or self.UnControlled then + if ( self.SpawnMaxUnitsAlive == 0 ) or ( self.AliveUnits < self.SpawnMaxUnitsAlive * #self.SpawnTemplate.units ) or self.UnControlled then if SpawnIndex and SpawnIndex >= self.SpawnCount + 1 then self.SpawnCount = self.SpawnCount + 1 SpawnIndex = self.SpawnCount @@ -400,21 +460,21 @@ function SPAWN:GetSpawnIndex( SpawnIndex ) end ---- Will SPAWN a Group whenever you want to do this. --- Note that the configuration with the above functions will apply when calling this method: Maxima, Randomization of routes, Scheduler, ... --- Uses @{DATABASE} global object defined in MOOSE. --- @treturn SPAWN +--- Will re-spawn a group based on a given index. +-- Note: Uses @{DATABASE} module defined in MOOSE. +-- @param self +-- @return #GROUP The group that was spawned. You can use this group for further actions. function SPAWN:Spawn() self:T( { self.SpawnTemplatePrefix, self.SpawnIndex } ) return self:SpawnWithIndex( self.SpawnIndex + 1 ) end ---- Will Re-SPAWN a Group based on a given GroupName. The GroupName must be a group that is already alive within the DCSRTE and should have a Group Template defined in the ME (with Late Activation flag on). --- Note that the configuration with the above functions will apply when calling this method: Maxima, Randomization of routes, Scheduler, ... --- @tparam string SpawnGroupName --- @treturn SPAWN --- Uses _Database global object defined in MOOSE. +--- Will re-spawn a group based on a given index. +-- Note: Uses @{DATABASE} module defined in MOOSE. +-- @param self +-- @param #string SpawnIndex The index of the group to be spawned. +-- @return #GROUP The group that was spawned. You can use this group for further actions. function SPAWN:ReSpawn( SpawnIndex ) self:T( { self.SpawnTemplatePrefix, SpawnIndex } ) @@ -430,10 +490,9 @@ function SPAWN:ReSpawn( SpawnIndex ) return self:SpawnWithIndex( SpawnIndex ) end ---- Will SPAWN a Group with a specified index number whenever you want to do this. --- Note that the configuration with the above functions will apply when calling this method: Maxima, Randomization of routes, Scheduler, ... +--- Will spawn a group with a specified index number. -- Uses @{DATABASE} global object defined in MOOSE. --- @treturn GROUP The @{GROUP} that was spawned. You can use this group for further actions. +-- @return #GROUP The group that was spawned. You can use this group for further actions. function SPAWN:SpawnWithIndex( SpawnIndex ) self:T( { self.SpawnTemplatePrefix, SpawnIndex, self.SpawnMaxGroups } ) @@ -458,10 +517,13 @@ function SPAWN:SpawnWithIndex( SpawnIndex ) return nil end ---- SPAWNs a new Group within varying time intervals. This is useful if you want to have continuity within your missions of certain (AI) Groups to be present (alive) within your missions. --- @tparam number SpawnTime is the time interval defined in seconds between each new SPAWN of new Groups. --- @tparam number SpawnTimeVariation is the variation to be applied on the defined time interval between each new SPAWN. The variation is defined as a value between 0 and 1, which expresses the %-tage of variation to be applied as the low and high time interval boundaries. Between these boundaries a new time interval will be applied. See usage. --- @treturn SPAWN +--- Spawns new groups at varying time intervals. +-- This is useful if you want to have continuity within your missions of certain (AI) groups to be present (alive) within your missions. +-- @param self +-- @param #number SpawnTime The time interval defined in seconds between each new spawn of new groups. +-- @param #number SpawnTimeVariation The variation to be applied on the defined time interval between each new spawn. +-- The variation is a number between 0 and 1, representing the %-tage of variation to be applied on the time interval. +-- @return #SPAWN self -- @usage -- -- NATO helicopters engaging in the battle field. -- -- The time interval is set to SPAWN new helicopters between each 600 seconds, with a time variation of 50%. @@ -469,9 +531,8 @@ end -- -- This is calculated as follows: -- -- Low limit: 600 * ( 1 - 0.5 / 2 ) = 450 -- -- High limit: 600 * ( 1 + 0.5 / 2 ) = 750 --- -- Between these two values, a random amount of seconds will be choosen for each new SPAWN of the helicopters. +-- -- Between these two values, a random amount of seconds will be choosen for each new spawn of the helicopters. -- Spawn_BE_KA50 = SPAWN:New( 'BE KA-50@RAMP-Ground Defense' ):Schedule( 600, 0.5 ) - function SPAWN:SpawnScheduled( SpawnTime, SpawnTimeVariation ) self:T( { SpawnTime, SpawnTimeVariation } ) @@ -492,8 +553,10 @@ function SPAWN:SpawnScheduled( SpawnTime, SpawnTimeVariation ) return self end ---- Will start the SPAWNing timers. --- This function is called automatically when @{Schedule} is called. + + +--- Will start the spawning scheduler. +-- Note: This function is called automatically when @{#SPAWN.Scheduled} is called. function SPAWN:ScheduleStart() self:T( { self.SpawnTemplatePrefix } ) @@ -510,30 +573,18 @@ function SPAWN:ScheduleStart() end end ---- Will stop the scheduled SPAWNing activity. +--- Will stop the scheduled spawning scheduler. function SPAWN:ScheduleStop() self:T( { self.SpawnTemplatePrefix } ) self.SpawnIsScheduled = false end ---- Limits the Maximum amount of Units to be alive, and the maximum amount of Groups to be SPAWNed within the DCS World run-time environment. --- Note that this method is exceptionally important to balance the amount of Units alive within the DCSRTE and the performance of the mission. Depending on the machine etc, a mission can only process a maximum amount of units. --- If the time interval must be short, but there should not be more Units or Groups alive than a maximum amount of units, then this function should be used... --- @tparam number SpawnMaxGroupsAlive is the Maximum amount of Units to be alive. When there are more Units alive in the DCSRTE of SpawnTemplatePrefix, then no new SPAWN will happen of the Group, until some of these Units will be destroyed. --- @tparam number SpawnMaxGroups is the Maximum amount of Groups that can be SPAWNed from SpawnTemplatePrefix. When there are more Groups alive in the DCSRTE of SpawnTemplatePrefix, then no more SPAWNs will happen of the Group. This parameter is useful to define a maximum amount of airplanes, ground troops, helicopters, ships etc within a supply area. --- This parameter accepts the value 0, which expresses no Group count limits. --- @treturn SPAWN --- @usage --- -- NATO helicopters engaging in the battle field. --- -- This helicopter group consists of one Unit. So, this group will SPAWN maximum 2 groups simultaneously within the DCSRTE. --- -- There will be maximum 24 groups SPAWNed during the whole mission lifetime. --- Spawn_BE_KA50 = SPAWN:New( 'BE KA-50@RAMP-Ground Defense' ):Limit( 2, 24 ) - ---- Will SPAWN a Group whenever you want to do this, but for AIR Groups only to be applied, and will SPAWN the Group in Uncontrolled mode... This will be similar to the Uncontrolled flag setting in the ME. --- @treturn SPAWN +--- Will spawn a plane group in uncontrolled mode... +-- This will be similar to the uncontrolled flag setting in the ME. +-- @return #SPAWN self function SPAWN:UnControlled() self:T( { self.SpawnTemplatePrefix } ) @@ -547,14 +598,18 @@ function SPAWN:UnControlled() end ---- Will SPAWN a Group from a Hosting @{UNIT}. This function is mostly advisable to be used if you want to simulate SPAWNing from air units, like helicopters, which are dropping infantry into a defined Landing Zone. --- Note that each point in the route assigned to the spawning @{GROUP} is reset to the Point of the spawn. --- You can use the returned @{GROUP} to further define the route to be followed. --- @tparam UNIT HostUnit is the AIR unit or GROUND unit dropping or unloading the Spawn group. --- @treturn GROUP Spawned. --- @treturn nil when nothing was spawned. +--- Will spawn a group from a hosting unit. This function is mostly advisable to be used if you want to simulate spawning from air units, like helicopters, which are dropping infantry into a defined Landing Zone. +-- Note that each point in the route assigned to the spawning group is reset to the point of the spawn. +-- You can use the returned group to further define the route to be followed. +-- @param self +-- @param #UNIT HostUnit The air or ground unit dropping or unloading the group. +-- @param #number OuterRadius The outer radius in meters where the new group will be spawned. +-- @param #number InnerRadius The inner radius in meters where the new group will NOT be spawned. +-- @param #number SpawnIndex (Optional) The index which group to spawn within the given zone. +-- @return #GROUP that was spawned. +-- @return #nil Nothing was spawned. function SPAWN:SpawnFromUnit( HostUnit, OuterRadius, InnerRadius, SpawnIndex ) - self:T( { self.SpawnTemplatePrefix, HostUnit, SpawnFormation, SpawnIndex } ) + self:T( { self.SpawnTemplatePrefix, HostUnit, OuterRadius, InnerRadius, SpawnIndex } ) if HostUnit and HostUnit:IsAlive() then -- and HostUnit:getUnit(1):inAir() == false then @@ -623,9 +678,11 @@ function SPAWN:SpawnFromUnit( HostUnit, OuterRadius, InnerRadius, SpawnIndex ) end --- Will spawn a Group within a given @{ZONE}. --- @tparam ZONE The @{ZONE} where the Group is to be SPAWNed. --- @treturn GROUP that was spawned. --- @treturn nil when nothing as spawned. +-- @param self +-- @param #ZONE Zone The zone where the group is to be spawned. +-- @param #number SpawnIndex (Optional) The index which group to spawn within the given zone. +-- @return #GROUP that was spawned. +-- @return #nil when nothing was spawned. function SPAWN:SpawnInZone( Zone, SpawnIndex ) self:T( { self.SpawnTemplatePrefix, Zone, SpawnIndex } ) @@ -677,8 +734,9 @@ end --- Will return the SpawnGroupName either with with a specific count number or without any count. --- @tparam number SpawnIndex is the number of the Group that is to be SPAWNed. --- @treturn string SpawnGroupName +-- @param self +-- @param #number SpawnIndex Is the number of the Group that is to be spawned. +-- @return string SpawnGroupName function SPAWN:SpawnGroupName( SpawnIndex ) self:T( { self.SpawnTemplatePrefix, SpawnIndex } ) @@ -698,6 +756,13 @@ function SPAWN:SpawnGroupName( SpawnIndex ) end + +--- Get the group from an index. +-- Returns the group from the SpawnGroups list. +-- If no index is given, it will return the first group in the list. +-- @param self +-- @param #number SpawnIndex The index of the group to return. +-- @return #GROUP function SPAWN:GetGroupFromIndex( SpawnIndex ) self:T( { self.SpawnTemplatePrefix, self.SpawnAliasPrefix, SpawnIndex } ) @@ -710,6 +775,13 @@ function SPAWN:GetGroupFromIndex( SpawnIndex ) end end +--- Get the group index from a DCSUnit. +-- The method will search for a #-mark, and will return the index behind the #-mark of the DCSUnit. +-- It will return nil of no prefix was found. +-- @param self +-- @param DCSUnit The DCS unit to be searched. +-- @return #string The prefix +-- @return #nil Nothing found function SPAWN:GetGroupIndexFromDCSUnit( DCSUnit ) self:T( { self.SpawnTemplatePrefix, self.SpawnAliasPrefix, DCSUnit } ) @@ -727,6 +799,13 @@ function SPAWN:GetGroupIndexFromDCSUnit( DCSUnit ) return nil end +--- Return the prefix of a DCSUnit. +-- The method will search for a #-mark, and will return the text before the #-mark. +-- It will return nil of no prefix was found. +-- @param self +-- @param DCSUnit The DCS unit to be searched. +-- @return #string The prefix +-- @return #nil Nothing found function SPAWN:GetPrefixFromDCSUnit( DCSUnit ) self:T( { self.SpawnTemplatePrefix, self.SpawnAliasPrefix, DCSUnit } ) @@ -734,8 +813,6 @@ function SPAWN:GetPrefixFromDCSUnit( DCSUnit ) local SpawnPrefix = string.match( DCSUnit:getName(), ".*#" ) if SpawnPrefix then SpawnPrefix = SpawnPrefix:sub( 1, -2 ) - else - self:E( { "This name does not contain a #", DCSUnit:getName() } ) end self:T( SpawnPrefix ) return SpawnPrefix @@ -744,6 +821,7 @@ function SPAWN:GetPrefixFromDCSUnit( DCSUnit ) return nil end +--- Return the group within the SpawnGroups collection with input a DCSUnit. function SPAWN:GetGroupFromDCSUnit( DCSUnit ) self:T( { self.SpawnTemplatePrefix, self.SpawnAliasPrefix, DCSUnit } ) @@ -762,7 +840,8 @@ function SPAWN:GetGroupFromDCSUnit( DCSUnit ) end ---TODO: Rename to GetGroupIndexFromGroup +--- Get the index from a given group. +-- The function will search the name of the group for a #, and will return the number behind the #-mark. function SPAWN:GetGroupIndexFromGroup( SpawnGroup ) self:T( { self.SpawnTemplatePrefix, self.SpawnAliasPrefix, SpawnGroup } ) @@ -774,13 +853,14 @@ function SPAWN:GetGroupIndexFromGroup( SpawnGroup ) end +--- Return the last maximum index that can be used. function SPAWN:GetLastIndex() self:T( { self.SpawnTemplatePrefix, self.SpawnAliasPrefix } ) return self.SpawnMaxGroups end - +--- Initalize the SpawnGroups collection. function SPAWN:InitializeSpawnGroups( SpawnIndex ) self:T( { self.SpawnTemplatePrefix, self.SpawnAliasPrefix, SpawnIndex } ) @@ -804,7 +884,11 @@ function SPAWN:InitializeSpawnGroups( SpawnIndex ) end - +--- Find the first alive group. +-- @param self +-- @param #number SpawnCursor A number holding the index from where to find the first group from. +-- @return #GROUP, #number The group found, the new index where the group was found. +-- @return #nil, #nil When no group is found, #nil is returned. function SPAWN:GetFirstAliveGroup( SpawnCursor ) self:T( { self.SpawnTemplatePrefix, self.SpawnAliasPrefix, SpawnCursor } ) @@ -819,6 +903,12 @@ function SPAWN:GetFirstAliveGroup( SpawnCursor ) return nil, nil end + +--- Find the next alive group. +-- @param self +-- @param #number SpawnCursor A number holding the last found previous index. +-- @return #GROUP, #number The group found, the new index where the group was found. +-- @return #nil, #nil When no group is found, #nil is returned. function SPAWN:GetNextAliveGroup( SpawnCursor ) self:T( { self.SpawnTemplatePrefix, self.SpawnAliasPrefix, SpawnCursor } ) @@ -834,6 +924,7 @@ function SPAWN:GetNextAliveGroup( SpawnCursor ) return nil, nil end +--- Find the last alive group during runtime. function SPAWN:GetLastAliveGroup() self:T( { self.SpawnTemplatePrefixself.SpawnAliasPrefix } ) @@ -851,10 +942,6 @@ function SPAWN:GetLastAliveGroup() end - ---- Private --- @section - --- Gets the CategoryID of the Group with the given SpawnPrefix function SPAWN:_GetGroupCategoryID( SpawnPrefix ) local TemplateGroup = Group.getByName( SpawnPrefix ) @@ -892,7 +979,7 @@ function SPAWN:_GetGroupCountryID( SpawnPrefix ) end --- Gets the Group Template from the ME environment definition. --- This method used the @{DATABASE} object, which contains ALL initial and new SPAWNed object in MOOSE. +-- This method used the @{DATABASE} object, which contains ALL initial and new spawned object in MOOSE. function SPAWN:_GetTemplate( SpawnTemplatePrefix ) self:T( { self.SpawnTemplatePrefix, self.SpawnAliasPrefix, SpawnTemplatePrefix } ) @@ -942,11 +1029,9 @@ function SPAWN:_Prepare( SpawnTemplatePrefix, SpawnIndex ) end ---- Events --- @section Events ---- Obscolete --- @todo Need to delete this... _Database does this now ... + +-- TODO Need to delete this... _Database does this now ... function SPAWN:OnBirth( event ) if timer.getTime0() < timer.getAbsTime() then -- dont need to add units spawned in at the start of the mission if mist is loaded in init line @@ -982,7 +1067,7 @@ function SPAWN:OnDeadOrCrash( event ) end end ---- Will detect AIR Units taking off... When the event takes place, the SPAWNed Group is registered as airborne... +--- Will detect AIR Units taking off... When the event takes place, the spawned Group is registered as airborne... -- This is needed to ensure that Re-SPAWNing only is done for landed AIR Groups. -- @todo Need to test for AIR Groups only... function SPAWN:OnTakeOff( event ) @@ -997,7 +1082,7 @@ function SPAWN:OnTakeOff( event ) end end ---- Will detect AIR Units landing... When the event takes place, the SPAWNed Group is registered as landed. +--- Will detect AIR Units landing... When the event takes place, the spawned Group is registered as landed. -- This is needed to ensure that Re-SPAWNing is only done for landed AIR Groups. -- @todo Need to test for AIR Groups only... function SPAWN:OnLand( event ) @@ -1018,7 +1103,7 @@ function SPAWN:OnLand( event ) end --- Will detect AIR Units shutting down their engines ... --- When the event takes place, and the method @{RepeatOnEngineShutDown} was called, the SPAWNed Group will Re-SPAWN. +-- When the event takes place, and the method @{RepeatOnEngineShutDown} was called, the spawned Group will Re-SPAWN. -- But only when the Unit was registered to have landed. -- @see OnTakeOff -- @see OnLand @@ -1038,13 +1123,10 @@ function SPAWN:OnEngineShutDown( event ) end end ---- Scheduled --- @section Scheduled - --- This function is called automatically by the Spawning scheduler. -- It is the internal worker method SPAWNing new Groups on the defined time intervals. function SPAWN:_Scheduler() -self:T( { "_Scheduler", self.SpawnTemplatePrefix, self.SpawnAliasPrefix, self.SpawnIndex, self.SpawnMaxGroups, self.SpawnMaxGroupsAlive } ) +self:T( { "_Scheduler", self.SpawnTemplatePrefix, self.SpawnAliasPrefix, self.SpawnIndex, self.SpawnMaxGroups, self.SpawnMaxUnitsAlive } ) if self.SpawnInit or self.SpawnCurrentTimer == self.SpawnSetTimer then -- Validate if there are still groups left in the batch... @@ -1091,5 +1173,3 @@ function SPAWN:_SpawnCleanUpScheduler() end end - - diff --git a/Test Missions/MOOSE_Spawn_Test.lua b/Test Missions/MOOSE_Spawn_Test.lua index 6084847de..34dc8bfb3 100644 --- a/Test Missions/MOOSE_Spawn_Test.lua +++ b/Test Missions/MOOSE_Spawn_Test.lua @@ -9,14 +9,19 @@ Group_Plane = Spawn_Plane:Spawn() Spawn_Helicopter = SPAWN:New( "Spawn Helicopter" ):RandomizeRoute( 1, 1, 1000 ) Group_Helicopter = Spawn_Helicopter:Spawn() +Group_Helicopter2 = Spawn_Helicopter:Spawn() Spawn_Ship = SPAWN:New( "Spawn Ship" ):RandomizeRoute( 0, 0, 2000 ) Group_Ship1 = Spawn_Ship:Spawn() Group_Ship2 = Spawn_Ship:Spawn() -Spawn_Vehicle = SPAWN:New( "Spawn Vehicle" ) +Spawn_Vehicle = SPAWN:New( "Spawn Vehicle" ):RandomizeRoute( 1, 0, 50 ) Group_Vehicle1 = Spawn_Vehicle:Spawn() Group_Vehicle2 = Spawn_Vehicle:Spawn() +Group_Vehicle3 = Spawn_Vehicle:Spawn() +Group_Vehicle4 = Spawn_Vehicle:Spawn() +Group_Vehicle5 = Spawn_Vehicle:Spawn() +Group_Vehicle6 = Spawn_Vehicle:Spawn() Group_Vehicle1:RouteToZone( ZONE:New( "Landing Zone" ), true, 40, "Cone" ) diff --git a/Test Missions/MOOSE_Spawn_Test.miz b/Test Missions/MOOSE_Spawn_Test.miz index 7350449fbdde59193bca9068a33eb4384a9ce150..b4e4a3614cd3b21b7eec59068fce71ba53f14df2 100644 GIT binary patch delta 33333 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 Zb}A@{f30HyTP}-dtjC8ss{H$({|6cGlv4lz diff --git a/doc/classes/BASE.html b/doc/classes/BASE.html index e38ccc9b4..d041d5139 100644 --- a/doc/classes/BASE.html +++ b/doc/classes/BASE.html @@ -3,7 +3,7 @@ - MOOSE + Reference @@ -24,7 +24,7 @@ @@ -83,9 +80,7 @@

Class BASE

BASE The base class for all the classes defined within MOOSE.

-

- -

+

Info:

-
- - CARGO.CARGO_TYPE + + self.CargoGroupName
- CARGO_TYPE Defines the different types of transports, which has an impact on the menu commands shown in F10. + ReSpawn the Cargo in the CargoZone without a host ... -

Fields:

+ + + + + +
+ +

Methods

+ +
+
+ + CARGO:New (CargoType, CargoName, CargoWeight) +
+
+ Add Cargo to the mission... Cargo functionality needs to be reworked a bit, so this is still under construction. I need to make a CARGO Class... + + +

Parameters:

    -
  • TROOPS - - +
  • CargoType
  • -
  • GOODS - - +
  • CargoName
  • -
  • VEHICLES - - - -
  • -
  • INFANTRY - - - -
  • -
  • ENGINEERS - - - -
  • -
  • PACKAGE - - - -
  • -
  • CARGO - - +
  • CargoWeight
@@ -204,7 +202,7 @@
generated by LDoc 1.4.3 -Last updated 2015-01-29 21:06:10 +Last updated 2016-03-14 10:50:59
diff --git a/doc/classes/CLEANUP.html b/doc/classes/CLEANUP.html index 94922ab04..938c43447 100644 --- a/doc/classes/CLEANUP.html +++ b/doc/classes/CLEANUP.html @@ -3,7 +3,7 @@ - MOOSE + Reference @@ -24,7 +24,7 @@ @@ -83,9 +80,7 @@

Class CLEANUP

CLEANUP Classes

-

- -

+

Info:

- - CLEANUP:_EventAddForCleanUp (event) + + CLEANUP:_DestroyGroup (GroupObject, CleanUpGroupName)
- Detects if the Unit has an SEVENTENGINESHUTDOWN or an SEVENT_HIT within the given ZoneNames. If this is the case, add the Group to the CLEANUP List. + Destroys a group from the simulator, but checks first if it is still existing! + + +

Parameters:

+
    +
  • GroupObject + +
  • +
  • CleanUpGroupName + +
  • +
+ + + +

See also:

+ + + +
+
+ + CLEANUP:_DestroyUnit (CleanUpUnit, CleanUpUnitName) +
+
+ Destroys a unit from the simulator, but checks first if it is still existing! + + +

Parameters:

+
    +
  • CleanUpUnit + +
  • +
  • CleanUpUnitName + +
  • +
+ + + +

See also:

+ + + +
+
+ + CLEANUP:_DestroyMissile (MissileObject) +
+
+ Destroys a missile from the simulator, but checks first if it is still existing! + + +

Parameters:

+
    +
  • MissileObject + +
  • +
+ + + +

See also:

+ + + +
+
+ + CLEANUP:_EventCrash (event) +
+
+ Detects if an SA site was shot with an anti radiation missile. In this case, take evasive actions based on the skill level set within the ME.

Parameters:

  • event +
  • +
+ +

See also:

+ + + +
+
+ + CLEANUP:_EventShot (event) +
+
+ Detects if an SA site was shot with an anti radiation missile. In this case, take evasive actions based on the skill level set within the ME. + + +

Parameters:

+
    +
  • event + +
  • +
+ + + +

See also:

+ + + +
+
+ + CLEANUP:_EventHitCleanUp (event) +
+
+ Detects if the Unit has an S_EVENT_HIT within the given ZoneNames. If this is the case, destroy the unit. + + +

Parameters:

+
    +
  • event + +
  • +
+ + + + + +
+
+ + CLEANUP:_EventAddForCleanUp (event) +
+
+ Detects if the Unit has an S_EVENT_ENGINE_SHUTDOWN or an S_EVENT_HIT within the given ZoneNames. If this is the case, add the Group to the CLEANUP List. + + +

Parameters:

+
    +
  • event +
@@ -200,7 +361,7 @@
generated by LDoc 1.4.3 -Last updated 2015-01-29 21:06:10 +Last updated 2016-03-14 10:50:59
diff --git a/doc/classes/CLIENT.html b/doc/classes/CLIENT.html index 8f8f54988..ecea76d35 100644 --- a/doc/classes/CLIENT.html +++ b/doc/classes/CLIENT.html @@ -3,7 +3,7 @@ - MOOSE + Reference @@ -24,7 +24,7 @@ @@ -84,9 +81,7 @@

Class CLIENT

CLIENT Classes

-

- -

+

Tables

@@ -111,6 +106,18 @@ ClientGroup returns the Group of a Client. + CLIENT:GetClientGroupUnit () + Returns the Unit of the CLIENT. + + + CLIENT:GetClientGroupDCSUnit () + Returns the DCSUnit of the CLIENT. + + + CLIENT:ClientPosition () + Returns the Position of the CLIENT. + + CLIENT:Transport () Transport defines that the Client is a Transport. @@ -123,22 +130,10 @@ IsTransport returns if a Client is a transport. - CLIENT:FindCargo (CargoName) - FindCargo finds loaded Cargo within a CLIENT instance. - - CLIENT:ShowCargo () ShowCargo shows the CARGO within the CLIENT to the Player. - CLIENT:AddCargo (CargoName, CargoGroupName, CargoType, CargoWeight, CargoGroupTemplate) - AddCargo allows to add CARGO on the CLIENT. - - - CLIENT:RemoveCargo (CargoName) - RemoveCargo removes CARGO from the CLIENT. - - CLIENT:SwitchMessages (PrmTable) SwitchMessages is a local function called by the DCS World Menu system to switch off messages. @@ -168,28 +163,18 @@
  • ONBOARDSIDE - -
  • LEFT - -
  • RIGHT - -
  • BACK - -
  • FRONT - -
@@ -227,8 +212,6 @@ CLIENT - - @@ -274,6 +257,7 @@
ClientGroup returns the Group of a Client. + This function is modified to deal with a couple of bugs in DCS 1.5.3 @@ -282,8 +266,66 @@ Group + + + +
+
+ + CLIENT:GetClientGroupUnit () +
+
+ Returns the Unit of the CLIENT. + + + +

Returns:

+
    + + Unit + +
+ + + + +
+
+ + CLIENT:GetClientGroupDCSUnit () +
+
+ Returns the DCSUnit of the CLIENT. + + + +

Returns:

+
    + + DCSUnit + +
+ + + + +
+
+ + CLIENT:ClientPosition () +
+
+ Returns the Position of the CLIENT. + + + +

Returns:

+
    + + Position +
@@ -304,8 +346,6 @@ CLIENT - - @@ -333,8 +373,6 @@ CLIENT - - @@ -355,38 +393,6 @@ bool - - - - - - - -
-
- - CLIENT:FindCargo (CargoName) -
-
- FindCargo finds loaded Cargo within a CLIENT instance. - Cargo is loaded when certain PICK-UP or DEPLOY Tasks are properly executed. - - -

Parameters:

-
    -
  • CargoName - string - is the name of the cargo. -
  • -
- -

Returns:

-
    - - CARGO_TYPE - - -
@@ -407,80 +413,6 @@ -
-
- - CLIENT:AddCargo (CargoName, CargoGroupName, CargoType, CargoWeight, CargoGroupTemplate) -
-
- AddCargo allows to add CARGO on the CLIENT. - - -

Parameters:

-
    -
  • CargoName - string - is the name of the CARGO. -
  • -
  • CargoGroupName - string - is the name of an active Group defined within the Mission Editor or Dynamically Spawned. Note that this is only applicable for Unit CARGO Types. -
  • -
  • CargoType - CARGO_TYPE - is the Type of the CARGO. -
  • -
  • CargoWeight - number - is the weight of the cargo in Kg. -
  • -
  • CargoGroupTemplate - string - is the name of an active Group defined within the Mission Editor with "Late Activation". -
  • -
- -

Returns:

-
    - - CLIENT - - - -
- - - - -
-
- - CLIENT:RemoveCargo (CargoName) -
-
- RemoveCargo removes CARGO from the CLIENT. - - -

Parameters:

- - -

Returns:

-
    - - Cargo - - - -
- - - -
@@ -494,8 +426,6 @@
  • PrmTable - -
@@ -549,7 +479,7 @@
generated by LDoc 1.4.3 -Last updated 2015-01-29 21:06:10 +Last updated 2016-03-14 10:50:59
diff --git a/doc/classes/DATABASE.html b/doc/classes/DATABASE.html index b1e6000da..e4e6360d7 100644 --- a/doc/classes/DATABASE.html +++ b/doc/classes/DATABASE.html @@ -3,7 +3,7 @@ - MOOSE + Reference @@ -24,7 +24,7 @@ @@ -86,7 +83,8 @@

Class DATABASE

Administers the Initial Sets of the Mission Templates as defined within the Mission Editor.

-

Administers the Spawning of new Groups within the DCSRTE and administers these new Groups within the DATABASE object(s).

+

+ Administers the Spawning of new Groups within the DCSRTE and administers these new Groups within the DATABASE object(s).

Methods

@@ -163,8 +161,6 @@ DATABASE - - @@ -192,8 +188,6 @@
  • SpawnTemplate - -
@@ -214,13 +208,9 @@
  • GroupName - -
  • Status - -
@@ -241,8 +231,6 @@
  • GroupName - -
@@ -268,8 +256,6 @@
  • GroupTemplate - -
@@ -290,8 +276,6 @@
  • UnitData - -
@@ -312,18 +296,12 @@
  • PlayerUnit - -
  • MissionName - -
  • Score - -
@@ -344,13 +322,9 @@
  • MissionName - -
  • Score - -
@@ -375,9 +349,8 @@

Parameters:

  • event - - - + self + T( { event } )
@@ -412,7 +385,7 @@
generated by LDoc 1.4.3 -Last updated 2015-01-29 21:06:10 +Last updated 2016-03-14 10:50:59
diff --git a/doc/classes/DEPLOYTASK.html b/doc/classes/DEPLOYTASK.html index 2fef954a7..7618839f5 100644 --- a/doc/classes/DEPLOYTASK.html +++ b/doc/classes/DEPLOYTASK.html @@ -3,7 +3,7 @@ - MOOSE + Reference @@ -24,7 +24,7 @@ @@ -83,9 +80,7 @@

Class DEPLOYTASK

A DEPLOYTASK orchestrates the deployment of CARGO within a specific landing zone.

-

- -

+

Methods

@@ -160,7 +155,7 @@
generated by LDoc 1.4.3 -Last updated 2015-01-29 21:06:10 +Last updated 2016-03-14 10:50:59
diff --git a/doc/classes/DESTROYBASETASK.html b/doc/classes/DESTROYBASETASK.html index 11d3ef4cc..9dc7f9926 100644 --- a/doc/classes/DESTROYBASETASK.html +++ b/doc/classes/DESTROYBASETASK.html @@ -3,7 +3,7 @@ - MOOSE + Reference @@ -24,7 +24,7 @@ @@ -94,7 +91,7 @@ DESTROYBASETASK:EventDead (event) - Handle the SEVENTDEAD events to validate the destruction of units for the task monitoring. + Handle the S_EVENT_DEAD events to validate the destruction of units for the task monitoring. DESTROYBASETASK:ReportGoalProgress (DestroyGroup, DestroyUnit) @@ -142,8 +139,6 @@ DESTROYBASETASK - - @@ -155,16 +150,13 @@ DESTROYBASETASK:EventDead (event)
- Handle the SEVENTDEAD events to validate the destruction of units for the task monitoring. + Handle the S_EVENT_DEAD events to validate the destruction of units for the task monitoring.

Parameters:

  • event - -
        Event structure of DCS world.
    -
    - + Event structure of DCS world.
@@ -184,16 +176,10 @@

Parameters:

  • DestroyGroup - -
        Group structure describing the group to be evaluated.
    -
    - + Group structure describing the group to be evaluated.
  • DestroyUnit - -
        Unit structure describing the Unit to be evaluated.
    -
    - + Unit structure describing the Unit to be evaluated.
@@ -209,7 +195,7 @@
generated by LDoc 1.4.3 -Last updated 2015-01-29 21:06:10 +Last updated 2016-03-14 10:50:59
diff --git a/doc/classes/DESTROYGROUPSTASK.html b/doc/classes/DESTROYGROUPSTASK.html index add401e20..894a53bee 100644 --- a/doc/classes/DESTROYGROUPSTASK.html +++ b/doc/classes/DESTROYGROUPSTASK.html @@ -3,7 +3,7 @@ - MOOSE + Reference @@ -24,7 +24,7 @@ @@ -84,9 +81,7 @@

Class DESTROYGROUPSTASK

DESTROYGROUPSTASK

-

- -

+

Tables

@@ -127,13 +122,9 @@
  • ClassName - -
  • GoalVerb - -
@@ -158,24 +149,15 @@
  • DestroyGroupType string - -
    String describing the group to be destroyed.
    -
    - + String describing the group to be destroyed.
  • DestroyUnitType string - -
    String describing the unit to be destroyed.
    -
    - + String describing the unit to be destroyed.
  • DestroyGroupNames table{string,...} - -
    Table of string containing the name of the groups to be destroyed before task is completed.
    -
    - + Table of string containing the name of the groups to be destroyed before task is completed.
  • DestroyPercentage optional number @@ -188,8 +170,6 @@ DESTROYGROUPSTASK - - @@ -208,17 +188,11 @@
    • DestroyGroup Group - -
          Group structure describing the group to be evaluated.
      -
      - + Group structure describing the group to be evaluated.
    • DestroyUnit Unit - -
          Unit structure describing the Unit to be evaluated.
      -
      - + Unit structure describing the Unit to be evaluated.
    @@ -234,7 +208,7 @@
    generated by LDoc 1.4.3 -Last updated 2015-01-29 21:06:10 +Last updated 2016-03-14 10:50:59
    diff --git a/doc/classes/DESTROYRADARSTASK.html b/doc/classes/DESTROYRADARSTASK.html index 6000e1199..163499843 100644 --- a/doc/classes/DESTROYRADARSTASK.html +++ b/doc/classes/DESTROYRADARSTASK.html @@ -3,7 +3,7 @@ - MOOSE + Reference @@ -24,7 +24,7 @@ @@ -83,9 +80,7 @@

    Class DESTROYRADARSTASK

    Task class to destroy radar installations.

    -

    - -

    +

    Methods

    @@ -119,10 +114,7 @@
    • DestroyGroupNames table{string,...} - -
      Table of string containing the group names of which the radars are be destroyed.
      -
      - + Table of string containing the group names of which the radars are be destroyed.
    @@ -131,8 +123,6 @@ DESTROYRADARSTASK - - @@ -151,17 +141,11 @@
    • DestroyGroup Group - -
          Group structure describing the group to be evaluated.
      -
      - + Group structure describing the group to be evaluated.
    • DestroyUnit Unit - -
          Unit structure describing the Unit to be evaluated.
      -
      - + Unit structure describing the Unit to be evaluated.
    @@ -177,7 +161,7 @@
    generated by LDoc 1.4.3 -Last updated 2015-01-29 21:06:10 +Last updated 2016-03-14 10:50:59
    diff --git a/doc/classes/DESTROYUNITTYPESTASK.html b/doc/classes/DESTROYUNITTYPESTASK.html index 543f21e2d..4ca9cac41 100644 --- a/doc/classes/DESTROYUNITTYPESTASK.html +++ b/doc/classes/DESTROYUNITTYPESTASK.html @@ -3,7 +3,7 @@ - MOOSE + Reference @@ -24,7 +24,7 @@ @@ -83,9 +80,7 @@

    Class DESTROYUNITTYPESTASK

    Set TASK to destroy certain unit types.

    -

    - -

    +

    Methods

    @@ -119,31 +114,19 @@
    • DestroyGroupType string - -
          String describing the group to be destroyed. f.e. "Radar Installations", "Fleet", "Batallion", "Command Centers".
      -
      - + String describing the group to be destroyed. f.e. "Radar Installations", "Fleet", "Batallion", "Command Centers".
    • DestroyUnitType string - -
          String describing the unit to be destroyed. f.e. "radars", "ships", "tanks", "centers".
      -
      - + String describing the unit to be destroyed. f.e. "radars", "ships", "tanks", "centers".
    • DestroyGroupNames table{string,...} - -
      Table of string containing the group names of which the radars are be destroyed.
      -
      - + Table of string containing the group names of which the radars are be destroyed.
    • DestroyUnitTypes string - -
          Table of string containing the type names of the units to achieve mission success.
      -
      - + Table of string containing the type names of the units to achieve mission success.
    @@ -152,8 +135,6 @@ DESTROYUNITTYPESTASK - - @@ -172,17 +153,11 @@
    • DestroyGroup Group - -
          Group structure describing the group to be evaluated.
      -
      - + Group structure describing the group to be evaluated.
    • DestroyUnit Unit - -
          Unit structure describing the Unit to be evaluated.
      -
      - + Unit structure describing the Unit to be evaluated.
    @@ -198,7 +173,7 @@
    generated by LDoc 1.4.3 -Last updated 2015-01-29 21:06:10 +Last updated 2016-03-14 10:50:59
    diff --git a/doc/classes/GOHOMETASK.html b/doc/classes/GOHOMETASK.html index 29b6693b5..bd805800c 100644 --- a/doc/classes/GOHOMETASK.html +++ b/doc/classes/GOHOMETASK.html @@ -3,7 +3,7 @@ - MOOSE + Reference @@ -24,7 +24,7 @@ @@ -83,9 +80,7 @@

    Class GOHOMETASK

    A GOHOMETASK orchestrates the travel back to the home base, which is a specific zone defined within the ME.

    -

    - -

    +

    Methods

    @@ -124,8 +119,6 @@ GOHOMETASK - - @@ -139,7 +132,7 @@
    generated by LDoc 1.4.3 -Last updated 2015-01-29 21:06:10 +Last updated 2016-03-14 10:50:59
    diff --git a/doc/classes/GROUP.html b/doc/classes/GROUP.html new file mode 100644 index 000000000..bc1301bc5 --- /dev/null +++ b/doc/classes/GROUP.html @@ -0,0 +1,97 @@ + + + + + Reference + + + + +
    + +
    + +
    +
    +
    + + +
    + + + + + + +
    + +

    Class GROUP

    +

    GROUP Classes

    +

    + + + +
    +
    + + + + +
    +
    +
    +generated by LDoc 1.4.3 +Last updated 2016-03-14 10:50:59 +
    +
    + + diff --git a/doc/classes/MENU.html b/doc/classes/MENU.html index 5adda5de0..320e35234 100644 --- a/doc/classes/MENU.html +++ b/doc/classes/MENU.html @@ -3,7 +3,7 @@ - MOOSE + Reference @@ -24,7 +24,7 @@ @@ -79,9 +76,7 @@

    Class MENU

    Encapsulation of DCS World Menu system in a set of MENU classes.

    -

    - -

    +

    @@ -95,7 +90,7 @@
    generated by LDoc 1.4.3 -Last updated 2015-01-29 21:06:10 +Last updated 2016-03-14 10:50:59
    diff --git a/doc/classes/MESSAGE.html b/doc/classes/MESSAGE.html index bb2bdb87f..b700547a3 100644 --- a/doc/classes/MESSAGE.html +++ b/doc/classes/MESSAGE.html @@ -3,7 +3,7 @@ - MOOSE + Reference @@ -24,7 +24,7 @@ @@ -84,7 +81,8 @@

    Class MESSAGE

    Message System to display Messages for Clients and Coalitions or All.

    -

    Messages are grouped on the display panel per Category to improve readability for the players. +

    + Messages are grouped on the display panel per Category to improve readability for the players. Messages are shown on the display panel for an amount of seconds, and will then disappear. Messages are identified by an ID. The messages with the same ID belonging to the same category will be overwritten if they were still being displayed on the display panel. Messages are created with MESSAGE:New(). @@ -104,6 +102,14 @@ Sends a MESSAGE to a Client Group. + MESSAGE:ToBlue () + Sends a MESSAGE to the Blue coalition. + + + MESSAGE:ToRed () + Sends a MESSAGE to the Red Coalition. + + MESSAGE:ToCoalition (CoalitionSide) Sends a MESSAGE to a Coalition. @@ -118,10 +124,6 @@ MESSAGEQUEUE:_DisplayMessages () This function is called automatically by the MESSAGEQUEUE scheduler. - - MESSAGE._MessageQueue - The _MessageQueue object is created when the MESSAGE class module is loaded. -
    @@ -164,8 +166,6 @@ MESSAGE - - @@ -206,8 +206,6 @@ MESSAGE - - @@ -231,6 +229,68 @@ MessageClient2:ToClient( ClientGroup )

+
+
+ + MESSAGE:ToBlue () +
+
+ Sends a MESSAGE to the Blue coalition. + + + +

Returns:

+
    + + MESSAGE + +
+ + + +

Usage:

+
    +
    + -- Send a message created with the New method to the BLUE coalition.
    + MessageBLUE = MESSAGE:New( "To the BLUE Players: You receive a penalty because you've killed one of your own units", "Penalty", 25, "Score" ):ToBlue()
    + or
    + MESSAGE:New( "To the BLUE Players: You receive a penalty because you've killed one of your own units", "Penalty", 25, "Score" ):ToBlue()
    + or
    + MessageBLUE = MESSAGE:New( "To the BLUE Players: You receive a penalty because you've killed one of your own units", "Penalty", 25, "Score" )
    + MessageBLUE:ToBlue()
    +
+ +
+
+ + MESSAGE:ToRed () +
+
+ Sends a MESSAGE to the Red Coalition. + + + +

Returns:

+
    + + MESSAGE + +
+ + + +

Usage:

+
    +
    + -- Send a message created with the New method to the RED coalition.
    + MessageRED = MESSAGE:New( "To the RED Players: You receive a penalty because you've killed one of your own units", "Penalty", 25, "Score" ):ToRed()
    + or
    + MESSAGE:New( "To the RED Players: You receive a penalty because you've killed one of your own units", "Penalty", 25, "Score" ):ToRed()
    + or
    + MessageRED = MESSAGE:New( "To the RED Players: You receive a penalty because you've killed one of your own units", "Penalty", 25, "Score" )
    + MessageRED:ToRed()
    +
+
@@ -252,8 +312,6 @@ MESSAGE - - @@ -285,8 +343,6 @@ MESSAGE - - @@ -322,20 +378,6 @@ - -
- - MESSAGE._MessageQueue -
-
- The _MessageQueue object is created when the MESSAGE class module is loaded. - - - - - - -
@@ -344,7 +386,7 @@
generated by LDoc 1.4.3 -Last updated 2015-01-29 21:06:10 +Last updated 2016-03-14 10:50:59
diff --git a/doc/classes/MISSION.html b/doc/classes/MISSION.html index 724c88e11..e5ac30b10 100644 --- a/doc/classes/MISSION.html +++ b/doc/classes/MISSION.html @@ -3,7 +3,7 @@ - MOOSE + Reference @@ -24,7 +24,7 @@

Class MISSION

-

A MISSION is the main owner of a Mission orchestration within MOOSE .

+

A MISSION is the main owner of a Mission orchestration within MOOSE .

The Mission framework orchestrates CLIENTs, TASKs, STAGEs etc. A CLIENT needs to be registered within the MISSION through the function AddClient. A TASK needs to be registered within the MISSION through the function AddTask.

-

Tables

- - - - - -
MISSION.SpawnCargoAdd Cargo to the mission...
-

Issues

- - - - - - - - - -
MISSION.SpawnCargo-todo1check this
MISSION.SpawnCargo-todo1-todo2check this

Methods

@@ -227,56 +204,6 @@
-

Tables

- -
-
- - MISSION.SpawnCargo -
-
- Add Cargo to the mission... Cargo functionality needs to be reworked a bit, so this is still under construction. I need to make a CARGO Class... - - - - - - - -
-
-

Issues

- -
-
- - MISSION.SpawnCargo-todo1 -
-
- check this - - - - - - - -
-
- - MISSION.SpawnCargo-todo1-todo2 -
-
- check this - - - - - - - -
-

Methods

@@ -313,8 +240,6 @@ MISSION - - @@ -348,8 +273,6 @@ bool - - @@ -578,8 +501,6 @@ CLIENT - - @@ -607,8 +528,6 @@ CLIENT - - @@ -645,8 +564,6 @@ CLIENT - - @@ -684,8 +601,6 @@ TASK - - @@ -736,8 +651,6 @@ TASK - - @@ -966,7 +879,7 @@
generated by LDoc 1.4.3 -Last updated 2015-01-29 21:06:10 +Last updated 2016-03-14 10:50:59
diff --git a/doc/classes/MOVEMENT.html b/doc/classes/MOVEMENT.html index 952edca7b..3d2f384ad 100644 --- a/doc/classes/MOVEMENT.html +++ b/doc/classes/MOVEMENT.html @@ -3,7 +3,7 @@ - MOOSE + Reference @@ -24,7 +24,7 @@ @@ -83,7 +80,8 @@

Class MOVEMENT

Limit the simultaneous movement of Groups within a running Mission.

-

This module is defined to improve the performance in missions, and to bring additional realism for GROUND vehicles. +

+ This module is defined to improve the performance in missions, and to bring additional realism for GROUND vehicles. Performance: If in a DCSRTE there are a lot of moving GROUND units, then in a multi player mission, this WILL create lag if the main DCS execution core of your CPU is fully utilized. So, this class will limit the amount of simultaneous moving GROUND units on defined intervals (currently every minute).

@@ -149,8 +147,6 @@ MOVEMENT - - @@ -203,8 +199,6 @@
  • event - -
@@ -225,8 +219,6 @@
  • event - -
@@ -256,7 +248,7 @@
generated by LDoc 1.4.3 -Last updated 2015-01-29 21:06:10 +Last updated 2016-03-14 10:50:59
diff --git a/doc/classes/NOTASK.html b/doc/classes/NOTASK.html index 3ed670832..542381817 100644 --- a/doc/classes/NOTASK.html +++ b/doc/classes/NOTASK.html @@ -3,7 +3,7 @@ - MOOSE + Reference @@ -24,7 +24,7 @@ @@ -121,8 +118,6 @@
  • ClassName - -
@@ -156,7 +151,7 @@
generated by LDoc 1.4.3 -Last updated 2015-01-29 21:06:10 +Last updated 2016-03-14 10:50:59
diff --git a/doc/classes/PICKUPTASK.html b/doc/classes/PICKUPTASK.html index 1a2addfe9..ee8e93359 100644 --- a/doc/classes/PICKUPTASK.html +++ b/doc/classes/PICKUPTASK.html @@ -3,7 +3,7 @@ - MOOSE + Reference @@ -24,7 +24,7 @@ @@ -83,9 +80,7 @@

Class PICKUPTASK

A PICKUPTASK orchestrates the loading of CARGO at a specific landing zone.

-

- -

+

Methods

@@ -139,7 +134,7 @@
generated by LDoc 1.4.3 -Last updated 2015-01-29 21:06:10 +Last updated 2016-03-14 10:50:59
diff --git a/doc/classes/ROUTETASK.html b/doc/classes/ROUTETASK.html index 61d453c81..fa9e43fe7 100644 --- a/doc/classes/ROUTETASK.html +++ b/doc/classes/ROUTETASK.html @@ -3,7 +3,7 @@ - MOOSE + Reference @@ -24,7 +24,7 @@ @@ -84,9 +81,7 @@

Class ROUTETASK

A ROUTETASK orchestrates the travel to a specific zone defined within the ME.

-

- -

+

Tables

@@ -123,13 +118,9 @@
  • ClassName - -
  • GoalVerb - -
@@ -167,8 +158,6 @@ ROUTETASK - - @@ -182,7 +171,7 @@
generated by LDoc 1.4.3 -Last updated 2015-01-29 21:06:10 +Last updated 2016-03-14 10:50:59
diff --git a/doc/classes/SEAD.html b/doc/classes/SEAD.html index 7fce32e97..93e05ab10 100644 --- a/doc/classes/SEAD.html +++ b/doc/classes/SEAD.html @@ -3,7 +3,7 @@ - MOOSE + Reference @@ -24,7 +24,7 @@ @@ -83,9 +80,7 @@

Class SEAD

Provides defensive behaviour to a set of SAM sites within a running Mission.

-

- -

+

Info:

- + - - - - - - + +
Gets the CountryID of the Group with the given SpawnPrefix
SPAWN:_GetTemplate (SpawnPrefix)SPAWN:_GetTemplate (SpawnTemplatePrefix) Gets the Group Template from the ME environment definition.
SPAWN:_Prepare (SpawnIncrement)Prepares the new Group Template before Spawning.
SPAWN:_RandomizeRoute (SpawnTemplate)Will randomize the route of the Group Template.SPAWN:_Prepare (SpawnTemplatePrefix, SpawnIndex)Prepares the new Group Template.

Events

@@ -133,14 +124,14 @@ Obscolete - SPAWN:OnLand (event) - Will detect AIR Units landing... - - SPAWN:OnTakeOff (event) Will detect AIR Units taking off... + SPAWN:OnLand (event) + Will detect AIR Units landing... + + SPAWN:OnEngineShutDown (event) Will detect AIR Units shutting down their engines ... @@ -155,31 +146,23 @@

Public

- + - - - - - - - - - - - - - - + + - + + + + + @@ -195,6 +178,10 @@ + + + + @@ -203,16 +190,36 @@ - + + + + + + + + + + + + + + + + + - - + + - - + + + + + +
SPAWN:New (SpawnPrefix)SPAWN:New (SpawnTemplatePrefix) Creates the main object to spawn a Group defined in the DCS ME.
SPAWN:RandomizeRoute (SpawnStartPoint, SpawnEndPoint, SpawnRadius)Randomizes a defined route of the Template Group in the ME when the Group is Spawned.
SPAWN:Schedule (SpawnTime, SpawnTimeVariation)SPAWNs a new Group within varying time intervals.
SPAWN:ScheduleStart ()Will start the SPAWNing timers.
SPAWN:ScheduleStop ()Will stop the scheduled SPAWNing activity.SPAWN:NewWithAlias (SpawnTemplatePrefix)Creates the main object to spawn a Group defined in the DCS ME.
SPAWN:Limit (SpawnMaxGroupsAlive, SpawnMaxGroups) Limits the Maximum amount of Units to be alive, and the maximum amount of Groups to be SPAWNed within the DCS World run-time environment.
SPAWN:RandomizeTemplate (SpawnPrefixTable)SPAWN:RandomizeRoute (SpawnStartPoint, SpawnEndPoint, SpawnRadius)Randomizes a defined route of the Template Group in the ME when the Group is Spawned.
SPAWN:RandomizeTemplate (SpawnTemplatePrefixTable) This function is rather complicated to understand.
Same as the @{Repeat) method, but now the Group will respawn after its engines have shut down.
SPAWN:SpawnArray (SpawnZone, SpawnAngle, SpawnFormation, SpawnWidth, SpawnDeltaX, SpawnDeltaY)Makes the Groups visible before start (like a batallion).
SPAWN:Spawn () Will SPAWN a Group whenever you want to do this.
Will Re-SPAWN a Group based on a given GroupName.
SPAWN:SpawnUncontrolled ()SPAWN:SpawnWithIndex (SpawnIndex)Will SPAWN a Group with a specified index number whenever you want to do this.
SPAWN:SpawnScheduled (SpawnTime, SpawnTimeVariation)SPAWNs a new Group within varying time intervals.
SPAWN:ScheduleStart ()Will start the SPAWNing timers.
SPAWN:ScheduleStop ()Will stop the scheduled SPAWNing activity.
SPAWN:UnControlled () Will SPAWN a Group whenever you want to do this, but for AIR Groups only to be applied, and will SPAWN the Group in Uncontrolled mode...
SPAWN:FromCarrier (CarrierGroup, TargetZonePrefix, NewGroupName, LateActivate)Will SPAWN a Group from a Carrier.SPAWN:SpawnFromUnit (HostUnit)Will SPAWN a Group from a Hosting UNIT.
SPAWN:InZone (ZonePrefix)Will SPAWN a Group within a given ZoneName.SPAWN:SpawnInZone (The)Will spawn a Group within a given ZONE.
SPAWN:SpawnGroupName (SpawnIndex)Will return the SpawnGroupName either with with a specific count number or without any count.
@@ -236,8 +243,6 @@
  • SpawnPrefix - -
@@ -258,8 +263,6 @@
  • SpawnPrefix - -
@@ -280,8 +283,6 @@
  • SpawnPrefix - -
@@ -292,7 +293,7 @@
- SPAWN:_GetTemplate (SpawnPrefix) + SPAWN:_GetTemplate (SpawnTemplatePrefix)
Gets the Group Template from the ME environment definition. @@ -301,9 +302,7 @@

Parameters:

    -
  • SpawnPrefix - - +
  • SpawnTemplatePrefix
@@ -315,39 +314,18 @@
- SPAWN:_Prepare (SpawnIncrement) + SPAWN:_Prepare (SpawnTemplatePrefix, SpawnIndex)
- Prepares the new Group Template before Spawning. + Prepares the new Group Template.

Parameters:

    -
  • SpawnIncrement - - +
  • SpawnTemplatePrefix
  • -
- - - - - -
-
- - SPAWN:_RandomizeRoute (SpawnTemplate) -
-
- Will randomize the route of the Group Template. - - -

Parameters:

-
    -
  • SpawnTemplate - - +
  • SpawnIndex
@@ -374,8 +352,6 @@
  • event - -
@@ -396,31 +372,6 @@
  • event - - -
  • -
- - - - - -
-
- - SPAWN:OnLand (event) -
-
- Will detect AIR Units landing... When the event takes place, the SPAWNed Group is registered as landed. - This is needed to ensure that Re-SPAWNing is only done for landed AIR Groups. - - -

Parameters:

-
    -
  • event - - -
@@ -442,8 +393,27 @@
  • event +
  • +
+ + + +
+
+ + SPAWN:OnLand (event) +
+
+ Will detect AIR Units landing... When the event takes place, the SPAWNed Group is registered as landed. + This is needed to ensure that Re-SPAWNing is only done for landed AIR Groups. + + +

Parameters:

+
    +
  • event +
@@ -466,8 +436,6 @@
  • event - -
@@ -508,23 +476,20 @@
- SPAWN:New (SpawnPrefix) + SPAWN:New (SpawnTemplatePrefix)
- -

Creates the main object to spawn a Group defined in the DCS ME. - Spawned Groups and Units will follow the following naming convention within the DCS World run-time environment:

-
   Groups will have the name SpawnPrefix#ggg, where ggg is a counter from 0 to 999 for each new spawned Group.
-   Units will have the name SpawnPrefix#ggg-uu, where uu is a counter from 0 to 99 for each new spawned Unit belonging to that Group.
-
- + Creates the main object to spawn a Group defined in the DCS ME. + Spawned Groups and Units will follow the following naming convention within the DCS World run-time environment: + Groups will have the name SpawnTemplatePrefix#ggg, where ggg is a counter from 0 to 999 for each new spawned Group. + Units will have the name SpawnTemplatePrefix#ggg-uu, where uu is a counter from 0 to 99 for each new spawned Unit belonging to that Group.

Parameters:

    -
  • SpawnPrefix +
  • SpawnTemplatePrefix string - is the name of the Group in the ME that defines the Template. That Group must have the flag "Late Activation" set. Note that this SpawnPrefix name should not contain any # character. + is the name of the Group in the ME that defines the Template. That Group must have the flag "Late Activation" set. Note that this SpawnTemplatePrefix name should not contain any # character.
@@ -533,8 +498,6 @@ SPAWN - - @@ -546,6 +509,84 @@ Spawn_BE_KA50 = SPAWN:New( 'BE KA-50@RAMP-Ground Defense' ) +
+
+ + SPAWN:NewWithAlias (SpawnTemplatePrefix) +
+
+ Creates the main object to spawn a Group defined in the DCS ME. + Spawned Groups and Units will follow the following naming convention within the DCS World run-time environment: + Groups will have the name SpawnTemplatePrefix#ggg, where ggg is a counter from 0 to 999 for each new spawned Group. + Units will have the name SpawnTemplatePrefix#ggg-uu, where uu is a counter from 0 to 99 for each new spawned Unit belonging to that Group. + + +

Parameters:

+
    +
  • SpawnTemplatePrefix + string + is the name of the Group in the ME that defines the Template. That Group must have the flag "Late Activation" set. Note that this SpawnTemplatePrefix name should not contain any # character. +
  • +
+ +

Returns:

+
    + + SPAWN + +
+ + + +

Usage:

+
    +
    + -- NATO helicopters engaging in the battle field.
    + Spawn_BE_KA50 = SPAWN:New( 'BE KA-50@RAMP-Ground Defense' )
    +
+ +
+
+ + SPAWN:Limit (SpawnMaxGroupsAlive, SpawnMaxGroups) +
+
+ Limits the Maximum amount of Units to be alive, and the maximum amount of Groups to be SPAWNed within the DCS World run-time environment. + Note that this method is exceptionally important to balance the amount of Units alive within the DCSRTE and the performance of the mission. Depending on the machine etc, a mission can only process a maximum amount of units. + If the time interval must be short, but there should not be more Units or Groups alive than a maximum amount of units, then this function should be used... + + +

Parameters:

+
    +
  • SpawnMaxGroupsAlive + number + is the Maximum amount of Units to be alive. When there are more Units alive in the DCSRTE of SpawnTemplatePrefix, then no new SPAWN will happen of the Group, until some of these Units will be destroyed. +
  • +
  • SpawnMaxGroups + number + is the Maximum amount of Groups that can be SPAWNed from SpawnTemplatePrefix. When there are more Groups alive in the DCSRTE of SpawnTemplatePrefix, then no more SPAWNs will happen of the Group. This parameter is useful to define a maximum amount of airplanes, ground troops, helicopters, ships etc within a supply area. + This parameter accepts the value 0, which expresses no Group count limits. +
  • +
+ +

Returns:

+
    + + SPAWN + +
+ + + +

Usage:

+
    +
    + -- NATO helicopters engaging in the battle field.
    + -- This helicopter group consists of one Unit. So, this group will SPAWN maximum 2 groups simultaneously within the DCSRTE.
    + -- There will be maximum 24 groups SPAWNed during the whole mission lifetime.
    + Spawn_BE_KA50 = SPAWN:New( 'BE KA-50@RAMP-Ground Defense' ):Limit( 2, 24 )
    +
+
@@ -576,8 +617,6 @@ SPAWN - - @@ -592,142 +631,21 @@ Spawn_BE_KA50 = SPAWN:New( 'BE KA-50@RAMP-Ground Defense' ):RandomizeRoute( 2, 2, 2000 ) -
-
- - SPAWN:Schedule (SpawnTime, SpawnTimeVariation) -
-
- SPAWNs a new Group within varying time intervals. This is useful if you want to have continuity within your missions of certain (AI) Groups to be present (alive) within your missions. - - -

Parameters:

-
    -
  • SpawnTime - number - is the time interval defined in seconds between each new SPAWN of new Groups. -
  • -
  • SpawnTimeVariation - number - is the variation to be applied on the defined time interval between each new SPAWN. The variation is defined as a value between 0 and 1, which expresses the %-tage of variation to be applied as the low and high time interval boundaries. Between these boundaries a new time interval will be applied. See usage. -
  • -
- -

Returns:

-
    - - SPAWN - - - -
- - - -

Usage:

-
    -
    - -- NATO helicopters engaging in the battle field.
    - -- The time interval is set to SPAWN new helicopters between each 600 seconds, with a time variation of 50%.
    - -- The time variation in this case will be between 450 seconds and 750 seconds.
    - -- This is calculated as follows:
    - --      Low limit:   600 * ( 1 - 0.5 / 2 ) = 450
    - --      High limit:  600 * ( 1 + 0.5 / 2 ) = 750
    - -- Between these two values, a random amount of seconds will be choosen for each new SPAWN of the helicopters.
    - Spawn_BE_KA50 = SPAWN:New( 'BE KA-50@RAMP-Ground Defense' ):Schedule( 600, 0.5 )
    -
- -
-
- - SPAWN:ScheduleStart () -
-
- Will start the SPAWNing timers. - This function is called automatically when Schedule is called. - - - - - - - -
-
- - SPAWN:ScheduleStop () -
-
- Will stop the scheduled SPAWNing activity. - - - - - - - -
-
- - SPAWN:Limit (SpawnMaxGroupsAlive, SpawnMaxGroups) -
-
- Limits the Maximum amount of Units to be alive, and the maximum amount of Groups to be SPAWNed within the DCS World run-time environment. - Note that this method is exceptionally important to balance the amount of Units alive within the DCSRTE and the performance of the mission. Depending on the machine etc, a mission can only process a maximum amount of units. - If the time interval must be short, but there should not be more Units or Groups alive than a maximum amount of units, then this function should be used... - - -

Parameters:

-
    -
  • SpawnMaxGroupsAlive - number - is the Maximum amount of Units to be alive. When there are more Units alive in the DCSRTE of SpawnPrefix, then no new SPAWN will happen of the Group, until some of these Units will be destroyed. -
  • -
  • SpawnMaxGroups - number - -

    is the Maximum amount of Groups that can be SPAWNed from SpawnPrefix. When there are more Groups alive in the DCSRTE of SpawnPrefix, then no more SPAWNs will happen of the Group. This parameter is useful to define a maximum amount of airplanes, ground troops, helicopters, ships etc within a supply area.

    -
        This parameter accepts the value 0, which expresses no Group count limits.
    -
    - -
  • -
- -

Returns:

-
    - - SPAWN - - - -
- - - -

Usage:

-
    -
    - -- NATO helicopters engaging in the battle field.
    - -- This helicopter group consists of one Unit. So, this group will SPAWN maximum 2 groups simultaneously within the DCSRTE.
    - -- There will be maximum 24 groups SPAWNed during the whole mission lifetime.
    - Spawn_BE_KA50 = SPAWN:New( 'BE KA-50@RAMP-Ground Defense' ):Limit( 2, 24 )
    -
-
- SPAWN:RandomizeTemplate (SpawnPrefixTable) + SPAWN:RandomizeTemplate (SpawnTemplatePrefixTable)
This function is rather complicated to understand. But I'll try to explain... - This function becomes useful when you need to SPAWN random types of Groups defined within the ME, but they all need to follow the same Template route and have the same SpawnPrefix name, then this method becomes very useful. + This function becomes useful when you need to SPAWN random types of Groups defined within the ME, but they all need to follow the same Template route and have the same SpawnTemplatePrefix name, then this method becomes very useful.

Parameters:

    -
  • SpawnPrefixTable +
  • SpawnTemplatePrefixTable table{string,...} - is a table with the names of the Groups defined within the ME (with late activatio on), from which on a new SPAWN of SpawnPrefix (the main Group name), a NEW Group will be choosen as the Group to be SPAWNed. + is a table with the names of the Groups defined within the ME (with late activatio on), from which on a new SPAWN of SpawnTemplatePrefix (the main Group name), a NEW Group will be choosen as the Group to be SPAWNed. In other words, this method randomizes between a defined set of Groups the Group to be SPAWNed for each new SPAWN.
@@ -737,8 +655,6 @@ SPAWN - - @@ -748,7 +664,7 @@
  -- NATO Tank Platoons invading Gori.
  -- Choose between 13 different 'US Tank Platoon' configurations for each new SPAWN the Group to be SPAWNed for the
- -- 'US Tank Platoon Left', 'US Tank Platoon Middle' and 'US Tank Platoon Right' SpawnPrefixes.
+ -- 'US Tank Platoon Left', 'US Tank Platoon Middle' and 'US Tank Platoon Right' SpawnTemplatePrefixes.
  -- Each new SPAWN will randomize the route, with a defined time interval of 200 seconds with 40% time variation (randomization) and
  -- with a limit set of maximum 12 Units alive simulteneously  and 150 Groups to be SPAWNed during the whole mission.
  Spawn_US_Platoon = { 'US Tank Platoon 1', 'US Tank Platoon 2', 'US Tank Platoon 3', 'US Tank Platoon 4', 'US Tank Platoon 5',
@@ -767,7 +683,7 @@
     
When a Group got SPAWNed, it has a life within the DCSRTE. For planes and helicopters, when these Units go home and land on their home airbases and farps, they normally would taxi to the parking spot, shut-down their engines and wait forever until the Group is removed by the DCSRTE. This function is used to Re-Spawn automatically (so no extra call is needed anymore) the same Group after it landed. This will enable a SPAWNed group to be Re-SPAWNed after it lands, until it is destroyed... - Note: When the Group is respawned, it will ReSpawn at the original airbase where it took off. So ensure that the paths for Groups that ReSpawn, always return to the orignal airbase. + Note: When the Group is respawned, it will ReSpawn at the original airbase where it took off. So ensure that the paths for Groups that ReSpawn, always return to the original airbase. @@ -776,8 +692,6 @@ SPAWN - - @@ -805,8 +719,6 @@ SPAWN - - @@ -831,8 +743,6 @@ SPAWN - - @@ -842,6 +752,59 @@ +
+
+ + SPAWN:SpawnArray (SpawnZone, SpawnAngle, SpawnFormation, SpawnWidth, SpawnDeltaX, SpawnDeltaY) +
+
+ Makes the Groups visible before start (like a batallion). + + +

Parameters:

+
    +
  • SpawnZone + number + A ZONE where the group will be positioned. The X and Y coordinates of the zone define the start position. +
  • +
  • SpawnAngle + number + The angle in degrees how the Groups and each Unit of the Group will be positioned. +
  • +
  • SpawnFormation + number + The formation of the Units within the Group. +
  • +
  • SpawnWidth + number + The amount of Groups that will be positioned on the X axis. +
  • +
  • SpawnDeltaX + number + The space between each Group on the X-axis. +
  • +
  • SpawnDeltaY + number + The space between each Group on the Y-axis. +
  • +
+ +

Returns:

+
    + + SPAWN + +
+ + + +

Usage:

+
    +
    + -- Define an array of Groups within Zone "Start".
    + Spawn_BE_Ground = SPAWN:New( 'BE Ground' ):Limit( 2, 24 ):Visible( ZONE:New( "Start" ), 90, "Diamond", 10, 100, 50 )
    +
+
@@ -859,8 +822,6 @@ SPAWN - - @@ -881,8 +842,6 @@
  • SpawnGroupName string - -
  • @@ -898,11 +857,112 @@
    - - SPAWN:SpawnUncontrolled () + + SPAWN:SpawnWithIndex (SpawnIndex)
    - Will SPAWN a Group whenever you want to do this, but for AIR Groups only to be applied, and will SPAWN the Group in Uncontrolled mode... This will be similar to the Uncontrolled flag setting in the ME. + Will SPAWN a Group with a specified index number whenever you want to do this. + Note that the configuration with the above functions will apply when calling this method: Maxima, Randomization of routes, Scheduler, ... + Uses DATABASE global object defined in MOOSE. + + +

    Parameters:

    +
      +
    • SpawnIndex + +
    • +
    + +

    Returns:

    +
      + + GROUP + The GROUP that was spawned. You can use this group for further actions. +
    + + + + +
    +
    + + SPAWN:SpawnScheduled (SpawnTime, SpawnTimeVariation) +
    +
    + SPAWNs a new Group within varying time intervals. This is useful if you want to have continuity within your missions of certain (AI) Groups to be present (alive) within your missions. + + +

    Parameters:

    +
      +
    • SpawnTime + number + is the time interval defined in seconds between each new SPAWN of new Groups. +
    • +
    • SpawnTimeVariation + number + is the variation to be applied on the defined time interval between each new SPAWN. The variation is defined as a value between 0 and 1, which expresses the %-tage of variation to be applied as the low and high time interval boundaries. Between these boundaries a new time interval will be applied. See usage. +
    • +
    + +

    Returns:

    +
      + + SPAWN + +
    + + + +

    Usage:

    +
      +
      + -- NATO helicopters engaging in the battle field.
      + -- The time interval is set to SPAWN new helicopters between each 600 seconds, with a time variation of 50%.
      + -- The time variation in this case will be between 450 seconds and 750 seconds.
      + -- This is calculated as follows:
      + --      Low limit:   600 * ( 1 - 0.5 / 2 ) = 450
      + --      High limit:  600 * ( 1 + 0.5 / 2 ) = 750
      + -- Between these two values, a random amount of seconds will be choosen for each new SPAWN of the helicopters.
      + Spawn_BE_KA50 = SPAWN:New( 'BE KA-50@RAMP-Ground Defense' ):Schedule( 600, 0.5 )
      +
    + +
    +
    + + SPAWN:ScheduleStart () +
    +
    + Will start the SPAWNing timers. + This function is called automatically when ??? is called. + + + + + + + +
    +
    + + SPAWN:ScheduleStop () +
    +
    + Will stop the scheduled SPAWNing activity. + + + + + + + +
    +
    + + SPAWN:UnControlled () +
    +
    + Will SPAWN a Group whenever you want to do this, but for AIR Groups only to be applied, and will SPAWN the Group in Uncontrolled mode... + This will be similar to the Uncontrolled flag setting in the ME. @@ -911,8 +971,6 @@ SPAWN - - @@ -920,61 +978,88 @@
    - - SPAWN:FromCarrier (CarrierGroup, TargetZonePrefix, NewGroupName, LateActivate) + + SPAWN:SpawnFromUnit (HostUnit)
    - Will SPAWN a Group from a Carrier. This function is mostly advisable to be used if you want to simulate SPAWNing from air units, like helicopters, which are dropping infantry into a defined Landing Zone. + Will SPAWN a Group from a Hosting UNIT. This function is mostly advisable to be used if you want to simulate SPAWNing from air units, like helicopters, which are dropping infantry into a defined Landing Zone. + Note that each point in the route assigned to the spawning GROUP is reset to the Point of the spawn. + You can use the returned GROUP to further define the route to be followed.

    Parameters:

      -
    • CarrierGroup - Group - is the Group of the AIR unit or GROUND unit dropping or unloading other units. -
    • -
    • TargetZonePrefix - string - is the Prefix of the Zone defined in the ME where the Group should be moving to after drop. -
    • -
    • NewGroupName - string - (forgot this). -
    • -
    • LateActivate - bool - (optional) does the SPAWNing with Lateactivation on. +
    • HostUnit + UNIT + is the AIR unit or GROUND unit dropping or unloading the Spawn group.
    +

    Returns:

    +
      +
    1. + GROUP + Spawned.
    2. +
    3. + nil + when nothing was spawned.
    4. +
    - - SPAWN:InZone (ZonePrefix) + + SPAWN:SpawnInZone (The)
    - Will SPAWN a Group within a given ZoneName. + Will spawn a Group within a given ZONE.

    Parameters:

      -
    • ZonePrefix - string - is the name of the zone where the Group is to be SPAWNed. +
    • The + ZONE + ZONE where the Group is to be SPAWNed. +
    • +
    + +

    Returns:

    +
      +
    1. + GROUP + that was spawned.
    2. +
    3. + nil + when nothing as spawned.
    4. +
    + + + + +
    +
    + + SPAWN:SpawnGroupName (SpawnIndex) +
    +
    + Will return the SpawnGroupName either with with a specific count number or without any count. + + +

    Parameters:

    +
      +
    • SpawnIndex + number + is the number of the Group that is to be SPAWNed.

    Returns:

      - SpawnTemplate - - - + string + SpawnGroupName
    @@ -988,7 +1073,7 @@
    generated by LDoc 1.4.3 -Last updated 2015-01-29 21:06:10 +Last updated 2016-03-14 10:50:59
    diff --git a/doc/classes/STAGE.html b/doc/classes/STAGE.html index 297ee5ca8..f4bd9de6b 100644 --- a/doc/classes/STAGE.html +++ b/doc/classes/STAGE.html @@ -3,7 +3,7 @@ - MOOSE + Reference @@ -24,7 +24,7 @@ @@ -97,7 +94,7 @@
    generated by LDoc 1.4.3 -Last updated 2015-01-29 21:06:10 +Last updated 2016-03-14 10:50:59
    diff --git a/doc/classes/TASK.html b/doc/classes/TASK.html index 3507d58a1..31ccae7f8 100644 --- a/doc/classes/TASK.html +++ b/doc/classes/TASK.html @@ -3,7 +3,7 @@ - MOOSE + Reference @@ -24,7 +24,7 @@ @@ -227,8 +224,6 @@ TASK - - @@ -267,17 +262,11 @@
    • Mission MISSION - -
          Group structure describing the Mission.
      -
      - + Group structure describing the Mission.
    • Client CLIENT - -
              Group structure describing the Client.
      -
      - + Group structure describing the Client.
    @@ -314,8 +303,6 @@ bool - - @@ -395,8 +382,6 @@ bool - - @@ -474,8 +459,6 @@ TASK - - @@ -507,8 +490,6 @@ TASK - - @@ -536,8 +517,6 @@ TASK - - @@ -565,8 +544,6 @@ TASK - - @@ -587,8 +564,6 @@ bool - - @@ -663,23 +638,15 @@
    • SignalUnitNames - -
    • SignalType - -
    • SignalColor - -
    • SignalHeight - -
    @@ -945,7 +912,7 @@
    generated by LDoc 1.4.3 -Last updated 2015-01-29 21:06:10 +Last updated 2016-03-14 10:50:59
    diff --git a/doc/classes/UNIT.html b/doc/classes/UNIT.html new file mode 100644 index 000000000..2e8d5ea50 --- /dev/null +++ b/doc/classes/UNIT.html @@ -0,0 +1,97 @@ + + + + + Reference + + + + +
    + +
    + +
    +
    +
    + + +
    + + + + + + +
    + +

    Class UNIT

    +

    UNIT Classes

    +

    + + + +
    +
    + + + + +
    +
    +
    +generated by LDoc 1.4.3 +Last updated 2016-03-14 10:50:59 +
    +
    + + diff --git a/doc/classes/ZONE.html b/doc/classes/ZONE.html new file mode 100644 index 000000000..f424a4910 --- /dev/null +++ b/doc/classes/ZONE.html @@ -0,0 +1,97 @@ + + + + + Reference + + + + +
    + +
    + +
    +
    +
    + + +
    + + + + + + +
    + +

    Class ZONE

    +

    ZONE Classes

    +

    + + + +
    +
    + + + + +
    +
    +
    +generated by LDoc 1.4.3 +Last updated 2016-03-14 10:50:59 +
    +
    + + diff --git a/doc/index.html b/doc/index.html index a16ec2301..2ccf22bf8 100644 --- a/doc/index.html +++ b/doc/index.html @@ -3,7 +3,7 @@ - MOOSE + Reference @@ -24,7 +24,7 @@ @@ -75,8 +72,6 @@
    -

    Mission Object Oriented Scripting Environment

    -

    A Scripting Framework for DCS World, to script quickly missions.

    Modules

    @@ -104,7 +99,7 @@ - + @@ -142,6 +137,10 @@ + + + + @@ -152,7 +151,7 @@ - + @@ -174,14 +173,6 @@ - - - - - - - - @@ -194,12 +185,13 @@ -
    CARGOCARGOCARGO Classes
    CLEANUPGOHOMETASK A GOHOMETASK orchestrates the travel back to the home base, which is a specific zone defined within the ME.
    GROUPGROUP Classes
    MENU Encapsulation of DCS World Menu system in a set of MENU classes.
    MISSIONA MISSION is the main owner of a Mission orchestration within MOOSE .A MISSION is the main owner of a Mission orchestration within MOOSE .
    MOVEMENTSEAD Provides defensive behaviour to a set of SAM sites within a running Mission.
    SLINGLOADHOOKTASKA SLINGLOADHOOKTASK will orchestrate the sling-load hook activity to slingload a CARGO from a specific landing zone(s).
    SLINGLOADUNHOOKTASKA SLINGLOADUNHOOKTASK will orchestrate the sling-load unhook activity to (sling)load a CARGO and deploy it in a specific landing zone(s).
    SPAWN Dynamic spawning of Groups and Units.TASK The TASK Classes define major end-to-end activities within a MISSION.
    -

    Topics

    - - - + + + + + +
    manual.mdUNITUNIT Classes
    ZONEZONE Classes
    @@ -207,7 +199,7 @@
    generated by LDoc 1.4.3 -Last updated 2015-01-29 21:06:10 +Last updated 2016-03-14 10:50:59
    diff --git a/doc/ldoc.css b/doc/ldoc.css index 7d74ca235..8230e3f4d 100644 --- a/doc/ldoc.css +++ b/doc/ldoc.css @@ -159,7 +159,7 @@ table.index td { text-align: left; vertical-align: top; } #navigation { float: left; - width: 14em; + width: 30em; vertical-align: top; background-color: #f0f0f0; overflow: visible; @@ -193,9 +193,9 @@ table.index td { text-align: left; vertical-align: top; } } #content { - margin-left: 14em; + margin-left: 30em; padding: 1em; - width: 700px; + //width: 700px; border-left: 2px solid #cccccc; border-right: 2px solid #cccccc; background-color: #ffffff; @@ -252,7 +252,7 @@ table.module_list td { border-style: solid; border-color: #cccccc; } -table.module_list td.name { background-color: #f0f0f0; min-width: 200px; } +table.module_list td.name { background-color: #f0f0f0; min-width: 400px; } table.module_list td.summary { width: 100%; } @@ -268,7 +268,7 @@ table.function_list td { border-style: solid; border-color: #cccccc; } -table.function_list td.name { background-color: #f0f0f0; min-width: 200px; } +table.function_list td.name { background-color: #f0f0f0; min-width: 400px; } table.function_list td.summary { width: 100%; } ul.nowrap { diff --git a/doc/modules/routines.html b/doc/modules/routines.html index 110b7aa33..ee87f4188 100644 --- a/doc/modules/routines.html +++ b/doc/modules/routines.html @@ -3,7 +3,7 @@ - MOOSE + Reference @@ -24,7 +24,7 @@ @@ -84,9 +81,7 @@

    Module routines

    Various routines

    -

    - -

    +

    Info:

    • Author: Flightcontrol
    • @@ -149,13 +144,9 @@
      • TeleportPrefixTable - -
      • TeleportMax - -
      @@ -203,7 +194,7 @@
      generated by LDoc 1.4.3 -Last updated 2015-01-29 21:06:10 +Last updated 2016-03-14 10:50:59
      diff --git a/doc/modules/trace.html b/doc/modules/trace.html index 056e1959a..2dedecea0 100644 --- a/doc/modules/trace.html +++ b/doc/modules/trace.html @@ -3,7 +3,7 @@ - MOOSE + Reference @@ -24,7 +24,7 @@ @@ -79,9 +76,7 @@

      Module trace

      Tracing functions...

      -

      - -

      +

      Info:

      • Author: Flightcontrol
      • @@ -99,7 +94,7 @@
        generated by LDoc 1.4.3 -Last updated 2015-01-29 21:06:10 +Last updated 2016-03-14 10:50:59
        diff --git a/doc/scripts/eStatHandler.html b/doc/scripts/eStatHandler.html index 9fab8910b..b62640488 100644 --- a/doc/scripts/eStatHandler.html +++ b/doc/scripts/eStatHandler.html @@ -3,7 +3,7 @@ - MOOSE + Reference @@ -24,7 +24,7 @@ @@ -79,9 +76,7 @@

        Script eStatHandler

        Provides a logging of statistics in a running DCS Mission.

        -

        - -

        +

        @@ -95,7 +90,7 @@
        generated by LDoc 1.4.3 -Last updated 2015-01-29 21:06:10 +Last updated 2016-03-14 10:50:59
        diff --git a/ldoc_errors.txt b/ldoc_errors.txt index fc868151a..bb8f826c3 100644 --- a/ldoc_errors.txt +++ b/ldoc_errors.txt @@ -1,2 +1,21 @@ -d:\my dcs missions\scripts\moose\pickuptask.lua:5: ?: unknown tag: 'parent' nil -d:\my dcs missions\scripts\moose\message.lua:98: MESSAGE:ToCoalition: module not found: coalition coalition.side +d:\my dcs missions\scripts\moose\moose\deploytask.lua:16: DEPLOYTASK:New: param and formal argument name mismatch: 'LandingZones' 'CargoType' +d:\my dcs missions\scripts\moose\moose\deploytask.lua:16: DEPLOYTASK:New: extra param with no formal argument: 'CargoType' +d:\my dcs missions\scripts\moose\moose\pickuptask.lua:5: ?: unknown tag: 'parent' nil +d:\my dcs missions\scripts\moose\moose\pickuptask.lua:18: PICKUPTASK:New: param and formal argument name mismatch: 'LandingZones' 'CargoType' +d:\my dcs missions\scripts\moose\moose\pickuptask.lua:18: PICKUPTASK:New: param and formal argument name mismatch: 'CargoType' 'OnBoardSide' +d:\my dcs missions\scripts\moose\moose\pickuptask.lua:18: PICKUPTASK:New: extra param with no formal argument: 'OnBoardSide' +d:\my dcs missions\scripts\moose\moose\spawn.lua:72: SPAWN:NewWithAlias: undocumented formal argument: 'SpawnAliasPrefix' +d:\my dcs missions\scripts\moose\moose\spawn.lua:305: SPAWN:SpawnArray: param and formal argument name mismatch: 'SpawnZone' 'SpawnAngle' +d:\my dcs missions\scripts\moose\moose\spawn.lua:305: SPAWN:SpawnArray: param and formal argument name mismatch: 'SpawnAngle' 'SpawnWidth' +d:\my dcs missions\scripts\moose\moose\spawn.lua:305: SPAWN:SpawnArray: param and formal argument name mismatch: 'SpawnFormation' 'SpawnDeltaX' +d:\my dcs missions\scripts\moose\moose\spawn.lua:305: SPAWN:SpawnArray: param and formal argument name mismatch: 'SpawnWidth' 'SpawnDeltaY' +d:\my dcs missions\scripts\moose\moose\spawn.lua:305: SPAWN:SpawnArray: extra param with no formal argument: 'SpawnDeltaX' +d:\my dcs missions\scripts\moose\moose\spawn.lua:305: SPAWN:SpawnArray: extra param with no formal argument: 'SpawnDeltaY' +d:\my dcs missions\scripts\moose\moose\spawn.lua:430: SPAWN:ReSpawn: param and formal argument name mismatch: 'SpawnGroupName' 'SpawnIndex' +d:\my dcs missions\scripts\moose\moose\spawn.lua:556: SPAWN:SpawnFromUnit: undocumented formal argument: 'OuterRadius' +d:\my dcs missions\scripts\moose\moose\spawn.lua:556: SPAWN:SpawnFromUnit: undocumented formal argument: 'InnerRadius' +d:\my dcs missions\scripts\moose\moose\spawn.lua:556: SPAWN:SpawnFromUnit: undocumented formal argument: 'SpawnIndex' +d:\my dcs missions\scripts\moose\moose\spawn.lua:629: SPAWN:SpawnInZone: param and formal argument name mismatch: 'The' 'Zone' +d:\my dcs missions\scripts\moose\moose\spawn.lua:629: SPAWN:SpawnInZone: undocumented formal argument: 'SpawnIndex' +d:\my dcs missions\scripts\moose\moose\message.lua:134: MESSAGE:ToCoalition: module not found: coalition coalition.side +d:\my dcs missions\scripts\moose\moose\spawn.lua:509: SPAWN:ScheduleStart: function not found: Schedule in this module Schedule