Feature/lanes #40
@@ -33,6 +33,7 @@ do
|
||||
unitsStates = {},
|
||||
random_missions = {},
|
||||
deliveredKilos = {},
|
||||
activeStage = nil, -- Backwards compatibility for previous version without lanes
|
||||
|
dutchie031 marked this conversation as resolved
Outdated
|
||||
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
|
||||
|
||||
@@ -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<string, MissionZoneData>
|
||||
---@field FarpZoneData table<string,FarpZoneData>
|
||||
---@field missionCodes table<string, boolean>
|
||||
---@field CustomDrawings Array<CustomDrawing>
|
||||
---@field StageDrawings Array<StageDrawing>
|
||||
|
||||
---@class CapRoute
|
||||
---@field zones Array<SpearheadTriggerZone>
|
||||
@@ -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<CustomDrawing>
|
||||
function Database:getCustomDrawings()
|
||||
if self._tables.CustomDrawings == nil then
|
||||
---@return Array<StageDrawing>
|
||||
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
|
||||
|
||||
@@ -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)
|
||||
|
dutchie031 marked this conversation as resolved
Outdated
dutchie031
commented
comment needs updating comment needs updating
|
||||
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)
|
||||
|
||||
@@ -337,11 +337,17 @@ 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()
|
||||
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()
|
||||
@@ -350,6 +356,7 @@ function GlobalStageManager:UpdateDrawings(stageNumber)
|
||||
drawing:Remove()
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
|
||||
@@ -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,
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
Reference in New Issue
Block a user
This breaks backwards compatibility when inserted into missions that already have a persistent file.