Merge branch 'develop' into FF/Ops

This commit is contained in:
Frank
2025-11-09 21:46:36 +01:00
12 changed files with 3535 additions and 2321 deletions
+44 -14
View File
@@ -5498,15 +5498,15 @@ function AIRBOSS:_GetAircraftAoA( playerData )
aoa.OnSpeedMin = self:_AoAUnit2Deg( playerData, 14.0 ) -- 14.17 --14.5 units -- VNAO Edit - Original value 14.5
aoa.Fast = self:_AoAUnit2Deg( playerData, 13.5 ) -- 13.33 --14.0 units -- VNAO Edit - Original value 14
aoa.FAST = self:_AoAUnit2Deg( playerData, 12.5 ) -- 11.67 --13.0 units -- VNAO Edit - Original value 13
elseif goshawk then
elseif goshawk then --These parameters edited by CIRCUIT to support new VNAO flight model
-- T-45C Goshawk parameters.
aoa.SLOW = 8.00 -- 19
aoa.Slow = 7.75 -- 18
aoa.OnSpeedMax = 7.25 -- 17.5
aoa.OnSpeed = 7.00 -- 17
aoa.OnSpeedMin = 6.75 -- 16.5
aoa.Fast = 6.25 -- 16
aoa.FAST = 6.00 -- 15
aoa.SLOW = 9.5 -- 8.00 -- 19
aoa.Slow = 9.25 -- 7.75 -- 18
aoa.OnSpeedMax = 9.0 --7.25 -- 17.5
aoa.OnSpeed = 8.5 -- 7.00 -- 17
aoa.OnSpeedMin = 8.25 -- 6.75 -- 16.5
aoa.Fast = 7.75 -- 6.25 -- 16
aoa.FAST = 5.5 -- 6.00 -- 15
elseif skyhawk then
-- A-4E-C Skyhawk parameters from https://forums.eagle.ru/showpost.php?p=3703467&postcount=390
-- Note that these are arbitrary UNITS and not degrees. We need a conversion formula!
@@ -8161,8 +8161,14 @@ function AIRBOSS:_CheckPlayerStatus()
-- TODO: This might cause problems if the CCA is set to be very small!
if unit:IsInZone( self.zoneCCA ) then
-- VNAO Edit - Added wrapped up call to LSO grading
if playerData.step==AIRBOSS.PatternStep.WAKE then-- VNAO Edit - Added
local hornet = playerData.actype == AIRBOSS.AircraftCarrier.HORNET
or playerData.actype == AIRBOSS.AircraftCarrier.RHINOE
or playerData.actype == AIRBOSS.AircraftCarrier.RHINOF
or playerData.actype == AIRBOSS.AircraftCarrier.GROWLER
local tomcat = playerData.actype == AIRBOSS.AircraftCarrier.F14A or playerData.actype == AIRBOSS.AircraftCarrier.F14B
-- VNAO Edit - Added wrapped up call to LSO grading Hornet
if playerData.step==AIRBOSS.PatternStep.WAKE and hornet then-- VNAO Edit - Added
if math.abs(playerData.unit:GetRoll())>35 and math.abs(playerData.unit:GetRoll())<=40 then-- VNAO Edit - Added
playerData.wrappedUpAtWakeLittle = true -- VNAO Edit - Added
elseif math.abs(playerData.unit:GetRoll()) >40 and math.abs(playerData.unit:GetRoll())<=45 then-- VNAO Edit - Added
@@ -8186,6 +8192,30 @@ function AIRBOSS:_CheckPlayerStatus()
end -- VNAO Edit - Added
end-- VNAO Edit - Added
-- VNAO Edit - Added wrapped up call to LSO grading Tomcat
if playerData.step==AIRBOSS.PatternStep.WAKE and tomcat then-- VNAO Edit - Added
if math.abs(playerData.unit:GetRoll())>35 and math.abs(playerData.unit:GetRoll())<=40 then-- VNAO Edit - Added
playerData.wrappedUpAtWakeLittle = true -- VNAO Edit - Added
elseif math.abs(playerData.unit:GetRoll()) >40 and math.abs(playerData.unit:GetRoll())<=45 then-- VNAO Edit - Added
playerData.wrappedUpAtWakeFull = true-- VNAO Edit - Added
elseif math.abs(playerData.unit:GetRoll()) >45 then-- VNAO Edit - Added
playerData.wrappedUpAtWakeUnderline = true -- VNAO Edit - Added
elseif math.abs(playerData.unit:GetRoll()) <12 and math.abs(playerData.unit:GetRoll()) >=5 then -- VNAO Edit - Added a new AA comment based on discussion with Lipps today, and going to replace the AA at the X with the original LUL comments
playerData.AAatWakeLittle = true -- VNAO Edit - Added
elseif math.abs(playerData.unit:GetRoll()) <5 and math.abs(playerData.unit:GetRoll()) >=2 then -- VNAO Edit - Added a new AA comment based on discussion with Lipps today, and going to replace the AA at the X with the original LUL comments
playerData.AAatWakeFull = true -- VNAO Edit - Added
elseif math.abs(playerData.unit:GetRoll()) <2 then -- VNAO Edit - Added a new AA comment based on discussion with Lipps today, and going to replace the AA at the X with the original LUL comments
playerData.AAatWakeUnderline = true -- VNAO Edit - Added
else -- VNAO Edit - Added
end -- VNAO Edit - Added
if math.abs(playerData.unit:GetAoA())>= 15 then -- VNAO Edit - Added
playerData.AFU = true -- VNAO Edit - Added
elseif math.abs(playerData.unit:GetAoA())<= 5 then -- VNAO Edit - Added
playerData.AFU = true -- VNAO Edit - Added
else -- VNAO Edit - Added
end -- VNAO Edit - Added
end-- VNAO Edit - Added
-- Display aircraft attitude and other parameters as message text.
if playerData.attitudemonitor then
@@ -12229,8 +12259,8 @@ function AIRBOSS:GetHeadingIntoWind_new( vdeck, magnetic, coord )
local magvar= magnetic and self.magvar or 0
-- Ship heading so cross wind is min for the given wind.
-- local intowind = (540 + (windto - magvar + math.deg(theta) )) % 360 -- VNAO Edit: Using old heading into wind algorithm
local intowind = self:GetHeadingIntoWind_old(vdeck,magnetic) -- VNAO Edit: Using old heading into wind algorithm
local intowind = (540 + (windto - magvar + math.deg(theta) )) % 360
return intowind, v
end
@@ -12682,7 +12712,8 @@ function AIRBOSS:_LSOgrade( playerData )
local nL=count(G, '_')/2
local nS=count(G, '%(')
local nN=N-nS-nL
if TIG=="_OK_" then nL = nL -1 end --Circuit added to prevent grade deduction for perfect groove
-- Groove time 15-18.99 sec for a unicorn. Or 60-65 for V/STOL unicorn.
local Tgroove=playerData.Tgroove
@@ -12712,7 +12743,6 @@ function AIRBOSS:_LSOgrade( playerData )
else
if vtol then
-- Add AV-8B Harrier devation allowances due to lower groundspeed and 3x conventional groove time, this allows to maintain LSO tolerances while respecting the deviations are not unsafe.--Pene testing
-- Large devaitions still result in a No Grade, A Unicorn still requires a clean pass with no deviation.
File diff suppressed because it is too large Load Diff
+96 -31
View File
@@ -21,7 +21,7 @@
-- ===
-- @module Ops.PlayerTask
-- @image OPS_PlayerTask.jpg
-- @date Last Update May 2025
-- @date Last Update Oct 2025
do
@@ -59,6 +59,8 @@ do
-- @field #string FinalState
-- @field #string TypeName
-- @field #number PreviousCount
-- @field #boolean CanSmoke
-- @field #boolean ShowThreatDetails
-- @extends Core.Fsm#FSM
@@ -94,11 +96,13 @@ PLAYERTASK = {
NextTaskFailure = {},
FinalState = "none",
PreviousCount = 0,
CanSmoke = true,
ShowThreatDetails = true,
}
--- PLAYERTASK class version.
-- @field #string version
PLAYERTASK.version="0.1.28"
PLAYERTASK.version="0.1.29"
--- Generic task condition.
-- @type PLAYERTASK.Condition
@@ -231,6 +235,7 @@ function PLAYERTASK:New(Type, Target, Repeat, Times, TTSType)
-- @param #string From From state.
-- @param #string Event Event.
-- @param #string To To state.
-- @param #boolen Silent If true, suppress message output on cancel.
--- On After "Planned" event. Task has been planned.
-- @function [parent=#PLAYERTASK] OnAfterPilotPlanned
@@ -468,6 +473,26 @@ function PLAYERTASK:SetSubType(Type)
return self
end
--- [USER] Set if a task can have a smoke marker.
-- @param #PLAYERTASK self
-- @param #boolean OnOff If true (default) it can be smoke, false if not.
-- @return #PLAYERTASK self
function PLAYERTASK:SetCanSmoke(OnOff)
self:T(self.lid.."AddSSetCanSmokeubType")
self.CanSmoke = OnOff
return self
end
--- [USER] Set if a task can show threat details.
-- @param #PLAYERTASK self
-- @param #boolean OnOff If true (default) it can be shown, false if not.
-- @return #PLAYERTASK self
function PLAYERTASK:SetShowThreatDetails(OnOff)
self:T(self.lid.."SetShowThreatDetails")
self.ShowThreatDetails = OnOff
return self
end
--- [USER] Get task sub type description from this task.
-- @param #PLAYERTASK self
-- @return #string Type or nil
@@ -1173,11 +1198,12 @@ end
-- @param #string From
-- @param #string Event
-- @param #string To
-- @param #boolean Silent
-- @return #PLAYERTASK self
function PLAYERTASK:onafterCancel(From, Event, To)
function PLAYERTASK:onafterCancel(From, Event, To, Silent)
self:T({From, Event, To})
if self.TaskController then
self.TaskController:__TaskCancelled(-1,self)
self.TaskController:__TaskCancelled(-1,self, Silent)
end
self.timestamp = timer.getAbsTime()
self.FinalState = "Cancelled"
@@ -1606,7 +1632,7 @@ do
--
-- The event is triggered when a task was cancelled manually. Use @{#PLAYERTASKCONTROLLER.OnAfterTaskCancelled}()` to link into this event:
--
-- function taskmanager:OnAfterTaskCancelled(From, Event, To, Task)
-- function taskmanager:OnAfterTaskCancelled(From, Event, To, Task, Silent)
-- ... your code here ...
-- end
--
@@ -1770,12 +1796,15 @@ PLAYERTASKCONTROLLER.Messages = {
THREATMEDIUM = "medium",
THREATLOW = "low",
THREATTEXT = "%s\nThreat: %s\nTargets left: %d\nCoord: %s",
NOTHREATTEXT = "%s\nNo target information available.",
ELEVATION = "\nTarget Elevation: %s %s",
METER = "meter",
FEET = "feet",
THREATTEXTTTS = "%s, %s. Target information for %s. Threat level %s. Targets left %d. Target location %s.",
NOTHREATTEXTTTS = "%s, %s. No target information available.",
MARKTASK = "%s, %s, copy, task %03d location marked on map!",
SMOKETASK = "%s, %s, copy, task %03d location smoked!",
NOSMOKETASK = "%s, %s, negative, task %03d location cannot be smoked!",
FLARETASK = "%s, %s, copy, task %03d location illuminated!",
ABORTTASK = "All stations, %s, %s has aborted %s task %03d!",
UNKNOWN = "Unknown",
@@ -1854,12 +1883,15 @@ PLAYERTASKCONTROLLER.Messages = {
THREATMEDIUM = "mittel",
THREATLOW = "niedrig",
THREATTEXT = "%s\nGefahrstufe: %s\nZiele: %d\nKoord: %s",
NOTHREATTEXT = "%s\nKeine Zielinformation verfügbar.",
ELEVATION = "\nZiel Höhe: %s %s",
METER = "Meter",
FEET = "Fuss",
THREATTEXTTTS = "%s, %s. Zielinformation zu %s. Gefahrstufe %s. Ziele %d. Zielposition %s.",
NOTHREATTEXTTTS = "%s, %s. Keine Zielinformation verfügbar.",
MARKTASK = "%s, %s, verstanden, Zielposition %03d auf der Karte markiert!",
SMOKETASK = "%s, %s, verstanden, Zielposition %03d mit Rauch markiert!",
NOSMOKETASK = "%s, %s, negativ, Zielposition %03d kann nicht markiert werden!",
FLARETASK = "%s, %s, verstanden, Zielposition %03d beleuchtet!",
ABORTTASK = "%s, an alle, %s hat Auftrag %s %03d abgebrochen!",
UNKNOWN = "Unbekannt",
@@ -1920,7 +1952,7 @@ PLAYERTASKCONTROLLER.Messages = {
--- PLAYERTASK class version.
-- @field #string version
PLAYERTASKCONTROLLER.version="0.1.70"
PLAYERTASKCONTROLLER.version="0.1.71"
--- Create and run a new TASKCONTROLLER instance.
-- @param #PLAYERTASKCONTROLLER self
@@ -2061,6 +2093,7 @@ function PLAYERTASKCONTROLLER:New(Name, Coalition, Type, ClientFilter)
-- @param #string Event Event.
-- @param #string To To state.
-- @param Ops.PlayerTask#PLAYERTASK Task
-- @param #boolean Silent If true suppress message output.
--- On After "TaskFailed" event. Task has failed.
-- @function [parent=#PLAYERTASKCONTROLLER] OnAfterTaskFailed
@@ -2741,11 +2774,12 @@ end
--- [User] Manually cancel a specific task
-- @param #PLAYERTASKCONTROLLER self
-- @param Ops.PlayerTask#PLAYERTASK Task The task to be cancelled
-- @param Ops.PlayerTask#PLAYERTASK Task The task to be cancelled.
-- @param #boolean Silent If true suppress message output.
-- @return #PLAYERTASKCONTROLLER self
function PLAYERTASKCONTROLLER:CancelTask(Task)
function PLAYERTASKCONTROLLER:CancelTask(Task,Silent)
self:T(self.lid.."CancelTask")
Task:__Cancel(-1)
Task:__Cancel(-1,Silent)
return self
end
@@ -3734,6 +3768,7 @@ function PLAYERTASKCONTROLLER:_ActiveTaskInfo(Task, Group, Client)
local Elevation = Coordinate:GetLandHeight() or 0 -- meters
local CoordText = ""
local CoordTextLLDM = nil
local ShowThreatInfo = task.ShowThreatDetails
local LasingDrone = self:_FindLasingDroneForTaskID(task.PlayerTaskNr)
if self.Type ~= PLAYERTASKCONTROLLER.Type.A2A then
CoordText = Coordinate:ToStringA2G(Client,nil,self.ShowMagnetic)
@@ -3757,7 +3792,12 @@ function PLAYERTASKCONTROLLER:_ActiveTaskInfo(Task, Group, Client)
local clientlist, clientcount = task:GetClients()
local ThreatGraph = "[" .. string.rep( "", ThreatLevel ) .. string.rep( "", 10 - ThreatLevel ) .. "]: "..ThreatLevel
local ThreatLocaleText = self.gettext:GetEntry("THREATTEXT",self.locale)
text = string.format(ThreatLocaleText, taskname, ThreatGraph, targets, CoordText)
if ShowThreatInfo == true then
text = string.format(ThreatLocaleText, taskname, ThreatGraph, targets, CoordText)
else
ThreatLocaleText = self.gettext:GetEntry("NOTHREATTEXT",self.locale)
text = string.format(ThreatLocaleText, taskname)
end
local settings = _DATABASE:GetPlayerSettings(playername) or _SETTINGS -- Core.Settings#SETTINGS
local elevationmeasure = self.gettext:GetEntry("FEET",self.locale)
if settings:IsMetric() then
@@ -3880,9 +3920,19 @@ function PLAYERTASKCONTROLLER:_ActiveTaskInfo(Task, Group, Client)
end
--self:I(self.lid.." | ".. CoordText)
end
local ttstext
local ThreatLocaleTextTTS = self.gettext:GetEntry("THREATTEXTTTS",self.locale)
local ttstext = string.format(ThreatLocaleTextTTS,ttsplayername,self.MenuName or self.Name,ttstaskname,ThreatLevelText, targets, CoordText)
-- 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.",
if ShowThreatInfo == true then
ttstext = string.format(ThreatLocaleTextTTS,ttsplayername,self.MenuName or self.Name,ttstaskname,ThreatLevelText, targets, CoordText)
else
ThreatLocaleTextTTS = self.gettext:GetEntry("NOTHREATTEXTTTS",self.locale)
ttstext = string.format(ThreatLocaleTextTTS,ttsplayername,self.MenuName or self.Name)
end
-- POINTERTARGETLASINGTTS = ". Pointer over target and lasing."
if task.Type == AUFTRAG.Type.PRECISIONBOMBING and self.precisionbombing then
if LasingDrone and LasingDrone.playertask.inreach and LasingDrone:IsLasing() then
local lasingtext = self.gettext:GetEntry("POINTERTARGETLASINGTTS",self.locale)
@@ -3951,15 +4001,25 @@ function PLAYERTASKCONTROLLER:_SmokeTask(Group, Client)
local text = ""
if self.TasksPerPlayer:HasUniqueID(playername) then
local task = self.TasksPerPlayer:ReadByID(playername) -- Ops.PlayerTask#PLAYERTASK
task:SmokeTarget()
local textmark = self.gettext:GetEntry("SMOKETASK",self.locale)
text = string.format(textmark, ttsplayername, self.MenuName or self.Name, task.PlayerTaskNr)
self:T(self.lid..text)
--local m=MESSAGE:New(text,"10","Tasking"):ToAll()
if self.UseSRS then
self.SRSQueue:NewTransmission(text,nil,self.SRS,nil,2)
if task.CanSmoke == true then
task:SmokeTarget()
local textmark = self.gettext:GetEntry("SMOKETASK",self.locale)
text = string.format(textmark, ttsplayername, self.MenuName or self.Name, task.PlayerTaskNr)
self:T(self.lid..text)
--local m=MESSAGE:New(text,"10","Tasking"):ToAll()
if self.UseSRS then
self.SRSQueue:NewTransmission(text,nil,self.SRS,nil,2)
end
self:__TaskTargetSmoked(5,task)
else
local textmark = self.gettext:GetEntry("NOSMOKETASK",self.locale)
text = string.format(textmark, ttsplayername, self.MenuName or self.Name, task.PlayerTaskNr)
self:T(self.lid..text)
--local m=MESSAGE:New(text,"10","Tasking"):ToAll()
if self.UseSRS then
self.SRSQueue:NewTransmission(text,nil,self.SRS,nil,2)
end
end
self:__TaskTargetSmoked(5,task)
else
text = self.gettext:GetEntry("NOACTIVETASK",self.locale)
end
@@ -4793,22 +4853,27 @@ end
-- @param #string Event
-- @param #string To
-- @param Ops.PlayerTask#PLAYERTASK Task
-- @param #boolean Silent If true, suppress message output on cancel.
-- @return #PLAYERTASKCONTROLLER self
function PLAYERTASKCONTROLLER:onafterTaskCancelled(From, Event, To, Task)
function PLAYERTASKCONTROLLER:onafterTaskCancelled(From, Event, To, Task, Silent)
self:T({From, Event, To})
self:T(self.lid.."TaskCancelled")
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
self:_SendMessageToClients(taskname,15)
--local m = MESSAGE:New(taskname,15,"Tasking"):ToCoalition(self.Coalition)
if Silent ~= true then
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 self.NoScreenOutput ~= true then
self:_SendMessageToClients(taskname,15)
--local m = MESSAGE:New(taskname,15,"Tasking"):ToCoalition(self.Coalition)
end
if self.UseSRS then
taskname = string.format(canceltxttts, self.MenuName or self.Name, Task.PlayerTaskNr, tostring(Task.TTSType))
self.SRSQueue:NewTransmission(taskname,nil,self.SRS,nil,2)
end
end
if self.UseSRS then
taskname = string.format(canceltxttts, 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:_RemoveMenuEntriesForTask(Task,client)