From 7c0c5e4a85fdc74b3f0772e9eb273dd9e5f5590c Mon Sep 17 00:00:00 2001 From: dutchie031 Date: Thu, 20 Aug 2026 14:06:42 +0000 Subject: [PATCH] updated briefings to be shown during spawn (#31) fixes #26 Reviewed-on: https://git.dutchie031.com/Spearhead/spearhead/pulls/31 Co-authored-by: dutchie031 --- RELEASENOTES.md | 4 + src/classes/configuration/StageConfig.lua | 34 ++- src/classes/spearhead_events.lua | 23 ++ .../stageClasses/GlobalStageManager.lua | 23 +- .../stageClasses/SpecialZones/SupplyHub.lua | 4 +- .../stageClasses/Stages/BaseStage/Stage.lua | 2 +- .../helpers/MissionCommandsHelper.lua | 251 +++++++++--------- .../helpers/SupplyUnitsTracker.lua | 5 +- .../missions/BuildableMission.lua | 4 +- .../missions/baseMissions/Mission.lua | 2 +- src/main.lua | 4 +- 11 files changed, 210 insertions(+), 146 deletions(-) diff --git a/RELEASENOTES.md b/RELEASENOTES.md index f8860f7..0637357 100644 --- a/RELEASENOTES.md +++ b/RELEASENOTES.md @@ -5,6 +5,10 @@ ### 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 - Issue #11 diff --git a/src/classes/configuration/StageConfig.lua b/src/classes/configuration/StageConfig.lua index f6a3692..94590db 100644 --- a/src/classes/configuration/StageConfig.lua +++ b/src/classes/configuration/StageConfig.lua @@ -7,14 +7,16 @@ --- @field startingStage integer --- @field maxMissionsPerStage integer --- @field AmountPreactivateStage integer +--- @field briefingOnSpawnEnabled boolean local StageConfig = {}; +StageConfig.__index = StageConfig local Logger = require("classes.util.Logger") local _logger = Logger.new("StageConfig", Logger.LogLevel) ---comment ---@return StageConfig -function StageConfig:new() +local function new() if SpearheadConfig == nil then _logger:warn("SpearheadConfig is nil, creating default SpearheadConfig") @@ -26,22 +28,26 @@ function StageConfig:new() SpearheadConfig.StageConfig = {} end - ---@type StageConfig - local o = { - isEnabled = SpearheadConfig.StageConfig.enabled ~= false, - isDrawStagesEnabled = SpearheadConfig.StageConfig.drawStages ~= false, - isAutoStages = SpearheadConfig.StageConfig.autoStages ~= false, - startingStage = SpearheadConfig.StageConfig.startingStage or 1, - maxMissionsPerStage = SpearheadConfig.StageConfig.maxMissionStage or 10, - isDrawPreActivatedEnabled = SpearheadConfig.StageConfig.drawPreActivated ~= false, - AmountPreactivateStage = SpearheadConfig.StageConfig.preactivateStage or 1, - } - - setmetatable(o, { __index = self }) + local self = setmetatable({}, StageConfig) + self.isEnabled = SpearheadConfig.StageConfig.enabled ~= false + self.isDrawStagesEnabled = SpearheadConfig.StageConfig.drawStages ~= false + self.isAutoStages = SpearheadConfig.StageConfig.autoStages ~= false + self.startingStage = SpearheadConfig.StageConfig.startingStage or 1 + self.maxMissionsPerStage = SpearheadConfig.StageConfig.maxMissionStage or 10 + self.isDrawPreActivatedEnabled = SpearheadConfig.StageConfig.drawPreActivated ~= false + self.AmountPreactivateStage = SpearheadConfig.StageConfig.preactivateStage or 1 + self.briefingOnSpawnEnabled = SpearheadConfig.StageConfig.briefingOnSpawn ~= false _logger:info("Successfully created StageConfig Object") - return o; + return self; +end + +local config = new(); + +---@return StageConfig +function StageConfig:getInstance() + return config end return StageConfig \ No newline at end of file diff --git a/src/classes/spearhead_events.lua b/src/classes/spearhead_events.lua index 1ac612e..f3f19fd 100644 --- a/src/classes/spearhead_events.lua +++ b/src/classes/spearhead_events.lua @@ -50,6 +50,19 @@ do table.insert(OnStageNumberChangedHandlers, handler) 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 SpearheadEvents.PublishStageNumberChanged = function(newStageNumber) pcall(function () @@ -71,6 +84,16 @@ do logError(err) 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)) end end diff --git a/src/classes/stageClasses/GlobalStageManager.lua b/src/classes/stageClasses/GlobalStageManager.lua index 71a636c..b8b372c 100644 --- a/src/classes/stageClasses/GlobalStageManager.lua +++ b/src/classes/stageClasses/GlobalStageManager.lua @@ -1,11 +1,13 @@ local Events = require("classes.spearhead_events") local Util = require("classes.util.Util") +local DcsUtil = require("classes.util.DcsUtil") local Logger = require("classes.util.Logger") local MissionEditorWarnings = require("classes.util.MissionEditorWarnings") local ExtraStage = require("classes.stageClasses.Stages.ExtraStage") local PrimaryStage = require("classes.stageClasses.Stages.PrimaryStage") local WaitingStage = require("classes.stageClasses.Stages.WaitingStage") +local MissionCommandsHelper = require("classes.stageClasses.helpers.MissionCommandsHelper") local StagesByName = {} @@ -20,10 +22,11 @@ local WaitingStagesByIndex = {} local currentStage = -99 ----@class GlobalStageManager : StageCompleteListener, OnStageChangedListener +---@class GlobalStageManager : StageCompleteListener, OnStageChangedListener, OnStageNumberChangeCompleteListener ---@field private database Database ---@field private logger Logger ---@field private stageConfig StageConfig +---@field private _missionCommandsHelper MissionCommandsHelper local GlobalStageManager = {} GlobalStageManager.__index = GlobalStageManager @@ -41,6 +44,7 @@ function GlobalStageManager.NewAndStart(database, stageConfig, logLevel, spawnMa local self = setmetatable({}, GlobalStageManager) self.database = database self.stageConfig = stageConfig + self._missionCommandsHelper = MissionCommandsHelper.getOrCreate() self.logger = logger if stageConfig.isAutoStages ~= true then @@ -214,6 +218,23 @@ function GlobalStageManager:OnStageNumberChanged(stageNumber) self:UpdateDrawings(stageNumber) 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 function GlobalStageManager:UpdateDrawings(stageNumber) self.logger:debug("Updating custom drawings for stage number: " .. tostring(stageNumber)) diff --git a/src/classes/stageClasses/SpecialZones/SupplyHub.lua b/src/classes/stageClasses/SpecialZones/SupplyHub.lua index b01ee26..c05aba5 100644 --- a/src/classes/stageClasses/SpecialZones/SupplyHub.lua +++ b/src/classes/stageClasses/SpecialZones/SupplyHub.lua @@ -43,9 +43,9 @@ function SupplyHub.new(database, logger, zoneName) self._zone = DcsUtil.getZoneByName(zoneName) - self._supplyUnitsTracker = SupplyUnitsTracker.getOrCreate(logger.LogLevel) + self._supplyUnitsTracker = SupplyUnitsTracker.getOrCreate() self._inZone = {} - self._missionCommandsHelper = MissionCommandsHelper.getOrCreate(logger.LogLevel) + self._missionCommandsHelper = MissionCommandsHelper.getOrCreate() self._logger:debug("Creating Supply Hub zone: " .. self._zoneName) diff --git a/src/classes/stageClasses/Stages/BaseStage/Stage.lua b/src/classes/stageClasses/Stages/BaseStage/Stage.lua index 442e784..9ce9183 100644 --- a/src/classes/stageClasses/Stages/BaseStage/Stage.lua +++ b/src/classes/stageClasses/Stages/BaseStage/Stage.lua @@ -117,7 +117,7 @@ function Stage:superNew(database, stageConfig, logger, initData, missionPriority self._activeStage = -99 self._stageConfig = stageConfig or {} - self._missionCommandsHelper = MissionCommandsHelper.getOrCreate(logger.LogLevel) + self._missionCommandsHelper = MissionCommandsHelper.getOrCreate() local zone = DcsUtil.getZoneByName(self.zoneName) if zone then diff --git a/src/classes/stageClasses/helpers/MissionCommandsHelper.lua b/src/classes/stageClasses/helpers/MissionCommandsHelper.lua index 1328af3..b9f33fb 100644 --- a/src/classes/stageClasses/helpers/MissionCommandsHelper.lua +++ b/src/classes/stageClasses/helpers/MissionCommandsHelper.lua @@ -4,6 +4,7 @@ local Logger = require("classes.util.Logger") local SpearheadEvents = require("classes.spearhead_events") local SupplyUnitsTracker = require("classes.stageClasses.helpers.SupplyUnitsTracker") local SupplyConfigHelper = require("classes.stageClasses.helpers.SupplyConfigHelper") +local StageConfig = require("classes.configuration.StageConfig") ---@class MissionCommandsHelper @@ -16,6 +17,7 @@ local SupplyConfigHelper = require("classes.stageClasses.helpers.SupplyConfigHel ---@field private _stageBriefings table @table of stage briefings by stage name ---@field private _logger Logger @logger instance for logging ---@field private _supplyUnitsTracker SupplyUnitsTracker @supply units tracker instance +---@field private _stageConfig StageConfig local MissionCommandsHelper = {} MissionCommandsHelper.__index = MissionCommandsHelper @@ -23,8 +25,8 @@ MissionCommandsHelper.__index = MissionCommandsHelper ---@param groupPos Vec2 local function sortMissions(list, groupPos) table.sort(list, function(a, b) - 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 distA = Util.VectorDistance2d(groupPos, a.location or { x = 0, y = 0 }) + local distB = Util.VectorDistance2d(groupPos, b.location or { x = 0, y = 0 }) return distA < distB; end) end @@ -34,12 +36,11 @@ local id = 0 local instance = nil ---@return MissionCommandsHelper ----@param logLevel string @log level for the logger -function MissionCommandsHelper.getOrCreate(logLevel) +function MissionCommandsHelper.getOrCreate() if instance == nil then instance = setmetatable({}, MissionCommandsHelper) - instance._logger = Logger.new("MissionCommandsHelper", logLevel) + instance._logger = Logger.new("MissionCommandsHelper") instance._logger:info("Creating MissionCommandsHelper instance") @@ -50,7 +51,9 @@ function MissionCommandsHelper.getOrCreate(logLevel) instance.lastUpdate = 0 instance._stageBriefings = {} - instance._supplyUnitsTracker = SupplyUnitsTracker.getOrCreate(logLevel) + instance._stageConfig = StageConfig:getInstance() + + instance._supplyUnitsTracker = SupplyUnitsTracker.getOrCreate() instance._supplyUnitsTracker:AddOnSupplyUnitEventListener( { @@ -95,7 +98,6 @@ function MissionCommandsHelper.getOrCreate(logLevel) timer.scheduleFunction(instance.updateContinuous, instance, timer.getTime() + 5) SpearheadEvents.AddOnPlayerEnterUnitListener(instance) - end return instance @@ -124,12 +126,16 @@ function MissionCommandsHelper:RemoveMissionToCommands(mission) self.updateNeeded = true end - ---@param unit Unit function MissionCommandsHelper:OnPlayerEntersUnit(unit) if unit then 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 @@ -164,111 +170,116 @@ local pinMissionCommand = function(args) 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 + 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 + 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 function MissionCommandsHelper:AddOverviewCommand(groupID) - local MissionsOverviewToGroup = function (id) - - local text = "Missions Overview\n\n" + ---@class OverviewToGroupCommandArgs + ---@field self MissionCommandsHelper @the MissionCommandsHelper instance + ---@field groupId integer @the group ID of the player requesting the overview - local group = DcsUtil.GetPlayerGroupByGroupID(id) - ---@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 - 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 - 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) + ---@param args OverviewToGroupCommandArgs + local MissionOverViewToGroup = function(args) + args.self:OverviewToGroup(args.groupId) end - missionCommands.removeItemForGroup(groupID, { "Overview" } ) - missionCommands.addCommandForGroup(groupID, "Overview", nil, MissionsOverviewToGroup, groupID) + ---@type OverviewToGroupCommandArgs + local overviewToGroupCommandArgs = { self = self, groupId = groupID } + + missionCommands.removeItemForGroup(groupID, { "Overview" }) + missionCommands.addCommandForGroup(groupID, "Overview", nil, MissionOverViewToGroup, overviewToGroupCommandArgs) end ---@private ---@param groupID number function MissionCommandsHelper:AddPinnedMission(groupID) - local pinndedMission = self.pinnedByGroup[tostring(groupID)] missionCommands.removeItemForGroup(groupID, { "Pinned Mission" }) 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 ---@param groupID number function MissionCommandsHelper:updateCommandsForGroup(groupID) - self._logger:debug("Updating commands for group: " .. tostring(groupID)) self:AddPinnedMission(groupID) @@ -286,15 +297,14 @@ function MissionCommandsHelper:updateCommandsForGroup(groupID) trigger.action.outTextForGroup(id, "clearing...", 1, true) end - missionCommands.removeItemForGroup(groupID, { "Clear View" } ) + missionCommands.removeItemForGroup(groupID, { "Clear View" }) 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) self._logger:debug("Manual refresh of missions for group: " .. tostring(refresh_mission_id)) self:updateCommandsForGroup(refresh_mission_id) end, groupID) - end local folderNames = { @@ -317,17 +327,16 @@ function MissionCommandsHelper:PinMission(mission, groupID) end function MissionCommandsHelper:AddAllMissionCommandsToGroup(groupID) - local perFolder = 9 local group = DcsUtil.GetPlayerGroupByGroupID(groupID) ---@type Vec2 - local groupPos = { x=0, y=0 } + local groupPos = { x = 0, y = 0 } if group then local pos = group:getUnit(1):getPosition().p - groupPos = { x= pos.x, y=pos.z } + groupPos = { x = pos.x, y = pos.z } end - + do --- primary missions local count = 0 local path = { [1] = folderNames.primary } @@ -353,7 +362,7 @@ function MissionCommandsHelper:AddAllMissionCommandsToGroup(groupID) else local name = "Next Menu ..." missionCommands.addSubMenuForGroup(groupID, name, path) - path[#path+1] = name + path[#path + 1] = name count = 0 end end @@ -382,7 +391,7 @@ function MissionCommandsHelper:AddAllMissionCommandsToGroup(groupID) else local name = "Next Menu ..." missionCommands.addSubMenuForGroup(groupID, name, path) - path[#path+1] = name + path[#path + 1] = name count = 0 end end @@ -395,28 +404,28 @@ end ---@param path Array ---@param mission Mission function MissionCommandsHelper:addMissionCommands(groupId, path, mission) - if path then - local group = DcsUtil.GetPlayerGroupByGroupID(groupId) local distance = "[?]" 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 Vec2Pos = { x = pos.x, y = pos.z } local dist = Util.VectorDistance2d(Vec2Pos, mission.location) / 1852 distance = "[" .. string.format("~%dnM", math.floor(dist)) .. "]" 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) table.insert(path, missionFolderName) ---@type MissionBriefingRequestedArgs local missionBriefingRequestedArgs = { groupId = groupId, mission = mission } - missionCommands.addCommandForGroup(groupId, "Briefing", path, missionBriefingRequested,missionBriefingRequestedArgs) + missionCommands.addCommandForGroup(groupId, "Briefing", path, missionBriefingRequested, + missionBriefingRequestedArgs) ---@type PinMissionCommandArgs local pinMissionCommandArgs = { self = self, groupId = groupId, mission = mission } @@ -427,7 +436,6 @@ end ---@private ---@param groupID integer function MissionCommandsHelper:AddSupplyHubCommandsIfApplicable(groupID) - if self._supplyUnitsTracker:IsGroupLeadInSupplyHub(groupID) ~= true then return end self._logger:debug("Adding supply hub commands for group: " .. tostring(groupID)) @@ -458,28 +466,32 @@ function MissionCommandsHelper:AddSupplyHubCommandsIfApplicable(groupID) local path = { [1] = folderNames.supplyHub } ---@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) ---@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) ---@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) ---@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) ---@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) end function MissionCommandsHelper:AddCargoCommands(groupID) - local group = DcsUtil.GetPlayerGroupByGroupID(groupID) if group == nil then return end @@ -509,20 +521,19 @@ function MissionCommandsHelper:AddCargoCommands(groupID) for i = 1, amount do local path = { [1] = folderNames.cargo } ---@type UnloadCargoCommandParams - local params = { unitID = unit:getID(), crateType = cargoType, supplyUnitsTracker = self._supplyUnitsTracker, commandHelper = self } - missionCommands.addCommandForGroup(groupID, "Unload " .. cargoConfig.displayName, path, unloadCargoCommand, params) + local params = { unitID = unit:getID(), crateType = cargoType, supplyUnitsTracker = self + ._supplyUnitsTracker, commandHelper = self } + missionCommands.addCommandForGroup(groupID, "Unload " .. cargoConfig.displayName, path, + unloadCargoCommand, params) end end end end end - - ---@private ---@param groupId integer function MissionCommandsHelper:addMissionFolders(groupId) - missionCommands.addSubMenuForGroup(groupId, folderNames.primary) missionCommands.addSubMenuForGroup(groupId, folderNames.secondary) diff --git a/src/classes/stageClasses/helpers/SupplyUnitsTracker.lua b/src/classes/stageClasses/helpers/SupplyUnitsTracker.lua index d98d2e0..e83a582 100644 --- a/src/classes/stageClasses/helpers/SupplyUnitsTracker.lua +++ b/src/classes/stageClasses/helpers/SupplyUnitsTracker.lua @@ -26,13 +26,12 @@ SupplyUnitsTracker.__index = SupplyUnitsTracker local singleton = nil ---comment ----@param logLevel LogLevel ---@return SupplyUnitsTracker -function SupplyUnitsTracker.getOrCreate(logLevel) +function SupplyUnitsTracker.getOrCreate() if singleton == nil then singleton = setmetatable({}, SupplyUnitsTracker) - singleton._logger = Logger.new("SupplyUnitsTracker", logLevel) + singleton._logger = Logger.new("SupplyUnitsTracker") singleton._unitPositions = {} singleton._cargoInUnits = {} singleton._supplyUnitsByName = {} diff --git a/src/classes/stageClasses/missions/BuildableMission.lua b/src/classes/stageClasses/missions/BuildableMission.lua index d986d4c..7707c0c 100644 --- a/src/classes/stageClasses/missions/BuildableMission.lua +++ b/src/classes/stageClasses/missions/BuildableMission.lua @@ -78,7 +78,7 @@ function BuildableMission.new(database, logger, targetZone, noLandingZone, requi self._onCrateDroppedOfListeners = {} self._completeListeners = {} self._markIDsPerGroup = {} - self._supplyUnitsTracker = SupplyUnitsTracker.getOrCreate(logger.LogLevel) + self._supplyUnitsTracker = SupplyUnitsTracker.getOrCreate() self._state = "NEW" @@ -89,7 +89,7 @@ function BuildableMission.new(database, logger, targetZone, noLandingZone, requi self.priority = "secondary" - self._missionCommandsHelper = MissionCommandsHelper.getOrCreate(self._logger.LogLevel) + self._missionCommandsHelper = MissionCommandsHelper.getOrCreate() self._crateType = requiredCrateType diff --git a/src/classes/stageClasses/missions/baseMissions/Mission.lua b/src/classes/stageClasses/missions/baseMissions/Mission.lua index 22e183c..54b1afc 100644 --- a/src/classes/stageClasses/missions/baseMissions/Mission.lua +++ b/src/classes/stageClasses/missions/baseMissions/Mission.lua @@ -52,7 +52,7 @@ function Mission.newSuper(self, zoneName, missionName, missionType, missionBrief self.location = database:GetLocationForMissionZone(zoneName) self.missionTypeDisplay = self.missionType - self._missionCommandsHelper = MissionCommandsHelper.getOrCreate(logger.LogLevel) + self._missionCommandsHelper = MissionCommandsHelper.getOrCreate() return true, "success" end diff --git a/src/main.lua b/src/main.lua index fdc8f90..4d361f1 100644 --- a/src/main.lua +++ b/src/main.lua @@ -28,10 +28,10 @@ SpearheadEvents.Init(defaultLogLevel) local dbLogger = Logger.new("database", defaultLogLevel) local standardLogger = Logger.new("", defaultLogLevel) local databaseManager = Database.New(dbLogger) -MissionCommandsHelper.getOrCreate(defaultLogLevel) -- initiate +MissionCommandsHelper.getOrCreate() -- initiate local capConfig = CapConfig:new(); -local stageConfig = StageConfig:new(); +local stageConfig = StageConfig:getInstance(); local startingStage = stageConfig.startingStage or 1 if SpearheadConfig and SpearheadConfig.Persistence and SpearheadConfig.Persistence.enabled == true then