Added automatic stage continuation

This commit is contained in:
2024-10-12 15:43:45 +02:00
parent f09c5314ba
commit f4e91b73dc
3 changed files with 49 additions and 15 deletions
+33 -8
View File
@@ -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
+15 -6
View File
@@ -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