diff --git a/Moose Development/Moose/Core/ClientMenu.lua b/Moose Development/Moose/Core/ClientMenu.lua index d5ace7d9e..85bbeb2d4 100644 --- a/Moose Development/Moose/Core/ClientMenu.lua +++ b/Moose Development/Moose/Core/ClientMenu.lua @@ -20,7 +20,7 @@ -- -- @module Core.ClientMenu -- @image Core_Menu.JPG --- last change: Sept 2023 +-- last change: Oct 2023 -- TODO ---------------------------------------------------------------------------------------------------------------- @@ -304,6 +304,8 @@ end -- @field #table menutree -- @field #number entrycount -- @field #boolean debug +-- @field #table PlayerMenu +-- @field #number Coalition -- @extends Core.Base#BASE --- *As a child my family's menu consisted of two choices: take it, or leave it.* @@ -390,7 +392,7 @@ end CLIENTMENUMANAGER = { ClassName = "CLIENTMENUMANAGER", lid = "", - version = "0.1.1", + version = "0.1.3", name = nil, clientset = nil, menutree = {}, @@ -399,26 +401,108 @@ CLIENTMENUMANAGER = { entrycount = 0, rootentries = {}, debug = true, + PlayerMenu = {}, + Coalition = nil, } --- Create a new ClientManager instance. -- @param #CLIENTMENUMANAGER self -- @param Core.Set#SET_CLIENT ClientSet The set of clients to manage. -- @param #string Alias The name of this manager. +-- @param #number Coalition (Optional) Coalition of this Manager, defaults to coalition.side.BLUE -- @return #CLIENTMENUMANAGER self -function CLIENTMENUMANAGER:New(ClientSet, Alias) +function CLIENTMENUMANAGER:New(ClientSet, Alias, Coalition) -- Inherit everything from FSM class. local self=BASE:Inherit(self, BASE:New()) -- #CLIENTMENUMANAGER self.clientset = ClientSet + self.PlayerMenu = {} self.name = Alias or "Nightshift" + self.Coalition = Coalition or coalition.side.BLUE -- Log id. self.lid=string.format("CLIENTMENUMANAGER %s | %s | ", self.version, self.name) if self.debug then - self:T(self.lid.."Created") + self:I(self.lid.."Created") end return self end +--- [Internal] Event handling +-- @param #CLIENTMENUMANAGER self +-- @param Core.Event#EVENTDATA EventData +-- @return #CLIENTMENUMANAGER self +function CLIENTMENUMANAGER:_EventHandler(EventData) + self:T(self.lid.."_EventHandler: "..EventData.id) + --self:I(self.lid.."_EventHandler: "..tostring(EventData.IniPlayerName)) + if EventData.id == EVENTS.PlayerLeaveUnit or EventData.id == EVENTS.Ejection or EventData.id == EVENTS.Crash or EventData.id == EVENTS.PilotDead then + self:T(self.lid.."Leave event for player: "..tostring(EventData.IniPlayerName)) + local Client = _DATABASE:FindClient( EventData.IniPlayerName ) + if Client then + self:ResetMenu(Client) + end + elseif (EventData.id == EVENTS.PlayerEnterAircraft) and EventData.IniCoalition == self.Coalition then + if EventData.IniPlayerName and EventData.IniGroup then + if (not self.clientset:IsIncludeObject(_DATABASE:FindClient( EventData.IniPlayerName ))) then + self:T(self.lid.."Client not in SET: "..EventData.IniPlayerName) + return self + end + --self:I(self.lid.."Join event for player: "..EventData.IniPlayerName) + local player = _DATABASE:FindClient( EventData.IniPlayerName ) + self:Propagate(player) + end + elseif EventData.id == EVENTS.PlayerEnterUnit then + -- special for CA slots + local grp = GROUP:FindByName(EventData.IniGroupName) + if grp:IsGround() then + self:T(string.format("Player %s entered GROUND unit %s!",EventData.IniPlayerName,EventData.IniUnitName)) + local IsPlayer = EventData.IniDCSUnit:getPlayerName() + if IsPlayer then + + local client=_DATABASE.CLIENTS[EventData.IniDCSUnitName] --Wrapper.Client#CLIENT + + -- Add client in case it does not exist already. + if not client then + + -- Debug info. + self:I(string.format("Player '%s' joined ground unit '%s' of group '%s'", tostring(EventData.IniPlayerName), tostring(EventData.IniDCSUnitName), tostring(EventData.IniDCSGroupName))) + + client=_DATABASE:AddClient(EventData.IniDCSUnitName) + + -- Add player. + client:AddPlayer(EventData.IniPlayerName) + + -- Add player. + if not _DATABASE.PLAYERS[EventData.IniPlayerName] then + _DATABASE:AddPlayer( EventData.IniUnitName, EventData.IniPlayerName ) + end + + -- Player settings. + local Settings = SETTINGS:Set( EventData.IniPlayerName ) + Settings:SetPlayerMenu(EventData.IniUnit) + end + --local player = _DATABASE:FindClient( EventData.IniPlayerName ) + self:Propagate(client) + end + end + end + + return self +end + +--- Set this Client Manager to auto-propagate menus to newly joined players. Useful if you have **one** menu structure only. +-- @param #CLIENTMENUMANAGER self +-- @return #CLIENTMENUMANAGER self +function CLIENTMENUMANAGER:InitAutoPropagation() + -- Player Events + self:HandleEvent(EVENTS.PlayerLeaveUnit, self._EventHandler) + self:HandleEvent(EVENTS.Ejection, self._EventHandler) + self:HandleEvent(EVENTS.Crash, self._EventHandler) + self:HandleEvent(EVENTS.PilotDead, self._EventHandler) + self:HandleEvent(EVENTS.PlayerEnterAircraft, self._EventHandler) + self:HandleEvent(EVENTS.PlayerEnterUnit, self._EventHandler) + self:SetEventPriority(5) + return self +end + --- Create a new entry in the generic structure. -- @param #CLIENTMENUMANAGER self -- @param #string Text Text of the F10 menu entry. @@ -571,7 +655,7 @@ end -- @return #CLIENTMENU Entry function CLIENTMENUMANAGER:Propagate(Client) self:T(self.lid.."Propagate") - self:T(Client) + --self:I(UTILS.PrintTableToLog(Client,1)) local Set = self.clientset.Set if Client then Set = {Client} @@ -792,4 +876,3 @@ end -- End ClientMenu -- ---------------------------------------------------------------------------------------------------------------- - diff --git a/Moose Development/Moose/Ops/PlayerTask.lua b/Moose Development/Moose/Ops/PlayerTask.lua index c840f5538..a4d019531 100644 --- a/Moose Development/Moose/Ops/PlayerTask.lua +++ b/Moose Development/Moose/Ops/PlayerTask.lua @@ -1552,7 +1552,7 @@ PLAYERTASKCONTROLLER.Messages = { --- PLAYERTASK class version. -- @field #string version -PLAYERTASKCONTROLLER.version="0.1.62" +PLAYERTASKCONTROLLER.version="0.1.63" --- Create and run a new TASKCONTROLLER instance. -- @param #PLAYERTASKCONTROLLER self @@ -1585,7 +1585,7 @@ function PLAYERTASKCONTROLLER:New(Name, Coalition, Type, ClientFilter) self.TaskQueue = FIFO:New() -- Utilities.FiFo#FIFO self.TasksPerPlayer = FIFO:New() -- Utilities.FiFo#FIFO self.PrecisionTasks = FIFO:New() -- Utilities.FiFo#FIFO - self.PlayerMenu = {} -- #table + --self.PlayerMenu = {} -- #table self.FlashPlayer = {} -- #table self.AllowFlash = false self.lasttaskcount = 0 @@ -2175,10 +2175,10 @@ function PLAYERTASKCONTROLLER:_EventHandler(EventData) if EventData.id == EVENTS.PlayerLeaveUnit or EventData.id == EVENTS.Ejection or EventData.id == EVENTS.Crash or EventData.id == EVENTS.PilotDead then if EventData.IniPlayerName then self:T(self.lid.."Event for player: "..EventData.IniPlayerName) - if self.PlayerMenu[EventData.IniPlayerName] then - self.PlayerMenu[EventData.IniPlayerName]:Remove() - self.PlayerMenu[EventData.IniPlayerName] = nil - end + --if self.PlayerMenu[EventData.IniPlayerName] then + --self.PlayerMenu[EventData.IniPlayerName]:Remove() + --self.PlayerMenu[EventData.IniPlayerName] = nil + --end local text = "" if self.TasksPerPlayer:HasUniqueID(EventData.IniPlayerName) then local task = self.TasksPerPlayer:PullByID(EventData.IniPlayerName) -- Ops.PlayerTask#PLAYERTASK @@ -2187,6 +2187,8 @@ function PLAYERTASKCONTROLLER:_EventHandler(EventData) task:RemoveClient(Client) --text = "Task aborted!" text = self.gettext:GetEntry("TASKABORT",self.locale) + self.ActiveTaskMenuTemplate:ResetMenu(Client) + self.JoinTaskMenuTemplate:ResetMenu(Client) else task:RemoveClient(nil,EventData.IniPlayerName) --text = "Task aborted!" @@ -2236,8 +2238,8 @@ function PLAYERTASKCONTROLLER:_EventHandler(EventData) self.SRSQueue:NewTransmission(text,nil,self.SRS,timer.getAbsTime()+60,2,{EventData.IniGroup},text,30,self.BCFrequency,self.BCModulation) end if EventData.IniPlayerName then - self.PlayerMenu[EventData.IniPlayerName] = nil - local player = CLIENT:FindByName(EventData.IniUnitName) + --self.PlayerMenu[EventData.IniPlayerName] = nil + local player = _DATABASE:FindClient( EventData.IniPlayerName ) self:_SwitchMenuForClient(player,"Info") end end