Fixing SPAWNING of STATICS for CARGO and respawning of STATICS for CARGO. Please test.

This commit is contained in:
FlightControl 2018-09-16 15:37:22 +02:00
parent f8f000eae5
commit a0502a12fa
5 changed files with 101 additions and 54 deletions

View File

@ -154,7 +154,7 @@ do -- CARGO_CRATE
if self.CargoObject then if self.CargoObject then
self:T("Destroying") self:T("Destroying")
self.NoDestroy = true 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 ) --local Coordinate = self.CargoObject:GetCoordinate():GetRandomCoordinateInRadius( 50, 20 )
--self.CargoObject:ReSpawnAt( Coordinate, 0 ) --self.CargoObject:ReSpawnAt( Coordinate, 0 )
end end

View File

@ -672,10 +672,12 @@ end
--- Private method that registers new Static Templates within the DATABASE Object. --- Private method that registers new Static Templates within the DATABASE Object.
-- @param #DATABASE self -- @param #DATABASE self
-- @param #table GroupTemplate -- @param #table StaticTemplate
-- @return #DATABASE self -- @return #DATABASE self
function DATABASE:_RegisterStaticTemplate( StaticTemplate, CoalitionID, CategoryID, CountryID ) function DATABASE:_RegisterStaticTemplate( StaticTemplate, CoalitionID, CategoryID, CountryID )
local StaticTemplate = UTILS.DeepCopy( StaticTemplate )
local StaticTemplateName = env.getValueDictByKey(StaticTemplate.name) local StaticTemplateName = env.getValueDictByKey(StaticTemplate.name)
self.Templates.Statics[StaticTemplateName] = self.Templates.Statics[StaticTemplateName] or {} self.Templates.Statics[StaticTemplateName] = self.Templates.Statics[StaticTemplateName] or {}
@ -704,11 +706,17 @@ end
--- @param #DATABASE self --- @param #DATABASE self
function DATABASE:GetStaticUnitTemplate( StaticName ) function DATABASE:GetStaticGroupTemplate( StaticName )
local StaticTemplate = self.Templates.Statics[StaticName].UnitTemplate local StaticTemplate = self.Templates.Statics[StaticName].GroupTemplate
return StaticTemplate, self.Templates.Statics[StaticName].CoalitionID, self.Templates.Statics[StaticName].CategoryID, self.Templates.Statics[StaticName].CountryID return StaticTemplate, self.Templates.Statics[StaticName].CoalitionID, self.Templates.Statics[StaticName].CategoryID, self.Templates.Statics[StaticName].CountryID
end 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 ) function DATABASE:GetGroupNameFromUnitName( UnitName )
return self.Templates.Units[UnitName].GroupName return self.Templates.Units[UnitName].GroupName

View File

@ -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.
-- --
-- === -- ===
-- --

View File

