diff --git a/Moose Development/Moose/Core/Database.lua b/Moose Development/Moose/Core/Database.lua index eebce2873..c9f7ed174 100644 --- a/Moose Development/Moose/Core/Database.lua +++ b/Moose Development/Moose/Core/Database.lua @@ -51,6 +51,7 @@ DATABASE = { ClientsByID = {}, }, UNITS = {}, + UNITS_Index = {}, STATICS = {}, GROUPS = {}, PLAYERS = {}, @@ -99,7 +100,7 @@ function DATABASE:New() self:HandleEvent( EVENTS.DeleteCargo ) -- Follow alive players and clients - self:HandleEvent( EVENTS.PlayerEnterUnit, self._EventOnPlayerEnterUnit ) +-- self:HandleEvent( EVENTS.PlayerEnterUnit, self._EventOnPlayerEnterUnit ) self:HandleEvent( EVENTS.PlayerLeaveUnit, self._EventOnPlayerLeaveUnit ) self:_RegisterTemplates() @@ -108,6 +109,33 @@ function DATABASE:New() self:_RegisterStatics() self:_RegisterPlayers() self:_RegisterAirbases() + + self.UNITS_Position = 0 + + --- @param #DATABASE self + local function CheckPlayers( self ) + + local UNITS_Count = #self.UNITS_Index + if UNITS_Count > 0 then + self.UNITS_Position = ( ( self.UNITS_Position <= UNITS_Count ) and self.UNITS_Position + 1 ) or 1 + local PlayerUnit = self.UNITS[self.UNITS_Index[self.UNITS_Position]] + if PlayerUnit then + local UnitName = PlayerUnit:GetName() + local PlayerName = PlayerUnit:GetPlayerName() + --self:E( { UNITS_Count, self.UNITS_Position, UnitName, PlayerName } ) + if PlayerName and PlayerName ~= "" then + if self.PLAYERS[PlayerName] == nil or self.PLAYERS[PlayerName] ~= UnitName then + self:E( { "Add player for unit:", UnitName, PlayerName } ) + self:AddPlayer( UnitName, PlayerName ) + --_EVENTDISPATCHER:CreateEventPlayerEnterUnit( PlayerUnit ) + end + end + end + end + end + + self:E( "Scheduling" ) + --local PlayerCheckSchedule = SCHEDULER:New( nil, CheckPlayers, { self }, 2, 0.1 ) return self end @@ -130,6 +158,8 @@ function DATABASE:AddUnit( DCSUnitName ) if not self.UNITS[DCSUnitName] then local UnitRegister = UNIT:Register( DCSUnitName ) self.UNITS[DCSUnitName] = UNIT:Register( DCSUnitName ) + + table.insert( self.UNITS_Index, DCSUnitName ) end return self.UNITS[DCSUnitName] @@ -140,7 +170,7 @@ end -- @param #DATABASE self function DATABASE:DeleteUnit( DCSUnitName ) - --self.UNITS[DCSUnitName] = nil + self.UNITS[DCSUnitName] = nil end --- Adds a Static based on the Static Name in the DATABASE. @@ -281,7 +311,7 @@ function DATABASE:AddPlayer( UnitName, PlayerName ) if PlayerName then self:E( { "Add player for unit:", UnitName, PlayerName } ) - self.PLAYERS[PlayerName] = self:FindUnit( UnitName ) + self.PLAYERS[PlayerName] = UnitName self.PLAYERSJOINED[PlayerName] = PlayerName end end diff --git a/Moose Development/Moose/Core/Event.lua b/Moose Development/Moose/Core/Event.lua index 8bbaeade6..f37e590df 100644 --- a/Moose Development/Moose/Core/Event.lua +++ b/Moose Development/Moose/Core/Event.lua @@ -730,6 +730,21 @@ do -- Event Creation world.onEvent( Event ) end + --- Creation of a S_EVENT_PLAYER_ENTER_UNIT Event. + -- @param #EVENT self + -- @param Wrapper.Unit#UNIT PlayerUnit. + function EVENT:CreateEventPlayerEnterUnit( PlayerUnit ) + self:F( { PlayerUnit } ) + + local Event = { + id = EVENTS.PlayerEnterUnit, + time = timer.getTime(), + initiator = PlayerUnit:GetDCSObject() + } + + world.onEvent( Event ) + end + end --- @param #EVENT self @@ -748,7 +763,7 @@ function EVENT:onEvent( Event ) local EventMeta = _EVENTMETA[Event.id] - + if self and self.Events and self.Events[Event.id] then if Event.initiator then @@ -863,7 +878,7 @@ function EVENT:onEvent( Event ) local PriorityBegin = PriorityOrder == -1 and 5 or 1 local PriorityEnd = PriorityOrder == -1 and 1 or 5 - if Event.IniObjectCategory ~= 3 then + if Event.IniObjectCategory ~= Object.Category.STATIC then self:E( { EventMeta.Text, Event, Event.IniDCSUnitName, Event.TgtDCSUnitName, PriorityOrder } ) end @@ -874,8 +889,10 @@ function EVENT:onEvent( Event ) -- Okay, we got the event from DCS. Now loop the SORTED self.EventSorted[] table for the received Event.id, and for each EventData registered, check if a function needs to be called. for EventClass, EventData in pairs( self.Events[Event.id][EventPriority] ) do - self:E( { "Evaluating: ", EventClass:GetClassNameAndID() } ) - + if Event.IniObjectCategory ~= Object.Category.STATIC then + self:E( { "Evaluating: ", EventClass:GetClassNameAndID() } ) + end + Event.IniGroup = GROUP:FindByName( Event.IniDCSGroupName ) Event.TgtGroup = GROUP:FindByName( Event.TgtDCSGroupName ) diff --git a/Moose Development/Moose/Core/Fsm.lua b/Moose Development/Moose/Core/Fsm.lua index 8af98362f..d2333ffdc 100644 --- a/Moose Development/Moose/Core/Fsm.lua +++ b/Moose Development/Moose/Core/Fsm.lua @@ -1014,6 +1014,8 @@ do -- FSM_PROCESS Process.fsm:Remove() Process.fsm = nil end + + self._Processes = nil return self end diff --git a/Moose Development/Moose/Core/Menu.lua b/Moose Development/Moose/Core/Menu.lua index 7a6049091..c38f763d4 100644 --- a/Moose Development/Moose/Core/Menu.lua +++ b/Moose Development/Moose/Core/Menu.lua @@ -91,7 +91,7 @@ do -- MENU_BASE -- @param #boolean RemoveParent If true, the parent menu is automatically removed when this menu is the last child menu of that parent @{Menu}. -- @return #MENU_BASE function MENU_BASE:SetRemoveParent( RemoveParent ) - self:F( { RemoveParent } ) + self:F2( { RemoveParent } ) self.MenuRemoveParent = RemoveParent return self end @@ -780,9 +780,9 @@ do self = MenuGroup._Menus[Path] else self = BASE:Inherit( self, MENU_BASE:New( MenuText, ParentMenu ) ) - if MenuGroup:IsAlive() then + --if MenuGroup:IsAlive() then MenuGroup._Menus[Path] = self - end + --end self.MenuGroup = MenuGroup self.Path = Path @@ -839,7 +839,7 @@ do self.ParentMenu.MenuCount = self.ParentMenu.MenuCount - 1 if self.ParentMenu.MenuCount == 0 then if self.MenuRemoveParent == true then - self:T( "Removing Parent Menu " ) + self:T2( "Removing Parent Menu " ) self.ParentMenu:Remove() end end @@ -886,9 +886,9 @@ do else self = BASE:Inherit( self, MENU_COMMAND_BASE:New( MenuText, ParentMenu, CommandMenuFunction, arg ) ) - if MenuGroup:IsAlive() then + --if MenuGroup:IsAlive() then MenuGroup._Menus[Path] = self - end + --end self.Path = Path self.MenuGroup = MenuGroup @@ -902,7 +902,7 @@ do if self.ParentMenu and self.ParentMenu.Menus then self.ParentMenu.Menus[MenuText] = self self.ParentMenu.MenuCount = self.ParentMenu.MenuCount + 1 - self:F( { ParentMenu.Menus, MenuText } ) + self:F2( { ParentMenu.Menus, MenuText } ) end end @@ -927,7 +927,7 @@ do self.ParentMenu.MenuCount = self.ParentMenu.MenuCount - 1 if self.ParentMenu.MenuCount == 0 then if self.MenuRemoveParent == true then - self:T( "Removing Parent Menu " ) + self:T2( "Removing Parent Menu " ) self.ParentMenu:Remove() end end diff --git a/Moose Development/Moose/Core/Zone.lua b/Moose Development/Moose/Core/Zone.lua index 998bd07fa..5f41cf733 100644 --- a/Moose Development/Moose/Core/Zone.lua +++ b/Moose Development/Moose/Core/Zone.lua @@ -731,7 +731,7 @@ end -- @param #ZONE_UNIT self -- @return Dcs.DCSTypes#Vec2 The location of the zone based on the @{Unit#UNIT}location. function ZONE_UNIT:GetVec2() - self:F( self.ZoneName ) + self:F2( self.ZoneName ) local ZoneVec2 = self.ZoneUNIT:GetVec2() if ZoneVec2 then @@ -741,7 +741,7 @@ function ZONE_UNIT:GetVec2() return self.LastVec2 end - self:T( { ZoneVec2 } ) + self:T2( { ZoneVec2 } ) return nil end diff --git a/Moose Development/Moose/Functional/Detection.lua b/Moose Development/Moose/Functional/Detection.lua index d302fe481..f6eb2dc97 100644 --- a/Moose Development/Moose/Functional/Detection.lua +++ b/Moose Development/Moose/Functional/Detection.lua @@ -567,7 +567,7 @@ do -- DETECTION_BASE self.DetectDLINK ) - self:T( { TargetIsDetected = TargetIsDetected, TargetIsVisible = TargetIsVisible, TargetLastTime = TargetLastTime, TargetKnowType = TargetKnowType, TargetKnowDistance = TargetKnowDistance, TargetLastPos = TargetLastPos, TargetLastVelocity = TargetLastVelocity } ) + self:T2( { TargetIsDetected = TargetIsDetected, TargetIsVisible = TargetIsVisible, TargetLastTime = TargetLastTime, TargetKnowType = TargetKnowType, TargetKnowDistance = TargetKnowDistance, TargetLastPos = TargetLastPos, TargetLastVelocity = TargetLastVelocity } ) local DetectionAccepted = true @@ -585,7 +585,7 @@ do -- DETECTION_BASE local DetectedUnitCategory = DetectedObject:getDesc().category - self:T( { "Detected Target:", DetectionGroupName, DetectedObjectName, Distance, DetectedUnitCategory } ) + self:T2( { "Detected Target:", DetectionGroupName, DetectedObjectName, Distance, DetectedUnitCategory } ) -- Calculate Acceptance @@ -1154,7 +1154,7 @@ do -- DETECTION_BASE -- @param #string ObjectName -- @return #DETECTION_BASE.DetectedObject function DETECTION_BASE:GetDetectedObject( ObjectName ) - self:F( ObjectName ) + self:F2( ObjectName ) if ObjectName then local DetectedObject = self.DetectedObjects[ObjectName] diff --git a/Moose Development/Moose/Tasking/DetectionManager.lua b/Moose Development/Moose/Tasking/DetectionManager.lua index 7601701a0..7283d50d9 100644 --- a/Moose Development/Moose/Tasking/DetectionManager.lua +++ b/Moose Development/Moose/Tasking/DetectionManager.lua @@ -76,6 +76,7 @@ do -- DETECTION MANAGER self:SetReportInterval( 30 ) self:SetReportDisplayTime( 25 ) + self:E( { Detection = Detection } ) Detection:__Start( 1 ) return self diff --git a/Moose Development/Moose/Tasking/Mission.lua b/Moose Development/Moose/Tasking/Mission.lua index dfc45aaab..00451544a 100644 --- a/Moose Development/Moose/Tasking/Mission.lua +++ b/Moose Development/Moose/Tasking/Mission.lua @@ -549,7 +549,7 @@ function MISSION:GetTasksRemaining() local TasksRemaining = 0 for TaskID, Task in pairs( self:GetTasks() ) do local Task = Task -- Tasking.Task#TASK - if Task:IsStateSuccess() or Task:IsStateFAILED() then + if Task:IsStateSuccess() or Task:IsStateFailed() then else TasksRemaining = TasksRemaining + 1 end diff --git a/Moose Development/Moose/Tasking/Task.lua b/Moose Development/Moose/Tasking/Task.lua index 70d97867d..78fea4073 100644 --- a/Moose Development/Moose/Tasking/Task.lua +++ b/Moose Development/Moose/Tasking/Task.lua @@ -724,7 +724,12 @@ end -- @param #TASK self function TASK:MenuTaskAbort( TaskGroup ) - self:Abort() + for PlayerUnitName, PlayerUnit in pairs( TaskGroup:GetUnits() ) do + self:AbortUnit( PlayerUnit ) + end + + self:GetMission():GetCommandCenter():GetPositionable():MessageToSetGroup( "Abort", 15, self.SetGroup ) + end diff --git a/Moose Development/Moose/Wrapper/Unit.lua b/Moose Development/Moose/Wrapper/Unit.lua index 0107839b5..c99c2a7a4 100644 --- a/Moose Development/Moose/Wrapper/Unit.lua +++ b/Moose Development/Moose/Wrapper/Unit.lua @@ -724,7 +724,7 @@ function UNIT:IsInZone( Zone ) if self:IsAlive() then local IsInZone = Zone:IsVec3InZone( self:GetVec3() ) - self:T( { IsInZone } ) + self:T2( { IsInZone } ) return IsInZone end