diff --git a/Moose Development/Moose/Functional/Spawn.lua b/Moose Development/Moose/Functional/Spawn.lua index 6a99bdc11..6c85e097f 100644 --- a/Moose Development/Moose/Functional/Spawn.lua +++ b/Moose Development/Moose/Functional/Spawn.lua @@ -1156,6 +1156,8 @@ function SPAWN:SpawnFromVec3( Vec3, SpawnIndex ) if SpawnTemplate then self:T( { "Current point of ", self.SpawnTemplatePrefix, Vec3 } ) + + local TemplateHeight = SpawnTemplate.route.points[1].alt -- Translate the position of the Group Template to the Vec3. for UnitID = 1, #SpawnTemplate.units do @@ -1169,16 +1171,17 @@ function SPAWN:SpawnFromVec3( Vec3, SpawnIndex ) local TY = Vec3.z + ( SY - BY ) SpawnTemplate.units[UnitID].x = TX SpawnTemplate.units[UnitID].y = TY - SpawnTemplate.units[UnitID].alt = Vec3.y + SpawnTemplate.units[UnitID].alt = Vec3.y or TemplateHeight self:T( 'After Translation SpawnTemplate.units['..UnitID..'].x = ' .. SpawnTemplate.units[UnitID].x .. ', SpawnTemplate.units['..UnitID..'].y = ' .. SpawnTemplate.units[UnitID].y ) end SpawnTemplate.route.points[1].x = Vec3.x SpawnTemplate.route.points[1].y = Vec3.z - SpawnTemplate.route.points[1].alt = Vec3.y + SpawnTemplate.route.points[1].alt = Vec3.y or TemplateHeight SpawnTemplate.x = Vec3.x SpawnTemplate.y = Vec3.z + SpawnTemplate.alt = Vec3.y or TemplateHeight return self:SpawnWithIndex( self.SpawnIndex ) end @@ -1193,14 +1196,31 @@ end -- You can use the returned group to further define the route to be followed. -- @param #SPAWN self -- @param Dcs.DCSTypes#Vec2 Vec2 The Vec2 coordinates where to spawn the group. +-- @param #number MinHeight (optional) The minimum height to spawn an airborne group into the zone. +-- @param #number MaxHeight (optional) The maximum height to spawn an airborne group into the zone. -- @param #number SpawnIndex (optional) The index which group to spawn within the given zone. -- @return Wrapper.Group#GROUP that was spawned. -- @return #nil Nothing was spawned. -function SPAWN:SpawnFromVec2( Vec2, SpawnIndex ) - self:F( { self.SpawnTemplatePrefix, Vec2, SpawnIndex } ) +-- @usage +-- +-- local SpawnVec2 = ZONE:New( ZoneName ):GetVec2() +-- +-- -- Spawn at the zone center position at the height specified in the ME of the group template! +-- SpawnAirplanes:SpawnFromVec2( SpawnVec2 ) +-- +-- -- Spawn from the static position at the height randomized between 2000 and 4000 meters. +-- SpawnAirplanes:SpawnFromVec2( SpawnVec2, 2000, 4000 ) +-- +function SPAWN:SpawnFromVec2( Vec2, MinHeight, MaxHeight, SpawnIndex ) + self:F( { self.SpawnTemplatePrefix, self.SpawnIndex, Vec2, MinHeight, MaxHeight, SpawnIndex } ) + + local Height = nil - local PointVec2 = POINT_VEC2:NewFromVec2( Vec2 ) - return self:SpawnFromVec3( PointVec2:GetVec3(), SpawnIndex ) + if MinHeight and MaxHeight then + Height = math.random( MinHeight, MaxHeight) + end + + return self:SpawnFromVec3( { x = Vec2.x, y = Height, z = Vec2.y }, SpawnIndex ) -- y can be nil. In this case, spawn on the ground for vehicles, and in the template altitude for air. end @@ -1209,14 +1229,26 @@ end -- You can use the returned group to further define the route to be followed. -- @param #SPAWN self -- @param Wrapper.Unit#UNIT HostUnit The air or ground unit dropping or unloading the group. +-- @param #number MinHeight (optional) The minimum height to spawn an airborne group into the zone. +-- @param #number MaxHeight (optional) The maximum height to spawn an airborne group into the zone. -- @param #number SpawnIndex (optional) The index which group to spawn within the given zone. -- @return Wrapper.Group#GROUP that was spawned. -- @return #nil Nothing was spawned. -function SPAWN:SpawnFromUnit( HostUnit, SpawnIndex ) - self:F( { self.SpawnTemplatePrefix, HostUnit, SpawnIndex } ) +-- @usage +-- +-- local SpawnStatic = STATIC:FindByName( StaticName ) +-- +-- -- Spawn from the static position at the height specified in the ME of the group template! +-- SpawnAirplanes:SpawnFromUnit( SpawnStatic ) +-- +-- -- Spawn from the static position at the height randomized between 2000 and 4000 meters. +-- SpawnAirplanes:SpawnFromUnit( SpawnStatic, 2000, 4000 ) +-- +function SPAWN:SpawnFromUnit( HostUnit, MinHeight, MaxHeight, SpawnIndex ) + self:F( { self.SpawnTemplatePrefix, HostUnit, MinHeight, MaxHeight, SpawnIndex } ) if HostUnit and HostUnit:IsAlive() ~= nil then -- and HostUnit:getUnit(1):inAir() == false then - return self:SpawnFromVec3( HostUnit:GetVec3(), SpawnIndex ) + return self:SpawnFromVec2( HostUnit:GetVec2(), MinHeight, MaxHeight, SpawnIndex ) end return nil @@ -1226,14 +1258,26 @@ end -- You can use the returned group to further define the route to be followed. -- @param #SPAWN self -- @param Wrapper.Static#STATIC HostStatic The static dropping or unloading the group. +-- @param #number MinHeight (optional) The minimum height to spawn an airborne group into the zone. +-- @param #number MaxHeight (optional) The maximum height to spawn an airborne group into the zone. -- @param #number SpawnIndex (optional) The index which group to spawn within the given zone. -- @return Wrapper.Group#GROUP that was spawned. -- @return #nil Nothing was spawned. -function SPAWN:SpawnFromStatic( HostStatic, SpawnIndex ) - self:F( { self.SpawnTemplatePrefix, HostStatic, SpawnIndex } ) +-- @usage +-- +-- local SpawnStatic = STATIC:FindByName( StaticName ) +-- +-- -- Spawn from the static position at the height specified in the ME of the group template! +-- SpawnAirplanes:SpawnFromStatic( SpawnStatic ) +-- +-- -- Spawn from the static position at the height randomized between 2000 and 4000 meters. +-- SpawnAirplanes:SpawnFromStatic( SpawnStatic, 2000, 4000 ) +-- +function SPAWN:SpawnFromStatic( HostStatic, MinHeight, MaxHeight, SpawnIndex ) + self:F( { self.SpawnTemplatePrefix, HostStatic, MinHeight, MaxHeight, SpawnIndex } ) if HostStatic and HostStatic:IsAlive() then - return self:SpawnFromVec3( HostStatic:GetVec3(), SpawnIndex ) + return self:SpawnFromVec2( HostStatic:GetVec2(), MinHeight, MaxHeight, SpawnIndex ) end return nil @@ -1246,17 +1290,38 @@ end -- @param #SPAWN self -- @param Core.Zone#ZONE Zone The zone where the group is to be spawned. -- @param #boolean RandomizeGroup (optional) Randomization of the @{Group} position in the zone. +-- @param #number MinHeight (optional) The minimum height to spawn an airborne group into the zone. +-- @param #number MaxHeight (optional) The maximum height to spawn an airborne group into the zone. -- @param #number SpawnIndex (optional) The index which group to spawn within the given zone. -- @return Wrapper.Group#GROUP that was spawned. -- @return #nil when nothing was spawned. -function SPAWN:SpawnInZone( Zone, RandomizeGroup, SpawnIndex ) - self:F( { self.SpawnTemplatePrefix, Zone, RandomizeGroup, SpawnIndex } ) +-- @usage +-- +-- local SpawnZone = ZONE:New( ZoneName ) +-- +-- -- Spawn at the zone center position at the height specified in the ME of the group template! +-- SpawnAirplanes:SpawnFromZone( SpawnZone ) +-- +-- -- Spawn in the zone at a random position at the height specified in the Me of the group template. +-- SpawnAirplanes:SpawnFromZone( SpawnZone, true ) +-- +-- -- Spawn in the zone at a random position at the height randomized between 2000 and 4000 meters. +-- SpawnAirplanes:SpawnFromUnit( SpawnZone, true, 2000, 4000 ) +-- +-- -- Spawn at the zone center position at the height randomized between 2000 and 4000 meters. +-- SpawnAirplanes:SpawnFromUnit( SpawnZone, false, 2000, 4000 ) +-- +-- -- Spawn at the zone center position at the height randomized between 2000 and 4000 meters. +-- SpawnAirplanes:SpawnFromUnit( SpawnZone, nil, 2000, 4000 ) +-- +function SPAWN:SpawnInZone( Zone, RandomizeGroup, MinHeight, MaxHeight, SpawnIndex ) + self:F( { self.SpawnTemplatePrefix, Zone, RandomizeGroup, MinHeight, MaxHeight, SpawnIndex } ) if Zone then if RandomizeGroup then - return self:SpawnFromVec2( Zone:GetRandomVec2(), SpawnIndex ) + return self:SpawnFromVec2( Zone:GetRandomVec2(), MinHeight, MaxHeight, SpawnIndex ) else - return self:SpawnFromVec2( Zone:GetVec2(), SpawnIndex ) + return self:SpawnFromVec2( Zone:GetVec2(), MinHeight, MaxHeight, SpawnIndex ) end end diff --git a/Moose Mission Setup/Moose.lua b/Moose Mission Setup/Moose.lua index f665061a9..6a30138f7 100644 --- a/Moose Mission Setup/Moose.lua +++ b/Moose Mission Setup/Moose.lua @@ -1,5 +1,5 @@ env.info( '*** MOOSE STATIC INCLUDE START *** ' ) -env.info( 'Moose Generation Timestamp: 20171010_1153' ) +env.info( 'Moose Generation Timestamp: 20171026_1856' ) --- Various routines -- @module routines @@ -28771,6 +28771,8 @@ function SPAWN:SpawnFromVec3( Vec3, SpawnIndex ) if SpawnTemplate then self:T( { "Current point of ", self.SpawnTemplatePrefix, Vec3 } ) + + local TemplateHeight = SpawnTemplate.route.points[1].alt -- Translate the position of the Group Template to the Vec3. for UnitID = 1, #SpawnTemplate.units do @@ -28784,16 +28786,17 @@ function SPAWN:SpawnFromVec3( Vec3, SpawnIndex ) local TY = Vec3.z + ( SY - BY ) SpawnTemplate.units[UnitID].x = TX SpawnTemplate.units[UnitID].y = TY - SpawnTemplate.units[UnitID].alt = Vec3.y + SpawnTemplate.units[UnitID].alt = Vec3.y or TemplateHeight self:T( 'After Translation SpawnTemplate.units['..UnitID..'].x = ' .. SpawnTemplate.units[UnitID].x .. ', SpawnTemplate.units['..UnitID..'].y = ' .. SpawnTemplate.units[UnitID].y ) end SpawnTemplate.route.points[1].x = Vec3.x SpawnTemplate.route.points[1].y = Vec3.z - SpawnTemplate.route.points[1].alt = Vec3.y + SpawnTemplate.route.points[1].alt = Vec3.y or TemplateHeight SpawnTemplate.x = Vec3.x SpawnTemplate.y = Vec3.z + SpawnTemplate.alt = Vec3.y or TemplateHeight return self:SpawnWithIndex( self.SpawnIndex ) end @@ -28808,14 +28811,31 @@ end -- You can use the returned group to further define the route to be followed. -- @param #SPAWN self -- @param Dcs.DCSTypes#Vec2 Vec2 The Vec2 coordinates where to spawn the group. +-- @param #number MinHeight (optional) The minimum height to spawn an airborne group into the zone. +-- @param #number MaxHeight (optional) The maximum height to spawn an airborne group into the zone. -- @param #number SpawnIndex (optional) The index which group to spawn within the given zone. -- @return Wrapper.Group#GROUP that was spawned. -- @return #nil Nothing was spawned. -function SPAWN:SpawnFromVec2( Vec2, SpawnIndex ) - self:F( { self.SpawnTemplatePrefix, Vec2, SpawnIndex } ) +-- @usage +-- +-- local SpawnVec2 = ZONE:New( ZoneName ):GetVec2() +-- +-- -- Spawn at the zone center position at the height specified in the ME of the group template! +-- SpawnAirplanes:SpawnFromVec2( SpawnVec2 ) +-- +-- -- Spawn from the static position at the height randomized between 2000 and 4000 meters. +-- SpawnAirplanes:SpawnFromVec2( SpawnVec2, 2000, 4000 ) +-- +function SPAWN:SpawnFromVec2( Vec2, MinHeight, MaxHeight, SpawnIndex ) + self:F( { self.SpawnTemplatePrefix, self.SpawnIndex, Vec2, MinHeight, MaxHeight, SpawnIndex } ) - local PointVec2 = POINT_VEC2:NewFromVec2( Vec2 ) - return self:SpawnFromVec3( PointVec2:GetVec3(), SpawnIndex ) + local Height = nil + + if MinHeight and MaxHeight then + Height = math.random( MinHeight, MaxHeight) + end + + return self:SpawnFromVec3( { x = Vec2.x, y = Height, z = Vec2.y }, SpawnIndex ) -- y can be nil. In this case, spawn on the ground for vehicles, and in the template altitude for air. end @@ -28824,14 +28844,26 @@ end -- You can use the returned group to further define the route to be followed. -- @param #SPAWN self -- @param Wrapper.Unit#UNIT HostUnit The air or ground unit dropping or unloading the group. +-- @param #number MinHeight (optional) The minimum height to spawn an airborne group into the zone. +-- @param #number MaxHeight (optional) The maximum height to spawn an airborne group into the zone. -- @param #number SpawnIndex (optional) The index which group to spawn within the given zone. -- @return Wrapper.Group#GROUP that was spawned. -- @return #nil Nothing was spawned. -function SPAWN:SpawnFromUnit( HostUnit, SpawnIndex ) - self:F( { self.SpawnTemplatePrefix, HostUnit, SpawnIndex } ) +-- @usage +-- +-- local SpawnStatic = STATIC:FindByName( StaticName ) +-- +-- -- Spawn from the static position at the height specified in the ME of the group template! +-- SpawnAirplanes:SpawnFromUnit( SpawnStatic ) +-- +-- -- Spawn from the static position at the height randomized between 2000 and 4000 meters. +-- SpawnAirplanes:SpawnFromUnit( SpawnStatic, 2000, 4000 ) +-- +function SPAWN:SpawnFromUnit( HostUnit, MinHeight, MaxHeight, SpawnIndex ) + self:F( { self.SpawnTemplatePrefix, HostUnit, MinHeight, MaxHeight, SpawnIndex } ) if HostUnit and HostUnit:IsAlive() ~= nil then -- and HostUnit:getUnit(1):inAir() == false then - return self:SpawnFromVec3( HostUnit:GetVec3(), SpawnIndex ) + return self:SpawnFromVec2( HostUnit:GetVec2(), MinHeight, MaxHeight, SpawnIndex ) end return nil @@ -28841,14 +28873,26 @@ end -- You can use the returned group to further define the route to be followed. -- @param #SPAWN self -- @param Wrapper.Static#STATIC HostStatic The static dropping or unloading the group. +-- @param #number MinHeight (optional) The minimum height to spawn an airborne group into the zone. +-- @param #number MaxHeight (optional) The maximum height to spawn an airborne group into the zone. -- @param #number SpawnIndex (optional) The index which group to spawn within the given zone. -- @return Wrapper.Group#GROUP that was spawned. -- @return #nil Nothing was spawned. -function SPAWN:SpawnFromStatic( HostStatic, SpawnIndex ) - self:F( { self.SpawnTemplatePrefix, HostStatic, SpawnIndex } ) +-- @usage +-- +-- local SpawnStatic = STATIC:FindByName( StaticName ) +-- +-- -- Spawn from the static position at the height specified in the ME of the group template! +-- SpawnAirplanes:SpawnFromStatic( SpawnStatic ) +-- +-- -- Spawn from the static position at the height randomized between 2000 and 4000 meters. +-- SpawnAirplanes:SpawnFromStatic( SpawnStatic, 2000, 4000 ) +-- +function SPAWN:SpawnFromStatic( HostStatic, MinHeight, MaxHeight, SpawnIndex ) + self:F( { self.SpawnTemplatePrefix, HostStatic, MinHeight, MaxHeight, SpawnIndex } ) if HostStatic and HostStatic:IsAlive() then - return self:SpawnFromVec3( HostStatic:GetVec3(), SpawnIndex ) + return self:SpawnFromVec2( HostStatic:GetVec2(), MinHeight, MaxHeight, SpawnIndex ) end return nil @@ -28861,17 +28905,38 @@ end -- @param #SPAWN self -- @param Core.Zone#ZONE Zone The zone where the group is to be spawned. -- @param #boolean RandomizeGroup (optional) Randomization of the @{Group} position in the zone. +-- @param #number MinHeight (optional) The minimum height to spawn an airborne group into the zone. +-- @param #number MaxHeight (optional) The maximum height to spawn an airborne group into the zone. -- @param #number SpawnIndex (optional) The index which group to spawn within the given zone. -- @return Wrapper.Group#GROUP that was spawned. -- @return #nil when nothing was spawned. -function SPAWN:SpawnInZone( Zone, RandomizeGroup, SpawnIndex ) - self:F( { self.SpawnTemplatePrefix, Zone, RandomizeGroup, SpawnIndex } ) +-- @usage +-- +-- local SpawnZone = ZONE:New( ZoneName ) +-- +-- -- Spawn at the zone center position at the height specified in the ME of the group template! +-- SpawnAirplanes:SpawnFromZone( SpawnZone ) +-- +-- -- Spawn in the zone at a random position at the height specified in the Me of the group template. +-- SpawnAirplanes:SpawnFromZone( SpawnZone, true ) +-- +-- -- Spawn in the zone at a random position at the height randomized between 2000 and 4000 meters. +-- SpawnAirplanes:SpawnFromUnit( SpawnZone, true, 2000, 4000 ) +-- +-- -- Spawn at the zone center position at the height randomized between 2000 and 4000 meters. +-- SpawnAirplanes:SpawnFromUnit( SpawnZone, false, 2000, 4000 ) +-- +-- -- Spawn at the zone center position at the height randomized between 2000 and 4000 meters. +-- SpawnAirplanes:SpawnFromUnit( SpawnZone, nil, 2000, 4000 ) +-- +function SPAWN:SpawnInZone( Zone, RandomizeGroup, MinHeight, MaxHeight, SpawnIndex ) + self:F( { self.SpawnTemplatePrefix, Zone, RandomizeGroup, MinHeight, MaxHeight, SpawnIndex } ) if Zone then if RandomizeGroup then - return self:SpawnFromVec2( Zone:GetRandomVec2(), SpawnIndex ) + return self:SpawnFromVec2( Zone:GetRandomVec2(), MinHeight, MaxHeight, SpawnIndex ) else - return self:SpawnFromVec2( Zone:GetVec2(), SpawnIndex ) + return self:SpawnFromVec2( Zone:GetVec2(), MinHeight, MaxHeight, SpawnIndex ) end end diff --git a/Moose Mission Setup/Moose_.lua b/Moose Mission Setup/Moose_.lua index 82b7f5abe..454da58a0 100644 --- a/Moose Mission Setup/Moose_.lua +++ b/Moose Mission Setup/Moose_.lua @@ -1,5 +1,5 @@ env.info('*** MOOSE STATIC INCLUDE START *** ') -env.info('Moose Generation Timestamp: 20171010_1153') +env.info('Moose Generation Timestamp: 20171026_1856') env.setErrorMessageBoxEnabled(false) routines={} routines.majorVersion=3 @@ -13942,6 +13942,7 @@ if self:_GetSpawnIndex(SpawnIndex)then local SpawnTemplate=self.SpawnGroups[self.SpawnIndex].SpawnTemplate if SpawnTemplate then self:T({"Current point of ",self.SpawnTemplatePrefix,Vec3}) +local TemplateHeight=SpawnTemplate.route.points[1].alt for UnitID=1,#SpawnTemplate.units do self:T('Before Translation SpawnTemplate.units['..UnitID..'].x = '..SpawnTemplate.units[UnitID].x..', SpawnTemplate.units['..UnitID..'].y = '..SpawnTemplate.units[UnitID].y) local UnitTemplate=SpawnTemplate.units[UnitID] @@ -13953,45 +13954,49 @@ local TX=Vec3.x+(SX-BX) local TY=Vec3.z+(SY-BY) SpawnTemplate.units[UnitID].x=TX SpawnTemplate.units[UnitID].y=TY -SpawnTemplate.units[UnitID].alt=Vec3.y +SpawnTemplate.units[UnitID].alt=Vec3.y or TemplateHeight self:T('After Translation SpawnTemplate.units['..UnitID..'].x = '..SpawnTemplate.units[UnitID].x..', SpawnTemplate.units['..UnitID..'].y = '..SpawnTemplate.units[UnitID].y) end SpawnTemplate.route.points[1].x=Vec3.x SpawnTemplate.route.points[1].y=Vec3.z -SpawnTemplate.route.points[1].alt=Vec3.y +SpawnTemplate.route.points[1].alt=Vec3.y or TemplateHeight SpawnTemplate.x=Vec3.x SpawnTemplate.y=Vec3.z +SpawnTemplate.alt=Vec3.y or TemplateHeight return self:SpawnWithIndex(self.SpawnIndex) end end return nil end -function SPAWN:SpawnFromVec2(Vec2,SpawnIndex) -self:F({self.SpawnTemplatePrefix,Vec2,SpawnIndex}) -local PointVec2=POINT_VEC2:NewFromVec2(Vec2) -return self:SpawnFromVec3(PointVec2:GetVec3(),SpawnIndex) +function SPAWN:SpawnFromVec2(Vec2,MinHeight,MaxHeight,SpawnIndex) +self:F({self.SpawnTemplatePrefix,self.SpawnIndex,Vec2,MinHeight,MaxHeight,SpawnIndex}) +local Height=nil +if MinHeight and MaxHeight then +Height=math.random(MinHeight,MaxHeight) +end +return self:SpawnFromVec3({x=Vec2.x,y=Height,z=Vec2.y},SpawnIndex) end -function SPAWN:SpawnFromUnit(HostUnit,SpawnIndex) -self:F({self.SpawnTemplatePrefix,HostUnit,SpawnIndex}) +function SPAWN:SpawnFromUnit(HostUnit,MinHeight,MaxHeight,SpawnIndex) +self:F({self.SpawnTemplatePrefix,HostUnit,MinHeight,MaxHeight,SpawnIndex}) if HostUnit and HostUnit:IsAlive()~=nil then -return self:SpawnFromVec3(HostUnit:GetVec3(),SpawnIndex) +return self:SpawnFromVec2(HostUnit:GetVec2(),MinHeight,MaxHeight,SpawnIndex) end return nil end -function SPAWN:SpawnFromStatic(HostStatic,SpawnIndex) -self:F({self.SpawnTemplatePrefix,HostStatic,SpawnIndex}) +function SPAWN:SpawnFromStatic(HostStatic,MinHeight,MaxHeight,SpawnIndex) +self:F({self.SpawnTemplatePrefix,HostStatic,MinHeight,MaxHeight,SpawnIndex}) if HostStatic and HostStatic:IsAlive()then -return self:SpawnFromVec3(HostStatic:GetVec3(),SpawnIndex) +return self:SpawnFromVec2(HostStatic:GetVec2(),MinHeight,MaxHeight,SpawnIndex) end return nil end -function SPAWN:SpawnInZone(Zone,RandomizeGroup,SpawnIndex) -self:F({self.SpawnTemplatePrefix,Zone,RandomizeGroup,SpawnIndex}) +function SPAWN:SpawnInZone(Zone,RandomizeGroup,MinHeight,MaxHeight,SpawnIndex) +self:F({self.SpawnTemplatePrefix,Zone,RandomizeGroup,MinHeight,MaxHeight,SpawnIndex}) if Zone then if RandomizeGroup then -return self:SpawnFromVec2(Zone:GetRandomVec2(),SpawnIndex) +return self:SpawnFromVec2(Zone:GetRandomVec2(),MinHeight,MaxHeight,SpawnIndex) else -return self:SpawnFromVec2(Zone:GetVec2(),SpawnIndex) +return self:SpawnFromVec2(Zone:GetVec2(),MinHeight,MaxHeight,SpawnIndex) end end return nil