From 5507480e99ed38ff37e4137300a07e529fbf96c3 Mon Sep 17 00:00:00 2001 From: svenvandevelde Date: Sun, 13 Mar 2016 09:00:13 +0100 Subject: [PATCH] Bug fixes --- Moose/Base.lua | 35 ++++-- Moose/CleanUp.lua | 68 ++++++------ Moose/Moose_Embedded.lua | 165 ++++++++++++++++++----------- Moose/Spawn.lua | 62 +++++++---- Test Missions/MOOSE_Spawn_Test.miz | Bin 38932 -> 39193 bytes 5 files changed, 206 insertions(+), 124 deletions(-) diff --git a/Moose/Base.lua b/Moose/Base.lua index 51e6d8741..8456c2752 100644 --- a/Moose/Base.lua +++ b/Moose/Base.lua @@ -10,17 +10,18 @@ _TraceClass = { --SEAD = true, --DESTROYBASETASK = true, --MOVEMENT = true, - SPAWN = true, - STAGE = true, - ZONE = true, - GROUP = true, - UNIT = true, + --SPAWN = true, + --STAGE = true, + --ZONE = true, + --GROUP = true, + --UNIT = true, --CLIENT = true, --CARGO = true, - CARGO_GROUP = true, + --CARGO_GROUP = true, --CARGO_PACKAGE = true, --CARGO_SLINGLOAD = true, - CARGO_ZONE = true, + --CARGO_ZONE = true, + --CLEANUP = true, } BASE = { @@ -219,7 +220,7 @@ end -- Trace section - +-- Log a trace (only shown when trace is on) function BASE:T( Arguments ) if _TraceOn and _TraceClass[self.ClassName] then @@ -238,3 +239,21 @@ function BASE:T( 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 + + +-- Log an exception +function BASE:E( Arguments ) + + local DebugInfoCurrent = debug.getinfo( 2, "nl" ) + local DebugInfoFrom = debug.getinfo( 3, "l" ) + + local Function = "function" + if DebugInfoCurrent.name then + Function = DebugInfoCurrent.name + end + + local LineCurrent = DebugInfoCurrent.currentline + local LineFrom = DebugInfoFrom.currentline + + env.info( string.format( "%6d\(%6d\)/%1s:%20s%05d.%s\(%s\)" , LineCurrent, LineFrom, "E", self.ClassName, self.ClassID, Function, routines.utils.oneLineSerialize( Arguments ) ) ) +end diff --git a/Moose/CleanUp.lua b/Moose/CleanUp.lua index fef3b81dc..d56aa3ee5 100644 --- a/Moose/CleanUp.lua +++ b/Moose/CleanUp.lua @@ -25,11 +25,9 @@ CLEANUP = { -- or -- CleanUpTbilisi = CLEANUP:New( 'CLEAN Tbilisi', 150 ) -- CleanUpKutaisi = CLEANUP:New( 'CLEAN Kutaisi', 600 ) -function CLEANUP:New( ZoneNames, TimeInterval ) -trace.f( self.ClassName, { ZoneNames, TimeInterval } ) - - -- Arrange meta tables - local self = BASE:Inherit( self, BASE:New() ) +function CLEANUP:New( ZoneNames, TimeInterval ) local self = BASE:Inherit( self, BASE:New() ) + self:T( { ZoneNames, TimeInterval } ) + if type( ZoneNames ) == 'table' then self.ZoneNames = ZoneNames else @@ -57,19 +55,19 @@ end --- Destroys a group from the simulator, but checks first if it is still existing! -- @see CLEANUP function CLEANUP:_DestroyGroup( GroupObject, CleanUpGroupName ) -trace.f( self.ClassName ) + self:T( { GroupObject, CleanUpGroupName } ) if GroupObject then -- and GroupObject:isExist() then MESSAGE:New( "Destroy Group " .. CleanUpGroupName, CleanUpGroupName, 1, CleanUpGroupName ):ToAll() trigger.action.deactivateGroup(GroupObject) - trace.i(self.ClassName, "GroupObject Destroyed") + self:T( { "GroupObject Destroyed", GroupObject } ) end end --- Destroys a unit from the simulator, but checks first if it is still existing! -- @see CLEANUP function CLEANUP:_DestroyUnit( CleanUpUnit, CleanUpUnitName ) -trace.f( self.ClassName ) + self:T( { CleanUpUnit, CleanUpUnitName } ) if CleanUpUnit then MESSAGE:New( "Destroy " .. CleanUpUnitName, CleanUpUnitName, 1, CleanUpUnitName ):ToAll() @@ -81,10 +79,10 @@ trace.f( self.ClassName ) local Event = {["initiator"]=CleanUpUnit,["id"]=8} world.onEvent(Event) trigger.action.deactivateGroup(CleanUpGroup) - trace.i(self.ClassName, "Destroyed Group " .. CleanUpGroupName ) + self:T( { "Destroyed Group:", CleanUpGroupName } ) else CleanUpUnit:destroy() - trace.i(self.ClassName, "Destroyed Unit " .. CleanUpUnitName ) + self:T( { "Destroyed Unit:", CleanUpUnitName } ) end self.CleanUpList[CleanUpUnitName] = nil -- Cleaning from the list CleanUpUnit = nil @@ -95,25 +93,25 @@ end --- Destroys a missile from the simulator, but checks first if it is still existing! -- @see CLEANUP function CLEANUP:_DestroyMissile( MissileObject ) -trace.f( self.ClassName ) + self:T( { MissileObject } ) if MissileObject and MissileObject:isExist() then MissileObject:destroy() - trace.i(self.ClassName, "MissileObject Destroyed") + self:T( "MissileObject Destroyed") end end --- Detects if an SA site was shot with an anti radiation missile. In this case, take evasive actions based on the skill level set within the ME. -- @see CLEANUP function CLEANUP:_EventCrash( event ) -trace.f( self.ClassName ) + self:T( { event } ) --MESSAGE:New( "Crash ", "Crash", 10, "Crash" ):ToAll() - -- trace.i(self.ClassName,"before getGroup") + -- self:T("before getGroup") -- local _grp = Unit.getGroup(event.initiator)-- Identify the group that fired - -- trace.i(self.ClassName,"after getGroup") + -- self:T("after getGroup") -- _grp:destroy() - -- trace.i(self.ClassName,"after deactivateGroup") + -- self:T("after deactivateGroup") -- event.initiator:destroy() local CleanUpUnit = event.initiator -- the Unit @@ -133,7 +131,7 @@ end --- Detects if an SA site was shot with an anti radiation missile. In this case, take evasive actions based on the skill level set within the ME. -- @see CLEANUP function CLEANUP:_EventShot( event ) -trace.f( self.ClassName ) + self:T( { event } ) local _grp = Unit.getGroup(event.initiator)-- Identify the group that fired local _groupname = _grp:getName() -- return the name of the group @@ -142,7 +140,7 @@ trace.f( self.ClassName ) --local _SEADmissileName = _SEADmissile:getTypeName() -- return weapon type --trigger.action.outText( string.format("Alerte, depart missile " ..string.format(_SEADmissileName)), 20) --debug message -- Start of the 2nd loop - --trace.i( self.ClassName, "Missile Launched = " .. _SEADmissileName ) + --self:T( "Missile Launched = " .. _SEADmissileName ) -- Test if the missile was fired within one of the CLEANUP.ZoneNames. local CurrentLandingZoneID = 0 @@ -157,7 +155,7 @@ end --- Detects if the Unit has an S_EVENT_HIT within the given ZoneNames. If this is the case, destroy the unit. function CLEANUP:_EventHitCleanUp( event ) -trace.f( self.ClassName ) + self:T( { event } ) local CleanUpUnit = event.initiator -- the Unit if CleanUpUnit and CleanUpUnit:isExist() and Object.getCategory(CleanUpUnit) == Object.Category.UNIT then @@ -166,9 +164,9 @@ trace.f( self.ClassName ) local CleanUpGroupName = CleanUpGroup:getName() -- return the name of the Group if routines.IsUnitInZones( CleanUpUnit, self.ZoneNames ) ~= nil then - trace.i( self.ClassName, "Life: " .. CleanUpUnitName .. ' = ' .. CleanUpUnit:getLife() .. "/" .. CleanUpUnit:getLife0() ) + self:T( "Life: " .. CleanUpUnitName .. ' = ' .. CleanUpUnit:getLife() .. "/" .. CleanUpUnit:getLife0() ) if CleanUpUnit:getLife() < CleanUpUnit:getLife0() then - trace.i( self.ClassName, "CleanUp: Destroy: " .. CleanUpUnitName ) + self:T( "CleanUp: Destroy: " .. CleanUpUnitName ) routines.scheduleFunction( CLEANUP._DestroyUnit, {self, CleanUpUnit}, timer.getTime() + 0.1) end end @@ -182,9 +180,9 @@ trace.f( self.ClassName ) if routines.IsUnitInZones( CleanUpTgtUnit, self.ZoneNames ) ~= nil then - trace.i( self.ClassName, "Life: " .. CleanUpTgtUnitName .. ' = ' .. CleanUpTgtUnit:getLife() .. "/" .. CleanUpTgtUnit:getLife0() ) + self:T( "Life: " .. CleanUpTgtUnitName .. ' = ' .. CleanUpTgtUnit:getLife() .. "/" .. CleanUpTgtUnit:getLife0() ) if CleanUpTgtUnit:getLife() < CleanUpTgtUnit:getLife0() then - trace.i( self.ClassName, "CleanUp: Destroy: " .. CleanUpTgtUnitName ) + self:T( "CleanUp: Destroy: " .. CleanUpTgtUnitName ) routines.scheduleFunction( CLEANUP._DestroyUnit, {self, CleanUpTgtUnit}, timer.getTime() + 0.1) end end @@ -193,6 +191,7 @@ trace.f( self.ClassName ) end function CLEANUP:_AddForCleanUp( CleanUpUnit, CleanUpUnitName ) + self:T( { CleanUpUnit, CleanUpUnitName } ) self.CleanUpList[CleanUpUnitName] = {} self.CleanUpList[CleanUpUnitName].CleanUpUnit = CleanUpUnit @@ -202,7 +201,7 @@ function CLEANUP:_AddForCleanUp( CleanUpUnit, CleanUpUnitName ) self.CleanUpList[CleanUpUnitName].CleanUpTime = timer.getTime() self.CleanUpList[CleanUpUnitName].CleanUpMoved = false - trace.i( self.ClassName, "CleanUp: Add to CleanUpList: " .. Unit.getGroup(CleanUpUnit):getName() .. " / " .. CleanUpUnitName ) + self:T( { "CleanUp: Add to CleanUpList: ", Unit.getGroup(CleanUpUnit):getName(), CleanUpUnitName } ) end @@ -241,25 +240,26 @@ CleanUpSurfaceTypeText = { --- At the defined time interval, CleanUp the Groups within the CleanUpList. function CLEANUP:_Scheduler() + self:T( "CleanUp Scheduler" ) for CleanUpUnitName, UnitData in pairs( self.CleanUpList ) do - trace.i( self.ClassName, { CleanUpUnitName, UnitData } ) + self:T( { CleanUpUnitName, UnitData } ) local CleanUpGroup = Group.getByName(UnitData.CleanUpGroupName) local CleanUpUnit = Unit.getByName(UnitData.CleanUpUnitName) local CleanUpGroupName = UnitData.CleanUpGroupName local CleanUpUnitName = UnitData.CleanUpUnitName if CleanUpUnit then - trace.i( self.ClassName, "Checking " .. CleanUpUnitName ) + self:T( { "CleanUp Scheduler", "Checking:", CleanUpUnitName } ) if _Database:GetStatusGroup( CleanUpGroupName ) ~= "ReSpawn" then local CleanUpUnitVec3 = CleanUpUnit:getPoint() - --trace.i( self.ClassName, CleanUpUnitVec3 ) + --self:T( CleanUpUnitVec3 ) local CleanUpUnitVec2 = {} CleanUpUnitVec2.x = CleanUpUnitVec3.x CleanUpUnitVec2.y = CleanUpUnitVec3.z - --trace.i( self.ClassName, CleanUpUnitVec2 ) + --self:T( CleanUpUnitVec2 ) local CleanUpSurfaceType = land.getSurfaceType(CleanUpUnitVec2) - --trace.i( self.ClassName, CleanUpSurfaceType ) + --self:T( CleanUpSurfaceType ) --MESSAGE:New( "Surface " .. CleanUpUnitName .. " = " .. CleanUpSurfaceTypeText[CleanUpSurfaceType], CleanUpUnitName, 10, CleanUpUnitName ):ToAll() if CleanUpUnit and CleanUpUnit:getLife() <= CleanUpUnit:getLife0() * 0.95 then @@ -267,13 +267,13 @@ function CLEANUP:_Scheduler() if CleanUpUnit:inAir() then local CleanUpLandHeight = land.getHeight(CleanUpUnitVec2) local CleanUpUnitHeight = CleanUpUnitVec3.y - CleanUpLandHeight - trace.i( self.ClassName, "Height = " .. CleanUpUnitHeight ) + self:T( { "CleanUp Scheduler", "Height = " .. CleanUpUnitHeight } ) if CleanUpUnitHeight < 30 then - trace.i( self.ClassName, "Destroy " .. CleanUpUnitName .. " because below safe height and damaged." ) + self:T( { "CleanUp Scheduler", "Destroy " .. CleanUpUnitName .. " because below safe height and damaged." } ) self:_DestroyUnit(CleanUpUnit, CleanUpUnitName) end else - trace.i( self.ClassName, "Destroy " .. CleanUpUnitName .. " because on runway and damaged." ) + self:T( { "CleanUp Scheduler", "Destroy " .. CleanUpUnitName .. " because on runway and damaged." } ) self:_DestroyUnit(CleanUpUnit, CleanUpUnitName) end end @@ -285,7 +285,7 @@ function CLEANUP:_Scheduler() if CleanUpUnitVelocityTotal < 1 then if UnitData.CleanUpMoved then if UnitData.CleanUpTime + 180 <= timer.getTime() then - trace.i( self.ClassName, "Destroy due to not moving anymore " .. CleanUpUnitName ) + self:T( { "CleanUp Scheduler", "Destroy due to not moving anymore " .. CleanUpUnitName } ) self:_DestroyUnit(CleanUpUnit, CleanUpUnitName) end end @@ -301,7 +301,7 @@ function CLEANUP:_Scheduler() self.CleanUpList[CleanUpUnitName] = nil -- Not anymore in the DCSRTE end else - trace.i( self.ClassName, "CleanUp: Group " .. CleanUpUnitName .. " cannot be found in DCS RTE, removing ..." ) + self:T( "CleanUp: Group " .. CleanUpUnitName .. " cannot be found in DCS RTE, removing ..." ) self.CleanUpList[CleanUpUnitName] = nil -- Not anymore in the DCSRTE end end diff --git a/Moose/Moose_Embedded.lua b/Moose/Moose_Embedded.lua index 92fa0d0c5..1a27b1b0c 100644 --- a/Moose/Moose_Embedded.lua +++ b/Moose/Moose_Embedded.lua @@ -2868,17 +2868,18 @@ _TraceClass = { --SEAD = true, --DESTROYBASETASK = true, --MOVEMENT = true, - SPAWN = true, - STAGE = true, - ZONE = true, - GROUP = true, - UNIT = true, + --SPAWN = true, + --STAGE = true, + --ZONE = true, + --GROUP = true, + --UNIT = true, --CLIENT = true, --CARGO = true, - CARGO_GROUP = true, + --CARGO_GROUP = true, --CARGO_PACKAGE = true, --CARGO_SLINGLOAD = true, - CARGO_ZONE = true, + --CARGO_ZONE = true, + --CLEANUP = true, } BASE = { @@ -3077,7 +3078,7 @@ end -- Trace section - +-- Log a trace (only shown when trace is on) function BASE:T( Arguments ) if _TraceOn and _TraceClass[self.ClassName] then @@ -3096,6 +3097,24 @@ function BASE:T( 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 + + +-- Log an exception +function BASE:E( Arguments ) + + local DebugInfoCurrent = debug.getinfo( 2, "nl" ) + local DebugInfoFrom = debug.getinfo( 3, "l" ) + + local Function = "function" + if DebugInfoCurrent.name then + Function = DebugInfoCurrent.name + end + + local LineCurrent = DebugInfoCurrent.currentline + local LineFrom = DebugInfoFrom.currentline + + env.info( string.format( "%6d\(%6d\)/%1s:%20s%05d.%s\(%s\)" , LineCurrent, LineFrom, "E", self.ClassName, self.ClassID, Function, routines.utils.oneLineSerialize( Arguments ) ) ) +end --- Encapsulation of DCS World Menu system in a set of MENU classes. -- @classmod MENU @@ -8793,11 +8812,9 @@ CLEANUP = { -- or -- CleanUpTbilisi = CLEANUP:New( 'CLEAN Tbilisi', 150 ) -- CleanUpKutaisi = CLEANUP:New( 'CLEAN Kutaisi', 600 ) -function CLEANUP:New( ZoneNames, TimeInterval ) -trace.f( self.ClassName, { ZoneNames, TimeInterval } ) - - -- Arrange meta tables - local self = BASE:Inherit( self, BASE:New() ) +function CLEANUP:New( ZoneNames, TimeInterval ) local self = BASE:Inherit( self, BASE:New() ) + self:T( { ZoneNames, TimeInterval } ) + if type( ZoneNames ) == 'table' then self.ZoneNames = ZoneNames else @@ -8825,19 +8842,19 @@ end --- Destroys a group from the simulator, but checks first if it is still existing! -- @see CLEANUP function CLEANUP:_DestroyGroup( GroupObject, CleanUpGroupName ) -trace.f( self.ClassName ) + self:T( { GroupObject, CleanUpGroupName } ) if GroupObject then -- and GroupObject:isExist() then MESSAGE:New( "Destroy Group " .. CleanUpGroupName, CleanUpGroupName, 1, CleanUpGroupName ):ToAll() trigger.action.deactivateGroup(GroupObject) - trace.i(self.ClassName, "GroupObject Destroyed") + self:T( { "GroupObject Destroyed", GroupObject } ) end end --- Destroys a unit from the simulator, but checks first if it is still existing! -- @see CLEANUP function CLEANUP:_DestroyUnit( CleanUpUnit, CleanUpUnitName ) -trace.f( self.ClassName ) + self:T( { CleanUpUnit, CleanUpUnitName } ) if CleanUpUnit then MESSAGE:New( "Destroy " .. CleanUpUnitName, CleanUpUnitName, 1, CleanUpUnitName ):ToAll() @@ -8849,10 +8866,10 @@ trace.f( self.ClassName ) local Event = {["initiator"]=CleanUpUnit,["id"]=8} world.onEvent(Event) trigger.action.deactivateGroup(CleanUpGroup) - trace.i(self.ClassName, "Destroyed Group " .. CleanUpGroupName ) + self:T( { "Destroyed Group:", CleanUpGroupName } ) else CleanUpUnit:destroy() - trace.i(self.ClassName, "Destroyed Unit " .. CleanUpUnitName ) + self:T( { "Destroyed Unit:", CleanUpUnitName } ) end self.CleanUpList[CleanUpUnitName] = nil -- Cleaning from the list CleanUpUnit = nil @@ -8863,25 +8880,25 @@ end --- Destroys a missile from the simulator, but checks first if it is still existing! -- @see CLEANUP function CLEANUP:_DestroyMissile( MissileObject ) -trace.f( self.ClassName ) + self:T( { MissileObject } ) if MissileObject and MissileObject:isExist() then MissileObject:destroy() - trace.i(self.ClassName, "MissileObject Destroyed") + self:T( "MissileObject Destroyed") end end --- Detects if an SA site was shot with an anti radiation missile. In this case, take evasive actions based on the skill level set within the ME. -- @see CLEANUP function CLEANUP:_EventCrash( event ) -trace.f( self.ClassName ) + self:T( { event } ) --MESSAGE:New( "Crash ", "Crash", 10, "Crash" ):ToAll() - -- trace.i(self.ClassName,"before getGroup") + -- self:T("before getGroup") -- local _grp = Unit.getGroup(event.initiator)-- Identify the group that fired - -- trace.i(self.ClassName,"after getGroup") + -- self:T("after getGroup") -- _grp:destroy() - -- trace.i(self.ClassName,"after deactivateGroup") + -- self:T("after deactivateGroup") -- event.initiator:destroy() local CleanUpUnit = event.initiator -- the Unit @@ -8901,7 +8918,7 @@ end --- Detects if an SA site was shot with an anti radiation missile. In this case, take evasive actions based on the skill level set within the ME. -- @see CLEANUP function CLEANUP:_EventShot( event ) -trace.f( self.ClassName ) + self:T( { event } ) local _grp = Unit.getGroup(event.initiator)-- Identify the group that fired local _groupname = _grp:getName() -- return the name of the group @@ -8910,7 +8927,7 @@ trace.f( self.ClassName ) --local _SEADmissileName = _SEADmissile:getTypeName() -- return weapon type --trigger.action.outText( string.format("Alerte, depart missile " ..string.format(_SEADmissileName)), 20) --debug message -- Start of the 2nd loop - --trace.i( self.ClassName, "Missile Launched = " .. _SEADmissileName ) + --self:T( "Missile Launched = " .. _SEADmissileName ) -- Test if the missile was fired within one of the CLEANUP.ZoneNames. local CurrentLandingZoneID = 0 @@ -8925,7 +8942,7 @@ end --- Detects if the Unit has an S_EVENT_HIT within the given ZoneNames. If this is the case, destroy the unit. function CLEANUP:_EventHitCleanUp( event ) -trace.f( self.ClassName ) + self:T( { event } ) local CleanUpUnit = event.initiator -- the Unit if CleanUpUnit and CleanUpUnit:isExist() and Object.getCategory(CleanUpUnit) == Object.Category.UNIT then @@ -8934,9 +8951,9 @@ trace.f( self.ClassName ) local CleanUpGroupName = CleanUpGroup:getName() -- return the name of the Group if routines.IsUnitInZones( CleanUpUnit, self.ZoneNames ) ~= nil then - trace.i( self.ClassName, "Life: " .. CleanUpUnitName .. ' = ' .. CleanUpUnit:getLife() .. "/" .. CleanUpUnit:getLife0() ) + self:T( "Life: " .. CleanUpUnitName .. ' = ' .. CleanUpUnit:getLife() .. "/" .. CleanUpUnit:getLife0() ) if CleanUpUnit:getLife() < CleanUpUnit:getLife0() then - trace.i( self.ClassName, "CleanUp: Destroy: " .. CleanUpUnitName ) + self:T( "CleanUp: Destroy: " .. CleanUpUnitName ) routines.scheduleFunction( CLEANUP._DestroyUnit, {self, CleanUpUnit}, timer.getTime() + 0.1) end end @@ -8950,9 +8967,9 @@ trace.f( self.ClassName ) if routines.IsUnitInZones( CleanUpTgtUnit, self.ZoneNames ) ~= nil then - trace.i( self.ClassName, "Life: " .. CleanUpTgtUnitName .. ' = ' .. CleanUpTgtUnit:getLife() .. "/" .. CleanUpTgtUnit:getLife0() ) + self:T( "Life: " .. CleanUpTgtUnitName .. ' = ' .. CleanUpTgtUnit:getLife() .. "/" .. CleanUpTgtUnit:getLife0() ) if CleanUpTgtUnit:getLife() < CleanUpTgtUnit:getLife0() then - trace.i( self.ClassName, "CleanUp: Destroy: " .. CleanUpTgtUnitName ) + self:T( "CleanUp: Destroy: " .. CleanUpTgtUnitName ) routines.scheduleFunction( CLEANUP._DestroyUnit, {self, CleanUpTgtUnit}, timer.getTime() + 0.1) end end @@ -8961,6 +8978,7 @@ trace.f( self.ClassName ) end function CLEANUP:_AddForCleanUp( CleanUpUnit, CleanUpUnitName ) + self:T( { CleanUpUnit, CleanUpUnitName } ) self.CleanUpList[CleanUpUnitName] = {} self.CleanUpList[CleanUpUnitName].CleanUpUnit = CleanUpUnit @@ -8970,7 +8988,7 @@ function CLEANUP:_AddForCleanUp( CleanUpUnit, CleanUpUnitName ) self.CleanUpList[CleanUpUnitName].CleanUpTime = timer.getTime() self.CleanUpList[CleanUpUnitName].CleanUpMoved = false - trace.i( self.ClassName, "CleanUp: Add to CleanUpList: " .. Unit.getGroup(CleanUpUnit):getName() .. " / " .. CleanUpUnitName ) + self:T( { "CleanUp: Add to CleanUpList: ", Unit.getGroup(CleanUpUnit):getName(), CleanUpUnitName } ) end @@ -9009,25 +9027,26 @@ CleanUpSurfaceTypeText = { --- At the defined time interval, CleanUp the Groups within the CleanUpList. function CLEANUP:_Scheduler() + self:T( "CleanUp Scheduler" ) for CleanUpUnitName, UnitData in pairs( self.CleanUpList ) do - trace.i( self.ClassName, { CleanUpUnitName, UnitData } ) + self:T( { CleanUpUnitName, UnitData } ) local CleanUpGroup = Group.getByName(UnitData.CleanUpGroupName) local CleanUpUnit = Unit.getByName(UnitData.CleanUpUnitName) local CleanUpGroupName = UnitData.CleanUpGroupName local CleanUpUnitName = UnitData.CleanUpUnitName if CleanUpUnit then - trace.i( self.ClassName, "Checking " .. CleanUpUnitName ) + self:T( { "CleanUp Scheduler", "Checking:", CleanUpUnitName } ) if _Database:GetStatusGroup( CleanUpGroupName ) ~= "ReSpawn" then local CleanUpUnitVec3 = CleanUpUnit:getPoint() - --trace.i( self.ClassName, CleanUpUnitVec3 ) + --self:T( CleanUpUnitVec3 ) local CleanUpUnitVec2 = {} CleanUpUnitVec2.x = CleanUpUnitVec3.x CleanUpUnitVec2.y = CleanUpUnitVec3.z - --trace.i( self.ClassName, CleanUpUnitVec2 ) + --self:T( CleanUpUnitVec2 ) local CleanUpSurfaceType = land.getSurfaceType(CleanUpUnitVec2) - --trace.i( self.ClassName, CleanUpSurfaceType ) + --self:T( CleanUpSurfaceType ) --MESSAGE:New( "Surface " .. CleanUpUnitName .. " = " .. CleanUpSurfaceTypeText[CleanUpSurfaceType], CleanUpUnitName, 10, CleanUpUnitName ):ToAll() if CleanUpUnit and CleanUpUnit:getLife() <= CleanUpUnit:getLife0() * 0.95 then @@ -9035,13 +9054,13 @@ function CLEANUP:_Scheduler() if CleanUpUnit:inAir() then local CleanUpLandHeight = land.getHeight(CleanUpUnitVec2) local CleanUpUnitHeight = CleanUpUnitVec3.y - CleanUpLandHeight - trace.i( self.ClassName, "Height = " .. CleanUpUnitHeight ) + self:T( { "CleanUp Scheduler", "Height = " .. CleanUpUnitHeight } ) if CleanUpUnitHeight < 30 then - trace.i( self.ClassName, "Destroy " .. CleanUpUnitName .. " because below safe height and damaged." ) + self:T( { "CleanUp Scheduler", "Destroy " .. CleanUpUnitName .. " because below safe height and damaged." } ) self:_DestroyUnit(CleanUpUnit, CleanUpUnitName) end else - trace.i( self.ClassName, "Destroy " .. CleanUpUnitName .. " because on runway and damaged." ) + self:T( { "CleanUp Scheduler", "Destroy " .. CleanUpUnitName .. " because on runway and damaged." } ) self:_DestroyUnit(CleanUpUnit, CleanUpUnitName) end end @@ -9053,7 +9072,7 @@ function CLEANUP:_Scheduler() if CleanUpUnitVelocityTotal < 1 then if UnitData.CleanUpMoved then if UnitData.CleanUpTime + 180 <= timer.getTime() then - trace.i( self.ClassName, "Destroy due to not moving anymore " .. CleanUpUnitName ) + self:T( { "CleanUp Scheduler", "Destroy due to not moving anymore " .. CleanUpUnitName } ) self:_DestroyUnit(CleanUpUnit, CleanUpUnitName) end end @@ -9069,7 +9088,7 @@ function CLEANUP:_Scheduler() self.CleanUpList[CleanUpUnitName] = nil -- Not anymore in the DCSRTE end else - trace.i( self.ClassName, "CleanUp: Group " .. CleanUpUnitName .. " cannot be found in DCS RTE, removing ..." ) + self:T( "CleanUp: Group " .. CleanUpUnitName .. " cannot be found in DCS RTE, removing ..." ) self.CleanUpList[CleanUpUnitName] = nil -- Not anymore in the DCSRTE end end @@ -9458,6 +9477,10 @@ function SPAWN:GetSpawnIndex( SpawnIndex ) if ( self.SpawnMaxGroups == 0 ) or ( SpawnIndex <= self.SpawnMaxGroups ) then if ( self.SpawnMaxGroupsAlive == 0 ) or ( self.AliveUnits < self.SpawnMaxGroupsAlive * #self.SpawnTemplate.units ) or self.UnControlled then + if SpawnIndex and SpawnIndex >= self.SpawnCount + 1 then + self.SpawnCount = self.SpawnCount + 1 + SpawnIndex = self.SpawnCount + end self.SpawnIndex = SpawnIndex if not self.SpawnGroups[self.SpawnIndex] then self:InitializeSpawnGroups( self.SpawnIndex ) @@ -9785,14 +9808,16 @@ end function SPAWN:GetGroupIndexFromDCSUnit( DCSUnit ) self:T( { self.SpawnTemplatePrefix, self.SpawnAliasPrefix, DCSUnit } ) - - local IndexString = string.match( DCSUnit:getName(), "#.*-" ):sub( 2, -2 ) - self:T( IndexString ) - - if IndexString then - local Index = tonumber( IndexString ) - self:T( { "Index:", IndexString, Index } ) - return Index + + if DCSUnit and DCSUnit:getName() then + local IndexString = string.match( DCSUnit:getName(), "#.*-" ):sub( 2, -2 ) + self:T( IndexString ) + + if IndexString then + local Index = tonumber( IndexString ) + self:T( { "Index:", IndexString, Index } ) + return Index + end end return nil @@ -9801,22 +9826,32 @@ end function SPAWN:GetPrefixFromDCSUnit( DCSUnit ) self:T( { self.SpawnTemplatePrefix, self.SpawnAliasPrefix, DCSUnit } ) - local SpawnPrefix = string.match( DCSUnit:getName(), ".*#" ):sub( 1, -2 ) - self:T( SpawnPrefix ) - - return SpawnPrefix + if DCSUnit and DCSUnit:getName() then + local SpawnPrefix = string.match( DCSUnit:getName(), ".*#" ) + if SpawnPrefix then + SpawnPrefix = SpawnPrefix:sub( 1, -2 ) + else + self:E( { "This name does not contain a #", DCSUnit:getName() } ) + end + self:T( SpawnPrefix ) + return SpawnPrefix + end + + return nil end function SPAWN:GetGroupFromDCSUnit( DCSUnit ) self:T( { self.SpawnTemplatePrefix, self.SpawnAliasPrefix, DCSUnit } ) - local SpawnPrefix = self:GetPrefixFromDCSUnit( DCSUnit ) - - if self.SpawnTemplatePrefix == SpawnPrefix or ( self.SpawnAliasPrefix and self.SpawnAliasPrefix == SpawnPrefix ) then - local SpawnGroupIndex = self:GetGroupIndexFromDCSUnit( DCSUnit ) - local SpawnGroup = self.SpawnGroups[SpawnGroupIndex].Group - self:T( SpawnGroup ) - return SpawnGroup + if DCSUnit then + local SpawnPrefix = self:GetPrefixFromDCSUnit( DCSUnit ) + + if self.SpawnTemplatePrefix == SpawnPrefix or ( self.SpawnAliasPrefix and self.SpawnAliasPrefix == SpawnPrefix ) then + local SpawnGroupIndex = self:GetGroupIndexFromDCSUnit( DCSUnit ) + local SpawnGroup = self.SpawnGroups[SpawnGroupIndex].Group + self:T( SpawnGroup ) + return SpawnGroup + end end return nil @@ -10123,10 +10158,12 @@ self:T( { "_Scheduler", self.SpawnTemplatePrefix, self.SpawnAliasPrefix, self.Sp end function SPAWN:_SpawnCleanUpScheduler() - self:T( "CleanUp Scheduler:" .. self.SpawnTemplatePrefix ) + self:T( { "CleanUp Scheduler:", self.SpawnTemplatePrefix } ) local SpawnCursor local SpawnGroup, SpawnCursor = self:GetFirstAliveGroup( SpawnCursor ) + + self:T( { "CleanUp Scheduler:", SpawnGroup } ) while SpawnGroup do @@ -10135,6 +10172,7 @@ function SPAWN:_SpawnCleanUpScheduler() self.SpawnCleanUpTimeStamps[SpawnGroup:GetName()] = timer.getTime() else if self.SpawnCleanUpTimeStamps[SpawnGroup:GetName()] + self.SpawnCleanUpInterval < timer.getTime() then + self:T( { "CleanUp Scheduler:", "Cleaning:", SpawnGroup } ) SpawnGroup:Destroy() end end @@ -10143,6 +10181,9 @@ function SPAWN:_SpawnCleanUpScheduler() end SpawnGroup, SpawnCursor = self:GetNextAliveGroup( SpawnCursor ) + + self:T( { "CleanUp Scheduler:", SpawnGroup } ) + end end diff --git a/Moose/Spawn.lua b/Moose/Spawn.lua index ef2cf34de..f991500d9 100644 --- a/Moose/Spawn.lua +++ b/Moose/Spawn.lua @@ -381,6 +381,10 @@ function SPAWN:GetSpawnIndex( SpawnIndex ) if ( self.SpawnMaxGroups == 0 ) or ( SpawnIndex <= self.SpawnMaxGroups ) then if ( self.SpawnMaxGroupsAlive == 0 ) or ( self.AliveUnits < self.SpawnMaxGroupsAlive * #self.SpawnTemplate.units ) or self.UnControlled then + if SpawnIndex and SpawnIndex >= self.SpawnCount + 1 then + self.SpawnCount = self.SpawnCount + 1 + SpawnIndex = self.SpawnCount + end self.SpawnIndex = SpawnIndex if not self.SpawnGroups[self.SpawnIndex] then self:InitializeSpawnGroups( self.SpawnIndex ) @@ -708,14 +712,16 @@ end function SPAWN:GetGroupIndexFromDCSUnit( DCSUnit ) self:T( { self.SpawnTemplatePrefix, self.SpawnAliasPrefix, DCSUnit } ) - - local IndexString = string.match( DCSUnit:getName(), "#.*-" ):sub( 2, -2 ) - self:T( IndexString ) - - if IndexString then - local Index = tonumber( IndexString ) - self:T( { "Index:", IndexString, Index } ) - return Index + + if DCSUnit and DCSUnit:getName() then + local IndexString = string.match( DCSUnit:getName(), "#.*-" ):sub( 2, -2 ) + self:T( IndexString ) + + if IndexString then + local Index = tonumber( IndexString ) + self:T( { "Index:", IndexString, Index } ) + return Index + end end return nil @@ -724,22 +730,32 @@ end function SPAWN:GetPrefixFromDCSUnit( DCSUnit ) self:T( { self.SpawnTemplatePrefix, self.SpawnAliasPrefix, DCSUnit } ) - local SpawnPrefix = string.match( DCSUnit:getName(), ".*#" ):sub( 1, -2 ) - self:T( SpawnPrefix ) - - return SpawnPrefix + if DCSUnit and DCSUnit:getName() then + local SpawnPrefix = string.match( DCSUnit:getName(), ".*#" ) + if SpawnPrefix then + SpawnPrefix = SpawnPrefix:sub( 1, -2 ) + else + self:E( { "This name does not contain a #", DCSUnit:getName() } ) + end + self:T( SpawnPrefix ) + return SpawnPrefix + end + + return nil end function SPAWN:GetGroupFromDCSUnit( DCSUnit ) self:T( { self.SpawnTemplatePrefix, self.SpawnAliasPrefix, DCSUnit } ) - local SpawnPrefix = self:GetPrefixFromDCSUnit( DCSUnit ) - - if self.SpawnTemplatePrefix == SpawnPrefix or ( self.SpawnAliasPrefix and self.SpawnAliasPrefix == SpawnPrefix ) then - local SpawnGroupIndex = self:GetGroupIndexFromDCSUnit( DCSUnit ) - local SpawnGroup = self.SpawnGroups[SpawnGroupIndex].Group - self:T( SpawnGroup ) - return SpawnGroup + if DCSUnit then + local SpawnPrefix = self:GetPrefixFromDCSUnit( DCSUnit ) + + if self.SpawnTemplatePrefix == SpawnPrefix or ( self.SpawnAliasPrefix and self.SpawnAliasPrefix == SpawnPrefix ) then + local SpawnGroupIndex = self:GetGroupIndexFromDCSUnit( DCSUnit ) + local SpawnGroup = self.SpawnGroups[SpawnGroupIndex].Group + self:T( SpawnGroup ) + return SpawnGroup + end end return nil @@ -1046,10 +1062,12 @@ self:T( { "_Scheduler", self.SpawnTemplatePrefix, self.SpawnAliasPrefix, self.Sp end function SPAWN:_SpawnCleanUpScheduler() - self:T( "CleanUp Scheduler:" .. self.SpawnTemplatePrefix ) + self:T( { "CleanUp Scheduler:", self.SpawnTemplatePrefix } ) local SpawnCursor local SpawnGroup, SpawnCursor = self:GetFirstAliveGroup( SpawnCursor ) + + self:T( { "CleanUp Scheduler:", SpawnGroup } ) while SpawnGroup do @@ -1058,6 +1076,7 @@ function SPAWN:_SpawnCleanUpScheduler() self.SpawnCleanUpTimeStamps[SpawnGroup:GetName()] = timer.getTime() else if self.SpawnCleanUpTimeStamps[SpawnGroup:GetName()] + self.SpawnCleanUpInterval < timer.getTime() then + self:T( { "CleanUp Scheduler:", "Cleaning:", SpawnGroup } ) SpawnGroup:Destroy() end end @@ -1066,6 +1085,9 @@ function SPAWN:_SpawnCleanUpScheduler() end SpawnGroup, SpawnCursor = self:GetNextAliveGroup( SpawnCursor ) + + self:T( { "CleanUp Scheduler:", SpawnGroup } ) + end end diff --git a/Test Missions/MOOSE_Spawn_Test.miz b/Test Missions/MOOSE_Spawn_Test.miz index f0ef9602d0444f4e38c06eb070c8e92d3391f57f..7aacb46288b6624b0651c4352fba40ed0e18052b 100644 GIT binary patch delta 24902 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 Ml@W;~VF2i@-jasU7T delta 24639 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 S79KSYc9_P1grEGk!~X%sJ6(|g