From 8e5af4ada4ddb3c2caa0717d497baebd50098a94 Mon Sep 17 00:00:00 2001
From: FlightControl
Date: Sat, 1 Jul 2017 12:32:44 +0200
Subject: [PATCH] New implementations
of inheritance
of private - public methods ....
This is a big improvement for many!
---
Moose Development/Moose/Core/Base.lua | 93 ++--
.../Moose/Functional/CleanUp.lua | 182 ++++---
.../Moose/Wrapper/Positionable.lua | 6 +-
Moose Development/Moose/Wrapper/Unit.lua | 4 +-
docs/Documentation/AI_A2A.html | 1 +
docs/Documentation/Base.html | 63 +--
docs/Documentation/Cargo.html | 1 -
docs/Documentation/CleanUp.html | 451 ++++++++++--------
docs/Documentation/Detection.html | 2 +-
docs/Documentation/Fsm.html | 3 +-
docs/Documentation/Positionable.html | 24 +-
docs/Documentation/Spawn.html | 23 -
docs/Documentation/SpawnStatic.html | 1 +
docs/Documentation/Spot.html | 4 -
docs/Documentation/Task_Cargo.html | 3 +-
15 files changed, 441 insertions(+), 420 deletions(-)
diff --git a/Moose Development/Moose/Core/Base.lua b/Moose Development/Moose/Core/Base.lua
index a40e4d729..68356d0eb 100644
--- a/Moose Development/Moose/Core/Base.lua
+++ b/Moose Development/Moose/Core/Base.lua
@@ -201,6 +201,10 @@ BASE = {
_ = {},
}
+
+--- @field #BASE.__
+BASE.__ = {}
+
--- The Formation Class
-- @type FORMATION
-- @field Cone A cone formation.
@@ -224,47 +228,19 @@ FORMATION = {
-- @return #BASE
function BASE:New()
local self = routines.utils.deepCopy( self ) -- Create a new self instance
- local MetaTable = {}
- setmetatable( self, MetaTable )
- self.__index = self
+
_ClassID = _ClassID + 1
self.ClassID = _ClassID
-
+
+ -- This is for "private" methods...
+ -- When a __ is passed to a method as "self", the __index will search for the method on the public method list too!
+ if self.__ then
+ setmetatable( self, { __index = self.__ } )
+ end
return self
end
-function BASE:_Destructor()
- --self:E("_Destructor")
-
- --self:EventRemoveAll()
-end
-
-
--- THIS IS WHY WE NEED LUA 5.2 ...
-function BASE:_SetDestructor()
-
- -- TODO: Okay, this is really technical...
- -- When you set a proxy to a table to catch __gc, weak tables don't behave like weak...
- -- Therefore, I am parking this logic until I've properly discussed all this with the community.
-
- local proxy = newproxy(true)
- local proxyMeta = getmetatable(proxy)
-
- proxyMeta.__gc = function ()
- env.info("In __gc for " .. self:GetClassNameAndID() )
- if self._Destructor then
- self:_Destructor()
- end
- end
-
- -- keep the userdata from newproxy reachable until the object
- -- table is about to be garbage-collected - then the __gc hook
- -- will be invoked and the destructor called
- rawset( self, '__proxy', proxy )
-
-end
-
--- This is the worker method to inherit from a parent class.
-- @param #BASE self
-- @param Child is the Child class that inherits.
@@ -272,11 +248,18 @@ end
-- @return #BASE Child
function BASE:Inherit( Child, Parent )
local Child = routines.utils.deepCopy( Child )
- --local Parent = routines.utils.deepCopy( Parent )
- --local Parent = Parent
+
if Child ~= nil then
- setmetatable( Child, Parent )
- Child.__index = Child
+
+ -- This is for "private" methods...
+ -- When a __ is passed to a method as "self", the __index will search for the method on the public method list of the same object too!
+ if Child.__ then
+ setmetatable( Child, { __index = Child.__ } )
+ setmetatable( Child.__, { __index = Parent } )
+ else
+ setmetatable( Child, { __index = Parent } )
+ end
+
--Child:_SetDestructor()
end
@@ -895,3 +878,35 @@ end
+--- old stuff
+
+--function BASE:_Destructor()
+-- --self:E("_Destructor")
+--
+-- --self:EventRemoveAll()
+--end
+
+
+-- THIS IS WHY WE NEED LUA 5.2 ...
+--function BASE:_SetDestructor()
+--
+-- -- TODO: Okay, this is really technical...
+-- -- When you set a proxy to a table to catch __gc, weak tables don't behave like weak...
+-- -- Therefore, I am parking this logic until I've properly discussed all this with the community.
+--
+-- local proxy = newproxy(true)
+-- local proxyMeta = getmetatable(proxy)
+--
+-- proxyMeta.__gc = function ()
+-- env.info("In __gc for " .. self:GetClassNameAndID() )
+-- if self._Destructor then
+-- self:_Destructor()
+-- end
+-- end
+--
+-- -- keep the userdata from newproxy reachable until the object
+-- -- table is about to be garbage-collected - then the __gc hook
+-- -- will be invoked and the destructor called
+-- rawset( self, '__proxy', proxy )
+--
+--end
\ No newline at end of file
diff --git a/Moose Development/Moose/Functional/CleanUp.lua b/Moose Development/Moose/Functional/CleanUp.lua
index 7b3a91c00..5db07d6d9 100644
--- a/Moose Development/Moose/Functional/CleanUp.lua
+++ b/Moose Development/Moose/Functional/CleanUp.lua
@@ -1,7 +1,5 @@
--- **Functional** -- The CLEANUP class keeps an area clean of crashing or colliding airplanes. It also prevents airplanes from firing within this area.
--
--- 
---
-- ===
--
-- ### Author: **Sven Van de Velde (FlightControl)**
@@ -11,14 +9,57 @@
--
-- @module CleanUp
+--- @type CLEANUP.__
+-- @extends Core.Base#BASE
--- @type CLEANUP
--- @extends Core.Base#BASE
+-- @extends #CLEANUP.__
-- @field #map<#string,Wrapper.Airbase#AIRBASE> Airbases Map of Airbases.
--- # CLEANUP, extends @{Base#BASE}
--
+-- 
+--
-- The CLEANUP class keeps airbases clean, and tries to guarantee continuous airbase operations, even under combat.
+-- 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.
+-- 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 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 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.
+--
+-- ## 1. CLEANUP 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:New( { AIRBASE.Caucasus.Tbilisi, AIRBASE.Caucasus.Kutaisi )
+--
+-- -- or
+-- CleanUpTbilisi = CLEANUP:New( AIRBASE.Caucasus.Tbilisi )
+-- CleanUpKutaisi = CLEANUP:New( AIRBASE.Caucasus.Kutaisi )
+--
+-- ## 2. Add or Remove airbases
+--
+-- The method @{#CLEANUP.AddAirbase} to add an airbase to the cleanup validation process.
+-- The method @{#CLEANUP.RemoveAirbase} removes an airbase from the cleanup validation process.
--
-- @field #CLEANUP
CLEANUP = {
@@ -28,6 +69,10 @@ CLEANUP = {
Airbases = {},
}
+
+--- @field #CLEANUP.__
+CLEANUP.__ = {}
+
--- Creates the main object which is handling the cleaning of the debris within the given Zone Names.
-- @param #CLEANUP self
-- @param #list<#string> AirbaseNames Is a table of airbase names where the debris should be cleaned. Also a single string can be passed with one airbase name.
@@ -52,9 +97,9 @@ function CLEANUP:New( AirbaseNames )
self:AddAirbase( AirbaseName )
end
- self:HandleEvent( EVENTS.Birth )
+ self:HandleEvent( EVENTS.Birth, self.__.OnEventBirth )
- self.CleanUpScheduler = SCHEDULER:New( self, self._CleanUpScheduler, {}, 1, self.TimeInterval )
+ self.CleanUpScheduler = SCHEDULER:New( self, self.__.CleanUpScheduler, {}, 1, self.TimeInterval )
return self
end
@@ -81,7 +126,7 @@ end
-function CLEANUP:IsInAirbase( Vec2 )
+function CLEANUP.__:IsInAirbase( Vec2 )
local InAirbase = false
for AirbaseName, Airbase in pairs( self.Airbases ) do
@@ -95,23 +140,12 @@ function CLEANUP:IsInAirbase( Vec2 )
return InAirbase
end
---- Destroys a group from the simulator, but checks first if it is still existing!
--- @param #CLEANUP self
--- @param Dcs.DCSWrapper.Group#Group GroupObject The object to be destroyed.
--- @param #string CleanUpGroupName The groupname...
-function CLEANUP:_DestroyGroup( GroupObject, CleanUpGroupName )
- self:F( { GroupObject, CleanUpGroupName } )
- if GroupObject then -- and GroupObject:isExist() then
- trigger.action.deactivateGroup(GroupObject)
- self:T( { "GroupObject Destroyed", GroupObject } )
- end
-end
--- Destroys a @{Unit} from the simulator, but checks first if it is still existing!
-- @param #CLEANUP self
-- @param Wrapper.Unit#UNIT CleanUpUnit The object to be destroyed.
-function CLEANUP:_DestroyUnit( CleanUpUnit )
+function CLEANUP.__:DestroyUnit( CleanUpUnit )
self:F( { CleanUpUnit } )
if CleanUpUnit then
@@ -131,13 +165,14 @@ function CLEANUP:_DestroyUnit( CleanUpUnit )
end
end
--- TODO check Dcs.DCSTypes#Weapon
+
+
--- Destroys a missile from the simulator, but checks first if it is still existing!
-- @param #CLEANUP self
-- @param Dcs.DCSTypes#Weapon MissileObject
-function CLEANUP:_DestroyMissile( MissileObject )
+function CLEANUP.__:DestroyMissile( MissileObject )
self:F( { MissileObject } )
-
+
if MissileObject and MissileObject:isExist() then
MissileObject:destroy()
self:T( "MissileObject Destroyed")
@@ -146,30 +181,31 @@ end
--- @param #CLEANUP self
-- @param Core.Event#EVENTDATA EventData
-function CLEANUP:OnEventBirth( EventData )
+function CLEANUP.__:OnEventBirth( EventData )
self:F( { EventData } )
self.CleanUpList[EventData.IniDCSUnitName] = {}
- self.CleanUpList[EventData.IniDCSUnitName].CleanUpUnit = EventData.IniDCSUnit
- self.CleanUpList[EventData.IniDCSUnitName].CleanUpGroup = EventData.IniDCSGroup
+ self.CleanUpList[EventData.IniDCSUnitName].CleanUpUnit = EventData.IniUnit
+ self.CleanUpList[EventData.IniDCSUnitName].CleanUpGroup = EventData.IniGroup
self.CleanUpList[EventData.IniDCSUnitName].CleanUpGroupName = EventData.IniDCSGroupName
self.CleanUpList[EventData.IniDCSUnitName].CleanUpUnitName = EventData.IniDCSUnitName
- self:HandleEvent( EVENTS.EngineShutdown , self._EventAddForCleanUp )
- self:HandleEvent( EVENTS.EngineStartup, self._EventAddForCleanUp )
- self:HandleEvent( EVENTS.Hit, self._EventAddForCleanUp )
- self:HandleEvent( EVENTS.PilotDead, self.OnEventCrash )
- self:HandleEvent( EVENTS.Dead, self.OnEventCrash )
- self:HandleEvent( EVENTS.Crash, self.OnEventCrash )
- self:HandleEvent( EVENTS.Shot, self.OnEventShot )
+ self:HandleEvent( EVENTS.EngineShutdown , self.__.EventAddForCleanUp )
+ self:HandleEvent( EVENTS.EngineStartup, self.__.EventAddForCleanUp )
+ self:HandleEvent( EVENTS.Hit, self.__.EventAddForCleanUp )
+ self:HandleEvent( EVENTS.PilotDead, self.__.OnEventCrash )
+ self:HandleEvent( EVENTS.Dead, self.__.OnEventCrash )
+ self:HandleEvent( EVENTS.Crash, self.__.OnEventCrash )
+ self:HandleEvent( EVENTS.Shot, self.__.OnEventShot )
end
+
--- Detects if a crash event occurs.
-- Crashed units go into a CleanUpList for removal.
-- @param #CLEANUP self
--- @param Dcs.DCSTypes#Event event
-function CLEANUP:OnEventCrash( Event )
+-- @param Core.Event#EVENTDATA Event
+function CLEANUP.__:OnEventCrash( Event )
self:F( { Event } )
--TODO: This stuff is not working due to a DCS bug. Burning units cannot be destroyed.
@@ -180,10 +216,10 @@ function CLEANUP:OnEventCrash( Event )
-- self:T("after deactivateGroup")
-- event.initiator:destroy()
- if Event.IniDCSUnitName then
+ if Event.IniDCSUnitName and Event.IniCategory == Object.Category.UNIT then
self.CleanUpList[Event.IniDCSUnitName] = {}
- self.CleanUpList[Event.IniDCSUnitName].CleanUpUnit = Event.IniDCSUnit
- self.CleanUpList[Event.IniDCSUnitName].CleanUpGroup = Event.IniDCSGroup
+ self.CleanUpList[Event.IniDCSUnitName].CleanUpUnit = Event.IniUnit
+ self.CleanUpList[Event.IniDCSUnitName].CleanUpGroup = Event.IniGroup
self.CleanUpList[Event.IniDCSUnitName].CleanUpGroupName = Event.IniDCSGroupName
self.CleanUpList[Event.IniDCSUnitName].CleanUpUnitName = Event.IniDCSUnitName
end
@@ -194,79 +230,85 @@ end
-- If this occurs within one of the airbases, then the weapon used must be destroyed.
-- @param #CLEANUP self
-- @param Core.Event#EVENTDATA Event
-function CLEANUP:OnEventShot( Event )
+function CLEANUP.__:OnEventShot( Event )
self:F( { Event } )
-- Test if the missile was fired within one of the CLEANUP.AirbaseNames.
if self:IsInAirbase( Event.IniUnit:GetVec2() ) then
-- Okay, the missile was fired within the CLEANUP.AirbaseNames, destroy the fired weapon.
- self:_DestroyMissile( Event.Weapon )
+ self:DestroyMissile( Event.Weapon )
end
end
-
--- Detects if the Unit has an S_EVENT_HIT within the given AirbaseNames. If this is the case, destroy the unit.
-- @param #CLEANUP self
-- @param Core.Event#EVENTDATA Event
-function CLEANUP:OnEventHit( Event )
+function CLEANUP.__:OnEventHit( Event )
self:F( { Event } )
if Event.IniUnit then
if self:IsInAirbase( Event.IniUnit:GetVec2() ) then
- self:T( { "Life: ", Event.IniDCSUnitName, ' = ', Event.IniDCSUnit:getLife(), "/", Event.IniDCSUnit:getLife0() } )
- if Event.IniDCSUnit:getLife() < Event.IniDCSUnit:getLife0() then
+ self:T( { "Life: ", Event.IniDCSUnitName, ' = ', Event.IniUnit:GetLife(), "/", Event.IniUnit:GetLife0() } )
+ if Event.IniUnit:GetLife() < Event.IniUnit:GetLife0() then
self:T( "CleanUp: Destroy: " .. Event.IniDCSUnitName )
- CLEANUP:_DestroyUnit( Event.IniUnit )
+ CLEANUP.__:DestroyUnit( Event.IniUnit )
end
end
end
if Event.TgtUnit then
if self:IsInAirbase( Event.TgtUnit:GetVec2() ) then
- self:T( { "Life: ", Event.TgtDCSUnitName, ' = ', Event.TgtDCSUnit:getLife(), "/", Event.TgtDCSUnit:getLife0() } )
- if Event.TgtDCSUnit:getLife() < Event.TgtDCSUnit:getLife0() then
+ self:T( { "Life: ", Event.TgtDCSUnitName, ' = ', Event.TgtUnit:GetLife(), "/", Event.TgtUnit:GetLife0() } )
+ if Event.TgtUnit:GetLife() < Event.TgtUnit:GetLife0() then
self:T( "CleanUp: Destroy: " .. Event.TgtDCSUnitName )
- CLEANUP:_DestroyUnit( Event.TgtUnit )
+ CLEANUP.__:DestroyUnit( Event.TgtUnit )
end
end
end
end
--- Add the @{DCSWrapper.Unit#Unit} to the CleanUpList for CleanUp.
-function CLEANUP:_AddForCleanUp( CleanUpUnit, CleanUpUnitName )
+-- @param #CLEANUP self
+-- @param Wrapper.Unit#UNIT CleanUpUnit
+-- @oaram #string CleanUpUnitName
+function CLEANUP.__:AddForCleanUp( CleanUpUnit, CleanUpUnitName )
self:F( { 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()
+
+ 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: ", Unit.getGroup(CleanUpUnit):getName(), CleanUpUnitName } )
+ 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 List.
--- @param #CLEANUP self
+-- @param #CLEANUP.__ self
-- @param Core.Event#EVENTDATA Event
-function CLEANUP:_EventAddForCleanUp( Event )
+function CLEANUP.__:EventAddForCleanUp( Event )
self:F({Event})
- if Event.IniDCSUnit then
+
+ if Event.IniDCSUnit and Event.IniCategory == Object.Category.UNIT then
if self.CleanUpList[Event.IniDCSUnitName] == nil then
if self:IsInAirbase( Event.IniUnit:GetVec2() ) then
- self:_AddForCleanUp( Event.IniDCSUnit, Event.IniDCSUnitName )
+ self:AddForCleanUp( Event.IniUnit, Event.IniDCSUnitName )
end
end
end
- if Event.TgtDCSUnit then
+ if Event.TgtDCSUnit and Event.TgtCategory == Object.Category.UNIT then
if self.CleanUpList[Event.TgtDCSUnitName] == nil then
if self:IsInAirbase( Event.TgtUnit:GetVec2() ) then
- self:_AddForCleanUp( Event.TgtDCSUnit, Event.TgtDCSUnitName )
+ self:AddForCleanUp( Event.TgtUnit, Event.TgtDCSUnitName )
end
end
end
@@ -276,23 +318,23 @@ end
--- At the defined time interval, CleanUp the Groups within the CleanUpList.
-- @param #CLEANUP self
-function CLEANUP:_CleanUpScheduler()
+function CLEANUP.__:CleanUpScheduler()
local CleanUpCount = 0
- for CleanUpUnitName, UnitData in pairs( self.CleanUpList ) do
+ for CleanUpUnitName, CleanUpListData in pairs( self.CleanUpList ) do
CleanUpCount = CleanUpCount + 1
- local CleanUpUnit = UNIT:FindByName( CleanUpUnitName )
- local CleanUpDCSUnit = Unit.getByName( CleanUpUnitName )
- local CleanUpGroupName = UnitData.CleanUpGroupName
+ local CleanUpUnit = CleanUpListData.CleanUpUnit -- Wrapper.Unit#UNIT
+ local CleanUpGroupName = CleanUpListData.CleanUpGroupName
- if CleanUpUnit then
+ if CleanUpUnit:IsAlive() ~= nil then
if _DATABASE:GetStatusGroup( CleanUpGroupName ) ~= "ReSpawn" then
local CleanUpCoordinate = CleanUpUnit:GetCoordinate()
- if CleanUpDCSUnit and CleanUpDCSUnit:getLife() <= CleanUpDCSUnit:getLife0() * 0.95 then
+ self:T( { "CleanUp Scheduler", CleanUpUnitName } )
+ if CleanUpUnit:GetLife() <= CleanUpUnit:GetLife0() * 0.95 then
if CleanUpUnit:IsAboveRunway() then
if CleanUpUnit:InAir() then
@@ -301,11 +343,11 @@ function CLEANUP:_CleanUpScheduler()
if CleanUpUnitHeight < 30 then
self:T( { "CleanUp Scheduler", "Destroy " .. CleanUpUnitName .. " because below safe height and damaged." } )
- self:_DestroyUnit( CleanUpUnit )
+ self:DestroyUnit( CleanUpUnit )
end
else
self:T( { "CleanUp Scheduler", "Destroy " .. CleanUpUnitName .. " because on runway and damaged." } )
- self:_DestroyUnit(CleanUpUnit )
+ self:DestroyUnit( CleanUpUnit )
end
end
end
@@ -313,15 +355,15 @@ function CLEANUP:_CleanUpScheduler()
if CleanUpUnit then
local CleanUpUnitVelocity = CleanUpUnit:GetVelocityKMH()
if CleanUpUnitVelocity < 1 then
- if UnitData.CleanUpMoved then
- if UnitData.CleanUpTime + 180 <= timer.getTime() then
+ if CleanUpListData.CleanUpMoved then
+ if CleanUpListData.CleanUpTime + 180 <= timer.getTime() then
self:T( { "CleanUp Scheduler", "Destroy due to not moving anymore " .. CleanUpUnitName } )
- self:_DestroyUnit( CleanUpUnit )
+ self:DestroyUnit( CleanUpUnit )
end
end
else
- UnitData.CleanUpTime = timer.getTime()
- UnitData.CleanUpMoved = true
+ CleanUpListData.CleanUpTime = timer.getTime()
+ CleanUpListData.CleanUpMoved = true
end
end
diff --git a/Moose Development/Moose/Wrapper/Positionable.lua b/Moose Development/Moose/Wrapper/Positionable.lua
index fbe5421b0..b2054eea2 100644
--- a/Moose Development/Moose/Wrapper/Positionable.lua
+++ b/Moose Development/Moose/Wrapper/Positionable.lua
@@ -365,7 +365,6 @@ end
--- Returns the POSITIONABLE velocity in km/h.
-- @param Wrapper.Positionable#POSITIONABLE self
-- @return #number The velocity in km/h
--- @return #nil The POSITIONABLE is not existing or alive.
function POSITIONABLE:GetVelocityKMH()
self:F2( self.PositionableName )
@@ -379,13 +378,12 @@ function POSITIONABLE:GetVelocityKMH()
return Velocity
end
- return nil
+ return 0
end
--- Returns the POSITIONABLE velocity in meters per second.
-- @param Wrapper.Positionable#POSITIONABLE self
-- @return #number The velocity in meters per second.
--- @return #nil The POSITIONABLE is not existing or alive.
function POSITIONABLE:GetVelocityMPS()
self:F2( self.PositionableName )
@@ -398,7 +396,7 @@ function POSITIONABLE:GetVelocityMPS()
return Velocity
end
- return nil
+ return 0
end
diff --git a/Moose Development/Moose/Wrapper/Unit.lua b/Moose Development/Moose/Wrapper/Unit.lua
index 01f71e691..576aed957 100644
--- a/Moose Development/Moose/Wrapper/Unit.lua
+++ b/Moose Development/Moose/Wrapper/Unit.lua
@@ -536,7 +536,7 @@ function UNIT:GetLife()
return UnitLife
end
- return nil
+ return -1
end
--- Returns the Unit's initial health.
@@ -553,7 +553,7 @@ function UNIT:GetLife0()
return UnitLife0
end
- return nil
+ return 0
end
--- Returns the category name of the #UNIT.
diff --git a/docs/Documentation/AI_A2A.html b/docs/Documentation/AI_A2A.html
index ee2dc9007..2a24504d1 100644
--- a/docs/Documentation/AI_A2A.html
+++ b/docs/Documentation/AI_A2A.html
@@ -575,6 +575,7 @@
-
+ #number
AI_A2A.IdleCount
diff --git a/docs/Documentation/Base.html b/docs/Documentation/Base.html
index 5d0f76673..e79a06992 100644
--- a/docs/Documentation/Base.html
+++ b/docs/Documentation/Base.html
@@ -472,30 +472,24 @@ When Moose is loaded statically, (as one file), tracing is switched off by defau
| BASE:UnHandleEvent(Event) |
UnSubscribe to a DCS event.
- |
-
-
- | BASE:_Destructor() |
-
-
|
| BASE:_F(Arguments, DebugInfoCurrentParam, DebugInfoFromParam) |
Trace a function call.
- |
-
-
- | BASE:_SetDestructor() |
-
-
|
| BASE:_T(Arguments, DebugInfoCurrentParam, DebugInfoFromParam) |
Trace a function logic.
+ |
+
+
+ | BASE.__ |
+
+
|
@@ -2134,19 +2128,6 @@ BASE:TraceOnOff( false )
#BASE:
-
-
-
--
-
-
-BASE:_Destructor()
-
-
--
-
-
-
@@ -2187,22 +2168,6 @@ A #table or any field.
-
-
-BASE:_SetDestructor()
-
-
--
-
-
-
-
-
THIS IS WHY WE NEED LUA 5.2 ...
-
-
-
-
--
-
BASE:_T(Arguments, DebugInfoCurrentParam, DebugInfoFromParam)
@@ -2230,6 +2195,20 @@ A #table or any field.
+
+
+
+-
+
+ #BASE.__
+
+BASE.__
+
+
+-
+
+
+
@@ -2260,6 +2239,8 @@ A #table or any field.
+
+
The Formation Class
diff --git a/docs/Documentation/Cargo.html b/docs/Documentation/Cargo.html
index 0f74ec2a0..262969991 100644
--- a/docs/Documentation/Cargo.html
+++ b/docs/Documentation/Cargo.html
@@ -2934,7 +2934,6 @@ The range till cargo will board.
-
-
CARGO_UNIT.CargoCarrier
diff --git a/docs/Documentation/CleanUp.html b/docs/Documentation/CleanUp.html
index fe64315b1..a9c1593dd 100644
--- a/docs/Documentation/CleanUp.html
+++ b/docs/Documentation/CleanUp.html
@@ -110,8 +110,6 @@
It also prevents airplanes from firing within this area.
-
-
Author: Sven Van de Velde (FlightControl)
@@ -127,8 +125,9 @@
- The CLEANUP class keeps airbases clean, and tries to guarantee continuous airbase operations, even under combat.
+
+The CLEANUP class keeps airbases clean, and tries to guarantee continuous airbase operations, even under combat.
|
@@ -150,42 +149,12 @@
CLEANUP.CleanUpScheduler |
- |
-
-
- | CLEANUP:IsInAirbase(Vec2) |
-
-
|
| CLEANUP:New(<, AirbaseNames) |
Creates the main object which is handling the cleaning of the debris within the given Zone Names.
- |
-
-
- | CLEANUP:OnEventBirth(EventData) |
-
-
- |
-
-
- | CLEANUP:OnEventCrash(event, Event) |
-
- Detects if a crash event occurs.
- |
-
-
- | CLEANUP:OnEventHit(Event) |
-
- Detects if the Unit has an SEVENTHIT within the given AirbaseNames.
- |
-
-
- | CLEANUP:OnEventShot(Event) |
-
- Detects if a unit shoots a missile.
|
@@ -195,39 +164,73 @@
- | CLEANUP:_AddForCleanUp(CleanUpUnit, CleanUpUnitName) |
+ CLEANUP.__ |
+
+
+ |
+
+
+
+
+
@@ -245,8 +248,56 @@
+
+
The CLEANUP class keeps airbases clean, and tries to guarantee continuous airbase operations, even under combat.
+
+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.
+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 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 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.
+
+1. CLEANUP 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:New( { AIRBASE.Caucasus.Tbilisi, AIRBASE.Caucasus.Kutaisi )
+
+ -- or
+ CleanUpTbilisi = CLEANUP:New( AIRBASE.Caucasus.Tbilisi )
+ CleanUpKutaisi = CLEANUP:New( AIRBASE.Caucasus.Kutaisi )
+
+
+2. Add or Remove airbases
+
+The method CLEANUP.AddAirbase to add an airbase to the cleanup validation process.
+The method CLEANUP.RemoveAirbase removes an airbase from the cleanup validation process.
+
@@ -306,27 +357,6 @@
-
-
-
--
-
-
-CLEANUP:IsInAirbase(Vec2)
-
-
--
-
-
-
-
Parameter
-
@@ -371,104 +401,6 @@ CleanUpKutaisi = CLEANUP:New( AIRBASE.Caucasus.Kutaisi )
-
-
-CLEANUP:OnEventBirth(EventData)
-
-
--
-
-
-
-
Parameter
-
-
-
-
--
-
-
-CLEANUP:OnEventCrash(event, Event)
-
-
--
-
-
Detects if a crash event occurs.
-
-
-Crashed units go into a CleanUpList for removal.
-
- Parameters
-
-
-
-
--
-
-
-CLEANUP:OnEventHit(Event)
-
-
--
-
-
Detects if the Unit has an SEVENTHIT within the given AirbaseNames.
-
-
-If this is the case, destroy the unit.
-
- Parameter
-
-
-
-
--
-
-
-CLEANUP:OnEventShot(Event)
-
-
--
-
-
Detects if a unit shoots a missile.
-
-
-If this occurs within one of the airbases, then the weapon used must be destroyed.
-
- Parameter
-
-
-
-
--
-
CLEANUP:RemoveAirbase(AirbaseName)
@@ -495,8 +427,25 @@ CleanUpKutaisi = CLEANUP:New( AIRBASE.Caucasus.Kutaisi )
-
-
-CLEANUP:_AddForCleanUp(CleanUpUnit, CleanUpUnitName)
+ #CLEANUP.__
+
+CLEANUP.__
+
+
+-
+
+
+
+
+
+
+
+ Field(s)
+
+-
+
+
+CLEANUP.__:AddForCleanUp(CleanUpUnit, CleanUpUnitName)
-
@@ -507,7 +456,7 @@ CleanUpKutaisi = CLEANUP:New( AIRBASE.Caucasus.Kutaisi )
-
-
-CLEANUP:_DestroyUnit(CleanUpUnit)
+
+CLEANUP.__:DestroyUnit(CleanUpUnit)
-
@@ -611,8 +526,8 @@ The object to be destroyed.
-
-
-CLEANUP:_EventAddForCleanUp(Event)
+
+CLEANUP.__:EventAddForCleanUp(Event)
-
@@ -626,6 +541,120 @@ The object to be destroyed.
+
+
+
+-
+
+
+CLEANUP.__:IsInAirbase(Vec2)
+
+
+-
+
+
+
+
Parameter
+
+
+
+
+-
+
+
+CLEANUP.__:OnEventBirth(EventData)
+
+
+-
+
+
+
+
Parameter
+
+
+
+
+-
+
+
+CLEANUP.__:OnEventCrash(Event)
+
+
+-
+
+
Detects if a crash event occurs.
+
+
+Crashed units go into a CleanUpList for removal.
+
+ Parameter
+
+
+
+
+-
+
+
+CLEANUP.__:OnEventHit(Event)
+
+
+-
+
+
Detects if the Unit has an SEVENTHIT within the given AirbaseNames.
+
+
+If this is the case, destroy the unit.
+
+ Parameter
+
+
+
+
+-
+
+
+CLEANUP.__:OnEventShot(Event)
+
+
+-
+
+
Detects if a unit shoots a missile.
+
+
+If this occurs within one of the airbases, then the weapon used must be destroyed.
+
+ Parameter
+
@@ -976,21 +966,11 @@ The POSITIONABLE is not existing or alive.
Returns the POSITIONABLE velocity in meters per second.
- Return values
-
- -
+
Return value
#number:
The velocity in meters per second.
-
- -
-
-
#nil:
-The POSITIONABLE is not existing or alive.
-
-
-
diff --git a/docs/Documentation/Spawn.html b/docs/Documentation/Spawn.html
index 05a9cda85..1183a03bf 100644
--- a/docs/Documentation/Spawn.html
+++ b/docs/Documentation/Spawn.html
@@ -822,12 +822,6 @@ and any spaces before and after the resulting name are removed.
| SPAWN:_TranslateRotate(SpawnIndex, SpawnRootX, SpawnRootY, SpawnX, SpawnY, SpawnAngle) |
- |
-
-
- | SPAWN.uncontrolled |
-
-
|
@@ -2732,9 +2726,6 @@ when nothing was spawned.
-
- Overwrite unit names by default with group name.
-
@@ -3733,20 +3724,6 @@ True = Continue Scheduler
-
-
-
--
-
-
-
-SPAWN.uncontrolled
-
-
--
-
-
-
diff --git a/docs/Documentation/SpawnStatic.html b/docs/Documentation/SpawnStatic.html
index bc91b9624..d8aa5e633 100644
--- a/docs/Documentation/SpawnStatic.html
+++ b/docs/Documentation/SpawnStatic.html
@@ -436,6 +436,7 @@ ptional) The name of the new static.
-
+ #number
SPAWNSTATIC.SpawnIndex
diff --git a/docs/Documentation/Spot.html b/docs/Documentation/Spot.html
index 5fdc3b305..ead3792db 100644
--- a/docs/Documentation/Spot.html
+++ b/docs/Documentation/Spot.html
@@ -765,7 +765,6 @@ true if it is lasing
-
-
SPOT.ScheduleID
@@ -779,7 +778,6 @@ true if it is lasing
-
-
SPOT.SpotIR
@@ -793,7 +791,6 @@ true if it is lasing
-
-
SPOT.SpotLaser
@@ -807,7 +804,6 @@ true if it is lasing
-
-
SPOT.Target
diff --git a/docs/Documentation/Task_Cargo.html b/docs/Documentation/Task_Cargo.html
index dda7b2ea9..76e219e8b 100644
--- a/docs/Documentation/Task_Cargo.html
+++ b/docs/Documentation/Task_Cargo.html
@@ -510,7 +510,7 @@ based on the tasking capabilities defined in Task#TA
-
- Core.Cargo#CARGO
+ Core.Cargo#CARGO_GROUP
FSM_PROCESS.Cargo
@@ -524,6 +524,7 @@ based on the tasking capabilities defined in Task#TA
-
+
FSM_PROCESS.DeployZone