@ -82,7 +82,7 @@ function SPAWNSTATIC:NewFromStatic( SpawnTemplatePrefix, SpawnCountryID ) --R2.1
local self = BASE:Inherit( self, BASE:New() ) -- #SPAWNSTATIC local self = BASE:Inherit( self, BASE:New() ) -- #SPAWNSTATIC
self:F( { SpawnTemplatePrefix } ) self:F( { SpawnTemplatePrefix } )
local TemplateStatic, CoalitionID, CategoryID, CountryID = _DATABASE:GetStaticUnitTemplate( SpawnTemplatePrefix ) local TemplateStatic, CoalitionID, CategoryID, CountryID = _DATABASE:GetStaticGroupTemplate( SpawnTemplatePrefix )
if TemplateStatic then if TemplateStatic then
self.SpawnTemplatePrefix = SpawnTemplatePrefix self.SpawnTemplatePrefix = SpawnTemplatePrefix
self.CountryID = SpawnCountryID or CountryID self.CountryID = SpawnCountryID or CountryID
@ -90,7 +90,7 @@ function SPAWNSTATIC:NewFromStatic( SpawnTemplatePrefix, SpawnCountryID ) --R2.1
self.CoalitionID = CoalitionID self.CoalitionID = CoalitionID
self.SpawnIndex = 0 self.SpawnIndex = 0
else 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 end
self:SetEventPriority( 5 ) self:SetEventPriority( 5 )
@ -124,25 +124,22 @@ end
function SPAWNSTATIC:Spawn( Heading, NewName ) --R2.3 function SPAWNSTATIC:Spawn( Heading, NewName ) --R2.3
self:F( { Heading, NewName } ) self:F( { Heading, NewName } )
local StaticTemplate = _DATABASE:GetStaticUnitTemplate( self.SpawnTemplatePrefix ) local StaticTemplate, CoalitionID, CategoryID, CountryID = _DATABASE:GetStaticGroupTemplate( self.SpawnTemplatePrefix )
if StaticTemplate then if StaticTemplate then
local CountryID = self.CountryID local StaticUnitTemplate = StaticTemplate.units[1]
local CountryName = _DATABASE.COUNTRY_NAME[CountryID]
StaticTemplate.name = NewName or string.format("%s#%05d", self.SpawnTemplatePrefix, self.SpawnIndex ) StaticTemplate.name = NewName or string.format("%s#%05d", self.SpawnTemplatePrefix, self.SpawnIndex )
StaticTemplate.heading = ( Heading / 180 ) * math.pi StaticTemplate.heading = ( Heading / 180 ) * math.pi
StaticTemplate.CountryID = nil _DATABASE:_RegisterStaticTemplate( StaticTemplate, CoalitionID, CategoryID, CountryID )
StaticTemplate.CoalitionID = nil
StaticTemplate.CategoryID = nil local Static = coalition.addStaticObject( CountryID, StaticTemplate.units[1] )
local Static = coalition.addStaticObject( CountryID, StaticTemplate )
self.SpawnIndex = self.SpawnIndex + 1 self.SpawnIndex = self.SpawnIndex + 1
return Static return _DATABASE:FindStatic(Static:getName())
end end
return nil return nil
@ -159,32 +156,31 @@ end
function SPAWNSTATIC:SpawnFromPointVec2( PointVec2, Heading, NewName ) --R2.1 function SPAWNSTATIC:SpawnFromPointVec2( PointVec2, Heading, NewName ) --R2.1
self:F( { PointVec2, Heading, NewName } ) self:F( { PointVec2, Heading, NewName } )
local StaticTemplate = _DATABASE:GetStaticUnitTemplate( self.SpawnTemplatePrefix ) local StaticTemplate, CoalitionID, CategoryID, CountryID = _DATABASE:GetStaticGroupTemplate( self.SpawnTemplatePrefix )
if StaticTemplate then 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.route = nil
StaticTemplate.groupId = nil StaticTemplate.groupId = nil
StaticTemplate.name = NewName or string.format("%s#%05d", self.SpawnTemplatePrefix, self.SpawnIndex ) 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 _DATABASE:_RegisterStaticTemplate( StaticTemplate, CoalitionID, CategoryID, CountryID)
StaticTemplate.CoalitionID = nil
StaticTemplate.CategoryID = nil
local Static = coalition.addStaticObject( CountryID, StaticTemplate ) self:F({StaticTemplate = StaticTemplate})
local Static = coalition.addStaticObject( CountryID, StaticTemplate.units[1] )
self.SpawnIndex = self.SpawnIndex + 1 self.SpawnIndex = self.SpawnIndex + 1
return _DATABASE:AddStatic(Static:getName()) return _DATABASE:FindStatic(Static:getName())
end end
return nil return nil
@ -199,24 +195,18 @@ end
-- @return #SPAWNSTATIC -- @return #SPAWNSTATIC
function SPAWNSTATIC:ReSpawn() function SPAWNSTATIC:ReSpawn()
local StaticTemplate = _DATABASE:GetStaticUnitTemplate( self.SpawnTemplatePrefix ) local StaticTemplate, CoalitionID, CategoryID, CountryID = _DATABASE:GetStaticGroupTemplate( self.SpawnTemplatePrefix )
if StaticTemplate then if StaticTemplate then
local CountryID = self.CountryID local StaticUnitTemplate = StaticTemplate.units[1]
local CountryName = _DATABASE.COUNTRY_NAME[CountryID]
StaticTemplate.units = nil
StaticTemplate.route = nil StaticTemplate.route = nil
StaticTemplate.groupId = nil StaticTemplate.groupId = nil
StaticTemplate.CountryID = nil local Static = coalition.addStaticObject( CountryID, StaticTemplate.units[1] )
StaticTemplate.CoalitionID = nil
StaticTemplate.CategoryID = nil
local Static = coalition.addStaticObject( CountryID, StaticTemplate ) return _DATABASE:FindStatic(Static:getName())
return _DATABASE:AddStatic(Static:getName())
end end
return nil return nil
@ -230,24 +220,20 @@ end
-- @return #SPAWNSTATIC -- @return #SPAWNSTATIC
function SPAWNSTATIC:ReSpawnAt( Coordinate, Heading ) function SPAWNSTATIC:ReSpawnAt( Coordinate, Heading )
local StaticTemplate = _DATABASE:GetStaticUnitTemplate( self.SpawnTemplatePrefix ) local StaticTemplate, CoalitionID, CategoryID, CountryID = _DATABASE:GetStaticGroupTemplate( self.SpawnTemplatePrefix )
if StaticTemplate then if StaticTemplate then
local CountryID = self.CountryID local StaticUnitTemplate = StaticTemplate.units[1]
StaticTemplate.x = Coordinate.x StaticUnitTemplate.x = Coordinate.x
StaticTemplate.y = Coordinate.z StaticUnitTemplate.y = Coordinate.z
StaticTemplate.heading = Heading and ( ( Heading / 180 ) * math.pi ) or StaticTemplate.heading StaticUnitTemplate.heading = Heading and ( ( Heading / 180 ) * math.pi ) or StaticTemplate.heading
StaticTemplate.CountryID = nil
StaticTemplate.CoalitionID = nil
StaticTemplate.CategoryID = nil
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 end
return nil return nil
@ -265,6 +251,6 @@ function SPAWNSTATIC:SpawnFromZone( Zone, Heading, NewName ) --R2.1
local Static = self:SpawnFromPointVec2( Zone:GetPointVec2(), Heading, NewName ) local Static = self:SpawnFromPointVec2( Zone:GetPointVec2(), Heading, NewName )
return _DATABASE:AddStatic(Static:getName()) return Static
end end

View File

@ -89,6 +89,59 @@ function STATIC:FindByName( StaticName, RaiseError )
return nil return nil
end 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() function STATIC:GetDCSObject()
local DCSStatic = StaticObject.getByName( self.StaticName ) local DCSStatic = StaticObject.getByName( self.StaticName )