diff --git a/Moose Development/Moose/Core/Base.lua b/Moose Development/Moose/Core/Base.lua index 381c6859f..313482880 100644 --- a/Moose Development/Moose/Core/Base.lua +++ b/Moose Development/Moose/Core/Base.lua @@ -433,7 +433,7 @@ do -- Event Handling -- reflecting the order of the classes subscribed to the Event to be processed. -- @param #BASE self -- @param #number EventPriority The @{Event} processing Priority. - -- @return self + -- @return #BASE self function BASE:SetEventPriority( EventPriority ) self._.EventPriority = EventPriority end diff --git a/Moose Development/Moose/Core/Point.lua b/Moose Development/Moose/Core/Point.lua index 57d831b34..ef54e3d5e 100644 --- a/Moose Development/Moose/Core/Point.lua +++ b/Moose Development/Moose/Core/Point.lua @@ -1995,6 +1995,27 @@ do -- COORDINATE end + --- Get sun rise time for a specific day of the year at the coordinate. + -- @param #COORDINATE self + -- @param #number DayOfYear The day of the year. + -- @param #boolean InSeconds If true, return the sun rise time in seconds. + -- @return #string Sunrise time, e.g. "05:41". + function COORDINATE:GetSunriseAtDayOfYear(DayOfYear, InSeconds) + + local Latitude, Longitude=self:GetLLDDM() + + local Tdiff=UTILS.GMTToLocalTimeDifference() + + local sunrise=UTILS.GetSunRiseAndSet(DayOfYear, Latitude, Longitude, true, Tdiff) + + if InSeconds then + return sunrise + else + return UTILS.SecondsToClock(sunrise, true) + end + + end + --- Get todays sun rise time. -- @param #COORDINATE self -- @param #boolean InSeconds If true, return the sun rise time in seconds. @@ -2072,33 +2093,64 @@ do -- COORDINATE end --- Check if it is day, i.e. if the sun has risen about the horizon at this coordinate. - -- @param #COORDINATE self + -- @param #COORDINATE self + -- @param #string Clock (Optional) Time in format "HH:MM:SS+D", e.g. "05:40:00+3" to check if is day at 5:40 at third day after mission start. Default is to check right now. -- @return #boolean If true, it is day. If false, it is night time. - function COORDINATE:IsDay() + function COORDINATE:IsDay(Clock) - -- Todays sun rise in sec. - local sunrise=self:GetSunrise(true) + if Clock then + + local Time=UTILS.ClockToSeconds(Clock) + + local clock=UTILS.Split(Clock, "+")[1] + + -- Tomorrows day of the year. + local DayOfYear=UTILS.GetMissionDayOfYear(Time) + + local Latitude, Longitude=self:GetLLDDM() + + local Tdiff=UTILS.GMTToLocalTimeDifference() - -- Todays sun set in sec. - local sunset=self:GetSunset(true) + local sunrise=UTILS.GetSunRiseAndSet(DayOfYear, Latitude, Longitude, true, Tdiff) + local sunset=UTILS.GetSunRiseAndSet(DayOfYear, Latitude, Longitude, false, Tdiff) + + local time=UTILS.ClockToSeconds(clock) + + -- Check if time is between sunrise and sunset. + if time>sunrise and time<=sunset then + return true + else + return false + end - -- Seconds passed since midnight. - local time=UTILS.SecondsOfToday() - - -- Check if time is between sunrise and sunset. - if time>sunrise and time<=sunset then - return true else - return false + + -- Todays sun rise in sec. + local sunrise=self:GetSunrise(true) + + -- Todays sun set in sec. + local sunset=self:GetSunset(true) + + -- Seconds passed since midnight. + local time=UTILS.SecondsOfToday() + + -- Check if time is between sunrise and sunset. + if time>sunrise and time<=sunset then + return true + else + return false + end + end end --- Check if it is night, i.e. if the sun has set below the horizon at this coordinate. -- @param #COORDINATE self + -- @param #string Clock (Optional) Time in format "HH:MM:SS+D", e.g. "05:40:00+3" to check if is night at 5:40 at third day after mission start. Default is to check right now. -- @return #boolean If true, it is night. If false, it is day time. - function COORDINATE:IsNight() - return not self:IsDay() + function COORDINATE:IsNight(Clock) + return not self:IsDay(Clock) end --- Get sun set time for a specific date at the coordinate. diff --git a/Moose Development/Moose/Core/SpawnStatic.lua b/Moose Development/Moose/Core/SpawnStatic.lua index 8f96a1c60..d1ef5b3da 100644 --- a/Moose Development/Moose/Core/SpawnStatic.lua +++ b/Moose Development/Moose/Core/SpawnStatic.lua @@ -1,104 +1,152 @@ ---- **Core** - Spawn new statics in your running missions. +--- **Core** - Spawn statics. -- -- === -- -- ## Features: -- --- * Spawn new statics from a static already defined using the mission editor. +-- * Spawn new statics from a static already defined in the mission editor. -- * Spawn new statics from a given template. -- * Spawn new statics from a given type. -- * Spawn with a custom heading and location. -- * Spawn within a zone. +-- * Spawn statics linked to units, .e.g on aircraft carriers. -- -- === -- -- # Demo Missions -- --- ### [SPAWNSTATIC Demo Missions source code](https://github.com/FlightControl-Master/MOOSE_MISSIONS/tree/master-release/SPS - Spawning Statics) --- --- ### [SPAWNSTATIC Demo Missions, only for beta testers](https://github.com/FlightControl-Master/MOOSE_MISSIONS/tree/master/SPS%20-%20Spawning%20Statics) +-- ## [SPAWNSTATIC Demo Missions](https://github.com/FlightControl-Master/MOOSE_MISSIONS/tree/master/SPS%20-%20Spawning%20Statics) -- --- ### [ALL Demo Missions pack of the last release](https://github.com/FlightControl-Master/MOOSE_MISSIONS/releases) -- -- === -- -- # YouTube Channel -- --- ### [SPAWNSTATIC YouTube Channel]() +-- ## [SPAWNSTATIC YouTube Channel]() [No videos yet!] -- -- === -- -- ### Author: **FlightControl** --- ### Contributions: +-- ### Contributions: **funkyfranky** -- -- === -- -- @module Core.SpawnStatic -- @image Core_Spawnstatic.JPG - - --- @type SPAWNSTATIC +-- @field #string SpawnTemplatePrefix Name of the template group. +-- @field #number CountryID Country ID. +-- @field #number CoalitionID Coalition ID. +-- @field #number CategoryID Category ID. +-- @field #number SpawnIndex Running number increased with each new Spawn. +-- @field Wrapper.Unit#UNIT InitLinkUnit The unit the static is linked to. +-- @field #number InitOffsetX Link offset X coordinate. +-- @field #number InitOffsetY Link offset Y coordinate. +-- @field #number InitOffsetAngle Link offset angle in degrees. +-- @field #number InitStaticHeading Heading of the static. +-- @field #string InitStaticLivery Livery for aircraft. +-- @field #string InitStaticShape Shape of teh static. +-- @field #string InitStaticType Type of the static. +-- @field #string InitStaticCategory Categrory of the static. +-- @field #string InitStaticName Name of the static. +-- @field Core.Point#COORDINATE InitStaticCoordinate Coordinate where to spawn the static. +-- @field #boolean InitDead Set static to be dead if true. -- @extends Core.Base#BASE ---- Allows to spawn dynamically new @{Static}s. --- Through creating a copy of an existing static object template as defined in the Mission Editor (ME), --- SPAWNSTATIC can retireve the properties of the defined static object template (like type, category etc), and "copy" --- these properties to create a new static object and place it at the desired coordinate. +--- Allows to spawn dynamically new @{Static}s into your mission. -- --- New spawned @{Static}s get **the same name** as the name of the template Static, --- or gets the given name when a new name is provided at the Spawn method. +-- Through creating a copy of an existing static object template as defined in the Mission Editor (ME), SPAWNSTATIC can retireve the properties of the defined static object template (like type, category etc), +-- and "copy" these properties to create a new static object and place it at the desired coordinate. +-- +-- New spawned @{Static}s get **the same name** as the name of the template Static, or gets the given name when a new name is provided at the Spawn method. -- By default, spawned @{Static}s will follow a naming convention 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**. +-- * 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 +-- # SPAWNSTATIC Constructors -- --- Create a new SPAWNSTATIC object with the @{#SPAWNSTATIC.NewFromStatic}(): +-- Firstly, we need to create a SPAWNSTATIC object that will be used to spawn new statics into the mission. There are three ways to do this. -- --- * @{#SPAWNSTATIC.NewFromStatic}(): Creates a new SPAWNSTATIC object given a name that is used as the base of the naming of each spawned Static. +-- ## Use another Static +-- +-- A new SPAWNSTATIC object can be created using another static by the @{#SPAWNSTATIC.NewFromStatic}() function. All parameters such as position, heading, country will be initialized +-- from the static. +-- +-- ## From a Template +-- +-- A SPAWNSTATIC object can also be created from a template table using the @{#SPAWNSTATIC.NewFromTemplate}(SpawnTemplate, CountryID) function. All parameters are taken from the template. +-- +-- ## From a Type +-- +-- A very basic method is to create a SPAWNSTATIC object by just giving the type of the static. All parameters must be initialized from the InitXYZ functions described below. Otherwise default values +-- are used. For example, if no spawn coordinate is given, the static will be created at the origin of the map. +-- +-- # Setting Parameters +-- +-- Parameters such as the spawn position, heading, country etc. can be set via :Init*XYZ* functions. Note that these functions must be given before the actual spawn command! +-- +-- * @{#SPAWNSTATIC.InitCoordinate}(Coordinate) Sets the coordinate where the static is spawned. Statics are always spawnd on the ground. +-- * @{#SPAWNSTATIC.InitHeading}(Heading) sets the orientation of the static. +-- * @{#SPAWNSTATIC.InitLivery}(LiveryName) sets the livery of the static. Not all statics support this. +-- * @{#SPAWNSTATIC.InitType}(StaticType) sets the type of the static. +-- * @{#SPAWNSTATIC.InitShape}(StaticType) sets the shape of the static. Not all statics have this parameter. +-- * @{#SPAWNSTATIC.InitNamePrefix}(NamePrefix) sets the name prefix of the spawned statics. +-- * @{#SPAWNSTATIC.InitCountry}(CountryID) sets the country and therefore the coalition of the spawned statics. +-- * @{#SPAWNSTATIC.InitLinkToUnit}(Unit, OffsetX, OffsetY, OffsetAngle) links the static to a unit, e.g. to an aircraft carrier. -- --- ## **Spawn** methods +-- # Spawning the Statics -- --- Groups can be spawned at different times and methods: +-- Once the SPAWNSTATIC object is created and parameters are initialized, the spawn command can be given. There are different methods where some can be used to directly set parameters +-- such as position and heading. -- --- * @{#SPAWNSTATIC.SpawnFromPointVec2}(): Spawn a new group from a POINT_VEC2 coordinate. --- (The group will be spawned at land height ). --- * @{#SPAWNSTATIC.SpawnFromZone}(): Spawn a new group in a @{Zone}. +-- * @{#SPAWNSTATIC.Spawn}(Heading, NewName) spawns the static with the set parameters. Optionally, heading and name can be given. The name **must be unique**! +-- * @{#SPAWNSTATIC.SpawnFromCoordinate}(Coordinate, Heading, NewName) spawn the static at the given coordinate. Optionally, heading and name can be given. The name **must be unique**! +-- * @{#SPAWNSTATIC.SpawnFromPointVec2}(PointVec2, Heading, NewName) spawns the static at a POINT_VEC2 coordinate. Optionally, heading and name can be given. The name **must be unique**! +-- * @{#SPAWNSTATIC.SpawnFromZone}(Zone, Heading, NewName) spawns the static at the center of a @{Zone}. Optionally, heading and name can be given. The name **must be unique**! -- -- @field #SPAWNSTATIC SPAWNSTATIC -- SPAWNSTATIC = { - ClassName = "SPAWNSTATIC", + ClassName = "SPAWNSTATIC", + SpawnIndex = 0, } +--- Static template table data. +-- @type SPAWNSTATIC.TemplateData +-- @field #string name Name of the static. +-- @field #string type Type of the static. +-- @field #string category Category of the static. +-- @field #number x X-coordinate of the static. +-- @field #number y Y-coordinate of teh static. +-- @field #number heading Heading in rad. +-- @field #boolean dead Static is dead if true. +-- @field #string livery_id Livery name. +-- @field #number unitId Unit ID. +-- @field #number groupId Group ID. +-- @field #table offsets Offset parameters when linked to a unit. ---- @type SPAWNSTATIC.SpawnZoneTable --- @list SpawnZone - - ---- Creates the main object to spawn a @{Static} defined in the ME. +--- Creates the main object to spawn a @{Static} defined in the mission editor (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. --- @param DCS#country.id SpawnCountryID The ID of the country. --- @param DCS#coalition.side SpawnCoalitionID The ID of the coalition. --- @return #SPAWNSTATIC -function SPAWNSTATIC:NewFromStatic( SpawnTemplatePrefix, SpawnCountryID, SpawnCoalitionID ) +-- @param #string SpawnTemplateName Name of the static object in the ME. Each new static will have the name starting with this prefix. +-- @param DCS#country.id SpawnCountryID (Optional) The ID of the country. +-- @return #SPAWNSTATIC self +function SPAWNSTATIC:NewFromStatic(SpawnTemplateName, SpawnCountryID) + local self = BASE:Inherit( self, BASE:New() ) -- #SPAWNSTATIC - self:F( { SpawnTemplatePrefix } ) - local TemplateStatic, CoalitionID, CategoryID, CountryID = _DATABASE:GetStaticGroupTemplate( SpawnTemplatePrefix ) + local TemplateStatic, CoalitionID, CategoryID, CountryID = _DATABASE:GetStaticGroupTemplate(SpawnTemplateName) + if TemplateStatic then - self.SpawnTemplatePrefix = SpawnTemplatePrefix - self.CountryID = SpawnCountryID or CountryID - self.CategoryID = CategoryID - self.CoalitionID = SpawnCoalitionID or CoalitionID - self.SpawnIndex = 0 + self.SpawnTemplatePrefix = SpawnTemplateName + self.TemplateStaticUnit = UTILS.DeepCopy(TemplateStatic.units[1]) + self.CountryID = SpawnCountryID or CountryID + self.CategoryID = CategoryID + self.CoalitionID = CoalitionID + self.SpawnIndex = 0 else - error( "SPAWNSTATIC:New: There is no static declared in the mission editor with SpawnTemplatePrefix = '" .. SpawnTemplatePrefix .. "'" ) + error( "SPAWNSTATIC:New: There is no static declared in the mission editor with SpawnTemplatePrefix = '" .. tostring(SpawnTemplateName) .. "'" ) end self:SetEventPriority( 5 ) @@ -106,206 +154,260 @@ function SPAWNSTATIC:NewFromStatic( SpawnTemplatePrefix, SpawnCountryID, SpawnCo return self end ---- Creates the main object to spawn a @{Static} based on a type name. +--- Creates the main object to spawn a @{Static} given a template table. -- @param #SPAWNSTATIC self --- @param #string SpawnTypeName is the name of the type. --- @return #SPAWNSTATIC -function SPAWNSTATIC:NewFromType( SpawnTypeName, SpawnShapeName, SpawnCategory, SpawnCountryID, SpawnCoalitionID ) - local self = BASE:Inherit( self, BASE:New() ) -- #SPAWNSTATIC - self:F( { SpawnTypeName } ) - - self.SpawnTypeName = SpawnTypeName - self.CountryID = SpawnCountryID - self.CoalitionID = SpawnCoalitionID - self.SpawnIndex = 0 +-- @param #table SpawnTemplate Template used for spawning. +-- @param DCS#country.id CountryID The ID of the country. Default `country.id.USA`. +-- @return #SPAWNSTATIC self +function SPAWNSTATIC:NewFromTemplate(SpawnTemplate, CountryID) - self:SetEventPriority( 5 ) + local self = BASE:Inherit( self, BASE:New() ) -- #SPAWNSTATIC + + self.TemplateStaticUnit = UTILS.DeepCopy(SpawnTemplate) + self.SpawnTemplatePrefix = SpawnTemplate.name + self.CountryID = CountryID or country.id.USA + + return self +end + +--- Creates the main object to spawn a @{Static} from a given type. +-- NOTE that you have to init many other parameters as spawn coordinate etc. +-- @param #SPAWNSTATIC self +-- @param #string StaticType Type of the static. +-- @param #string StaticCategory Category of the static, e.g. "Planes". +-- @param DCS#country.id CountryID The ID of the country. Default `country.id.USA`. +-- @return #SPAWNSTATIC self +function SPAWNSTATIC:NewFromType(StaticType, StaticCategory, CountryID) + + local self = BASE:Inherit( self, BASE:New() ) -- #SPAWNSTATIC + + self.InitStaticType=StaticType + self.InitStaticCategory=StaticCategory + self.CountryID=CountryID or country.id.USA + self.SpawnTemplatePrefix=self.InitStaticType + + self.InitStaticCoordinate=COORDINATE:New(0, 0, 0) + self.InitStaticHeading=0 return self end - ---- Creates a new @{Static} at the original position. +--- Initialize heading of the spawned static. -- @param #SPAWNSTATIC self --- @param #number Heading The heading of the static, which is a number in degrees from 0 to 360. --- @param #string (optional) The name of the new static. --- @return #SPAWNSTATIC -function SPAWNSTATIC:Spawn( Heading, NewName ) --R2.3 - self:F( { Heading, NewName } ) - - local StaticTemplate, CoalitionID, CategoryID, CountryID = _DATABASE:GetStaticGroupTemplate( self.SpawnTemplatePrefix ) - - if StaticTemplate then - - local StaticUnitTemplate = StaticTemplate.units[1] - - StaticTemplate.name = NewName or string.format("%s#%05d", self.SpawnTemplatePrefix, self.SpawnIndex ) - StaticTemplate.heading = ( Heading / 180 ) * math.pi - - _DATABASE:_RegisterStaticTemplate( StaticTemplate, CoalitionID, CategoryID, CountryID ) - - local Static = coalition.addStaticObject( self.CountryID or CountryID, StaticTemplate.units[1] ) - - self.SpawnIndex = self.SpawnIndex + 1 - - return _DATABASE:FindStatic(Static:getName()) - end - - return nil +-- @param Core.Point#COORDINATE Coordinate Position where the static is spawned. +-- @return #SPAWNSTATIC self +function SPAWNSTATIC:InitCoordinate(Coordinate) + self.InitStaticCoordinate=Coordinate + return self end +--- Initialize heading of the spawned static. +-- @param #SPAWNSTATIC self +-- @param #number Heading The heading in degrees. +-- @return #SPAWNSTATIC self +function SPAWNSTATIC:InitHeading(Heading) + self.InitStaticHeading=Heading + return self +end + +--- Initialize livery of the spawned static. +-- @param #SPAWNSTATIC self +-- @param #string LiveryName Name of the livery to use. +-- @return #SPAWNSTATIC self +function SPAWNSTATIC:InitLivery(LiveryName) + self.InitStaticLivery=LiveryName + return self +end + +--- Initialize type of the spawned static. +-- @param #SPAWNSTATIC self +-- @param #string StaticType Type of the static, e.g. "FA-18C_hornet". +-- @return #SPAWNSTATIC self +function SPAWNSTATIC:InitType(StaticType) + self.InitStaticType=StaticType + return self +end + +--- Initialize shape of the spawned static. Required by some but not all statics. +-- @param #SPAWNSTATIC self +-- @param #string StaticShape Shape of the static, e.g. "carrier_tech_USA". +-- @return #SPAWNSTATIC self +function SPAWNSTATIC:InitShape(StaticShape) + self.InitStaticShape=StaticShape + return self +end + +--- Initialize country of the spawned static. This determines the category. +-- @param #SPAWNSTATIC self +-- @param #string CountryID The country ID, e.g. country.id.USA. +-- @return #SPAWNSTATIC self +function SPAWNSTATIC:InitCountry(CountryID) + self.CountryID=CountryID + return self +end + +--- Initialize name prefix statics get. This will be appended by "#0001", "#0002" etc. +-- @param #SPAWNSTATIC self +-- @param #string NamePrefix Name prefix of statics spawned. Will append #0001, etc to the name. +-- @return #SPAWNSTATIC self +function SPAWNSTATIC:InitNamePrefix(NamePrefix) + self.SpawnTemplatePrefix=NamePrefix + return self +end + +--- Init link to a unit. +-- @param #SPAWNSTATIC self +-- @param Wrapper.Unit#UNIT Unit The unit to which the static is linked. +-- @param #number OffsetX Offset in X. +-- @param #number OffsetY Offset in Y. +-- @param #number OffsetAngle Offset angle in degrees. +-- @return #SPAWNSTATIC self +function SPAWNSTATIC:InitLinkToUnit(Unit, OffsetX, OffsetY, OffsetAngle) + + self.InitLinkUnit=Unit + self.InitOffsetX=OffsetX or 0 + self.InitOffsetY=OffsetY or 0 + self.InitOffsetAngle=OffsetAngle or 0 + + return self +end + +--- Spawn a new STATIC object. +-- @param #SPAWNSTATIC self +-- @param #number Heading (Optional) The heading of the static, which is a number in degrees from 0 to 360. Default is the heading of the template. +-- @param #string NewName (Optional) The name of the new static. +-- @return Wrapper.Static#STATIC The static spawned. +function SPAWNSTATIC:Spawn(Heading, NewName) + + if Heading then + self.InitStaticHeading=Heading + end + + if NewName then + self.InitStaticName=NewName + end + + return self:_SpawnStatic(self.TemplateStaticUnit, self.CountryID) + +end --- Creates a new @{Static} from a POINT_VEC2. -- @param #SPAWNSTATIC self -- @param Core.Point#POINT_VEC2 PointVec2 The 2D coordinate where to spawn the static. -- @param #number Heading The heading of the static, which is a number in degrees from 0 to 360. --- @param #string (optional) The name of the new static. --- @return #SPAWNSTATIC -function SPAWNSTATIC:SpawnFromPointVec2( PointVec2, Heading, NewName ) --R2.1 - self:F( { PointVec2, Heading, NewName } ) - - local StaticTemplate, CoalitionID, CategoryID, CountryID = _DATABASE:GetStaticGroupTemplate( self.SpawnTemplatePrefix ) - - if StaticTemplate then - - local StaticUnitTemplate = StaticTemplate.units[1] - - StaticUnitTemplate.x = PointVec2.x - StaticUnitTemplate.y = PointVec2.z - - StaticTemplate.route = nil - StaticTemplate.groupId = nil - - StaticTemplate.name = NewName or string.format("%s#%05d", self.SpawnTemplatePrefix, self.SpawnIndex ) - StaticUnitTemplate.name = StaticTemplate.name - StaticUnitTemplate.heading = ( Heading / 180 ) * math.pi - - _DATABASE:_RegisterStaticTemplate( StaticTemplate, CoalitionID, CategoryID, CountryID) - - self:F({StaticTemplate = StaticTemplate}) +-- @param #string NewName (Optional) The name of the new static. +-- @return Wrapper.Static#STATIC The static spawned. +function SPAWNSTATIC:SpawnFromPointVec2(PointVec2, Heading, NewName) - local Static = coalition.addStaticObject( self.CountryID or CountryID, StaticTemplate.units[1] ) - - self.SpawnIndex = self.SpawnIndex + 1 - - return _DATABASE:FindStatic(Static:getName()) - end + local vec2={x=PointVec2:GetX(), y=PointVec2:GetY()} + + local Coordinate=COORDINATE:NewFromVec2(vec2) - return nil + return self:SpawnFromCoordinate(Coordinate, Heading, NewName) end --- Creates a new @{Static} from a COORDINATE. -- @param #SPAWNSTATIC self -- @param Core.Point#COORDINATE Coordinate The 3D coordinate where to spawn the static. --- @param #number Heading (Optional) Heading The heading of the static, which is a number in degrees from 0 to 360. Default is 0 degrees. +-- @param #number Heading (Optional) Heading The heading of the static in degrees. Default is 0 degrees. -- @param #string NewName (Optional) The name of the new static. --- @return #SPAWNSTATIC -function SPAWNSTATIC:SpawnFromCoordinate(Coordinate, Heading, NewName) --R2.4 - self:F( { PointVec2, Heading, NewName } ) - - local StaticTemplate, CoalitionID, CategoryID, CountryID = _DATABASE:GetStaticGroupTemplate( self.SpawnTemplatePrefix ) - - if StaticTemplate then - - Heading=Heading or 0 - - local StaticUnitTemplate = StaticTemplate.units[1] - - StaticUnitTemplate.x = Coordinate.x - StaticUnitTemplate.y = Coordinate.z - StaticUnitTemplate.alt = Coordinate.y - - StaticTemplate.route = nil - StaticTemplate.groupId = nil - - StaticTemplate.name = NewName or string.format("%s#%05d", self.SpawnTemplatePrefix, self.SpawnIndex ) - StaticUnitTemplate.name = StaticTemplate.name - StaticUnitTemplate.heading = ( Heading / 180 ) * math.pi - - _DATABASE:_RegisterStaticTemplate( StaticTemplate, CoalitionID, CategoryID, CountryID) - - self:F({StaticTemplate = StaticTemplate}) +-- @return Wrapper.Static#STATIC The spawned STATIC object. +function SPAWNSTATIC:SpawnFromCoordinate(Coordinate, Heading, NewName) - local Static = coalition.addStaticObject( self.CountryID or CountryID, StaticTemplate.units[1] ) - - self.SpawnIndex = self.SpawnIndex + 1 - - return _DATABASE:FindStatic(Static:getName()) + -- Set up coordinate. + self.InitStaticCoordinate=Coordinate + + if Heading then + self.InitStaticHeading=Heading end - return nil -end - - ---- Respawns the original @{Static}. --- @param #SPAWNSTATIC self --- @param #number delay Delay before respawn in seconds. --- @return #SPAWNSTATIC -function SPAWNSTATIC:ReSpawn(delay) - - if delay and delay>0 then - self:ScheduleOnce(delay, SPAWNSTATIC.ReSpawn, self) - else - - local StaticTemplate, CoalitionID, CategoryID, CountryID = _DATABASE:GetStaticGroupTemplate( self.SpawnTemplatePrefix ) - - if StaticTemplate then - - local StaticUnitTemplate = StaticTemplate.units[1] - StaticTemplate.route = nil - StaticTemplate.groupId = nil - - local Static = coalition.addStaticObject( self.CountryID or CountryID, StaticTemplate.units[1] ) - - return _DATABASE:FindStatic(Static:getName()) - end - - return nil + if NewName then + self.InitStaticName=NewName end - - return self -end - ---- Creates the original @{Static} at a POINT_VEC2. --- @param #SPAWNSTATIC self --- @param Core.Point#COORDINATE Coordinate The 2D coordinate where to spawn the static. --- @param #number Heading The heading of the static, which is a number in degrees from 0 to 360. --- @return #SPAWNSTATIC -function SPAWNSTATIC:ReSpawnAt( Coordinate, Heading ) - - local StaticTemplate, CoalitionID, CategoryID, CountryID = _DATABASE:GetStaticGroupTemplate( self.SpawnTemplatePrefix ) - - if StaticTemplate then - - local StaticUnitTemplate = StaticTemplate.units[1] - - StaticUnitTemplate.x = Coordinate.x - StaticUnitTemplate.y = Coordinate.z - - StaticUnitTemplate.heading = Heading and ( ( Heading / 180 ) * math.pi ) or StaticTemplate.heading - - local Static = coalition.addStaticObject( self.CountryID or CountryID, StaticTemplate.units[1] ) - - return _DATABASE:FindStatic(Static:getName()) - end - - return nil + return self:_SpawnStatic(self.TemplateStaticUnit, self.CountryID) end --- Creates a new @{Static} from a @{Zone}. -- @param #SPAWNSTATIC self -- @param Core.Zone#ZONE_BASE Zone The Zone where to spawn the static. --- @param #number Heading The heading of the static, which is a number in degrees from 0 to 360. --- @param #string NewName (optional) The name of the new static. --- @return #SPAWNSTATIC -function SPAWNSTATIC:SpawnFromZone( Zone, Heading, NewName ) --R2.1 - self:F( { Zone, Heading, NewName } ) +-- @param #number Heading (Optional)The heading of the static in degrees. Default is the heading of the template. +-- @param #string NewName (Optional) The name of the new static. +-- @return Wrapper.Static#STATIC The static spawned. +function SPAWNSTATIC:SpawnFromZone(Zone, Heading, NewName) + -- Spawn the new static at the center of the zone. local Static = self:SpawnFromPointVec2( Zone:GetPointVec2(), Heading, NewName ) return Static end +--- Spawns a new static using a given template. Additionally, the country ID needs to be specified, which also determines the coalition of the spawned static. +-- @param #SPAWNSTATIC self +-- @param #SPAWNSTATIC.TemplateData Template Spawn unit template. +-- @param #number CountryID The country ID. +-- @return Wrapper.Static#STATIC The static spawned. +function SPAWNSTATIC:_SpawnStatic(Template, CountryID) + + Template=Template or {} + + local CountryID=CountryID or self.CountryID + + if self.InitStaticType then + Template.type=self.InitStaticType + end + + if self.InitStaticCategory then + Template.category=self.InitStaticCategory + end + + if self.InitStaticCoordinate then + Template.x = self.InitStaticCoordinate.x + Template.y = self.InitStaticCoordinate.z + Template.alt = self.InitStaticCoordinate.y + end + + if self.InitStaticHeading then + Template.heading = math.rad(self.InitStaticHeading) + end + + if self.InitStaticShape then + Template.shape_name=self.InitStaticShape + end + + if self.InitStaticLivery then + Template.livery_id=self.InitStaticLivery + end + + if self.InitDead~=nil then + Template.dead=self.InitDead + end + + if self.InitLinkUnit then + Template.linkUnit=self.InitLinkUnit:GetID() + Template.linkOffset=true + Template.offsets={} + Template.offsets.y=self.InitOffsetY + Template.offsets.x=self.InitOffsetX + Template.offsets.angle=self.InitOffsetAngle and math.rad(self.InitOffsetAngle) or 0 + end + + -- Increase spawn index counter. + self.SpawnIndex = self.SpawnIndex + 1 + + -- Name of the spawned static. + Template.name = self.InitStaticName or string.format("%s#%05d", self.SpawnTemplatePrefix, self.SpawnIndex) + + -- Register the new static. + --_DATABASE:_RegisterStaticTemplate(Template, self.CoalitionID, self.CategoryID, CountryID) + + -- Debug output. + self:T(Template) + + -- Add static to the game. + local Static=coalition.addStaticObject(CountryID, Template) + + return _DATABASE:FindStatic(Static:getName()) +end diff --git a/Moose Development/Moose/Ops/Airboss.lua b/Moose Development/Moose/Ops/Airboss.lua index 83b661678..b990c6c9c 100644 --- a/Moose Development/Moose/Ops/Airboss.lua +++ b/Moose Development/Moose/Ops/Airboss.lua @@ -2624,10 +2624,10 @@ end --- Set time before carrier turns and recovery window opens. -- @param #AIRBOSS self --- @param #number interval Time interval in seconds. Default 600 sec. +-- @param #number interval Time interval in seconds. Default 300 sec. -- @return #AIRBOSS self function AIRBOSS:SetRecoveryTurnTime(interval) - self.dTturn=interval or 600 + self.dTturn=interval or 300 return self end diff --git a/Moose Development/Moose/Utilities/Utils.lua b/Moose Development/Moose/Utilities/Utils.lua index bdaee2a5f..f5bb7def9 100644 --- a/Moose Development/Moose/Utilities/Utils.lua +++ b/Moose Development/Moose/Utilities/Utils.lua @@ -1045,12 +1045,13 @@ function UTILS.GetDCSMissionDate() end --- Returns the day of the mission. +-- @param #number Time (Optional) Abs. time in seconds. Default now, i.e. the value return from timer.getAbsTime(). -- @return #number Day of the mission. Mission starts on day 0. -function UTILS.GetMissionDay() +function UTILS.GetMissionDay(Time) - local time=timer.getAbsTime() + Time=Time or timer.getAbsTime() - local clock=UTILS.SecondsToClock(time, false) + local clock=UTILS.SecondsToClock(Time, false) local x=tonumber(UTILS.Split(clock, "+")[2]) @@ -1058,12 +1059,13 @@ function UTILS.GetMissionDay() end --- Returns the current day of the year of the mission. +-- @param #number Time (Optional) Abs. time in seconds. Default now, i.e. the value return from timer.getAbsTime(). -- @return #number Current day of year of the mission. For example, January 1st returns 0, January 2nd returns 1 etc. -function UTILS.GetMissionDayOfYear() +function UTILS.GetMissionDayOfYear(Time) local Date, Year, Month, Day=UTILS.GetDCSMissionDate() - local d=UTILS.GetMissionDay() + local d=UTILS.GetMissionDay(Time) return UTILS.GetDayOfYear(Year, Month, Day)+d diff --git a/Moose Development/Moose/Wrapper/Static.lua b/Moose Development/Moose/Wrapper/Static.lua index 9df2fd594..8377d9803 100644 --- a/Moose Development/Moose/Wrapper/Static.lua +++ b/Moose Development/Moose/Wrapper/Static.lua @@ -194,7 +194,7 @@ end -- @param Core.Point#COORDINATE Coordinate The coordinate where to spawn the new Static. -- @param #number Heading The heading of the static respawn in degrees. Default is 0 deg. -- @param #number Delay Delay in seconds before the static is spawned. -function STATIC:SpawnAt( Coordinate, Heading, Delay ) +function STATIC:SpawnAt(Coordinate, Heading, Delay) Heading=Heading or 0 @@ -202,51 +202,58 @@ function STATIC:SpawnAt( Coordinate, Heading, Delay ) SCHEDULER:New(nil, self.SpawnAt, {self, Coordinate, Heading}, Delay) else - local SpawnStatic = SPAWNSTATIC:NewFromStatic( self.StaticName ) + local SpawnStatic=SPAWNSTATIC:NewFromStatic(self.StaticName) SpawnStatic:SpawnFromPointVec2( Coordinate, Heading, self.StaticName ) end + + return self end --- Respawn the @{Wrapper.Unit} at the same location with the same properties. -- This is useful to respawn a cargo after it has been destroyed. -- @param #STATIC self --- @param DCS#country.id countryid The country ID used for spawning the new static. Default is same as currently. --- @param #number Delay Delay in seconds before static is respawned. -function STATIC:ReSpawn(countryid, Delay) - - countryid=countryid or self:GetCountry() +-- @param DCS#country.id CountryID (Optional) The country ID used for spawning the new static. Default is same as currently. +-- @param #number Delay (Optional) Delay in seconds before static is respawned. Default now. +function STATIC:ReSpawn(CountryID, Delay) if Delay and Delay>0 then - SCHEDULER:New(nil, self.ReSpawn, {self, countryid}, Delay) + SCHEDULER:New(nil, self.ReSpawn, {self, CountryID}, Delay) else - local SpawnStatic = SPAWNSTATIC:NewFromStatic( self.StaticName, countryid ) + CountryID=CountryID or self:GetCountry() + + local SpawnStatic=SPAWNSTATIC:NewFromStatic(self.StaticName, CountryID) - SpawnStatic:ReSpawn() + SpawnStatic:Spawn(nil, self.StaticName) end + + return self end --- Respawn the @{Wrapper.Unit} at a defined Coordinate with an optional heading. -- @param #STATIC self -- @param Core.Point#COORDINATE Coordinate The coordinate where to spawn the new Static. --- @param #number Heading The heading of the static respawn in degrees. Default is 0 deg. --- @param #number Delay Delay in seconds before static is respawned. -function STATIC:ReSpawnAt( Coordinate, Heading, Delay ) +-- @param #number Heading (Optional) The heading of the static respawn in degrees. Default the current heading. +-- @param #number Delay (Optional) Delay in seconds before static is respawned. Default now. +function STATIC:ReSpawnAt(Coordinate, Heading, Delay) - Heading=Heading or 0 + --Heading=Heading or 0 if Delay and Delay>0 then SCHEDULER:New(nil, self.ReSpawnAt, {self, Coordinate, Heading}, Delay) else - local SpawnStatic = SPAWNSTATIC:NewFromStatic( self.StaticName ) + local SpawnStatic=SPAWNSTATIC:NewFromStatic(self.StaticName, self:GetCountry()) + + SpawnStatic:SpawnFromCoordinate(Coordinate, Heading, self.StaticName) - SpawnStatic:ReSpawnAt( Coordinate, Heading ) end + + return self end