From d2132b2e64a957f8ccca04b28a6bf5f7101fbeae Mon Sep 17 00:00:00 2001 From: Applevangelist Date: Tue, 13 Sep 2022 10:11:10 +0200 Subject: [PATCH 1/4] #PLAYERTASKCONTROLLER * Align creation of (player) callsigns with what is used in AWACS --- Moose Development/Moose/Ops/PlayerTask.lua | 80 ++++++++++++++-------- 1 file changed, 53 insertions(+), 27 deletions(-) diff --git a/Moose Development/Moose/Ops/PlayerTask.lua b/Moose Development/Moose/Ops/PlayerTask.lua index 82aed5737..a7b875957 100644 --- a/Moose Development/Moose/Ops/PlayerTask.lua +++ b/Moose Development/Moose/Ops/PlayerTask.lua @@ -684,10 +684,10 @@ do ------------------------------------------------------------------------------------------------------------------- -- PLAYERTASKCONTROLLER -- TODO: PLAYERTASKCONTROLLER --- DONE Playername from after # +-- DONE Playername customized -- DONE Coalition-level screen info to SET based -- DONE Flash directions --- TODO less rebuilds menu, Task info menu available after join +-- DONE less rebuilds menu, Task info menu available after join -- DONE Limit menu entries ------------------------------------------------------------------------------------------------------------------- @@ -727,6 +727,9 @@ do -- @field #number menuitemlimit -- @field #boolean activehasinfomenu -- @field #number holdmenutime +-- @field #table customcallsigns +-- @field #boolean ShortCallsign +-- @field #boolean Keepnumber -- @extends Core.Fsm#FSM --- @@ -1021,6 +1024,9 @@ PLAYERTASKCONTROLLER = { taskinfomenu = false, activehasinfomenu = false, MarkerReadOnly = false, + customcallsigns = {}, + ShortCallsign = true, + Keepnumber = false, } --- @@ -1179,7 +1185,7 @@ PLAYERTASKCONTROLLER.Messages = { --- PLAYERTASK class version. -- @field #string version -PLAYERTASKCONTROLLER.version="0.1.32" +PLAYERTASKCONTROLLER.version="0.1.33" --- Constructor -- @param #PLAYERTASKCONTROLLER self @@ -1228,6 +1234,10 @@ function PLAYERTASKCONTROLLER:New(Name, Coalition, Type, ClientFilter) self.repeatonfailed = true self.repeattimes = 5 self.UseGroupNames = true + + self.customcallsigns = {} + self.ShortCallsign = true + self.Keepnumber = false if ClientFilter then self.ClientSet = SET_CLIENT:New():FilterCoalitions(string.lower(self.CoalitionName)):FilterActive(true):FilterPrefixes(ClientFilter):FilterStart() @@ -1349,6 +1359,22 @@ function PLAYERTASKCONTROLLER:SetAllowFlashDirection(OnOff) return self end +--- [User] Set callsign options for TTS output. See @{Wrapper.Group#GROUP.GetCustomCallSign}() on how to set customized callsigns. +-- @param #PLAYERTASKCONTROLLER self +-- @param #boolean ShortCallsign If true, only call out the major flight number +-- @param #boolean Keepnumber If true, keep the **customized callsign** in the #GROUP name as-is, no amendments or numbers. +-- @return #PLAYERTASKCONTROLLER self +function PLAYERTASKCONTROLLER:SetCallSignOptions(ShortCallsign,Keepnumber) + if not ShortCallsign or ShortCallsign == false then + self.ShortCallsign = false + else + self.ShortCallsign = true + end + self.Keepnumber = Keepnumber or false + return self +end + + --- [User] Set repetition options for tasks -- @param #PLAYERTASKCONTROLLER self -- @param #boolean OnOff Set to `true` to switch on and `false` to switch off (defaults to true) @@ -1470,16 +1496,13 @@ end function PLAYERTASKCONTROLLER:_GetPlayerName(Client) self:T(self.lid.."DisablePrecisionBombing") local playername = Client:GetPlayerName() - local ttsplayername = playername - if string.find(playername,"|") then - -- personalized flight name in player naming - ttsplayername = string.match(playername,"| ([%a]+)") - end - local group = Client:GetGroup() - local groupname = group:GetName() - if string.find(groupname,"#") then - -- personalized flight name in player naming - ttsplayername = string.match(groupname,"#([%a]+)") + local ttsplayername = nil + if not self.customcallsigns[playername] then + local playergroup = Client:GetGroup() + ttsplayername = playergroup:GetCustomCallSign(self.ShortCallsign,self.Keepnumber) + self.customcallsigns[playername] = ttsplayername + else + ttsplayername = self.customcallsigns[playername] end return playername, ttsplayername end @@ -1593,10 +1616,13 @@ function PLAYERTASKCONTROLLER:_EventHandler(EventData) modulation = UTILS.GetModulationName(modulation) local switchtext = self.gettext:GetEntry("BROADCAST",self.locale) - local playername = EventData.IniPlayerName - if string.find(playername,"|") then + local playername = EventData.IniPlayerName + if EventData.IniGroup then -- personalized flight name in player naming - playername = string.match(playername,"| ([%a]+)") + if self.customcallsigns[playername] then + self.customcallsigns[playername] = nil + end + playername = EventData.IniGroup:GetCustomCallSign(self.ShortCallsign,self.Keepnumber) end --local text = string.format("%s, %s, switch to %s for task assignment!",EventData.IniPlayerName,self.MenuName or self.Name,freqtext) local text = string.format(switchtext,self.MenuName or self.Name,playername,freqtext) @@ -1606,11 +1632,6 @@ function PLAYERTASKCONTROLLER:_EventHandler(EventData) return self end -function PLAYERTASKCONTROLLER:_DummyMenu(group) - self:T(self.lid.."_DummyMenu") - return self -end - --- [User] Set locale for localization. Defaults to "en" -- @param #PLAYERTASKCONTROLLER self -- @param #string Locale The locale to use @@ -1862,8 +1883,12 @@ function PLAYERTASKCONTROLLER:_CheckPrecisionTasks() local text = "" for _,playername in pairs(clients) do local pointertext = self.gettext:GetEntry("POINTEROVERTARGET",self.locale) + local ttsplayername = playername + if self.customcallsigns[playername] then + ttsplayername = self.customcallsigns[playername] + end --text = string.format("%s, %s, pointer over target for task %03d, lasing!", playername, self.MenuName or self.Name, task.PlayerTaskNr) - text = string.format(pointertext, playername, self.MenuName or self.Name, task.PlayerTaskNr) + text = string.format(pointertext, ttsplayername, self.MenuName or self.Name, task.PlayerTaskNr) if not self.NoScreenOutput then local client = nil self.ClientSet:ForEachClient( @@ -2344,9 +2369,10 @@ function PLAYERTASKCONTROLLER:_ActiveTaskInfo(Group, Client, Task) local clienttxt = self.gettext:GetEntry("PILOTS",self.locale) if clientcount > 0 then for _,_name in pairs(clientlist) do - if string.find(_name,"|") then + if self.customcallsigns[_name] then -- personalized flight name in player naming - _name = string.match(_name,"| ([%a]+)") + --_name = string.match(_name,"| ([%a]+)") + _name = self.customcallsigns[_name] end clienttxt = clienttxt .. _name .. ", " end @@ -2581,7 +2607,7 @@ function PLAYERTASKCONTROLLER:_BuildMenus(Client,enforced) if self:_CheckPlayerHasTask(playername) then playerhastask = true end local topmenu = nil - self:I("Playerhastask = "..tostring(playerhastask).." Enforced = "..tostring(enforced).." Join or Abort = "..tostring(joinorabort)) + self:T("Playerhastask = "..tostring(playerhastask).." Enforced = "..tostring(enforced).." Join or Abort = "..tostring(joinorabort)) -- Cases to rebuild menu -- 1) new player @@ -2599,7 +2625,7 @@ function PLAYERTASKCONTROLLER:_BuildMenus(Client,enforced) -- 4) last build > 30 secs? local T0 = timer.getAbsTime() local TDiff = T0-self.PlayerMenu[playername].MenuTag - self:I("TDiff = "..TDiff) + self:T("TDiff = "..TDiff) if TDiff >= self.holdmenutime then self.PlayerMenu[playername]:RemoveSubMenus() self.PlayerMenu[playername]:SetTag(timer.getAbsTime()) @@ -2965,7 +2991,7 @@ end -- @param #string To -- @return #PLAYERTASKCONTROLLER self function PLAYERTASKCONTROLLER:onafterStatus(From, Event, To) - self:I({From, Event, To}) + self:T({From, Event, To}) self:_CheckTargetQueue() self:_CheckTaskQueue() From 55f0f5271dd354938c1fd4c03bd0edf213f1679f Mon Sep 17 00:00:00 2001 From: Applevangelist Date: Tue, 13 Sep 2022 17:19:44 +0200 Subject: [PATCH 2/4] #PLAYERTASKCONTROLLER * Clean up menu builds --- Moose Development/Moose/Ops/PlayerTask.lua | 126 +++++++++++++-------- 1 file changed, 77 insertions(+), 49 deletions(-) diff --git a/Moose Development/Moose/Ops/PlayerTask.lua b/Moose Development/Moose/Ops/PlayerTask.lua index a7b875957..4dbc1899b 100644 --- a/Moose Development/Moose/Ops/PlayerTask.lua +++ b/Moose Development/Moose/Ops/PlayerTask.lua @@ -80,7 +80,7 @@ PLAYERTASK = { --- PLAYERTASK class version. -- @field #string version -PLAYERTASK.version="0.1.1" +PLAYERTASK.version="0.1.2" --- Generic task condition. -- @type PLAYERTASK.Condition @@ -110,7 +110,7 @@ function PLAYERTASK:New(Type, Target, Repeat, Times, TTSType) self.conditionSuccess = {} self.conditionFailure = {} self.TaskController = nil -- Ops.PlayerTask#PLAYERTASKCONTROLLER - self.timestamp = timer.getTime() + self.timestamp = timer.getAbsTime() self.TTSType = TTSType or "close air support" if Repeat then @@ -262,7 +262,7 @@ function PLAYERTASK:IsDone() return IsDone end ---- [User] Get clients assigned list as table +--- [User] Get client names assigned as table of #strings -- @param #PLAYERTASK self -- @return #table clients -- @return #number clientcount @@ -273,6 +273,17 @@ function PLAYERTASK:GetClients() return clientlist, count 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 -- @param #PLAYERTASK self -- @return #number clientcount @@ -548,6 +559,7 @@ end -- @return #PLAYERTASK self function PLAYERTASK:onafterPlanned(From, Event, To) self:T({From, Event, To}) + self.timestamp = timer.getAbsTime() return self end @@ -559,6 +571,7 @@ end -- @return #PLAYERTASK self function PLAYERTASK:onafterRequested(From, Event, To) self:T({From, Event, To}) + self.timestamp = timer.getAbsTime() return self end @@ -570,6 +583,7 @@ end -- @return #PLAYERTASK self function PLAYERTASK:onafterExecuting(From, Event, To) self:T({From, Event, To}) + self.timestamp = timer.getAbsTime() return self end @@ -581,6 +595,7 @@ end -- @return #PLAYERTASK self function PLAYERTASK:onafterStop(From, Event, To) self:T({From, Event, To}) + self.timestamp = timer.getAbsTime() return self 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) self:I(self.lid..text) end + self.timestamp = timer.getAbsTime() return self end @@ -611,6 +627,7 @@ function PLAYERTASK:onafterDone(From, Event, To) if self.TaskController then self.TaskController:__TaskDone(-1,self) end + self.timestamp = timer.getAbsTime() self:__Stop(-1) return self end @@ -626,6 +643,7 @@ function PLAYERTASK:onafterCancel(From, Event, To) if self.TaskController then self.TaskController:__TaskCancelled(-1,self) end + self.timestamp = timer.getAbsTime() self:__Done(-1) return self end @@ -644,6 +662,7 @@ function PLAYERTASK:onafterSuccess(From, Event, To) if self.TargetMarker then self.TargetMarker:Remove() end + self.timestamp = timer.getAbsTime() self:__Done(-1) return self end @@ -673,6 +692,7 @@ function PLAYERTASK:onafterFailed(From, Event, To) end self:__Done(-1) end + self.timestamp = timer.getAbsTime() return self end ------------------------------------------------------------------------------------------------------------------- @@ -730,6 +750,10 @@ do -- @field #table customcallsigns -- @field #boolean ShortCallsign -- @field #boolean Keepnumber +-- @field #table CallsignTranslations +-- @field #table PlayerFlashMenu +-- @field #table PlayerJoinMenu +-- @field #table PlayerInfoMenu -- @extends Core.Fsm#FSM --- @@ -1026,7 +1050,11 @@ PLAYERTASKCONTROLLER = { MarkerReadOnly = false, customcallsigns = {}, ShortCallsign = true, - Keepnumber = false, + Keepnumber = false, + CallsignTranslations = nil, + PlayerFlashMenu = {}, + PlayerJoinMenu = {}, + PlayerInfoMenu = {}, } --- @@ -1185,7 +1213,7 @@ PLAYERTASKCONTROLLER.Messages = { --- PLAYERTASK class version. -- @field #string version -PLAYERTASKCONTROLLER.version="0.1.33" +PLAYERTASKCONTROLLER.version="0.1.35" --- Constructor -- @param #PLAYERTASKCONTROLLER self @@ -1238,6 +1266,7 @@ function PLAYERTASKCONTROLLER:New(Name, Coalition, Type, ClientFilter) self.customcallsigns = {} self.ShortCallsign = true self.Keepnumber = false + self.CallsignTranslations = nil if ClientFilter then self.ClientSet = SET_CLIENT:New():FilterCoalitions(string.lower(self.CoalitionName)):FilterActive(true):FilterPrefixes(ClientFilter):FilterStart() @@ -1363,18 +1392,20 @@ end -- @param #PLAYERTASKCONTROLLER self -- @param #boolean ShortCallsign If true, only call out the major flight number -- @param #boolean Keepnumber If true, keep the **customized callsign** in the #GROUP name as-is, no amendments or numbers. +-- @param #table CallsignTranslations (optional) Table to translate between DCS standard callsigns and bespoke ones. Does not apply if using customized +-- callsigns from playername or group name. -- @return #PLAYERTASKCONTROLLER self -function PLAYERTASKCONTROLLER:SetCallSignOptions(ShortCallsign,Keepnumber) +function PLAYERTASKCONTROLLER:SetCallSignOptions(ShortCallsign,Keepnumber,CallsignTranslations) if not ShortCallsign or ShortCallsign == false then self.ShortCallsign = false else self.ShortCallsign = true end self.Keepnumber = Keepnumber or false + self.CallsignTranslations = CallsignTranslations return self end - --- [User] Set repetition options for tasks -- @param #PLAYERTASKCONTROLLER self -- @param #boolean OnOff Set to `true` to switch on and `false` to switch off (defaults to true) @@ -1499,7 +1530,7 @@ function PLAYERTASKCONTROLLER:_GetPlayerName(Client) local ttsplayername = nil if not self.customcallsigns[playername] then local playergroup = Client:GetGroup() - ttsplayername = playergroup:GetCustomCallSign(self.ShortCallsign,self.Keepnumber) + ttsplayername = playergroup:GetCustomCallSign(self.ShortCallsign,self.Keepnumber,self.CallsignTranslations) self.customcallsigns[playername] = ttsplayername else ttsplayername = self.customcallsigns[playername] @@ -1729,7 +1760,9 @@ function PLAYERTASKCONTROLLER:_GetTasksPerType() for _,_task in pairs(datatable) do local task = _task -- Ops.PlayerTask#PLAYERTASK local threat = task.Target:GetThreatLevelMax() - threattable[#threattable+1]={task=task,threat=threat} + if not task:IsDone() then + threattable[#threattable+1]={task=task,threat=threat} + end end table.sort(threattable, function (k1, k2) return k1.threat > k2.threat end ) @@ -1778,8 +1811,11 @@ function PLAYERTASKCONTROLLER:_CheckTaskQueue() self:T("*****Removing player " .. _id) self.TasksPerPlayer:PullByID(_id) end - local task = self.TaskQueue:PullByID(_id) -- Ops.PlayerTask#PLAYERTASK - task = nil + local TNow = timer.getAbsTime() + if TNow - task.timestamp > 10 then + local task = self.TaskQueue:PullByID(_id) -- Ops.PlayerTask#PLAYERTASK + task = nil + end end end end @@ -2529,13 +2565,16 @@ end -- @param Core.Menu#MENU_BASE topmenu -- @param #table tasktypes -- @param #table taskpertype --- @return #PLAYERTASKCONTROLLER self +-- @return #table taskinfomenu function PLAYERTASKCONTROLLER:_BuildTaskInfoMenu(group,client,playername,topmenu,tasktypes,taskpertype) + self:T(self.lid.."_BuildTaskInfoMenu") + local taskinfomenu = nil if self.taskinfomenu then local menutaskinfo = self.gettext:GetEntry("MENUTASKINFO",self.locale) + local taskinfomenu = MENU_GROUP_DELAYED:New(group,menutaskinfo,topmenu) 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 {} @@ -2568,19 +2607,21 @@ function PLAYERTASKCONTROLLER:_BuildTaskInfoMenu(group,client,playername,topmenu end end end - return self + return taskinfomenu end --- [Internal] Build client menus -- @param #PLAYERTASKCONTROLLER self -- @param Wrapper.Client#CLIENT Client (optional) build for this client name only -- @param #boolean enforced +-- @param #boolean fromsuccess -- @return #PLAYERTASKCONTROLLER self -function PLAYERTASKCONTROLLER:_BuildMenus(Client,enforced) +function PLAYERTASKCONTROLLER:_BuildMenus(Client,enforced,fromsuccess) self:T(self.lid.."_BuildMenus") local clients = self.ClientSet:GetAliveSet() local joinorabort = false + local timedbuild = false if Client then -- client + enforced -- join task or abort @@ -2604,7 +2645,7 @@ function PLAYERTASKCONTROLLER:_BuildMenus(Client,enforced) local menuname = self.MenuName or longname 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 self:T("Playerhastask = "..tostring(playerhastask).." Enforced = "..tostring(enforced).." Join or Abort = "..tostring(joinorabort)) @@ -2621,14 +2662,15 @@ function PLAYERTASKCONTROLLER:_BuildMenus(Client,enforced) self.PlayerMenu[playername]:RemoveSubMenus() self.PlayerMenu[playername]:SetTag(timer.getAbsTime()) topmenu = self.PlayerMenu[playername] - elseif (not playerhastask) and enforced then + elseif (not playerhastask) or enforced then -- 4) last build > 30 secs? local T0 = timer.getAbsTime() local TDiff = T0-self.PlayerMenu[playername].MenuTag - self:T("TDiff = "..TDiff) + self:T("TDiff = "..string.format("%.2d",TDiff)) if TDiff >= self.holdmenutime then self.PlayerMenu[playername]:RemoveSubMenus() self.PlayerMenu[playername]:SetTag(timer.getAbsTime()) + timedbuild = true end topmenu = self.PlayerMenu[playername] end @@ -2639,36 +2681,11 @@ function PLAYERTASKCONTROLLER:_BuildMenus(Client,enforced) 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 - 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 --- if playerhastask and enforced then - + --self:T("Building Active Task Menus for "..playername) local menuactive = self.gettext:GetEntry("MENUACTIVE",self.locale) local menuinfo = self.gettext:GetEntry("MENUINFO",self.locale) local menumark = self.gettext:GetEntry("MENUMARK",self.locale) @@ -2685,14 +2702,17 @@ function PLAYERTASKCONTROLLER:_BuildMenus(Client,enforced) local flare = MENU_GROUP_COMMAND_DELAYED:New(group,menuflare,active,self._FlareTask,self,group,client) end local abort = MENU_GROUP_COMMAND_DELAYED:New(group,menuabort,active,self._AbortTask,self,group,client) - if self.activehasinfomenu and self.taskinfomenu then + --self:T("Building Active-Info Menus for "..playername) local tasktypes = self:_GetAvailableTaskTypes() local taskpertype = self:_GetTasksPerType() - self:_BuildTaskInfoMenu(group,client,playername,topmenu,tasktypes,taskpertype) + if self.PlayerInfoMenu[playername] then + self.PlayerInfoMenu[playername]:RemoveSubMenus() + end + self.PlayerInfoMenu[playername] = 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 and (timedbuild or joinorabort)) then + --self:T("Building Join Menus for "..playername) --- -- JOIN TASK MENU --- @@ -2734,7 +2754,11 @@ function PLAYERTASKCONTROLLER:_BuildMenus(Client,enforced) end end 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 elseif self.TaskQueue:Count() == 0 then -- no tasks (yet) @@ -3082,6 +3106,10 @@ function PLAYERTASKCONTROLLER:onafterTaskSuccess(From, Event, To, Task) taskname = string.format(succtxttts, self.MenuName or self.Name, Task.PlayerTaskNr, tostring(Task.TTSType)) self.SRSQueue:NewTransmission(taskname,nil,self.SRS,nil,2) end + local clients=Task:GetClientObjects() + for _,client in pairs(clients) do + self:_BuildMenus(client,true,true) + end return self end From f281e5aa956b1f489bf54ceed56bcc0f3fd65209 Mon Sep 17 00:00:00 2001 From: Applevangelist Date: Wed, 14 Sep 2022 18:06:36 +0200 Subject: [PATCH 3/4] #AWACS * Align CallSign Generation --- Moose Development/Moose/Ops/Awacs.lua | 104 +++++++------------------- 1 file changed, 25 insertions(+), 79 deletions(-) diff --git a/Moose Development/Moose/Ops/Awacs.lua b/Moose Development/Moose/Ops/Awacs.lua index 617cff753..451d35f8f 100644 --- a/Moose Development/Moose/Ops/Awacs.lua +++ b/Moose Development/Moose/Ops/Awacs.lua @@ -91,6 +91,8 @@ do -- @field #boolean PlayerGuidance if true additional callouts to guide/warn players -- @field #boolean ModernEra if true we get more intel on targets, and EPLR on the AIC -- @field #boolean callsignshort if true use short (group) callsigns, e.g. "Ghost 1", else "Ghost 1 1" +-- @field #boolean keepnumber if true, use the full string after # for a player custom callsign +-- @field #table callsignTranslations optional translations for callsigns -- @field #number MeldDistance 25nm - distance for "Meld" Call , usually shortly before the actual engagement -- @field #number TacDistance 30nm - distance for "TAC" Call -- @field #number ThreatDistance 15nm - distance to declare untargeted (new) threats @@ -561,6 +563,8 @@ AWACS = { PlayerGuidance = true, ModernEra = true, callsignshort = true, + keepnumber = true, + callsignTranslations = nil, TacDistance = 45, MeldDistance = 35, ThreatDistance = 25, @@ -2222,39 +2226,29 @@ function AWACS:_GetCallSign(Group,GID, IsPlayer) local callsign = "Ghost 1" if Group and Group:IsAlive() then - local shortcallsign = Group:GetCallsign() or "unknown11"-- e.g.Uzi11, but we want Uzi 1 1 - local callsignroot = string.match(shortcallsign, '(%a+)') - self:I("CallSign = " .. callsignroot) - local groupname = Group:GetName() - local callnumber = string.match(shortcallsign, "(%d+)$" ) or "unknown11" - local callnumbermajor = string.char(string.byte(callnumber,1)) - local callnumberminor = string.char(string.byte(callnumber,2)) - local personalized = false - if IsPlayer and string.find(groupname,"#") then - -- personalized flight name in group naming - shortcallsign = string.match(groupname,"#([%a]+)") - personalized = true - end - if IsPlayer and string.find(Group:GetPlayerName(),"|") then - -- personalized flight name in group naming - shortcallsign = string.match(Group:GetPlayerName(),"| ([%a]+)") - personalized = true - end - if (not personalized) and self.callsignTranslations and self.callsignTranslations[callsignroot] then - shortcallsign = string.gsub(shortcallsign, callsignroot, self.callsignTranslations[callsignroot]) - end - - if self.callsignshort then - callsign = string.gsub(shortcallsign,callnumber,"").." "..callnumbermajor - else - callsign = string.gsub(shortcallsign,callnumber,"").." "..callnumbermajor.." "..callnumberminor - end - self:T("Generated Callsign for TTS = " .. callsign) - end - + callsign = Group:GetCustomCallSign(self.callsignshort,self.keepnumber,self.callsignTranslations) + end return callsign end +--- [User] Set player callsign options for TTS output. See @{Wrapper.Group#GROUP.GetCustomCallSign}() on how to set customized callsigns. +-- @param #AWACS self +-- @param #boolean ShortCallsign If true, only call out the major flight number +-- @param #boolean Keepnumber If true, keep the **customized callsign** in the #GROUP name as-is, no amendments or numbers. +-- @param #table CallsignTranslations (optional) Table to translate between DCS standard callsigns and bespoke ones. Does not apply if using customized +-- callsigns from playername or group name. +-- @return #AWACS self +function AWACS:SetCallSignOptions(ShortCallsign,Keepnumber,CallsignTranslations) + if not ShortCallsign or ShortCallsign == false then + self.callsignshort = false + else + self.callsignshort = true + end + self.keepnumber = Keepnumber or false + self.callsignTranslations = CallsignTranslations + return self +end + --- [Internal] Update contact from cluster data -- @param #AWACS self -- @param #number CID Contact ID @@ -4303,55 +4297,7 @@ function AWACS:_ReadAssignedGroupFromTID(TaskID) end return nil end - ---- [Internal] Create new idle task from contact to pick up later --- @param #AWACS self --- @param #string Description Task Type --- @param #table Object Object of TARGET --- @param Ops.Intelligence#INTEL.Contact Contact --- @return #AWACS self -function AWACS:_CreateIdleTaskForContact(Description,Object,Contact) - self:T(self.lid.."_CreateIdleTaskForContact "..Description) - local task = {} -- #AWACS.ManagedTask - self.ManagedTaskID = self.ManagedTaskID + 1 - task.TID = self.ManagedTaskID - task.AssignedGroupID = 0 - task.Status = AWACS.TaskStatus.IDLE - task.ToDo = Description - task.Target = TARGET:New(Object) - task.Contact = Contact - task.ScreenText = Description - if Description == AWACS.TaskDescription.ANCHOR or Description == AWACS.TaskDescription.REANCHOR then - task.Target.Type = TARGET.ObjectType.ZONE - end - self.ManagedTasks:Push(task,task.TID) - return self -end - ---- [Internal] Create new idle task from cluster to pick up later --- @param #AWACS self --- @param #string Description Task Type --- @param #table Object Object of TARGET --- @param Ops.Intelligence#INTEL.Cluster Cluster --- @return #AWACS self -function AWACS:_CreateIdleTaskForCluster(Description,Object,Cluster) - self:T(self.lid.."_CreateIdleTaskForCluster "..Description) - local task = {} -- #AWACS.ManagedTask - self.ManagedTaskID = self.ManagedTaskID + 1 - task.TID = self.ManagedTaskID - task.AssignedGroupID = 0 - task.Status = AWACS.TaskStatus.IDLE - task.ToDo = Description - task.Target = TARGET:New(self.intel:GetClusterCoordinate(Cluster)) - task.Cluster = Cluster - task.ScreenText = Description - if Description == AWACS.TaskDescription.ANCHOR or Description == AWACS.TaskDescription.REANCHOR then - task.Target.Type = TARGET.ObjectType.ZONE - end - self.ManagedTasks:Push(task,task.TID) - return self -end - + --- [Internal] Create radio entry to tell players that CAP is on station in Anchor -- @param #AWACS self -- @param #number GID Group ID From 785c5e66ec874b90412f9b0f6a4ab8a1775a7556 Mon Sep 17 00:00:00 2001 From: Applevangelist Date: Wed, 14 Sep 2022 18:07:53 +0200 Subject: [PATCH 4/4] bump number --- Moose Development/Moose/Ops/Awacs.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Moose Development/Moose/Ops/Awacs.lua b/Moose Development/Moose/Ops/Awacs.lua index 451d35f8f..471301b5e 100644 --- a/Moose Development/Moose/Ops/Awacs.lua +++ b/Moose Development/Moose/Ops/Awacs.lua @@ -497,7 +497,7 @@ do -- @field #AWACS AWACS = { ClassName = "AWACS", -- #string - version = "0.2.42", -- #string + version = "0.2.43", -- #string lid = "", -- #string coalition = coalition.side.BLUE, -- #number coalitiontxt = "blue", -- #string