From f4e91b73dc849a9896494b29f2b59553c9b7ec56 Mon Sep 17 00:00:00 2001 From: dutchie031 Date: Sat, 12 Oct 2024 15:43:45 +0200 Subject: [PATCH] Added automatic stage continuation --- classes/spearhead_base.lua | 2 +- classes/stageClasses/GlobalStageManager.lua | 41 +++++++++++++++++---- classes/stageClasses/Stage.lua | 21 ++++++++--- 3 files changed, 49 insertions(+), 15 deletions(-) diff --git a/classes/spearhead_base.lua b/classes/spearhead_base.lua index aa77f3b..3d36cdb 100644 --- a/classes/spearhead_base.lua +++ b/classes/spearhead_base.lua @@ -663,7 +663,7 @@ do -- INIT DCS_UTIL end ---comment - ---@param zone_name any + ---@param airbaseId any ---@return table? zone { name,b zone_type, x, z, radius, verts } function DCS_UTIL.getAirbaseZoneById(airbaseId) local string = tostring(airbaseId) diff --git a/classes/stageClasses/GlobalStageManager.lua b/classes/stageClasses/GlobalStageManager.lua index a296703..767c8ff 100644 --- a/classes/stageClasses/GlobalStageManager.lua +++ b/classes/stageClasses/GlobalStageManager.lua @@ -1,22 +1,47 @@ local StagesByName = {} +local StagesByIndex = {} GlobalStageManager = {} -GlobalStageManager.start = function (database, stageConfig) +function GlobalStageManager:NewAndStart(database, stageConfig) + + local o = {} + setmetatable(o, { __index = self }) + + o.onStageCompleted = function(stage) + + local stageNumber = tostring(stage.stageNumber) + local anyActive = false + for _, stage in pairs(StagesByIndex[stageNumber] or {}) do + if stage.isActive then anyActive = true end + end + + if anyActive == false and stageConfig:isAutoStages() == true then + Spearhead.Events.PublishStageNumberChanged(tonumber(stageNumber) + 1) + end + + end + + local logger = Spearhead.LoggerTemplate:new("StageManager", stageConfig.logLevel) for _, stageName in pairs(database:getStagezoneNames()) do - local logger = Spearhead.LoggerTemplate:new(stageName, stageConfig.logLevel) - local stage = Spearhead.internal.Stage:new(stageName, database, logger, stageConfig) - - StagesByName[stageName] = stage - - local logger = Spearhead.LoggerTemplate:new("StageManager", stageConfig.logLevel) - logger:info("Initiated " .. Spearhead.Util.tableLength(StagesByName) .. " airbases for cap") + local stagelogger = Spearhead.LoggerTemplate:new(stageName, stageConfig.logLevel) + local stage = Spearhead.internal.Stage:new(stageName, database, stagelogger, stageConfig) + if stage then + stage:AddStageCompleteListener(o); + StagesByName[stageName] = stage + local indexString = tostring(stage.stageNumber) + if StagesByIndex[indexString] == nil then StagesByIndex[indexString] = {} end + table.insert(StagesByIndex[indexString], stage) + logger:info("Initiated " .. Spearhead.Util.tableLength(StagesByName) .. " airbases for cap") + end end + + return o end if not Spearhead.internal then Spearhead.internal = {} end diff --git a/classes/stageClasses/Stage.lua b/classes/stageClasses/Stage.lua index d342ad0..52b2a98 100644 --- a/classes/stageClasses/Stage.lua +++ b/classes/stageClasses/Stage.lua @@ -29,6 +29,7 @@ do --init STAGE DIRECTOR end o.stageNumber = orderNumber + o.isActive = false o.database = database o.logger = logger o.db = {} @@ -116,7 +117,7 @@ do --init STAGE DIRECTOR o.StageCompleteListeners = {} ---comment ---@param self table - ---@param StageCompleteListener table a Object with tage + ---@param StageCompleteListener table an Object with function onStageCompleted(stage) o.AddStageCompleteListener = function(self, StageCompleteListener) if type(StageCompleteListener) ~= "table" then @@ -126,9 +127,15 @@ do --init STAGE DIRECTOR end local triggerStageCompleteListeners = function(self) - --[[ - TODO: Trigger Stage complete - ]] + self.isActive = false + for _, callable in pairs(self.MissionCompleteListeners) do + local succ, err = pcall( function() + callable:OnMissionComplete(self) + end) + if err then + self.logger:warn("Error in misstion complete listener:" .. err) + end + end end @@ -179,7 +186,7 @@ do --init STAGE DIRECTOR end local zone = Spearhead.DcsUtil.getZoneByName(self.zoneName) - if zone then + if zone and self.stageConfig:isDrawStagesEnabled() == true then self.logger:debug("drawing stage") if zone.zone_type == Spearhead.DcsUtil.ZoneType.Cilinder then trigger.action.circleToAll(-1, self.stageDrawingId, {x = zone.x, y = 0 , z = zone.z}, zone.radius, {0,0,0,0}, {0,0,0,0},4, true) @@ -194,6 +201,8 @@ do --init STAGE DIRECTOR end o.ActivateStage = function(self) + self.isActive = true; + pcall(function() self:MarkStage() end) @@ -437,7 +446,7 @@ do --init STAGE DIRECTOR timer.scheduleFunction(removeMissionCommandsDelayed, { self = self, mission = mission}, timer.getTime() + 20) if(self:IsComplete()) then - + timer.scheduleFunction(triggerStageCompleteListeners, self, timer.getTime() + 15) else timer.scheduleFunction(activateMissionsIfApplicableAsync, self, timer.getTime() + 10) end