wip
This commit is contained in:
+9
-1
@@ -5,11 +5,19 @@
|
|||||||
|
|
||||||
### New Features
|
### New Features
|
||||||
|
|
||||||
|
- Issue
|
||||||
|
|
||||||
|
- Issue: #35
|
||||||
|
Creating Lane option for stages.
|
||||||
|
Additionally to the primary stage lane, stages can now be created in different lanes.
|
||||||
|
These lanes can be used to create different stage progression flows and create different "side-stories".
|
||||||
|
#40
|
||||||
|
|
||||||
### Bug Fixes
|
### Bug Fixes
|
||||||
|
|
||||||
## [0.13.0] 2026-08
|
## [0.13.0] 2026-08
|
||||||
|
|
||||||
A good first release that finally has all major bugs fixed that were caused by the migration from both the underlying script transpiler and the migration to Gitea. <br>
|
A good first release that finally has all major bugs fixed that were caused by the migration from both the underlying script transpiler and the migration to Gitea.
|
||||||
|
|
||||||
### Breaking Changes
|
### Breaking Changes
|
||||||
|
|
||||||
|
|||||||
@@ -4,6 +4,9 @@ SpearheadConfig = {
|
|||||||
---DEBUG LOGGING
|
---DEBUG LOGGING
|
||||||
debugEnabled = false, -- default false
|
debugEnabled = false, -- default false
|
||||||
|
|
||||||
|
--- DEBUG MENU
|
||||||
|
debugMenuEnabled = false, -- default false
|
||||||
|
|
||||||
--- The time briefings should be displayed by default.
|
--- The time briefings should be displayed by default.
|
||||||
--- Players can always "Clear Messages" through the F10 menu, so setting it to a high value can be
|
--- Players can always "Clear Messages" through the F10 menu, so setting it to a high value can be
|
||||||
briefingMessageDuration = 60, --default 60
|
briefingMessageDuration = 60, --default 60
|
||||||
|
|||||||
@@ -392,9 +392,12 @@ function CapBase:CheckAndScheduleIntercept()
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
end
|
end
|
||||||
function CapBase:OnStageNumberChanged(number)
|
|
||||||
|
function CapBase:OnStageNumberChanged(number, laneIdentifier)
|
||||||
|
-- only react on "main" lane changes, ignore other lanes for now
|
||||||
|
if laneIdentifier ~= nil then return end
|
||||||
|
|
||||||
self.activeStage = number
|
self.activeStage = number
|
||||||
|
|
||||||
if self:IsBaseActiveWhenStageIsActive(number) == true then
|
if self:IsBaseActiveWhenStageIsActive(number) == true then
|
||||||
|
|||||||
@@ -2,6 +2,9 @@ local SpearheadEvents = require("classes.spearhead_events")
|
|||||||
local RTBMission = require("classes.capClasses.taskings.RTB")
|
local RTBMission = require("classes.capClasses.taskings.RTB")
|
||||||
local Util = require("classes.util.Util")
|
local Util = require("classes.util.Util")
|
||||||
local DcsUtil = require("classes.util.DcsUtil")
|
local DcsUtil = require("classes.util.DcsUtil")
|
||||||
|
local GlobalConfig = require("classes.configuration.GlobalConfig")
|
||||||
|
local CustomDrawing = require("classes.stageClasses.drawings.CustomDrawing")
|
||||||
|
local DrawingHelper = require("classes.stageClasses.drawings.helper.DrawingHelper")
|
||||||
|
|
||||||
---@class AirGroup : OnUnitLostListener
|
---@class AirGroup : OnUnitLostListener
|
||||||
---@field protected _logger Logger
|
---@field protected _logger Logger
|
||||||
@@ -12,9 +15,12 @@ local DcsUtil = require("classes.util.DcsUtil")
|
|||||||
---@field protected _config CapConfig
|
---@field protected _config CapConfig
|
||||||
---@field protected _checkLivenessNumber number
|
---@field protected _checkLivenessNumber number
|
||||||
---@field protected _spawnManager SpawnManager
|
---@field protected _spawnManager SpawnManager
|
||||||
|
---@field protected _routeDrawing CustomDrawing?
|
||||||
local AirGroup = {}
|
local AirGroup = {}
|
||||||
AirGroup.__index = AirGroup
|
AirGroup.__index = AirGroup
|
||||||
|
|
||||||
|
local globalConfig = GlobalConfig.New()
|
||||||
|
|
||||||
---@param logger Logger
|
---@param logger Logger
|
||||||
---@param groupName string
|
---@param groupName string
|
||||||
---@param groupType AirGroupType
|
---@param groupType AirGroupType
|
||||||
@@ -28,6 +34,7 @@ function AirGroup:New(groupName, groupType, config, logger, spawnManager)
|
|||||||
self._config = config
|
self._config = config
|
||||||
self._logger = logger
|
self._logger = logger
|
||||||
self._spawnManager = spawnManager
|
self._spawnManager = spawnManager
|
||||||
|
self._routeDrawing = nil
|
||||||
|
|
||||||
local group = Group.getByName(self._groupName)
|
local group = Group.getByName(self._groupName)
|
||||||
if group then
|
if group then
|
||||||
@@ -92,6 +99,27 @@ function AirGroup:SetMissionPrivate(mission)
|
|||||||
if group and mission then
|
if group and mission then
|
||||||
group:getController():setTask(mission)
|
group:getController():setTask(mission)
|
||||||
self._logger:debug("mission - Task set for group: " .. self._groupName)
|
self._logger:debug("mission - Task set for group: " .. self._groupName)
|
||||||
|
|
||||||
|
if globalConfig:isDebugMenuEnabled() == true then
|
||||||
|
-- draw the mission route for debugging purposes
|
||||||
|
if self._routeDrawing then
|
||||||
|
self._routeDrawing:Remove()
|
||||||
|
end
|
||||||
|
|
||||||
|
local points = {}
|
||||||
|
if mission and mission.params and mission.params.route and mission.params.route.points then
|
||||||
|
for _, wp in pairs(mission.params.route.points) do
|
||||||
|
if wp.x and wp.y then
|
||||||
|
table.insert(points, { x = wp.x, y = wp.y })
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
local colorString = DrawingHelper.ColorTableToColorString({ 1, 0, 0, 1 })
|
||||||
|
self._routeDrawing = CustomDrawing.FromPoints(points, colorString, 5, 2)
|
||||||
|
self._routeDrawing:Draw()
|
||||||
|
end
|
||||||
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|||||||
@@ -6,6 +6,7 @@ local briefingMessageTime = nil
|
|||||||
---@class GlobalConfig
|
---@class GlobalConfig
|
||||||
---@field private _briefingTime number
|
---@field private _briefingTime number
|
||||||
---@field private _debugEnabled boolean
|
---@field private _debugEnabled boolean
|
||||||
|
---@field private _debugMenuEnabled boolean
|
||||||
local GlobalConfig = {}
|
local GlobalConfig = {}
|
||||||
GlobalConfig.__index = GlobalConfig;
|
GlobalConfig.__index = GlobalConfig;
|
||||||
|
|
||||||
@@ -27,6 +28,8 @@ function GlobalConfig.New()
|
|||||||
self._debugEnabled = false
|
self._debugEnabled = false
|
||||||
end
|
end
|
||||||
|
|
||||||
|
self._debugMenuEnabled = SpearheadConfig.debugMenuEnabled == true
|
||||||
|
|
||||||
end
|
end
|
||||||
|
|
||||||
return self
|
return self
|
||||||
@@ -40,6 +43,10 @@ function GlobalConfig:isDebugEnabled()
|
|||||||
return self._debugEnabled or false
|
return self._debugEnabled or false
|
||||||
end
|
end
|
||||||
|
|
||||||
|
---@return boolean
|
||||||
|
function GlobalConfig:isDebugMenuEnabled()
|
||||||
|
return self._debugMenuEnabled or false
|
||||||
|
end
|
||||||
|
|
||||||
return GlobalConfig
|
return GlobalConfig
|
||||||
|
|
||||||
|
|||||||
@@ -127,7 +127,9 @@ function FleetGroup:new(fleetGroupName, database, logger)
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
o.OnStageNumberChanged = function(self, number)
|
o.OnStageNumberChanged = function(self, number, laneIdentifier)
|
||||||
|
-- only react on "main" lane changes, ignore other lanes for now
|
||||||
|
if laneIdentifier ~= nil then return end
|
||||||
local targetZone = self.targetZonePerStage[tostring(number)]
|
local targetZone = self.targetZonePerStage[tostring(number)]
|
||||||
if targetZone and targetZone ~= self.currentTargetZone then
|
if targetZone and targetZone ~= self.currentTargetZone then
|
||||||
local points = self.pointsPerZone[targetZone]
|
local points = self.pointsPerZone[targetZone]
|
||||||
|
|||||||
@@ -13,7 +13,7 @@ do
|
|||||||
---@field unitsStates table<string, UnitState>
|
---@field unitsStates table<string, UnitState>
|
||||||
---@field random_missions table<string, MissionState>
|
---@field random_missions table<string, MissionState>
|
||||||
---@field deliveredKilos table<string, number>
|
---@field deliveredKilos table<string, number>
|
||||||
---@field activeStage integer|nil
|
---@field activeStageInStageLane table<string, number>
|
||||||
|
|
||||||
---@class UnitState
|
---@class UnitState
|
||||||
---@field isDead boolean
|
---@field isDead boolean
|
||||||
@@ -33,7 +33,7 @@ do
|
|||||||
unitsStates = {},
|
unitsStates = {},
|
||||||
random_missions = {},
|
random_missions = {},
|
||||||
deliveredKilos = {},
|
deliveredKilos = {},
|
||||||
activeStage = nil
|
activeStageInStageLane = {}
|
||||||
}
|
}
|
||||||
|
|
||||||
local logger = {}
|
local logger = {}
|
||||||
@@ -230,9 +230,11 @@ do
|
|||||||
end
|
end
|
||||||
|
|
||||||
---Sets the stage in the persistence table
|
---Sets the stage in the persistence table
|
||||||
|
---@param stageLane string?
|
||||||
---@param stageNumber number
|
---@param stageNumber number
|
||||||
Persistence.SetActiveStage = function(stageNumber)
|
Persistence.SetActiveStage = function(stageLane, stageNumber)
|
||||||
tables.activeStage = stageNumber
|
stageLane = stageLane or "nil"
|
||||||
|
tables.activeStageInStageLane[stageLane] = stageNumber
|
||||||
Persistence._updateRequired = true
|
Persistence._updateRequired = true
|
||||||
end
|
end
|
||||||
|
|
||||||
@@ -256,12 +258,11 @@ do
|
|||||||
end
|
end
|
||||||
|
|
||||||
---Get the active stage as in the persistance file
|
---Get the active stage as in the persistance file
|
||||||
|
---@param stageLane string?
|
||||||
---@return integer|nil
|
---@return integer|nil
|
||||||
Persistence.GetActiveStage = function()
|
Persistence.GetActiveStage = function(stageLane)
|
||||||
if tables.activeStage then
|
stageLane = stageLane or "nil"
|
||||||
return tables.activeStage
|
return tables.activeStageInStageLane[stageLane]
|
||||||
end
|
|
||||||
return nil
|
|
||||||
end
|
end
|
||||||
|
|
||||||
---comment
|
---comment
|
||||||
|
|||||||
@@ -45,13 +45,13 @@ do
|
|||||||
end
|
end
|
||||||
|
|
||||||
---@class OnStageNumberChangeCompleteListener
|
---@class OnStageNumberChangeCompleteListener
|
||||||
---@field OnStageNumberChangeComplete fun(self:OnStageNumberChangeCompleteListener, number:integer)
|
---@field OnStageNumberChangeComplete fun(self:OnStageNumberChangeCompleteListener, number:integer, laneIdentifier:string?)
|
||||||
|
|
||||||
local OnStageNumberChangeCompleteListeners = {}
|
local OnStageNumberChangeCompleteListeners = {}
|
||||||
---@param listener OnStageNumberChangeCompleteListener
|
---@param listener OnStageNumberChangeCompleteListener
|
||||||
SpearheadEvents.AddStageNumberChangeCompleteListener = function(listener)
|
SpearheadEvents.AddStageNumberChangeCompleteListener = function(listener)
|
||||||
if type(listener) ~= "table" or type(listener.OnStageNumberChangeComplete) ~= "function" then
|
if type(listener) ~= "table" or type(listener.OnStageNumberChangeComplete) ~= "function" then
|
||||||
warn("Event handler not of type table/object with function OnStageNumberChangeComplete(self, number)")
|
warn("Event handler not of type table/object with function OnStageNumberChangeComplete(self, number, laneIdentifier)")
|
||||||
return
|
return
|
||||||
end
|
end
|
||||||
table.insert(OnStageNumberChangeCompleteListeners, listener)
|
table.insert(OnStageNumberChangeCompleteListeners, listener)
|
||||||
@@ -61,7 +61,7 @@ do
|
|||||||
---@param laneIdentifier string?
|
---@param laneIdentifier string?
|
||||||
SpearheadEvents.PublishStageNumberChanged = function(newStageNumber, laneIdentifier)
|
SpearheadEvents.PublishStageNumberChanged = function(newStageNumber, laneIdentifier)
|
||||||
pcall(function ()
|
pcall(function ()
|
||||||
Persistence.SetActiveStage(newStageNumber)
|
Persistence.SetActiveStage(laneIdentifier, newStageNumber)
|
||||||
end)
|
end)
|
||||||
|
|
||||||
for _, callable in pairs(OnStageNumberChangedListeners) do
|
for _, callable in pairs(OnStageNumberChangedListeners) do
|
||||||
@@ -82,7 +82,7 @@ do
|
|||||||
|
|
||||||
for _, callable in pairs(OnStageNumberChangeCompleteListeners) do
|
for _, callable in pairs(OnStageNumberChangeCompleteListeners) do
|
||||||
local succ, err = pcall(function()
|
local succ, err = pcall(function()
|
||||||
callable:OnStageNumberChangeComplete(newStageNumber)
|
callable:OnStageNumberChangeComplete(newStageNumber, laneIdentifier)
|
||||||
end)
|
end)
|
||||||
if err then
|
if err then
|
||||||
logError(err)
|
logError(err)
|
||||||
|
|||||||
@@ -3,13 +3,14 @@ local Util = require("classes.util.Util")
|
|||||||
local DcsUtil = require("classes.util.DcsUtil")
|
local DcsUtil = require("classes.util.DcsUtil")
|
||||||
local Logger = require("classes.util.Logger")
|
local Logger = require("classes.util.Logger")
|
||||||
local MissionEditorWarnings = require("classes.util.MissionEditorWarnings")
|
local MissionEditorWarnings = require("classes.util.MissionEditorWarnings")
|
||||||
|
local PersistenceConfig = require("classes.configuration.PersistenceConfig")
|
||||||
local ExtraStage = require("classes.stageClasses.Stages.ExtraStage")
|
local ExtraStage = require("classes.stageClasses.Stages.ExtraStage")
|
||||||
local PrimaryStage = require("classes.stageClasses.Stages.PrimaryStage")
|
local PrimaryStage = require("classes.stageClasses.Stages.PrimaryStage")
|
||||||
local WaitingStage = require("classes.stageClasses.Stages.WaitingStage")
|
local WaitingStage = require("classes.stageClasses.Stages.WaitingStage")
|
||||||
local MissionCommandsHelper = require("classes.stageClasses.helpers.MissionCommandsHelper")
|
local MissionCommandsHelper = require("classes.stageClasses.helpers.MissionCommandsHelper")
|
||||||
local StageRepository = require("classes.stageClasses.StageRepository")
|
local StageRepository = require("classes.stageClasses.StageRepository")
|
||||||
local StageLane = require("classes.stageClasses.StageLane")
|
local StageLane = require("classes.stageClasses.StageLane")
|
||||||
|
local Persistence = require("classes.persistence.Persistence")
|
||||||
|
|
||||||
local currentStage = -99
|
local currentStage = -99
|
||||||
|
|
||||||
@@ -33,7 +34,7 @@ local singletonInstance = nil
|
|||||||
---@param logLevel LogLevel
|
---@param logLevel LogLevel
|
||||||
---@param spawnManager SpawnManager
|
---@param spawnManager SpawnManager
|
||||||
---@return GlobalStageManager
|
---@return GlobalStageManager
|
||||||
function GlobalStageManager.NewAndStart(database, stageConfig, logLevel, spawnManager)
|
function GlobalStageManager.new(database, stageConfig, logLevel, spawnManager)
|
||||||
|
|
||||||
if singletonInstance ~= nil then
|
if singletonInstance ~= nil then
|
||||||
return singletonInstance
|
return singletonInstance
|
||||||
@@ -47,7 +48,7 @@ function GlobalStageManager.NewAndStart(database, stageConfig, logLevel, spawnMa
|
|||||||
self.database = database
|
self.database = database
|
||||||
self.stageConfig = stageConfig
|
self.stageConfig = stageConfig
|
||||||
self._missionCommandsHelper = MissionCommandsHelper.getOrCreate()
|
self._missionCommandsHelper = MissionCommandsHelper.getOrCreate()
|
||||||
self._stageRepository = StageRepository.new()
|
self._stageRepository = StageRepository.getInstance()
|
||||||
|
|
||||||
self.logger = logger
|
self.logger = logger
|
||||||
if stageConfig.isAutoStages ~= true then
|
if stageConfig.isAutoStages ~= true then
|
||||||
@@ -92,6 +93,38 @@ function GlobalStageManager.NewAndStart(database, stageConfig, logLevel, spawnMa
|
|||||||
return self
|
return self
|
||||||
end
|
end
|
||||||
|
|
||||||
|
function GlobalStageManager:Start()
|
||||||
|
self.logger:info("Starting GlobalStageManager")
|
||||||
|
|
||||||
|
local startingStage = self.stageConfig.startingStage or 1
|
||||||
|
local persistenceConfig = PersistenceConfig.new()
|
||||||
|
if persistenceConfig:isEnabled() == true then
|
||||||
|
self.logger:info("Persistence is enabled, loading stage state from persistence")
|
||||||
|
|
||||||
|
local stageLanes = self._stageRepository:getAllStageLanes()
|
||||||
|
for _, stageLane in pairs(stageLanes) do
|
||||||
|
|
||||||
|
local stageLaneIdentifier = stageLane:GetStageLaneIdentifier()
|
||||||
|
local persistedStage = Persistence.GetActiveStage(stageLaneIdentifier)
|
||||||
|
if persistedStage then
|
||||||
|
self.logger:info("Loaded persisted stage " .. persistedStage .. " for lane " .. (stageLaneIdentifier or "default"))
|
||||||
|
stageLane:SetActiveStageIndex(persistedStage)
|
||||||
|
Events.PublishStageNumberChanged(persistedStage, stageLaneIdentifier)
|
||||||
|
else
|
||||||
|
stageLane:SetActiveStageIndex(startingStage)
|
||||||
|
Events.PublishStageNumberChanged(startingStage, stageLaneIdentifier)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
else
|
||||||
|
self.logger:info("Persistence is disabled, starting at stage " .. startingStage)
|
||||||
|
local stageLanes = self._stageRepository:getAllStageLanes()
|
||||||
|
for _, stageLane in pairs(stageLanes) do
|
||||||
|
stageLane:SetActiveStageIndex(startingStage)
|
||||||
|
Events.PublishStageNumberChanged(startingStage, stageLane:GetStageLaneIdentifier())
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
---@class StageNameParseResult
|
---@class StageNameParseResult
|
||||||
---@field isValid boolean
|
---@field isValid boolean
|
||||||
---@field orderNumber integer
|
---@field orderNumber integer
|
||||||
@@ -204,10 +237,9 @@ function GlobalStageManager:OnStageComplete(stage)
|
|||||||
-- COMPLETION IN THE DEFAULT LANE
|
-- COMPLETION IN THE DEFAULT LANE
|
||||||
|
|
||||||
-- 1. Check if any lane is at status "BetweenChapters" and the next chapter start is "next stage index"
|
-- 1. Check if any lane is at status "BetweenChapters" and the next chapter start is "next stage index"
|
||||||
|
|
||||||
local allLanes = self._stageRepository:getAllStageLanes()
|
local allLanes = self._stageRepository:getAllStageLanes()
|
||||||
for _, lane in ipairs(allLanes) do
|
for _, lane in ipairs(allLanes) do
|
||||||
if lane:GetStageLaneIdentifier() ~= StageLane.DefaultLaneKey and lane:GetStageLaneState() == "InChapter" then
|
if lane:GetStageLaneIdentifier() ~= StageLane.DefaultLaneKey and lane:GetStageLaneState() == "BetweenChapters" then
|
||||||
local nextChapterStart = lane:GetNextChapterStart()
|
local nextChapterStart = lane:GetNextChapterStart()
|
||||||
if nextChapterStart == nextStageIndex then
|
if nextChapterStart == nextStageIndex then
|
||||||
self.logger:debug("Lane " .. (lane:GetStageLaneIdentifier() or "default") .. " is at chapter start for next stage index " .. nextStageIndex)
|
self.logger:debug("Lane " .. (lane:GetStageLaneIdentifier() or "default") .. " is at chapter start for next stage index " .. nextStageIndex)
|
||||||
@@ -275,14 +307,19 @@ function GlobalStageManager:IsStageComplete(stageNumber, stageLaneIdentifier)
|
|||||||
end
|
end
|
||||||
|
|
||||||
---@public
|
---@public
|
||||||
function GlobalStageManager:OnStageNumberChanged(stageNumber)
|
function GlobalStageManager:OnStageNumberChanged(stageNumber, stageLaneIdentifier)
|
||||||
self.logger:debug("Stage number changed to: " .. tostring(stageNumber))
|
|
||||||
currentStage = stageNumber
|
|
||||||
|
|
||||||
|
-- only react on "main" lane changes, ignore other lanes for now
|
||||||
|
if stageLaneIdentifier ~= nil then return end
|
||||||
|
|
||||||
|
self.logger:debug("Stage number changed to: " .. tostring(stageNumber))
|
||||||
self:UpdateDrawings(stageNumber)
|
self:UpdateDrawings(stageNumber)
|
||||||
end
|
end
|
||||||
|
|
||||||
function GlobalStageManager:OnStageNumberChangeComplete(stageNumber)
|
function GlobalStageManager:OnStageNumberChangeComplete(stageNumber, stageLaneIdentifier)
|
||||||
|
-- only react on "main" lane changes, ignore other lanes for now
|
||||||
|
if stageLaneIdentifier ~= nil then return end
|
||||||
|
|
||||||
self.logger:debug("Stage number change complete to: " .. tostring(stageNumber))
|
self.logger:debug("Stage number change complete to: " .. tostring(stageNumber))
|
||||||
|
|
||||||
local groups = {}
|
local groups = {}
|
||||||
|
|||||||
@@ -5,14 +5,27 @@ local StageLane = require("classes.stageClasses.StageLane")
|
|||||||
local StageRepository = {}
|
local StageRepository = {}
|
||||||
StageRepository.__index = StageRepository
|
StageRepository.__index = StageRepository
|
||||||
|
|
||||||
|
local instance = nil
|
||||||
|
|
||||||
|
---@private
|
||||||
---@return StageRepository
|
---@return StageRepository
|
||||||
function StageRepository.new()
|
function StageRepository.new()
|
||||||
local self = setmetatable({}, StageRepository)
|
local self = setmetatable({}, StageRepository)
|
||||||
self.StageLanes = {}
|
self.StageLanes = {}
|
||||||
self.StageLanes[tostring(StageLane.DefaultLaneKey)] = StageLane.New(StageLane.DefaultLaneKey)
|
self.StageLanes[tostring(StageLane.DefaultLaneKey)] = StageLane.New(StageLane.DefaultLaneKey)
|
||||||
|
instance = self
|
||||||
return self
|
return self
|
||||||
end
|
end
|
||||||
|
|
||||||
|
---@return StageRepository
|
||||||
|
StageRepository.getInstance = function()
|
||||||
|
if instance == nil then
|
||||||
|
instance = StageRepository.new()
|
||||||
|
end
|
||||||
|
|
||||||
|
return instance
|
||||||
|
end
|
||||||
|
|
||||||
|
|
||||||
---@param laneName string? `nil` for default lane
|
---@param laneName string? `nil` for default lane
|
||||||
---@return StageLane?
|
---@return StageLane?
|
||||||
|
|||||||
@@ -329,6 +329,23 @@ function Stage:GetStageIndex()
|
|||||||
return self.stageNumber
|
return self.stageNumber
|
||||||
end
|
end
|
||||||
|
|
||||||
|
---@return string
|
||||||
|
function Stage:GetStageName()
|
||||||
|
return self.stageName
|
||||||
|
end
|
||||||
|
|
||||||
|
function Stage:GetMissions()
|
||||||
|
local missions = {}
|
||||||
|
for _, mission in pairs(self._db.missions) do
|
||||||
|
table.insert(missions, mission)
|
||||||
|
end
|
||||||
|
|
||||||
|
for _, sam in pairs(self._db.sams) do
|
||||||
|
table.insert(missions, sam)
|
||||||
|
end
|
||||||
|
return missions
|
||||||
|
end
|
||||||
|
|
||||||
---comment
|
---comment
|
||||||
function Stage:CheckAndUpdateSelf()
|
function Stage:CheckAndUpdateSelf()
|
||||||
self._logger:debug("Checking on Stage: " .. self.zoneName)
|
self._logger:debug("Checking on Stage: " .. self.zoneName)
|
||||||
@@ -389,7 +406,7 @@ function Stage:IsMissionComplete(missionName)
|
|||||||
return mission:getState() == "COMPLETED"
|
return mission:getState() == "COMPLETED"
|
||||||
end
|
end
|
||||||
|
|
||||||
---private use only
|
-- private usage only
|
||||||
function Stage:NotifyComplete()
|
function Stage:NotifyComplete()
|
||||||
|
|
||||||
self._logger:info("Stage complete: " .. (self.stageName or self.stageNumber or "unknown"))
|
self._logger:info("Stage complete: " .. (self.stageName or self.stageNumber or "unknown"))
|
||||||
@@ -514,7 +531,12 @@ end
|
|||||||
---comment
|
---comment
|
||||||
---@param self Stage
|
---@param self Stage
|
||||||
---@param number integer
|
---@param number integer
|
||||||
function Stage:OnStageNumberChanged(number)
|
---@param stageLaneIdentifier string?
|
||||||
|
function Stage:OnStageNumberChanged(number, stageLaneIdentifier)
|
||||||
|
|
||||||
|
if stageLaneIdentifier ~= self._stageLaneIdentifier then
|
||||||
|
return
|
||||||
|
end
|
||||||
|
|
||||||
if self._activeStage == number then --only activate once for a stage
|
if self._activeStage == number then --only activate once for a stage
|
||||||
return
|
return
|
||||||
|
|||||||
@@ -36,7 +36,12 @@ end
|
|||||||
---comment
|
---comment
|
||||||
---@param self ExtraStage
|
---@param self ExtraStage
|
||||||
---@param number integer
|
---@param number integer
|
||||||
function ExtraStage:OnStageNumberChanged(number)
|
---@param stageLaneIdentifier string?
|
||||||
|
function ExtraStage:OnStageNumberChanged(number, stageLaneIdentifier)
|
||||||
|
|
||||||
|
if stageLaneIdentifier ~= self._stageLaneIdentifier then
|
||||||
|
return
|
||||||
|
end
|
||||||
|
|
||||||
if self._activeStage == number then --only activate once for a stage
|
if self._activeStage == number then --only activate once for a stage
|
||||||
return
|
return
|
||||||
|
|||||||
@@ -33,6 +33,36 @@ function CustomDrawing.New(drawingObject)
|
|||||||
return self
|
return self
|
||||||
end
|
end
|
||||||
|
|
||||||
|
---@param points Array<Vec2>
|
||||||
|
---@param colorString string
|
||||||
|
---@param lineStyle LineType
|
||||||
|
---@param lineThickness number
|
||||||
|
---@return CustomDrawing?
|
||||||
|
function CustomDrawing.FromPoints(points, colorString, lineStyle, lineThickness)
|
||||||
|
if points == nil or #points < 3 then
|
||||||
|
drawingLogger:warn("CustomDrawing.FromPoints called with nil or less than 3 points")
|
||||||
|
return nil
|
||||||
|
end
|
||||||
|
|
||||||
|
---@type FreeLine
|
||||||
|
local drawingObject = {
|
||||||
|
mapX = 0,
|
||||||
|
mapY = 0,
|
||||||
|
points = points,
|
||||||
|
lineMode = "free",
|
||||||
|
name = "custom_drawing_" .. tostring(math.random(1000000)),
|
||||||
|
primitiveType = "Polygon",
|
||||||
|
polygonMode = "free",
|
||||||
|
visible = true,
|
||||||
|
style = DrawingHelper.ToLineStyleString(lineStyle),
|
||||||
|
colorString = colorString,
|
||||||
|
thickness = lineThickness,
|
||||||
|
closed = false
|
||||||
|
}
|
||||||
|
|
||||||
|
return CustomDrawing.New(drawingObject)
|
||||||
|
end
|
||||||
|
|
||||||
---@param zone SpearheadTriggerZone
|
---@param zone SpearheadTriggerZone
|
||||||
---@param colorString string
|
---@param colorString string
|
||||||
---@param fillColorString string
|
---@param fillColorString string
|
||||||
|
|||||||
@@ -266,7 +266,7 @@ function DrawingHelper.ColorToColorTable(hexStr)
|
|||||||
return { r, g , b , a }
|
return { r, g , b , a }
|
||||||
end
|
end
|
||||||
|
|
||||||
---@param rgba table
|
---@param rgba table { r, g, b, a }
|
||||||
---@return string
|
---@return string
|
||||||
function DrawingHelper.ColorTableToColorString(rgba)
|
function DrawingHelper.ColorTableToColorString(rgba)
|
||||||
if rgba == nil or #rgba < 4 or rgba[1] == nil or rgba[2] == nil or rgba[3] == nil or rgba[4] == nil then
|
if rgba == nil or #rgba < 4 or rgba[1] == nil or rgba[2] == nil or rgba[3] == nil or rgba[4] == nil then
|
||||||
|
|||||||
@@ -126,6 +126,11 @@ function Mission:NotifyMissionComplete()
|
|||||||
|
|
||||||
end
|
end
|
||||||
|
|
||||||
|
function Mission:ForceMissionComplete()
|
||||||
|
self._state = "COMPLETED"
|
||||||
|
self:NotifyMissionComplete()
|
||||||
|
end
|
||||||
|
|
||||||
function Mission:MarkMissionAreaToGroup(groupId) end
|
function Mission:MarkMissionAreaToGroup(groupId) end
|
||||||
|
|
||||||
---endregion
|
---endregion
|
||||||
|
|||||||
+20
-19
@@ -5,9 +5,11 @@ local DcsUtil = require("classes.util.DcsUtil")
|
|||||||
local Database = require("classes.spearhead_db")
|
local Database = require("classes.spearhead_db")
|
||||||
local SpearheadEvents = require("classes.spearhead_events")
|
local SpearheadEvents = require("classes.spearhead_events")
|
||||||
local MissionCommandsHelper = require("classes.stageClasses.helpers.MissionCommandsHelper")
|
local MissionCommandsHelper = require("classes.stageClasses.helpers.MissionCommandsHelper")
|
||||||
|
local GlobalConfig = require("classes.configuration.GlobalConfig")
|
||||||
local CapConfig = require("classes.configuration.CapConfig")
|
local CapConfig = require("classes.configuration.CapConfig")
|
||||||
local StageConfig = require("classes.configuration.StageConfig")
|
local StageConfig = require("classes.configuration.StageConfig")
|
||||||
local Persistence = require("classes.persistence.Persistence")
|
local Persistence = require("classes.persistence.Persistence")
|
||||||
|
local PersistenceConfig = require("classes.configuration.PersistenceConfig")
|
||||||
local SpawnManager = require("classes.helpers.SpawnManager")
|
local SpawnManager = require("classes.helpers.SpawnManager")
|
||||||
local DetectionManager = require("classes.capClasses.detection.DetectionManager")
|
local DetectionManager = require("classes.capClasses.detection.DetectionManager")
|
||||||
local GlobalCapManager = require("classes.capClasses.GlobalCapManager")
|
local GlobalCapManager = require("classes.capClasses.GlobalCapManager")
|
||||||
@@ -33,19 +35,11 @@ MissionCommandsHelper.getOrCreate() -- initiate
|
|||||||
local capConfig = CapConfig:new();
|
local capConfig = CapConfig:new();
|
||||||
local stageConfig = StageConfig:getInstance();
|
local stageConfig = StageConfig:getInstance();
|
||||||
|
|
||||||
local startingStage = stageConfig.startingStage or 1
|
local persistenceConfig = PersistenceConfig.new()
|
||||||
if SpearheadConfig and SpearheadConfig.Persistence and SpearheadConfig.Persistence.enabled == true then
|
|
||||||
standardLogger:info("Persistence enabled")
|
if persistenceConfig and persistenceConfig:isEnabled() == true then
|
||||||
local persistenceLogger = Logger.new("Persistence", defaultLogLevel)
|
local persistenceLogger = Logger.new("Persistence", defaultLogLevel)
|
||||||
Persistence.Init(persistenceLogger)
|
Persistence.Init(persistenceLogger)
|
||||||
|
|
||||||
local persistanceStage = Persistence.GetActiveStage()
|
|
||||||
if persistanceStage then
|
|
||||||
standardLogger:info("Persistance activated and using persistant active stage: " .. persistanceStage)
|
|
||||||
startingStage = persistanceStage
|
|
||||||
end
|
|
||||||
else
|
|
||||||
standardLogger:info("Persistence disabled")
|
|
||||||
end
|
end
|
||||||
|
|
||||||
local spawnLogger = Logger.new("SpawnManager", defaultLogLevel)
|
local spawnLogger = Logger.new("SpawnManager", defaultLogLevel)
|
||||||
@@ -54,16 +48,9 @@ local detectionLogger = Logger.new("DetectionManager", defaultLogLevel)
|
|||||||
local detectionManager = DetectionManager.New(detectionLogger)
|
local detectionManager = DetectionManager.New(detectionLogger)
|
||||||
|
|
||||||
GlobalCapManager.start(databaseManager, capConfig, detectionManager, stageConfig, defaultLogLevel, spawnManager)
|
GlobalCapManager.start(databaseManager, capConfig, detectionManager, stageConfig, defaultLogLevel, spawnManager)
|
||||||
local globalStageManager = GlobalStageManager.NewAndStart(databaseManager, stageConfig, defaultLogLevel, spawnManager)
|
local globalStageManager = GlobalStageManager.new(databaseManager, stageConfig, defaultLogLevel, spawnManager)
|
||||||
GlobalFleetManager.start(databaseManager)
|
GlobalFleetManager.start(databaseManager)
|
||||||
|
|
||||||
local SetStageDelayed = function(number, time)
|
|
||||||
SpearheadEvents.PublishStageNumberChanged(number)
|
|
||||||
return nil
|
|
||||||
end
|
|
||||||
|
|
||||||
timer.scheduleFunction(SetStageDelayed, startingStage, timer.getTime() + 3)
|
|
||||||
|
|
||||||
env.info(startTime .. "ms / " .. timer.getTime() * 1000 .. "ms")
|
env.info(startTime .. "ms / " .. timer.getTime() * 1000 .. "ms")
|
||||||
local duration = (timer.getTime() * 1000) - startTime
|
local duration = (timer.getTime() * 1000) - startTime
|
||||||
standardLogger:info("Spearhead Initialisation duration: " .. tostring(duration) .. "ms")
|
standardLogger:info("Spearhead Initialisation duration: " .. tostring(duration) .. "ms")
|
||||||
@@ -72,3 +59,17 @@ local missionEditorWarningsLogger = Logger.new("MissionEditorWarnings", defaultL
|
|||||||
MissionEditorWarnings.WriteAll(missionEditorWarningsLogger)
|
MissionEditorWarnings.WriteAll(missionEditorWarningsLogger)
|
||||||
globalStageManager:PrintMermaidStage()
|
globalStageManager:PrintMermaidStage()
|
||||||
|
|
||||||
|
local startDelayed = function()
|
||||||
|
globalStageManager:Start()
|
||||||
|
return nil
|
||||||
|
end
|
||||||
|
|
||||||
|
timer.scheduleFunction(startDelayed, nil, timer.getTime() + 5) -- delay start by 5 seconds so every deleted item it first removed entirely
|
||||||
|
|
||||||
|
local globalConfig = GlobalConfig.New()
|
||||||
|
if globalConfig and globalConfig:isDebugMenuEnabled() == true then
|
||||||
|
local DebugMenu = require("classes.debug.DebugMenu")
|
||||||
|
local debugMenu = DebugMenu.new()
|
||||||
|
debugMenu:RegisterMenus()
|
||||||
|
end
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user