updated briefings to be shown during spawn #31

Merged
dutchie031 merged 3 commits from feature/briefingOnSpawning into develop 2026-08-20 14:06:43 +00:00
11 changed files with 210 additions and 146 deletions
+4
View File
@@ -5,6 +5,10 @@
### New Features ### New Features
- Issue #26
Possibility to have Stage Overview briefings (which include current missions sorted by distance) to be shown on spawning of a player.
PR #31
### Bug Fixes ### Bug Fixes
- Issue #11 - Issue #11
+20 -14
View File
@@ -7,14 +7,16 @@
--- @field startingStage integer --- @field startingStage integer
--- @field maxMissionsPerStage integer --- @field maxMissionsPerStage integer
--- @field AmountPreactivateStage integer --- @field AmountPreactivateStage integer
--- @field briefingOnSpawnEnabled boolean
local StageConfig = {}; local StageConfig = {};
StageConfig.__index = StageConfig
local Logger = require("classes.util.Logger") local Logger = require("classes.util.Logger")
local _logger = Logger.new("StageConfig", Logger.LogLevel) local _logger = Logger.new("StageConfig", Logger.LogLevel)
---comment ---comment
---@return StageConfig ---@return StageConfig
function StageConfig:new() local function new()
if SpearheadConfig == nil then if SpearheadConfig == nil then
_logger:warn("SpearheadConfig is nil, creating default SpearheadConfig") _logger:warn("SpearheadConfig is nil, creating default SpearheadConfig")
@@ -26,22 +28,26 @@ function StageConfig:new()
SpearheadConfig.StageConfig = {} SpearheadConfig.StageConfig = {}
end end
---@type StageConfig local self = setmetatable({}, StageConfig)
local o = { self.isEnabled = SpearheadConfig.StageConfig.enabled ~= false
isEnabled = SpearheadConfig.StageConfig.enabled ~= false, self.isDrawStagesEnabled = SpearheadConfig.StageConfig.drawStages ~= false
isDrawStagesEnabled = SpearheadConfig.StageConfig.drawStages ~= false, self.isAutoStages = SpearheadConfig.StageConfig.autoStages ~= false
isAutoStages = SpearheadConfig.StageConfig.autoStages ~= false, self.startingStage = SpearheadConfig.StageConfig.startingStage or 1
startingStage = SpearheadConfig.StageConfig.startingStage or 1, self.maxMissionsPerStage = SpearheadConfig.StageConfig.maxMissionStage or 10
maxMissionsPerStage = SpearheadConfig.StageConfig.maxMissionStage or 10, self.isDrawPreActivatedEnabled = SpearheadConfig.StageConfig.drawPreActivated ~= false
isDrawPreActivatedEnabled = SpearheadConfig.StageConfig.drawPreActivated ~= false, self.AmountPreactivateStage = SpearheadConfig.StageConfig.preactivateStage or 1
AmountPreactivateStage = SpearheadConfig.StageConfig.preactivateStage or 1, self.briefingOnSpawnEnabled = SpearheadConfig.StageConfig.briefingOnSpawn ~= false
}
setmetatable(o, { __index = self })
_logger:info("Successfully created StageConfig Object") _logger:info("Successfully created StageConfig Object")
return o; return self;
end
local config = new();
---@return StageConfig
function StageConfig:getInstance()
return config
end end
return StageConfig return StageConfig
+23
View File
@@ -50,6 +50,19 @@ do
table.insert(OnStageNumberChangedHandlers, handler) table.insert(OnStageNumberChangedHandlers, handler)
end end
---@class OnStageNumberChangeCompleteListener
---@field OnStageNumberChangeComplete fun(self:OnStageNumberChangeCompleteListener, number:integer)
local OnStageNumberChangeCompleteListeners = {}
---@param listener OnStageNumberChangeCompleteListener
SpearheadEvents.AddStageNumberChangeCompleteListener = function(listener)
if type(listener) ~= "table" or type(listener.OnStageNumberChangeComplete) ~= "function" then
warn("Event handler not of type table/object with function OnStageNumberChangeComplete(self, number)")
return
end
table.insert(OnStageNumberChangeCompleteListeners, listener)
end
---@param newStageNumber number ---@param newStageNumber number
SpearheadEvents.PublishStageNumberChanged = function(newStageNumber) SpearheadEvents.PublishStageNumberChanged = function(newStageNumber)
pcall(function () pcall(function ()
@@ -71,6 +84,16 @@ do
logError(err) logError(err)
end end
end end
for _, callable in pairs(OnStageNumberChangeCompleteListeners) do
local succ, err = pcall(function()
callable:OnStageNumberChangeComplete(newStageNumber)
end)
if err then
logError(err)
end
end
Logger.new("Events", "INFO"):info("Published stage number changed to: " .. tostring(newStageNumber)) Logger.new("Events", "INFO"):info("Published stage number changed to: " .. tostring(newStageNumber))
end end
end end
@@ -1,11 +1,13 @@
local Events = require("classes.spearhead_events") local Events = require("classes.spearhead_events")
local Util = require("classes.util.Util") local Util = require("classes.util.Util")
local DcsUtil = require("classes.util.DcsUtil")
local Logger = require("classes.util.Logger") local Logger = require("classes.util.Logger")
local MissionEditorWarnings = require("classes.util.MissionEditorWarnings") local MissionEditorWarnings = require("classes.util.MissionEditorWarnings")
local ExtraStage = require("classes.stageClasses.Stages.ExtraStage") local ExtraStage = require("classes.stageClasses.Stages.ExtraStage")
local PrimaryStage = require("classes.stageClasses.Stages.PrimaryStage") local PrimaryStage = require("classes.stageClasses.Stages.PrimaryStage")
local WaitingStage = require("classes.stageClasses.Stages.WaitingStage") local WaitingStage = require("classes.stageClasses.Stages.WaitingStage")
local MissionCommandsHelper = require("classes.stageClasses.helpers.MissionCommandsHelper")
local StagesByName = {} local StagesByName = {}
@@ -20,10 +22,11 @@ local WaitingStagesByIndex = {}
local currentStage = -99 local currentStage = -99
---@class GlobalStageManager : StageCompleteListener, OnStageChangedListener ---@class GlobalStageManager : StageCompleteListener, OnStageChangedListener, OnStageNumberChangeCompleteListener
---@field private database Database ---@field private database Database
---@field private logger Logger ---@field private logger Logger
---@field private stageConfig StageConfig ---@field private stageConfig StageConfig
---@field private _missionCommandsHelper MissionCommandsHelper
local GlobalStageManager = {} local GlobalStageManager = {}
GlobalStageManager.__index = GlobalStageManager GlobalStageManager.__index = GlobalStageManager
@@ -41,6 +44,7 @@ function GlobalStageManager.NewAndStart(database, stageConfig, logLevel, spawnMa
local self = setmetatable({}, GlobalStageManager) local self = setmetatable({}, GlobalStageManager)
self.database = database self.database = database
self.stageConfig = stageConfig self.stageConfig = stageConfig
self._missionCommandsHelper = MissionCommandsHelper.getOrCreate()
self.logger = logger self.logger = logger
if stageConfig.isAutoStages ~= true then if stageConfig.isAutoStages ~= true then
@@ -214,6 +218,23 @@ function GlobalStageManager:OnStageNumberChanged(stageNumber)
self:UpdateDrawings(stageNumber) self:UpdateDrawings(stageNumber)
end end
function GlobalStageManager:OnStageNumberChangeComplete(stageNumber)
self.logger:debug("Stage number change complete to: " .. tostring(stageNumber))
local groups = {}
for _, player in pairs(DcsUtil.getAllPlayerUnits()) do
local group = player:getGroup()
if group then
groups[group:getID()] = group
end
end
for _, group in pairs(groups) do
self._missionCommandsHelper:OverviewToGroup(group:getID())
end
end
---@private ---@private
function GlobalStageManager:UpdateDrawings(stageNumber) function GlobalStageManager:UpdateDrawings(stageNumber)
self.logger:debug("Updating custom drawings for stage number: " .. tostring(stageNumber)) self.logger:debug("Updating custom drawings for stage number: " .. tostring(stageNumber))
@@ -43,9 +43,9 @@ function SupplyHub.new(database, logger, zoneName)
self._zone = DcsUtil.getZoneByName(zoneName) self._zone = DcsUtil.getZoneByName(zoneName)
self._supplyUnitsTracker = SupplyUnitsTracker.getOrCreate(logger.LogLevel) self._supplyUnitsTracker = SupplyUnitsTracker.getOrCreate()
self._inZone = {} self._inZone = {}
self._missionCommandsHelper = MissionCommandsHelper.getOrCreate(logger.LogLevel) self._missionCommandsHelper = MissionCommandsHelper.getOrCreate()
self._logger:debug("Creating Supply Hub zone: " .. self._zoneName) self._logger:debug("Creating Supply Hub zone: " .. self._zoneName)
@@ -117,7 +117,7 @@ function Stage:superNew(database, stageConfig, logger, initData, missionPriority
self._activeStage = -99 self._activeStage = -99
self._stageConfig = stageConfig or {} self._stageConfig = stageConfig or {}
self._missionCommandsHelper = MissionCommandsHelper.getOrCreate(logger.LogLevel) self._missionCommandsHelper = MissionCommandsHelper.getOrCreate()
local zone = DcsUtil.getZoneByName(self.zoneName) local zone = DcsUtil.getZoneByName(self.zoneName)
if zone then if zone then
@@ -4,6 +4,7 @@ local Logger = require("classes.util.Logger")
local SpearheadEvents = require("classes.spearhead_events") local SpearheadEvents = require("classes.spearhead_events")
local SupplyUnitsTracker = require("classes.stageClasses.helpers.SupplyUnitsTracker") local SupplyUnitsTracker = require("classes.stageClasses.helpers.SupplyUnitsTracker")
local SupplyConfigHelper = require("classes.stageClasses.helpers.SupplyConfigHelper") local SupplyConfigHelper = require("classes.stageClasses.helpers.SupplyConfigHelper")
local StageConfig = require("classes.configuration.StageConfig")
---@class MissionCommandsHelper ---@class MissionCommandsHelper
@@ -16,6 +17,7 @@ local SupplyConfigHelper = require("classes.stageClasses.helpers.SupplyConfigHel
---@field private _stageBriefings table<string, string> @table of stage briefings by stage name ---@field private _stageBriefings table<string, string> @table of stage briefings by stage name
---@field private _logger Logger @logger instance for logging ---@field private _logger Logger @logger instance for logging
---@field private _supplyUnitsTracker SupplyUnitsTracker @supply units tracker instance ---@field private _supplyUnitsTracker SupplyUnitsTracker @supply units tracker instance
---@field private _stageConfig StageConfig
local MissionCommandsHelper = {} local MissionCommandsHelper = {}
MissionCommandsHelper.__index = MissionCommandsHelper MissionCommandsHelper.__index = MissionCommandsHelper
@@ -23,8 +25,8 @@ MissionCommandsHelper.__index = MissionCommandsHelper
---@param groupPos Vec2 ---@param groupPos Vec2
local function sortMissions(list, groupPos) local function sortMissions(list, groupPos)
table.sort(list, function(a, b) table.sort(list, function(a, b)
local distA = Util.VectorDistance2d(groupPos, a.location or {x=0, y=0}) local distA = Util.VectorDistance2d(groupPos, a.location or { x = 0, y = 0 })
local distB = Util.VectorDistance2d(groupPos, b.location or {x=0, y=0}) local distB = Util.VectorDistance2d(groupPos, b.location or { x = 0, y = 0 })
return distA < distB; return distA < distB;
end) end)
end end
@@ -34,12 +36,11 @@ local id = 0
local instance = nil local instance = nil
---@return MissionCommandsHelper ---@return MissionCommandsHelper
---@param logLevel string @log level for the logger function MissionCommandsHelper.getOrCreate()
function MissionCommandsHelper.getOrCreate(logLevel)
if instance == nil then if instance == nil then
instance = setmetatable({}, MissionCommandsHelper) instance = setmetatable({}, MissionCommandsHelper)
instance._logger = Logger.new("MissionCommandsHelper", logLevel) instance._logger = Logger.new("MissionCommandsHelper")
instance._logger:info("Creating MissionCommandsHelper instance") instance._logger:info("Creating MissionCommandsHelper instance")
@@ -50,7 +51,9 @@ function MissionCommandsHelper.getOrCreate(logLevel)
instance.lastUpdate = 0 instance.lastUpdate = 0
instance._stageBriefings = {} instance._stageBriefings = {}
instance._supplyUnitsTracker = SupplyUnitsTracker.getOrCreate(logLevel) instance._stageConfig = StageConfig:getInstance()
instance._supplyUnitsTracker = SupplyUnitsTracker.getOrCreate()
instance._supplyUnitsTracker:AddOnSupplyUnitEventListener( instance._supplyUnitsTracker:AddOnSupplyUnitEventListener(
{ {
@@ -95,7 +98,6 @@ function MissionCommandsHelper.getOrCreate(logLevel)
timer.scheduleFunction(instance.updateContinuous, instance, timer.getTime() + 5) timer.scheduleFunction(instance.updateContinuous, instance, timer.getTime() + 5)
SpearheadEvents.AddOnPlayerEnterUnitListener(instance) SpearheadEvents.AddOnPlayerEnterUnitListener(instance)
end end
return instance return instance
@@ -124,12 +126,16 @@ function MissionCommandsHelper:RemoveMissionToCommands(mission)
self.updateNeeded = true self.updateNeeded = true
end end
---@param unit Unit ---@param unit Unit
function MissionCommandsHelper:OnPlayerEntersUnit(unit) function MissionCommandsHelper:OnPlayerEntersUnit(unit)
if unit then if unit then
local group = unit:getGroup() local group = unit:getGroup()
if group then self:updateCommandsForGroup(group:getID()) end if group then
self:updateCommandsForGroup(group:getID())
if self._stageConfig.briefingOnSpawnEnabled == true then
self:OverviewToGroup(group:getID())
end
end
end end
end end
@@ -164,111 +170,116 @@ local pinMissionCommand = function(args)
end end
end end
---@param groupID integer
function MissionCommandsHelper:OverviewToGroup(groupID)
local text = "Missions Overview\n\n"
local group = DcsUtil.GetPlayerGroupByGroupID(groupID)
---@type Vec2
local groupPos = { x = 0, y = 0 }
if group then
local pos = group:getUnit(1):getPosition().p
groupPos = { x = pos.x, y = pos.z }
end
---@param mission Mission
---@return string
local function formatLine(mission)
local distanceText = "?"
if group then
local lead = group:getUnit(1)
if lead and lead:isExist() == true then
local pos = lead:getPoint()
local Vec2Pos = { x = pos.x, y = pos.z }
local distance = Util.VectorDistance2d(Vec2Pos, mission.location) / 1852
distanceText = string.format("~%d", math.floor(distance))
end
end
return string.format("[%s]\t%s \t%s \t%s %% \t%s nM\n", mission.code, mission.missionTypeDisplay, mission.name,
mission:PercentageComplete(), distanceText)
end
for _, briefing in pairs(self._stageBriefings) do
text = text .. briefing .. "\n\n"
end
---Primary missions
text = text .. "Primary Missions\n"
---@type Array<Mission>
local primaryMissions = {}
for code, enabled in pairs(self.enabledByCode) do
if enabled == true then
local mission = self.missionsByCode[code]
if mission and mission:getState() == "ACTIVE" and mission.priority == "primary" then
table.insert(primaryMissions, mission)
end
end
end
sortMissions(primaryMissions, groupPos)
for _, mission in pairs(primaryMissions) do
text = text .. formatLine(mission)
end
---Secondary missions
text = text .. "\nSecondary Missions\n"
---@type Array<Mission>
local secondaryMissions = {}
for code, enabled in pairs(self.enabledByCode) do
if enabled == true then
local mission = self.missionsByCode[code]
if mission and mission:getState() == "ACTIVE" and mission.priority == "secondary" then
table.insert(secondaryMissions, mission)
end
end
end
sortMissions(secondaryMissions, groupPos)
for _, mission in pairs(secondaryMissions) do
text = text .. formatLine(mission)
end
trigger.action.outTextForGroup(groupID, text, 20, true)
end
---@private ---@private
function MissionCommandsHelper:AddOverviewCommand(groupID) function MissionCommandsHelper:AddOverviewCommand(groupID)
local MissionsOverviewToGroup = function (id) ---@class OverviewToGroupCommandArgs
---@field self MissionCommandsHelper @the MissionCommandsHelper instance
---@field groupId integer @the group ID of the player requesting the overview
local text = "Missions Overview\n\n" ---@param args OverviewToGroupCommandArgs
local MissionOverViewToGroup = function(args)
local group = DcsUtil.GetPlayerGroupByGroupID(id) args.self:OverviewToGroup(args.groupId)
---@type Vec2
local groupPos = { x=0, y=0 }
if group then
local pos = group:getUnit(1):getPosition().p
groupPos = { x= pos.x, y=pos.z }
end
---comment
---@param mission Mission
---@return string
local function formatLine(mission)
local distanceText = "?"
if group then
local lead = group:getUnit(1)
if lead and lead:isExist() == true then
local pos = lead:getPoint()
local Vec2Pos = { x= pos.x, y=pos.z }
local distance = Util.VectorDistance2d(Vec2Pos, mission.location) / 1852
distanceText = string.format("~%d", math.floor(distance))
end
end
return string.format("[%s]\t%s \t%s \t%s %% \t%s nM\n", mission.code, mission.missionTypeDisplay, mission.name, mission:PercentageComplete(), distanceText)
end
for _, briefing in pairs(self._stageBriefings) do
text = text .. briefing .. "\n\n"
end
---Primary missions
text = text .. "Primary Missions\n"
---@type Array<Mission>
local primaryMissions = {}
for code, enabled in pairs(self.enabledByCode) do
if enabled == true then
local mission = self.missionsByCode[code]
if mission and mission:getState() == "ACTIVE" and mission.priority == "primary" then
table.insert(primaryMissions, mission)
end
end
end
sortMissions(primaryMissions, groupPos)
for _, mission in pairs(primaryMissions) do
text = text .. formatLine(mission)
end
---Secondary missions
text = text .. "\nSecondary Missions\n"
---@type Array<Mission>
local secondaryMissions = {}
for code, enabled in pairs(self.enabledByCode) do
if enabled == true then
local mission = self.missionsByCode[code]
if mission and mission:getState() == "ACTIVE" and mission.priority == "secondary" then
table.insert(secondaryMissions, mission)
end
end
end
sortMissions(secondaryMissions, groupPos)
for _, mission in pairs(secondaryMissions) do
text = text .. formatLine(mission)
end
trigger.action.outTextForGroup(id, text, 20, true)
end end
missionCommands.removeItemForGroup(groupID, { "Overview" } ) ---@type OverviewToGroupCommandArgs
missionCommands.addCommandForGroup(groupID, "Overview", nil, MissionsOverviewToGroup, groupID) local overviewToGroupCommandArgs = { self = self, groupId = groupID }
missionCommands.removeItemForGroup(groupID, { "Overview" })
missionCommands.addCommandForGroup(groupID, "Overview", nil, MissionOverViewToGroup, overviewToGroupCommandArgs)
end end
---@private ---@private
---@param groupID number ---@param groupID number
function MissionCommandsHelper:AddPinnedMission(groupID) function MissionCommandsHelper:AddPinnedMission(groupID)
local pinndedMission = self.pinnedByGroup[tostring(groupID)] local pinndedMission = self.pinnedByGroup[tostring(groupID)]
missionCommands.removeItemForGroup(groupID, { "Pinned Mission" }) missionCommands.removeItemForGroup(groupID, { "Pinned Mission" })
if pinndedMission and self.enabledByCode[tostring(pinndedMission.code)] == true then if pinndedMission and self.enabledByCode[tostring(pinndedMission.code)] == true then
missionCommands.addCommandForGroup(groupID, "Pinned Mission", nil, missionBriefingRequested, { groupId = groupID, mission = pinndedMission }) missionCommands.addCommandForGroup(groupID, "Pinned Mission", nil, missionBriefingRequested,
{ groupId = groupID, mission = pinndedMission })
end end
end end
---@param groupID number ---@param groupID number
function MissionCommandsHelper:updateCommandsForGroup(groupID) function MissionCommandsHelper:updateCommandsForGroup(groupID)
self._logger:debug("Updating commands for group: " .. tostring(groupID)) self._logger:debug("Updating commands for group: " .. tostring(groupID))
self:AddPinnedMission(groupID) self:AddPinnedMission(groupID)
@@ -286,15 +297,14 @@ function MissionCommandsHelper:updateCommandsForGroup(groupID)
trigger.action.outTextForGroup(id, "clearing...", 1, true) trigger.action.outTextForGroup(id, "clearing...", 1, true)
end end
missionCommands.removeItemForGroup(groupID, { "Clear View" } ) missionCommands.removeItemForGroup(groupID, { "Clear View" })
missionCommands.addCommandForGroup(groupID, "Clear View", nil, clearView, groupID) missionCommands.addCommandForGroup(groupID, "Clear View", nil, clearView, groupID)
missionCommands.removeItemForGroup(groupID, { "Refresh Missions" } ) missionCommands.removeItemForGroup(groupID, { "Refresh Missions" })
missionCommands.addCommandForGroup(groupID, "Refresh Missions", nil, function(refresh_mission_id) missionCommands.addCommandForGroup(groupID, "Refresh Missions", nil, function(refresh_mission_id)
self._logger:debug("Manual refresh of missions for group: " .. tostring(refresh_mission_id)) self._logger:debug("Manual refresh of missions for group: " .. tostring(refresh_mission_id))
self:updateCommandsForGroup(refresh_mission_id) self:updateCommandsForGroup(refresh_mission_id)
end, groupID) end, groupID)
end end
local folderNames = { local folderNames = {
@@ -317,15 +327,14 @@ function MissionCommandsHelper:PinMission(mission, groupID)
end end
function MissionCommandsHelper:AddAllMissionCommandsToGroup(groupID) function MissionCommandsHelper:AddAllMissionCommandsToGroup(groupID)
local perFolder = 9 local perFolder = 9
local group = DcsUtil.GetPlayerGroupByGroupID(groupID) local group = DcsUtil.GetPlayerGroupByGroupID(groupID)
---@type Vec2 ---@type Vec2
local groupPos = { x=0, y=0 } local groupPos = { x = 0, y = 0 }
if group then if group then
local pos = group:getUnit(1):getPosition().p local pos = group:getUnit(1):getPosition().p
groupPos = { x= pos.x, y=pos.z } groupPos = { x = pos.x, y = pos.z }
end end
do --- primary missions do --- primary missions
@@ -353,7 +362,7 @@ function MissionCommandsHelper:AddAllMissionCommandsToGroup(groupID)
else else
local name = "Next Menu ..." local name = "Next Menu ..."
missionCommands.addSubMenuForGroup(groupID, name, path) missionCommands.addSubMenuForGroup(groupID, name, path)
path[#path+1] = name path[#path + 1] = name
count = 0 count = 0
end end
end end
@@ -382,7 +391,7 @@ function MissionCommandsHelper:AddAllMissionCommandsToGroup(groupID)
else else
local name = "Next Menu ..." local name = "Next Menu ..."
missionCommands.addSubMenuForGroup(groupID, name, path) missionCommands.addSubMenuForGroup(groupID, name, path)
path[#path+1] = name path[#path + 1] = name
count = 0 count = 0
end end
end end
@@ -395,28 +404,28 @@ end
---@param path Array<string> ---@param path Array<string>
---@param mission Mission ---@param mission Mission
function MissionCommandsHelper:addMissionCommands(groupId, path, mission) function MissionCommandsHelper:addMissionCommands(groupId, path, mission)
if path then if path then
local group = DcsUtil.GetPlayerGroupByGroupID(groupId) local group = DcsUtil.GetPlayerGroupByGroupID(groupId)
local distance = "[?]" local distance = "[?]"
if group then if group then
local lead = group:getUnit(1) local lead = group:getUnit(1)
if lead and lead:isExist() == true then if lead and lead:isExist() == true then
local pos = lead:getPoint() local pos = lead:getPoint()
local Vec2Pos = { x= pos.x, y=pos.z } local Vec2Pos = { x = pos.x, y = pos.z }
local dist = Util.VectorDistance2d(Vec2Pos, mission.location) / 1852 local dist = Util.VectorDistance2d(Vec2Pos, mission.location) / 1852
distance = "[" .. string.format("~%dnM", math.floor(dist)) .. "]" distance = "[" .. string.format("~%dnM", math.floor(dist)) .. "]"
end end
end end
local missionFolderName = "[" .. mission.code .. "]" .. distance .. mission.name .. "( " .. mission.missionTypeDisplay .. " )" local missionFolderName = "[" ..
mission.code .. "]" .. distance .. mission.name .. "( " .. mission.missionTypeDisplay .. " )"
missionCommands.addSubMenuForGroup(groupId, missionFolderName, path) missionCommands.addSubMenuForGroup(groupId, missionFolderName, path)
table.insert(path, missionFolderName) table.insert(path, missionFolderName)
---@type MissionBriefingRequestedArgs ---@type MissionBriefingRequestedArgs
local missionBriefingRequestedArgs = { groupId = groupId, mission = mission } local missionBriefingRequestedArgs = { groupId = groupId, mission = mission }
missionCommands.addCommandForGroup(groupId, "Briefing", path, missionBriefingRequested,missionBriefingRequestedArgs) missionCommands.addCommandForGroup(groupId, "Briefing", path, missionBriefingRequested,
missionBriefingRequestedArgs)
---@type PinMissionCommandArgs ---@type PinMissionCommandArgs
local pinMissionCommandArgs = { self = self, groupId = groupId, mission = mission } local pinMissionCommandArgs = { self = self, groupId = groupId, mission = mission }
@@ -427,7 +436,6 @@ end
---@private ---@private
---@param groupID integer ---@param groupID integer
function MissionCommandsHelper:AddSupplyHubCommandsIfApplicable(groupID) function MissionCommandsHelper:AddSupplyHubCommandsIfApplicable(groupID)
if self._supplyUnitsTracker:IsGroupLeadInSupplyHub(groupID) ~= true then return end if self._supplyUnitsTracker:IsGroupLeadInSupplyHub(groupID) ~= true then return end
self._logger:debug("Adding supply hub commands for group: " .. tostring(groupID)) self._logger:debug("Adding supply hub commands for group: " .. tostring(groupID))
@@ -458,28 +466,32 @@ function MissionCommandsHelper:AddSupplyHubCommandsIfApplicable(groupID)
local path = { [1] = folderNames.supplyHub } local path = { [1] = folderNames.supplyHub }
---@type LoadCargoCommandParams ---@type LoadCargoCommandParams
local farpParams1000 = { unitID = unit:getID(), groupID = group:getID(), crateType = "FARP_CRATE_1000", supplyUnitsTracker = self._supplyUnitsTracker, commandHelper = self } local farpParams1000 = { unitID = unit:getID(), groupID = group:getID(), crateType = "FARP_CRATE_1000", supplyUnitsTracker =
self._supplyUnitsTracker, commandHelper = self }
missionCommands.addCommandForGroup(groupID, "Load FARP Crate (1000)", path, loadCargoCommand, farpParams1000) missionCommands.addCommandForGroup(groupID, "Load FARP Crate (1000)", path, loadCargoCommand, farpParams1000)
---@type LoadCargoCommandParams ---@type LoadCargoCommandParams
local farpParams2000 = { unitID = unit:getID(), groupID = group:getID(), crateType = "FARP_CRATE_2000", supplyUnitsTracker = self._supplyUnitsTracker, commandHelper = self } local farpParams2000 = { unitID = unit:getID(), groupID = group:getID(), crateType = "FARP_CRATE_2000", supplyUnitsTracker =
self._supplyUnitsTracker, commandHelper = self }
missionCommands.addCommandForGroup(groupID, "Load FARP Crate (2000)", path, loadCargoCommand, farpParams2000) missionCommands.addCommandForGroup(groupID, "Load FARP Crate (2000)", path, loadCargoCommand, farpParams2000)
---@type LoadCargoCommandParams ---@type LoadCargoCommandParams
local samParms1000 = { unitID = unit:getID(), groupID = group:getID(), crateType = "SAM_CRATE_2000", supplyUnitsTracker = self._supplyUnitsTracker, commandHelper = self } local samParms1000 = { unitID = unit:getID(), groupID = group:getID(), crateType = "SAM_CRATE_2000", supplyUnitsTracker =
self._supplyUnitsTracker, commandHelper = self }
missionCommands.addCommandForGroup(groupID, "Load SAM Crate (1000)", path, loadCargoCommand, samParms1000) missionCommands.addCommandForGroup(groupID, "Load SAM Crate (1000)", path, loadCargoCommand, samParms1000)
---@type LoadCargoCommandParams ---@type LoadCargoCommandParams
local samParms2000 = { unitID = unit:getID(), groupID = group:getID(), crateType = "SAM_CRATE_2000", supplyUnitsTracker = self._supplyUnitsTracker, commandHelper = self } local samParms2000 = { unitID = unit:getID(), groupID = group:getID(), crateType = "SAM_CRATE_2000", supplyUnitsTracker =
self._supplyUnitsTracker, commandHelper = self }
missionCommands.addCommandForGroup(groupID, "Load SAM Crate (2000)", path, loadCargoCommand, samParms2000) missionCommands.addCommandForGroup(groupID, "Load SAM Crate (2000)", path, loadCargoCommand, samParms2000)
---@type LoadCargoCommandParams ---@type LoadCargoCommandParams
local airbaseParms2000 = { unitID = unit:getID(), groupID = group:getID(), crateType = "AIRBASE_CRATE_2000", supplyUnitsTracker = self._supplyUnitsTracker, commandHelper = self } local airbaseParms2000 = { unitID = unit:getID(), groupID = group:getID(), crateType = "AIRBASE_CRATE_2000", supplyUnitsTracker =
self._supplyUnitsTracker, commandHelper = self }
missionCommands.addCommandForGroup(groupID, "Airbase Crate (2000)", path, loadCargoCommand, airbaseParms2000) missionCommands.addCommandForGroup(groupID, "Airbase Crate (2000)", path, loadCargoCommand, airbaseParms2000)
end end
function MissionCommandsHelper:AddCargoCommands(groupID) function MissionCommandsHelper:AddCargoCommands(groupID)
local group = DcsUtil.GetPlayerGroupByGroupID(groupID) local group = DcsUtil.GetPlayerGroupByGroupID(groupID)
if group == nil then return end if group == nil then return end
@@ -509,20 +521,19 @@ function MissionCommandsHelper:AddCargoCommands(groupID)
for i = 1, amount do for i = 1, amount do
local path = { [1] = folderNames.cargo } local path = { [1] = folderNames.cargo }
---@type UnloadCargoCommandParams ---@type UnloadCargoCommandParams
local params = { unitID = unit:getID(), crateType = cargoType, supplyUnitsTracker = self._supplyUnitsTracker, commandHelper = self } local params = { unitID = unit:getID(), crateType = cargoType, supplyUnitsTracker = self
missionCommands.addCommandForGroup(groupID, "Unload " .. cargoConfig.displayName, path, unloadCargoCommand, params) ._supplyUnitsTracker, commandHelper = self }
missionCommands.addCommandForGroup(groupID, "Unload " .. cargoConfig.displayName, path,
unloadCargoCommand, params)
end end
end end
end end
end end
end end
---@private ---@private
---@param groupId integer ---@param groupId integer
function MissionCommandsHelper:addMissionFolders(groupId) function MissionCommandsHelper:addMissionFolders(groupId)
missionCommands.addSubMenuForGroup(groupId, folderNames.primary) missionCommands.addSubMenuForGroup(groupId, folderNames.primary)
missionCommands.addSubMenuForGroup(groupId, folderNames.secondary) missionCommands.addSubMenuForGroup(groupId, folderNames.secondary)
@@ -26,13 +26,12 @@ SupplyUnitsTracker.__index = SupplyUnitsTracker
local singleton = nil local singleton = nil
---comment ---comment
---@param logLevel LogLevel
---@return SupplyUnitsTracker ---@return SupplyUnitsTracker
function SupplyUnitsTracker.getOrCreate(logLevel) function SupplyUnitsTracker.getOrCreate()
if singleton == nil then if singleton == nil then
singleton = setmetatable({}, SupplyUnitsTracker) singleton = setmetatable({}, SupplyUnitsTracker)
singleton._logger = Logger.new("SupplyUnitsTracker", logLevel) singleton._logger = Logger.new("SupplyUnitsTracker")
singleton._unitPositions = {} singleton._unitPositions = {}
singleton._cargoInUnits = {} singleton._cargoInUnits = {}
singleton._supplyUnitsByName = {} singleton._supplyUnitsByName = {}
@@ -78,7 +78,7 @@ function BuildableMission.new(database, logger, targetZone, noLandingZone, requi
self._onCrateDroppedOfListeners = {} self._onCrateDroppedOfListeners = {}
self._completeListeners = {} self._completeListeners = {}
self._markIDsPerGroup = {} self._markIDsPerGroup = {}
self._supplyUnitsTracker = SupplyUnitsTracker.getOrCreate(logger.LogLevel) self._supplyUnitsTracker = SupplyUnitsTracker.getOrCreate()
self._state = "NEW" self._state = "NEW"
@@ -89,7 +89,7 @@ function BuildableMission.new(database, logger, targetZone, noLandingZone, requi
self.priority = "secondary" self.priority = "secondary"
self._missionCommandsHelper = MissionCommandsHelper.getOrCreate(self._logger.LogLevel) self._missionCommandsHelper = MissionCommandsHelper.getOrCreate()
self._crateType = requiredCrateType self._crateType = requiredCrateType
@@ -52,7 +52,7 @@ function Mission.newSuper(self, zoneName, missionName, missionType, missionBrief
self.location = database:GetLocationForMissionZone(zoneName) self.location = database:GetLocationForMissionZone(zoneName)
self.missionTypeDisplay = self.missionType self.missionTypeDisplay = self.missionType
self._missionCommandsHelper = MissionCommandsHelper.getOrCreate(logger.LogLevel) self._missionCommandsHelper = MissionCommandsHelper.getOrCreate()
return true, "success" return true, "success"
end end
+2 -2
View File
@@ -28,10 +28,10 @@ SpearheadEvents.Init(defaultLogLevel)
local dbLogger = Logger.new("database", defaultLogLevel) local dbLogger = Logger.new("database", defaultLogLevel)
local standardLogger = Logger.new("", defaultLogLevel) local standardLogger = Logger.new("", defaultLogLevel)
local databaseManager = Database.New(dbLogger) local databaseManager = Database.New(dbLogger)
MissionCommandsHelper.getOrCreate(defaultLogLevel) -- initiate MissionCommandsHelper.getOrCreate() -- initiate
local capConfig = CapConfig:new(); local capConfig = CapConfig:new();
local stageConfig = StageConfig:new(); local stageConfig = StageConfig:getInstance();
local startingStage = stageConfig.startingStage or 1 local startingStage = stageConfig.startingStage or 1
if SpearheadConfig and SpearheadConfig.Persistence and SpearheadConfig.Persistence.enabled == true then if SpearheadConfig and SpearheadConfig.Persistence and SpearheadConfig.Persistence.enabled == true then