Introduced administrative settings.

They are defined in `TUM.administrativeSettings`.
They have a default value in `TUM.administrativeSettingsDefaultValues`.
They can be overloaded either:
-  by script (with a call like `TUM.administrativeSettings.setValue(TUM.administrativeSettings.USE_SPECIFIC_RADIOMENU, true)`
- by a parameter named after the setting in a trigger zone called `TUM_Administrative_Settings`

Settings that are already implemented:
- USE_SPECIFIC_RADIOMENU: use a specific radio menu for the mission commands, or use the main one?
- INITIALIZE_AUTOMATICALLY: automatically initialize the mission when the script is loaded. If false, you must call TUM.initialize() manually.
- IGNORE_ZONES_STARTINGWITH: if set, ignore all zones starting with this string. This is useful to avoid conflicts with other scripts that use the same zone names.
- ONLY_ZONES_STARTINGWITH: if set, only adds zones starting with this string. This is useful to avoid conflicts with other scripts that use the same zone names.
This commit is contained in:
David Pierron
2025-08-01 18:47:47 +02:00
parent 33f8986317
commit 54ff069711
2 changed files with 228 additions and 95 deletions
+124 -11
View File
@@ -38,6 +38,108 @@ function TUM.log(message, logLevel)
end end
end end
--------------------------------------
--- Administrative settings
--------------------------------------
TUM.administrativeSettings = {
-- This table defines the administrative settings for the script.
-- These settings can modify the behavior of the script, and can be set by the mission maker via a specific trigger zone's parameters, or via script (defining the TUM.administrativeSettingsValues below)
USE_SPECIFIC_RADIOMENU = 1, -- Use a specific radio menu for the mission commands, or use the main one?
INITIALIZE_AUTOMATICALLY = 2, -- Automatically initialize the mission when the script is loaded. If false, you must call TUM.initialize() manually.
IGNORE_ZONES_STARTINGWITH = 3, -- If set, ignore all zones starting with this string. This is useful to avoid conflicts with other scripts that use the same zone names.
ONLY_ZONES_STARTINGWITH = 4, -- If set, only adds zones starting with this string. This is useful to avoid conflicts with other scripts that use the same zone names.
}
TUM.administrativeSettingsDefaultValues = {
-- This table defines the default values for the administrative settings.
-- The keys must match the keys in TUM.administrativeSettings
[TUM.administrativeSettings.USE_SPECIFIC_RADIOMENU] = false, -- Use a specific radio menu for the mission commands, or use the main one?
[TUM.administrativeSettings.INITIALIZE_AUTOMATICALLY] = true, -- Automatically initialize the mission when the script is loaded. If false, you must call TUM.initialize() manually.
[TUM.administrativeSettings.IGNORE_ZONES_STARTINGWITH] = nil, -- If set, ignore all zones starting with this string. This is useful to avoid conflicts with other scripts that use the same zone names.
[TUM.administrativeSettings.ONLY_ZONES_STARTINGWITH] = nil, -- If set, only adds zones starting with this string. This is useful to avoid conflicts with other scripts that use the same zone names.
}
TUM.administrativeSettingsValues = {
-- This table defines the administrative settings values for the script.
-- The keys must match the keys in TUM.administrativeSettings
-- If set, these values will prevail over both the default values in TUM.administrativeSettings and the values set by the mission maker via a specific trigger zone's parameters.
}
--- Returns the value of the administrative setting with the given key
function TUM.administrativeSettings.getValue(key)
if TUM.administrativeSettingsValues[key] ~= nil then
return TUM.administrativeSettingsValues[key]
else
return TUM.administrativeSettingsDefaultValues[key]
end
end
--- Sets the value of the administrative setting with the given key
function TUM.administrativeSettings.setValue(key, value)
-- check if the key is in the administrative settings table
local foundKey = false
for _, v in pairs(TUM.administrativeSettings) do
if v == key then
foundKey = true
break
end
end
if not foundKey then
TUM.log("Tried to set an unknown administrative setting: "..tostring(key), TUM.logLevel.ERROR)
return nil
end
TUM.administrativeSettingsValues[key] = value
end
--- Takes all the values from (in order of priority):
--- 1. The TUM.administrativeSettingsValues table (optionnaly set by script)
--- 2. The trigger zone parameters (set by the mission maker)
--- 3. The TUM.administrativeSettingsDefaultValues table (default values)
function TUM.administrativeSettings.initializeSettings()
local ADMIN_ZONE_NAME = "TUM_Administrative_Settings" -- The name of the administrative settings trigger zone
local adminZone = DCSEx.zones.getByName(ADMIN_ZONE_NAME)
for key, _ in pairs(TUM.administrativeSettings) do
local value = nil
if TUM.administrativeSettingsValues[TUM.administrativeSettings[key]] then -- Check if the value is set by script
value = TUM.administrativeSettingsValues[TUM.administrativeSettings[key]]
end
if value == nil and adminZone then -- If the value is not set by script, check the trigger zone parameters
local zoneValue = DCSEx.zones.getProperty(adminZone, key)
if zoneValue ~= nil then
value = zoneValue
end
end
if value == nil then -- If the value is not set by script or trigger zone, use the default value
value = TUM.administrativeSettingsDefaultValues[TUM.administrativeSettings[key]]
end
TUM.administrativeSettingsValues[TUM.administrativeSettings[key]] = value
end
end
--------------------------------------
--- Radio menu for the mission commands
--------------------------------------
TUM.rootMenu = nil
function TUM.getOrCreateRootMenu(reset) -- Get or create the root menu for the mission commands; if reset is true, the menu will be cleared and recreated
if reset then
missionCommands.removeItem(TUM.rootMenu) -- Clear the menu
TUM.rootMenu = nil
TUM.getOrCreateRootMenu() -- Recreate the root menu
end
if not TUM.rootMenu then
if TUM.administrativeSettings.getValue(TUM.administrativeSettings.USE_SPECIFIC_RADIOMENU) then
local rootMenuTitle = "✈ TUM"
TUM.rootMenu = missionCommands.addSubMenu(rootMenuTitle)
end
end
return TUM.rootMenu
end
--------------------------------------
--[[DCS EXTENSIONS]]-- --[[DCS EXTENSIONS]]--
--[[LIBRARY]]-- --[[LIBRARY]]--
@@ -48,7 +150,11 @@ end
-- Module startup -- -- Module startup --
-------------------- --------------------
do function TUM.initialize()
do
-- load the administrative settings
TUM.administrativeSettings.initializeSettings()
local function startUpMission() local function startUpMission()
TUM.hasStarted = false TUM.hasStarted = false
@@ -102,12 +208,12 @@ do
if not startUpMission() then if not startUpMission() then
trigger.action.outText("A critical error has happened, cannot start the mission.", 3600) trigger.action.outText("A critical error has happened, cannot start the mission.", 3600)
end end
end end
------------------- -------------------
-- Event handler -- -- Event handler --
------------------- -------------------
do do
local eventHandler = {} local eventHandler = {}
function eventHandler:onEvent(event) function eventHandler:onEvent(event)
@@ -129,12 +235,12 @@ do
if TUM.hasStarted then if TUM.hasStarted then
world.addEventHandler(eventHandler) world.addEventHandler(eventHandler)
end end
end end
-------------------------------------------- --------------------------------------------
-- Game clock, called every 10-20 seconds -- -- Game clock, called every 10-20 seconds --
-------------------------------------------- --------------------------------------------
do do
local clockTick = -1 local clockTick = -1
function TUM.onClockTick(arg, time) function TUM.onClockTick(arg, time)
@@ -162,4 +268,11 @@ do
if TUM.hasStarted then if TUM.hasStarted then
timer.scheduleFunction(TUM.onClockTick, nil, timer.getTime() + math.random(10, 15)) timer.scheduleFunction(TUM.onClockTick, nil, timer.getTime() + math.random(10, 15))
end end
end
end
if TUM.administrativeSettings.getValue(TUM.administrativeSettings.INITIALIZE_AUTOMATICALLY) then
TUM.initialize()
else
TUM.log("TUM has been loaded, but not initialized. Call TUM.initialize() to start the mission.", TUM.logLevel.INFO)
end end
@@ -125,7 +125,27 @@ do
elseif DCSEx.string.startsWith(z.name:lower(), "water") then elseif DCSEx.string.startsWith(z.name:lower(), "water") then
table.insert(waterZones, z) table.insert(waterZones, z)
else else
local onlyZonesStartingWith = TUM.administrativeSettings.getValue(TUM.administrativeSettings.ONLY_ZONES_STARTINGWITH)
if onlyZonesStartingWith and #onlyZonesStartingWith > 0 then
if type(onlyZonesStartingWith) ~= "table" then
onlyZonesStartingWith = { onlyZonesStartingWith }
end
for _, zonePrefix in ipairs(onlyZonesStartingWith) do
if DCSEx.string.startsWith(z.name:lower(), zonePrefix:lower()) then
table.insert(missionZones, z) table.insert(missionZones, z)
break
end
end
else
local ignoreZonesStartingWith = TUM.administrativeSettings.getValue(TUM.administrativeSettings.IGNORE_ZONES_STARTINGWITH)
if ignoreZonesStartingWith then
if not DCSEx.string.startsWith(z.name:lower(), ignoreZonesStartingWith:lower()) then
table.insert(missionZones, z)
end
else
table.insert(missionZones, z)
end
end
end end
end end