+
+
+
Module Set
+
+
Manage sets of units and groups.
+
+
+
+
+
Mission designers can use the SET class to build sets of units belonging to certain:
+
+
+ - Coalitions
+ - Categories
+ - Countries
+ - Unit types
+ - Starting with certain prefix strings.
+
+
+
This list will grow over time. Planned developments are to include filters and iterators.
+Additional filters will be added around Zone#ZONEs, Radiuses, Active players, ...
+More iterators will be implemented in the near future ...
+
+
Administers the Initial Sets of the Mission Templates as defined within the Mission Editor.
+
+
SET construction methods:
+
Create a new SET object with the SET.New method:
+
+
+ - SET.New: Creates a new SET object.
+
+
+
+
SET filter criteria:
+
You can set filter criteria to define the set of units within the SET.
+Filter criteria are defined by:
+
+
+
+
Once the filter criteria have been set for the SET, you can start filtering using:
+
+
+
+
Planned filter criteria within development are (so these are not yet available):
+
+
+
+
+
SET iterators:
+
Once the filters have been defined and the SET has been built, you can iterate the SET with the available iterator methods.
+The iterator methods will walk the SET set, and call for each element within the set a function that you provide.
+The following iterator methods are currently available within the SET:
+
+
+
+
Planned iterators methods in development are (so these are not yet available):
+
+
+
+
+
+
Global(s)
+
+
+
+
+ | SET:AddUnit(UnitToAdd) |
+
+ Finds a Unit based on the Unit Name.
+ |
+
+
+ | SET.ClassName |
+
+
+ |
+
+
+ | SET.Clients |
+
+
+ |
+
+
+ | SET.ClientsAlive |
+
+
+ |
+
+
+ | SET.DCSGroups |
+
+
+ |
+
+
+ | SET.DCSGroupsAlive |
+
+
+ |
+
+
+ | SET.DCSUnits |
+
+
+ |
+
+
+ | SET.DCSUnitsAlive |
+
+
+ |
+
+
+ | SET.Filter |
+
+
+ |
+
+
+ | SET:FilterCategories(Categories) |
+
+ Builds a set of units out of categories.
+ |
+
+
+ | SET:FilterCoalitions(Coalitions) |
+
+ Builds a set of units of coalitons.
+ |
+
+
+ | SET:FilterCountries(Countries) |
+
+ Builds a set of units of defined countries.
+ |
+
+
+ | SET:FilterGroupPrefixes(Prefixes) |
+
+ Builds a set of units of defined group prefixes.
+ |
+
+
+ | SET.FilterMeta |
+
+
+ |
+
+
+ | SET:FilterStart() |
+
+ Starts the filtering.
+ |
+
+
+ | SET:FilterTypes(Types) |
+
+ Builds a set of units of defined unit types.
+ |
+
+
+ | SET:FilterUnitPrefixes(Prefixes) |
+
+ Builds a set of units of defined unit prefixes.
+ |
+
+
+ | SET:FindUnit(UnitName) |
+
+ Finds a Unit based on the Unit Name.
+ |
+
+
+ | SET:ForEach(IteratorFunction, arg, Set) |
+
+ Interate the SET and call an interator function for the given set, providing the Object for each element within the set and optional parameters.
+ |
+
+
+ | SET:ForEachClient(IteratorFunction, ...) |
+
+ Interate the SET and call an interator function for each client, providing the Client to the function and optional parameters.
+ |
+
+
+ | SET:ForEachDCSUnitAlive(IteratorFunction, ...) |
+
+ Interate the SET and call an interator function for each alive unit, providing the Unit and optional parameters.
+ |
+
+
+ | SET:ForEachPlayer(IteratorFunction, ...) |
+
+ Interate the SET and call an interator function for each alive player, providing the Unit of the player and optional parameters.
+ |
+
+
+ | SET.Groups |
+
+
+ |
+
+
+ | SET.GroupsAlive |
+
+
+ |
+
+
+ | SET.NavPoints |
+
+
+ |
+
+
+ | SET:New() |
+
+ Creates a new SET object, building a set of units belonging to a coalitions, categories, countries, types or with defined prefix names.
+ |
+
+
+ | SET.Players |
+
+
+ |
+
+
+ | SET.PlayersAlive |
+
+
+ |
+
+
+ | SET:ScanEnvironment() |
+
+
+ |
+
+
+ | SET.Statics |
+
+
+ |
+
+
+ | SET.Templates |
+
+
+ |
+
+
+ | SET:TraceDatabase() |
+
+ Traces the current SET contents in the log ...
+ |
+
+
+ | SET.Units |
+
+
+ |
+
+
+ | SET.UnitsAlive |
+
+
+ |
+
+
+ | SET:_EventOnBirth(Event) |
+
+ Handles the OnBirth event for the alive units set.
+ |
+
+
+ | SET:_EventOnDeadOrCrash(Event) |
+
+ Handles the OnDead or OnCrash event for alive units set.
+ |
+
+
+ | SET:_EventOnPlayerEnterUnit(Event) |
+
+ Handles the OnPlayerEnterUnit event to fill the active players table (with the unit filter applied).
+ |
+
+
+ | SET:_EventOnPlayerLeaveUnit(Event) |
+
+ Handles the OnPlayerLeaveUnit event to clean the active players table.
+ |
+
+
+ | SET:_IsAliveDCSGroup(DCSGroup) |
+
+
+ |
+
+
+ | SET:_IsAliveDCSUnit(DCSUnit) |
+
+
+ |
+
+
+ | SET:_IsIncludeDCSUnit(DCSUnit) |
+
+
+ |
+
+
+ | SET:_RegisterDatabase() |
+
+ Private method that registers all datapoints within in the mission.
+ |
+
+
+ | SET:_RegisterPlayers() |
+
+ Private method that registers all alive players in the mission.
+ |
+
+
+
+
Global(s)
+
+-
+
+ #SET
+
+SET
+
+
+-
+
+
+
+
+
+
+
+
+
+
SET class
+
+
Field(s)
+
+-
+
+
+SET:AddUnit(UnitToAdd)
+
+
+-
+
+
Finds a Unit based on the Unit Name.
+
+ Parameter
+
+ Return value
+
+Unit#UNIT:
+The added Unit.
+
+
+
+
+-
+
+ #string
+
+SET.ClassName
+
+
+-
+
+
+
+
+
+
+-
+
+
+
+SET.Clients
+
+
+-
+
+
+
+
+
+
+-
+
+
+
+SET.ClientsAlive
+
+
+-
+
+
+
+
+
+
+-
+
+
+
+SET.DCSGroups
+
+
+-
+
+
+
+
+
+
+-
+
+
+
+SET.DCSGroupsAlive
+
+
+-
+
+
+
+
+
+
+-
+
+
+
+SET.DCSUnits
+
+
+-
+
+
+
+
+
+
+-
+
+
+
+SET.DCSUnitsAlive
+
+
+-
+
+
+
+
+
+
+-
+
+
+
+SET.Filter
+
+
+-
+
+
+
+
+
+
+-
+
+
+SET:FilterCategories(Categories)
+
+
+-
+
+
Builds a set of units out of categories.
+
+
+Possible current categories are plane, helicopter, ground, ship.
+
+ Parameter
+
+ Return value
+
+#SET:
+self
+
+
+
+
+-
+
+
+SET:FilterCoalitions(Coalitions)
+
+
+-
+
+
Builds a set of units of coalitons.
+
+
+Possible current coalitions are red, blue and neutral.
+
+ Parameter
+
+ Return value
+
+#SET:
+self
+
+
+
+
+-
+
+
+SET:FilterCountries(Countries)
+
+
+-
+
+
Builds a set of units of defined countries.
+
+
+Possible current countries are those known within DCS world.
+
+ Parameter
+
+ Return value
+
+#SET:
+self
+
+
+
+
+-
+
+
+SET:FilterGroupPrefixes(Prefixes)
+
+
+-
+
+
Builds a set of units of defined group prefixes.
+
+
+All the units starting with the given group prefixes will be included within the set.
+
+ Parameter
+
+ Return value
+
+#SET:
+self
+
+
+
+
+-
+
+
+
+SET.FilterMeta
+
+
+-
+
+
+
+
+
+
+-
+
+
+SET:FilterStart()
+
+
+-
+
+
Starts the filtering.
+
+ Return value
+
+#SET:
+self
+
+
+
+
+-
+
+
+SET:FilterTypes(Types)
+
+
+-
+
+
Builds a set of units of defined unit types.
+
+
+Possible current types are those types known within DCS world.
+
+ Parameter
+
+ Return value
+
+#SET:
+self
+
+
+
+
+-
+
+
+SET:FilterUnitPrefixes(Prefixes)
+
+
+-
+
+
Builds a set of units of defined unit prefixes.
+
+
+All the units starting with the given prefixes will be included within the set.
+
+ Parameter
+
+ Return value
+
+#SET:
+self
+
+
+
+
+-
+
+
+SET:FindUnit(UnitName)
+
+
+-
+
+
Finds a Unit based on the Unit Name.
+
+ Parameter
+
+ -
+
+
#string UnitName :
+
+
+
+ Return value
+
+Unit#UNIT:
+The found Unit.
+
+
+
+
+-
+
+
+SET:ForEach(IteratorFunction, arg, Set)
+
+
+-
+
+
Interate the SET and call an interator function for the given set, providing the Object for each element within the set and optional parameters.
+
+ Parameters
+
+ Return value
+
+#SET:
+self
+
+
+
+
+-
+
+
+SET:ForEachClient(IteratorFunction, ...)
+
+
+-
+
+
Interate the SET and call an interator function for each client, providing the Client to the function and optional parameters.
+
+ Parameters
+
+ Return value
+
+#SET:
+self
+
+
+
+
+-
+
+
+SET:ForEachDCSUnitAlive(IteratorFunction, ...)
+
+
+-
+
+
Interate the SET and call an interator function for each alive unit, providing the Unit and optional parameters.
+
+ Parameters
+
+ Return value
+
+#SET:
+self
+
+
+
+
+-
+
+
+SET:ForEachPlayer(IteratorFunction, ...)
+
+
+-
+
+
Interate the SET and call an interator function for each alive player, providing the Unit of the player and optional parameters.
+
+ Parameters
+
+ Return value
+
+#SET:
+self
+
+
+
+
+-
+
+
+
+SET.Groups
+
+
+-
+
+
+
+
+
+
+-
+
+
+
+SET.GroupsAlive
+
+
+-
+
+
+
+
+
+
+-
+
+
+
+SET.NavPoints
+
+
+-
+
+
+
+
+
+
+-
+
+
+SET:New()
+
+
+-
+
+
Creates a new SET object, building a set of units belonging to a coalitions, categories, countries, types or with defined prefix names.
+
+ Return value
+
+#SET:
+
+
+ Usage:
+ -- Define a new SET Object. This DBObject will contain a reference to all Group and Unit Templates defined within the ME and the DCSRTE.
+DBObject = SET:New()
+
+
+
+
+-
+
+
+
+SET.Players
+
+
+-
+
+
+
+
+
+
+-
+
+
+
+SET.PlayersAlive
+
+
+-
+
+
+
+
+
+
+-
+
+
+SET:ScanEnvironment()
+
+
+-
+
+
+
+
+
+
+-
+
+
+
+SET.Statics
+
+
+-
+
+
+
+
+
+
+-
+
+
+
+SET.Templates
+
+
+-
+
+
+
+
+
+
+-
+
+
+SET:TraceDatabase()
+
+
+-
+
+
Traces the current SET contents in the log ...
+
+
+(for debug reasons).
+
+ Return value
+
+#SET:
+self
+
+
+
+
+-
+
+
+
+SET.Units
+
+
+-
+
+
+
+
+
+
+-
+
+
+
+SET.UnitsAlive
+
+
+-
+
+
+
+
+
+
+-
+
+
+SET:_EventOnBirth(Event)
+
+
+-
+
+
Handles the OnBirth event for the alive units set.
+
+ Parameter
+
+
+
+
+-
+
+
+SET:_EventOnDeadOrCrash(Event)
+
+
+-
+
+
Handles the OnDead or OnCrash event for alive units set.
+
+ Parameter
+
+
+
+
+-
+
+
+SET:_EventOnPlayerEnterUnit(Event)
+
+
+-
+
+
Handles the OnPlayerEnterUnit event to fill the active players table (with the unit filter applied).
+
+ Parameter
+
+
+
+
+-
+
+
+SET:_EventOnPlayerLeaveUnit(Event)
+
+
+-
+
+
Handles the OnPlayerLeaveUnit event to clean the active players table.
+
+ Parameter
+
+
+
+
+-
+
+
+SET:_IsAliveDCSGroup(DCSGroup)
+
+
+-
+
+
+
+
Parameter
+
+ Return value
+
+#SET:
+self
+
+
+
+
+-
+
+
+SET:_IsAliveDCSUnit(DCSUnit)
+
+
+-
+
+
+
+
Parameter
+
+ Return value
+
+#SET:
+self
+
+
+
+
+-
+
+
+SET:_IsIncludeDCSUnit(DCSUnit)
+
+
+-
+
+
+
+
Parameter
+
+ Return value
+
+#SET:
+self
+
+
+
+
+-
+
+
+SET:_RegisterDatabase()
+
+
+-
+
+
Private method that registers all datapoints within in the mission.
+
+ Return value
+
+#SET:
+self
+
+
+
+
+-
+
+
+SET:_RegisterPlayers()
+
+
+-
+
+
Private method that registers all alive players in the mission.
+
+ Return value
+
+#SET:
+self
+
+
+
+
+
+
+
+
+
diff --git a/Documentation/Spawn.html b/Documentation/Spawn.html
index 2f5ba12ef..b0c92b062 100644
--- a/Documentation/Spawn.html
+++ b/Documentation/Spawn.html
@@ -43,6 +43,7 @@
diff --git a/Documentation/TASK.html b/Documentation/TASK.html
index d18c673ff..fee28dd8f 100644
--- a/Documentation/TASK.html
+++ b/Documentation/TASK.html
@@ -43,6 +43,7 @@
diff --git a/Documentation/Unit.html b/Documentation/Unit.html
index f08c9006c..c55741f7e 100644
--- a/Documentation/Unit.html
+++ b/Documentation/Unit.html
@@ -43,6 +43,7 @@
Module Unit
-
UNIT Classes
+
UNIT Class
+
+
+
The UNIT class is a wrapper class to handle the DCS Unit objects:
+
+
+ - Support all DCS Unit APIs.
+
+
+
+
+ - Enhance with Unit specific APIs not in the DCS Unit API set.
+ - Handle local Unit Controller.
+ - Manage the "state" of the objects.
+
+
+
+
UNIT reference methods
+
For each DCS Unit object alive within a running mission, a UNIT wrapper object (instance) will be created within the _DATABASE object.
+This is done at the beginning of the mission (when the mission starts), and dynamically when new DCS Unit objects are spawned (using the SPAWN class).
+
+
The UNIT class does not contain a :New() method, rather it provides :Find() methods to retrieve the object reference
+using the DCS Unit or the DCS UnitName.
+
+
Another thing to know is that UNIT objects do not "contain" the DCS Unit object.
+The UNIT methods will reference the DCS Unit object by name when it is needed during API execution.
+If the DCS Unit object does not exist or is nil, the UNIT methods will return nil and log an exception in the DCS.log file.
+
+
The UNIT class provides the following functions to retrieve quickly the relevant UNIT instance:
+
+
+ - UNIT.Find(): Find a UNIT instance from the _DATABASE object using a DCS Unit object.
+ - UNIT.FindByName(): Find a UNIT instance from the _DATABASE object using a DCS Unit object.
+
+
+
IMPORTANT: ONE SHOULD NEVER SANATIZE these UNIT OBJECT REFERENCES! (make the UNIT object references nil).
+
Global(s)
@@ -76,6 +113,18 @@
| UNIT.ClassName |
+ |
+
+
+ | UNIT:Find(DCSUnit) |
+
+ Finds a UNIT from the _DATABASE using a DCSUnit object.
+ |
+
+
+ | UNIT:FindByName(UnitName) |
+
+ Find a UNIT in the _DATABASE using the name of an existing DCS Unit.
|
@@ -112,6 +161,12 @@
| UNIT:FlareYellow() |
Signal a yellow flare at the position of the UNIT.
+ |
+
+
+ | UNIT:GetAltitude() |
+
+ Returns the altitude of the DCS Unit.
|
@@ -129,7 +184,7 @@
| UNIT:GetCategoryName() |
- Returns the Unit's Category Name as defined within the Unit's Descriptor.
+Returns the DCS Unit category name as defined within the DCS Unit Descriptor.
|
@@ -189,7 +244,7 @@
| UNIT:GetName() |
- Returns unit object by the name assigned to the unit in Mission Editor.
+Returns DCS Unit object name.
|
@@ -207,19 +262,25 @@
| UNIT:GetPointVec2() |
-
+ Returns the DCSTypes#Vec2 vector indicating the point in 2D of the DCS Unit within the mission.
+ |
+
+
+ | UNIT:GetPointVec3() |
+
+ Returns the DCSTypes#Vec3 vector indicating the point in 3D of the DCS Unit within the mission.
|
| UNIT:GetPositionVec3() |
-
+ Returns the DCSTypes#Position3 position vectors indicating the point and direction vectors in 3D of the DCS Unit within the mission.
|
| UNIT:GetPrefix() |
-
+ Returns the prefix name of the DCS Unit.
|
@@ -241,19 +302,19 @@
| UNIT:GetTypeName() |
-
+ Returns the type name of the DCS Unit.
|
| UNIT:GetVelocity() |
- Returns the unit's velocity vector.
+Returns the DCS Unit velocity vector.
|
| UNIT:InAir() |
- Returns true if the Unit is in air.
+Returns true if the DCS Unit is in the air.
|
@@ -272,24 +333,18 @@
| UNIT:IsAlive() |
Returns if the unit is alive.
- |
-
-
- | UNIT:New(DCSUnit) |
-
- Create a new UNIT from DCSUnit.
- |
-
-
- | UNIT:NewFromName(Unit, UnitName) |
-
- Create a new UNIT from a Unit Name.
|
| UNIT:OtherUnitInRadius(AwaitUnit, Radius) |
-
+ Returns true if there is an other DCS Unit within a radius of the current 2D point of the DCS Unit.
+ |
+
+
+ | UNIT:Register(DCSUnit, Database, UnitName) |
+
+ Create a new UNIT from DCSUnit.
|
@@ -446,6 +501,60 @@
+
+
+
+-
+
+
+UNIT:Find(DCSUnit)
+
+
+-
+
+
Finds a UNIT from the _DATABASE using a DCSUnit object.
+
+ Parameter
+
+ Return value
+
+Unit#UNIT:
+self
+
+
+
+
+-
+
+
+UNIT:FindByName(UnitName)
+
+
+-
+
+
Find a UNIT in the _DATABASE using the name of an existing DCS Unit.
+
+ Parameter
+
+ Return value
+
+Unit#UNIT:
+self
+
@@ -538,6 +647,34 @@
-
+
+UNIT:GetAltitude()
+
+
+-
+
+
Returns the altitude of the DCS Unit.
+
+ Return values
+
+ -
+
+
DCSTypes#Distance:
+The altitude of the DCS Unit.
+
+
+ -
+
+
#nil:
+The DCS Unit is not existing or alive.
+
+
+
+
+
+
+-
+
UNIT:GetAmmo()
@@ -546,11 +683,21 @@
Returns the Unit's ammunition.
- Return value
+ Return values
+
+ -
DCSUnit#Unit.Ammo:
+
+ -
+
+
#nil:
+The DCS Unit is not existing or alive.
+
+
+
@@ -564,11 +711,21 @@
Returns the unit's callsign - the localized string.
- Return value
+ Return values
+
+ -
#string:
The Callsign of the Unit.
+
+ -
+
+
#nil:
+The DCS Unit is not existing or alive.
+
+
+
@@ -580,12 +737,12 @@ The Callsign of the Unit.
-
-
Returns the Unit's Category Name as defined within the Unit's Descriptor.
+Returns the DCS Unit category name as defined within the DCS Unit Descriptor.
Return value
#string:
-Unit's Category Name
+The DCS Unit Category Name
@@ -600,11 +757,21 @@ Unit's Category Name
Returns coalition of the Unit.
- Return value
+ Return values
+
+ -
-
DCSCoalitionObject#coalition.side:
+DCSCoalitionObject#coalition.side:
+The side of the coalition.
+
+ -
+
+
#nil:
+The DCS Unit is not existing or alive.
+
+
@@ -618,11 +785,21 @@ Unit's Category Name
Returns country of the Unit.
- Return value
+ Return values
+
+ -
DCScountry#country.id:
-The country identifyer.
+The country identifier.
+
+ -
+
+
#nil:
+The DCS Unit is not existing or alive.
+
+
+
@@ -652,11 +829,21 @@ The country identifyer.
Descriptor type depends on unit category.
- Return value
+ Return values
+
+ -
DCSUnit#Unit.Desc:
The Unit descriptor.
+
+ -
+
+
#nil:
+The DCS Unit is not existing or alive.
+
+
+
@@ -673,11 +860,21 @@ The Unit descriptor.
If there are additional fuel tanks the value may be greater than 1.0.
- Return value
+ Return values
+
+ -
#number:
The relative amount of fuel (from 0.0 to 1.0).
+
+ -
+
+
#nil:
+The DCS Unit is not existing or alive.
+
+
+
@@ -691,11 +888,21 @@ The relative amount of fuel (from 0.0 to 1.0).
Returns the unit's group if it exist and nil otherwise.
- Return value
+ Return values
+
+ -
Group#GROUP:
The Group of the Unit.
+
+ -
+
+
#nil:
+The DCS Unit is not existing or alive.
+
+
+
@@ -709,11 +916,21 @@ The Group of the Unit.
Returns the unit's unique identifier.
- Return value
+ Return values
+
+ -
DCSUnit#Unit.ID:
Unit ID
+
+ -
+
+
#nil:
+The DCS Unit is not existing or alive.
+
+
+
@@ -730,11 +947,21 @@ Unit ID
Dead units has health <= 1.0.
- Return value
+ Return values
+
+ -
#number:
The Unit's health value.
+
+ -
+
+
#nil:
+The DCS Unit is not existing or alive.
+
+
+
@@ -748,11 +975,21 @@ The Unit's health value.
Returns the Unit's initial health.
- Return value
+ Return values
+
+ -
#number:
The Unit's initial health value.
+
+ -
+
+
#nil:
+The DCS Unit is not existing or alive.
+
+
+
@@ -764,13 +1001,26 @@ The Unit's initial health value.
-
-
Returns unit object by the name assigned to the unit in Mission Editor.
+Returns DCS Unit object name.
-If there is unit with such name or the unit is destroyed the function will return nil.
-The function provides access to non-activated units too.
-
+The function provides access to non-activated units too.
+ Return values
+
+ -
+
+
#string:
+The name of the DCS Unit.
+
+
+ -
+
+
#nil:
+The DCS Unit is not existing or alive.
+
+
+
@@ -789,11 +1039,21 @@ The function provides access to non-activated units too.
It may not be changed during the mission.
If any unit in the group is destroyed, the numbers of another units will not be changed.
- Return value
+ Return values
+
+ -
#number:
The Unit number.
+
+ -
+
+
#nil:
+The DCS Unit is not existing or alive.
+
+
+
@@ -807,11 +1067,21 @@ The Unit number.
Returns name of the player that control the unit or nil if the unit is controlled by A.I.
- Return value
+ Return values
+
+ -
#string:
Player Name
+
+ -
+
+
#nil:
+The DCS Unit is not existing or alive.
+
+
+
@@ -823,8 +1093,51 @@ Player Name
-
+
Returns the DCSTypes#Vec2 vector indicating the point in 2D of the DCS Unit within the mission.
+ Return values
+
+ -
+
+
DCSTypes#Vec2:
+The 2D point vector of the DCS Unit.
+
+ -
+
+
#nil:
+The DCS Unit is not existing or alive.
+
+
+
+
+
+
+-
+
+
+UNIT:GetPointVec3()
+
+
+-
+
+
Returns the DCSTypes#Vec3 vector indicating the point in 3D of the DCS Unit within the mission.
+
+ Return values
+
+ -
+
+
DCSTypes#Vec3:
+The 3D point vector of the DCS Unit.
+
+
+ -
+
+
#nil:
+The DCS Unit is not existing or alive.
+
+
+
@@ -836,8 +1149,23 @@ Player Name
-
+
Returns the DCSTypes#Position3 position vectors indicating the point and direction vectors in 3D of the DCS Unit within the mission.
+ Return values
+
+ -
+
+
DCSTypes#Position:
+The 3D position vectors of the DCS Unit.
+
+ -
+
+
#nil:
+The DCS Unit is not existing or alive.
+
+
+
@@ -849,8 +1177,28 @@ Player Name
-
+
Returns the prefix name of the DCS Unit.
+
+A prefix name is a part of the name before a '#'-sign.
+DCS Units spawned with the SPAWN class contain a '#'-sign to indicate the end of the (base) DCS Unit name.
+The spawn sequence number and unit number are contained within the name after the '#' sign.
+ Return values
+
+ -
+
+
#string:
+The name of the DCS Unit.
+
+
+ -
+
+
#nil:
+The DCS Unit is not existing or alive.
+
+
+
@@ -886,6 +1234,12 @@ Player Name
DCSObject#Object:
The object of the radar's interest. Not nil only if at least one radar of the unit is tracking a target.
+
+
+
+#nil:
+The DCS Unit is not existing or alive.
+
@@ -901,11 +1255,21 @@ The object of the radar's interest. Not nil only if at least one radar of the un
Returns the unit sensors.
- Return value
+ Return values
+
+ -
DCSUnit#Unit.Sensors:
+
+ -
+
+
#nil:
+The DCS Unit is not existing or alive.
+
+
+
@@ -917,8 +1281,23 @@ The object of the radar's interest. Not nil only if at least one radar of the un
-
+
Returns the type name of the DCS Unit.
+ Return values
+
+ -
+
+
#string:
+The type name of the DCS Unit.
+
+ -
+
+
#nil:
+The DCS Unit is not existing or alive.
+
+
+
@@ -930,13 +1309,23 @@ The object of the radar's interest. Not nil only if at least one radar of the un
-
-
Returns the unit's velocity vector.
+Returns the DCS Unit velocity vector.
- Return value
+ Return values
+
+ -
DCSTypes#Vec3:
-Velocity Vector
+The velocity vector
+
+ -
+
+
#nil:
+The DCS Unit is not existing or alive.
+
+
+
@@ -948,13 +1337,23 @@ Velocity Vector
-
-
Returns true if the Unit is in air.
+Returns true if the DCS Unit is in the air.
- Return value
+ Return values
+
+ -
#boolean:
true if in the air.
+
+ -
+
+
#nil:
+The DCS Unit is not existing or alive.
+
+
+
@@ -968,11 +1367,21 @@ true if in the air.
Returns if the unit is activated.
- Return value
+ Return values
+
+ -
#boolean:
true if Unit is activated.
+
+ -
+
+
#nil:
+The DCS Unit is not existing or alive.
+
+
+
@@ -1007,56 +1416,87 @@ Air category evaluation result.
Returns if the unit is alive.
- Return value
+ Return values
+
+ -
#boolean:
true if Unit is alive.
+
+ -
+
+
#nil:
+The DCS Unit is not existing or alive.
+
+
+
-
-
-UNIT:New(DCSUnit)
+
+UNIT:OtherUnitInRadius(AwaitUnit, Radius)
+
+
+-
+
+
Returns true if there is an other DCS Unit within a radius of the current 2D point of the DCS Unit.
+
+ Parameters
+
+ Return values
+
+ -
+
+
+
true If the other DCS Unit is within the radius of the 2D point of the DCS Unit.
+
+
+ -
+
+
#nil:
+The DCS Unit is not existing or alive.
+
+
+
+
+
+
+-
+
+
+UNIT:Register(DCSUnit, Database, UnitName)
-
Create a new UNIT from DCSUnit.
- Parameter
+ Parameters
- Return value
-
-Unit#UNIT:
-
-
-
-
-
--
-
-
-UNIT:NewFromName(Unit, UnitName)
-
-
--
-
-
Create a new UNIT from a Unit Name.
-
- Parameters
-
+
+ | Set |
+
+ Manage sets of units and groups.
|
@@ -224,7 +231,14 @@
| Unit |
- UNIT Classes
+UNIT Class
+
+
+The UNIT class is a wrapper class to handle the DCS Unit objects:
+
+
+ - Support all DCS Unit APIs.
+
|
diff --git a/Documentation/routines.html b/Documentation/routines.html
index 806bd57e3..6dd92ef95 100644
--- a/Documentation/routines.html
+++ b/Documentation/routines.html
@@ -43,6 +43,7 @@
Scheduler
Scoring
Sead
+ Set
Spawn
TASK
Unit
diff --git a/Moose/Unit.lua b/Moose/Unit.lua
index 16e585f5e..99d13daf2 100644
--- a/Moose/Unit.lua
+++ b/Moose/Unit.lua
@@ -1,5 +1,36 @@
---- UNIT Classes
+--- UNIT Class
+--
+-- @{UNIT} class
+-- ==============
+-- The @{UNIT} class is a wrapper class to handle the DCS Unit objects:
+--
+-- * Support all DCS Unit APIs.
+-- * Enhance with Unit specific APIs not in the DCS Unit API set.
+-- * Handle local Unit Controller.
+-- * Manage the "state" of the objects.
+--
+--
+-- UNIT reference methods
+-- ======================
+-- For each DCS Unit object alive within a running mission, a UNIT wrapper object (instance) will be created within the _@{DATABASE} object.
+-- This is done at the beginning of the mission (when the mission starts), and dynamically when new DCS Unit objects are spawned (using the @{SPAWN} class).
+--
+-- The UNIT class does not contain a :New() method, rather it provides :Find() methods to retrieve the object reference
+-- using the DCS Unit or the DCS UnitName.
+--
+-- Another thing to know is that UNIT objects do not "contain" the DCS Unit object.
+-- The UNIT methods will reference the DCS Unit object by name when it is needed during API execution.
+-- If the DCS Unit object does not exist or is nil, the UNIT methods will return nil and log an exception in the DCS.log file.
+--
+-- The UNIT class provides the following functions to retrieve quickly the relevant UNIT instance:
+--
+-- * @{#UNIT.Find}(): Find a UNIT instance from the _DATABASE object using a DCS Unit object.
+-- * @{#UNIT.FindByName}(): Find a UNIT instance from the _DATABASE object using a DCS Unit object.
+--
+-- IMPORTANT: ONE SHOULD NEVER SANATIZE these UNIT OBJECT REFERENCES! (make the UNIT object references nil).
+--
-- @module Unit
+-- @author FlightControl
Include.File( "Routines" )
Include.File( "Base" )
@@ -65,8 +96,8 @@ end
--- Finds a UNIT from the _DATABASE using a DCSUnit object.
-- @param #UNIT self
--- @param DCSUnit#Unit DCSUnit
--- @return Unit#UNIT
+-- @param DCSUnit#Unit DCSUnit An existing DCS Unit object reference.
+-- @return Unit#UNIT self
function UNIT:Find( DCSUnit )
local UnitName = DCSUnit:getName()
@@ -74,10 +105,10 @@ function UNIT:Find( DCSUnit )
return UnitFound
end
---- Find a UNIT in the _DATABASE using the name of the UNIT.
+--- Find a UNIT in the _DATABASE using the name of an existing DCS Unit.
-- @param #UNIT self
--- @param #string Unit Name
--- @return Unit#UNIT
+-- @param #string UnitName The Unit Name.
+-- @return Unit#UNIT self
function UNIT:FindByName( UnitName )
-- self:F( UnitName )
@@ -97,7 +128,8 @@ end
--- Returns coalition of the Unit.
-- @param Unit#UNIT self
--- @return DCSCoalitionObject#coalition.side
+-- @return DCSCoalitionObject#coalition.side The side of the coalition.
+-- @return #nil The DCS Unit is not existing or alive.
function UNIT:GetCoalition()
self:F( self.UnitName )
@@ -114,7 +146,8 @@ end
--- Returns country of the Unit.
-- @param Unit#UNIT self
--- @return DCScountry#country.id The country identifyer.
+-- @return DCScountry#country.id The country identifier.
+-- @return #nil The DCS Unit is not existing or alive.
function UNIT:GetCountry()
self:F( self.UnitName )
@@ -130,10 +163,11 @@ function UNIT:GetCountry()
end
---- Returns unit object by the name assigned to the unit in Mission Editor.
--- If there is unit with such name or the unit is destroyed the function will return nil.
+--- Returns DCS Unit object name.
-- The function provides access to non-activated units too.
---
+-- @param Unit#UNIT self
+-- @return #string The name of the DCS Unit.
+-- @return #nil The DCS Unit is not existing or alive.
function UNIT:GetName()
self:F( self.UnitName )
@@ -151,6 +185,7 @@ end
--- Returns if the unit is alive.
-- @param Unit#UNIT self
-- @return #boolean true if Unit is alive.
+-- @return #nil The DCS Unit is not existing or alive.
function UNIT:IsAlive()
self:F( self.UnitName )
@@ -167,6 +202,7 @@ end
--- Returns if the unit is activated.
-- @param Unit#UNIT self
-- @return #boolean true if Unit is activated.
+-- @return #nil The DCS Unit is not existing or alive.
function UNIT:IsActive()
self:F( self.UnitName )
@@ -184,6 +220,7 @@ end
--- Returns name of the player that control the unit or nil if the unit is controlled by A.I.
-- @param Unit#UNIT self
-- @return #string Player Name
+-- @return #nil The DCS Unit is not existing or alive.
function UNIT:GetPlayerName()
self:F( self.UnitName )
@@ -204,6 +241,7 @@ end
--- Returns the unit's unique identifier.
-- @param Unit#UNIT self
-- @return DCSUnit#Unit.ID Unit ID
+-- @return #nil The DCS Unit is not existing or alive.
function UNIT:GetID()
self:F( self.UnitName )
@@ -223,6 +261,7 @@ end
-- If any unit in the group is destroyed, the numbers of another units will not be changed.
-- @param Unit#UNIT self
-- @return #number The Unit number.
+-- @return #nil The DCS Unit is not existing or alive.
function UNIT:GetNumber()
self:F( self.UnitName )
@@ -239,6 +278,7 @@ end
--- Returns the unit's group if it exist and nil otherwise.
-- @param Unit#UNIT self
-- @return Group#GROUP The Group of the Unit.
+-- @return #nil The DCS Unit is not existing or alive.
function UNIT:GetGroup()
self:F( self.UnitName )
@@ -256,6 +296,7 @@ end
--- Returns the unit's callsign - the localized string.
-- @param Unit#UNIT self
-- @return #string The Callsign of the Unit.
+-- @return #nil The DCS Unit is not existing or alive.
function UNIT:GetCallSign()
self:F( self.UnitName )
@@ -272,6 +313,7 @@ end
--- Returns the unit's health. Dead units has health <= 1.0.
-- @param Unit#UNIT self
-- @return #number The Unit's health value.
+-- @return #nil The DCS Unit is not existing or alive.
function UNIT:GetLife()
self:F( self.UnitName )
@@ -288,6 +330,7 @@ end
--- Returns the Unit's initial health.
-- @param Unit#UNIT self
-- @return #number The Unit's initial health value.
+-- @return #nil The DCS Unit is not existing or alive.
function UNIT:GetLife0()
self:F( self.UnitName )
@@ -304,6 +347,7 @@ end
--- Returns relative amount of fuel (from 0.0 to 1.0) the unit has in its internal tanks. If there are additional fuel tanks the value may be greater than 1.0.
-- @param Unit#UNIT self
-- @return #number The relative amount of fuel (from 0.0 to 1.0).
+-- @return #nil The DCS Unit is not existing or alive.
function UNIT:GetFuel()
self:F( self.UnitName )
@@ -320,6 +364,7 @@ end
--- Returns the Unit's ammunition.
-- @param Unit#UNIT self
-- @return DCSUnit#Unit.Ammo
+-- @return #nil The DCS Unit is not existing or alive.
function UNIT:GetAmmo()
self:F( self.UnitName )
@@ -336,6 +381,7 @@ end
--- Returns the unit sensors.
-- @param Unit#UNIT self
-- @return DCSUnit#Unit.Sensors
+-- @return #nil The DCS Unit is not existing or alive.
function UNIT:GetSensors()
self:F( self.UnitName )
@@ -359,6 +405,7 @@ end
-- @param Unit#UNIT self
-- @return #boolean Indicates if at least one of the unit's radar(s) is on.
-- @return DCSObject#Object The object of the radar's interest. Not nil only if at least one radar of the unit is tracking a target.
+-- @return #nil The DCS Unit is not existing or alive.
function UNIT:GetRadar()
self:F( self.UnitName )
@@ -377,6 +424,7 @@ end
--- Returns unit descriptor. Descriptor type depends on unit category.
-- @param Unit#UNIT self
-- @return DCSUnit#Unit.Desc The Unit descriptor.
+-- @return #nil The DCS Unit is not existing or alive.
function UNIT:GetDesc()
self:F( self.UnitName )
@@ -391,7 +439,10 @@ function UNIT:GetDesc()
end
-
+--- Returns the type name of the DCS Unit.
+-- @param Unit#UNIT self
+-- @return #string The type name of the DCS Unit.
+-- @return #nil The DCS Unit is not existing or alive.
function UNIT:GetTypeName()
self:F( self.UnitName )
@@ -406,16 +457,34 @@ function UNIT:GetTypeName()
return nil
end
+
+
+--- Returns the prefix name of the DCS Unit. A prefix name is a part of the name before a '#'-sign.
+-- DCS Units spawned with the @{SPAWN} class contain a '#'-sign to indicate the end of the (base) DCS Unit name.
+-- The spawn sequence number and unit number are contained within the name after the '#' sign.
+-- @param Unit#UNIT self
+-- @return #string The name of the DCS Unit.
+-- @return #nil The DCS Unit is not existing or alive.
function UNIT:GetPrefix()
self:F( self.UnitName )
+
+ local DCSUnit = self:GetDCSUnit()
- local UnitPrefix = string.match( self.UnitName, ".*#" ):sub( 1, -2 )
- self:T( UnitPrefix )
- return UnitPrefix
+ if DCSUnit then
+ local UnitPrefix = string.match( self.UnitName, ".*#" ):sub( 1, -2 )
+ self:T( UnitPrefix )
+ return UnitPrefix
+ end
+
+ return nil
end
+--- Returns the @{DCSTypes#Vec2} vector indicating the point in 2D of the DCS Unit within the mission.
+-- @param Unit#UNIT self
+-- @return DCSTypes#Vec2 The 2D point vector of the DCS Unit.
+-- @return #nil The DCS Unit is not existing or alive.
function UNIT:GetPointVec2()
self:F( self.UnitName )
@@ -436,6 +505,10 @@ function UNIT:GetPointVec2()
end
+--- Returns the @{DCSTypes#Vec3} vector indicating the point in 3D of the DCS Unit within the mission.
+-- @param Unit#UNIT self
+-- @return DCSTypes#Vec3 The 3D point vector of the DCS Unit.
+-- @return #nil The DCS Unit is not existing or alive.
function UNIT:GetPointVec3()
self:F( self.UnitName )
@@ -450,6 +523,10 @@ function UNIT:GetPointVec3()
return nil
end
+--- Returns the @{DCSTypes#Position3} position vectors indicating the point and direction vectors in 3D of the DCS Unit within the mission.
+-- @param Unit#UNIT self
+-- @return DCSTypes#Position The 3D position vectors of the DCS Unit.
+-- @return #nil The DCS Unit is not existing or alive.
function UNIT:GetPositionVec3()
self:F( self.UnitName )
@@ -464,9 +541,10 @@ function UNIT:GetPositionVec3()
return nil
end
---- Returns the unit's velocity vector.
+--- Returns the DCS Unit velocity vector.
-- @param Unit#UNIT self
--- @return DCSTypes#Vec3 Velocity Vector
+-- @return DCSTypes#Vec3 The velocity vector
+-- @return #nil The DCS Unit is not existing or alive.
function UNIT:GetVelocity()
self:F( self.UnitName )
@@ -481,9 +559,10 @@ function UNIT:GetVelocity()
return nil
end
---- Returns true if the Unit is in air.
+--- Returns true if the DCS Unit is in the air.
-- @param Unit#UNIT self
-- @return #boolean true if in the air.
+-- @return #nil The DCS Unit is not existing or alive.
function UNIT:InAir()
self:F( self.UnitName )
@@ -498,9 +577,10 @@ function UNIT:InAir()
return nil
end
---- Returns the altitude of the UNIT.
--- @param #UNIT self
--- @return DCSTypes#Distance
+--- Returns the altitude of the DCS Unit.
+-- @param Unit#UNIT self
+-- @return DCSTypes#Distance The altitude of the DCS Unit.
+-- @return #nil The DCS Unit is not existing or alive.
function UNIT:GetAltitude()
self:F()
@@ -514,27 +594,36 @@ function UNIT:GetAltitude()
return nil
end
+--- Returns true if there is an **other** DCS Unit within a radius of the current 2D point of the DCS Unit.
+-- @param Unit#UNIT self
+-- @param Unit#UNIT AwaitUnit The other UNIT wrapper object.
+-- @param Radius The radius in meters with the DCS Unit in the centre.
+-- @return true If the other DCS Unit is within the radius of the 2D point of the DCS Unit.
+-- @return #nil The DCS Unit is not existing or alive.
function UNIT:OtherUnitInRadius( AwaitUnit, Radius )
self:F( { self.UnitName, AwaitUnit.UnitName, Radius } )
- local UnitPos = self:GetPointVec3()
- local AwaitUnitPos = AwaitUnit:GetPointVec3()
+ local DCSUnit = self:GetDCSUnit()
+
+ if DCSUnit then
+ local UnitPos = self:GetPointVec3()
+ local AwaitUnitPos = AwaitUnit:GetPointVec3()
+
+ if (((UnitPos.x - AwaitUnitPos.x)^2 + (UnitPos.z - AwaitUnitPos.z)^2)^0.5 <= Radius) then
+ self:T( "true" )
+ return true
+ else
+ self:T( "false" )
+ return false
+ end
+ end
- if (((UnitPos.x - AwaitUnitPos.x)^2 + (UnitPos.z - AwaitUnitPos.z)^2)^0.5 <= Radius) then
- self:T( "true" )
- return true
- else
- self:T( "false" )
- return false
- end
-
- self:T( "false" )
- return false
+ return nil
end
---- Returns the Unit's Category Name as defined within the Unit's Descriptor.
+--- Returns the DCS Unit category name as defined within the DCS Unit Descriptor.
-- @param Unit#UNIT self
--- @return #string Unit's Category Name
+-- @return #string The DCS Unit Category Name
function UNIT:GetCategoryName()
local DCSUnit = self:GetDCSUnit()
diff --git a/Presentations/DCS World - MOOSE - Development - Part 3 - The DATABASE - UNIT - CLIENT - GROUP - ZONE, .pptx b/Presentations/DCS World - MOOSE - Development - Part 3 - The DATABASE - UNIT - CLIENT - GROUP - ZONE, .pptx
index 26c9e4bc1d3d63e300a9b0401242f16bb79d40aa..fbb0df74138120c098de897fe730b293b2b0f3be 100644
GIT binary patch
delta 3434
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
Y3;^8y_pQID5h~me#7QKl0J;tT12?BKg8%>k