Improved the CleanUp

CleanUp now works detecting if units are floating above airport runways,
and if they do, they will be destroyed.
This commit is contained in:
svenvandevelde 2015-12-02 13:42:33 +01:00
parent 921a9999cb
commit 92c9b27b71
4 changed files with 92 additions and 79 deletions

View File

@ -143,6 +143,12 @@ function BASE:onEvent(event)
--env.info( 'onEvent EventObject.Event = ' .. tostring(EventObject.Event) )
if event.id == EventObject.Event then
if self == EventObject.Self then
if event.initiator and event.initiator:isExist() then
event.IniUnitName = event.initiator:getName()
end
if event.target and event.target:isExist() then
event.TgtUnitName = event.target:getName()
end
trace.i( self.ClassName, { BaseEventCodes[event.id], event } )
EventObject.EventFunction( self, event )
end

View File

@ -59,7 +59,7 @@ function CLEANUP:_DestroyGroup( GroupObject, CleanUpGroupName )
trace.f( self.ClassName )
if GroupObject then -- and GroupObject:isExist() then
MESSAGE:New( "Destroy " .. CleanUpGroupName, CleanUpGroupName, 10, CleanUpGroupName ):ToAll()
MESSAGE:New( "Destroy Group " .. CleanUpGroupName, CleanUpGroupName, 1, CleanUpGroupName ):ToAll()
trigger.action.deactivateGroup(GroupObject)
trace.i(self.ClassName, "GroupObject Destroyed")
end
@ -67,13 +67,13 @@ end
--- Destroys a unit from the simulator, but checks first if it is still existing!
-- @see CLEANUP
function CLEANUP:_DestroyUnit( CleanUpUnitObject, CleanUpUnitName )
function CLEANUP:_DestroyUnit( CleanUpUnit, CleanUpUnitName )
trace.f( self.ClassName )
if CleanUpUnitObject then
MESSAGE:New( "Destroy " .. CleanUpUnitName, CleanUpUnitName, 10, CleanUpUnitName ):ToAll()
CleanUpUnitObject:destroy()
trace.i(self.ClassName, "UnitObject Destroyed")
if CleanUpUnit then
MESSAGE:New( "Destroy " .. CleanUpUnitName, CleanUpUnitName, 1, CleanUpUnitName ):ToAll()
CleanUpUnit:destroy()
trace.i(self.ClassName, "Destroyed " .. CleanUpUnitName )
end
end
@ -216,6 +216,7 @@ trace.f( self.ClassName )
--]]
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 )
@ -253,47 +254,37 @@ trace.f( self.ClassName )
end
function CLEANUP:_AddForCleanUp( CleanUpUnit, CleanUpUnitName )
self.CleanUpList[CleanUpUnitName] = {}
self.CleanUpList[CleanUpUnitName].CleanUpUnit = CleanUpUnit
self.CleanUpList[CleanUpUnitName].CleanUpUnitName = CleanUpUnitName
self.CleanUpList[CleanUpUnitName].CleanUpGroup = Unit.getGroup(CleanUpUnit)
self.CleanUpList[CleanUpUnitName].CleanUpGroupName = Unit.getGroup(CleanUpUnit):getName()
trace.i( self.ClassName, "CleanUp: Add to CleanUpList: " .. Unit.getGroup(CleanUpUnit):getName() .. " / " .. CleanUpUnitName )
end
--- Detects if the Unit has an S_EVENT_ENGINE_SHUTDOWN or an S_EVENT_HIT within the given ZoneNames. If this is the case, add the Group to the CLEANUP List.
function CLEANUP:_EventAddForCleanUp( event )
trace.f( self.ClassName, { event } )
if event.initiator and Object.getCategory(event.initiator) == Object.Category.UNIT then
local CleanUpUnit = event.initiator -- the Unit
local CleanUpUnitName = event.initiator:getName() -- return the name of the Unit
local CleanUpGroup = Unit.getGroup(event.initiator)-- Identify the Group
local CleanUpGroupName = CleanUpGroup:getName() -- return the name of the Group
if not self.CleanUpList[CleanUpGroupName] then
local AddForCleanUp = false
local CleanUpUnit = event.initiator -- the Unit
if CleanUpUnit and Object.getCategory(CleanUpUnit) == Object.Category.UNIT then
local CleanUpUnitName = CleanUpUnit:getName() -- return the name of the Unit
if self.CleanUpList[CleanUpUnitName] == nil then
if routines.IsUnitInZones( CleanUpUnit, self.ZoneNames ) ~= nil then
AddForCleanUp = true
end
if AddForCleanUp == true then
trace.i( self.ClassName, "CleanUp: Add for CleanUp: " .. CleanUpGroupName .. "/" .. CleanUpUnitName )
self:_AddForCleanUp( CleanUpUnit, CleanUpUnitName )
end
end
end
if event.target and Object.getCategory(event.target) == Object.Category.UNIT then
local CleanUpTgtUnit = event.target -- the target Unit
if CleanUpTgtUnit then
local CleanUpTgtUnitName = event.target:getName() -- return the name of the target Unit
local CleanUpTgtGroup = Unit.getGroup(event.target)-- Identify the target Group
local CleanUpTgtGroupName = CleanUpTgtGroup:getName() -- return the name of the target Group
if not self.CleanUpList[CleanUpTgtUnitName] then
local AddForCleanUp = false
if routines.IsUnitInZones( CleanUpTgtUnit, self.ZoneNames ) ~= nil then
AddForCleanUp = true
--env.info( "CleanUp:" .. CleanUpTgtGroupName .. "/" .. CleanUpTgtUnitName )
end
if AddForCleanUp == true then
trace.i( self.ClassName, "CleanUp: Add for CleanUp: " .. CleanUpTgtGroupName .. "/" .. CleanUpTgtUnitName )
self.CleanUpList[CleanUpTgtUnitName] = {}
self.CleanUpList[CleanUpTgtUnitName].CleanUpUnit = CleanUpTgtUnit
self.CleanUpList[CleanUpTgtUnitName].CleanUpGroup = CleanUpTgtGroup
self.CleanUpList[CleanUpTgtUnitName].CleanUpGroupName = CleanUpTgtGroupName
self.CleanUpList[CleanUpTgtUnitName].CleanUpUnitName = CleanUpTgtUnitName
end
local CleanUpTgtUnit = event.target -- the target Unit
if CleanUpTgtUnit and Object.getCategory(CleanUpTgtUnit) == Object.Category.UNIT then
local CleanUpTgtUnitName = CleanUpTgtUnit:getName() -- return the name of the target Unit
if self.CleanUpList[CleanUpTgtUnitName] == nil then
if routines.IsUnitInZones( CleanUpTgtUnit, self.ZoneNames ) ~= nil then
self:_AddForCleanUp( CleanUpTgtUnit, CleanUpTgtUnitName )
end
end
end
@ -312,59 +303,59 @@ CleanUpSurfaceTypeText = {
function CLEANUP:_Scheduler()
for CleanUpUnitName, UnitData in pairs( self.CleanUpList ) do
--env.info( "CleanUp: GroupName = " .. GroupName .. " UnitName = " .. ListData )
trace.i( self.ClassName, { CleanUpUnitName, UnitData } )
local CleanUpGroup = Group.getByName(UnitData.CleanUpGroupName)
local CleanUpUnit = Unit.getByName(UnitData.CleanUpUnitName)
local CleanUpGroupName = UnitData.CleanUpGroupName
local CleanUpUnitName = UnitData.CleanUpUnitName
if CleanUpGroup and CleanUpUnit then
trace.i( self.ClassName, "CleanUp: " .. CleanUpGroupName )
if CleanUpGroup:isExist() and CleanUpUnit:isExist() then
if _Database:GetStatusGroup( CleanUpGroupName ) ~= "ReSpawn" then
local CleanUpUnitVec3 = CleanUpUnit:getPoint()
trace.i( self.ClassName, CleanUpUnitVec3 )
local CleanUpUnitVec2 = {}
CleanUpUnitVec2.x = CleanUpUnitVec3.x
CleanUpUnitVec2.y = CleanUpUnitVec3.z
trace.i( self.ClassName, CleanUpUnitVec2 )
local CleanUpSurfaceType = land.getSurfaceType(CleanUpUnitVec2)
trace.i( self.ClassName, CleanUpSurfaceType )
MESSAGE:New( "Surface " .. CleanUpUnitName .. " = " .. CleanUpSurfaceTypeText[CleanUpSurfaceType], CleanUpUnitName, 10, CleanUpUnitName ):ToAll()
if CleanUpUnit:getLife() <= CleanUpUnit:getLife0() * 0.95 then
if CleanUpSurfaceType == land.SurfaceType.RUNWAY then
trace.i( self.ClassName, "CleanUp: Destroy " .. CleanUpGroupName .. " because above runway and damaged." )
self:_DestroyUnit(CleanUpUnit, CleanUpUnitName)
UnitData = nil
end
if CleanUpUnit then
trace.i( self.ClassName, "Checking " .. CleanUpUnitName )
if _Database:GetStatusGroup( CleanUpGroupName ) ~= "ReSpawn" then
local CleanUpUnitVec3 = CleanUpUnit:getPoint()
trace.i( self.ClassName, CleanUpUnitVec3 )
local CleanUpUnitVec2 = {}
CleanUpUnitVec2.x = CleanUpUnitVec3.x
CleanUpUnitVec2.y = CleanUpUnitVec3.z
trace.i( self.ClassName, CleanUpUnitVec2 )
local CleanUpSurfaceType = land.getSurfaceType(CleanUpUnitVec2)
trace.i( self.ClassName, CleanUpSurfaceType )
MESSAGE:New( "Surface " .. CleanUpUnitName .. " = " .. CleanUpSurfaceTypeText[CleanUpSurfaceType], CleanUpUnitName, 10, CleanUpUnitName ):ToAll()
if CleanUpUnit:getLife() <= CleanUpUnit:getLife0() * 0.95 then
if CleanUpSurfaceType == land.SurfaceType.RUNWAY then
trace.i( self.ClassName, "Destroy " .. CleanUpUnitName .. " because above runway and damaged." )
self:_DestroyUnit(CleanUpUnit, CleanUpUnitName)
self.CleanUpList[CleanUpUnitName] = nil -- Not anymore in the DCSRTE
else
if CleanUpUnit:inAir() then
if CleanUpUnit.getHeight(CleanUpUnitVec2) < 20 then
trace.i( self.ClassName, "CleanUp: Destroy " .. CleanUpGroupName .. " because below safe height and damaged." )
local CleanUpLandHeight = land.getHeight(CleanUpUnitVec2)
local CleanUpUnitHeight = CleanUpUnitVec3.y - CleanUpLandHeight
trace.i( self.ClassName, "In and height = " .. CleanUpUnitHeight )
--if CleanUpUnitHeight < 20 then
-- trace.i( self.ClassName, "Destroy " .. CleanUpUnitName .. " because below safe height and damaged." )
-- self:_DestroyUnit(CleanUpUnit, CleanUpUnitName)
-- self.CleanUpList[CleanUpUnitName] = nil -- Not anymore in the DCSRTE
--end
else
local CleanUpUnitVelocity = CleanUpUnit:getVelocity()
local CleanUpUnitVelocityTotal = math.abs(CleanUpUnitVelocity.x) + math.abs(CleanUpUnitVelocity.y) + math.abs(CleanUpUnitVelocity.z)
if CleanUpUnitVelocityTotal < 1 then
trace.i( self.ClassName, "Destroy: " .. CleanUpGroupName )
self:_DestroyUnit(CleanUpUnit, CleanUpUnitName)
UnitData = nil
self.CleanUpList[CleanUpUnitName] = nil -- Not anymore in the DCSRTE
end
end
end
local CleanUpUnitVelocity = CleanUpUnit:getVelocity()
local CleanUpUnitVelocityTotal = math.abs(CleanUpUnitVelocity.x) + math.abs(CleanUpUnitVelocity.y) + math.abs(CleanUpUnitVelocity.z)
if CleanUpUnitVelocityTotal < 1 then
trace.i( self.ClassName, "CleanUp: Destroy: " .. CleanUpGroupName )
self:_DestroyUnit(CleanUpUnit, CleanUpUnitName)
UnitData = nil
end
else
-- Do nothing ...
UnitData = nil
end
else
trace.i( self.ClassName, "CleanUp: Group " .. CleanUpGroupName .. " does not exist anymore in CleanUpList, Removing ..." )
UnitData = nil
-- Do nothing ...
self.CleanUpList[CleanUpUnitName] = nil -- Not anymore in the DCSRTE
end
else
trace.i( self.ClassName, "CleanUp: Group " .. CleanUpGroupName .. " cannot be found in DCS RTE, removing ..." )
UnitData = nil -- Not anymore in the DCSRTE
self.CleanUpList[CleanUpUnitName] = nil -- Not anymore in the DCSRTE
end
end
end

View File

@ -16,7 +16,7 @@ Include.File = function( IncludeFile )
end
Include.File( "Database" )
Include.File( "StatHandler" )
--Include.File( "StatHandler" )
--Sanitize Mission Scripting environment
--This makes unavailable some unsecure functions.

View File

@ -2388,6 +2388,22 @@ trace.f()
end
function GetUnitHeight( CheckUnit )
trace.f()
local UnitPoint = CheckUnit:getPoint()
local UnitPosition = { x = CurrentPoint.x, y = CurrentPoint.z }
local UnitHeight = CurrentPoint.y
local LandHeight = land.getHeight( CurrentPosition )
--env.info(( 'CarrierHeight: LandHeight = ' .. LandHeight .. ' CarrierHeight = ' .. CarrierHeight ))
return CarrierHeight - LandHeight
end
_MusicTable = {}
_MusicTable.Files = {}
_MusicTable.Queue = {}