#PLAYERTASK

* Added option to whitelist task types
* Added localization. Contains "en" and "de" texts and tts texts
This commit is contained in:
Applevangelist 2022-08-17 15:38:20 +02:00
parent 0166b53e21
commit c38a737421

View File

@ -683,6 +683,10 @@ end
-- @field #string MenuName -- @field #string MenuName
-- @field #boolean NoScreenOutput -- @field #boolean NoScreenOutput
-- @field #number TargetRadius -- @field #number TargetRadius
-- @field #boolean UseWhiteList
-- @field #table WhiteList
-- @field Core.TextAndSound#TEXTANDSOUND gettext
-- @field #string locale
-- --
@ -701,6 +705,10 @@ PLAYERTASKCONTROLLER = {
ClusterRadius = 1250, ClusterRadius = 1250,
NoScreenOutput = false, NoScreenOutput = false,
TargetRadius = 500, TargetRadius = 500,
UseWhiteList = false,
WhiteList = {},
gettext = nil,
locale = "en",
} }
--- ---
@ -711,9 +719,112 @@ PLAYERTASKCONTROLLER.Type = {
["A2S"] = "Air-To-Sea", ["A2S"] = "Air-To-Sea",
} }
---
-- @field Messages
PLAYERTASKCONTROLLER.Messages = {
EN = {
TASKABORT = "Task aborted!",
NOACTIVETASK = "No active task!",
FREQUENCIES = "frequencies ",
FREQUENCY = "frequency %.3f",
BROADCAST = "%s, %s, switch to %s for task assignment!",
CASTTS = "close air support",
SEADTTS = "suppress air defense",
BOMBTTS = "bombing",
BAITTS = "battle field air interdiction",
ANTISHIPTTS = "anti-ship",
INTERCEPTTS = "intercept",
BOMBRUNWAYTTS = "bomb runway",
HAVEACTIVETASK = "You already have one active task! Complete it first!",
PILOTJOINEDTASK = "%s, pilot %s joined task %03d",
TASKNAME = "%s Task ID %03d",
TASKNAMETTS = "%s Task ID %03d",
THREATHIGH = "high",
THREATMEDIUM = "medium",
THREATLOW = "low",
THREATTEXT = "%s\nThreat: %s\nTargets left: %d\nCoord: %s",
THREATTEXTTTS = "%s, %s. Target information for %s. Threat level %s. Targets left %d. Target location %s.",
MARKTASK = "%s, copy pilot %s, task %03d location marked on map!",
SMOKETASK = "%s, copy pilot %s, task %03d location smoked!",
FLARETASK = "%s, copy pilot %s, task %03d location illuminated!",
ABORTTASK = "%s, all stations, pilot %s aborted task %03d!",
UNKNOWN = "Unknown",
MENUTASKING = " Tasking ",
MENUACTIVE = "Active Task",
MENUINFO = "Info",
MENUMARK = "Mark on map",
MENUSMOKE = "Smoke",
MENUFLARE = "Flare",
MENUABORT = "Abort",
MENUJOIN = "Join Task",
MENUTASKNO = "TaskNo",
MENUNOTASKS = "Currently no tasks available.",
TASKCANCELLED = "Task #%03d %s is cancelled!",
TASKCANCELLEDTTS = "%s, task %03d %s is cancelled!",
TASKSUCCESS = "Task #%03d %s completed successfully!",
TASKSUCCESSTTS = "%s, task %03d %s completed successfully!",
TASKFAILED = "Task #%03d %s was a failure!",
TASKFAILEDTTS = "%s, task %03d %s was a failure!",
TASKFAILEDREPLAN = "Task #%03d %s was a failure! Replanning!",
TASKFAILEDREPLANTTS = "%s, task %03d %s was a failure! Replanning!",
TASKADDED = "%s has a new task %s",
PILOTS = "\nPilot(s): ",
PILOTSTTS = ". Pilot(s): ",
},
DE = {
TASKABORT = "Auftrag abgebrochen!",
NOACTIVETASK = "Kein aktiver Auftrag!",
FREQUENCIES = "Frequenzen ",
FREQUENCY = "Frequenz %.3f",
BROADCAST = "%s, %s, Radio %s für Aufgabenzuteilung!",
CASTTS = "Nahbereichsunterstützung",
SEADTTS = "Luftabwehr ausschalten",
BOMBTTS = "Bombardieren",
BAITTS = "Luftunterstützung",
ANTISHIPTTS = "Anti-Schiff",
INTERCEPTTS = "Abfangen",
BOMBRUNWAYTTS = "Startbahn Bombardieren",
HAVEACTIVETASK = "Du hast einen aktiven Auftrag! Beende ihn zuerst!",
PILOTJOINEDTASK = "%s, Pilot %s hat Auftrag %03d angenommen",
TASKNAME = "%s Auftrag ID %03d",
TASKNAMETTS = "%s Auftrag ID %03d",
THREATHIGH = "hoch",
THREATMEDIUM = "mittel",
THREATLOW = "niedrig",
THREATTEXT = "%s\nGefahrstufe: %s\nZiele: %d\nKoord: %s",
THREATTEXTTTS = "%s, %s. Zielinformation zu %s. Gefahrstufe %s. Ziele %d. Zielposition %s.",
MARKTASK = "%s, verstanden Pilot %s, Auftrag %03d auf der Karte markiert!",
SMOKETASK = "%s, verstanden Pilot %s, Auftrag %03d mit Rauch markiert!",
FLARETASK = "%s, verstanden Pilot %s, Auftrag %03d beleuchtet!",
ABORTTASK = "%s, an alle, Pilot %s hat Auftrag %03d abgebrochen!",
UNKNOWN = "Unbekannt",
MENUTASKING = " Aufträge ",
MENUACTIVE = "Aktiver Auftrag",
MENUINFO = "Information",
MENUMARK = "Kartenmarkierung",
MENUSMOKE = "Rauchgranate",
MENUFLARE = "Leuchtgranate",
MENUABORT = "Abbrechen",
MENUJOIN = "Auftrag annehmen",
MENUTASKNO = "AuftragsNr",
MENUNOTASKS = "Momentan keine Aufträge verfügbar.",
TASKCANCELLED = "Auftrag #%03d %s wurde beendet!",
TASKCANCELLEDTTS = "%s, Auftrag %03d %s wurde beendet!",
TASKSUCCESS = "Auftrag #%03d %s erfolgreich!",
TASKSUCCESSTTS = "%s, Auftrag %03d %s erfolgreich!",
TASKFAILED = "Auftrag #%03d %s gescheitert!",
TASKFAILEDTTS = "%s, Auftrag %03d %s gescheitert!",
TASKFAILEDREPLAN = "Auftrag #%03d %s gescheitert! Neuplanung!",
TASKFAILEDREPLANTTS = "%s, Auftrag %03d %s gescheitert! Neuplanung!",
TASKADDED = "%s hat einen neuen Auftrag %s",
PILOTS = "\nPilot(en): ",
PILOTSTTS = ". Pilot(en): ",
},
}
--- PLAYERTASK class version. --- PLAYERTASK class version.
-- @field #string version -- @field #string version
PLAYERTASKCONTROLLER.version="0.0.12" PLAYERTASKCONTROLLER.version="0.1.14"
--- Constructor --- Constructor
-- @param #PLAYERTASKCONTROLLER self -- @param #PLAYERTASKCONTROLLER self
@ -761,6 +872,8 @@ function PLAYERTASKCONTROLLER:New(Name, Coalition, Type, ClientFilter)
self.lid=string.format("PlayerTaskController %s %s | ", self.Name, tostring(self.Type)) self.lid=string.format("PlayerTaskController %s %s | ", self.Name, tostring(self.Type))
self:_InitLocalization()
-- FSM start state is STOPPED. -- FSM start state is STOPPED.
self:SetStartState("Stopped") self:SetStartState("Stopped")
@ -784,7 +897,7 @@ function PLAYERTASKCONTROLLER:New(Name, Coalition, Type, ClientFilter)
self:HandleEvent(EVENTS.PilotDead, self._EventHandler) self:HandleEvent(EVENTS.PilotDead, self._EventHandler)
self:HandleEvent(EVENTS.PlayerEnterAircraft, self._EventHandler) self:HandleEvent(EVENTS.PlayerEnterAircraft, self._EventHandler)
self:I(self.lid.."Started.") self:I(self.lid..self.version.." Started.")
return self return self
@ -842,6 +955,21 @@ function PLAYERTASKCONTROLLER:New(Name, Coalition, Type, ClientFilter)
end end
function PLAYERTASKCONTROLLER:_InitLocalization()
self:T(self.lid.."_InitLocalization")
self.gettext = TEXTANDSOUND:New("PLAYERTASKCONTROLLER","en") -- Core.TextAndSound#TEXTANDSOUND
self.locale = "en"
for locale,table in pairs(self.Messages) do
local Locale = string.lower(tostring(locale))
self:T("**** Adding locale: "..Locale)
for ID,Text in pairs(table) do
self:T(string.format('Adding ID %s',tostring(ID)))
self.gettext:AddEntry(Locale,tostring(ID),Text)
end
end
return self
end
--- [internal] Event handling --- [internal] Event handling
-- @param #PLAYERTASKCONTROLLER self -- @param #PLAYERTASKCONTROLLER self
-- @param Core.Event#EVENTDATA EventData -- @param Core.Event#EVENTDATA EventData
@ -861,10 +989,12 @@ function PLAYERTASKCONTROLLER:_EventHandler(EventData)
local Client = _DATABASE:FindClient( EventData.IniPlayerName ) local Client = _DATABASE:FindClient( EventData.IniPlayerName )
if Client then if Client then
task:RemoveClient(Client) task:RemoveClient(Client)
text = "Task aborted!" --text = "Task aborted!"
text = self.gettext:GetEntry("TASKABORT",self.locale)
end end
else else
text = "No active task!" --text = "No active task!"
text = self.gettext:GetEntry("NOACTIVETASK",self.locale)
end end
self:T(self.lid..text) self:T(self.lid..text)
end end
@ -874,14 +1004,18 @@ function PLAYERTASKCONTROLLER:_EventHandler(EventData)
local frequency = self.Frequency local frequency = self.Frequency
local freqtext = "" local freqtext = ""
if type(frequency) == "table" then if type(frequency) == "table" then
freqtext = "frequencies "..table.concat(frequency,", ") freqtext = self.gettext:GetEntry("FREQUENCIES",self.locale)
freqtext = freqtext..table.concat(frequency,", ")
else else
freqtext = string.format("frequency %.3f",frequency) local freqt = self.gettext:GetEntry("FREQUENCY",self.locale)
freqtext = string.format(freqt,frequency)
end end
local modulation = self.Modulation local modulation = self.Modulation
if type(modulation) == "table" then modulation = modulation[1] end if type(modulation) == "table" then modulation = modulation[1] end
modulation = UTILS.GetModulationName(modulation) modulation = UTILS.GetModulationName(modulation)
local text = string.format("%s, %s, switch to %s for task assignment!",EventData.IniPlayerName,self.MenuName or self.Name,freqtext) local switchtext = self.gettext:GetEntry("BROADCAST",self.locale)
--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,EventData.IniPlayerName,freqtext)
self.SRSQueue:NewTransmission(text,nil,self.SRS,timer.getAbsTime()+60,2,{EventData.IniGroup},text,30,self.BCFrequency,self.BCModulation) self.SRSQueue:NewTransmission(text,nil,self.SRS,timer.getAbsTime()+60,2,{EventData.IniGroup},text,30,self.BCFrequency,self.BCModulation)
end end
end end
@ -893,6 +1027,16 @@ function PLAYERTASKCONTROLLER:_DummyMenu(group)
return self return self
end end
--- [User] Set locale for localization. Defaults to "en"
-- @param #PLAYERTASKCONTROLLER self
-- @param #string Locale The locale to use
-- @return #PLAYERTASKCONTROLLER self
function PLAYERTASKCONTROLLER:SetLocale(Locale)
self:T(self.lid.."SetLocale")
self.locale = Locale or "en"
return self
end
--- [User] Switch screen output. --- [User] Switch screen output.
-- @param #PLAYERTASKCONTROLLER self -- @param #PLAYERTASKCONTROLLER self
-- @param #boolean OnOff. Switch screen output off (true) or on (false) -- @param #boolean OnOff. Switch screen output off (true) or on (false)
@ -1056,6 +1200,45 @@ function PLAYERTASKCONTROLLER:AddTarget(Target)
return self return self
end end
--- [Internal] Check for allowed task type, if there is a (positive) whitelist
-- @param #PLAYERTASKCONTROLLER self
-- @param #string Type
-- @return #boolean Outcome
function PLAYERTASKCONTROLLER:_CheckTaskTypeAllowed(Type)
self:T(self.lid.."_CheckTaskTypeAllowed")
local Outcome = false
if self.UseWhiteList then
for _,_type in pairs(self.WhiteList) do
if Type == _type then
Outcome = true
break
end
end
else
return true
end
return Outcome
end
--- [User] Set up a (positive) whitelist of allowed task types. Only these types will be generated.
-- @param #PLAYERTASKCONTROLLER self
-- @param #table WhiteList Table of task types that can be generated. Use to restrict available types.
-- @return #PLAYERTASKCONTROLLER self
-- @usage Currently, the following task types will be generated, if detection has been set up:
-- A2A - AUFTRAG.Type.INTERCEPT
-- A2S - AUFTRAG.Type.ANTISHIP
-- A2G - AUFTRAG.Type.CAS, AUFTRAG.Type.BAI, AUFTRAG.Type.SEAD, AUFTRAG.Type.BOMBING, AUFTRAG.Type.BOMBRUNWAY
-- If you don't want SEAD tasks generated, use as follows:
--
-- `mycontroller:SetTaskWhiteList(AUFTRAG.Type.CAS, AUFTRAG.Type.BAI, AUFTRAG.Type.BOMBING, AUFTRAG.Type.BOMBRUNWAY)`
--
function PLAYERTASKCONTROLLER:SetTaskWhiteList(WhiteList)
self:T(self.lid.."SetTaskWhiteList")
self.WhiteList = WhiteList
self.UseWhiteList = true
return self
end
--- [Internal] Add a task to the task queue --- [Internal] Add a task to the task queue
-- @param #PLAYERTASKCONTROLLER self -- @param #PLAYERTASKCONTROLLER self
-- @param Ops.Target#TARGET Target -- @param Ops.Target#TARGET Target
@ -1064,7 +1247,8 @@ function PLAYERTASKCONTROLLER:_AddTask(Target)
self:T(self.lid.."_AddTask") self:T(self.lid.."_AddTask")
local cat = Target:GetCategory() local cat = Target:GetCategory()
local type = AUFTRAG.Type.CAS local type = AUFTRAG.Type.CAS
local ttstype = "close air support" --local ttstype = "close air support"
local ttstype = self.gettext:GetEntry("CASTTS",self.locale)
if cat == TARGET.Category.GROUND then if cat == TARGET.Category.GROUND then
type = AUFTRAG.Type.CAS type = AUFTRAG.Type.CAS
@ -1074,23 +1258,26 @@ function PLAYERTASKCONTROLLER:_AddTask(Target)
self:T("SEAD Check UNIT") self:T("SEAD Check UNIT")
if targetobject:HasSEAD() then if targetobject:HasSEAD() then
type = AUFTRAG.Type.SEAD type = AUFTRAG.Type.SEAD
ttstype = "suppress air defense" --ttstype = "suppress air defense"
ttstype = self.gettext:GetEntry("SEADTTS",self.locale)
end end
elseif targetobject:IsInstanceOf("GROUP") then elseif targetobject:IsInstanceOf("GROUP") then
self:T("SEAD Check GROUP") self:T("SEAD Check GROUP")
local attribute = targetobject:GetAttribute() local attribute = targetobject:GetAttribute()
if attribute == GROUP.Attribute.GROUND_SAM or attribute == GROUP.Attribute.GROUND_AAA then if attribute == GROUP.Attribute.GROUND_SAM or attribute == GROUP.Attribute.GROUND_AAA or attribute == GROUP.Attribute.GROUND_EWR then
type = AUFTRAG.Type.SEAD type = AUFTRAG.Type.SEAD
ttstype = "suppress air defense" --ttstype = "suppress air defense"
ttstype = self.gettext:GetEntry("SEADTTS",self.locale)
end end
elseif targetobject:IsInstanceOf("SET_GROUP") then elseif targetobject:IsInstanceOf("SET_GROUP") then
self:T("SEAD Check SET_GROUP") self:T("SEAD Check SET_GROUP")
targetobject:ForEachGroup( targetobject:ForEachGroup(
function (group) function (group)
local attribute = group:GetAttribute() local attribute = group:GetAttribute()
if attribute == GROUP.Attribute.GROUND_SAM or attribute == GROUP.Attribute.GROUND_AAA then if attribute == GROUP.Attribute.GROUND_SAM or attribute == GROUP.Attribute.GROUND_AAA or attribute == GROUP.Attribute.GROUND_EWR then
type = AUFTRAG.Type.SEAD type = AUFTRAG.Type.SEAD
ttstype = "suppress air defense" --ttstype = "suppress air defense"
ttstype = self.gettext:GetEntry("SEADTTS",self.locale)
end end
end end
) )
@ -1100,14 +1287,16 @@ function PLAYERTASKCONTROLLER:_AddTask(Target)
function (unit) function (unit)
if unit:HasSEAD() then if unit:HasSEAD() then
type = AUFTRAG.Type.SEAD type = AUFTRAG.Type.SEAD
ttstype = "suppress air defenses" --ttstype = "suppress air defenses"
ttstype = self.gettext:GetEntry("SEADTTS",self.locale)
end end
end end
) )
elseif targetobject:IsInstanceOf("SET_STATIC") or targetobject:IsInstanceOf("STATIC") then elseif targetobject:IsInstanceOf("SET_STATIC") or targetobject:IsInstanceOf("STATIC") then
self:T("BOMBING SET_STATIC or STATIC") self:T("BOMBING SET_STATIC or STATIC")
type = AUFTRAG.Type.BOMBING type = AUFTRAG.Type.BOMBING
ttstype = "bombing" --ttstype = "bombing"
ttstype = self.gettext:GetEntry("BOMBTTS",self.locale)
end end
-- if there are no friendlies nearby ~0.5km and task isn't SEAD, then it's BAI -- if there are no friendlies nearby ~0.5km and task isn't SEAD, then it's BAI
local targetcoord = Target:GetCoordinate() local targetcoord = Target:GetCoordinate()
@ -1121,19 +1310,23 @@ function PLAYERTASKCONTROLLER:_AddTask(Target)
local friendlyset = SET_GROUP:New():FilterCategoryGround():FilterCoalitions(filtercoalition):FilterZones({targetzone}):FilterOnce() local friendlyset = SET_GROUP:New():FilterCategoryGround():FilterCoalitions(filtercoalition):FilterZones({targetzone}):FilterOnce()
if friendlyset:Count() == 0 and type == AUFTRAG.Type.CAS then if friendlyset:Count() == 0 and type == AUFTRAG.Type.CAS then
type = AUFTRAG.Type.BAI type = AUFTRAG.Type.BAI
ttstype = "battle field air interdiction" --ttstype = "battle field air interdiction"
ttstype = self.gettext:GetEntry("BAITTS",self.locale)
end end
elseif cat == TARGET.Category.NAVAL then elseif cat == TARGET.Category.NAVAL then
type = AUFTRAG.Type.ANTISHIP type = AUFTRAG.Type.ANTISHIP
ttstype = "anti-ship" --ttstype = "anti-ship"
ttstype = self.gettext:GetEntry("ANTISHIPTTS",self.locale)
elseif cat == TARGET.Category.AIRCRAFT then elseif cat == TARGET.Category.AIRCRAFT then
type = AUFTRAG.Type.INTERCEPT type = AUFTRAG.Type.INTERCEPT
ttstype = "intercept" --ttstype = "intercept"
ttstype = self.gettext:GetEntry("INTERCEPTTS",self.locale)
elseif cat == TARGET.Category.AIRBASE then elseif cat == TARGET.Category.AIRBASE then
--TODO: Define Success Criteria, AB hit? Runway blocked, how to determine? change of coalition? Void of enemies? --TODO: Define Success Criteria, AB hit? Runway blocked, how to determine? change of coalition? Void of enemies?
-- Current implementation - bombing in AFB zone (EVENTS.Shot) -- Current implementation - bombing in AFB zone (EVENTS.Shot)
type = AUFTRAG.Type.BOMBRUNWAY type = AUFTRAG.Type.BOMBRUNWAY
ttstype = "bomb runway" -- ttstype = "bomb runway"
ttstype = self.gettext:GetEntry("BOMBRUNWAYTTS",self.locale)
elseif cat == TARGET.Category.COORDINATE or cat == TARGET.Category.ZONE then elseif cat == TARGET.Category.COORDINATE or cat == TARGET.Category.ZONE then
--TODO: Define Success Criteria, void of enemies? --TODO: Define Success Criteria, void of enemies?
-- Current implementation - find SET of enemies in ZONE or 500m radius around coordinate, and assign as targets -- Current implementation - find SET of enemies in ZONE or 500m radius around coordinate, and assign as targets
@ -1156,6 +1349,12 @@ function PLAYERTASKCONTROLLER:_AddTask(Target)
return self return self
end end
if self.UseWhiteList then
if not self:_CheckTaskTypeAllowed(type) then
return self
end
end
local task = PLAYERTASK:New(type,Target,self.repeatonfailed,self.repeattimes,ttstype) local task = PLAYERTASK:New(type,Target,self.repeatonfailed,self.repeattimes,ttstype)
task.coalition = self.Coalition task.coalition = self.Coalition
@ -1167,10 +1366,19 @@ function PLAYERTASKCONTROLLER:_AddTask(Target)
local data = EventData -- Core.Event#EVENTDATA EventData local data = EventData -- Core.Event#EVENTDATA EventData
local wcat = data.Weapon:getCategory() -- cat 2 or 3 local wcat = data.Weapon:getCategory() -- cat 2 or 3
local coord = data.IniUnit:GetCoordinate() or data.IniGroup:GetCoordinate() local coord = data.IniUnit:GetCoordinate() or data.IniGroup:GetCoordinate()
local vec2 = coord:GetVec2() or {x=0, y=0}
local coal = data.IniCoalition local coal = data.IniCoalition
local afbzone = AIRBASE:FindByName(Target:GetName()):GetZone() local afbzone = AIRBASE:FindByName(Target:GetName()):GetZone()
local inzone = afbzone:IsVec2InZone(coord:GetVec2() or {x=0, y=0}) local runways = AIRBASE:FindByName(Target:GetName()):GetRunways() or {}
if coal == task.coalition and (wcat == 2 or wcat == 3) and inzone then local inrunwayzone = false
for _,_runway in pairs(runways) do
local runway = _runway -- Wrapper.Airbase#AIRBASE.Runway
if runway.zone:IsVec2InZone(vec2) then
inrunwayzone = true
end
end
local inzone = afbzone:IsVec2InZone(vec2)
if coal == task.coalition and (wcat == 2 or wcat == 3) and (inrunwayzone or inzone) then
-- bombing/rockets inside target AFB zone - well done! -- bombing/rockets inside target AFB zone - well done!
task:__Success(-20) task:__Success(-20)
end end
@ -1196,7 +1404,8 @@ function PLAYERTASKCONTROLLER:_JoinTask(Group, Client, Task)
if self.TasksPerPlayer:HasUniqueID(playername) then if self.TasksPerPlayer:HasUniqueID(playername) then
-- Player already has a task -- Player already has a task
if not self.NoScreenOutput then if not self.NoScreenOutput then
local m=MESSAGE:New("You already have one active task! Complete it first!","10","Tasking"):ToGroup(Group) local text = self.gettext:GetEntry("HAVEACTIVETASK",self.locale)
local m=MESSAGE:New(text,"10","Tasking"):ToGroup(Group)
end end
return self return self
end end
@ -1206,7 +1415,8 @@ function PLAYERTASKCONTROLLER:_JoinTask(Group, Client, Task)
if taskstate ~= "Executing" and taskstate ~= "Done" then if taskstate ~= "Executing" and taskstate ~= "Done" then
Task:__Requested(-1) Task:__Requested(-1)
Task:__Executing(-2) Task:__Executing(-2)
local text = string.format("%s, pilot %s joined task %03d", self.MenuName or self.Name, playername, Task.PlayerTaskNr) local joined = self.gettext:GetEntry("PILOTJOINEDTASK",self.locale)
local text = string.format(joined, self.MenuName or self.Name, playername, 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() local m=MESSAGE:New(text,"10","Tasking"):ToAll()
@ -1234,8 +1444,12 @@ function PLAYERTASKCONTROLLER:_ActiveTaskInfo(Group, Client)
-- TODO: Show multiple? -- TODO: Show multiple?
--local task = self.TasksPerPlayer:GetIDStack() --local task = self.TasksPerPlayer:GetIDStack()
local task = self.TasksPerPlayer:ReadByID(playername) -- Ops.PlayerTask#PLAYERTASK local task = self.TasksPerPlayer:ReadByID(playername) -- Ops.PlayerTask#PLAYERTASK
local taskname = string.format("%s Task ID %03d",task.Type,task.PlayerTaskNr) local tname = self.gettext:GetEntry("TASKNAME",self.locale)
local ttstaskname = string.format("%s Task ID %03d",task.TTSType,task.PlayerTaskNr) local ttsname = self.gettext:GetEntry("TASKNAMETTS",self.locale)
local taskname = string.format(tname,task.Type,task.PlayerTaskNr)
local ttstaskname = string.format(ttsname,task.TTSType,task.PlayerTaskNr)
--local taskname = string.format("%s Task ID %03d",task.Type,task.PlayerTaskNr)
--local ttstaskname = string.format("%s Task ID %03d",task.TTSType,task.PlayerTaskNr)
local Coordinate = task.Target:GetCoordinate() local Coordinate = task.Target:GetCoordinate()
local CoordText = "" local CoordText = ""
if self.Type ~= PLAYERTASKCONTROLLER.Type.A2A then if self.Type ~= PLAYERTASKCONTROLLER.Type.A2A then
@ -1244,28 +1458,36 @@ function PLAYERTASKCONTROLLER:_ActiveTaskInfo(Group, Client)
CoordText = Coordinate:ToStringA2A(Client) CoordText = Coordinate:ToStringA2A(Client)
end end
local ThreatLevel = task.Target:GetThreatLevelMax() local ThreatLevel = task.Target:GetThreatLevelMax()
local ThreatLevelText = "high" --local ThreatLevelText = "high"
local ThreatLevelText = self.gettext:GetEntry("THREATHIGH",self.locale)
if ThreatLevel > 3 and ThreatLevel < 8 then if ThreatLevel > 3 and ThreatLevel < 8 then
ThreatLevelText = "medium" --ThreatLevelText = "medium"
ThreatLevelText = self.gettext:GetEntry("THREATMEDIUM",self.locale)
elseif ThreatLevel <= 3 then elseif ThreatLevel <= 3 then
ThreatLevelText = "low" --ThreatLevelText = "low"
ThreatLevelText = self.gettext:GetEntry("THREATLOW",self.locale)
end end
local targets = task.Target:CountTargets() or 0 local targets = task.Target:CountTargets() or 0
local clientlist = task:GetClients() local clientlist = task:GetClients()
local ThreatGraph = "[" .. string.rep( "", ThreatLevel ) .. string.rep( "", 10 - ThreatLevel ) .. "]: "..ThreatLevel local ThreatGraph = "[" .. string.rep( "", ThreatLevel ) .. string.rep( "", 10 - ThreatLevel ) .. "]: "..ThreatLevel
text = string.format("%s\nThreat: %s\nTargets left: %d\nCoord: %s", taskname, ThreatGraph, targets, CoordText) local ThreatLocaleText = self.gettext:GetEntry("THREATTEXT",self.locale)
local clienttxt = "\nPilot(s): " text = string.format(ThreatLocaleText, taskname, ThreatGraph, targets, CoordText)
--text = string.format("%s\nThreat: %s\nTargets left: %d\nCoord: %s", taskname, ThreatGraph, targets, CoordText)
--local clienttxt = "\nPilot(s): "
local clienttxt = self.gettext:GetEntry("PILOTS",self.locale)
for _,_name in pairs(clientlist) do for _,_name in pairs(clientlist) do
clienttxt = clienttxt .. _name .. ", " clienttxt = clienttxt .. _name .. ", "
end end
clienttxt=string.gsub(clienttxt,", $",".") clienttxt=string.gsub(clienttxt,", $",".")
text = text .. clienttxt text = text .. clienttxt
if self.UseSRS then if self.UseSRS then
local ttstext = string.format("%s, %s. Target information for %s. Threat level %s. Targets left %d. Target location %s.",self.MenuName or self.Name,playername,ttstaskname,ThreatLevelText, targets, CoordText) local ThreatLocaleTextTTS = self.gettext:GetEntry("THREATTEXTTTS",self.locale)
local ttstext = string.format(ThreatLocaleTextTTS,self.MenuName or self.Name,playername,ttstaskname,ThreatLevelText, targets, CoordText)
--local ttstext = string.format("%s, %s. Target information for %s. Threat level %s. Targets left %d. Target location %s.",self.MenuName or self.Name,playername,ttstaskname,ThreatLevelText, targets, CoordText)
self.SRSQueue:NewTransmission(ttstext,nil,self.SRS,nil,2) self.SRSQueue:NewTransmission(ttstext,nil,self.SRS,nil,2)
end end
else else
text = "No active task!" 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"):ToGroup(Group)
@ -1285,13 +1507,15 @@ function PLAYERTASKCONTROLLER:_MarkTask(Group, Client)
if self.TasksPerPlayer:HasUniqueID(playername) then if self.TasksPerPlayer:HasUniqueID(playername) then
local task = self.TasksPerPlayer:ReadByID(playername) -- Ops.PlayerTask#PLAYERTASK local task = self.TasksPerPlayer:ReadByID(playername) -- Ops.PlayerTask#PLAYERTASK
task:MarkTargetOnF10Map() task:MarkTargetOnF10Map()
text = string.format("%s, copy pilot %s, task %03d location marked on map!", self.MenuName or self.Name, playername, task.PlayerTaskNr) local textmark = self.gettext:GetEntry("MARKTASK",self.locale)
--text = string.format("%s, copy pilot %s, task %03d location marked on map!", self.MenuName or self.Name, playername, task.PlayerTaskNr)
text = string.format(textmark, self.MenuName or self.Name, playername, task.PlayerTaskNr)
self:T(self.lid..text) self:T(self.lid..text)
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)
end end
else else
text = "No active task!" 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"):ToGroup(Group)
@ -1311,14 +1535,15 @@ function PLAYERTASKCONTROLLER:_SmokeTask(Group, Client)
if self.TasksPerPlayer:HasUniqueID(playername) then if self.TasksPerPlayer:HasUniqueID(playername) then
local task = self.TasksPerPlayer:ReadByID(playername) -- Ops.PlayerTask#PLAYERTASK local task = self.TasksPerPlayer:ReadByID(playername) -- Ops.PlayerTask#PLAYERTASK
task:SmokeTarget() task:SmokeTarget()
text = string.format("%s, copy pilot %s, task %03d location smoked!", self.MenuName or self.Name, playername, task.PlayerTaskNr) local textmark = self.gettext:GetEntry("SMOKETASK",self.locale)
text = string.format(textmark, self.MenuName or self.Name, playername, task.PlayerTaskNr)
self:T(self.lid..text) self:T(self.lid..text)
--local m=MESSAGE:New(text,"10","Tasking"):ToAll() --local m=MESSAGE:New(text,"10","Tasking"):ToAll()
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)
end end
else else
text = "No active task!" 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"):ToGroup(Group)
@ -1338,14 +1563,15 @@ function PLAYERTASKCONTROLLER:_FlareTask(Group, Client)
if self.TasksPerPlayer:HasUniqueID(playername) then if self.TasksPerPlayer:HasUniqueID(playername) then
local task = self.TasksPerPlayer:ReadByID(playername) -- Ops.PlayerTask#PLAYERTASK local task = self.TasksPerPlayer:ReadByID(playername) -- Ops.PlayerTask#PLAYERTASK
task:FlareTarget() task:FlareTarget()
text = string.format("%s, copy pilot %s, task %03d location illuminated!", self.MenuName or self.Name, playername, task.PlayerTaskNr) local textmark = self.gettext:GetEntry("FLARETASK",self.locale)
text = string.format(textmark, self.MenuName or self.Name, playername, task.PlayerTaskNr)
self:T(self.lid..text) self:T(self.lid..text)
--local m=MESSAGE:New(text,"10","Tasking"):ToAll() --local m=MESSAGE:New(text,"10","Tasking"):ToAll()
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)
end end
else else
text = "No active task!" 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"):ToGroup(Group)
@ -1365,14 +1591,15 @@ function PLAYERTASKCONTROLLER:_AbortTask(Group, Client)
if self.TasksPerPlayer:HasUniqueID(playername) then if self.TasksPerPlayer:HasUniqueID(playername) then
local task = self.TasksPerPlayer:PullByID(playername) -- Ops.PlayerTask#PLAYERTASK local task = self.TasksPerPlayer:PullByID(playername) -- Ops.PlayerTask#PLAYERTASK
task:ClientAbort(Client) task:ClientAbort(Client)
text = string.format("%s, all stations, pilot %s aborted task %03d", self.MenuName or self.Name, playername, task.PlayerTaskNr) local textmark = self.gettext:GetEntry("ABORTTASK",self.locale)
text = string.format(textmark, self.MenuName or self.Name, playername, task.PlayerTaskNr)
self:T(self.lid..text) self:T(self.lid..text)
--local m=MESSAGE:New(text,"10","Tasking"):ToAll() --local m=MESSAGE:New(text,"10","Tasking"):ToAll()
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)
end end
else else
text = "No active task!" 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"):ToGroup(Group)
@ -1395,12 +1622,14 @@ function PLAYERTASKCONTROLLER:_BuildMenus(Client)
if _client then if _client then
local client = _client -- Wrapper.Client#CLIENT local client = _client -- Wrapper.Client#CLIENT
local group = client:GetGroup() local group = client:GetGroup()
local playername = client:GetPlayerName() or "Unknown" local unknown = self.gettext:GetEntry("UNKNOWN",self.locale)
local playername = client:GetPlayerName() or unknown
if group and client then if group and client then
--- ---
-- TOPMENU -- TOPMENU
--- ---
local menuname = self.MenuName or self.Name.." Tasking "..self.Type local taskings = self.gettext:GetEntry("MENUTASKING",self.locale)
local menuname = self.MenuName or self.Name..taskings..self.Type
local topmenu = MENU_GROUP:New(group,menuname,nil) local topmenu = MENU_GROUP:New(group,menuname,nil)
if self.PlayerMenu[playername] then if self.PlayerMenu[playername] then
@ -1413,23 +1642,31 @@ function PLAYERTASKCONTROLLER:_BuildMenus(Client)
-- ACTIVE TASK MENU -- ACTIVE TASK MENU
--- ---
if self:_CheckPlayerHasTask(playername) then if self:_CheckPlayerHasTask(playername) then
local active = MENU_GROUP:New(group,"Active Task",topmenu)
local info = MENU_GROUP_COMMAND:New(group,"Info",active,self._ActiveTaskInfo,self,group,client) local menuactive = self.gettext:GetEntry("MENUACTIVE",self.locale)
local mark = MENU_GROUP_COMMAND:New(group,"Mark on map",active,self._MarkTask,self,group,client) local menuinfo = self.gettext:GetEntry("MENUINFO",self.locale)
local menumark = self.gettext:GetEntry("MENUMARK",self.locale)
local menusmoke = self.gettext:GetEntry("MENUSMOKE",self.locale)
local menuflare = self.gettext:GetEntry("MENUFLARE",self.locale)
local menuabort = self.gettext:GetEntry("MENUABORT",self.locale)
local active = MENU_GROUP:New(group,menuactive,topmenu)
local info = MENU_GROUP_COMMAND:New(group,menuinfo,active,self._ActiveTaskInfo,self,group,client)
local mark = MENU_GROUP_COMMAND:New(group,menumark,active,self._MarkTask,self,group,client)
if self.Type ~= PLAYERTASKCONTROLLER.Type.A2A then if self.Type ~= PLAYERTASKCONTROLLER.Type.A2A then
-- no smoking/flaring here if A2A -- no smoking/flaring here if A2A
local smoke = MENU_GROUP_COMMAND:New(group,"Smoke",active,self._SmokeTask,self,group,client) local smoke = MENU_GROUP_COMMAND:New(group,menusmoke,active,self._SmokeTask,self,group,client)
local flare = MENU_GROUP_COMMAND:New(group,"Flare",active,self._FlareTask,self,group,client) local flare = MENU_GROUP_COMMAND:New(group,menuflare,active,self._FlareTask,self,group,client)
end end
local abort = MENU_GROUP_COMMAND:New(group,"Abort",active,self._AbortTask,self,group,client) local abort = MENU_GROUP_COMMAND:New(group,menuabort,active,self._AbortTask,self,group,client)
elseif self.TaskQueue:Count() > 0 then elseif self.TaskQueue:Count() > 0 then
--- ---
-- JOIN TASK MENU -- JOIN TASK MENU
--- ---
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 joinmenu = MENU_GROUP:New(group,"Join Task",topmenu) local joinmenu = MENU_GROUP:New(group,menujoin,topmenu)
local ttypes = {} local ttypes = {}
local taskmenu = {} local taskmenu = {}
@ -1445,7 +1682,8 @@ function PLAYERTASKCONTROLLER:_BuildMenus(Client)
if tnow - _task.timestamp < 60 then if tnow - _task.timestamp < 60 then
newtext = "*]" newtext = "*]"
end end
local text = string.format("TaskNo %03d [%d%s",_task.PlayerTaskNr,pilotcount,newtext) 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 if self.UseGroupNames then
local name = _task.Target:GetName() local name = _task.Target:GetName()
if name ~= "Unknown" then if name ~= "Unknown" then
@ -1461,7 +1699,8 @@ function PLAYERTASKCONTROLLER:_BuildMenus(Client)
end end
else else
-- no tasks (yet) -- no tasks (yet)
local joinmenu = MENU_GROUP:New(group,"Currently no tasks available.",topmenu) local menunotasks = self.gettext:GetEntry("MENUNOTASKS",self.locale)
local joinmenu = MENU_GROUP:New(group,menunotasks,topmenu)
end end
--- ---
-- REFRESH MENU -- REFRESH MENU
@ -1738,12 +1977,14 @@ end
function PLAYERTASKCONTROLLER:onafterTaskCancelled(From, Event, To, Task) function PLAYERTASKCONTROLLER:onafterTaskCancelled(From, Event, To, Task)
self:T({From, Event, To}) self:T({From, Event, To})
self:T(self.lid.."TaskCancelled") self:T(self.lid.."TaskCancelled")
local taskname = string.format("Task #%03d %s is cancelled!", Task.PlayerTaskNr, tostring(Task.Type)) local canceltxt = self.gettext:GetEntry("TASKCANCELLED",self.locale)
local canceltxttts = self.gettext:GetEntry("TASKCANCELLEDTTS",self.locale)
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) local m = MESSAGE:New(taskname,15,"Tasking"):ToCoalition(self.Coalition)
end end
if self.UseSRS then if self.UseSRS then
taskname = string.format("%s, task %03d %s is cancelled!", self.MenuName or self.Name, Task.PlayerTaskNr, tostring(Task.TTSType)) taskname = string.format(canceltxttts, 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
return self return self
@ -1759,12 +2000,14 @@ end
function PLAYERTASKCONTROLLER:onafterTaskSuccess(From, Event, To, Task) function PLAYERTASKCONTROLLER:onafterTaskSuccess(From, Event, To, Task)
self:T({From, Event, To}) self:T({From, Event, To})
self:T(self.lid.."TaskSuccess") self:T(self.lid.."TaskSuccess")
local taskname = string.format("Task #%03d %s completed successfully!", Task.PlayerTaskNr, tostring(Task.Type)) local succtxt = self.gettext:GetEntry("TASKSUCCESS",self.locale)
local succtxttts = self.gettext:GetEntry("TASKSUCCESSTTS",self.locale)
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) local m = MESSAGE:New(taskname,15,"Tasking"):ToCoalition(self.Coalition)
end end
if self.UseSRS then if self.UseSRS then
taskname = string.format("%s, task %03d %s completed successfully!", 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
return self return self
@ -1780,12 +2023,14 @@ end
function PLAYERTASKCONTROLLER:onafterTaskFailed(From, Event, To, Task) function PLAYERTASKCONTROLLER:onafterTaskFailed(From, Event, To, Task)
self:T({From, Event, To}) self:T({From, Event, To})
self:T(self.lid.."TaskFailed") self:T(self.lid.."TaskFailed")
local taskname = string.format("Task #%03d %s was a failure!", Task.PlayerTaskNr, tostring(Task.Type)) local failtxt = self.gettext:GetEntry("TASKFAILED",self.locale)
local failtxttts = self.gettext:GetEntry("TASKFAILEDTTS",self.locale)
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) local m = MESSAGE:New(taskname,15,"Tasking"):ToCoalition(self.Coalition)
end end
if self.UseSRS then if self.UseSRS then
taskname = string.format("%s, task %03d %s was a failure!", self.MenuName or self.Name, Task.PlayerTaskNr, tostring(Task.TTSType)) taskname = string.format(failtxttts, 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
return self return self
@ -1801,12 +2046,14 @@ end
function PLAYERTASKCONTROLLER:onafterTaskRepeatOnFailed(From, Event, To, Task) function PLAYERTASKCONTROLLER:onafterTaskRepeatOnFailed(From, Event, To, Task)
self:T({From, Event, To}) self:T({From, Event, To})
self:T(self.lid.."RepeatOnFailed") self:T(self.lid.."RepeatOnFailed")
local taskname = string.format("Task #%03d %s was a failure! Replanning!", Task.PlayerTaskNr, tostring(Task.Type)) local repfailtxt = self.gettext:GetEntry("TASKFAILEDREPLAN",self.locale)
local repfailtxttts = self.gettext:GetEntry("TASKFAILEDREPLANTTS",self.locale)
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) local m = MESSAGE:New(taskname,15,"Tasking"):ToCoalition(self.Coalition)
end end
if self.UseSRS then if self.UseSRS then
taskname = string.format("%s, task %03d %s was a failure! Replanning!", self.MenuName or self.Name, Task.PlayerTaskNr, tostring(Task.TTSType)) taskname = string.format(repfailtxttts, 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
return self return self
@ -1822,12 +2069,13 @@ end
function PLAYERTASKCONTROLLER:onafterTaskAdded(From, Event, To, Task) function PLAYERTASKCONTROLLER:onafterTaskAdded(From, Event, To, Task)
self:T({From, Event, To}) self:T({From, Event, To})
self:T(self.lid.."TaskAdded") self:T(self.lid.."TaskAdded")
local taskname = string.format("%s has a new task %s", self.MenuName or self.Name, tostring(Task.Type)) local addtxt = self.gettext:GetEntry("TASKADDED",self.locale)
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) local m = MESSAGE:New(taskname,15,"Tasking"):ToCoalition(self.Coalition)
end end
if self.UseSRS then if self.UseSRS then
taskname = string.format("%s has a new task %s", self.MenuName or self.Name, tostring(Task.TTSType)) taskname = string.format(addtxt, self.MenuName or self.Name, tostring(Task.TTSType))
self.SRSQueue:NewTransmission(taskname,nil,self.SRS,nil,2) self.SRSQueue:NewTransmission(taskname,nil,self.SRS,nil,2)
end end
return self return self