diff --git a/src/classes/persistence/Persistence.lua b/src/classes/persistence/Persistence.lua index 7e3331d..bc24cbe 100644 --- a/src/classes/persistence/Persistence.lua +++ b/src/classes/persistence/Persistence.lua @@ -33,6 +33,7 @@ do unitsStates = {}, random_missions = {}, deliveredKilos = {}, + activeStage = nil, -- Backwards compatibility for previous version without lanes activeStageInStageLane = {} } @@ -238,6 +239,21 @@ do Persistence._updateRequired = true end + ---Get the active stage as in the persistance file + ---@param stageLane string? + ---@return integer|nil + Persistence.GetActiveStage = function(stageLane) + stageLane = stageLane or "nil" + + -- backwards compatibility for previous versions without stage lanes + if stageLane == "nil" and tables.activeStageInStageLane[stageLane] == nil then + tables.activeStageInStageLane[stageLane] = tables.activeStage + tables.activeStage = nil -- Clear the old activeStage so it's not used or confused later + end + + return tables.activeStageInStageLane[stageLane] + end + ---comment ---@param missionName string ---@param pickedZone string @@ -257,13 +273,6 @@ do return tables.random_missions[string.lower(missionName)] end - ---Get the active stage as in the persistance file - ---@param stageLane string? - ---@return integer|nil - Persistence.GetActiveStage = function(stageLane) - stageLane = stageLane or "nil" - return tables.activeStageInStageLane[stageLane] - end ---comment ---@param zoneName string diff --git a/src/classes/spearhead_db.lua b/src/classes/spearhead_db.lua index d36fcfc..296e453 100644 --- a/src/classes/spearhead_db.lua +++ b/src/classes/spearhead_db.lua @@ -2,7 +2,7 @@ local Util = require("classes.util.Util") local DcsUtil = require("classes.util.DcsUtil") local MissionEditorWarnings = require("classes.util.MissionEditorWarnings") local MizGroupsManager = require("classes.helpers.MizGroupsManager") -local CustomDrawing = require("classes.stageClasses.drawings.CustomDrawing") +local StageDrawing = require("classes.stageClasses.drawings.StageDrawing") ---@class DatabaseTables @@ -27,7 +27,7 @@ local CustomDrawing = require("classes.stageClasses.drawings.CustomDrawing") ---@field MissionZoneData table ---@field FarpZoneData table ---@field missionCodes table ----@field CustomDrawings Array +---@field StageDrawings Array ---@class CapRoute ---@field zones Array @@ -107,7 +107,7 @@ function Database.New(Logger) FarpZoneData = {}, missionCodes = {}, SupplyHubZones = {}, - CustomDrawings = {} + StageDrawings = {} } Database.__index = Database @@ -231,8 +231,10 @@ function Database.New(Logger) for key, layer_object in pairs(layer.objects) do if Util.startswith(layer_object.name, "drawing_", true) then local object = layer_object --[[@as DrawingObject]] - local customDrawing = CustomDrawing.New(object) - table.insert(self._tables.CustomDrawings, customDrawing) + local stageDrawing = StageDrawing.New(object) + if stageDrawing then + table.insert(self._tables.StageDrawings, stageDrawing) + end end end end @@ -621,12 +623,12 @@ function Database:loadBlueSamUnits() end end ----@return Array -function Database:getCustomDrawings() - if self._tables.CustomDrawings == nil then +---@return Array +function Database:getStageDrawings() + if self._tables.StageDrawings == nil then return {} end - return self._tables.CustomDrawings + return self._tables.StageDrawings end ---Loads all units, data and briefings diff --git a/src/classes/spearhead_events.lua b/src/classes/spearhead_events.lua index 6b05b14..92ec417 100644 --- a/src/classes/spearhead_events.lua +++ b/src/classes/spearhead_events.lua @@ -35,10 +35,10 @@ do local OnStageNumberChangedListeners = {} local OnStageNumberChangedHandlers = {} ---Add a stage zone number changed listener - ---@param listener OnStageChangedListener object with function OnStageNumberChanged(self, number) + ---@param listener OnStageChangedListener object with function OnStageNumberChanged(self, number, stageLaneIdentifier) SpearheadEvents.AddStageNumberChangedListener = function(listener) if type(listener) ~= "table" or type(listener.OnStageNumberChanged) ~= "function" then - warn("Event handler not of type table/object with function OnStageNumberChanged(self, number)") + warn("Event handler not of type table/object with function OnStageNumberChanged(self, number, stageLaneIdentifier)") return end table.insert(OnStageNumberChangedListeners, listener) diff --git a/src/classes/stageClasses/GlobalStageManager.lua b/src/classes/stageClasses/GlobalStageManager.lua index b93c768..f6e36c1 100644 --- a/src/classes/stageClasses/GlobalStageManager.lua +++ b/src/classes/stageClasses/GlobalStageManager.lua @@ -337,17 +337,24 @@ function GlobalStageManager:OnStageNumberChangeComplete(stageNumber, stageLaneId end ---@private -function GlobalStageManager:UpdateDrawings(stageNumber) +---@param stageNumber number +---@param stageLaneIdentifier string? +function GlobalStageManager:UpdateDrawings(stageNumber, stageLaneIdentifier) self.logger:debug("Updating custom drawings for stage number: " .. tostring(stageNumber)) - local drawings = self.database:getCustomDrawings() + local drawings = self.database:getStageDrawings() for _, drawing in pairs(drawings) do - local startStage, stopStage = drawing:GetStartAndStop() - if stageNumber >= startStage and stageNumber < stopStage then - self.logger:debug("Drawing " .. drawing:GetName() .. " is active for stage number: " .. tostring(stageNumber)) - drawing:Draw() - else - self.logger:debug("Drawing " .. drawing:GetName() .. " is not active for stage number: " .. tostring(stageNumber)) - drawing:Remove() + local startStage = drawing:GetStartingStage() + local stopStage = drawing:GetRemoveAtStage() + local laneIdentifier = drawing:GetStageLaneIdentifier() + + if laneIdentifier == stageLaneIdentifier then + if stageNumber >= startStage and stageNumber < stopStage then + self.logger:debug("Drawing " .. drawing:GetName() .. " is active for stage number: " .. tostring(stageNumber)) + drawing:Draw() + else + self.logger:debug("Drawing " .. drawing:GetName() .. " is not active for stage number: " .. tostring(stageNumber)) + drawing:Remove() + end end end end diff --git a/src/classes/stageClasses/drawings/CustomDrawing.lua b/src/classes/stageClasses/drawings/CustomDrawing.lua index 71ba0a6..077d770 100644 --- a/src/classes/stageClasses/drawings/CustomDrawing.lua +++ b/src/classes/stageClasses/drawings/CustomDrawing.lua @@ -1,35 +1,25 @@ - local DrawingHelper = require("classes.stageClasses.drawings.helper.DrawingHelper") local Util = require("classes.util.Util") local Logger = require("classes.util.Logger") - - +local MissionEditorWarnings = require("classes.util.MissionEditorWarnings") local drawingLogger = Logger.new("CustomDrawing") + ---@class CustomDrawing ----@field private _id integer? ----@field private _drawingObject DrawingObject ----@field private _startingStage number ----@field private _removeAtStage number ----@field private _logger Logger +---@field protected _id integer? +---@field protected _name string? +---@field protected _drawingObject DrawingObject local CustomDrawing = {} CustomDrawing.__index = CustomDrawing - +---@protected ---@param drawingObject DrawingObject ----@return CustomDrawing +---@return CustomDrawing? function CustomDrawing.New(drawingObject) local self = setmetatable({}, CustomDrawing) self._drawingObject = drawingObject self._id = nil -- initiate ID as nil, when drawn it will be set to the ID returned by DrawingHelper.Draw - self._logger = drawingLogger - - local name = drawingObject.name - local split = Util.split_string(name or "", "_") - local secondPart = split[2] or "1" - local splitPart = Util.split_string(secondPart, ":") - self._startingStage = tonumber(splitPart[1]) or 1 - self._removeAtStage = tonumber(splitPart[2]) or math.huge + self._name = drawingObject.name return self end @@ -95,7 +85,6 @@ function CustomDrawing.FromZone(zone, colorString, fillColorString, lineStyle, l end if zone.zone_type == "Polygon" then - ---@type Free local drawingObject = { mapX = 0, @@ -110,7 +99,7 @@ function CustomDrawing.FromZone(zone, colorString, fillColorString, lineStyle, l fillColorString = fillColorString, thickness = lineThickness, } - + return CustomDrawing.New(drawingObject) end end @@ -120,25 +109,19 @@ function CustomDrawing:GetName() return self._drawingObject.name end ----@return number start ----@return number stop -function CustomDrawing:GetStartAndStop() - return self._startingStage, self._removeAtStage -end - function CustomDrawing:Draw() - self._logger:debug("Drawing custom drawing with ID " .. tostring(self._id)) + drawingLogger:debug("Drawing custom drawing with ID " .. tostring(self._id)) if self._id ~= nil then DrawingHelper.Remove(self._id) end - self._id = DrawingHelper.Draw(self._drawingObject, self._logger) + self._id = DrawingHelper.Draw(self._drawingObject) end function CustomDrawing:Remove() if self._id ~= nil then - self._logger:debug("Removing custom drawing with ID " .. tostring(self._id)) + drawingLogger:debug("Removing custom drawing with ID " .. tostring(self._id)) DrawingHelper.Remove(self._id) self._id = nil end @@ -149,4 +132,4 @@ function CustomDrawing:UpdateDrawingObject(updateFunc) self._drawingObject = updateFunc(self._drawingObject) end -return CustomDrawing \ No newline at end of file +return CustomDrawing diff --git a/src/classes/stageClasses/drawings/StageDrawing.lua b/src/classes/stageClasses/drawings/StageDrawing.lua new file mode 100644 index 0000000..ed0bb47 --- /dev/null +++ b/src/classes/stageClasses/drawings/StageDrawing.lua @@ -0,0 +1,93 @@ +local CustomDrawing = require("classes.stageClasses.drawings.CustomDrawing") +local Util = require("classes.util.Util") +local MissionEditorWarnings = require("classes.util.MissionEditorWarnings") +---@class StageDrawing : CustomDrawing +---@field private _startingStage number +---@field private _removeAtStage number +---@field private _stageLaneIdentifier string? +local StageDrawing = {} +StageDrawing.__index = StageDrawing +setmetatable(StageDrawing, CustomDrawing) + + +---@param drawingObject DrawingObject +---@return StageDrawing? +function StageDrawing.New(drawingObject) + + local super = CustomDrawing.New(drawingObject) + if not super then + return nil + end + local self = setmetatable(super, StageDrawing) --[[@as StageDrawing]] + + local split = Util.split_string(self._name or "", "_") + local secondPart = split[2] or "1" + local splitPart = Util.split_string(secondPart, ":") + if tonumber(splitPart[1]) == nil then + local laneIdentifier = string.sub(splitPart[1], 1, 1) + if tonumber(laneIdentifier) == nil then + self._stageLaneIdentifier = laneIdentifier + end + local startNumber = string.sub(splitPart[1], 2) + local startNumberVal = tonumber(startNumber) + if startNumberVal == nil then + MissionEditorWarnings.Add("Start number for " .. + self._name .. " is not a valid number: " .. tostring(startNumber)) + return nil + end + self._startingStage = startNumberVal + else + local startNumber = tonumber(splitPart[1]) + if startNumber == nil then + MissionEditorWarnings.Add("Start number for " .. + self._name .. " is not a valid number: " .. tostring(splitPart[1])) + return nil + end + self._startingStage = startNumber + end + + if tonumber(splitPart[2]) == nil then + local laneIdentifier = string.sub(splitPart[2], 1, 1) + if tonumber(laneIdentifier) == nil then + if self._stageLaneIdentifier and self._stageLaneIdentifier ~= laneIdentifier then + MissionEditorWarnings.Add("Lane identifiers do not match for " .. + self._name .. + ": " .. + self._stageLaneIdentifier .. + " vs " .. laneIdentifier .. ". Will only use stage " .. self._stageLaneIdentifier) + end + end + local stopNumber = string.sub(splitPart[2], 2) + local stopNumberVal = tonumber(stopNumber) + if stopNumberVal == nil then + MissionEditorWarnings.Add("Stop number for " .. + self._name .. " is not a valid number: " .. tostring(stopNumber)) + return nil + end + self._removeAtStage = stopNumberVal + else + local stopNumber = tonumber(splitPart[2]) + if stopNumber == nil then + MissionEditorWarnings.Add("Stop number for " .. + self._name .. " is not a valid number: " .. tostring(splitPart[2])) + return nil + end + self._removeAtStage = stopNumber + end + + return self +end + +function StageDrawing:GetStageLaneIdentifier() + return self._stageLaneIdentifier +end + +function StageDrawing:GetStartingStage() + return self._startingStage +end + +function StageDrawing:GetRemoveAtStage() + return self._removeAtStage +end + +return StageDrawing \ No newline at end of file