From 04a9dc3a8c14cc1dbfa0de1328c3f7d32e50a272 Mon Sep 17 00:00:00 2001 From: Applevangelist Date: Thu, 13 Jul 2023 16:13:00 +0200 Subject: [PATCH] #SPAWN * Added method to init spawn position --- Moose Development/Moose/Core/Spawn.lua | 113 +++++++++++++++++++++++-- 1 file changed, 104 insertions(+), 9 deletions(-) diff --git a/Moose Development/Moose/Core/Spawn.lua b/Moose Development/Moose/Core/Spawn.lua index df22111c3..95719aa9e 100644 --- a/Moose Development/Moose/Core/Spawn.lua +++ b/Moose Development/Moose/Core/Spawn.lua @@ -162,7 +162,17 @@ -- ### Array formation -- -- * @{#SPAWN.InitArray}(): Make groups visible before they are actually activated, and order these groups like a battalion in an array. --- +-- +-- ### Group initial position - if wanted different from template position, for use with e.g. @{#SPAWN.SpawnScheduled}(). +-- +-- * @{#SPAWN.InitPositionCoordinate}(): Set initial position of group via a COORDINATE. +-- * @{#SPAWN.InitPositionVec2}(): Set initial position of group via a VEC2. +-- +-- ### Set the positions of a group's units to absolute positions, or relative positions to unit No. 1 +-- +-- * @{#SPAWN.InitSetUnitRelativePositions}(): Spawn the UNITs of this group with individual relative positions to unit #1 and individual headings. +-- * @{#SPAWN.InitSetUnitAbsolutePositions}(): Spawn the UNITs of this group with individual absolute positions and individual headings. +-- -- ### Position randomization -- -- * @{#SPAWN.InitRandomizePosition}(): Randomizes the position of @{Wrapper.Group}s that are spawned within a **radius band**, given an Outer and Inner radius, from the point that the spawn happens. @@ -268,7 +278,7 @@ SPAWN = { -- @type SPAWN.Takeoff -- @extends Wrapper.Group#GROUP.Takeoff ---- @field #SPAWN.Takeoff Takeoff +-- @field #SPAWN.Takeoff Takeoff SPAWN.Takeoff = { Air = 1, Runway = 2, @@ -276,7 +286,7 @@ SPAWN.Takeoff = { Cold = 4, } ---- @type SPAWN.SpawnZoneTable +-- @type SPAWN.SpawnZoneTable -- @list SpawnZone --- Creates the main object to spawn a @{Wrapper.Group} defined in the DCS ME. @@ -1047,7 +1057,7 @@ end --- This method provides the functionality to randomize the spawning of the Groups at a given list of zones of different types. -- @param #SPAWN self -- @param #table SpawnZoneTable A table with @{Core.Zone} objects. If this table is given, then each spawn will be executed within the given list of @{Core.Zone}s objects. --- @return #SPAWN +-- @return #SPAWN self -- @usage -- -- -- Create a zone table of the 2 zones. @@ -1077,6 +1087,31 @@ function SPAWN:InitRandomizeZones( SpawnZoneTable ) return self end +--- This method sets a spawn position for the group that is different from the location of the template. +-- @param #SPAWN self +-- @param Core.Point#COORDINATE Coordinate The position to spawn from +-- @return #SPAWN self +function SPAWN:InitPositionCoordinate(Coordinate) + self:T( { self.SpawnTemplatePrefix, Coordinate:GetVec2()} ) + self:InitPositionVec2(Coordinate:GetVec2()) + return self +end + +--- This method sets a spawn position for the group that is different from the location of the template. +-- @param #SPAWN self +-- @param DCS#Vec2 Vec2 The position to spawn from +-- @return #SPAWN self +function SPAWN:InitPositionVec2(Vec2) + self:T( { self.SpawnTemplatePrefix, Vec2} ) + self.SpawnInitPosition = Vec2 + self.SpawnFromNewPosition = true + self:I("MaxGroups:"..self.SpawnMaxGroups) + for SpawnGroupID = 1, self.SpawnMaxGroups do + self:_SetInitialPosition( SpawnGroupID ) + end + return self +end + --- 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 method 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... @@ -1376,7 +1411,12 @@ function SPAWN:SpawnWithIndex( SpawnIndex, NoBirth ) self:F2( { SpawnTemplatePrefix = self.SpawnTemplatePrefix, SpawnIndex = SpawnIndex, AliveUnits = self.AliveUnits, SpawnMaxGroups = self.SpawnMaxGroups } ) if self:_GetSpawnIndex( SpawnIndex ) then - + + if self.SpawnFromNewPosition then + self:_SetInitialPosition( SpawnIndex ) + end + + if self.SpawnGroups[self.SpawnIndex].Visible then self.SpawnGroups[self.SpawnIndex].Group:Activate() else @@ -1614,7 +1654,7 @@ end -- @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 % of variation to be applied on the time interval. --- @param #boolen WithDelay Do not spawn the **first** group immediately, but delay the spawn as per the calculation below. +-- @param #boolean WithDelay Do not spawn the **first** group immediately, but delay the spawn as per the calculation below. -- Effectively the same as @{InitDelayOn}(). -- @return #SPAWN self -- @usage @@ -3127,7 +3167,11 @@ function SPAWN:_GetTemplate( SpawnTemplatePrefix ) self:F( { self.SpawnTemplatePrefix, self.SpawnAliasPrefix, SpawnTemplatePrefix } ) local SpawnTemplate = nil - + + if _DATABASE.Templates.Groups[SpawnTemplatePrefix] == nil then + error( 'No Template exists for SpawnTemplatePrefix = ' .. SpawnTemplatePrefix ) + end + local Template = _DATABASE.Templates.Groups[SpawnTemplatePrefix].Template self:F( { Template = Template } ) @@ -3296,6 +3340,57 @@ function SPAWN:_RandomizeTemplate( SpawnIndex ) return self end +--- Private method that sets the DCS#Vec2 where the Group will be spawned. +-- @param #SPAWN self +-- @param #number SpawnIndex +-- @return #SPAWN self +function SPAWN:_SetInitialPosition( SpawnIndex ) + self:T( { self.SpawnTemplatePrefix, SpawnIndex, self.SpawnRandomizeZones } ) + + if self.SpawnFromNewPosition then + + self:T( "Preparing Spawn at Vec2 ", self.SpawnInitPosition ) + + local SpawnVec2 = self.SpawnInitPosition + + self:T( { SpawnVec2 = SpawnVec2 } ) + + local SpawnTemplate = self.SpawnGroups[SpawnIndex].SpawnTemplate + + SpawnTemplate.route = SpawnTemplate.route or {} + SpawnTemplate.route.points = SpawnTemplate.route.points or {} + SpawnTemplate.route.points[1] = SpawnTemplate.route.points[1] or {} + SpawnTemplate.route.points[1].x = SpawnTemplate.route.points[1].x or 0 + SpawnTemplate.route.points[1].y = SpawnTemplate.route.points[1].y or 0 + + self:T( { Route = SpawnTemplate.route } ) + + for UnitID = 1, #SpawnTemplate.units do + local UnitTemplate = SpawnTemplate.units[UnitID] + self:T( 'Before Translation SpawnTemplate.units[' .. UnitID .. '].x = ' .. UnitTemplate.x .. ', SpawnTemplate.units[' .. UnitID .. '].y = ' .. UnitTemplate.y ) + local SX = UnitTemplate.x + local SY = UnitTemplate.y + local BX = SpawnTemplate.route.points[1].x + local BY = SpawnTemplate.route.points[1].y + local TX = SpawnVec2.x + (SX - BX) + local TY = SpawnVec2.y + (SY - BY) + UnitTemplate.x = TX + UnitTemplate.y = TY + -- TODO: Manage altitude based on landheight... + -- SpawnTemplate.units[UnitID].alt = SpawnVec2: + self:T( 'After Translation SpawnTemplate.units[' .. UnitID .. '].x = ' .. UnitTemplate.x .. ', SpawnTemplate.units[' .. UnitID .. '].y = ' .. UnitTemplate.y ) + end + + SpawnTemplate.route.points[1].x = SpawnVec2.x + SpawnTemplate.route.points[1].y = SpawnVec2.y + SpawnTemplate.x = SpawnVec2.x + SpawnTemplate.y = SpawnVec2.y + + end + + return self +end + --- Private method that randomizes the @{Core.Zone}s where the Group will be spawned. -- @param #SPAWN self -- @param #number SpawnIndex @@ -3415,7 +3510,7 @@ end -- TODO Need to delete this... _DATABASE does this now ... ---- @param #SPAWN self +-- @param #SPAWN self -- @param Core.Event#EVENTDATA EventData function SPAWN:_OnBirth( EventData ) self:F( self.SpawnTemplatePrefix ) @@ -3435,7 +3530,7 @@ function SPAWN:_OnBirth( EventData ) end ---- @param #SPAWN self +-- @param #SPAWN self -- @param Core.Event#EVENTDATA EventData function SPAWN:_OnDeadOrCrash( EventData ) self:F( self.SpawnTemplatePrefix )