From 4a5ebe147f39840980528299cbd0f00176de7ca0 Mon Sep 17 00:00:00 2001 From: svenvandevelde Date: Sat, 12 Mar 2016 10:01:34 +0100 Subject: [PATCH] Bugfix with Cargo - Complex bug fix concerning CARGO_GROUPs loaded units in other clients. - Complex bug fix concerning ReSpawning of CARGO_GROUPs when the mission starts. --- Moose/Base.lua | 12 +++++++----- Moose/Cargo.lua | 43 ++++++++++++++++++++++++++----------------- Moose/Database.lua | 9 +++++++++ Moose/Spawn.lua | 29 +++++++++++++++++++++-------- Moose/Stage.lua | 2 +- 5 files changed, 64 insertions(+), 31 deletions(-) diff --git a/Moose/Base.lua b/Moose/Base.lua index cc1aacc9a..51e6d8741 100644 --- a/Moose/Base.lua +++ b/Moose/Base.lua @@ -224,15 +224,17 @@ function BASE:T( Arguments ) if _TraceOn and _TraceClass[self.ClassName] then - local DebugInfo = debug.getinfo( 2, "nl" ) + local DebugInfoCurrent = debug.getinfo( 2, "nl" ) + local DebugInfoFrom = debug.getinfo( 3, "l" ) local Function = "function" - if DebugInfo.name then - Function = DebugInfo.name + if DebugInfoCurrent.name then + Function = DebugInfoCurrent.name end - local Line = DebugInfo.currentline + local LineCurrent = DebugInfoCurrent.currentline + local LineFrom = DebugInfoFrom.currentline - env.info( string.format( "%6d/%1s:%20s%05d.%s\(%s\)" , Line, "T", self.ClassName, self.ClassID, Function, routines.utils.oneLineSerialize( Arguments ) ) ) + env.info( string.format( "%6d\(%6d\)/%1s:%20s%05d.%s\(%s\)" , LineCurrent, LineFrom, "T", self.ClassName, self.ClassID, Function, routines.utils.oneLineSerialize( Arguments ) ) ) end end diff --git a/Moose/Cargo.lua b/Moose/Cargo.lua index 80acd296f..51ff1d924 100644 --- a/Moose/Cargo.lua +++ b/Moose/Cargo.lua @@ -58,7 +58,7 @@ function CARGO_ZONE:Spawn() end else self:T( "Initialize CargoHostSpawn" ) - self.CargoHostSpawn = SPAWN:New( self.CargoHostName ) + self.CargoHostSpawn = SPAWN:New( self.CargoHostName ):Limit( 1, 1 ) self.CargoHostSpawn:ReSpawn( 1 ) end @@ -298,8 +298,8 @@ self:T( { CargoType, CargoName, CargoWeight } ) return self end -function CARGO:Spawn() -self:T() +function CARGO:Spawn( Client ) + self:T() return self @@ -399,7 +399,7 @@ self:T() self.CargoClient = Client self.CargoStatus = CARGO.STATUS.LOADING - self:T( "Cargo " .. self.CargoName .. " loading to Client: " .. CargoClient:GetClientGroupName() ) + self:T( "Cargo " .. self.CargoName .. " loading to Client: " .. self.CargoClient:GetClientGroupName() ) return self end @@ -455,7 +455,7 @@ CARGO_GROUP = { function CARGO_GROUP:New( CargoType, CargoName, CargoWeight, CargoGroupTemplate, CargoZone ) local self = BASE:Inherit( self, CARGO:New( CargoType, CargoName, CargoWeight ) ) -self:T( { CargoType, CargoName, CargoWeight, CargoGroupTemplate, CargoZone } ) + self:T( { CargoType, CargoName, CargoWeight, CargoGroupTemplate, CargoZone } ) self.CargoSpawn = SPAWN:NewWithAlias( CargoGroupTemplate, CargoName ) self.CargoZone = CargoZone @@ -466,8 +466,8 @@ self:T( { CargoType, CargoName, CargoWeight, CargoGroupTemplate, CargoZone } ) end -function CARGO_GROUP:Spawn() -self:T() +function CARGO_GROUP:Spawn( Client ) + self:T( { Client } ) local SpawnCargo = true @@ -491,9 +491,18 @@ self:T() elseif self:IsStatusLoaded() then - local Client = self:IsLoadedInClient() - if Client and Client:ClientGroup() then - SpawnCargo = false + local ClientLoaded = self:IsLoadedInClient() + -- Now test if another Client is alive (not this one), and it has the CARGO, then this cargo does not need to be initialized and spawned. + if ClientLoaded and ClientLoaded ~= Client then + local ClientGroup = Client:ClientGroup() + if ClientLoaded:GetClientGroupDCSUnit() and ClientLoaded:GetClientGroupDCSUnit():isExist() then + SpawnCargo = false + else + self:StatusNone() + end + else + -- Same Client, but now in initialize, so set back the status to None. + self:StatusNone() end elseif self:IsStatusUnLoaded() then @@ -505,10 +514,10 @@ self:T() if SpawnCargo then if self.CargoZone:GetCargoHostUnit() then --- ReSpawn the Cargo from the CargoHost - self.CargoGroupName = self.CargoSpawn:SpawnFromUnit( self.CargoZone:GetCargoHostUnit(), 60, 30 ):GetName() + self.CargoGroupName = self.CargoSpawn:SpawnFromUnit( self.CargoZone:GetCargoHostUnit(), 60, 30, 1 ):GetName() else --- ReSpawn the Cargo in the CargoZone without a host ... - self.CargoGroupName = self.CargoSpawn:SpawnInZone( self.CargoZone ):GetName() + self.CargoGroupName = self.CargoSpawn:SpawnInZone( self.CargoZone, 1 ):GetName() end self:StatusNone() end @@ -666,15 +675,15 @@ function CARGO_PACKAGE:New( CargoType, CargoName, CargoWeight, CargoClient ) loc end -function CARGO_PACKAGE:Spawn() -self:T( self ) +function CARGO_PACKAGE:Spawn( Client ) + self:T( { self, Client } ) -- this needs to be checked thoroughly local CargoClientGroup = self.CargoClient:ClientGroup() if not CargoClientGroup then if not self.CargoClientSpawn then - self.CargoClientSpawn = SPAWN:New( self.CargoClient:GetClientGroupName() ) + self.CargoClientSpawn = SPAWN:New( self.CargoClient:GetClientGroupName() ):Limit( 1, 1 ) end self.CargoClientSpawn:ReSpawn( 1 ) end @@ -889,8 +898,8 @@ self:T() end -function CARGO_SLINGLOAD:Spawn() -self:T() +function CARGO_SLINGLOAD:Spawn( Client ) + self:T( { self, Client } ) local Zone = trigger.misc.getZone( self.CargoZone ) diff --git a/Moose/Database.lua b/Moose/Database.lua index 21a6374bc..9290b87f0 100644 --- a/Moose/Database.lua +++ b/Moose/Database.lua @@ -130,15 +130,24 @@ function DATABASE:Spawn( SpawnTemplate ) self:T( { SpawnTemplate.SpawnCountryID, SpawnTemplate.SpawnCategoryID, SpawnTemplate.name } ) + -- Copy the spawn variables of the template in temporary storage, nullify, and restore the spawn variables. + local SpawnCoalitionID = SpawnTemplate.SpawnCoalitionID local SpawnCountryID = SpawnTemplate.SpawnCountryID local SpawnCategoryID = SpawnTemplate.SpawnCategoryID + -- Nullify SpawnTemplate.SpawnCoalitionID = nil SpawnTemplate.SpawnCountryID = nil SpawnTemplate.SpawnCategoryID = nil self:_RegisterGroup( SpawnTemplate ) coalition.addGroup( SpawnCountryID, SpawnCategoryID, SpawnTemplate ) + + -- Restore + SpawnTemplate.SpawnCoalitionID = SpawnCoalitionID + SpawnTemplate.SpawnCountryID = SpawnCountryID + SpawnTemplate.SpawnCategoryID = SpawnCategoryID + local SpawnGroup = GROUP:New( Group.getByName( SpawnTemplate.name ) ) return SpawnGroup diff --git a/Moose/Spawn.lua b/Moose/Spawn.lua index 8b61dfcae..ef2cf34de 100644 --- a/Moose/Spawn.lua +++ b/Moose/Spawn.lua @@ -438,6 +438,7 @@ function SPAWN:SpawnWithIndex( SpawnIndex ) if self.SpawnGroups[self.SpawnIndex].Visible then self.SpawnGroups[self.SpawnIndex].Group:Activate() else + self:T( self.SpawnGroups[self.SpawnIndex].SpawnTemplate ) self.SpawnGroups[self.SpawnIndex].Group = _Database:Spawn( self.SpawnGroups[self.SpawnIndex].SpawnTemplate ) --if self.SpawnRepeat then -- _Database:SetStatusGroup( SpawnTemplate.name, "ReSpawn" ) @@ -548,12 +549,17 @@ end -- @tparam UNIT HostUnit is the AIR unit or GROUND unit dropping or unloading the Spawn group. -- @treturn GROUP Spawned. -- @treturn nil when nothing was spawned. -function SPAWN:SpawnFromUnit( HostUnit, OuterRadius, InnerRadius ) - self:T( { self.SpawnTemplatePrefix, HostUnit, SpawnFormation } ) +function SPAWN:SpawnFromUnit( HostUnit, OuterRadius, InnerRadius, SpawnIndex ) + self:T( { self.SpawnTemplatePrefix, HostUnit, SpawnFormation, SpawnIndex } ) if HostUnit and HostUnit:IsAlive() then -- and HostUnit:getUnit(1):inAir() == false then - if self:GetSpawnIndex( self.SpawnIndex + 1 ) then + if SpawnIndex then + else + SpawnIndex = self.SpawnIndex + 1 + end + + if self:GetSpawnIndex( SpawnIndex ) then local SpawnTemplate = self.SpawnGroups[self.SpawnIndex].SpawnTemplate @@ -616,12 +622,17 @@ end -- @tparam ZONE The @{ZONE} where the Group is to be SPAWNed. -- @treturn GROUP that was spawned. -- @treturn nil when nothing as spawned. -function SPAWN:SpawnInZone( Zone ) - self:T( { self.SpawnTemplatePrefix, Zone } ) +function SPAWN:SpawnInZone( Zone, SpawnIndex ) + self:T( { self.SpawnTemplatePrefix, Zone, SpawnIndex } ) if Zone then - - if self:GetSpawnIndex( self.SpawnIndex + 1) then + + if SpawnIndex then + else + SpawnIndex = self.SpawnIndex + 1 + end + + if self:GetSpawnIndex( SpawnIndex ) then local SpawnTemplate = self.SpawnGroups[self.SpawnIndex].SpawnTemplate @@ -852,6 +863,8 @@ end --- Gets the CountryID of the Group with the given SpawnPrefix function SPAWN:_GetGroupCountryID( SpawnPrefix ) + self:T( { self.SpawnTemplatePrefix, self.SpawnAliasPrefix, SpawnPrefix } ) + local TemplateGroup = Group.getByName( SpawnPrefix ) if TemplateGroup then @@ -887,7 +900,7 @@ end function SPAWN:_Prepare( SpawnTemplatePrefix, SpawnIndex ) self:T( { self.SpawnTemplatePrefix, self.SpawnAliasPrefix } ) - local SpawnTemplate = routines.utils.deepCopy( self:_GetTemplate( SpawnTemplatePrefix ) ) + local SpawnTemplate = self:_GetTemplate( SpawnTemplatePrefix ) SpawnTemplate.name = self:SpawnGroupName( SpawnIndex ) SpawnTemplate.groupId = nil diff --git a/Moose/Stage.lua b/Moose/Stage.lua index 8deaf5e8d..873ac0356 100644 --- a/Moose/Stage.lua +++ b/Moose/Stage.lua @@ -187,7 +187,7 @@ self:T() self:T( Task.Cargos.InitCargos ) for InitCargoID, InitCargoData in pairs( Task.Cargos.InitCargos ) do self:T( { InitCargoData } ) - InitCargoData:Spawn() + InitCargoData:Spawn( Client ) end return Valid