#PLAYERTASKCONTROLLER

* Clean up menu builds
This commit is contained in:
Applevangelist
2022-09-13 17:19:29 +02:00
parent b6fb7d94c8
commit 83a7055065

View File

@@ -80,7 +80,7 @@ PLAYERTASK = {
--- PLAYERTASK class version. --- PLAYERTASK class version.
-- @field #string version -- @field #string version
PLAYERTASK.version="0.1.1" PLAYERTASK.version="0.1.2"
--- Generic task condition. --- Generic task condition.
-- @type PLAYERTASK.Condition -- @type PLAYERTASK.Condition
@@ -110,7 +110,7 @@ function PLAYERTASK:New(Type, Target, Repeat, Times, TTSType)
self.conditionSuccess = {} self.conditionSuccess = {}
self.conditionFailure = {} self.conditionFailure = {}
self.TaskController = nil -- Ops.PlayerTask#PLAYERTASKCONTROLLER self.TaskController = nil -- Ops.PlayerTask#PLAYERTASKCONTROLLER
self.timestamp = timer.getTime() self.timestamp = timer.getAbsTime()
self.TTSType = TTSType or "close air support" self.TTSType = TTSType or "close air support"
if Repeat then if Repeat then
@@ -262,7 +262,7 @@ function PLAYERTASK:IsDone()
return IsDone return IsDone
end end
--- [User] Get clients assigned list as table --- [User] Get client names assigned as table of #strings
-- @param #PLAYERTASK self -- @param #PLAYERTASK self
-- @return #table clients -- @return #table clients
-- @return #number clientcount -- @return #number clientcount
@@ -273,6 +273,17 @@ function PLAYERTASK:GetClients()
return clientlist, count return clientlist, count
end end
--- [User] Get #CLIENT objects assigned as table
-- @param #PLAYERTASK self
-- @return #table clients
-- @return #number clientcount
function PLAYERTASK:GetClientObjects()
self:T(self.lid.."GetClientObjects")
local clientlist = self.Clients:GetDataTable() or {}
local count = self.Clients:Count()
return clientlist, count
end
--- [User] Count clients --- [User] Count clients
-- @param #PLAYERTASK self -- @param #PLAYERTASK self
-- @return #number clientcount -- @return #number clientcount
@@ -548,6 +559,7 @@ end
-- @return #PLAYERTASK self -- @return #PLAYERTASK self
function PLAYERTASK:onafterPlanned(From, Event, To) function PLAYERTASK:onafterPlanned(From, Event, To)
self:T({From, Event, To}) self:T({From, Event, To})
self.timestamp = timer.getAbsTime()
return self return self
end end
@@ -559,6 +571,7 @@ end
-- @return #PLAYERTASK self -- @return #PLAYERTASK self
function PLAYERTASK:onafterRequested(From, Event, To) function PLAYERTASK:onafterRequested(From, Event, To)
self:T({From, Event, To}) self:T({From, Event, To})
self.timestamp = timer.getAbsTime()
return self return self
end end
@@ -570,6 +583,7 @@ end
-- @return #PLAYERTASK self -- @return #PLAYERTASK self
function PLAYERTASK:onafterExecuting(From, Event, To) function PLAYERTASK:onafterExecuting(From, Event, To)
self:T({From, Event, To}) self:T({From, Event, To})
self.timestamp = timer.getAbsTime()
return self return self
end end
@@ -581,6 +595,7 @@ end
-- @return #PLAYERTASK self -- @return #PLAYERTASK self
function PLAYERTASK:onafterStop(From, Event, To) function PLAYERTASK:onafterStop(From, Event, To)
self:T({From, Event, To}) self:T({From, Event, To})
self.timestamp = timer.getAbsTime()
return self return self
end end
@@ -597,6 +612,7 @@ function PLAYERTASK:onafterClientAdded(From, Event, To, Client)
local text = string.format("Player %s joined task %03d!",Client:GetPlayerName() or "Generic",self.PlayerTaskNr) local text = string.format("Player %s joined task %03d!",Client:GetPlayerName() or "Generic",self.PlayerTaskNr)
self:I(self.lid..text) self:I(self.lid..text)
end end
self.timestamp = timer.getAbsTime()
return self return self
end end
@@ -611,6 +627,7 @@ function PLAYERTASK:onafterDone(From, Event, To)
if self.TaskController then if self.TaskController then
self.TaskController:__TaskDone(-1,self) self.TaskController:__TaskDone(-1,self)
end end
self.timestamp = timer.getAbsTime()
self:__Stop(-1) self:__Stop(-1)
return self return self
end end
@@ -626,6 +643,7 @@ function PLAYERTASK:onafterCancel(From, Event, To)
if self.TaskController then if self.TaskController then
self.TaskController:__TaskCancelled(-1,self) self.TaskController:__TaskCancelled(-1,self)
end end
self.timestamp = timer.getAbsTime()
self:__Done(-1) self:__Done(-1)
return self return self
end end
@@ -644,6 +662,7 @@ function PLAYERTASK:onafterSuccess(From, Event, To)
if self.TargetMarker then if self.TargetMarker then
self.TargetMarker:Remove() self.TargetMarker:Remove()
end end
self.timestamp = timer.getAbsTime()
self:__Done(-1) self:__Done(-1)
return self return self
end end
@@ -673,6 +692,7 @@ function PLAYERTASK:onafterFailed(From, Event, To)
end end
self:__Done(-1) self:__Done(-1)
end end
self.timestamp = timer.getAbsTime()
return self return self
end end
------------------------------------------------------------------------------------------------------------------- -------------------------------------------------------------------------------------------------------------------
@@ -1193,7 +1213,7 @@ PLAYERTASKCONTROLLER.Messages = {
--- PLAYERTASK class version. --- PLAYERTASK class version.
-- @field #string version -- @field #string version
PLAYERTASKCONTROLLER.version="0.1.34" PLAYERTASKCONTROLLER.version="0.1.35"
--- Constructor --- Constructor
-- @param #PLAYERTASKCONTROLLER self -- @param #PLAYERTASKCONTROLLER self
@@ -1740,8 +1760,10 @@ function PLAYERTASKCONTROLLER:_GetTasksPerType()
for _,_task in pairs(datatable) do for _,_task in pairs(datatable) do
local task = _task -- Ops.PlayerTask#PLAYERTASK local task = _task -- Ops.PlayerTask#PLAYERTASK
local threat = task.Target:GetThreatLevelMax() local threat = task.Target:GetThreatLevelMax()
if not task:IsDone() then
threattable[#threattable+1]={task=task,threat=threat} threattable[#threattable+1]={task=task,threat=threat}
end end
end
table.sort(threattable, function (k1, k2) return k1.threat > k2.threat end ) table.sort(threattable, function (k1, k2) return k1.threat > k2.threat end )
@@ -1789,11 +1811,14 @@ function PLAYERTASKCONTROLLER:_CheckTaskQueue()
self:T("*****Removing player " .. _id) self:T("*****Removing player " .. _id)
self.TasksPerPlayer:PullByID(_id) self.TasksPerPlayer:PullByID(_id)
end end
local TNow = timer.getAbsTime()
if TNow - task.timestamp > 10 then
local task = self.TaskQueue:PullByID(_id) -- Ops.PlayerTask#PLAYERTASK local task = self.TaskQueue:PullByID(_id) -- Ops.PlayerTask#PLAYERTASK
task = nil task = nil
end end
end end
end end
end
return self return self
end end
@@ -2540,19 +2565,13 @@ end
-- @param Core.Menu#MENU_BASE topmenu -- @param Core.Menu#MENU_BASE topmenu
-- @param #table tasktypes -- @param #table tasktypes
-- @param #table taskpertype -- @param #table taskpertype
-- @return #PLAYERTASKCONTROLLER self -- @return #table taskinfomenu
function PLAYERTASKCONTROLLER:_BuildTaskInfoMenu(group,client,playername,topmenu,tasktypes,taskpertype) function PLAYERTASKCONTROLLER:_BuildTaskInfoMenu(group,client,playername,topmenu,tasktypes,taskpertype)
if self.taskinfomenu then self:T(self.lid.."_BuildTaskInfoMenu")
local taskinfomenu = nil local taskinfomenu = nil
if self.PlayerInfoMenu[playername] then if self.taskinfomenu then
taskinfomenu = self.PlayerInfoMenu[playername]
taskinfomenu:RemoveSubMenus()
else
local menutaskinfo = self.gettext:GetEntry("MENUTASKINFO",self.locale) local menutaskinfo = self.gettext:GetEntry("MENUTASKINFO",self.locale)
taskinfomenu = MENU_GROUP_DELAYED:New(group,menutaskinfo,topmenu) local taskinfomenu = MENU_GROUP_DELAYED:New(group,menutaskinfo,topmenu)
self.PlayerInfoMenu[playername] = taskinfomenu
end
local ittypes = {} local ittypes = {}
local itaskmenu = {} local itaskmenu = {}
@@ -2588,19 +2607,21 @@ function PLAYERTASKCONTROLLER:_BuildTaskInfoMenu(group,client,playername,topmenu
end end
end end
end end
return self return taskinfomenu
end end
--- [Internal] Build client menus --- [Internal] Build client menus
-- @param #PLAYERTASKCONTROLLER self -- @param #PLAYERTASKCONTROLLER self
-- @param Wrapper.Client#CLIENT Client (optional) build for this client name only -- @param Wrapper.Client#CLIENT Client (optional) build for this client name only
-- @param #boolean enforced -- @param #boolean enforced
-- @param #boolean fromsuccess
-- @return #PLAYERTASKCONTROLLER self -- @return #PLAYERTASKCONTROLLER self
function PLAYERTASKCONTROLLER:_BuildMenus(Client,enforced) function PLAYERTASKCONTROLLER:_BuildMenus(Client,enforced,fromsuccess)
self:T(self.lid.."_BuildMenus") self:T(self.lid.."_BuildMenus")
local clients = self.ClientSet:GetAliveSet() local clients = self.ClientSet:GetAliveSet()
local joinorabort = false local joinorabort = false
local timedbuild = false
if Client then if Client then
-- client + enforced -- join task or abort -- client + enforced -- join task or abort
@@ -2624,7 +2645,7 @@ function PLAYERTASKCONTROLLER:_BuildMenus(Client,enforced)
local menuname = self.MenuName or longname local menuname = self.MenuName or longname
local playerhastask = false local playerhastask = false
if self:_CheckPlayerHasTask(playername) then playerhastask = true end if self:_CheckPlayerHasTask(playername) and not fromsuccess then playerhastask = true end
local topmenu = nil local topmenu = nil
self:T("Playerhastask = "..tostring(playerhastask).." Enforced = "..tostring(enforced).." Join or Abort = "..tostring(joinorabort)) self:T("Playerhastask = "..tostring(playerhastask).." Enforced = "..tostring(enforced).." Join or Abort = "..tostring(joinorabort))
@@ -2641,14 +2662,15 @@ function PLAYERTASKCONTROLLER:_BuildMenus(Client,enforced)
self.PlayerMenu[playername]:RemoveSubMenus() self.PlayerMenu[playername]:RemoveSubMenus()
self.PlayerMenu[playername]:SetTag(timer.getAbsTime()) self.PlayerMenu[playername]:SetTag(timer.getAbsTime())
topmenu = self.PlayerMenu[playername] topmenu = self.PlayerMenu[playername]
elseif (not playerhastask) and enforced then elseif (not playerhastask) or enforced then
-- 4) last build > 30 secs? -- 4) last build > 30 secs?
local T0 = timer.getAbsTime() local T0 = timer.getAbsTime()
local TDiff = T0-self.PlayerMenu[playername].MenuTag local TDiff = T0-self.PlayerMenu[playername].MenuTag
self:T("TDiff = "..TDiff) self:T("TDiff = "..string.format("%.2d",TDiff))
if TDiff >= self.holdmenutime then if TDiff >= self.holdmenutime then
self.PlayerMenu[playername]:RemoveSubMenus() self.PlayerMenu[playername]:RemoveSubMenus()
self.PlayerMenu[playername]:SetTag(timer.getAbsTime()) self.PlayerMenu[playername]:SetTag(timer.getAbsTime())
timedbuild = true
end end
topmenu = self.PlayerMenu[playername] topmenu = self.PlayerMenu[playername]
end end
@@ -2659,36 +2681,11 @@ function PLAYERTASKCONTROLLER:_BuildMenus(Client,enforced)
self.PlayerMenu[playername]:SetTag(timer.getAbsTime()) self.PlayerMenu[playername]:SetTag(timer.getAbsTime())
end end
--[[
if self.PlayerMenu[playername] then
if enforced and not playerhastask then
if self.PlayerMenu[playername].MenuTag then
-- don't build if < 30 secs ago
local T0 = timer.getAbsTime()
local TDiff = T0-self.PlayerMenu[playername].MenuTag
if TDiff > 30 then
-- allow rebuild
self.PlayerMenu[playername]:RemoveSubMenus()
self.PlayerMenu[playername]:SetTag(timer.getAbsTime())
end
else
self.PlayerMenu[playername]:RemoveSubMenus()
self.PlayerMenu[playername]:SetTag(timer.getAbsTime())
end
end
topmenu = self.PlayerMenu[playername]
else
topmenu = MENU_GROUP_DELAYED:New(group,menuname,nil)
self.PlayerMenu[playername] = topmenu
self.PlayerMenu[playername]:SetTag(timer.getAbsTime())
end
--]]
--- ---
-- ACTIVE TASK MENU -- ACTIVE TASK MENU
--- ---
if playerhastask and enforced then if playerhastask and enforced then
--self:T("Building Active Task Menus for "..playername)
local menuactive = self.gettext:GetEntry("MENUACTIVE",self.locale) local menuactive = self.gettext:GetEntry("MENUACTIVE",self.locale)
local menuinfo = self.gettext:GetEntry("MENUINFO",self.locale) local menuinfo = self.gettext:GetEntry("MENUINFO",self.locale)
local menumark = self.gettext:GetEntry("MENUMARK",self.locale) local menumark = self.gettext:GetEntry("MENUMARK",self.locale)
@@ -2705,14 +2702,17 @@ function PLAYERTASKCONTROLLER:_BuildMenus(Client,enforced)
local flare = MENU_GROUP_COMMAND_DELAYED:New(group,menuflare,active,self._FlareTask,self,group,client) local flare = MENU_GROUP_COMMAND_DELAYED:New(group,menuflare,active,self._FlareTask,self,group,client)
end end
local abort = MENU_GROUP_COMMAND_DELAYED:New(group,menuabort,active,self._AbortTask,self,group,client) local abort = MENU_GROUP_COMMAND_DELAYED:New(group,menuabort,active,self._AbortTask,self,group,client)
if self.activehasinfomenu and self.taskinfomenu then if self.activehasinfomenu and self.taskinfomenu then
--self:T("Building Active-Info Menus for "..playername)
local tasktypes = self:_GetAvailableTaskTypes() local tasktypes = self:_GetAvailableTaskTypes()
local taskpertype = self:_GetTasksPerType() local taskpertype = self:_GetTasksPerType()
self:_BuildTaskInfoMenu(group,client,playername,topmenu,tasktypes,taskpertype) if self.PlayerInfoMenu[playername] then
self.PlayerInfoMenu[playername]:RemoveSubMenus()
end end
self.PlayerInfoMenu[playername] = self:_BuildTaskInfoMenu(group,client,playername,topmenu,tasktypes,taskpertype)
elseif (self.TaskQueue:Count() > 0 and enforced) or (not playerhastask) then end
elseif (self.TaskQueue:Count() > 0 and enforced) or (not playerhastask and (timedbuild or joinorabort)) then
--self:T("Building Join Menus for "..playername)
--- ---
-- JOIN TASK MENU -- JOIN TASK MENU
--- ---
@@ -2754,7 +2754,11 @@ function PLAYERTASKCONTROLLER:_BuildMenus(Client,enforced)
end end
end end
if self.taskinfomenu then if self.taskinfomenu then
self:_BuildTaskInfoMenu(group,client,playername,topmenu,tasktypes,taskpertype) --self:T("Building Join-Info Menus for "..playername)
if self.PlayerInfoMenu[playername] then
self.PlayerInfoMenu[playername]:RemoveSubMenus()
end
self.PlayerInfoMenu[playername] = self:_BuildTaskInfoMenu(group,client,playername,topmenu,tasktypes,taskpertype)
end end
elseif self.TaskQueue:Count() == 0 then elseif self.TaskQueue:Count() == 0 then
-- no tasks (yet) -- no tasks (yet)
@@ -3102,6 +3106,10 @@ function PLAYERTASKCONTROLLER:onafterTaskSuccess(From, Event, To, Task)
taskname = string.format(succtxttts, self.MenuName or self.Name, Task.PlayerTaskNr, tostring(Task.TTSType)) taskname = string.format(succtxttts, self.MenuName or self.Name, Task.PlayerTaskNr, tostring(Task.TTSType))
self.SRSQueue:NewTransmission(taskname,nil,self.SRS,nil,2) self.SRSQueue:NewTransmission(taskname,nil,self.SRS,nil,2)
end end
local clients=Task:GetClientObjects()
for _,client in pairs(clients) do
self:_BuildMenus(client,true,true)
end
return self return self
end end