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
+113
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 --
-------------------- --------------------
function TUM.initialize()
do do
-- load the administrative settings
TUM.administrativeSettings.initializeSettings()
local function startUpMission() local function startUpMission()
TUM.hasStarted = false TUM.hasStarted = false
@@ -163,3 +269,10 @@ do
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
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
@@ -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