mirror of
https://github.com/iTracerFacer/DCS_MissionDev.git
synced 2025-12-03 04:14:46 +00:00
Additonal checks and logging to TADC Supply System. Should now correctly skip bases we don't own.
This commit is contained in:
parent
1387d4f792
commit
a3da2a6b8b
Binary file not shown.
Binary file not shown.
@ -34,6 +34,12 @@ if not DISPATCHER_CONFIG then
|
||||
DISPATCHER_CONFIG = { interval = 60, gracePeriod = 25 }
|
||||
end
|
||||
|
||||
-- Safety flag: when false, do NOT fall back to spawning from in-memory template tables.
|
||||
-- Set to true if you understand the tweaked-template warning and accept the risk.
|
||||
if DISPATCHER_CONFIG.ALLOW_FALLBACK_TO_INMEM_TEMPLATE == nil then
|
||||
DISPATCHER_CONFIG.ALLOW_FALLBACK_TO_INMEM_TEMPLATE = false
|
||||
end
|
||||
|
||||
--[[
|
||||
CARGO SUPPLY CONFIGURATION
|
||||
--------------------------------------------------------------------------
|
||||
@ -85,7 +91,7 @@ end
|
||||
Advanced logging configuration and helper function for debug output.
|
||||
]]
|
||||
local ADVANCED_LOGGING = {
|
||||
enableDetailedLogging = true,
|
||||
enableDetailedLogging = false,
|
||||
logPrefix = "[TADC Cargo]"
|
||||
}
|
||||
|
||||
@ -100,10 +106,31 @@ log("═════════════════════════
|
||||
log("Moose_TDAC_CargoDispatcher.lua loaded.", true)
|
||||
log("═══════════════════════════════════════════════════════════════════════════════", true)
|
||||
|
||||
|
||||
-- Provide a safe deepCopy if MIST is not available
|
||||
local function deepCopy(obj)
|
||||
if type(obj) ~= 'table' then return obj end
|
||||
local res = {}
|
||||
for k, v in pairs(obj) do
|
||||
if type(v) == 'table' then
|
||||
res[k] = deepCopy(v)
|
||||
else
|
||||
res[k] = v
|
||||
end
|
||||
end
|
||||
return res
|
||||
end
|
||||
|
||||
-- Dispatch cooldown per airbase (seconds) to avoid repeated immediate retries
|
||||
local CARGO_DISPATCH_COOLDOWN = DISPATCHER_CONFIG and DISPATCHER_CONFIG.cooldown or 300 -- default 5 minutes
|
||||
local lastDispatchAttempt = { red = {}, blue = {} }
|
||||
|
||||
local function getCoalitionSide(coalitionKey)
|
||||
if coalitionKey == 'blue' then return coalition.side.BLUE end
|
||||
if coalitionKey == 'red' then return coalition.side.RED end
|
||||
return nil
|
||||
end
|
||||
|
||||
-- Forward-declare parking check helper so functions defined earlier can call it
|
||||
local destinationHasSuitableParking
|
||||
|
||||
@ -137,12 +164,12 @@ local function validateDispatcherConfig()
|
||||
end
|
||||
|
||||
if #problems == 0 then
|
||||
log("TADC Dispatcher config validation passed ✓", true)
|
||||
MESSAGE:New("TADC Dispatcher config validation passed ✓", 15):ToAll()
|
||||
log("TDAC Dispatcher config validation passed ✓", true)
|
||||
MESSAGE:New("TDAC Dispatcher config validation passed ✓", 15):ToAll()
|
||||
return true, {}
|
||||
else
|
||||
log("TADC Dispatcher config validation found issues:", true)
|
||||
MESSAGE:New("TADC Dispatcher config validation found issues:" .. table.concat(problems, ", "), 15):ToAll()
|
||||
log("TDAC Dispatcher config validation found issues:", true)
|
||||
MESSAGE:New("TDAC Dispatcher config validation found issues:" .. table.concat(problems, ", "), 15):ToAll()
|
||||
for _, p in ipairs(problems) do
|
||||
log(" ✗ " .. p, true)
|
||||
end
|
||||
@ -292,6 +319,25 @@ local function dispatchCargo(squadron, coalitionKey)
|
||||
|
||||
log("Dispatching cargo: " .. groupName .. " from " .. origin .. " to " .. destination)
|
||||
|
||||
-- Spawn cargo aircraft at origin using the template name ONLY for SPAWN
|
||||
-- Note: cargoTemplate is a config string; script uses in-file Lua template tables (CARGO_AIRCRAFT_TEMPLATE_*)
|
||||
log("DEBUG: Attempting spawn for group: '" .. groupName .. "' at airbase: '" .. origin .. "' (using in-file Lua template)", true)
|
||||
local airbaseObj = AIRBASE:FindByName(origin)
|
||||
if not airbaseObj then
|
||||
log("ERROR: AIRBASE:FindByName failed for '" .. tostring(origin) .. "'. Airbase object is nil!")
|
||||
else
|
||||
log("DEBUG: AIRBASE object found for '" .. origin .. "'. Proceeding with spawn.", true)
|
||||
end
|
||||
-- Select the correct template based on coalition
|
||||
local templateBase, uniqueGroupName
|
||||
if coalitionKey == "blue" then
|
||||
templateBase = CARGO_AIRCRAFT_TEMPLATE_BLUE
|
||||
uniqueGroupName = "CARGO_C130_DYNAMIC_" .. math.random(1000,9999)
|
||||
else
|
||||
templateBase = CARGO_AIRCRAFT_TEMPLATE_RED
|
||||
uniqueGroupName = "CARGO_AN26_DYNAMIC_" .. math.random(1000,9999)
|
||||
end
|
||||
-- Clone the template and set the group/unit name
|
||||
-- Prepare a mission placeholder. We'll set the group and spawnPos after successful spawn.
|
||||
local mission = {
|
||||
group = nil,
|
||||
@ -326,7 +372,7 @@ local function dispatchCargo(squadron, coalitionKey)
|
||||
local alias = cargoTemplate .. "_TO_" .. destination .. "_" .. tostring(math.random(1000,9999))
|
||||
log("DEBUG: Attempting RAT spawn for template: '" .. cargoTemplate .. "' alias: '" .. alias .. "'", true)
|
||||
|
||||
-- Check if destination airbase exists and is controlled by the correct coalition
|
||||
-- Check if destination airbase is still controlled by the correct coalition
|
||||
local destAirbase = AIRBASE:FindByName(destination)
|
||||
if not destAirbase then
|
||||
log("ERROR: Destination airbase '" .. destination .. "' does not exist. Skipping dispatch.")
|
||||
@ -404,16 +450,16 @@ local function dispatchCargo(squadron, coalitionKey)
|
||||
local dz = pos.z - dest.y
|
||||
dist = math.sqrt(dx*dx + dz*dz)
|
||||
end
|
||||
log(string.format("[TADC DEBUG] %s state check %d: alive=%s pos=(%.1f,%.1f) speed=%.2f m/s distToDest=%s", name, iter, tostring(spawnedGroup:IsAlive()), pos.x or 0, pos.z or 0, speed, tostring(dist)), true)
|
||||
log(string.format("[TDAC DEBUG] %s state check %d: alive=%s pos=(%.1f,%.1f) speed=%.2f m/s distToDest=%s", name, iter, tostring(spawnedGroup:IsAlive()), pos.x or 0, pos.z or 0, speed, tostring(dist)), true)
|
||||
else
|
||||
log(string.format("[TADC DEBUG] %s state check %d: DCS group has no units", tostring(spawnedGroup:GetName()), iter), true)
|
||||
log(string.format("[TDAC DEBUG] %s state check %d: DCS group has no units", tostring(spawnedGroup:GetName()), iter), true)
|
||||
end
|
||||
else
|
||||
log(string.format("[TADC DEBUG] %s state check %d: no DCS group object", tostring(spawnedGroup:GetName()), iter), true)
|
||||
log(string.format("[TDAC DEBUG] %s state check %d: no DCS group object", tostring(spawnedGroup:GetName()), iter), true)
|
||||
end
|
||||
end)
|
||||
if not ok then
|
||||
log("[TADC DEBUG] Error during debugLogState: " .. tostring(err), true)
|
||||
log("[TDAC DEBUG] Error during debugLogState: " .. tostring(err), true)
|
||||
end
|
||||
timer.scheduleFunction(function() debugLogState(iter + 1) end, {}, timer.getTime() + checkInterval)
|
||||
end
|
||||
@ -441,12 +487,12 @@ end
|
||||
-- Call from DCS console: _G.TDAC_LogAirbaseParking("Luostari Pechenga")
|
||||
function _G.TDAC_LogAirbaseParking(airbaseName)
|
||||
if type(airbaseName) ~= 'string' then
|
||||
log("TADC Parking helper: airbaseName must be a string", true)
|
||||
log("TDAC Parking helper: airbaseName must be a string", true)
|
||||
return false
|
||||
end
|
||||
local base = AIRBASE:FindByName(airbaseName)
|
||||
if not base then
|
||||
log("TADC Parking helper: AIRBASE:FindByName returned nil for '" .. tostring(airbaseName) .. "'", true)
|
||||
log("TDAC Parking helper: AIRBASE:FindByName returned nil for '" .. tostring(airbaseName) .. "'", true)
|
||||
return false
|
||||
end
|
||||
local function spotsFor(term)
|
||||
@ -458,7 +504,7 @@ function _G.TDAC_LogAirbaseParking(airbaseName)
|
||||
local openMed = spotsFor(AIRBASE.TerminalType.OpenMed)
|
||||
local openMedOrBig = spotsFor(AIRBASE.TerminalType.OpenMedOrBig)
|
||||
local runway = spotsFor(AIRBASE.TerminalType.Runway)
|
||||
log(string.format("TADC Parking: %s -> OpenBig=%s OpenMed=%s OpenMedOrBig=%s Runway=%s", airbaseName, tostring(openBig), tostring(openMed), tostring(openMedOrBig), tostring(runway)), true)
|
||||
log(string.format("TDAC Parking: %s -> OpenBig=%s OpenMed=%s OpenMedOrBig=%s Runway=%s", airbaseName, tostring(openBig), tostring(openMed), tostring(openMedOrBig), tostring(runway)), true)
|
||||
return true
|
||||
end
|
||||
|
||||
@ -587,28 +633,28 @@ log("═════════════════════════
|
||||
-- Example (paste into DCS Lua console):
|
||||
-- _G.TDAC_CargoDispatcher_TestSpawn("CARGO_BLUE_C130_TEMPLATE", "Kittila", "Luostari Pechenga")
|
||||
function _G.TDAC_CargoDispatcher_TestSpawn(templateName, originAirbase, destinationAirbase)
|
||||
log("[TADC TEST] Starting test spawn for template: " .. tostring(templateName), true)
|
||||
log("[TDAC TEST] Starting test spawn for template: " .. tostring(templateName), true)
|
||||
local ok, err
|
||||
if type(templateName) ~= 'string' then
|
||||
env.info("[TADC TEST] templateName must be a string")
|
||||
env.info("[TDAC TEST] templateName must be a string")
|
||||
return false, "invalid templateName"
|
||||
end
|
||||
local spawnByName = nil
|
||||
ok, spawnByName = pcall(function() return SPAWN:New(templateName) end)
|
||||
if not ok or not spawnByName then
|
||||
log("[TADC TEST] SPAWN:New failed for template " .. tostring(templateName) .. ". Error: " .. tostring(spawnByName), true)
|
||||
log("[TDAC TEST] SPAWN:New failed for template " .. tostring(templateName) .. ". Error: " .. tostring(spawnByName), true)
|
||||
if debug and debug.traceback then log("TRACEBACK: " .. tostring(debug.traceback(tostring(spawnByName))), true) end
|
||||
return false, "spawn_new_failed"
|
||||
end
|
||||
|
||||
spawnByName:OnSpawnGroup(function(spawnedGroup)
|
||||
log("[TADC TEST] OnSpawnGroup called for: " .. tostring(spawnedGroup:GetName()), true)
|
||||
log("[TDAC TEST] OnSpawnGroup called for: " .. tostring(spawnedGroup:GetName()), true)
|
||||
local dcsGroup = spawnedGroup:GetDCSObject()
|
||||
if dcsGroup then
|
||||
local units = dcsGroup:getUnits()
|
||||
if units and #units > 0 then
|
||||
local pos = units[1]:getPoint()
|
||||
log(string.format("[TADC TEST] Spawned pos x=%.1f y=%.1f z=%.1f", pos.x, pos.y, pos.z), true)
|
||||
log(string.format("[TDAC TEST] Spawned pos x=%.1f y=%.1f z=%.1f", pos.x, pos.y, pos.z), true)
|
||||
end
|
||||
end
|
||||
if destinationAirbase then
|
||||
@ -616,13 +662,13 @@ function _G.TDAC_CargoDispatcher_TestSpawn(templateName, originAirbase, destinat
|
||||
local base = AIRBASE:FindByName(destinationAirbase)
|
||||
if base and spawnedGroup and spawnedGroup.RouteToAirbase then
|
||||
spawnedGroup:RouteToAirbase(base, AI_Task_Land.Runway)
|
||||
log("[TADC TEST] RouteToAirbase assigned to " .. tostring(destinationAirbase), true)
|
||||
log("[TDAC TEST] RouteToAirbase assigned to " .. tostring(destinationAirbase), true)
|
||||
else
|
||||
log("[TADC TEST] RouteToAirbase not available or base not found", true)
|
||||
log("[TDAC TEST] RouteToAirbase not available or base not found", true)
|
||||
end
|
||||
end)
|
||||
if not okAssign then
|
||||
log("[TADC TEST] RouteToAirbase pcall failed: " .. tostring(errAssign), true)
|
||||
log("[TDAC TEST] RouteToAirbase pcall failed: " .. tostring(errAssign), true)
|
||||
if debug and debug.traceback then log("TRACEBACK: " .. tostring(debug.traceback(tostring(errAssign))), true) end
|
||||
end
|
||||
end
|
||||
@ -630,11 +676,11 @@ function _G.TDAC_CargoDispatcher_TestSpawn(templateName, originAirbase, destinat
|
||||
|
||||
ok, err = pcall(function() spawnByName:Spawn() end)
|
||||
if not ok then
|
||||
log("[TADC TEST] spawnByName:Spawn() failed: " .. tostring(err), true)
|
||||
log("[TDAC TEST] spawnByName:Spawn() failed: " .. tostring(err), true)
|
||||
if debug and debug.traceback then log("TRACEBACK: " .. tostring(debug.traceback(tostring(err))), true) end
|
||||
return false, "spawn_failed"
|
||||
end
|
||||
log("[TADC TEST] spawnByName:Spawn() returned successfully", true)
|
||||
log("[TDAC TEST] spawnByName:Spawn() returned successfully", true)
|
||||
return true
|
||||
end
|
||||
|
||||
|
||||
@ -34,6 +34,12 @@ if not DISPATCHER_CONFIG then
|
||||
DISPATCHER_CONFIG = { interval = 60, gracePeriod = 25 }
|
||||
end
|
||||
|
||||
-- Safety flag: when false, do NOT fall back to spawning from in-memory template tables.
|
||||
-- Set to true if you understand the tweaked-template warning and accept the risk.
|
||||
if DISPATCHER_CONFIG.ALLOW_FALLBACK_TO_INMEM_TEMPLATE == nil then
|
||||
DISPATCHER_CONFIG.ALLOW_FALLBACK_TO_INMEM_TEMPLATE = false
|
||||
end
|
||||
|
||||
--[[
|
||||
CARGO SUPPLY CONFIGURATION
|
||||
--------------------------------------------------------------------------
|
||||
@ -85,7 +91,7 @@ end
|
||||
Advanced logging configuration and helper function for debug output.
|
||||
]]
|
||||
local ADVANCED_LOGGING = {
|
||||
enableDetailedLogging = true,
|
||||
enableDetailedLogging = false,
|
||||
logPrefix = "[TADC Cargo]"
|
||||
}
|
||||
|
||||
@ -100,10 +106,31 @@ log("═════════════════════════
|
||||
log("Moose_TDAC_CargoDispatcher.lua loaded.", true)
|
||||
log("═══════════════════════════════════════════════════════════════════════════════", true)
|
||||
|
||||
|
||||
-- Provide a safe deepCopy if MIST is not available
|
||||
local function deepCopy(obj)
|
||||
if type(obj) ~= 'table' then return obj end
|
||||
local res = {}
|
||||
for k, v in pairs(obj) do
|
||||
if type(v) == 'table' then
|
||||
res[k] = deepCopy(v)
|
||||
else
|
||||
res[k] = v
|
||||
end
|
||||
end
|
||||
return res
|
||||
end
|
||||
|
||||
-- Dispatch cooldown per airbase (seconds) to avoid repeated immediate retries
|
||||
local CARGO_DISPATCH_COOLDOWN = DISPATCHER_CONFIG and DISPATCHER_CONFIG.cooldown or 300 -- default 5 minutes
|
||||
local lastDispatchAttempt = { red = {}, blue = {} }
|
||||
|
||||
local function getCoalitionSide(coalitionKey)
|
||||
if coalitionKey == 'blue' then return coalition.side.BLUE end
|
||||
if coalitionKey == 'red' then return coalition.side.RED end
|
||||
return nil
|
||||
end
|
||||
|
||||
-- Forward-declare parking check helper so functions defined earlier can call it
|
||||
local destinationHasSuitableParking
|
||||
|
||||
@ -137,12 +164,12 @@ local function validateDispatcherConfig()
|
||||
end
|
||||
|
||||
if #problems == 0 then
|
||||
log("TADC Dispatcher config validation passed ✓", true)
|
||||
MESSAGE:New("TADC Dispatcher config validation passed ✓", 15):ToAll()
|
||||
log("TDAC Dispatcher config validation passed ✓", true)
|
||||
MESSAGE:New("TDAC Dispatcher config validation passed ✓", 15):ToAll()
|
||||
return true, {}
|
||||
else
|
||||
log("TADC Dispatcher config validation found issues:", true)
|
||||
MESSAGE:New("TADC Dispatcher config validation found issues:" .. table.concat(problems, ", "), 15):ToAll()
|
||||
log("TDAC Dispatcher config validation found issues:", true)
|
||||
MESSAGE:New("TDAC Dispatcher config validation found issues:" .. table.concat(problems, ", "), 15):ToAll()
|
||||
for _, p in ipairs(problems) do
|
||||
log(" ✗ " .. p, true)
|
||||
end
|
||||
@ -292,6 +319,25 @@ local function dispatchCargo(squadron, coalitionKey)
|
||||
|
||||
log("Dispatching cargo: " .. groupName .. " from " .. origin .. " to " .. destination)
|
||||
|
||||
-- Spawn cargo aircraft at origin using the template name ONLY for SPAWN
|
||||
-- Note: cargoTemplate is a config string; script uses in-file Lua template tables (CARGO_AIRCRAFT_TEMPLATE_*)
|
||||
log("DEBUG: Attempting spawn for group: '" .. groupName .. "' at airbase: '" .. origin .. "' (using in-file Lua template)", true)
|
||||
local airbaseObj = AIRBASE:FindByName(origin)
|
||||
if not airbaseObj then
|
||||
log("ERROR: AIRBASE:FindByName failed for '" .. tostring(origin) .. "'. Airbase object is nil!")
|
||||
else
|
||||
log("DEBUG: AIRBASE object found for '" .. origin .. "'. Proceeding with spawn.", true)
|
||||
end
|
||||
-- Select the correct template based on coalition
|
||||
local templateBase, uniqueGroupName
|
||||
if coalitionKey == "blue" then
|
||||
templateBase = CARGO_AIRCRAFT_TEMPLATE_BLUE
|
||||
uniqueGroupName = "CARGO_C130_DYNAMIC_" .. math.random(1000,9999)
|
||||
else
|
||||
templateBase = CARGO_AIRCRAFT_TEMPLATE_RED
|
||||
uniqueGroupName = "CARGO_AN26_DYNAMIC_" .. math.random(1000,9999)
|
||||
end
|
||||
-- Clone the template and set the group/unit name
|
||||
-- Prepare a mission placeholder. We'll set the group and spawnPos after successful spawn.
|
||||
local mission = {
|
||||
group = nil,
|
||||
@ -326,7 +372,7 @@ local function dispatchCargo(squadron, coalitionKey)
|
||||
local alias = cargoTemplate .. "_TO_" .. destination .. "_" .. tostring(math.random(1000,9999))
|
||||
log("DEBUG: Attempting RAT spawn for template: '" .. cargoTemplate .. "' alias: '" .. alias .. "'", true)
|
||||
|
||||
-- Check if destination airbase exists and is controlled by the correct coalition
|
||||
-- Check if destination airbase is still controlled by the correct coalition
|
||||
local destAirbase = AIRBASE:FindByName(destination)
|
||||
if not destAirbase then
|
||||
log("ERROR: Destination airbase '" .. destination .. "' does not exist. Skipping dispatch.")
|
||||
@ -404,16 +450,16 @@ local function dispatchCargo(squadron, coalitionKey)
|
||||
local dz = pos.z - dest.y
|
||||
dist = math.sqrt(dx*dx + dz*dz)
|
||||
end
|
||||
log(string.format("[TADC DEBUG] %s state check %d: alive=%s pos=(%.1f,%.1f) speed=%.2f m/s distToDest=%s", name, iter, tostring(spawnedGroup:IsAlive()), pos.x or 0, pos.z or 0, speed, tostring(dist)), true)
|
||||
log(string.format("[TDAC DEBUG] %s state check %d: alive=%s pos=(%.1f,%.1f) speed=%.2f m/s distToDest=%s", name, iter, tostring(spawnedGroup:IsAlive()), pos.x or 0, pos.z or 0, speed, tostring(dist)), true)
|
||||
else
|
||||
log(string.format("[TADC DEBUG] %s state check %d: DCS group has no units", tostring(spawnedGroup:GetName()), iter), true)
|
||||
log(string.format("[TDAC DEBUG] %s state check %d: DCS group has no units", tostring(spawnedGroup:GetName()), iter), true)
|
||||
end
|
||||
else
|
||||
log(string.format("[TADC DEBUG] %s state check %d: no DCS group object", tostring(spawnedGroup:GetName()), iter), true)
|
||||
log(string.format("[TDAC DEBUG] %s state check %d: no DCS group object", tostring(spawnedGroup:GetName()), iter), true)
|
||||
end
|
||||
end)
|
||||
if not ok then
|
||||
log("[TADC DEBUG] Error during debugLogState: " .. tostring(err), true)
|
||||
log("[TDAC DEBUG] Error during debugLogState: " .. tostring(err), true)
|
||||
end
|
||||
timer.scheduleFunction(function() debugLogState(iter + 1) end, {}, timer.getTime() + checkInterval)
|
||||
end
|
||||
@ -441,12 +487,12 @@ end
|
||||
-- Call from DCS console: _G.TDAC_LogAirbaseParking("Luostari Pechenga")
|
||||
function _G.TDAC_LogAirbaseParking(airbaseName)
|
||||
if type(airbaseName) ~= 'string' then
|
||||
log("TADC Parking helper: airbaseName must be a string", true)
|
||||
log("TDAC Parking helper: airbaseName must be a string", true)
|
||||
return false
|
||||
end
|
||||
local base = AIRBASE:FindByName(airbaseName)
|
||||
if not base then
|
||||
log("TADC Parking helper: AIRBASE:FindByName returned nil for '" .. tostring(airbaseName) .. "'", true)
|
||||
log("TDAC Parking helper: AIRBASE:FindByName returned nil for '" .. tostring(airbaseName) .. "'", true)
|
||||
return false
|
||||
end
|
||||
local function spotsFor(term)
|
||||
@ -458,7 +504,7 @@ function _G.TDAC_LogAirbaseParking(airbaseName)
|
||||
local openMed = spotsFor(AIRBASE.TerminalType.OpenMed)
|
||||
local openMedOrBig = spotsFor(AIRBASE.TerminalType.OpenMedOrBig)
|
||||
local runway = spotsFor(AIRBASE.TerminalType.Runway)
|
||||
log(string.format("TADC Parking: %s -> OpenBig=%s OpenMed=%s OpenMedOrBig=%s Runway=%s", airbaseName, tostring(openBig), tostring(openMed), tostring(openMedOrBig), tostring(runway)), true)
|
||||
log(string.format("TDAC Parking: %s -> OpenBig=%s OpenMed=%s OpenMedOrBig=%s Runway=%s", airbaseName, tostring(openBig), tostring(openMed), tostring(openMedOrBig), tostring(runway)), true)
|
||||
return true
|
||||
end
|
||||
|
||||
@ -587,28 +633,28 @@ log("═════════════════════════
|
||||
-- Example (paste into DCS Lua console):
|
||||
-- _G.TDAC_CargoDispatcher_TestSpawn("CARGO_BLUE_C130_TEMPLATE", "Kittila", "Luostari Pechenga")
|
||||
function _G.TDAC_CargoDispatcher_TestSpawn(templateName, originAirbase, destinationAirbase)
|
||||
log("[TADC TEST] Starting test spawn for template: " .. tostring(templateName), true)
|
||||
log("[TDAC TEST] Starting test spawn for template: " .. tostring(templateName), true)
|
||||
local ok, err
|
||||
if type(templateName) ~= 'string' then
|
||||
env.info("[TADC TEST] templateName must be a string")
|
||||
env.info("[TDAC TEST] templateName must be a string")
|
||||
return false, "invalid templateName"
|
||||
end
|
||||
local spawnByName = nil
|
||||
ok, spawnByName = pcall(function() return SPAWN:New(templateName) end)
|
||||
if not ok or not spawnByName then
|
||||
log("[TADC TEST] SPAWN:New failed for template " .. tostring(templateName) .. ". Error: " .. tostring(spawnByName), true)
|
||||
log("[TDAC TEST] SPAWN:New failed for template " .. tostring(templateName) .. ". Error: " .. tostring(spawnByName), true)
|
||||
if debug and debug.traceback then log("TRACEBACK: " .. tostring(debug.traceback(tostring(spawnByName))), true) end
|
||||
return false, "spawn_new_failed"
|
||||
end
|
||||
|
||||
spawnByName:OnSpawnGroup(function(spawnedGroup)
|
||||
log("[TADC TEST] OnSpawnGroup called for: " .. tostring(spawnedGroup:GetName()), true)
|
||||
log("[TDAC TEST] OnSpawnGroup called for: " .. tostring(spawnedGroup:GetName()), true)
|
||||
local dcsGroup = spawnedGroup:GetDCSObject()
|
||||
if dcsGroup then
|
||||
local units = dcsGroup:getUnits()
|
||||
if units and #units > 0 then
|
||||
local pos = units[1]:getPoint()
|
||||
log(string.format("[TADC TEST] Spawned pos x=%.1f y=%.1f z=%.1f", pos.x, pos.y, pos.z), true)
|
||||
log(string.format("[TDAC TEST] Spawned pos x=%.1f y=%.1f z=%.1f", pos.x, pos.y, pos.z), true)
|
||||
end
|
||||
end
|
||||
if destinationAirbase then
|
||||
@ -616,13 +662,13 @@ function _G.TDAC_CargoDispatcher_TestSpawn(templateName, originAirbase, destinat
|
||||
local base = AIRBASE:FindByName(destinationAirbase)
|
||||
if base and spawnedGroup and spawnedGroup.RouteToAirbase then
|
||||
spawnedGroup:RouteToAirbase(base, AI_Task_Land.Runway)
|
||||
log("[TADC TEST] RouteToAirbase assigned to " .. tostring(destinationAirbase), true)
|
||||
log("[TDAC TEST] RouteToAirbase assigned to " .. tostring(destinationAirbase), true)
|
||||
else
|
||||
log("[TADC TEST] RouteToAirbase not available or base not found", true)
|
||||
log("[TDAC TEST] RouteToAirbase not available or base not found", true)
|
||||
end
|
||||
end)
|
||||
if not okAssign then
|
||||
log("[TADC TEST] RouteToAirbase pcall failed: " .. tostring(errAssign), true)
|
||||
log("[TDAC TEST] RouteToAirbase pcall failed: " .. tostring(errAssign), true)
|
||||
if debug and debug.traceback then log("TRACEBACK: " .. tostring(debug.traceback(tostring(errAssign))), true) end
|
||||
end
|
||||
end
|
||||
@ -630,11 +676,11 @@ function _G.TDAC_CargoDispatcher_TestSpawn(templateName, originAirbase, destinat
|
||||
|
||||
ok, err = pcall(function() spawnByName:Spawn() end)
|
||||
if not ok then
|
||||
log("[TADC TEST] spawnByName:Spawn() failed: " .. tostring(err), true)
|
||||
log("[TDAC TEST] spawnByName:Spawn() failed: " .. tostring(err), true)
|
||||
if debug and debug.traceback then log("TRACEBACK: " .. tostring(debug.traceback(tostring(err))), true) end
|
||||
return false, "spawn_failed"
|
||||
end
|
||||
log("[TADC TEST] spawnByName:Spawn() returned successfully", true)
|
||||
log("[TDAC TEST] spawnByName:Spawn() returned successfully", true)
|
||||
return true
|
||||
end
|
||||
|
||||
|
||||
Binary file not shown.
Loading…
x
Reference in New Issue
Block a user