Merge remote-tracking branch 'origin/master' into develop

This commit is contained in:
Applevangelist 2023-11-17 15:07:46 +01:00
commit f6fdff927b

View File

@ -2425,6 +2425,26 @@ do -- SET_UNIT
return CountU return CountU
end end
--- Gets the alive set.
-- @param #SET_UNIT self
-- @return #table Table of SET objects
-- @return #SET_UNIT AliveSet
function SET_UNIT:GetAliveSet()
local AliveSet = SET_UNIT:New()
-- Clean the Set before returning with only the alive Groups.
for GroupName, GroupObject in pairs(self.Set) do
local GroupObject=GroupObject --Wrapper.Client#CLIENT
if GroupObject and GroupObject:IsAlive() then
AliveSet:Add(GroupName, GroupObject)
end
end
return AliveSet.Set or {}, AliveSet
end
--- [Internal] Private function for use of continous zone filter --- [Internal] Private function for use of continous zone filter
-- @param #SET_UNIT self -- @param #SET_UNIT self
-- @return #SET_UNIT self -- @return #SET_UNIT self
@ -2819,51 +2839,58 @@ do -- SET_UNIT
-- @param #SET_UNIT self -- @param #SET_UNIT self
-- @return Core.Point#COORDINATE The center coordinate of all the units in the set, including heading in degrees and speed in mps in case of moving units. -- @return Core.Point#COORDINATE The center coordinate of all the units in the set, including heading in degrees and speed in mps in case of moving units.
function SET_UNIT:GetCoordinate() function SET_UNIT:GetCoordinate()
local Coordinate = self:GetRandom():GetCoordinate()
--self:F({Coordinate:GetVec3()})
local Coordinate = nil
local x1 = Coordinate.x local unit = self:GetRandom()
local x2 = Coordinate.x if self:Count() == 1 and unit then
local y1 = Coordinate.y return unit:GetCoordinate()
local y2 = Coordinate.y end
local z1 = Coordinate.z if unit then
local z2 = Coordinate.z local Coordinate = unit:GetCoordinate()
local MaxVelocity = 0 --self:F({Coordinate:GetVec3()})
local AvgHeading = nil
local MovingCount = 0
local x1 = Coordinate.x
for UnitName, UnitData in pairs( self:GetSet() ) do local x2 = Coordinate.x
local y1 = Coordinate.y
local Unit = UnitData -- Wrapper.Unit#UNIT local y2 = Coordinate.y
local Coordinate = Unit:GetCoordinate() local z1 = Coordinate.z
local z2 = Coordinate.z
x1 = (Coordinate.x < x1) and Coordinate.x or x1 local MaxVelocity = 0
x2 = (Coordinate.x > x2) and Coordinate.x or x2 local AvgHeading = nil
y1 = (Coordinate.y < y1) and Coordinate.y or y1 local MovingCount = 0
y2 = (Coordinate.y > y2) and Coordinate.y or y2
z1 = (Coordinate.y < z1) and Coordinate.z or z1 for UnitName, UnitData in pairs( self:GetAliveSet() ) do
z2 = (Coordinate.y > z2) and Coordinate.z or z2
local Unit = UnitData -- Wrapper.Unit#UNIT
local Velocity = Coordinate:GetVelocity() local Coordinate = Unit:GetCoordinate()
if Velocity ~= 0 then
MaxVelocity = (MaxVelocity < Velocity) and Velocity or MaxVelocity x1 = (Coordinate.x < x1) and Coordinate.x or x1
local Heading = Coordinate:GetHeading() x2 = (Coordinate.x > x2) and Coordinate.x or x2
AvgHeading = AvgHeading and (AvgHeading + Heading) or Heading y1 = (Coordinate.y < y1) and Coordinate.y or y1
MovingCount = MovingCount + 1 y2 = (Coordinate.y > y2) and Coordinate.y or y2
end z1 = (Coordinate.y < z1) and Coordinate.z or z1
z2 = (Coordinate.y > z2) and Coordinate.z or z2
local Velocity = Coordinate:GetVelocity()
if Velocity ~= 0 then
MaxVelocity = (MaxVelocity < Velocity) and Velocity or MaxVelocity
local Heading = Coordinate:GetHeading()
AvgHeading = AvgHeading and (AvgHeading + Heading) or Heading
MovingCount = MovingCount + 1
end
end
AvgHeading = AvgHeading and (AvgHeading / MovingCount)
Coordinate.x = (x2 - x1) / 2 + x1
Coordinate.y = (y2 - y1) / 2 + y1
Coordinate.z = (z2 - z1) / 2 + z1
Coordinate:SetHeading( AvgHeading )
Coordinate:SetVelocity( MaxVelocity )
self:F( { Coordinate = Coordinate } )
end end
AvgHeading = AvgHeading and (AvgHeading / MovingCount)
Coordinate.x = (x2 - x1) / 2 + x1
Coordinate.y = (y2 - y1) / 2 + y1
Coordinate.z = (z2 - z1) / 2 + z1
Coordinate:SetHeading( AvgHeading )
Coordinate:SetVelocity( MaxVelocity )
self:F( { Coordinate = Coordinate } )
return Coordinate return Coordinate
end end
@ -4317,6 +4344,8 @@ do -- SET_CLIENT
self:UnHandleEvent(EVENTS.Birth) self:UnHandleEvent(EVENTS.Birth)
self:UnHandleEvent(EVENTS.Dead) self:UnHandleEvent(EVENTS.Dead)
self:UnHandleEvent(EVENTS.Crash) self:UnHandleEvent(EVENTS.Crash)
--self:UnHandleEvent(EVENTS.PlayerEnterUnit)
--self:UnHandleEvent(EVENTS.PlayerLeaveUnit)
if self.Filter.Zones and self.ZoneTimer and self.ZoneTimer:IsRunning() then if self.Filter.Zones and self.ZoneTimer and self.ZoneTimer:IsRunning() then
self.ZoneTimer:Stop() self.ZoneTimer:Stop()
@ -4335,6 +4364,9 @@ do -- SET_CLIENT
self:HandleEvent( EVENTS.Birth, self._EventOnBirth ) self:HandleEvent( EVENTS.Birth, self._EventOnBirth )
self:HandleEvent( EVENTS.Dead, self._EventOnDeadOrCrash ) self:HandleEvent( EVENTS.Dead, self._EventOnDeadOrCrash )
self:HandleEvent( EVENTS.Crash, self._EventOnDeadOrCrash ) self:HandleEvent( EVENTS.Crash, self._EventOnDeadOrCrash )
--self:HandleEvent( EVENTS.PlayerEnterUnit, self._EventPlayerEnterUnit)
--self:HandleEvent( EVENTS.PlayerLeaveUnit, self._EventPlayerLeaveUnit)
--self:SetEventPriority(1)
if self.Filter.Zones then if self.Filter.Zones then
self.ZoneTimer = TIMER:New(self._ContinousZoneFilter,self) self.ZoneTimer = TIMER:New(self._ContinousZoneFilter,self)
local timing = self.ZoneTimerInterval or 30 local timing = self.ZoneTimerInterval or 30
@ -4345,6 +4377,43 @@ do -- SET_CLIENT
return self return self
end end
--- Handle CA slots addition
-- @param #SET_CLIENT self
-- @param Core.Event#EVENTDATA Event
-- @return #SET_CLIENT self
function SET_CLIENT:_EventPlayerEnterUnit(Event)
self:I( "_EventPlayerEnterUnit" )
if Event.IniDCSUnit then
if Event.IniObjectCategory == 1 and Event.IniGroup and Event.IniGroup:IsGround() then
-- CA Slot entered
local ObjectName, Object = self:AddInDatabase( Event )
self:I( ObjectName, UTILS.PrintTableToLog(Object) )
if Object and self:IsIncludeObject( Object ) then
self:Add( ObjectName, Object )
end
end
end
return self
end
--- Handle CA slots removal
-- @param #SET_CLIENT self
-- @param Core.Event#EVENTDATA Event
-- @return #SET_CLIENT self
function SET_CLIENT:_EventPlayerLeaveUnit(Event)
self:I( "_EventPlayerLeaveUnit" )
if Event.IniDCSUnit then
if Event.IniObjectCategory == 1 and Event.IniGroup and Event.IniGroup:IsGround() then
-- CA Slot left
local ObjectName, Object = self:FindInDatabase( Event )
if ObjectName then
self:Remove( ObjectName )
end
end
end
return self
end
--- Handles the Database to check on an event (birth) that the Object was added in the Database. --- Handles the Database to check on an event (birth) that the Object was added in the Database.
-- This is required, because sometimes the _DATABASE birth event gets called later than the SET_BASE birth event! -- This is required, because sometimes the _DATABASE birth event gets called later than the SET_BASE birth event!