mirror of
https://github.com/FlightControl-Master/MOOSE.git
synced 2025-10-29 16:58:06 +00:00
VArious fixes
This commit is contained in:
@@ -684,6 +684,11 @@ do
|
|||||||
-------------------------------------------------------------------------------------------------------------------
|
-------------------------------------------------------------------------------------------------------------------
|
||||||
-- PLAYERTASKCONTROLLER
|
-- PLAYERTASKCONTROLLER
|
||||||
-- TODO: PLAYERTASKCONTROLLER
|
-- TODO: PLAYERTASKCONTROLLER
|
||||||
|
-- DONE Playername from after #
|
||||||
|
-- DONE Coalition-level screen info to SET based
|
||||||
|
-- DONE Flash directions
|
||||||
|
-- TODO less rebuilds menu, Task info menu available after join
|
||||||
|
-- DONE Limit menu entries
|
||||||
-------------------------------------------------------------------------------------------------------------------
|
-------------------------------------------------------------------------------------------------------------------
|
||||||
|
|
||||||
--- PLAYERTASKCONTROLLER class.
|
--- PLAYERTASKCONTROLLER class.
|
||||||
@@ -715,8 +720,13 @@ do
|
|||||||
-- @field #boolean precisionbombing
|
-- @field #boolean precisionbombing
|
||||||
-- @field Ops.FlightGroup#FLIGHTGROUP LasingDrone
|
-- @field Ops.FlightGroup#FLIGHTGROUP LasingDrone
|
||||||
-- @field Core.MarkerOps_BASE#MARKEROPS_BASE MarkerOps
|
-- @field Core.MarkerOps_BASE#MARKEROPS_BASE MarkerOps
|
||||||
-- @field #boolean askinfomenu
|
-- @field #boolean taskinfomenu
|
||||||
-- @field #boolean MarkerReadOnly
|
-- @field #boolean MarkerReadOnly
|
||||||
|
-- @field #table FlashPlayer List of player who switched Flashing Direction Info on
|
||||||
|
-- @field #boolean AllowFlash Flashing directions for players allowed
|
||||||
|
-- @field #number menuitemlimit
|
||||||
|
-- @field #boolean activehasinfomenu
|
||||||
|
-- @field #number holdmenutime
|
||||||
-- @extends Core.Fsm#FSM
|
-- @extends Core.Fsm#FSM
|
||||||
|
|
||||||
---
|
---
|
||||||
@@ -893,6 +903,10 @@ do
|
|||||||
-- POINTEROVERTARGET = "%s, %s, pointer in reach for task %03d, lasing!",
|
-- POINTEROVERTARGET = "%s, %s, pointer in reach for task %03d, lasing!",
|
||||||
-- POINTERTARGETREPORT = "\nPointer in reach: %s\nLasing: %s",
|
-- POINTERTARGETREPORT = "\nPointer in reach: %s\nLasing: %s",
|
||||||
-- POINTERTARGETLASINGTTS = ". Pointer in reach and lasing.",
|
-- POINTERTARGETLASINGTTS = ". Pointer in reach and lasing.",
|
||||||
|
-- TARGET = "Target",
|
||||||
|
-- FLASHON = "%s - Flashing directions is now ON!",
|
||||||
|
-- FLASHOFF = "%s - Flashing directions is now OFF!",
|
||||||
|
-- FLASHMENU = "Flash Directions Switch",
|
||||||
-- },
|
-- },
|
||||||
--
|
--
|
||||||
-- e.g.
|
-- e.g.
|
||||||
@@ -1004,7 +1018,8 @@ PLAYERTASKCONTROLLER = {
|
|||||||
gettext = nil,
|
gettext = nil,
|
||||||
locale = "en",
|
locale = "en",
|
||||||
precisionbombing = false,
|
precisionbombing = false,
|
||||||
taskinfomenu = true,
|
taskinfomenu = false,
|
||||||
|
activehasinfomenu = false,
|
||||||
MarkerReadOnly = false,
|
MarkerReadOnly = false,
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1094,6 +1109,10 @@ PLAYERTASKCONTROLLER.Messages = {
|
|||||||
POINTEROVERTARGET = "%s, %s, pointer in reach for task %03d, lasing!",
|
POINTEROVERTARGET = "%s, %s, pointer in reach for task %03d, lasing!",
|
||||||
POINTERTARGETREPORT = "\nPointer in reach: %s\nLasing: %s",
|
POINTERTARGETREPORT = "\nPointer in reach: %s\nLasing: %s",
|
||||||
POINTERTARGETLASINGTTS = ". Pointer in reach and lasing.",
|
POINTERTARGETLASINGTTS = ". Pointer in reach and lasing.",
|
||||||
|
TARGET = "Target",
|
||||||
|
FLASHON = "%s - Flashing directions is now ON!",
|
||||||
|
FLASHOFF = "%s - Flashing directions is now OFF!",
|
||||||
|
FLASHMENU = "Flash Directions Switch",
|
||||||
},
|
},
|
||||||
DE = {
|
DE = {
|
||||||
TASKABORT = "Auftrag abgebrochen!",
|
TASKABORT = "Auftrag abgebrochen!",
|
||||||
@@ -1151,12 +1170,16 @@ PLAYERTASKCONTROLLER.Messages = {
|
|||||||
POINTEROVERTARGET = "%s, %s, Marker im Zielbereich für %03d, Laser an!",
|
POINTEROVERTARGET = "%s, %s, Marker im Zielbereich für %03d, Laser an!",
|
||||||
POINTERTARGETREPORT = "\nMarker im Zielbereich: %s\nLaser an: %s",
|
POINTERTARGETREPORT = "\nMarker im Zielbereich: %s\nLaser an: %s",
|
||||||
POINTERTARGETLASINGTTS = ". Marker im Zielbereich, Laser is an.",
|
POINTERTARGETLASINGTTS = ". Marker im Zielbereich, Laser is an.",
|
||||||
|
TARGET = "Ziel",
|
||||||
|
FLASHON = "%s - Richtungsangaben einblenden ist EIN!",
|
||||||
|
FLASHOFF = "%s - Richtungsangaben einblenden ist AUS!",
|
||||||
|
FLASHMENU = "Richtungsangaben Schalter",
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
--- PLAYERTASK class version.
|
--- PLAYERTASK class version.
|
||||||
-- @field #string version
|
-- @field #string version
|
||||||
PLAYERTASKCONTROLLER.version="0.1.30"
|
PLAYERTASKCONTROLLER.version="0.1.32"
|
||||||
|
|
||||||
--- Constructor
|
--- Constructor
|
||||||
-- @param #PLAYERTASKCONTROLLER self
|
-- @param #PLAYERTASKCONTROLLER self
|
||||||
@@ -1190,10 +1213,15 @@ function PLAYERTASKCONTROLLER:New(Name, Coalition, Type, ClientFilter)
|
|||||||
self.TasksPerPlayer = FIFO:New() -- Utilities.FiFo#FIFO
|
self.TasksPerPlayer = FIFO:New() -- Utilities.FiFo#FIFO
|
||||||
self.PrecisionTasks = 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
|
self.lasttaskcount = 0
|
||||||
|
|
||||||
self.taskinfomenu = false
|
self.taskinfomenu = false
|
||||||
|
self.activehasinfomenu = false
|
||||||
self.MenuName = nil
|
self.MenuName = nil
|
||||||
|
self.menuitemlimit = 5
|
||||||
|
self.holdmenutime = 30
|
||||||
|
|
||||||
self.MarkerReadOnly = false
|
self.MarkerReadOnly = false
|
||||||
|
|
||||||
@@ -1311,6 +1339,16 @@ function PLAYERTASKCONTROLLER:_InitLocalization()
|
|||||||
return self
|
return self
|
||||||
end
|
end
|
||||||
|
|
||||||
|
--- [User] Set flash directions option for player (player based info)
|
||||||
|
-- @param #PLAYERTASKCONTROLLER self
|
||||||
|
-- @param #boolean OnOff Set to `true` to switch on and `false` to switch off. Default is OFF.
|
||||||
|
-- @return #PLAYERTASKCONTROLLER self
|
||||||
|
function PLAYERTASKCONTROLLER:SetAllowFlashDirection(OnOff)
|
||||||
|
self:T(self.lid.."SetAllowFlashDirection")
|
||||||
|
self.AllowFlash = OnOff
|
||||||
|
return self
|
||||||
|
end
|
||||||
|
|
||||||
--- [User] Set repetition options for tasks
|
--- [User] Set repetition options for tasks
|
||||||
-- @param #PLAYERTASKCONTROLLER self
|
-- @param #PLAYERTASKCONTROLLER self
|
||||||
-- @param #boolean OnOff Set to `true` to switch on and `false` to switch off (defaults to true)
|
-- @param #boolean OnOff Set to `true` to switch on and `false` to switch off (defaults to true)
|
||||||
@@ -1329,6 +1367,22 @@ function PLAYERTASKCONTROLLER:SetTaskRepetition(OnOff, Repeats)
|
|||||||
return self
|
return self
|
||||||
end
|
end
|
||||||
|
|
||||||
|
--- [Internal] Send message to SET_CLIENT of players
|
||||||
|
-- @param #PLAYERTASKCONTROLLER self
|
||||||
|
-- @param #string Text the text to be send
|
||||||
|
-- @param #number Seconds (optional) Seconds to show, default 10
|
||||||
|
-- @return #PLAYERTASKCONTROLLER self
|
||||||
|
function PLAYERTASKCONTROLLER:_SendMessageToClients(Text,Seconds)
|
||||||
|
self:T(self.lid.."_SendMessageToClients")
|
||||||
|
local seconds = Seconds or 10
|
||||||
|
self.ClientSet:ForEachClient(
|
||||||
|
function (Client)
|
||||||
|
local m = MESSAGE:New(Text,seconds,"Tasking"):ToClient(Client)
|
||||||
|
end
|
||||||
|
)
|
||||||
|
return self
|
||||||
|
end
|
||||||
|
|
||||||
--- [User] Allow precision laser-guided bombing on statics and "high-value" ground units (MBT etc)
|
--- [User] Allow precision laser-guided bombing on statics and "high-value" ground units (MBT etc)
|
||||||
-- @param #PLAYERTASKCONTROLLER self
|
-- @param #PLAYERTASKCONTROLLER self
|
||||||
-- @param Ops.FlightGroup#FLIGHTGROUP FlightGroup The FlightGroup (e.g. drone) to be used for lasing (one unit in one group only).
|
-- @param Ops.FlightGroup#FLIGHTGROUP FlightGroup The FlightGroup (e.g. drone) to be used for lasing (one unit in one group only).
|
||||||
@@ -1421,9 +1475,11 @@ function PLAYERTASKCONTROLLER:_GetPlayerName(Client)
|
|||||||
-- personalized flight name in player naming
|
-- personalized flight name in player naming
|
||||||
ttsplayername = string.match(playername,"| ([%a]+)")
|
ttsplayername = string.match(playername,"| ([%a]+)")
|
||||||
end
|
end
|
||||||
if string.find(playername,"#") then
|
local group = Client:GetGroup()
|
||||||
|
local groupname = group:GetName()
|
||||||
|
if string.find(groupname,"#") then
|
||||||
-- personalized flight name in player naming
|
-- personalized flight name in player naming
|
||||||
ttsplayername = string.match(playername,"# ([%a]+)")
|
ttsplayername = string.match(groupname,"#([%a]+)")
|
||||||
end
|
end
|
||||||
return playername, ttsplayername
|
return playername, ttsplayername
|
||||||
end
|
end
|
||||||
@@ -1456,6 +1512,24 @@ function PLAYERTASKCONTROLLER:DisableTaskInfoMenu()
|
|||||||
return self
|
return self
|
||||||
end
|
end
|
||||||
|
|
||||||
|
--- [User] Set menu build fine-tuning options
|
||||||
|
-- @param #PLAYERTASKCONTROLLER self
|
||||||
|
-- @param #boolean InfoMenu If `true` this option will allow to show the Task Info-Menu also when a player has an active task.
|
||||||
|
-- Since the menu isn't refreshed if a player holds an active task, the info in there might be stale.
|
||||||
|
-- @param #number ItemLimit Number of items per task type to show, default 5.
|
||||||
|
-- @param #number HoldTime Minimum number of seconds between menu refreshes (called every 30 secs) if a player has **no active task**.
|
||||||
|
-- @return #PLAYERTASKCONTROLLER self
|
||||||
|
function PLAYERTASKCONTROLLER:SetMenuOptions(InfoMenu,ItemLimit,HoldTime)
|
||||||
|
self:T(self.lid.."SetMenuOptions")
|
||||||
|
self.activehasinfomenu = InfoMenu or false
|
||||||
|
if self.activehasinfomenu then
|
||||||
|
self:EnableTaskInfoMenu()
|
||||||
|
end
|
||||||
|
self.menuitemlimit = ItemLimit or 5
|
||||||
|
self.holdmenutime = HoldTime or 30
|
||||||
|
return self
|
||||||
|
end
|
||||||
|
|
||||||
--- [User] Forbid F10 markers to be deleted by pilots. Note: Marker will auto-delete when the undelying task is done.
|
--- [User] Forbid F10 markers to be deleted by pilots. Note: Marker will auto-delete when the undelying task is done.
|
||||||
-- @param #PLAYERTASKCONTROLLER self
|
-- @param #PLAYERTASKCONTROLLER self
|
||||||
-- @return #PLAYERTASKCONTROLLER self
|
-- @return #PLAYERTASKCONTROLLER self
|
||||||
@@ -1639,7 +1713,6 @@ function PLAYERTASKCONTROLLER:_GetTasksPerType()
|
|||||||
|
|
||||||
table.sort(threattable, function (k1, k2) return k1.threat > k2.threat end )
|
table.sort(threattable, function (k1, k2) return k1.threat > k2.threat end )
|
||||||
|
|
||||||
|
|
||||||
for _id,_data in pairs(threattable) do
|
for _id,_data in pairs(threattable) do
|
||||||
local threat=_data.threat
|
local threat=_data.threat
|
||||||
local task = _data.task -- Ops.PlayerTask#PLAYERTASK
|
local task = _data.task -- Ops.PlayerTask#PLAYERTASK
|
||||||
@@ -2135,7 +2208,7 @@ function PLAYERTASKCONTROLLER:_JoinTask(Group, Client, Task)
|
|||||||
-- Player already has a task
|
-- Player already has a task
|
||||||
if not self.NoScreenOutput then
|
if not self.NoScreenOutput then
|
||||||
local text = self.gettext:GetEntry("HAVEACTIVETASK",self.locale)
|
local text = self.gettext:GetEntry("HAVEACTIVETASK",self.locale)
|
||||||
local m=MESSAGE:New(text,"10","Tasking"):ToGroup(Group)
|
local m=MESSAGE:New(text,"10","Tasking"):ToClient(Client)
|
||||||
end
|
end
|
||||||
return self
|
return self
|
||||||
end
|
end
|
||||||
@@ -2151,7 +2224,8 @@ function PLAYERTASKCONTROLLER:_JoinTask(Group, Client, Task)
|
|||||||
local text = string.format(joined,ttsplayername, self.MenuName or self.Name, Task.TTSType, Task.PlayerTaskNr)
|
local text = string.format(joined,ttsplayername, self.MenuName or self.Name, Task.TTSType, Task.PlayerTaskNr)
|
||||||
self:T(self.lid..text)
|
self:T(self.lid..text)
|
||||||
if not self.NoScreenOutput then
|
if not self.NoScreenOutput then
|
||||||
local m=MESSAGE:New(text,"10","Tasking"):ToAll()
|
self:_SendMessageToClients(text)
|
||||||
|
--local m=MESSAGE:New(text,"10","Tasking"):ToAll()
|
||||||
end
|
end
|
||||||
if self.UseSRS then
|
if self.UseSRS then
|
||||||
self.SRSQueue:NewTransmission(text,nil,self.SRS,nil,2)
|
self.SRSQueue:NewTransmission(text,nil,self.SRS,nil,2)
|
||||||
@@ -2168,6 +2242,55 @@ function PLAYERTASKCONTROLLER:_JoinTask(Group, Client, Task)
|
|||||||
return self
|
return self
|
||||||
end
|
end
|
||||||
|
|
||||||
|
--- [Internal] Switch flashing info for a client
|
||||||
|
-- @param #PLAYERTASKCONTROLLER self
|
||||||
|
-- @param Wrapper.Group#GROUP Group
|
||||||
|
-- @param Wrapper.Client#CLIENT Client
|
||||||
|
-- @return #PLAYERTASKCONTROLLER self
|
||||||
|
function PLAYERTASKCONTROLLER:_SwitchFlashing(Group, Client)
|
||||||
|
self:T(self.lid.."_SwitchFlashing")
|
||||||
|
local playername, ttsplayername = self:_GetPlayerName(Client)
|
||||||
|
if (not self.FlashPlayer[playername]) or (self.FlashPlayer[playername] == false) then
|
||||||
|
-- Switch on
|
||||||
|
self.FlashPlayer[playername] = Client
|
||||||
|
local flashtext = self.gettext:GetEntry("FLASHON",self.locale)
|
||||||
|
local text = string.format(flashtext,ttsplayername)
|
||||||
|
local m = MESSAGE:New(text,10,"Tasking"):ToClient(Client)
|
||||||
|
else
|
||||||
|
-- Switch off
|
||||||
|
self.FlashPlayer[playername] = false
|
||||||
|
local flashtext = self.gettext:GetEntry("FLASHOFF",self.locale)
|
||||||
|
local text = string.format(flashtext,ttsplayername)
|
||||||
|
local m = MESSAGE:New(text,10,"Tasking"):ToClient(Client)
|
||||||
|
end
|
||||||
|
return self
|
||||||
|
end
|
||||||
|
|
||||||
|
--- [Internal] Flashing directional info for a client
|
||||||
|
-- @param #PLAYERTASKCONTROLLER self
|
||||||
|
-- @return #PLAYERTASKCONTROLLER self
|
||||||
|
function PLAYERTASKCONTROLLER:_FlashInfo()
|
||||||
|
self:T(self.lid.."_FlashInfo")
|
||||||
|
for _playername,_client in pairs(self.FlashPlayer) do
|
||||||
|
if _client and _client:IsAlive() then
|
||||||
|
if self.TasksPerPlayer:HasUniqueID(_playername) then
|
||||||
|
local task = self.TasksPerPlayer:ReadByID(_playername) -- Ops.PlayerTask#PLAYERTASK
|
||||||
|
local Coordinate = task.Target:GetCoordinate()
|
||||||
|
local CoordText = ""
|
||||||
|
if self.Type ~= PLAYERTASKCONTROLLER.Type.A2A then
|
||||||
|
CoordText = Coordinate:ToStringA2G(_client)
|
||||||
|
else
|
||||||
|
c = Coordinate:ToStringA2A(_client)
|
||||||
|
end
|
||||||
|
local targettxt = self.gettext:GetEntry("TARGET",self.locale)
|
||||||
|
local text = "Target: "..CoordText
|
||||||
|
local m = MESSAGE:New(text,10,"Tasking"):ToClient(_client)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
return self
|
||||||
|
end
|
||||||
|
|
||||||
--- [Internal] Show active task info
|
--- [Internal] Show active task info
|
||||||
-- @param #PLAYERTASKCONTROLLER self
|
-- @param #PLAYERTASKCONTROLLER self
|
||||||
-- @param Wrapper.Group#GROUP Group
|
-- @param Wrapper.Group#GROUP Group
|
||||||
@@ -2252,7 +2375,7 @@ function PLAYERTASKCONTROLLER:_ActiveTaskInfo(Group, Client, Task)
|
|||||||
text = self.gettext:GetEntry("NOACTIVETASK",self.locale)
|
text = self.gettext:GetEntry("NOACTIVETASK",self.locale)
|
||||||
end
|
end
|
||||||
if not self.NoScreenOutput then
|
if not self.NoScreenOutput then
|
||||||
local m=MESSAGE:New(text,15,"Tasking"):ToGroup(Group)
|
local m=MESSAGE:New(text,15,"Tasking"):ToClient(Client)
|
||||||
end
|
end
|
||||||
return self
|
return self
|
||||||
end
|
end
|
||||||
@@ -2281,7 +2404,7 @@ function PLAYERTASKCONTROLLER:_MarkTask(Group, Client)
|
|||||||
text = self.gettext:GetEntry("NOACTIVETASK",self.locale)
|
text = self.gettext:GetEntry("NOACTIVETASK",self.locale)
|
||||||
end
|
end
|
||||||
if not self.NoScreenOutput then
|
if not self.NoScreenOutput then
|
||||||
local m=MESSAGE:New(text,"10","Tasking"):ToGroup(Group)
|
local m=MESSAGE:New(text,"10","Tasking"):ToClient(Client)
|
||||||
end
|
end
|
||||||
return self
|
return self
|
||||||
end
|
end
|
||||||
@@ -2309,7 +2432,7 @@ function PLAYERTASKCONTROLLER:_SmokeTask(Group, Client)
|
|||||||
text = self.gettext:GetEntry("NOACTIVETASK",self.locale)
|
text = self.gettext:GetEntry("NOACTIVETASK",self.locale)
|
||||||
end
|
end
|
||||||
if not self.NoScreenOutput then
|
if not self.NoScreenOutput then
|
||||||
local m=MESSAGE:New(text,15,"Tasking"):ToGroup(Group)
|
local m=MESSAGE:New(text,15,"Tasking"):ToClient(Client)
|
||||||
end
|
end
|
||||||
return self
|
return self
|
||||||
end
|
end
|
||||||
@@ -2337,7 +2460,7 @@ function PLAYERTASKCONTROLLER:_FlareTask(Group, Client)
|
|||||||
text = self.gettext:GetEntry("NOACTIVETASK",self.locale)
|
text = self.gettext:GetEntry("NOACTIVETASK",self.locale)
|
||||||
end
|
end
|
||||||
if not self.NoScreenOutput then
|
if not self.NoScreenOutput then
|
||||||
local m=MESSAGE:New(text,15,"Tasking"):ToGroup(Group)
|
local m=MESSAGE:New(text,15,"Tasking"):ToClient(Client)
|
||||||
end
|
end
|
||||||
return self
|
return self
|
||||||
end
|
end
|
||||||
@@ -2366,12 +2489,62 @@ function PLAYERTASKCONTROLLER:_AbortTask(Group, Client)
|
|||||||
text = self.gettext:GetEntry("NOACTIVETASK",self.locale)
|
text = self.gettext:GetEntry("NOACTIVETASK",self.locale)
|
||||||
end
|
end
|
||||||
if not self.NoScreenOutput then
|
if not self.NoScreenOutput then
|
||||||
local m=MESSAGE:New(text,15,"Tasking"):ToGroup(Group)
|
local m=MESSAGE:New(text,15,"Tasking"):ToClient(Client)
|
||||||
end
|
end
|
||||||
self:_BuildMenus(Client,true)
|
self:_BuildMenus(Client,true)
|
||||||
return self
|
return self
|
||||||
end
|
end
|
||||||
|
|
||||||
|
--- [Internal] Build Task Info Menu
|
||||||
|
-- @param #PLAYERTASKCONTROLLER self
|
||||||
|
-- @param Wrapper.Group#GROUP group
|
||||||
|
-- @param Wrapper.Client#CLIENT client
|
||||||
|
-- @param #string playername
|
||||||
|
-- @param Core.Menu#MENU_BASE topmenu
|
||||||
|
-- @param #table tasktypes
|
||||||
|
-- @param #table taskpertype
|
||||||
|
-- @return #PLAYERTASKCONTROLLER self
|
||||||
|
function PLAYERTASKCONTROLLER:_BuildTaskInfoMenu(group,client,playername,topmenu,tasktypes,taskpertype)
|
||||||
|
if self.taskinfomenu then
|
||||||
|
local menutaskinfo = self.gettext:GetEntry("MENUTASKINFO",self.locale)
|
||||||
|
local ittypes = {}
|
||||||
|
local itaskmenu = {}
|
||||||
|
local taskinfomenu = MENU_GROUP_DELAYED:New(group,menutaskinfo,topmenu)
|
||||||
|
for _tasktype,_data in pairs(tasktypes) do
|
||||||
|
ittypes[_tasktype] = MENU_GROUP_DELAYED:New(group,_tasktype,taskinfomenu)
|
||||||
|
local tasks = taskpertype[_tasktype] or {}
|
||||||
|
local n = 0
|
||||||
|
for _,_task in pairs(tasks) do
|
||||||
|
_task = _task -- Ops.PlayerTask#PLAYERTASK
|
||||||
|
local pilotcount = _task:CountClients()
|
||||||
|
local newtext = "]"
|
||||||
|
local tnow = timer.getTime()
|
||||||
|
-- marker for new tasks
|
||||||
|
if tnow - _task.timestamp < 60 then
|
||||||
|
newtext = "*]"
|
||||||
|
end
|
||||||
|
local menutaskno = self.gettext:GetEntry("MENUTASKNO",self.locale)
|
||||||
|
local text = string.format("%s %03d [%d%s",menutaskno,_task.PlayerTaskNr,pilotcount,newtext)
|
||||||
|
if self.UseGroupNames then
|
||||||
|
local name = _task.Target:GetName()
|
||||||
|
if name ~= "Unknown" then
|
||||||
|
text = string.format("%s (%03d) [%d%s",name,_task.PlayerTaskNr,pilotcount,newtext)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
local taskentry = MENU_GROUP_COMMAND_DELAYED:New(group,text,ittypes[_tasktype],self._ActiveTaskInfo,self,group,client,_task)
|
||||||
|
--taskentry:SetTag(playername)
|
||||||
|
itaskmenu[#itaskmenu+1] = taskentry
|
||||||
|
-- keep max items limit
|
||||||
|
n = n + 1
|
||||||
|
if n >= self.menuitemlimit then
|
||||||
|
break
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
return self
|
||||||
|
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
|
||||||
@@ -2381,10 +2554,13 @@ function PLAYERTASKCONTROLLER:_BuildMenus(Client,enforced)
|
|||||||
self:T(self.lid.."_BuildMenus")
|
self:T(self.lid.."_BuildMenus")
|
||||||
|
|
||||||
local clients = self.ClientSet:GetAliveSet()
|
local clients = self.ClientSet:GetAliveSet()
|
||||||
|
local joinorabort = false
|
||||||
|
|
||||||
if Client then
|
if Client then
|
||||||
|
-- client + enforced -- join task or abort
|
||||||
clients = {Client}
|
clients = {Client}
|
||||||
enforced = true
|
enforced = true
|
||||||
|
joinorabort = true
|
||||||
end
|
end
|
||||||
|
|
||||||
for _,_client in pairs(clients) do
|
for _,_client in pairs(clients) do
|
||||||
@@ -2394,11 +2570,6 @@ function PLAYERTASKCONTROLLER:_BuildMenus(Client,enforced)
|
|||||||
local unknown = self.gettext:GetEntry("UNKNOWN",self.locale)
|
local unknown = self.gettext:GetEntry("UNKNOWN",self.locale)
|
||||||
local playername = client:GetPlayerName() or unknown
|
local playername = client:GetPlayerName() or unknown
|
||||||
if group and client then
|
if group and client then
|
||||||
---
|
|
||||||
-- Conditions for menu rebuild
|
|
||||||
-- 1) Player has no menu
|
|
||||||
-- 2) Player has no running task
|
|
||||||
-- 3) enforced
|
|
||||||
---
|
---
|
||||||
-- TOPMENU
|
-- TOPMENU
|
||||||
---
|
---
|
||||||
@@ -2410,17 +2581,62 @@ function PLAYERTASKCONTROLLER:_BuildMenus(Client,enforced)
|
|||||||
if self:_CheckPlayerHasTask(playername) then playerhastask = true end
|
if self:_CheckPlayerHasTask(playername) then playerhastask = true end
|
||||||
local topmenu = nil
|
local topmenu = nil
|
||||||
|
|
||||||
self:T("Playerhastask = "..tostring(playerhastask).." Enforced = "..tostring(enforced))
|
self:I("Playerhastask = "..tostring(playerhastask).." Enforced = "..tostring(enforced).." Join or Abort = "..tostring(joinorabort))
|
||||||
|
|
||||||
|
-- Cases to rebuild menu
|
||||||
|
-- 1) new player
|
||||||
|
-- 2) player joined a task, joinorabort = true
|
||||||
|
-- 3) player left a task, joinorabort = true
|
||||||
|
-- 4) player has no task, but number of tasks changed, and last build > 30 secs ago
|
||||||
if self.PlayerMenu[playername] then
|
if self.PlayerMenu[playername] then
|
||||||
if enforced or not playerhastask then
|
-- NOT a new player
|
||||||
|
-- 2)+3) Join or abort?
|
||||||
|
if joinorabort then
|
||||||
self.PlayerMenu[playername]:RemoveSubMenus()
|
self.PlayerMenu[playername]:RemoveSubMenus()
|
||||||
|
self.PlayerMenu[playername]:SetTag(timer.getAbsTime())
|
||||||
|
topmenu = self.PlayerMenu[playername]
|
||||||
|
elseif (not playerhastask) and enforced then
|
||||||
|
-- 4) last build > 30 secs?
|
||||||
|
local T0 = timer.getAbsTime()
|
||||||
|
local TDiff = T0-self.PlayerMenu[playername].MenuTag
|
||||||
|
self:I("TDiff = "..TDiff)
|
||||||
|
if TDiff >= self.holdmenutime then
|
||||||
|
self.PlayerMenu[playername]:RemoveSubMenus()
|
||||||
|
self.PlayerMenu[playername]:SetTag(timer.getAbsTime())
|
||||||
|
end
|
||||||
|
topmenu = self.PlayerMenu[playername]
|
||||||
|
end
|
||||||
|
else
|
||||||
|
-- 1) new player#
|
||||||
|
topmenu = MENU_GROUP_DELAYED:New(group,menuname,nil)
|
||||||
|
self.PlayerMenu[playername] = topmenu
|
||||||
|
self.PlayerMenu[playername]:SetTag(timer.getAbsTime())
|
||||||
|
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
|
end
|
||||||
topmenu = self.PlayerMenu[playername]
|
topmenu = self.PlayerMenu[playername]
|
||||||
else
|
else
|
||||||
topmenu = MENU_GROUP_DELAYED:New(group,menuname,nil)
|
topmenu = MENU_GROUP_DELAYED:New(group,menuname,nil)
|
||||||
self.PlayerMenu[playername] = topmenu
|
self.PlayerMenu[playername] = topmenu
|
||||||
|
self.PlayerMenu[playername]:SetTag(timer.getAbsTime())
|
||||||
end
|
end
|
||||||
|
--]]
|
||||||
|
|
||||||
---
|
---
|
||||||
-- ACTIVE TASK MENU
|
-- ACTIVE TASK MENU
|
||||||
@@ -2443,7 +2659,13 @@ 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
|
||||||
|
local tasktypes = self:_GetAvailableTaskTypes()
|
||||||
|
local taskpertype = self:_GetTasksPerType()
|
||||||
|
self:_BuildTaskInfoMenu(group,client,playername,topmenu,tasktypes,taskpertype)
|
||||||
|
end
|
||||||
|
|
||||||
elseif (self.TaskQueue:Count() > 0 and enforced) or (not playerhastask) then
|
elseif (self.TaskQueue:Count() > 0 and enforced) or (not playerhastask) then
|
||||||
---
|
---
|
||||||
-- JOIN TASK MENU
|
-- JOIN TASK MENU
|
||||||
@@ -2451,16 +2673,14 @@ function PLAYERTASKCONTROLLER:_BuildMenus(Client,enforced)
|
|||||||
local tasktypes = self:_GetAvailableTaskTypes()
|
local tasktypes = self:_GetAvailableTaskTypes()
|
||||||
local taskpertype = self:_GetTasksPerType()
|
local taskpertype = self:_GetTasksPerType()
|
||||||
local menujoin = self.gettext:GetEntry("MENUJOIN",self.locale)
|
local menujoin = self.gettext:GetEntry("MENUJOIN",self.locale)
|
||||||
local menutaskinfo = self.gettext:GetEntry("MENUTASKINFO",self.locale)
|
|
||||||
local joinmenu = MENU_GROUP_DELAYED:New(group,menujoin,topmenu)
|
local joinmenu = MENU_GROUP_DELAYED:New(group,menujoin,topmenu)
|
||||||
|
|
||||||
local ttypes = {}
|
local ttypes = {}
|
||||||
local taskmenu = {}
|
local taskmenu = {}
|
||||||
local ittypes = {}
|
|
||||||
local itaskmenu = {}
|
|
||||||
for _tasktype,_data in pairs(tasktypes) do
|
for _tasktype,_data in pairs(tasktypes) do
|
||||||
ttypes[_tasktype] = MENU_GROUP_DELAYED:New(group,_tasktype,joinmenu)
|
ttypes[_tasktype] = MENU_GROUP_DELAYED:New(group,_tasktype,joinmenu)
|
||||||
local tasks = taskpertype[_tasktype] or {}
|
local tasks = taskpertype[_tasktype] or {}
|
||||||
|
local n = 0
|
||||||
for _,_task in pairs(tasks) do
|
for _,_task in pairs(tasks) do
|
||||||
_task = _task -- Ops.PlayerTask#PLAYERTASK
|
_task = _task -- Ops.PlayerTask#PLAYERTASK
|
||||||
local pilotcount = _task:CountClients()
|
local pilotcount = _task:CountClients()
|
||||||
@@ -2478,45 +2698,17 @@ function PLAYERTASKCONTROLLER:_BuildMenus(Client,enforced)
|
|||||||
text = string.format("%s (%03d) [%d%s",name,_task.PlayerTaskNr,pilotcount,newtext)
|
text = string.format("%s (%03d) [%d%s",name,_task.PlayerTaskNr,pilotcount,newtext)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
--if _task:GetState() == "Planned" or (not _task:HasPlayerName(playername)) then
|
|
||||||
local taskentry = MENU_GROUP_COMMAND_DELAYED:New(group,text,ttypes[_tasktype],self._JoinTask,self,group,client,_task)
|
local taskentry = MENU_GROUP_COMMAND_DELAYED:New(group,text,ttypes[_tasktype],self._JoinTask,self,group,client,_task)
|
||||||
taskentry:SetTag(playername)
|
--taskentry:SetTag(playername)
|
||||||
taskmenu[#taskmenu+1] = taskentry
|
taskmenu[#taskmenu+1] = taskentry
|
||||||
--end
|
n = n + 1
|
||||||
|
if n >= self.menuitemlimit then
|
||||||
|
break
|
||||||
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
--joinmenu:Set()
|
|
||||||
|
|
||||||
if self.taskinfomenu then
|
if self.taskinfomenu then
|
||||||
local taskinfomenu = MENU_GROUP_DELAYED:New(group,menutaskinfo,topmenu)
|
self:_BuildTaskInfoMenu(group,client,playername,topmenu,tasktypes,taskpertype)
|
||||||
for _tasktype,_data in pairs(tasktypes) do
|
|
||||||
ittypes[_tasktype] = MENU_GROUP_DELAYED:New(group,_tasktype,taskinfomenu)
|
|
||||||
local tasks = taskpertype[_tasktype] or {}
|
|
||||||
for _,_task in pairs(tasks) do
|
|
||||||
_task = _task -- Ops.PlayerTask#PLAYERTASK
|
|
||||||
local pilotcount = _task:CountClients()
|
|
||||||
local newtext = "]"
|
|
||||||
local tnow = timer.getTime()
|
|
||||||
-- marker for new tasks
|
|
||||||
if tnow - _task.timestamp < 60 then
|
|
||||||
newtext = "*]"
|
|
||||||
end
|
|
||||||
local menutaskno = self.gettext:GetEntry("MENUTASKNO",self.locale)
|
|
||||||
local text = string.format("%s %03d [%d%s",menutaskno,_task.PlayerTaskNr,pilotcount,newtext)
|
|
||||||
if self.UseGroupNames then
|
|
||||||
local name = _task.Target:GetName()
|
|
||||||
if name ~= "Unknown" then
|
|
||||||
text = string.format("%s (%03d) [%d%s",name,_task.PlayerTaskNr,pilotcount,newtext)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
--if _task:GetState() == "Planned" or (not _task:HasPlayerName(playername)) then
|
|
||||||
local taskentry = MENU_GROUP_COMMAND_DELAYED:New(group,text,ittypes[_tasktype],self._ActiveTaskInfo,self,group,client,_task)
|
|
||||||
taskentry:SetTag(playername)
|
|
||||||
itaskmenu[#itaskmenu+1] = taskentry
|
|
||||||
--end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
--taskinfomenu:Set()
|
|
||||||
end
|
end
|
||||||
elseif self.TaskQueue:Count() == 0 then
|
elseif self.TaskQueue:Count() == 0 then
|
||||||
-- no tasks (yet)
|
-- no tasks (yet)
|
||||||
@@ -2525,7 +2717,11 @@ function PLAYERTASKCONTROLLER:_BuildMenus(Client,enforced)
|
|||||||
end
|
end
|
||||||
---
|
---
|
||||||
-- REFRESH MENU
|
-- REFRESH MENU
|
||||||
---
|
---
|
||||||
|
if self.AllowFlash then
|
||||||
|
local flashtext = self.gettext:GetEntry("FLASHMENU",self.locale)
|
||||||
|
local flashmenu = MENU_GROUP_COMMAND_DELAYED:New(group,flashtext,self.PlayerMenu[playername],self._SwitchFlashing,self,group,client)
|
||||||
|
end
|
||||||
self.PlayerMenu[playername]:Set()
|
self.PlayerMenu[playername]:Set()
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
@@ -2774,6 +2970,9 @@ function PLAYERTASKCONTROLLER:onafterStatus(From, Event, To)
|
|||||||
self:_CheckTargetQueue()
|
self:_CheckTargetQueue()
|
||||||
self:_CheckTaskQueue()
|
self:_CheckTaskQueue()
|
||||||
self:_CheckPrecisionTasks()
|
self:_CheckPrecisionTasks()
|
||||||
|
if self.AllowFlash then
|
||||||
|
self:_FlashInfo()
|
||||||
|
end
|
||||||
|
|
||||||
local targetcount = self.TargetQueue:Count()
|
local targetcount = self.TargetQueue:Count()
|
||||||
local taskcount = self.TaskQueue:Count()
|
local taskcount = self.TaskQueue:Count()
|
||||||
@@ -2826,7 +3025,8 @@ function PLAYERTASKCONTROLLER:onafterTaskCancelled(From, Event, To, Task)
|
|||||||
local canceltxttts = self.gettext:GetEntry("TASKCANCELLEDTTS",self.locale)
|
local canceltxttts = self.gettext:GetEntry("TASKCANCELLEDTTS",self.locale)
|
||||||
local taskname = string.format(canceltxt, Task.PlayerTaskNr, tostring(Task.Type))
|
local taskname = string.format(canceltxt, Task.PlayerTaskNr, tostring(Task.Type))
|
||||||
if not self.NoScreenOutput then
|
if not self.NoScreenOutput then
|
||||||
local m = MESSAGE:New(taskname,15,"Tasking"):ToCoalition(self.Coalition)
|
self:_SendMessageToClients(taskname,15)
|
||||||
|
--local m = MESSAGE:New(taskname,15,"Tasking"):ToCoalition(self.Coalition)
|
||||||
end
|
end
|
||||||
if self.UseSRS then
|
if self.UseSRS then
|
||||||
taskname = string.format(canceltxttts, self.MenuName or self.Name, Task.PlayerTaskNr, tostring(Task.TTSType))
|
taskname = string.format(canceltxttts, self.MenuName or self.Name, Task.PlayerTaskNr, tostring(Task.TTSType))
|
||||||
@@ -2849,7 +3049,8 @@ function PLAYERTASKCONTROLLER:onafterTaskSuccess(From, Event, To, Task)
|
|||||||
local succtxttts = self.gettext:GetEntry("TASKSUCCESSTTS",self.locale)
|
local succtxttts = self.gettext:GetEntry("TASKSUCCESSTTS",self.locale)
|
||||||
local taskname = string.format(succtxt, Task.PlayerTaskNr, tostring(Task.Type))
|
local taskname = string.format(succtxt, Task.PlayerTaskNr, tostring(Task.Type))
|
||||||
if not self.NoScreenOutput then
|
if not self.NoScreenOutput then
|
||||||
local m = MESSAGE:New(taskname,15,"Tasking"):ToCoalition(self.Coalition)
|
self:_SendMessageToClients(taskname,15)
|
||||||
|
--local m = MESSAGE:New(taskname,15,"Tasking"):ToCoalition(self.Coalition)
|
||||||
end
|
end
|
||||||
if self.UseSRS then
|
if self.UseSRS then
|
||||||
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))
|
||||||
@@ -2872,7 +3073,8 @@ function PLAYERTASKCONTROLLER:onafterTaskFailed(From, Event, To, Task)
|
|||||||
local failtxttts = self.gettext:GetEntry("TASKFAILEDTTS",self.locale)
|
local failtxttts = self.gettext:GetEntry("TASKFAILEDTTS",self.locale)
|
||||||
local taskname = string.format(failtxt, Task.PlayerTaskNr, tostring(Task.Type))
|
local taskname = string.format(failtxt, Task.PlayerTaskNr, tostring(Task.Type))
|
||||||
if not self.NoScreenOutput then
|
if not self.NoScreenOutput then
|
||||||
local m = MESSAGE:New(taskname,15,"Tasking"):ToCoalition(self.Coalition)
|
self:_SendMessageToClients(taskname,15)
|
||||||
|
--local m = MESSAGE:New(taskname,15,"Tasking"):ToCoalition(self.Coalition)
|
||||||
end
|
end
|
||||||
if self.UseSRS then
|
if self.UseSRS then
|
||||||
taskname = string.format(failtxttts, self.MenuName or self.Name, Task.PlayerTaskNr, tostring(Task.TTSType))
|
taskname = string.format(failtxttts, self.MenuName or self.Name, Task.PlayerTaskNr, tostring(Task.TTSType))
|
||||||
@@ -2895,7 +3097,8 @@ function PLAYERTASKCONTROLLER:onafterTaskRepeatOnFailed(From, Event, To, Task)
|
|||||||
local repfailtxttts = self.gettext:GetEntry("TASKFAILEDREPLANTTS",self.locale)
|
local repfailtxttts = self.gettext:GetEntry("TASKFAILEDREPLANTTS",self.locale)
|
||||||
local taskname = string.format(repfailtxt, Task.PlayerTaskNr, tostring(Task.Type))
|
local taskname = string.format(repfailtxt, Task.PlayerTaskNr, tostring(Task.Type))
|
||||||
if not self.NoScreenOutput then
|
if not self.NoScreenOutput then
|
||||||
local m = MESSAGE:New(taskname,15,"Tasking"):ToCoalition(self.Coalition)
|
self:_SendMessageToClients(taskname,15)
|
||||||
|
--local m = MESSAGE:New(taskname,15,"Tasking"):ToCoalition(self.Coalition)
|
||||||
end
|
end
|
||||||
if self.UseSRS then
|
if self.UseSRS then
|
||||||
taskname = string.format(repfailtxttts, self.MenuName or self.Name, Task.PlayerTaskNr, tostring(Task.TTSType))
|
taskname = string.format(repfailtxttts, self.MenuName or self.Name, Task.PlayerTaskNr, tostring(Task.TTSType))
|
||||||
@@ -2917,7 +3120,8 @@ function PLAYERTASKCONTROLLER:onafterTaskAdded(From, Event, To, Task)
|
|||||||
local addtxt = self.gettext:GetEntry("TASKADDED",self.locale)
|
local addtxt = self.gettext:GetEntry("TASKADDED",self.locale)
|
||||||
local taskname = string.format(addtxt, self.MenuName or self.Name, tostring(Task.Type))
|
local taskname = string.format(addtxt, self.MenuName or self.Name, tostring(Task.Type))
|
||||||
if not self.NoScreenOutput then
|
if not self.NoScreenOutput then
|
||||||
local m = MESSAGE:New(taskname,15,"Tasking"):ToCoalition(self.Coalition)
|
self:_SendMessageToClients(taskname,15)
|
||||||
|
--local m = MESSAGE:New(taskname,15,"Tasking"):ToCoalition(self.Coalition)
|
||||||
end
|
end
|
||||||
if self.UseSRS then
|
if self.UseSRS then
|
||||||
taskname = string.format(addtxt, self.MenuName or self.Name, tostring(Task.TTSType))
|
taskname = string.format(addtxt, self.MenuName or self.Name, tostring(Task.TTSType))
|
||||||
|
|||||||
Reference in New Issue
Block a user