From a0502a12fa19d21194fdd2668f17a42d48875f72 Mon Sep 17 00:00:00 2001 From: FlightControl Date: Sun, 16 Sep 2018 15:37:22 +0200 Subject: [PATCH] Fixing SPAWNING of STATICS for CARGO and respawning of STATICS for CARGO. Please test. --- Moose Development/Moose/Cargo/CargoCrate.lua | 2 +- Moose Development/Moose/Core/Database.lua | 14 +++- Moose Development/Moose/Core/Spawn.lua | 2 +- Moose Development/Moose/Core/SpawnStatic.lua | 84 ++++++++------------ Moose Development/Moose/Wrapper/Static.lua | 53 ++++++++++++ 5 files changed, 101 insertions(+), 54 deletions(-) diff --git a/Moose Development/Moose/Cargo/CargoCrate.lua b/Moose Development/Moose/Cargo/CargoCrate.lua index b12869c16..92fccec02 100644 --- a/Moose Development/Moose/Cargo/CargoCrate.lua +++ b/Moose Development/Moose/Cargo/CargoCrate.lua @@ -154,7 +154,7 @@ do -- CARGO_CRATE if self.CargoObject then self:T("Destroying") self.NoDestroy = true - self.CargoObject:Destroy() + self.CargoObject:Destroy( false ) -- Do not generate a remove unit event, because we want to keep the template for later respawn in the database. --local Coordinate = self.CargoObject:GetCoordinate():GetRandomCoordinateInRadius( 50, 20 ) --self.CargoObject:ReSpawnAt( Coordinate, 0 ) end diff --git a/Moose Development/Moose/Core/Database.lua b/Moose Development/Moose/Core/Database.lua index 901723088..5e8c32d1c 100644 --- a/Moose Development/Moose/Core/Database.lua +++ b/Moose Development/Moose/Core/Database.lua @@ -672,10 +672,12 @@ end --- Private method that registers new Static Templates within the DATABASE Object. -- @param #DATABASE self --- @param #table GroupTemplate +-- @param #table StaticTemplate -- @return #DATABASE self function DATABASE:_RegisterStaticTemplate( StaticTemplate, CoalitionID, CategoryID, CountryID ) + local StaticTemplate = UTILS.DeepCopy( StaticTemplate ) + local StaticTemplateName = env.getValueDictByKey(StaticTemplate.name) self.Templates.Statics[StaticTemplateName] = self.Templates.Statics[StaticTemplateName] or {} @@ -704,11 +706,17 @@ end --- @param #DATABASE self -function DATABASE:GetStaticUnitTemplate( StaticName ) - local StaticTemplate = self.Templates.Statics[StaticName].UnitTemplate +function DATABASE:GetStaticGroupTemplate( StaticName ) + local StaticTemplate = self.Templates.Statics[StaticName].GroupTemplate return StaticTemplate, self.Templates.Statics[StaticName].CoalitionID, self.Templates.Statics[StaticName].CategoryID, self.Templates.Statics[StaticName].CountryID end +--- @param #DATABASE self +function DATABASE:GetStaticUnitTemplate( StaticName ) + local UnitTemplate = self.Templates.Statics[StaticName].UnitTemplate + return UnitTemplate, self.Templates.Statics[StaticName].CoalitionID, self.Templates.Statics[StaticName].CategoryID, self.Templates.Statics[StaticName].CountryID +end + function DATABASE:GetGroupNameFromUnitName( UnitName ) return self.Templates.Units[UnitName].GroupName diff --git a/Moose Development/Moose/Core/Spawn.lua b/Moose Development/Moose/Core/Spawn.lua index 7a6160490..fd62653f1 100644 --- a/Moose Development/Moose/Core/Spawn.lua +++ b/Moose Development/Moose/Core/Spawn.lua @@ -1,4 +1,4 @@ ---- **Core** -- SPAWN class dynamically spawns new groups of units in your missions. +--- **Core** --Spawn dynamically new GROUPs of UNITs in your missions. -- -- === -- diff --git a/Moose Development/Moose/Core/SpawnStatic.lua b/Moose Development/Moose/Core/SpawnStatic.lua index a4d0036a4..2efce77f7 100644 --- a/Moose Development/Moose/Core/SpawnStatic.lua +++ b/Moose Development/Moose/Core/SpawnStatic.lua @@ -82,7 +82,7 @@ function SPAWNSTATIC:NewFromStatic( SpawnTemplatePrefix, SpawnCountryID ) --R2.1 local self = BASE:Inherit( self, BASE:New() ) -- #SPAWNSTATIC self:F( { SpawnTemplatePrefix } ) - local TemplateStatic, CoalitionID, CategoryID, CountryID = _DATABASE:GetStaticUnitTemplate( SpawnTemplatePrefix ) + local TemplateStatic, CoalitionID, CategoryID, CountryID = _DATABASE:GetStaticGroupTemplate( SpawnTemplatePrefix ) if TemplateStatic then self.SpawnTemplatePrefix = SpawnTemplatePrefix self.CountryID = SpawnCountryID or CountryID @@ -90,7 +90,7 @@ function SPAWNSTATIC:NewFromStatic( SpawnTemplatePrefix, SpawnCountryID ) --R2.1 self.CoalitionID = CoalitionID self.SpawnIndex = 0 else - error( "SPAWNSTATIC:New: There is no group declared in the mission editor with SpawnTemplatePrefix = '" .. SpawnTemplatePrefix .. "'" ) + error( "SPAWNSTATIC:New: There is no static declared in the mission editor with SpawnTemplatePrefix = '" .. SpawnTemplatePrefix .. "'" ) end self:SetEventPriority( 5 ) @@ -124,25 +124,22 @@ end function SPAWNSTATIC:Spawn( Heading, NewName ) --R2.3 self:F( { Heading, NewName } ) - local StaticTemplate = _DATABASE:GetStaticUnitTemplate( self.SpawnTemplatePrefix ) + local StaticTemplate, CoalitionID, CategoryID, CountryID = _DATABASE:GetStaticGroupTemplate( self.SpawnTemplatePrefix ) if StaticTemplate then - local CountryID = self.CountryID - local CountryName = _DATABASE.COUNTRY_NAME[CountryID] + local StaticUnitTemplate = StaticTemplate.units[1] StaticTemplate.name = NewName or string.format("%s#%05d", self.SpawnTemplatePrefix, self.SpawnIndex ) StaticTemplate.heading = ( Heading / 180 ) * math.pi - StaticTemplate.CountryID = nil - StaticTemplate.CoalitionID = nil - StaticTemplate.CategoryID = nil - - local Static = coalition.addStaticObject( CountryID, StaticTemplate ) + _DATABASE:_RegisterStaticTemplate( StaticTemplate, CoalitionID, CategoryID, CountryID ) + + local Static = coalition.addStaticObject( CountryID, StaticTemplate.units[1] ) self.SpawnIndex = self.SpawnIndex + 1 - return Static + return _DATABASE:FindStatic(Static:getName()) end return nil @@ -159,32 +156,31 @@ end function SPAWNSTATIC:SpawnFromPointVec2( PointVec2, Heading, NewName ) --R2.1 self:F( { PointVec2, Heading, NewName } ) - local StaticTemplate = _DATABASE:GetStaticUnitTemplate( self.SpawnTemplatePrefix ) + local StaticTemplate, CoalitionID, CategoryID, CountryID = _DATABASE:GetStaticGroupTemplate( self.SpawnTemplatePrefix ) if StaticTemplate then - - local CountryID = self.CountryID - local CountryName = _DATABASE.COUNTRY_NAME[CountryID] - - StaticTemplate.x = PointVec2.x - StaticTemplate.y = PointVec2.z - StaticTemplate.units = nil + 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 ) - StaticTemplate.heading = ( Heading / 180 ) * math.pi + StaticUnitTemplate.name = StaticTemplate.name + StaticUnitTemplate.heading = ( Heading / 180 ) * math.pi - StaticTemplate.CountryID = nil - StaticTemplate.CoalitionID = nil - StaticTemplate.CategoryID = nil + _DATABASE:_RegisterStaticTemplate( StaticTemplate, CoalitionID, CategoryID, CountryID) - local Static = coalition.addStaticObject( CountryID, StaticTemplate ) + self:F({StaticTemplate = StaticTemplate}) + + local Static = coalition.addStaticObject( CountryID, StaticTemplate.units[1] ) self.SpawnIndex = self.SpawnIndex + 1 - return _DATABASE:AddStatic(Static:getName()) + return _DATABASE:FindStatic(Static:getName()) end return nil @@ -199,24 +195,18 @@ end -- @return #SPAWNSTATIC function SPAWNSTATIC:ReSpawn() - local StaticTemplate = _DATABASE:GetStaticUnitTemplate( self.SpawnTemplatePrefix ) + local StaticTemplate, CoalitionID, CategoryID, CountryID = _DATABASE:GetStaticGroupTemplate( self.SpawnTemplatePrefix ) if StaticTemplate then - local CountryID = self.CountryID - local CountryName = _DATABASE.COUNTRY_NAME[CountryID] - - StaticTemplate.units = nil + local StaticUnitTemplate = StaticTemplate.units[1] + StaticTemplate.route = nil StaticTemplate.groupId = nil - StaticTemplate.CountryID = nil - StaticTemplate.CoalitionID = nil - StaticTemplate.CategoryID = nil + local Static = coalition.addStaticObject( CountryID, StaticTemplate.units[1] ) - local Static = coalition.addStaticObject( CountryID, StaticTemplate ) - - return _DATABASE:AddStatic(Static:getName()) + return _DATABASE:FindStatic(Static:getName()) end return nil @@ -230,24 +220,20 @@ end -- @return #SPAWNSTATIC function SPAWNSTATIC:ReSpawnAt( Coordinate, Heading ) - local StaticTemplate = _DATABASE:GetStaticUnitTemplate( self.SpawnTemplatePrefix ) + local StaticTemplate, CoalitionID, CategoryID, CountryID = _DATABASE:GetStaticGroupTemplate( self.SpawnTemplatePrefix ) if StaticTemplate then - local CountryID = self.CountryID - - StaticTemplate.x = Coordinate.x - StaticTemplate.y = Coordinate.z + local StaticUnitTemplate = StaticTemplate.units[1] + + StaticUnitTemplate.x = Coordinate.x + StaticUnitTemplate.y = Coordinate.z - StaticTemplate.heading = Heading and ( ( Heading / 180 ) * math.pi ) or StaticTemplate.heading - - StaticTemplate.CountryID = nil - StaticTemplate.CoalitionID = nil - StaticTemplate.CategoryID = nil + StaticUnitTemplate.heading = Heading and ( ( Heading / 180 ) * math.pi ) or StaticTemplate.heading - local Static = coalition.addStaticObject( CountryID, StaticTemplate ) + local Static = coalition.addStaticObject( CountryID, StaticTemplate.units[1] ) - return _DATABASE:AddStatic(Static:getName()) + return _DATABASE:FindStatic(Static:getName()) end return nil @@ -265,6 +251,6 @@ function SPAWNSTATIC:SpawnFromZone( Zone, Heading, NewName ) --R2.1 local Static = self:SpawnFromPointVec2( Zone:GetPointVec2(), Heading, NewName ) - return _DATABASE:AddStatic(Static:getName()) + return Static end diff --git a/Moose Development/Moose/Wrapper/Static.lua b/Moose Development/Moose/Wrapper/Static.lua index a591522af..88d0d18dd 100644 --- a/Moose Development/Moose/Wrapper/Static.lua +++ b/Moose Development/Moose/Wrapper/Static.lua @@ -89,6 +89,59 @@ function STATIC:FindByName( StaticName, RaiseError ) return nil end +--- Destroys the STATIC. +-- @param #STATIC self +-- @param #boolean GenerateEvent (Optional) true if you want to generate a crash or dead event for the static. +-- @return #nil The DCS StaticObject is not existing or alive. +-- @usage +-- -- Air static example: destroy the static Helicopter and generate a S_EVENT_CRASH. +-- Helicopter = STATIC:FindByName( "Helicopter" ) +-- Helicopter:Destroy( true ) +-- +-- @usage +-- -- Ground static example: destroy the static Tank and generate a S_EVENT_DEAD. +-- Tanks = UNIT:FindByName( "Tank" ) +-- Tanks:Destroy( true ) +-- +-- @usage +-- -- Ship static example: destroy the Ship silently. +-- Ship = STATIC:FindByName( "Ship" ) +-- Ship:Destroy() +-- +-- @usage +-- -- Destroy without event generation example. +-- Ship = STATIC:FindByName( "Boat" ) +-- Ship:Destroy( false ) -- Don't generate an event upon destruction. +-- +function STATIC:Destroy( GenerateEvent ) + self:F2( self.ObjectName ) + + local DCSObject = self:GetDCSObject() + + if DCSObject then + + local StaticName = DCSObject:getName() + self:F( { StaticName = StaticName } ) + + if GenerateEvent and GenerateEvent == true then + if self:IsAir() then + self:CreateEventCrash( timer.getTime(), DCSObject ) + else + self:CreateEventDead( timer.getTime(), DCSObject ) + end + elseif GenerateEvent == false then + -- Do nothing! + else + self:CreateEventRemoveUnit( timer.getTime(), DCSObject ) + end + + DCSObject:destroy() + end + + return nil +end + + function STATIC:GetDCSObject() local DCSStatic = StaticObject.getByName( self.StaticName )