mirror of
https://github.com/FlightControl-Master/MOOSE.git
synced 2025-10-29 16:58:06 +00:00
Merge remote-tracking branch 'origin/master' into develop
This commit is contained in:
commit
172004b822
@ -47,7 +47,8 @@
|
||||
|
||||
do -- SET_BASE
|
||||
|
||||
--- @type SET_BASE
|
||||
---
|
||||
-- @type SET_BASE
|
||||
-- @field #table Filter Table of filters.
|
||||
-- @field #table Set Table of objects.
|
||||
-- @field #table Index Table of indices.
|
||||
@ -242,7 +243,7 @@ do -- SET_BASE
|
||||
function SET_BASE:Add( ObjectName, Object )
|
||||
|
||||
-- Debug info.
|
||||
self:T( { ObjectName = ObjectName, Object = Object } )
|
||||
self:T2( { ObjectName = ObjectName, Object = Object } )
|
||||
|
||||
-- Ensure that the existing element is removed from the Set before a new one is inserted to the Set
|
||||
if self.Set[ObjectName] then
|
||||
@ -257,6 +258,8 @@ do -- SET_BASE
|
||||
|
||||
-- Trigger Added event.
|
||||
self:Added( ObjectName, Object )
|
||||
|
||||
return self
|
||||
end
|
||||
|
||||
--- Adds a @{Core.Base#BASE} object in the @{Core.Set#SET_BASE}, using the Object Name as the index.
|
||||
@ -578,8 +581,8 @@ do -- SET_BASE
|
||||
end
|
||||
|
||||
----- Private method that registers all alive players in the mission.
|
||||
---- @param #SET_BASE self
|
||||
---- @return #SET_BASE self
|
||||
-- @param #SET_BASE self
|
||||
-- @return #SET_BASE self
|
||||
-- function SET_BASE:_RegisterPlayers()
|
||||
--
|
||||
-- local CoalitionsData = { AlivePlayersRed = coalition.getPlayers( coalition.side.RED ), AlivePlayersBlue = coalition.getPlayers( coalition.side.BLUE ) }
|
||||
@ -796,8 +799,8 @@ do -- SET_BASE
|
||||
|
||||
|
||||
----- Iterate the SET_BASE and call an iterator function for each **alive** unit, providing the Unit and optional parameters.
|
||||
---- @param #SET_BASE self
|
||||
---- @param #function IteratorFunction The function that will be called when there is an alive unit in the SET_BASE. The function needs to accept a UNIT parameter.
|
||||
-- @param #SET_BASE self
|
||||
-- @param #function IteratorFunction The function that will be called when there is an alive unit in the SET_BASE. The function needs to accept a UNIT parameter.
|
||||
---- @return #SET_BASE self
|
||||
-- function SET_BASE:ForEachDCSUnitAlive( IteratorFunction, ... )
|
||||
-- self:F3( arg )
|
||||
@ -808,8 +811,8 @@ do -- SET_BASE
|
||||
-- end
|
||||
--
|
||||
----- Iterate the SET_BASE and call an iterator function for each **alive** player, providing the Unit of the player and optional parameters.
|
||||
---- @param #SET_BASE self
|
||||
---- @param #function IteratorFunction The function that will be called when there is an alive player in the SET_BASE. The function needs to accept a UNIT parameter.
|
||||
-- @param #SET_BASE self
|
||||
-- @param #function IteratorFunction The function that will be called when there is an alive player in the SET_BASE. The function needs to accept a UNIT parameter.
|
||||
---- @return #SET_BASE self
|
||||
-- function SET_BASE:ForEachPlayer( IteratorFunction, ... )
|
||||
-- self:F3( arg )
|
||||
@ -821,8 +824,8 @@ do -- SET_BASE
|
||||
--
|
||||
--
|
||||
----- Iterate the SET_BASE and call an iterator function for each client, providing the Client to the function and optional parameters.
|
||||
---- @param #SET_BASE self
|
||||
---- @param #function IteratorFunction The function that will be called when there is an alive player in the SET_BASE. The function needs to accept a CLIENT parameter.
|
||||
-- @param #SET_BASE self
|
||||
-- @param #function IteratorFunction The function that will be called when there is an alive player in the SET_BASE. The function needs to accept a CLIENT parameter.
|
||||
---- @return #SET_BASE self
|
||||
-- function SET_BASE:ForEachClient( IteratorFunction, ... )
|
||||
-- self:F3( arg )
|
||||
@ -901,9 +904,12 @@ do -- SET_BASE
|
||||
|
||||
end
|
||||
|
||||
do -- SET_GROUP
|
||||
do
|
||||
|
||||
--- @type SET_GROUP #SET_GROUP
|
||||
-- SET_GROUP
|
||||
|
||||
---
|
||||
-- @type SET_GROUP #SET_GROUP
|
||||
-- @field Core.Timer#TIMER ZoneTimer
|
||||
-- @field #number ZoneTimerInterval
|
||||
-- @extends Core.Set#SET_BASE
|
||||
@ -1568,7 +1574,7 @@ do -- SET_GROUP
|
||||
self:F2( arg )
|
||||
|
||||
self:ForEach( IteratorFunction, arg, self:GetSet(),
|
||||
--- @param Core.Zone#ZONE_BASE ZoneObject
|
||||
-- @param Core.Zone#ZONE_BASE ZoneObject
|
||||
-- @param Wrapper.Group#GROUP GroupObject
|
||||
function( ZoneObject, GroupObject )
|
||||
if GroupObject:IsCompletelyInZone( ZoneObject ) then
|
||||
@ -1590,7 +1596,7 @@ do -- SET_GROUP
|
||||
self:F2( arg )
|
||||
|
||||
self:ForEach( IteratorFunction, arg, self:GetSet(),
|
||||
--- @param Core.Zone#ZONE_BASE ZoneObject
|
||||
-- @param Core.Zone#ZONE_BASE ZoneObject
|
||||
-- @param Wrapper.Group#GROUP GroupObject
|
||||
function( ZoneObject, GroupObject )
|
||||
if GroupObject:IsPartlyInZone( ZoneObject ) then
|
||||
@ -1612,7 +1618,7 @@ do -- SET_GROUP
|
||||
self:F2( arg )
|
||||
|
||||
self:ForEach( IteratorFunction, arg, self:GetSet(),
|
||||
--- @param Core.Zone#ZONE_BASE ZoneObject
|
||||
-- @param Core.Zone#ZONE_BASE ZoneObject
|
||||
-- @param Wrapper.Group#GROUP GroupObject
|
||||
function( ZoneObject, GroupObject )
|
||||
if GroupObject:IsNotInZone( ZoneObject ) then
|
||||
@ -1659,7 +1665,7 @@ do -- SET_GROUP
|
||||
self:F2( arg )
|
||||
|
||||
self:ForEach( IteratorFunction, arg, self:GetSet(),
|
||||
--- @param Core.Zone#ZONE_BASE ZoneObject
|
||||
-- @param Core.Zone#ZONE_BASE ZoneObject
|
||||
-- @param Wrapper.Group#GROUP GroupObject
|
||||
function( ZoneObject, GroupObject )
|
||||
if GroupObject:IsAnyInZone( ZoneObject ) then
|
||||
@ -1857,8 +1863,8 @@ do -- SET_GROUP
|
||||
end
|
||||
|
||||
----- Iterate the SET_GROUP and call an iterator function for each **alive** player, providing the Group of the player and optional parameters.
|
||||
---- @param #SET_GROUP self
|
||||
---- @param #function IteratorFunction The function that will be called when there is an alive player in the SET_GROUP. The function needs to accept a GROUP parameter.
|
||||
-- @param #SET_GROUP self
|
||||
-- @param #function IteratorFunction The function that will be called when there is an alive player in the SET_GROUP. The function needs to accept a GROUP parameter.
|
||||
---- @return #SET_GROUP self
|
||||
-- function SET_GROUP:ForEachPlayer( IteratorFunction, ... )
|
||||
-- self:F2( arg )
|
||||
@ -1870,8 +1876,8 @@ do -- SET_GROUP
|
||||
--
|
||||
--
|
||||
----- Iterate the SET_GROUP and call an iterator function for each client, providing the Client to the function and optional parameters.
|
||||
---- @param #SET_GROUP self
|
||||
---- @param #function IteratorFunction The function that will be called when there is an alive player in the SET_GROUP. The function needs to accept a CLIENT parameter.
|
||||
-- @param #SET_GROUP self
|
||||
-- @param #function IteratorFunction The function that will be called when there is an alive player in the SET_GROUP. The function needs to accept a CLIENT parameter.
|
||||
---- @return #SET_GROUP self
|
||||
-- function SET_GROUP:ForEachClient( IteratorFunction, ... )
|
||||
-- self:F2( arg )
|
||||
@ -1945,7 +1951,7 @@ do -- SET_GROUP
|
||||
if self.Filter.Zones then
|
||||
local MGroupZone = false
|
||||
for ZoneName, Zone in pairs( self.Filter.Zones ) do
|
||||
--self:I( "Zone:", ZoneName )
|
||||
--self:T( "Zone:", ZoneName )
|
||||
if MGroup:IsInZone(Zone) then
|
||||
MGroupZone = true
|
||||
end
|
||||
@ -2012,7 +2018,8 @@ end
|
||||
|
||||
do -- SET_UNIT
|
||||
|
||||
--- @type SET_UNIT
|
||||
---
|
||||
-- @type SET_UNIT
|
||||
-- @field Core.Timer#TIMER ZoneTimer
|
||||
-- @field #number ZoneTimerInterval
|
||||
-- @extends Core.Set#SET_BASE
|
||||
@ -2672,7 +2679,7 @@ do -- SET_UNIT
|
||||
self:F2( arg )
|
||||
|
||||
self:ForEach( IteratorFunction, arg, self:GetSet(),
|
||||
--- @param Core.Zone#ZONE_BASE ZoneObject
|
||||
-- @param Core.Zone#ZONE_BASE ZoneObject
|
||||
-- @param Wrapper.Unit#UNIT UnitObject
|
||||
function( ZoneObject, UnitObject )
|
||||
if UnitObject:IsInZone( ZoneObject ) then
|
||||
@ -2694,7 +2701,7 @@ do -- SET_UNIT
|
||||
self:F2( arg )
|
||||
|
||||
self:ForEach( IteratorFunction, arg, self:GetSet(),
|
||||
--- @param Core.Zone#ZONE_BASE ZoneObject
|
||||
-- @param Core.Zone#ZONE_BASE ZoneObject
|
||||
-- @param Wrapper.Unit#UNIT UnitObject
|
||||
function( ZoneObject, UnitObject )
|
||||
if UnitObject:IsNotInZone( ZoneObject ) then
|
||||
@ -3011,8 +3018,8 @@ do -- SET_UNIT
|
||||
|
||||
|
||||
----- Iterate the SET_UNIT and call an iterator function for each **alive** player, providing the Unit of the player and optional parameters.
|
||||
---- @param #SET_UNIT self
|
||||
---- @param #function IteratorFunction The function that will be called when there is an alive player in the SET_UNIT. The function needs to accept a UNIT parameter.
|
||||
-- @param #SET_UNIT self
|
||||
-- @param #function IteratorFunction The function that will be called when there is an alive player in the SET_UNIT. The function needs to accept a UNIT parameter.
|
||||
---- @return #SET_UNIT self
|
||||
-- function SET_UNIT:ForEachPlayer( IteratorFunction, ... )
|
||||
-- self:F2( arg )
|
||||
@ -3024,8 +3031,8 @@ do -- SET_UNIT
|
||||
--
|
||||
--
|
||||
----- Iterate the SET_UNIT and call an iterator function for each client, providing the Client to the function and optional parameters.
|
||||
---- @param #SET_UNIT self
|
||||
---- @param #function IteratorFunction The function that will be called when there is an alive player in the SET_UNIT. The function needs to accept a CLIENT parameter.
|
||||
-- @param #SET_UNIT self
|
||||
-- @param #function IteratorFunction The function that will be called when there is an alive player in the SET_UNIT. The function needs to accept a CLIENT parameter.
|
||||
---- @return #SET_UNIT self
|
||||
-- function SET_UNIT:ForEachClient( IteratorFunction, ... )
|
||||
-- self:F2( arg )
|
||||
@ -3040,7 +3047,7 @@ do -- SET_UNIT
|
||||
-- @param Wrapper.Unit#UNIT MUnit
|
||||
-- @return #SET_UNIT self
|
||||
function SET_UNIT:IsIncludeObject( MUnit )
|
||||
self:F2( MUnit )
|
||||
self:F2( {MUnit} )
|
||||
|
||||
local MUnitInclude = false
|
||||
|
||||
@ -3192,7 +3199,8 @@ end
|
||||
|
||||
do -- SET_STATIC
|
||||
|
||||
--- @type SET_STATIC
|
||||
---
|
||||
-- @type SET_STATIC
|
||||
-- @extends Core.Set#SET_BASE
|
||||
|
||||
--- Mission designers can use the SET_STATIC class to build sets of Statics belonging to certain:
|
||||
@ -3612,7 +3620,7 @@ do -- SET_STATIC
|
||||
self:F2( arg )
|
||||
|
||||
self:ForEach( IteratorFunction, arg, self:GetSet(),
|
||||
--- @param Core.Zone#ZONE_BASE ZoneObject
|
||||
-- @param Core.Zone#ZONE_BASE ZoneObject
|
||||
-- @param Wrapper.Static#STATIC StaticObject
|
||||
function( ZoneObject, StaticObject )
|
||||
if StaticObject:IsInZone( ZoneObject ) then
|
||||
@ -3634,7 +3642,7 @@ do -- SET_STATIC
|
||||
self:F2( arg )
|
||||
|
||||
self:ForEach( IteratorFunction, arg, self:GetSet(),
|
||||
--- @param Core.Zone#ZONE_BASE ZoneObject
|
||||
-- @param Core.Zone#ZONE_BASE ZoneObject
|
||||
-- @param Wrapper.Static#STATIC StaticObject
|
||||
function( ZoneObject, StaticObject )
|
||||
if StaticObject:IsNotInZone( ZoneObject ) then
|
||||
@ -3946,7 +3954,8 @@ end
|
||||
|
||||
do -- SET_CLIENT
|
||||
|
||||
--- @type SET_CLIENT
|
||||
---
|
||||
-- @type SET_CLIENT
|
||||
-- @field Core.Timer#TIMER ZoneTimer
|
||||
-- @field #number ZoneTimerInterval
|
||||
-- @extends Core.Set#SET_BASE
|
||||
@ -4059,7 +4068,7 @@ do -- SET_CLIENT
|
||||
|
||||
--- Remove CLIENT(s) from SET_CLIENT.
|
||||
-- @param Core.Set#SET_CLIENT self
|
||||
-- @param Wrapper.Client#CLIENT RemoveClientNames A single name or an array of CLIENT names.
|
||||
-- @param Wrapper.Client#CLIENT RemoveClientNames A single object or an array of CLIENT objects.
|
||||
-- @return self
|
||||
function SET_CLIENT:RemoveClientsByName( RemoveClientNames )
|
||||
|
||||
@ -4369,7 +4378,7 @@ do -- SET_CLIENT
|
||||
self:F2( arg )
|
||||
|
||||
self:ForEach( IteratorFunction, arg, self:GetSet(),
|
||||
--- @param Core.Zone#ZONE_BASE ZoneObject
|
||||
-- @param Core.Zone#ZONE_BASE ZoneObject
|
||||
-- @param Wrapper.Client#CLIENT ClientObject
|
||||
function( ZoneObject, ClientObject )
|
||||
if ClientObject:IsInZone( ZoneObject ) then
|
||||
@ -4391,7 +4400,7 @@ do -- SET_CLIENT
|
||||
self:F2( arg )
|
||||
|
||||
self:ForEach( IteratorFunction, arg, self:GetSet(),
|
||||
--- @param Core.Zone#ZONE_BASE ZoneObject
|
||||
-- @param Core.Zone#ZONE_BASE ZoneObject
|
||||
-- @param Wrapper.Client#CLIENT ClientObject
|
||||
function( ZoneObject, ClientObject )
|
||||
if ClientObject:IsNotInZone( ZoneObject ) then
|
||||
@ -4459,7 +4468,7 @@ do -- SET_CLIENT
|
||||
if self.Filter.Active == false or (self.Filter.Active == true and MClient:IsActive() == true and MClient:IsAlive() == true) then
|
||||
MClientActive = true
|
||||
end
|
||||
--self:I( { "Evaluated Active", MClientActive } )
|
||||
--self:T( { "Evaluated Active", MClientActive } )
|
||||
MClientInclude = MClientInclude and MClientActive
|
||||
end
|
||||
|
||||
@ -4541,7 +4550,7 @@ do -- SET_CLIENT
|
||||
if self.Filter.Playernames then
|
||||
local MClientPlayername = false
|
||||
local playername = MClient:GetPlayerName() or "Unknown"
|
||||
--self:I(playername)
|
||||
--self:T(playername)
|
||||
for _,_Playername in pairs(self.Filter.Playernames) do
|
||||
if playername and string.find(playername,_Playername) then
|
||||
MClientPlayername = true
|
||||
@ -4554,7 +4563,7 @@ do -- SET_CLIENT
|
||||
if self.Filter.Callsigns then
|
||||
local MClientCallsigns = false
|
||||
local callsign = MClient:GetCallsign()
|
||||
--self:I(callsign)
|
||||
--self:T(callsign)
|
||||
for _,_Callsign in pairs(self.Filter.Callsigns) do
|
||||
if callsign and string.find(callsign,_Callsign) then
|
||||
MClientCallsigns = true
|
||||
@ -4573,7 +4582,8 @@ end
|
||||
|
||||
do -- SET_PLAYER
|
||||
|
||||
--- @type SET_PLAYER
|
||||
---
|
||||
-- @type SET_PLAYER
|
||||
-- @extends Core.Set#SET_BASE
|
||||
|
||||
--- Mission designers can use the @{Core.Set#SET_PLAYER} class to build sets of units belonging to alive players:
|
||||
@ -4868,7 +4878,7 @@ do -- SET_PLAYER
|
||||
self:F2( arg )
|
||||
|
||||
self:ForEach( IteratorFunction, arg, self:GetSet(),
|
||||
--- @param Core.Zone#ZONE_BASE ZoneObject
|
||||
-- @param Core.Zone#ZONE_BASE ZoneObject
|
||||
-- @param Wrapper.Client#CLIENT ClientObject
|
||||
function( ZoneObject, ClientObject )
|
||||
if ClientObject:IsInZone( ZoneObject ) then
|
||||
@ -4890,7 +4900,7 @@ do -- SET_PLAYER
|
||||
self:F2( arg )
|
||||
|
||||
self:ForEach( IteratorFunction, arg, self:GetSet(),
|
||||
--- @param Core.Zone#ZONE_BASE ZoneObject
|
||||
-- @param Core.Zone#ZONE_BASE ZoneObject
|
||||
-- @param Wrapper.Client#CLIENT ClientObject
|
||||
function( ZoneObject, ClientObject )
|
||||
if ClientObject:IsNotInZone( ZoneObject ) then
|
||||
@ -4999,7 +5009,8 @@ end
|
||||
|
||||
do -- SET_AIRBASE
|
||||
|
||||
--- @type SET_AIRBASE
|
||||
---
|
||||
-- @type SET_AIRBASE
|
||||
-- @extends Core.Set#SET_BASE
|
||||
|
||||
--- Mission designers can use the @{Core.Set#SET_AIRBASE} class to build sets of airbases optionally belonging to certain:
|
||||
@ -5342,7 +5353,8 @@ end
|
||||
|
||||
do -- SET_CARGO
|
||||
|
||||
--- @type SET_CARGO
|
||||
---
|
||||
-- @type SET_CARGO
|
||||
-- @extends Core.Set#SET_BASE
|
||||
|
||||
--- Mission designers can use the @{Core.Set#SET_CARGO} class to build sets of cargos optionally belonging to certain:
|
||||
@ -5768,7 +5780,8 @@ end
|
||||
|
||||
do -- SET_ZONE
|
||||
|
||||
--- @type SET_ZONE
|
||||
---
|
||||
-- @type SET_ZONE
|
||||
-- @extends Core.Set#SET_BASE
|
||||
|
||||
--- Mission designers can use the @{Core.Set#SET_ZONE} class to build sets of zones of various types.
|
||||
@ -6136,7 +6149,8 @@ end
|
||||
|
||||
do -- SET_ZONE_GOAL
|
||||
|
||||
--- @type SET_ZONE_GOAL
|
||||
---
|
||||
-- @type SET_ZONE_GOAL
|
||||
-- @extends Core.Set#SET_BASE
|
||||
|
||||
--- Mission designers can use the @{Core.Set#SET_ZONE_GOAL} class to build sets of zones of various types.
|
||||
@ -6447,7 +6461,8 @@ end
|
||||
|
||||
do -- SET_OPSZONE
|
||||
|
||||
--- @type SET_OPSZONE
|
||||
---
|
||||
-- @type SET_OPSZONE
|
||||
-- @extends Core.Set#SET_BASE
|
||||
|
||||
--- Mission designers can use the @{Core.Set#SET_OPSZONE} class to build sets of zones of various types.
|
||||
@ -6904,7 +6919,8 @@ end
|
||||
|
||||
do -- SET_OPSGROUP
|
||||
|
||||
--- @type SET_OPSGROUP
|
||||
---
|
||||
-- @type SET_OPSGROUP
|
||||
-- @extends Core.Set#SET_BASE
|
||||
|
||||
--- Mission designers can use the @{Core.Set#SET_OPSGROUP} class to build sets of OPS groups belonging to certain:
|
||||
@ -7571,6 +7587,7 @@ do -- SET_SCENERY
|
||||
Scenerys = {},
|
||||
Filter = {
|
||||
SceneryPrefixes = nil,
|
||||
SceneryRoles = nil,
|
||||
Zones = nil,
|
||||
},
|
||||
}
|
||||
@ -7617,7 +7634,7 @@ do -- SET_SCENERY
|
||||
|
||||
--- Add SCENERY(s) to SET_SCENERY.
|
||||
-- @param #SET_SCENERY self
|
||||
-- @param #string AddScenery A single SCENERY.
|
||||
-- @param Wrapper.Scenery#SCENERY AddScenery A single SCENERY object.
|
||||
-- @return #SET_SCENERY self
|
||||
function SET_SCENERY:AddScenery( AddScenery )
|
||||
self:F2( AddScenery:GetName() )
|
||||
@ -7687,6 +7704,7 @@ do -- SET_SCENERY
|
||||
end
|
||||
for _,Zone in pairs( zones ) do
|
||||
local zonename = Zone:GetName()
|
||||
self:T(zonename)
|
||||
self.Filter.Zones[zonename] = Zone
|
||||
end
|
||||
return self
|
||||
@ -7705,11 +7723,30 @@ do -- SET_SCENERY
|
||||
Prefixes = { Prefixes }
|
||||
end
|
||||
for PrefixID, Prefix in pairs( Prefixes ) do
|
||||
--self:T(Prefix)
|
||||
self.Filter.SceneryPrefixes[Prefix] = Prefix
|
||||
end
|
||||
return self
|
||||
end
|
||||
|
||||
--- Builds a set of SCENERYs that **contain** an exact match of the "ROLE" property.
|
||||
-- @param #SET_SCENERY self
|
||||
-- @param #string Role The string pattern(s) that needs to exactly match the scenery "ROLE" property from the ME quad-zone properties. Can also be passed as a `#table` of strings.
|
||||
-- @return #SET_SCENERY self
|
||||
function SET_SCENERY:FilterRoles( Role )
|
||||
if not self.Filter.SceneryRoles then
|
||||
self.Filter.SceneryRoles = {}
|
||||
end
|
||||
if type( Role ) ~= "table" then
|
||||
Role = { Role }
|
||||
end
|
||||
for PrefixID, Prefix in pairs( Role ) do
|
||||
--self:T(Prefix)
|
||||
self.Filter.SceneryRoles[Prefix] = Prefix
|
||||
end
|
||||
return self
|
||||
end
|
||||
|
||||
--- Iterate the SET_SCENERY and count how many SCENERYSs are alive.
|
||||
-- @param #SET_SCENERY self
|
||||
-- @return #number The number of SCENERYSs alive.
|
||||
@ -7802,9 +7839,75 @@ do -- SET_SCENERY
|
||||
-- @param Wrapper.Scenery#SCENERY MScenery
|
||||
-- @return #SET_SCENERY self
|
||||
function SET_SCENERY:IsIncludeObject( MScenery )
|
||||
self:F2( MScenery )
|
||||
return true
|
||||
self:T( MScenery.SceneryName )
|
||||
|
||||
local MSceneryInclude = true
|
||||
|
||||
if MScenery then
|
||||
local MSceneryName = MScenery:GetName()
|
||||
|
||||
-- Filter Prefixes
|
||||
if self.Filter.Prefixes then
|
||||
local MSceneryPrefix = false
|
||||
for ZonePrefixId, ZonePrefix in pairs( self.Filter.Prefixes ) do
|
||||
self:T( { "Prefix:", string.find( MSceneryName, ZonePrefix, 1 ), ZonePrefix } )
|
||||
if string.find( MSceneryName, ZonePrefix, 1 ) then
|
||||
MSceneryPrefix = true
|
||||
end
|
||||
end
|
||||
self:T( { "Evaluated Prefix", MSceneryPrefix } )
|
||||
MSceneryInclude = MSceneryInclude and MSceneryPrefix
|
||||
end
|
||||
|
||||
if self.Filter.Zones then
|
||||
local MSceneryZone = false
|
||||
for ZoneName, Zone in pairs( self.Filter.Zones ) do
|
||||
--self:T( "Zone:", ZoneName )
|
||||
local coord = MScenery:GetCoordinate()
|
||||
if coord and Zone:IsCoordinateInZone(coord) then
|
||||
MSceneryZone = true
|
||||
end
|
||||
self:T( { "Evaluated Zone", MSceneryZone } )
|
||||
end
|
||||
MSceneryInclude = MSceneryInclude and MSceneryZone
|
||||
end
|
||||
|
||||
-- Filter Roles
|
||||
if self.Filter.SceneryRoles then
|
||||
local MSceneryRole = false
|
||||
local Role = MScenery:GetProperty("ROLE") or "none"
|
||||
for ZoneRoleId, ZoneRole in pairs( self.Filter.SceneryRoles ) do
|
||||
self:T( { "Role:", ZoneRole, Role } )
|
||||
if ZoneRole == Role then
|
||||
MSceneryRole = true
|
||||
end
|
||||
end
|
||||
self:T( { "Evaluated Role ", MSceneryRole } )
|
||||
MSceneryInclude = MSceneryInclude and MSceneryRole
|
||||
end
|
||||
end
|
||||
|
||||
self:T2( MSceneryInclude )
|
||||
return MSceneryInclude
|
||||
end
|
||||
|
||||
--- Filters for the defined collection.
|
||||
-- @param #SET_SCENERY self
|
||||
-- @return #SET_SCENERY self
|
||||
function SET_SCENERY:FilterOnce()
|
||||
|
||||
for ObjectName, Object in pairs( self:GetSet() ) do
|
||||
self:T(ObjectName)
|
||||
if self:IsIncludeObject( Object ) then
|
||||
self:Add( ObjectName, Object )
|
||||
else
|
||||
self:Remove(ObjectName, true)
|
||||
end
|
||||
end
|
||||
|
||||
return self --FilteredSet
|
||||
end
|
||||
|
||||
|
||||
--- Count overall initial (Life0) lifepoints of the SET objects.
|
||||
-- @param #SET_SCENERY self
|
||||
@ -7843,7 +7946,7 @@ do -- SET_SCENERY
|
||||
function SET_SCENERY:GetRelativeLife()
|
||||
local life = self:GetLife()
|
||||
local life0 = self:GetLife0()
|
||||
self:T3(string.format("Set Lifepoints: %d life0 | %d life",life0,life))
|
||||
self:T2(string.format("Set Lifepoints: %d life0 | %d life",life0,life))
|
||||
local rlife = math.floor((life / life0) * 100)
|
||||
return rlife
|
||||
end
|
||||
|
||||
@ -9,7 +9,7 @@
|
||||
-- ===
|
||||
--
|
||||
-- @module Wrapper.Scenery
|
||||
-- @image Wrapper_Scenery.JPG
|
||||
-- @image Wrapper_Scenery.JPG+
|
||||
|
||||
|
||||
--- SCENERY Class
|
||||
@ -18,6 +18,7 @@
|
||||
-- @field #string SceneryName Name of the scenery object.
|
||||
-- @field DCS#Object SceneryObject DCS scenery object.
|
||||
-- @field #number Life0 Initial life points.
|
||||
-- @field #table Properties
|
||||
-- @extends Wrapper.Positionable#POSITIONABLE
|
||||
|
||||
|
||||
@ -43,7 +44,7 @@ function SCENERY:Register( SceneryName, SceneryObject )
|
||||
|
||||
local self = BASE:Inherit( self, POSITIONABLE:New( SceneryName ) )
|
||||
|
||||
self.SceneryName = SceneryName
|
||||
self.SceneryName = tostring(SceneryName)
|
||||
|
||||
self.SceneryObject = SceneryObject
|
||||
|
||||
@ -52,9 +53,43 @@ function SCENERY:Register( SceneryName, SceneryObject )
|
||||
else
|
||||
self.Life0 = 0
|
||||
end
|
||||
|
||||
self.Properties = {}
|
||||
|
||||
return self
|
||||
end
|
||||
|
||||
--- Returns the Value of the zone with the given PropertyName, or nil if no matching property exists.
|
||||
-- @param #SCENERY self
|
||||
-- @param #string PropertyName The name of a the QuadZone Property from the scenery assignment to be retrieved.
|
||||
-- @return #string The Value of the QuadZone Property from the scenery assignment with the given PropertyName, or nil if absent.
|
||||
function SCENERY:GetProperty(PropertyName)
|
||||
return self.Properties[PropertyName]
|
||||
end
|
||||
|
||||
--- Returns the scenery Properties table.
|
||||
-- @param #SCENERY self
|
||||
-- @return #table The Key:Value table of QuadZone properties of the zone from the scenery assignment .
|
||||
function SCENERY:GetAllProperties()
|
||||
return self.Properties
|
||||
end
|
||||
|
||||
--- Set a scenery property
|
||||
-- @param #SCENERY self
|
||||
-- @param #string PropertyName
|
||||
-- @param #string PropertyValue
|
||||
-- @return #SCENERY self
|
||||
function SCENERY:SetProperty(PropertyName, PropertyValue)
|
||||
self.Properties[PropertyName] = PropertyValue
|
||||
return self
|
||||
end
|
||||
--- Obtain object name.
|
||||
--@param #SCENERY self
|
||||
--@return #string Name
|
||||
function SCENERY:GetName()
|
||||
return self.SceneryName
|
||||
end
|
||||
|
||||
--- Obtain DCS Object from the SCENERY Object.
|
||||
--@param #SCENERY self
|
||||
--@return DCS#Object DCS scenery object.
|
||||
@ -115,26 +150,28 @@ end
|
||||
--@param Core.Point#COORDINATE Coordinate Where to find the scenery object
|
||||
--@param #number Radius (optional) Search radius around coordinate, defaults to 100
|
||||
--@return #SCENERY Scenery Object or `nil` if it cannot be found
|
||||
function SCENERY:FindByName(Name, Coordinate, Radius)
|
||||
function SCENERY:FindByName(Name, Coordinate, Radius, Role)
|
||||
|
||||
local radius = Radius or 100
|
||||
local name = Name or "unknown"
|
||||
local scenery = nil
|
||||
|
||||
BASE:T({name, radius, Coordinate:GetVec2()})
|
||||
|
||||
---
|
||||
-- @param Core.Point#COORDINATE coordinate
|
||||
-- @param #number radius
|
||||
-- @param #string name
|
||||
local function SceneryScan(coordinate, radius, name)
|
||||
if coordinate ~= nil then
|
||||
local scenerylist = coordinate:ScanScenery(radius)
|
||||
local rscenery = nil
|
||||
for _,_scenery in pairs(scenerylist) do
|
||||
local function SceneryScan(scoordinate, sradius, sname)
|
||||
if scoordinate ~= nil then
|
||||
local Vec2 = scoordinate:GetVec2()
|
||||
local scanzone = ZONE_RADIUS:New("Zone-"..sname,Vec2,sradius,true)
|
||||
scanzone:Scan({Object.Category.SCENERY})
|
||||
local scanned = scanzone:GetScannedSceneryObjects()
|
||||
local rscenery = nil -- Wrapper.Scenery#SCENERY
|
||||
for _,_scenery in pairs(scanned) do
|
||||
local scenery = _scenery -- Wrapper.Scenery#SCENERY
|
||||
if tostring(scenery.SceneryName) == tostring(name) then
|
||||
if tostring(scenery.SceneryName) == tostring(sname) then
|
||||
rscenery = scenery
|
||||
if Role then rscenery:SetProperty("ROLE",Role) end
|
||||
break
|
||||
end
|
||||
end
|
||||
@ -144,6 +181,7 @@ function SCENERY:FindByName(Name, Coordinate, Radius)
|
||||
end
|
||||
|
||||
if Coordinate then
|
||||
--BASE:I("Coordinate Scenery Scan")
|
||||
scenery = SceneryScan(Coordinate, radius, name)
|
||||
end
|
||||
|
||||
@ -154,7 +192,7 @@ end
|
||||
-- to find the correct object.
|
||||
--@param #SCENERY self
|
||||
--@param #string Name The name or id of the scenery object as taken from the ME. Ex. '595785449'
|
||||
--@param Core.Zone#ZONE Zone Where to find the scenery object. Can be handed as zone name.
|
||||
--@param Core.Zone#ZONE_BASE Zone Where to find the scenery object. Can be handed as zone name.
|
||||
--@param #number Radius (optional) Search radius around coordinate, defaults to 100
|
||||
--@return #SCENERY Scenery Object or `nil` if it cannot be found
|
||||
function SCENERY:FindByNameInZone(Name, Zone, Radius)
|
||||
@ -164,7 +202,7 @@ function SCENERY:FindByNameInZone(Name, Zone, Radius)
|
||||
Zone = ZONE:FindByName(Zone)
|
||||
end
|
||||
local coordinate = Zone:GetCoordinate()
|
||||
return self:FindByName(Name,coordinate,Radius)
|
||||
return self:FindByName(Name,coordinate,Radius,Zone:GetProperty("ROLE"))
|
||||
end
|
||||
|
||||
--- Find a SCENERY object from its zone name. Since SCENERY isn't registered in the Moose database (just too many objects per map), we need to do a scan first
|
||||
@ -173,38 +211,34 @@ end
|
||||
--@param #string ZoneName The name of the scenery zone as created with a right-click on the map in the mission editor and select "assigned to...". Can be handed over as ZONE object.
|
||||
--@return #SCENERY First found Scenery Object or `nil` if it cannot be found
|
||||
function SCENERY:FindByZoneName( ZoneName )
|
||||
local zone = ZoneName -- Core.Zone#ZONE
|
||||
local zone = ZoneName -- Core.Zone#ZONE_BASE
|
||||
if type(ZoneName) == "string" then
|
||||
zone = ZONE:FindByName(ZoneName)
|
||||
zone = ZONE:FindByName(ZoneName) -- Core.Zone#ZONE_POLYGON
|
||||
end
|
||||
local _id = zone:GetProperty('OBJECT ID')
|
||||
BASE:T("Object ID ".._id)
|
||||
--local properties = zone:GetAllProperties() or {}
|
||||
--BASE:I(string.format("Object ID is: %s",_id or "none"))
|
||||
--BASE:T("Object ID ".._id)
|
||||
if not _id then
|
||||
-- this zone has no object ID
|
||||
BASE:E("**** Zone without object ID: "..ZoneName.." | Type: "..tostring(zone.ClassName))
|
||||
if string.find(zone.ClassName,"POLYGON") then
|
||||
zone:Scan({Object.Category.SCENERY})
|
||||
local scanned = zone:GetScannedScenery()
|
||||
local scanned = zone:GetScannedSceneryObjects()
|
||||
for _,_scenery in (scanned) do
|
||||
local scenery = _scenery -- Wrapper.Scenery#SCENERY
|
||||
if scenery:IsAlive() then
|
||||
local role = zone:GetProperty("ROLE")
|
||||
if role then scenery:SetProperty("ROLE",role) end
|
||||
return scenery
|
||||
end
|
||||
end
|
||||
return nil
|
||||
else
|
||||
local coordinate = zone:GetCoordinate()
|
||||
local scanned = coordinate:ScanScenery()
|
||||
for _,_scenery in (scanned) do
|
||||
local scenery = _scenery -- Wrapper.Scenery#SCENERY
|
||||
if scenery:IsAlive() then
|
||||
return scenery
|
||||
end
|
||||
end
|
||||
return nil
|
||||
return self:FindByName(_id, zone:GetCoordinate(),nil,zone:GetProperty("ROLE"))
|
||||
end
|
||||
else
|
||||
return self:FindByName(_id, zone:GetCoordinate())
|
||||
return self:FindByName(_id, zone:GetCoordinate(),nil,zone:GetProperty("ROLE"))
|
||||
end
|
||||
end
|
||||
|
||||
@ -219,6 +253,7 @@ function SCENERY:FindAllByZoneName( ZoneName )
|
||||
zone = ZONE:FindByName(ZoneName)
|
||||
end
|
||||
local _id = zone:GetProperty('OBJECT ID')
|
||||
--local properties = zone:GetAllProperties() or {}
|
||||
if not _id then
|
||||
-- this zone has no object ID
|
||||
--BASE:E("**** Zone without object ID: "..ZoneName.." | Type: "..tostring(zone.ClassName))
|
||||
@ -230,7 +265,7 @@ function SCENERY:FindAllByZoneName( ZoneName )
|
||||
return nil
|
||||
end
|
||||
else
|
||||
local obj = self:FindByName(_id, zone:GetCoordinate())
|
||||
local obj = self:FindByName(_id, zone:GetCoordinate(),nil,zone:GetProperty("ROLE"))
|
||||
if obj then
|
||||
return {obj}
|
||||
else
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user