From 8440cb01ab206e82e6d44d8d4771bba97aa661f7 Mon Sep 17 00:00:00 2001 From: FlightControl Date: Sat, 8 Apr 2017 14:05:28 +0200 Subject: [PATCH] First Version --- Moose Development/Moose/Core/SpawnStatic.lua | 172 +++++++++++++++++++ 1 file changed, 172 insertions(+) create mode 100644 Moose Development/Moose/Core/SpawnStatic.lua diff --git a/Moose Development/Moose/Core/SpawnStatic.lua b/Moose Development/Moose/Core/SpawnStatic.lua new file mode 100644 index 000000000..a891cf2b3 --- /dev/null +++ b/Moose Development/Moose/Core/SpawnStatic.lua @@ -0,0 +1,172 @@ +--- **Functional** -- Spawn dynamically new @{Static}s in your missions. +-- +-- ![Banner Image](..\Presentations\SPAWNSTATIC\SPAWNSTATIC.JPG) +-- +-- ==== +-- +-- # Demo Missions +-- +-- ### [SPAWNSTATIC Demo Missions source code]() +-- +-- ### [SPAWNSTATIC Demo Missions, only for beta testers]() +-- +-- ### [ALL Demo Missions pack of the last release](https://github.com/FlightControl-Master/MOOSE_MISSIONS/releases) +-- +-- ==== +-- +-- # YouTube Channel +-- +-- ### [SPAWNSTATIC YouTube Channel]() +-- +-- ==== +-- +-- # **API CHANGE HISTORY** +-- +-- The underlying change log documents the API changes. Please read this carefully. The following notation is used: +-- +-- * **Added** parts are expressed in bold type face. +-- * _Removed_ parts are expressed in italic type face. +-- +-- Hereby the change log: +-- +-- === +-- +-- # **AUTHORS and CONTRIBUTIONS** +-- +-- ### Contributions: +-- +-- ### Authors: +-- +-- * **FlightControl**: Design & Programming +-- +-- @module SpawnStatic + + + +--- SPAWNSTATIC Class +-- @type SPAWNSTATIC +-- @extends Core.Base#BASE + + +--- # SPAWNSTATIC class, extends @{Base#BASE} +-- +-- The SPAWNSTATIC class allows to spawn dynamically new @{Static}s. +-- +-- There are two modes how SPAWNSTATIC can spawn: +-- +-- * Through creating a copy of an existing Template @{Static} as defined in the Mission Editor (ME). +-- * Through the provision of the type name of the Static. +-- +-- Spawned @{Static}s get **the same name** as the name of the Template Static, +-- or gets the given name when a Static Type is used. +-- Newly spawned @{Static}s will get the following naming structure at run-time: +-- +-- * Spawned @{Static}s will have the name _StaticName_#_nnn_, where _StaticName_ is the name of the **Template Static**, +-- and _nnn_ is a **counter from 0 to 99999**. +-- +-- +-- ## SPAWNSTATIC construction methods +-- +-- Create a new SPAWNSTATIC object with the @{#SPAWNSTATIC.NewFromStatic}() or the @{#SPAWNSTATIC.NewFromType}() methods: +-- +-- * @{#SPAWNSTATIC.NewFromStatic}(): Creates a new SPAWNSTATIC object given a name that is used as the base of the naming of each spawned Static. +-- * @{#SPAWNSTATIC.NewFromType}(): Creates a new SPAWNSTATIC object given a type name and a name to be given when spawned. +-- +-- ## SPAWNSTATIC **Init**ialization methods +-- +-- A spawn object will behave differently based on the usage of **initialization** methods, which all start with the **Init** prefix: +-- +-- * @{#SPAWNSTATIC.InitRandomizePosition}(): Randomizes the position of @{Static}s that are spawned within a **radius band**, given an Outer and Inner radius, from the point that the spawn happens. +-- * @{#SPAWNSTATIC.InitRandomizeZones}(): Randomizes the spawning between a predefined list of @{Zone}s that are declared using this function. Each zone can be given a probability factor. +-- +-- ## SPAWNSTATIC **Spawn** methods +-- +-- Groups can be spawned at different times and methods: +-- +-- * @{#SPAWNSTATIC.SpawnInZone}(): Spawn a new group in a @{Zone}. +-- * @{#SPAWNSTATIC.SpawnFromVec3}(): Spawn a new group from a Vec3 coordinate. (The group will can be spawned at a point in the air). +-- * @{#SPAWNSTATIC.SpawnFromVec2}(): Spawn a new group from a Vec2 coordinate. (The group will be spawned at land height ). +-- * @{#SPAWNSTATIC.SpawnFromStatic}(): Spawn a new group from a structure, taking the position of a @{Static}. +-- * @{#SPAWNSTATIC.SpawnFromUnit}(): Spawn a new group taking the position of a @{Unit}. +-- +-- @field #SPAWNSTATIC SPAWNSTATIC +-- +SPAWNSTATIC = { + ClassName = "SPAWNSTATIC", +} + + +--- @type SPAWNSTATIC.SpawnZoneTable +-- @list SpawnZone + + +--- Creates the main object to spawn a @{Static} defined in the ME. +-- @param #SPAWNSTATIC 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 #SPAWNSTATIC +function SPAWNSTATIC:NewFromStatic( SpawnTemplatePrefix, CountryID ) + local self = BASE:Inherit( self, BASE:New() ) -- #SPAWNSTATIC + self:F( { SpawnTemplatePrefix } ) + + local TemplateStatic = StaticObject.getByName( SpawnTemplatePrefix ) + if TemplateStatic then + self.SpawnTemplatePrefix = SpawnTemplatePrefix + self.CountryID = CountryID + self.SpawnIndex = 0 + else + error( "SPAWNSTATIC:New: There is no group declared in the mission editor with SpawnTemplatePrefix = '" .. SpawnTemplatePrefix .. "'" ) + end + + self:SetEventPriority( 5 ) + + return self +end + +--- Creates the main object to spawn a @{Static} based on a type name. +-- @param #SPAWNSTATIC self +-- @param #string SpawnTypeName is the name of the type. +-- @return #SPAWNSTATIC +function SPAWNSTATIC:NewFromType( SpawnTypeName, SpawnShapeName, SpawnCategory, CountryID ) + local self = BASE:Inherit( self, BASE:New() ) -- #SPAWNSTATIC + self:F( { SpawnTypeName } ) + + self.SpawnTypeName = SpawnTypeName + self.CountryID = CountryID + self.SpawnIndex = 0 + + self:SetEventPriority( 5 ) + + return self +end + + +--- Creates a new @{Static} from a POINT_VEC2. +-- @param #SPAWNSTATIC self +-- @param #string SpawnTypeName is the name of the type. +-- @return #SPAWNSTATIC +function SPAWNSTATIC:SpawnFromPointVec2( PointVec2, BaseName ) + self:F( { PointVec2, BaseName } ) + + local CountryName = _DATABASE.COUNTRY_NAME[self.CountryID] + + local StaticTemplate + + local Tire = { + ["country"] = CountryName, + ["category"] = "Fortifications", + ["canCargo"] = false, + ["shape_name"] = "H-tyre_B_WF", + ["type"] = "Black_Tyre_WF", + --["unitId"] = Angle + 10000, + ["y"] = Point.y, + ["x"] = Point.x, + ["name"] = string.format( "%s-Tire #%0d", self:GetName(), Angle ), + ["heading"] = 0, + } -- end of ["group"] + + local Group = coalition.addStaticObject( CountryID, Tire ) + + return self +end + +