diff --git a/Moose Development/Moose/Functional/CleanUp.lua b/Moose Development/Moose/Functional/CleanUp.lua index e8fd44972..daed34b02 100644 --- a/Moose Development/Moose/Functional/CleanUp.lua +++ b/Moose Development/Moose/Functional/CleanUp.lua @@ -1,54 +1,54 @@ --- **Functional** -- Keep airbases clean of crashing or colliding airplanes, and kill missiles when being fired at airbases. --- +-- -- === --- +-- -- ## Features: --- --- +-- +-- -- * Try to keep the airbase clean and operational. -- * Prevent airplanes from crashing. -- * Clean up obstructing airplanes from the runway that are standing still for a period of time. -- * Prevent airplanes firing missiles within the airbase zone. --- +-- -- === --- +-- -- ## Missions: --- +-- -- [CLA - CleanUp Airbase](https://github.com/FlightControl-Master/MOOSE_MISSIONS/tree/master/CLA%20-%20CleanUp%20Airbase) --- +-- -- === --- +-- -- Specific airbases need to be provided that need to be guarded. Each airbase registered, will be guarded within a zone of 8 km around the airbase. -- Any unit that fires a missile, or shoots within the zone of an airbase, will be monitored by CLEANUP_AIRBASE. --- Within the 8km zone, units cannot fire any missile, which prevents the airbase runway to receive missile or bomb hits. +-- Within the 8km zone, units cannot fire any missile, which prevents the airbase runway to receive missile or bomb hits. -- Any airborne or ground unit that is on the runway below 30 meters (default value) will be automatically removed if it is damaged. --- +-- -- This is not a full 100% secure implementation. It is still possible that CLEANUP_AIRBASE cannot prevent (in-time) to keep the airbase clean. -- The following situations may happen that will still stop the runway of an airbase: --- +-- -- * A damaged unit is not removed on time when above the runway, and crashes on the runway. -- * A bomb or missile is still able to dropped on the runway. -- * Units collide on the airbase, and could not be removed on time. --- +-- -- When a unit is within the airbase zone and needs to be monitored, -- its status will be checked every 0.25 seconds! This is required to ensure that the airbase is kept clean. -- But as a result, there is more CPU overload. --- +-- -- So as an advise, I suggest you use the CLEANUP_AIRBASE class with care: --- +-- -- * Only monitor airbases that really need to be monitored! -- * Try not to monitor airbases that are likely to be invaded by enemy troops. -- For these airbases, there is little use to keep them clean, as they will be invaded anyway... --- +-- -- By following the above guidelines, you can add airbase cleanup with acceptable CPU overhead. --- +-- -- === --- +-- -- ### Author: **FlightControl** --- ### Contributions: --- +-- ### Contributions: +-- -- === --- +-- -- @module Functional.CleanUp -- @image CleanUp_Airbases.JPG @@ -60,29 +60,29 @@ -- @extends #CLEANUP_AIRBASE.__ --- Keeps airbases clean, and tries to guarantee continuous airbase operations, even under combat. --- +-- -- # 1. CLEANUP_AIRBASE Constructor --- +-- -- Creates the main object which is preventing the airbase to get polluted with debris on the runway, which halts the airbase. --- +-- -- -- Clean these Zones. --- CleanUpAirports = CLEANUP_AIRBASE:New( { AIRBASE.Caucasus.Tbilisi, AIRBASE.Caucasus.Kutaisi } ) --- +-- CleanUpAirports = CLEANUP_AIRBASE:New( { AIRBASE.Caucasus.Tbilisi, AIRBASE.Caucasus.Kutaisi ) +-- -- -- or -- CleanUpTbilisi = CLEANUP_AIRBASE:New( AIRBASE.Caucasus.Tbilisi ) -- CleanUpKutaisi = CLEANUP_AIRBASE:New( AIRBASE.Caucasus.Kutaisi ) --- +-- -- # 2. Add or Remove airbases --- +-- -- The method @{#CLEANUP_AIRBASE.AddAirbase}() to add an airbase to the cleanup validation process. -- The method @{#CLEANUP_AIRBASE.RemoveAirbase}() removes an airbase from the cleanup validation process. --- +-- -- # 3. Clean missiles and bombs within the airbase zone. --- +-- -- When missiles or bombs hit the runway, the airbase operations stop. -- Use the method @{#CLEANUP_AIRBASE.SetCleanMissiles}() to control the cleaning of missiles, which will prevent airbases to stop. -- Note that this method will not allow anymore airbases to be attacked, so there is a trade-off here to do. --- +-- -- @field #CLEANUP_AIRBASE CLEANUP_AIRBASE = { ClassName = "CLEANUP_AIRBASE", @@ -106,11 +106,11 @@ CLEANUP_AIRBASE.__.Airbases = {} -- or -- CleanUpTbilisi = CLEANUP_AIRBASE:New( AIRBASE.Caucasus.Tbilisi ) -- CleanUpKutaisi = CLEANUP_AIRBASE:New( AIRBASE.Caucasus.Kutaisi ) -function CLEANUP_AIRBASE:New( AirbaseNames ) +function CLEANUP_AIRBASE:New( AirbaseNames ) local self = BASE:Inherit( self, BASE:New() ) -- #CLEANUP_AIRBASE self:F( { AirbaseNames } ) - + if type( AirbaseNames ) == 'table' then for AirbaseID, AirbaseName in pairs( AirbaseNames ) do self:AddAirbase( AirbaseName ) @@ -119,9 +119,9 @@ function CLEANUP_AIRBASE:New( AirbaseNames ) local AirbaseName = AirbaseNames self:AddAirbase( AirbaseName ) end - + self:HandleEvent( EVENTS.Birth, self.__.OnEventBirth ) - + self.__.CleanUpScheduler = SCHEDULER:New( self, self.__.CleanUpSchedule, {}, 1, self.TimeInterval ) self:HandleEvent( EVENTS.EngineShutdown , self.__.EventAddForCleanUp ) @@ -130,7 +130,7 @@ function CLEANUP_AIRBASE:New( AirbaseNames ) self:HandleEvent( EVENTS.PilotDead, self.__.OnEventCrash ) self:HandleEvent( EVENTS.Dead, self.__.OnEventCrash ) self:HandleEvent( EVENTS.Crash, self.__.OnEventCrash ) - + for UnitName, Unit in pairs( _DATABASE.UNITS ) do local Unit = Unit -- Wrapper.Unit#UNIT if Unit:IsAlive() ~= nil then @@ -144,7 +144,7 @@ function CLEANUP_AIRBASE:New( AirbaseNames ) end end end - + return self end @@ -155,7 +155,7 @@ end function CLEANUP_AIRBASE:AddAirbase( AirbaseName ) self.__.Airbases[AirbaseName] = AIRBASE:FindByName( AirbaseName ) self:F({"Airbase:", AirbaseName, self.__.Airbases[AirbaseName]:GetDesc()}) - + return self end @@ -197,7 +197,7 @@ function CLEANUP_AIRBASE.__:IsInAirbase( Vec2 ) break; end end - + return InAirbase end @@ -233,7 +233,7 @@ end -- @param DCS#Weapon MissileObject function CLEANUP_AIRBASE.__:DestroyMissile( MissileObject ) self:F( { MissileObject } ) - + if MissileObject and MissileObject:isExist() then MissileObject:destroy() self:T( "MissileObject Destroyed") @@ -244,7 +244,7 @@ end -- @param Core.Event#EVENTDATA EventData function CLEANUP_AIRBASE.__:OnEventBirth( EventData ) self:F( { EventData } ) - + if EventData.IniUnit:IsAlive() ~= nil then if self:IsInAirbase( EventData.IniUnit:GetVec2() ) then self.CleanUpList[EventData.IniDCSUnitName] = {} @@ -267,7 +267,7 @@ function CLEANUP_AIRBASE.__:OnEventCrash( Event ) --TODO: DCS BUG - This stuff is not working due to a DCS bug. Burning units cannot be destroyed. -- self:T("before getGroup") - -- local _grp = Unit.getGroup(event.initiator)-- Identify the group that fired + -- local _grp = Unit.getGroup(event.initiator)-- Identify the group that fired -- self:T("after getGroup") -- _grp:destroy() -- self:T("after deactivateGroup") @@ -280,7 +280,7 @@ function CLEANUP_AIRBASE.__:OnEventCrash( Event ) self.CleanUpList[Event.IniDCSUnitName].CleanUpGroupName = Event.IniDCSGroupName self.CleanUpList[Event.IniDCSUnitName].CleanUpUnitName = Event.IniDCSUnitName end - + end --- Detects if a unit shoots a missile. @@ -334,16 +334,16 @@ function CLEANUP_AIRBASE.__:AddForCleanUp( CleanUpUnit, CleanUpUnitName ) self.CleanUpList[CleanUpUnitName] = {} self.CleanUpList[CleanUpUnitName].CleanUpUnit = CleanUpUnit self.CleanUpList[CleanUpUnitName].CleanUpUnitName = CleanUpUnitName - + local CleanUpGroup = CleanUpUnit:GetGroup() - + self.CleanUpList[CleanUpUnitName].CleanUpGroup = CleanUpGroup self.CleanUpList[CleanUpUnitName].CleanUpGroupName = CleanUpGroup:GetName() self.CleanUpList[CleanUpUnitName].CleanUpTime = timer.getTime() self.CleanUpList[CleanUpUnitName].CleanUpMoved = false self:T( { "CleanUp: Add to CleanUpList: ", CleanUpGroup:GetName(), CleanUpUnitName } ) - + end --- Detects if the Unit has an S_EVENT_ENGINE_SHUTDOWN or an S_EVENT_HIT within the given AirbaseNames. If this is the case, add the Group to the CLEANUP_AIRBASE List. @@ -369,7 +369,7 @@ function CLEANUP_AIRBASE.__:EventAddForCleanUp( Event ) end end end - + end @@ -380,26 +380,26 @@ function CLEANUP_AIRBASE.__:CleanUpSchedule() local CleanUpCount = 0 for CleanUpUnitName, CleanUpListData in pairs( self.CleanUpList ) do CleanUpCount = CleanUpCount + 1 - + local CleanUpUnit = CleanUpListData.CleanUpUnit -- Wrapper.Unit#UNIT local CleanUpGroupName = CleanUpListData.CleanUpGroupName if CleanUpUnit:IsAlive() ~= nil then - + if self:IsInAirbase( CleanUpUnit:GetVec2() ) then if _DATABASE:GetStatusGroup( CleanUpGroupName ) ~= "ReSpawn" then - + local CleanUpCoordinate = CleanUpUnit:GetCoordinate() - + self:T( { "CleanUp Scheduler", CleanUpUnitName } ) if CleanUpUnit:GetLife() <= CleanUpUnit:GetLife0() * 0.95 then if CleanUpUnit:IsAboveRunway() then if CleanUpUnit:InAir() then - + local CleanUpLandHeight = CleanUpCoordinate:GetLandHeight() local CleanUpUnitHeight = CleanUpCoordinate.y - CleanUpLandHeight - + if CleanUpUnitHeight < 100 then self:T( { "CleanUp Scheduler", "Destroy " .. CleanUpUnitName .. " because below safe height and damaged." } ) self:DestroyUnit( CleanUpUnit ) @@ -439,6 +439,7 @@ function CLEANUP_AIRBASE.__:CleanUpSchedule() end end self:T(CleanUpCount) - + return true end +