From 55d217e2919c3051d1093293a9a76b9031ba5705 Mon Sep 17 00:00:00 2001 From: iTracerFacer <134304944+iTracerFacer@users.noreply.github.com> Date: Fri, 17 Oct 2025 17:43:02 -0500 Subject: [PATCH] TADC & TADC Cargo Supply System Updaetd - Fixed all spawning and routing issues and made most of the logging optional for debugging. --- .../F99th-Operation_Polar_Shield_1.0.7.miz | Bin 2322798 -> 2325201 bytes .../Moose_CaptureZones.lua | 126 +-- .../Moose_TADC_CargoDispatcher.lua | 413 +++------ .../Moose_TADC_Load2nd.lua | 843 +++++++++++++++--- .../Operation_Polar_Shield/Simple_TADC.lua | 613 ------------- Moose_TADC/Moose_TADC_CargoDispatcher.lua | 679 ++++++++++++++ Moose_TADC/Moose_TADC_Load2nd.lua | 843 +++++++++++++++--- Moose_TADC/TADC_Example.miz | Bin 956028 -> 969780 bytes 8 files changed, 2296 insertions(+), 1221 deletions(-) delete mode 100644 DCS_Kola/Operation_Polar_Shield/Simple_TADC.lua create mode 100644 Moose_TADC/Moose_TADC_CargoDispatcher.lua diff --git a/DCS_Kola/Operation_Polar_Shield/F99th-Operation_Polar_Shield_1.0.7.miz b/DCS_Kola/Operation_Polar_Shield/F99th-Operation_Polar_Shield_1.0.7.miz index 833b8badf0b6337549e9ff59622f69e268cb9205..e2a38fdcf63a185f7cbeb133f1fbe73761b367c9 100644 GIT binary patch delta 132227 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 delta 129786 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

C4=U;BkA-BH_Mk3269dfhq{!9(S7dGMyUx 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%0AmZ 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 C^F!= totalZones then -- All zones captured by BLUE - trigger victory condition - env.info("[CAPTURE Module] [VICTORY] All zones captured by BLUE! Triggering victory sequence...") + log("[VICTORY] All zones captured by BLUE! Triggering victory sequence...") -- Victory messages US_CC:MessageTypeToCoalition( @@ -425,7 +443,7 @@ local function CheckVictoryCondition() -- Schedule mission end after 60 seconds SCHEDULER:New( nil, function() - env.info("[CAPTURE Module] [VICTORY] Ending mission due to complete zone capture by BLUE") + log("[VICTORY] Ending mission due to complete zone capture by BLUE") -- You can trigger specific end-mission logic here -- For example: trigger.action.setUserFlag("MissionComplete", 1) -- Or call specific mission ending functions @@ -494,7 +512,7 @@ for i, zoneCapture in ipairs(zoneCaptureObjects) do -- Debug: Check if the underlying zone exists local success, zone = pcall(function() return zoneCapture:GetZone() end) if success and zone then - env.info("[CAPTURE Module] ✓ Zone 'Capture " .. zoneName .. "' successfully created and linked") + log("✓ Zone 'Capture " .. zoneName .. "' successfully created and linked") -- Initialize zone borders with initial RED color (all zones start as RED coalition) local drawSuccess, drawError = pcall(function() @@ -502,46 +520,46 @@ for i, zoneCapture in ipairs(zoneCaptureObjects) do end) if not drawSuccess then - env.info("[CAPTURE Module] ⚠ Zone 'Capture " .. zoneName .. "' border drawing failed: " .. tostring(drawError)) + log("⚠ Zone 'Capture " .. zoneName .. "' border drawing failed: " .. tostring(drawError)) -- Alternative: Try simpler zone marking pcall(function() zone:SmokeZone(SMOKECOLOR.Red, 30) end) else - env.info("[CAPTURE Module] ✓ Zone 'Capture " .. zoneName .. "' border drawn successfully with RED initial color") + log("✓ Zone 'Capture " .. zoneName .. "' border drawn successfully with RED initial color") end else - env.info("[CAPTURE Module] ✗ ERROR: Zone 'Capture " .. zoneName .. "' not found in mission editor!") - env.info("[CAPTURE Module] Make sure you have a trigger zone named exactly: 'Capture " .. zoneName .. "'") + log("✗ ERROR: Zone 'Capture " .. zoneName .. "' not found in mission editor!") + log(" Make sure you have a trigger zone named exactly: 'Capture " .. zoneName .. "'") end else - env.info("[CAPTURE Module] ✗ ERROR: Zone capture object " .. i .. " (" .. (zoneNames[i] or "Unknown") .. ") is nil!") + log("✗ ERROR: Zone capture object " .. i .. " (" .. (zoneNames[i] or "Unknown") .. ") is nil!") end end -- Additional specific check for Olenya -env.info("[CAPTURE Module] === OLENYA SPECIFIC DEBUG ===") +log("=== OLENYA SPECIFIC DEBUG ===") if ZoneCapture_Olenya then - env.info("[CAPTURE Module] ✓ ZoneCapture_Olenya object exists") + log("✓ ZoneCapture_Olenya object exists") local success, result = pcall(function() return ZoneCapture_Olenya:GetZoneName() end) if success then - env.info("[CAPTURE Module] ✓ Zone name: " .. tostring(result)) + log("✓ Zone name: " .. tostring(result)) else - env.info("[CAPTURE Module] ✗ Could not get zone name: " .. tostring(result)) + log("✗ Could not get zone name: " .. tostring(result)) end local success2, zone = pcall(function() return ZoneCapture_Olenya:GetZone() end) if success2 and zone then - env.info("[CAPTURE Module] ✓ Underlying zone object exists") + log("✓ Underlying zone object exists") local coord = zone:GetCoordinate() if coord then - env.info("[CAPTURE Module] ✓ Zone coordinate: " .. coord:ToStringLLDMS()) + log("✓ Zone coordinate: " .. coord:ToStringLLDMS()) end else - env.info("[CAPTURE Module] ✗ Underlying zone object missing: " .. tostring(zone)) + log("✗ Underlying zone object missing: " .. tostring(zone)) end else - env.info("[CAPTURE Module] ✗ ZoneCapture_Olenya object is nil!") + log("✗ ZoneCapture_Olenya object is nil!") end -- ========================================== @@ -625,7 +643,7 @@ local function BroadcastZoneStatus() US_CC:MessageTypeToCoalition( fullMessage, MESSAGE.Type.Information, 15 ) - env.info("[CAPTURE Module] [ZONE STATUS] " .. reportMessage:gsub("\n", " | ")) + log("[ZONE STATUS] " .. reportMessage:gsub("\n", " | ")) return status end @@ -653,7 +671,7 @@ end, {}, 10, 300 ) -- Start after 10 seconds, repeat every 300 seconds (5 minute -- Periodic zone color verification system (every 2 minutes) local ZoneColorVerificationScheduler = SCHEDULER:New( nil, function() - env.info("[CAPTURE Module] [ZONE COLORS] Running periodic zone color verification...") + log("[ZONE COLORS] Running periodic zone color verification...") -- Verify each zone's visual marker matches its coalition for i, zoneCapture in ipairs(zoneCaptureObjects) do @@ -678,7 +696,7 @@ end, {}, 60, 120 ) -- Start after 60 seconds, repeat every 120 seconds (2 minute -- Periodic tactical marker update system (every 1 minute) local TacticalMarkerUpdateScheduler = SCHEDULER:New( nil, function() - env.info("[CAPTURE Module] [TACTICAL] Running periodic tactical marker update...") + log("[TACTICAL] Running periodic tactical marker update...") -- Update tactical markers for all zones for i, zoneCapture in ipairs(zoneCaptureObjects) do @@ -691,7 +709,7 @@ end, {}, 30, 60 ) -- Start after 30 seconds, repeat every 60 seconds (1 minute) -- Function to refresh all zone colors based on current ownership local function RefreshAllZoneColors() - env.info("[CAPTURE Module] [ZONE COLORS] Refreshing all zone visual markers...") + log("[ZONE COLORS] Refreshing all zone visual markers...") for i, zoneCapture in ipairs(zoneCaptureObjects) do if zoneCapture then @@ -704,13 +722,13 @@ local function RefreshAllZoneColors() -- Redraw with correct color based on current coalition if coalition == coalition.side.BLUE then zoneCapture:DrawZone(-1, {0, 0, 1}, 0.5, {0, 0, 1}, 0.2, 2, true) -- Blue - env.info(string.format("[CAPTURE Module] [ZONE COLORS] %s: Set to BLUE", zoneName)) + log(string.format("[ZONE COLORS] %s: Set to BLUE", zoneName)) elseif coalition == coalition.side.RED then zoneCapture:DrawZone(-1, {1, 0, 0}, 0.5, {1, 0, 0}, 0.2, 2, true) -- Red - env.info(string.format("[CAPTURE Module] [ZONE COLORS] %s: Set to RED", zoneName)) + log(string.format("[ZONE COLORS] %s: Set to RED", zoneName)) else zoneCapture:DrawZone(-1, {0, 1, 0}, 0.5, {0, 1, 0}, 0.2, 2, true) -- Green (neutral) - env.info(string.format("[CAPTURE Module] [ZONE COLORS] %s: Set to NEUTRAL/GREEN", zoneName)) + log(string.format("[ZONE COLORS] %s: Set to NEUTRAL/GREEN", zoneName)) end end end @@ -754,16 +772,16 @@ end -- Initialize zone status monitoring SCHEDULER:New( nil, function() - env.info("[CAPTURE Module] [VICTORY SYSTEM] Initializing zone monitoring system...") + log("[VICTORY SYSTEM] Initializing zone monitoring system...") SetupZoneStatusCommands() -- Initial status report SCHEDULER:New( nil, function() - env.info("[CAPTURE Module] [VICTORY SYSTEM] Broadcasting initial zone status...") + log("[VICTORY SYSTEM] Broadcasting initial zone status...") BroadcastZoneStatus() end, {}, 30 ) -- Initial report after 30 seconds end, {}, 5 ) -- Initialize after 5 seconds -env.info("[CAPTURE Module] [VICTORY SYSTEM] Zone capture victory monitoring system loaded successfully!") +log("[VICTORY SYSTEM] Zone capture victory monitoring system loaded successfully!") diff --git a/DCS_Kola/Operation_Polar_Shield/Moose_TADC_CargoDispatcher.lua b/DCS_Kola/Operation_Polar_Shield/Moose_TADC_CargoDispatcher.lua index 51abf17..62ea214 100644 --- a/DCS_Kola/Operation_Polar_Shield/Moose_TADC_CargoDispatcher.lua +++ b/DCS_Kola/Operation_Polar_Shield/Moose_TADC_CargoDispatcher.lua @@ -5,7 +5,7 @@ ═══════════════════════════════════════════════════════════════════════════════ DESCRIPTION: - This script monitors RED and BLUE squadrons for low aircraft counts and automatically dispatches CARGO aircraft from a list of supply airfields to replenish them. It tracks each supply mission, announces key stages to players, and prevents duplicate or spam missions. The system integrates with TADC's existing cargo landing logic for replenishment. + This script monitors RED and BLUE squadrons for low aircraft counts and automatically dispatches CARGO aircraft from a list of supply airfields to replenish them. It spawns cargo aircraft and routes them to destination airbases. Delivery detection and replenishment is handled by the main TADC system. CONFIGURATION: - Update static templates and airfield lists as needed for your mission. @@ -40,6 +40,26 @@ if DISPATCHER_CONFIG.ALLOW_FALLBACK_TO_INMEM_TEMPLATE == nil then DISPATCHER_CONFIG.ALLOW_FALLBACK_TO_INMEM_TEMPLATE = false end +--[[ + CARGO SUPPLY CONFIGURATION + -------------------------------------------------------------------------- + Set supply airfields, cargo template names, and resupply thresholds for each coalition. +]] +local CARGO_SUPPLY_CONFIG = { + red = { + supplyAirfields = { "Afrikanda", "Kalevala", "Poduzhemye", "Severomorsk-1", "Severomorsk-3", "Murmansk International", "Kilpyavr", "Olenya", "Monchegorsk" }, -- replace with your RED supply airbase names + cargoTemplate = "CARGO_RED_AN26", -- replace with your RED cargo aircraft template name + threshold = 0.90 -- ratio below which to trigger resupply (testing) + }, + blue = { + supplyAirfields = { "Banak", "Kittila", "Alta", "Sodankyla", "Enontekio", "Kirkenes", "Ivalo", "Luostari Pechenga", "Koshka Yavr" }, -- replace with your BLUE supply airbase names + cargoTemplate = "CARGO_BLUE_C130", -- replace with your BLUE cargo aircraft template name + threshold = 0.90 -- ratio below which to trigger resupply (testing) + } +} + + + --[[ UTILITY STUBS -------------------------------------------------------------------------- @@ -71,10 +91,22 @@ end Advanced logging configuration and helper function for debug output. ]] local ADVANCED_LOGGING = { - enableDetailedLogging = true, + enableDetailedLogging = false, logPrefix = "[TDAC Cargo]" } +-- Logging function (must be defined before any log() calls) +local function log(message, detailed) + if not detailed or ADVANCED_LOGGING.enableDetailedLogging then + env.info(ADVANCED_LOGGING.logPrefix .. " " .. message) + end +end + +log("═══════════════════════════════════════════════════════════════════════════════", true) +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 @@ -99,35 +131,62 @@ local function getCoalitionSide(coalitionKey) return nil end --- Logging function (mimics Moose_TADC_Load2nd.lua) -local function log(message, detailed) - if not detailed or ADVANCED_LOGGING.enableDetailedLogging then - env.info(ADVANCED_LOGGING.logPrefix .. " " .. message) +-- Forward-declare parking check helper so functions defined earlier can call it +local destinationHasSuitableParking + +-- Validate dispatcher configuration: check that supply airfields exist and templates appear valid +local function validateDispatcherConfig() + local problems = {} + + -- Check supply airfields exist + for coalitionKey, cfg in pairs(CARGO_SUPPLY_CONFIG) do + if cfg and cfg.supplyAirfields and type(cfg.supplyAirfields) == 'table' then + for _, abName in ipairs(cfg.supplyAirfields) do + local ok, ab = pcall(function() return AIRBASE:FindByName(abName) end) + if not ok or not ab then + table.insert(problems, string.format("Missing airbase for %s supply list: '%s'", tostring(coalitionKey), tostring(abName))) + end + end + else + table.insert(problems, string.format("Missing or invalid supplyAirfields for coalition '%s'", tostring(coalitionKey))) + end + + -- Check cargo template presence (best-effort using SPAWN:New if available) + if cfg and cfg.cargoTemplate and type(cfg.cargoTemplate) == 'string' and cfg.cargoTemplate ~= '' then + local okSpawn, spawnObj = pcall(function() return SPAWN:New(cfg.cargoTemplate) end) + if not okSpawn or not spawnObj then + -- SPAWN:New may not be available at load time; warn but don't fail hard + table.insert(problems, string.format("Cargo template suspicious or missing: '%s' (coalition: %s)", tostring(cfg.cargoTemplate), tostring(coalitionKey))) + end + else + table.insert(problems, string.format("Missing cargoTemplate for coalition '%s'", tostring(coalitionKey))) + end + end + + if #problems == 0 then + log("TDAC Dispatcher config validation passed ✓", true) + MESSAGE:New("TDAC Dispatcher config validation passed ✓", 15):ToAll() + return true, {} + else + 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 + return false, problems end end +-- Expose console helper to run the check manually +function _G.TDAC_RunConfigCheck() + local ok, problems = validateDispatcherConfig() + if ok then + return true, "OK" + else + return false, problems + end +end -log("═══════════════════════════════════════════════════════════════════════════════", true) -log("Moose_TDAC_CargoDispatcher.lua loaded.", true) -log("═══════════════════════════════════════════════════════════════════════════════", true) - ---[[ - CARGO SUPPLY CONFIGURATION - -------------------------------------------------------------------------- - Set supply airfields, cargo template names, and resupply thresholds for each coalition. -]] -local CARGO_SUPPLY_CONFIG = { - red = { - supplyAirfields = { "Kuusamo", "Kalevala", "Vuojarvi", "Kalevala", "Poduzhemye", "Kirkenes" }, -- replace with your RED supply airbase names - cargoTemplate = "CARGO_RED_AN26", -- replace with your RED cargo aircraft template name - threshold = 0.90 -- ratio below which to trigger resupply (testing) - }, - blue = { - supplyAirfields = { "Banak", "Kittila", "Alta", "Sodankyla", "Vuojarvi", "Enontekio" }, -- replace with your BLUE supply airbase names - cargoTemplate = "CARGO_BLUE_C130", -- replace with your BLUE cargo aircraft template name - threshold = 0.90 -- ratio below which to trigger resupply (testing) - } -} --[[ @@ -196,7 +255,7 @@ end --[[ cleanupCargoMissions() -------------------------------------------------------------------------- - Removes completed or failed cargo missions from the tracking table if their group is no longer alive. + Removes failed cargo missions from the tracking table if their group is no longer alive. ]] local function cleanupCargoMissions() for _, coalitionKey in ipairs({"red", "blue"}) do @@ -207,11 +266,6 @@ local function cleanupCargoMissions() log("Cleaning up failed cargo mission: " .. (m.group and m.group:GetName() or "nil group") .. " status: failed") table.remove(cargoMissions[coalitionKey], i) end - elseif m.status == "completed" then - if not (m.group and m.group:IsAlive()) then - log("Cleaning up completed cargo mission: " .. (m.group and m.group:GetName() or "nil group") .. " status: completed") - table.remove(cargoMissions[coalitionKey], i) - end end end end @@ -226,7 +280,18 @@ end ]] local function dispatchCargo(squadron, coalitionKey) local config = CARGO_SUPPLY_CONFIG[coalitionKey] - local origin = selectRandomAirfield(config.supplyAirfields) + local origin + local attempts = 0 + local maxAttempts = 10 + repeat + origin = selectRandomAirfield(config.supplyAirfields) + attempts = attempts + 1 + -- Ensure origin is not the same as destination + if origin == squadron.airbaseName then + origin = nil + end + until origin or attempts >= maxAttempts + -- enforce cooldown per destination to avoid immediate retries lastDispatchAttempt[coalitionKey] = lastDispatchAttempt[coalitionKey] or {} local last = lastDispatchAttempt[coalitionKey][squadron.airbaseName] @@ -235,32 +300,33 @@ local function dispatchCargo(squadron, coalitionKey) return end if not origin then - log("No origin airfield found for cargo dispatch.") + log("No valid origin airfield found for cargo dispatch to " .. squadron.airbaseName .. " (avoiding same origin/destination)") return end local destination = squadron.airbaseName + local cargoTemplate = config.cargoTemplate -- Safety: check if destination has suitable parking for larger transports. If not, warn in log. local okParking = true -- Only check for likely large transports (C-130 / An-26 are large-ish) — keep conservative if cargoTemplate and (string.find(cargoTemplate:upper(), "C130") or string.find(cargoTemplate:upper(), "C-17") or string.find(cargoTemplate:upper(), "C17") or string.find(cargoTemplate:upper(), "AN26") ) then okParking = destinationHasSuitableParking(destination) if not okParking then - log("WARNING: Destination '" .. tostring(destination) .. "' may not have suitable parking for " .. tostring(cargoTemplate) .. ". This can cause immediate despawn on landing.") + log("WARNING: Destination '" .. tostring(destination) .. "' may not have suitable parking for " .. tostring(cargoTemplate) .. ". Skipping dispatch to prevent despawn.") + return end end - local cargoTemplate = config.cargoTemplate local groupName = cargoTemplate .. "_to_" .. destination .. "_" .. math.random(1000,9999) 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)") + 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.") + log("DEBUG: AIRBASE object found for '" .. origin .. "'. Proceeding with spawn.", true) end -- Select the correct template based on coalition local templateBase, uniqueGroupName @@ -304,13 +370,13 @@ local function dispatchCargo(squadron, coalitionKey) -- Use a per-dispatch RAT object to spawn and route cargo aircraft. -- Create a unique alias to avoid naming collisions and let RAT handle routing/landing. local alias = cargoTemplate .. "_TO_" .. destination .. "_" .. tostring(math.random(1000,9999)) - log("DEBUG: Attempting RAT spawn for template: '" .. cargoTemplate .. "' alias: '" .. alias .. "'") + log("DEBUG: Attempting RAT spawn for template: '" .. cargoTemplate .. "' alias: '" .. alias .. "'", true) local okNew, rat = pcall(function() return RAT:New(cargoTemplate, alias) end) if not okNew or not rat then log("ERROR: RAT:New failed for template '" .. tostring(cargoTemplate) .. "'. Error: " .. tostring(rat)) if debug and debug.traceback then - log("TRACEBACK: " .. tostring(debug.traceback(rat))) + log("TRACEBACK: " .. tostring(debug.traceback(rat)), true) end announceToCoalition(coalitionKey, "Resupply mission to " .. destination .. " failed (spawn init error)!") return @@ -348,9 +414,9 @@ local function dispatchCargo(squadron, coalitionKey) log("RAT spawned cargo aircraft group: " .. tostring(spawnedGroup:GetName())) - -- Temporary debug: log group state every 5s for 60s to trace landing/parking behavior - local debugChecks = 12 - local checkInterval = 5 + -- Temporary debug: log group state every 10s for 10 minutes to trace landing/parking behavior + local debugChecks = 60 -- 60 * 10s = 10 minutes + local checkInterval = 10 local function debugLogState(iter) if iter > debugChecks then return end local ok, err = pcall(function() @@ -364,6 +430,7 @@ local function dispatchCargo(squadron, coalitionKey) -- Use dot accessor to test for function existence; colon-call to invoke local vel = (u.getVelocity and u:getVelocity()) or {x=0,y=0,z=0} local speed = math.sqrt((vel.x or 0)^2 + (vel.y or 0)^2 + (vel.z or 0)^2) + local controller = dcs:getController() local airbaseObj = AIRBASE:FindByName(destination) local dist = nil if airbaseObj then @@ -372,16 +439,16 @@ local function dispatchCargo(squadron, coalitionKey) local dz = pos.z - dest.y dist = math.sqrt(dx*dx + dz*dz) end - 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))) + 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("[TDAC DEBUG] %s state check %d: DCS group has no units", tostring(spawnedGroup:GetName()), iter)) + log(string.format("[TDAC DEBUG] %s state check %d: DCS group has no units", tostring(spawnedGroup:GetName()), iter), true) end else - log(string.format("[TDAC DEBUG] %s state check %d: no DCS group object", tostring(spawnedGroup:GetName()), iter)) + 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("[TDAC DEBUG] Error during debugLogState: " .. tostring(err)) + log("[TDAC DEBUG] Error during debugLogState: " .. tostring(err), true) end timer.scheduleFunction(function() debugLogState(iter + 1) end, {}, timer.getTime() + checkInterval) end @@ -389,149 +456,19 @@ local function dispatchCargo(squadron, coalitionKey) -- RAT should handle routing/taxi/parking. Finalize mission tracking now. finalizeMissionAfterSpawn(spawnedGroup, spawnPos) + mission.status = "enroute" + mission._pendingStartTime = timer.getTime() + announceToCoalition(coalitionKey, "CARGO aircraft departing (airborne) for " .. destination .. ". Defend it!") end) local okSpawn, errSpawn = pcall(function() rat:Spawn(1) end) if not okSpawn then log("ERROR: rat:Spawn() failed for template '" .. tostring(cargoTemplate) .. "'. Error: " .. tostring(errSpawn)) if debug and debug.traceback then - log("TRACEBACK: " .. tostring(debug.traceback(errSpawn))) + log("TRACEBACK: " .. tostring(debug.traceback(errSpawn)), true) end - announceToCoalition(coalitionKey, "Resupply mission to " .. destination .. " failed (spawn error)!") return end - -- Assign route to destination using DCS-native AI tasking, with retries to handle slow registration - local function assignRouteWithRetries(attempt, maxAttempts) - attempt = attempt or 1 - maxAttempts = maxAttempts or 6 - if not (mission.group and mission.group:IsAlive()) then - log(string.format("assignRouteWithRetries: mission.group invalid or dead (attempt %d/%d)", attempt, maxAttempts)) - if attempt >= maxAttempts then - mission.status = "failed" - log("Cargo mission failed: spawned group never registered/alive for mission to " .. destination) - announceToCoalition(coalitionKey, "Resupply mission to " .. destination .. " failed (spawn issue)!") - return - end - -- retry after backoff - timer.scheduleFunction(function() assignRouteWithRetries(attempt + 1, maxAttempts) end, {}, timer.getTime() + (attempt * 2)) - return - end - - local destAirbase = AIRBASE:FindByName(destination) - if not destAirbase then - log("assignRouteWithRetries: Destination airbase not found: " .. tostring(destination)) - mission.status = "failed" - announceToCoalition(coalitionKey, "Resupply mission to " .. destination .. " failed (no airbase)!") - return - end - local dcsGroup = mission.group:GetDCSObject() - if not dcsGroup then - log("assignRouteWithRetries: DCS group object not available yet (attempt " .. attempt .. ")") - if attempt >= maxAttempts then - mission.status = "failed" - announceToCoalition(coalitionKey, "Resupply mission to " .. destination .. " failed (no DCS group)!") - return - end - timer.scheduleFunction(function() assignRouteWithRetries(attempt + 1, maxAttempts) end, {}, timer.getTime() + (attempt * 2)) - return - end - - local controller = dcsGroup:getController() - if not controller then - log("assignRouteWithRetries: Controller not available yet (attempt " .. attempt .. ")") - if attempt >= maxAttempts then - mission.status = "failed" - announceToCoalition(coalitionKey, "Resupply mission to " .. destination .. " failed (no controller)!") - return - end - timer.scheduleFunction(function() assignRouteWithRetries(attempt + 1, maxAttempts) end, {}, timer.getTime() + (attempt * 2)) - return - end - - -- Build route now that we have positions. Use the spawn position captured earlier if available, - -- otherwise read the current unit position from the DCS group. - local cruiseAlt = 6096 -- 20,000 feet in meters - local destCoord = destAirbase:GetCoordinate():GetVec2() - local destElevation = destAirbase:GetCoordinate():GetLandHeight() or 0 - local landingAlt = destElevation + 10 -- 10m above ground - local airdromeId = destAirbase:GetID() or 0 - local destX = destCoord.x - local destZ = destCoord.y - - local pos = mission._spawnPos - if not pos then - local units = dcsGroup:getUnits() - if units and #units > 0 then - pos = units[1]:getPoint() - end - end - if not pos or not pos.x or not pos.z then - log("assignRouteWithRetries: Could not determine spawn position for route assignment (attempt " .. attempt .. ")") - if attempt >= maxAttempts then - mission.status = "failed" - announceToCoalition(coalitionKey, "Resupply mission to " .. destination .. " failed (no position)!") - return - end - timer.scheduleFunction(function() assignRouteWithRetries(attempt + 1, maxAttempts) end, {}, timer.getTime() + (attempt * 2)) - return - end - - local route = { - { - x = pos.x, - z = pos.z, - alt = cruiseAlt, - type = "Turning Point", - action = "Turning Point", - speed = 330 - }, - { - x = destX, - z = destZ, - alt = cruiseAlt, - type = "Turning Point", - action = "Turning Point", - speed = 330 - }, - { - x = destX, - z = destZ, - alt = landingAlt, - type = "Land", - action = "Landing", - speed = 70, - airdromeId = airdromeId - }, - } - - log("DEBUG: Route table assigned:") - for i, wp in ipairs(route) do - log(string.format(" WP%d: x=%.1f z=%.1f alt=%.1f type=%s action=%s speed=%.1f", i, wp.x, wp.z, wp.alt, wp.type, wp.action or "", wp.speed or 0)) - end - - local okSet, errSet = pcall(function() - controller:setTask({ id = 'Mission', params = { route = { points = route } } }) - end) - if not okSet then - log("ERROR: controller:setTask failed: " .. tostring(errSet)) - if debug and debug.traceback then - log("TRACEBACK: " .. tostring(debug.traceback(errSet))) - end - end - log("Assigned custom route to airbase: " .. destination) - if mission.group and mission.group:IsAlive() then - mission.status = "enroute" - mission._pendingStartTime = timer.getTime() - announceToCoalition(coalitionKey, "CARGO aircraft departing (airborne) for " .. destination .. ". Defend it!") - else - mission.status = "failed" - log("Cargo mission failed after route assignment: group not alive: " .. tostring(destination)) - announceToCoalition(coalitionKey, "Resupply mission to " .. destination .. " failed after assignment!") - end - end - - -- Start first attempt after short delay - timer.scheduleFunction(function() assignRouteWithRetries(1, 5) end, {}, timer.getTime() + 2) end @@ -562,7 +499,7 @@ end -- Pre-dispatch safety check: ensure destination can accommodate larger transport types -local function destinationHasSuitableParking(destination, preferredTermTypes) +destinationHasSuitableParking = function(destination, preferredTermTypes) local base = AIRBASE:FindByName(destination) if not base then return false end preferredTermTypes = preferredTermTypes or { AIRBASE.TerminalType.OpenBig, AIRBASE.TerminalType.OpenMedOrBig, AIRBASE.TerminalType.OpenMed } @@ -601,27 +538,27 @@ end --[[ monitorCargoMissions() -------------------------------------------------------------------------- - Monitors all cargo missions, updates their status, and cleans up completed/failed ones. - Handles mission failure after a grace period and mission completion when the group is near the destination airbase. + Monitors all cargo missions, updates their status, and cleans up failed ones. + Handles mission failure after a grace period. ]] local function monitorCargoMissions() for _, coalitionKey in ipairs({"red", "blue"}) do for _, mission in ipairs(cargoMissions[coalitionKey]) do if mission.group == nil then - log("[DEBUG] Mission group object is nil for mission to " .. tostring(mission.destination)) + log("[DEBUG] Mission group object is nil for mission to " .. tostring(mission.destination), true) else - log("[DEBUG] Mission group: " .. tostring(mission.group:GetName()) .. ", IsAlive(): " .. tostring(mission.group:IsAlive())) + log("[DEBUG] Mission group: " .. tostring(mission.group:GetName()) .. ", IsAlive(): " .. tostring(mission.group:IsAlive()), true) local dcsGroup = mission.group:GetDCSObject() if dcsGroup then local units = dcsGroup:getUnits() if units and #units > 0 then local pos = units[1]:getPoint() - log(string.format("[DEBUG] Group position: x=%.1f y=%.1f z=%.1f", pos.x, pos.y, pos.z)) + log(string.format("[DEBUG] Group position: x=%.1f y=%.1f z=%.1f", pos.x, pos.y, pos.z), true) else - log("[DEBUG] No units found in DCS group for mission to " .. tostring(mission.destination)) + log("[DEBUG] No units found in DCS group for mission to " .. tostring(mission.destination), true) end else - log("[DEBUG] DCS group object is nil for mission to " .. tostring(mission.destination)) + log("[DEBUG] DCS group object is nil for mission to " .. tostring(mission.destination), true) end end @@ -643,41 +580,7 @@ local function monitorCargoMissions() log("Cargo mission failed (after grace period): " .. (mission.group and mission.group:GetName() or "nil group") .. " to " .. mission.destination) announceToCoalition(coalitionKey, "Resupply mission to " .. mission.destination .. " failed!") else - log("DEBUG: Mission appears to still have DCS units despite IsAlive=false; skipping failure for " .. tostring(mission.destination)) - end - end - - -- Mission completion logic (unchanged) - if mission.status == "enroute" and mission.group and mission.group:IsAlive() then - local destAirbase = AIRBASE:FindByName(mission.destination) - local reached = false - if destAirbase then - -- Prefer native MOOSE helper if available - if mission.group.IsNearAirbase and type(mission.group.IsNearAirbase) == "function" then - reached = mission.group:IsNearAirbase(destAirbase, 3000) - else - -- Fallback: compute distance between group's first unit and airbase coordinate - local dcsGroup = mission.group and mission.group.GetDCSObject and mission.group:GetDCSObject() - if dcsGroup then - local units = dcsGroup:getUnits() - if units and #units > 0 then - local pos = units[1]:getPoint() - local destCoord = destAirbase:GetCoordinate():GetVec2() - local dx = pos.x - destCoord.x - local dz = pos.z - destCoord.y - local dist = math.sqrt(dx * dx + dz * dz) - if dist <= 3000 then - reached = true - end - end - end - end - end - if reached then - mission.status = "completed" - local name = (mission.group and (mission.group.GetName and mission.group:GetName() or tostring(mission.group)) ) or "unknown" - log("Cargo mission completed: " .. name .. " delivered to " .. mission.destination) - announceToCoalition(coalitionKey, "Resupply delivered to " .. mission.destination .. "!") + log("DEBUG: Mission appears to still have DCS units despite IsAlive=false; skipping failure for " .. tostring(mission.destination), true) end end end @@ -719,7 +622,7 @@ 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) - env.info("[TDAC TEST] Starting test spawn for template: " .. tostring(templateName)) + log("[TDAC TEST] Starting test spawn for template: " .. tostring(templateName), true) local ok, err if type(templateName) ~= 'string' then env.info("[TDAC TEST] templateName must be a string") @@ -728,19 +631,19 @@ function _G.TDAC_CargoDispatcher_TestSpawn(templateName, originAirbase, destinat local spawnByName = nil ok, spawnByName = pcall(function() return SPAWN:New(templateName) end) if not ok or not spawnByName then - env.info("[TDAC TEST] SPAWN:New failed for template " .. tostring(templateName) .. ". Error: " .. tostring(spawnByName)) - if debug and debug.traceback then env.info(debug.traceback(tostring(spawnByName))) end + 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) - env.info("[TDAC TEST] OnSpawnGroup called for: " .. tostring(spawnedGroup:GetName())) + 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() - env.info(string.format("[TDAC TEST] Spawned pos x=%.1f y=%.1f z=%.1f", pos.x, pos.y, pos.z)) + 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 @@ -748,59 +651,29 @@ 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) - env.info("[TDAC TEST] RouteToAirbase assigned to " .. tostring(destinationAirbase)) + log("[TDAC TEST] RouteToAirbase assigned to " .. tostring(destinationAirbase), true) else - env.info("[TDAC TEST] RouteToAirbase not available or base not found") + log("[TDAC TEST] RouteToAirbase not available or base not found", true) end end) if not okAssign then - env.info("[TDAC TEST] RouteToAirbase pcall failed: " .. tostring(errAssign)) - if debug and debug.traceback then env.info(debug.traceback(tostring(errAssign))) end + 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 end) ok, err = pcall(function() spawnByName:Spawn() end) if not ok then - env.info("[TDAC TEST] spawnByName:Spawn() failed: " .. tostring(err)) - if debug and debug.traceback then env.info(debug.traceback(tostring(err))) end + 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 - env.info("[TDAC TEST] spawnByName:Spawn() returned successfully") + log("[TDAC TEST] spawnByName:Spawn() returned successfully", true) return true end --- Global notify API: allow external scripts (e.g. Load2nd) to mark a cargo mission as delivered. --- Usage: _G.TDAC_CargoDelivered(groupName, destination, coalitionKey) -function _G.TDAC_CargoDelivered(groupName, destination, coalitionKey) - local ok, err = pcall(function() - if type(groupName) ~= 'string' or type(destination) ~= 'string' or type(coalitionKey) ~= 'string' then - log("TDAC notify: invalid parameters to _G.TDAC_CargoDelivered", true) - return false - end - coalitionKey = coalitionKey:lower() - if not cargoMissions or not cargoMissions[coalitionKey] then - log("TDAC notify: no cargoMissions table for coalition '" .. tostring(coalitionKey) .. "'", true) - return false - end - -- Find any mission matching destination and group name (or group name substring) and mark completed. - for _, mission in ipairs(cargoMissions[coalitionKey]) do - local mname = mission.group and (mission.group.GetName and mission.group:GetName() or tostring(mission.group)) or nil - if mission.destination == destination then - if mname and string.find(mname:upper(), groupName:upper(), 1, true) then - mission.status = 'completed' - log("TDAC notify: marked mission " .. tostring(mname) .. " as completed for " .. destination .. " (" .. coalitionKey .. ")") - return true - end - end - end - log("TDAC notify: no matching mission found for group='" .. tostring(groupName) .. "' dest='" .. tostring(destination) .. "' coal='" .. tostring(coalitionKey) .. "'") - return false - end) - if not ok then - log("ERROR: _G.TDAC_CargoDelivered failed: " .. tostring(err), true) - return false - end - return true -end +log("═══════════════════════════════════════════════════════════════════════════════", true) +-- End Moose_TDAC_CargoDispatcher.lua + diff --git a/DCS_Kola/Operation_Polar_Shield/Moose_TADC_Load2nd.lua b/DCS_Kola/Operation_Polar_Shield/Moose_TADC_Load2nd.lua index e1d4e49..15ae8e0 100644 --- a/DCS_Kola/Operation_Polar_Shield/Moose_TADC_Load2nd.lua +++ b/DCS_Kola/Operation_Polar_Shield/Moose_TADC_Load2nd.lua @@ -215,6 +215,9 @@ local ADVANCED_SETTINGS = { -- Distance from airbase to consider cargo "delivered" via flyover (meters) -- Aircraft flying within this range will count as supply delivery (no landing required) cargoLandingDistance = 3000, + -- Distance from airbase to consider a landing as delivered (wheel touchdown) + -- Use a slightly larger radius than 1000m to account for runway offsets from airbase center + cargoLandingEventRadius = 2000, -- Velocity below which aircraft is considered "landed" (km/h) cargoLandedVelocity = 5, @@ -224,8 +227,10 @@ local ADVANCED_SETTINGS = { rtbSpeed = 430, -- Return to base speed (knots) -- Logging settings - enableDetailedLogging = true, -- Set to false to reduce log spam + enableDetailedLogging = false, -- Set to false to reduce log spam logPrefix = "[Universal TADC]", -- Prefix for all log messages + -- Proxy/raw-fallback verbose logging (set true to debug proxy behavior) + verboseProxyLogging = false, } --[[ @@ -259,6 +264,18 @@ squadronAircraftCounts = { blue = {} } +-- Aircraft spawn tracking for stuck detection +local aircraftSpawnTracking = { + red = {}, -- groupName -> {spawnPos, spawnTime, squadron, airbase} + blue = {} +} + +-- Airbase health status +local airbaseHealthStatus = { + red = {}, -- airbaseName -> "operational"|"stuck-aircraft"|"unusable" + blue = {} +} + -- Logging function local function log(message, detailed) if not detailed or ADVANCED_SETTINGS.enableDetailedLogging then @@ -642,44 +659,51 @@ end -- Process cargo delivery for a squadron local function processCargoDelivery(cargoGroup, squadron, coalitionSide, coalitionKey) - -- Initialize processed deliveries table + -- Simple delivery processor: dedupe by group ID and credit supplies directly. if not _G.processedDeliveries then _G.processedDeliveries = {} end - - -- Create unique delivery key including timestamp to prevent race conditions - -- Note: Key doesn't include airbase to prevent double-counting if aircraft moves between airbases - local deliveryKey = cargoGroup:GetName() .. "_" .. coalitionKey:upper() .. "_" .. cargoGroup:GetID() - - if not _G.processedDeliveries[deliveryKey] then - -- Mark delivery as processed immediately to prevent race conditions - _G.processedDeliveries[deliveryKey] = timer.getTime() - -- Process replenishment - local currentCount = squadronAircraftCounts[coalitionKey][squadron.templateName] or 0 - local maxCount = squadron.aircraft - local newCount = math.min(currentCount + TADC_SETTINGS[coalitionKey].cargoReplenishmentAmount, maxCount) - local actualAdded = newCount - currentCount - - if actualAdded > 0 then - squadronAircraftCounts[coalitionKey][squadron.templateName] = newCount - local msg = coalitionKey:upper() .. " CARGO DELIVERY: " .. cargoGroup:GetName() .. " delivered " .. actualAdded .. - " aircraft to " .. squadron.displayName .. - " (" .. newCount .. "/" .. maxCount .. ")" - log(msg) - MESSAGE:New(msg, 20):ToCoalition(coalitionSide) - USERSOUND:New("Cargo_Delivered.ogg"):ToCoalition(coalitionSide) - -- Notify dispatcher (if available) so it can mark the matching mission completed immediately - if type(_G.TDAC_CargoDelivered) == 'function' then - pcall(function() - _G.TDAC_CargoDelivered(cargoGroup:GetName(), squadron.airbaseName, coalitionKey) - end) - end - else - local msg = coalitionKey:upper() .. " CARGO DELIVERY: " .. squadron.displayName .. " already at max capacity" - log(msg, true) - MESSAGE:New(msg, 15):ToCoalition(coalitionSide) - USERSOUND:New("Cargo_Delivered.ogg"):ToCoalition(coalitionSide) - end + + -- Use group ID + squadron airbase as dedupe key to avoid double crediting when the same group + -- triggers multiple events or moves between airbases rapidly. + local okId, grpId = pcall(function() return cargoGroup and cargoGroup.GetID and cargoGroup:GetID() end) + local groupIdStr = (okId and grpId) and tostring(grpId) or "" + local deliveryKey = groupIdStr .. "_" .. tostring(squadron.airbaseName) + + -- Diagnostic log: show group name, id, and delivery key when processor invoked + local okName, grpName = pcall(function() return cargoGroup and cargoGroup.GetName and cargoGroup:GetName() end) + local groupNameStr = (okName and grpName) and tostring(grpName) or "" + log("PROCESS CARGO: invoked for group=" .. groupNameStr .. " id=" .. groupIdStr .. " targetAirbase=" .. tostring(squadron.airbaseName) .. " deliveryKey=" .. deliveryKey, true) + + if _G.processedDeliveries[deliveryKey] then + -- Already processed recently, ignore + log("PROCESS CARGO: deliveryKey " .. deliveryKey .. " already processed at " .. tostring(_G.processedDeliveries[deliveryKey]), true) + return + end + + -- Mark processed immediately + _G.processedDeliveries[deliveryKey] = timer.getTime() + + -- Credit the squadron + local currentCount = squadronAircraftCounts[coalitionKey][squadron.templateName] or 0 + local maxCount = squadron.aircraft or 0 + local addAmount = TADC_SETTINGS[coalitionKey].cargoReplenishmentAmount or 0 + local newCount = math.min(currentCount + addAmount, maxCount) + local actualAdded = newCount - currentCount + + if actualAdded > 0 then + squadronAircraftCounts[coalitionKey][squadron.templateName] = newCount + local msg = coalitionKey:upper() .. " CARGO DELIVERY: " .. cargoGroup:GetName() .. " delivered " .. actualAdded .. + " aircraft to " .. (squadron.displayName or squadron.templateName) .. + " (" .. newCount .. "/" .. maxCount .. ")" + log(msg) + MESSAGE:New(msg, 20):ToCoalition(coalitionSide) + USERSOUND:New("Cargo_Delivered.ogg"):ToCoalition(coalitionSide) + else + local msg = coalitionKey:upper() .. " CARGO DELIVERY: " .. (squadron.displayName or squadron.templateName) .. " already at max capacity" + log(msg, true) + MESSAGE:New(msg, 10):ToCoalition(coalitionSide) + USERSOUND:New("Cargo_Delivered.ogg"):ToCoalition(coalitionSide) end end @@ -688,141 +712,582 @@ local cargoEventHandler = {} function cargoEventHandler:onEvent(event) if event.id == world.event.S_EVENT_LAND then local unit = event.initiator + + -- Safe unit name retrieval + local unitName = "unknown" + if unit and type(unit) == "table" then + local ok, name = pcall(function() return unit:GetName() end) + if ok and name then + unitName = name + end + end + + log("LANDING EVENT: Received S_EVENT_LAND for unit: " .. unitName, true) + if unit and type(unit) == "table" and unit.IsAlive and unit:IsAlive() then local group = unit:GetGroup() if group and type(group) == "table" and group.IsAlive and group:IsAlive() then - local cargoName = group:GetName():upper() + -- Safe group name retrieval + local cargoName = "unknown" + local ok, name = pcall(function() return group:GetName():upper() end) + if ok and name then + cargoName = name + end + + log("LANDING EVENT: Processing group: " .. cargoName, true) + local isCargoAircraft = false -- Check if aircraft name matches cargo patterns for _, pattern in pairs(ADVANCED_SETTINGS.cargoPatterns) do if string.find(cargoName, pattern) then isCargoAircraft = true + log("LANDING EVENT: Matched cargo pattern '" .. pattern .. "' for " .. cargoName, true) break end end if isCargoAircraft then - local cargoCoord = unit:GetCoordinate() - local coalitionSide = unit:GetCoalition() - local coalitionKey = (coalitionSide == coalition.side.RED) and "red" or "blue" + -- Safe coordinate and coalition retrieval + local cargoCoord = nil + local ok, coord = pcall(function() return unit:GetCoordinate() end) + if ok and coord then + cargoCoord = coord + end - -- Check which airbase it's near - local squadronConfig = getSquadronConfig(coalitionSide) - for _, squadron in pairs(squadronConfig) do - local airbase = AIRBASE:FindByName(squadron.airbaseName) - if airbase and airbase:GetCoalition() == coalitionSide then - local airbaseCoord = airbase:GetCoordinate() - local distance = cargoCoord:Get2DDistance(airbaseCoord) - - -- If within configured distance of airbase, consider it a landing delivery - if distance < ADVANCED_SETTINGS.cargoLandingDistance then - log("LANDING DELIVERY: " .. cargoName .. " landed and delivered at " .. squadron.airbaseName .. " (distance: " .. math.floor(distance) .. "m)") - processCargoDelivery(group, squadron, coalitionSide, coalitionKey) + log("LANDING EVENT: Cargo aircraft " .. cargoName .. " at coord: " .. tostring(cargoCoord), true) + + if cargoCoord then + local closestAirbase = nil + local closestDistance = math.huge + local closestSquadron = nil + + -- Search RED squadron configs + for _, squadron in pairs(RED_SQUADRON_CONFIG) do + local airbase = AIRBASE:FindByName(squadron.airbaseName) + if airbase then + local distance = cargoCoord:Get2DDistance(airbase:GetCoordinate()) + log("LANDING EVENT: Checking distance to " .. squadron.airbaseName .. ": " .. math.floor(distance) .. "m", true) + if distance < closestDistance then + closestDistance = distance + closestAirbase = airbase + closestSquadron = squadron + end end end + + -- Search BLUE squadron configs + for _, squadron in pairs(BLUE_SQUADRON_CONFIG) do + local airbase = AIRBASE:FindByName(squadron.airbaseName) + if airbase then + local distance = cargoCoord:Get2DDistance(airbase:GetCoordinate()) + log("LANDING EVENT: Checking distance to " .. squadron.airbaseName .. ": " .. math.floor(distance) .. "m", true) + if distance < closestDistance then + closestDistance = distance + closestAirbase = airbase + closestSquadron = squadron + end + end + end + + if closestAirbase then + local abCoalition = closestAirbase:GetCoalition() + local coalitionKey = (abCoalition == coalition.side.RED) and "red" or "blue" + if closestDistance < ADVANCED_SETTINGS.cargoLandingEventRadius then + log("LANDING DELIVERY: " .. cargoName .. " landed and delivered at " .. closestSquadron.airbaseName .. " (distance: " .. math.floor(closestDistance) .. "m)") + processCargoDelivery(group, closestSquadron, abCoalition, coalitionKey) + else + log("LANDING DETECTED: " .. cargoName .. " landed but no valid airbase found within range (closest: " .. (closestDistance and math.floor(closestDistance) .. "m" or "none") .. ")") + end + else + log("LANDING DETECTED: " .. cargoName .. " landed but no configured squadron airbases available to check", true) + end + else + log("LANDING EVENT: Could not get coordinates for cargo aircraft " .. cargoName, true) end + else + log("LANDING EVENT: " .. cargoName .. " is not a cargo aircraft", true) + end + else + log("LANDING EVENT: Group is nil or not alive", true) + end + else + -- Fallback: unit was nil or not alive (race/despawn). Try to retrieve group and name safely + log("LANDING EVENT: Unit is nil or not alive - attempting fallback group retrieval", true) + + local fallbackGroup = nil + local okGetGroup, grp = pcall(function() + if unit and type(unit) == "table" and unit.GetGroup then + return unit:GetGroup() + end + -- Try event.initiator (may be raw DCS object) + if event and event.initiator and type(event.initiator) == 'table' and event.initiator.GetGroup then + return event.initiator:GetGroup() + end + return nil + end) + + if okGetGroup and grp then + fallbackGroup = grp + end + + if fallbackGroup then + -- Try to get group name even if group:IsAlive() is false + local okName, gname = pcall(function() return fallbackGroup:GetName():upper() end) + local cargoName = "unknown" + if okName and gname then + cargoName = gname + end + + log("LANDING EVENT (fallback): Processing group: " .. cargoName, true) + + local isCargoAircraft = false + for _, pattern in pairs(ADVANCED_SETTINGS.cargoPatterns) do + if string.find(cargoName, pattern) then + isCargoAircraft = true + log("LANDING EVENT (fallback): Matched cargo pattern '" .. pattern .. "' for " .. cargoName, true) + break + end + end + + if isCargoAircraft then + -- Try to get coordinate and coalition via multiple safe methods + local cargoCoord = nil + local okCoord, coord = pcall(function() + if unit and unit.GetCoordinate then return unit:GetCoordinate() end + if fallbackGroup and fallbackGroup.GetCoordinate then return fallbackGroup:GetCoordinate() end + return nil + end) + if okCoord and coord then cargoCoord = coord end + + log("LANDING EVENT (fallback): Cargo aircraft " .. cargoName .. " at coord: " .. tostring(cargoCoord), true) + + if cargoCoord then + local closestAirbase = nil + local closestDistance = math.huge + local closestSquadron = nil + + for _, squadron in pairs(RED_SQUADRON_CONFIG) do + local airbase = AIRBASE:FindByName(squadron.airbaseName) + if airbase then + local distance = cargoCoord:Get2DDistance(airbase:GetCoordinate()) + log("LANDING EVENT (fallback): Checking distance to " .. squadron.airbaseName .. ": " .. math.floor(distance) .. "m", true) + if distance < closestDistance then + closestDistance = distance + closestAirbase = airbase + closestSquadron = squadron + end + end + end + + for _, squadron in pairs(BLUE_SQUADRON_CONFIG) do + local airbase = AIRBASE:FindByName(squadron.airbaseName) + if airbase then + local distance = cargoCoord:Get2DDistance(airbase:GetCoordinate()) + log("LANDING EVENT (fallback): Checking distance to " .. squadron.airbaseName .. ": " .. math.floor(distance) .. "m", true) + if distance < closestDistance then + closestDistance = distance + closestAirbase = airbase + closestSquadron = squadron + end + end + end + + if closestAirbase then + local abCoalition = closestAirbase:GetCoalition() + local coalitionKey = (abCoalition == coalition.side.RED) and "red" or "blue" + if closestDistance < ADVANCED_SETTINGS.cargoLandingEventRadius then + log("LANDING DELIVERY (fallback): " .. cargoName .. " landed and delivered at " .. closestSquadron.airbaseName .. " (distance: " .. math.floor(closestDistance) .. "m)") + processCargoDelivery(fallbackGroup, closestSquadron, abCoalition, coalitionKey) + else + log("LANDING DETECTED (fallback): " .. cargoName .. " landed but no valid airbase found within range (closest: " .. (closestDistance and math.floor(closestDistance) .. "m" or "none") .. ")") + end + else + log("LANDING EVENT (fallback): No configured squadron airbases available to check", true) + end + else + log("LANDING EVENT (fallback): Could not get coordinates for cargo aircraft " .. cargoName, true) + end + else + log("LANDING EVENT (fallback): " .. cargoName .. " is not a cargo aircraft", true) + end + else + log("LANDING EVENT: Fallback group retrieval failed", true) + -- Additional fallback: try raw DCS object methods (lowercase) and resolve by name + local okRaw, rawGroup = pcall(function() + if event and event.initiator and type(event.initiator) == 'table' and event.initiator.getGroup then + return event.initiator:getGroup() + end + return nil + end) + + if okRaw and rawGroup then + -- Try to get raw group name + local okRawName, rawName = pcall(function() + if rawGroup.getName then return rawGroup:getName() end + return nil + end) + + if okRawName and rawName then + local rawNameUp = tostring(rawName):upper() + log("LANDING EVENT: Resolved raw DCS group name: " .. rawNameUp, true) + + -- Try to find MOOSE GROUP by that name + local okFind, mooseGroup = pcall(function() return GROUP:FindByName(rawNameUp) end) + if okFind and mooseGroup and type(mooseGroup) == 'table' then + log("LANDING EVENT: Found MOOSE GROUP for raw name: " .. rawNameUp, true) + -- Reuse the fallback logic using mooseGroup + local cargoName = rawNameUp + local isCargoAircraft = false + for _, pattern in pairs(ADVANCED_SETTINGS.cargoPatterns) do + if string.find(cargoName, pattern) then + isCargoAircraft = true + break + end + end + if isCargoAircraft then + -- Try to get coordinate from raw group if possible + local cargoCoord = nil + local okPoint, point = pcall(function() + if rawGroup.getController then + -- Raw DCS unit list -> first unit point + local dcs = rawGroup + if dcs.getUnits then + local units = dcs:getUnits() + if units and #units > 0 and units[1].getPoint then + return units[1]:getPoint() + end + end + end + return nil + end) + if okPoint and point then cargoCoord = point end + + -- If we have a coordinate, find nearest squadron and process + if cargoCoord then + local closestAirbase = nil + local closestDistance = math.huge + local closestSquadron = nil + + for _, squadron in pairs(RED_SQUADRON_CONFIG) do + local airbase = AIRBASE:FindByName(squadron.airbaseName) + if airbase then + local distance = math.huge + if type(cargoCoord) == 'table' and cargoCoord.Get2DDistance then + local okDist, d = pcall(function() return cargoCoord:Get2DDistance(airbase:GetCoordinate()) end) + if okDist and d then distance = d end + else + local okVec, aVec = pcall(function() return airbase:GetCoordinate():GetVec2() end) + if okVec and aVec and type(aVec) == 'table' then + local cx, cy + if cargoCoord.x and cargoCoord.z then + cx, cy = cargoCoord.x, cargoCoord.z + elseif cargoCoord.x and cargoCoord.y then + cx, cy = cargoCoord.x, cargoCoord.y + elseif cargoCoord[1] and cargoCoord[3] then + cx, cy = cargoCoord[1], cargoCoord[3] + elseif cargoCoord[1] and cargoCoord[2] then + cx, cy = cargoCoord[1], cargoCoord[2] + end + if cx and cy then + local dx = cx - aVec.x + local dy = cy - aVec.y + distance = math.sqrt(dx*dx + dy*dy) + end + end + end + + if distance < closestDistance then + closestDistance = distance + closestAirbase = airbase + closestSquadron = squadron + end + end + end + + for _, squadron in pairs(BLUE_SQUADRON_CONFIG) do + local airbase = AIRBASE:FindByName(squadron.airbaseName) + if airbase then + local distance = math.huge + if type(cargoCoord) == 'table' and cargoCoord.Get2DDistance then + local okDist, d = pcall(function() return cargoCoord:Get2DDistance(airbase:GetCoordinate()) end) + if okDist and d then distance = d end + else + local okVec, aVec = pcall(function() return airbase:GetCoordinate():GetVec2() end) + if okVec and aVec and type(aVec) == 'table' then + local cx, cy + if cargoCoord.x and cargoCoord.z then + cx, cy = cargoCoord.x, cargoCoord.z + elseif cargoCoord.x and cargoCoord.y then + cx, cy = cargoCoord.x, cargoCoord.y + elseif cargoCoord[1] and cargoCoord[3] then + cx, cy = cargoCoord[1], cargoCoord[3] + elseif cargoCoord[1] and cargoCoord[2] then + cx, cy = cargoCoord[1], cargoCoord[2] + end + if cx and cy then + local dx = cx - aVec.x + local dy = cy - aVec.y + distance = math.sqrt(dx*dx + dy*dy) + end + end + end + + if distance < closestDistance then + closestDistance = distance + closestAirbase = airbase + closestSquadron = squadron + end + end + end + + if closestAirbase and closestDistance < ADVANCED_SETTINGS.cargoLandingEventRadius then + local abCoalition = closestAirbase:GetCoalition() + local coalitionKey = (abCoalition == coalition.side.RED) and "red" or "blue" + log("LANDING DELIVERY (raw-fallback): " .. rawNameUp .. " landed and delivered at " .. closestSquadron.airbaseName .. " (distance: " .. math.floor(closestDistance) .. "m)") + processCargoDelivery(mooseGroup, closestSquadron, abCoalition, coalitionKey) + else + log("LANDING DETECTED (raw-fallback): " .. rawNameUp .. " landed but no valid airbase found within range (closest: " .. (closestDistance and math.floor(closestDistance) .. "m" or "none") .. ")") + end + else + log("LANDING EVENT: Could not extract coordinate from raw DCS group: " .. tostring(rawName), true) + end + else + log("LANDING EVENT: Raw group " .. tostring(rawName) .. " is not a cargo aircraft", true) + end + else + log("LANDING EVENT: Could not find MOOSE GROUP for raw name: " .. tostring(rawName) .. " - attempting raw-group proxy processing", true) + + -- Even if we can't find a MOOSE GROUP, try to extract coordinates from the raw DCS group + local okPoint2, point2 = pcall(function() + if rawGroup and rawGroup.getUnits then + local units = rawGroup:getUnits() + if units and #units > 0 and units[1].getPoint then + return units[1]:getPoint() + end + end + return nil + end) + + if okPoint2 and point2 then + local cargoCoord = point2 + -- Find nearest configured squadron airbase (RED + BLUE) + local closestAirbase = nil + local closestDistance = math.huge + local closestSquadron = nil + + for _, squadron in pairs(RED_SQUADRON_CONFIG) do + local airbase = AIRBASE:FindByName(squadron.airbaseName) + if airbase then + local distance = math.huge + local okVec, aVec = pcall(function() return airbase:GetCoordinate():GetVec2() end) + if okVec and aVec and type(aVec) == 'table' then + local cx, cy + if cargoCoord.x and cargoCoord.z then + cx, cy = cargoCoord.x, cargoCoord.z + elseif cargoCoord.x and cargoCoord.y then + cx, cy = cargoCoord.x, cargoCoord.y + elseif cargoCoord[1] and cargoCoord[3] then + cx, cy = cargoCoord[1], cargoCoord[3] + elseif cargoCoord[1] and cargoCoord[2] then + cx, cy = cargoCoord[1], cargoCoord[2] + end + if cx and cy then + local dx = cx - aVec.x + local dy = cy - aVec.y + distance = math.sqrt(dx*dx + dy*dy) + end + end + + if distance < closestDistance then + closestDistance = distance + closestAirbase = airbase + closestSquadron = squadron + end + end + end + + for _, squadron in pairs(BLUE_SQUADRON_CONFIG) do + local airbase = AIRBASE:FindByName(squadron.airbaseName) + if airbase then + local distance = math.huge + local okVec, aVec = pcall(function() return airbase:GetCoordinate():GetVec2() end) + if okVec and aVec and type(aVec) == 'table' then + local cx, cy + if cargoCoord.x and cargoCoord.z then + cx, cy = cargoCoord.x, cargoCoord.z + elseif cargoCoord.x and cargoCoord.y then + cx, cy = cargoCoord.x, cargoCoord.y + elseif cargoCoord[1] and cargoCoord[3] then + cx, cy = cargoCoord[1], cargoCoord[3] + elseif cargoCoord[1] and cargoCoord[2] then + cx, cy = cargoCoord[1], cargoCoord[2] + end + if cx and cy then + local dx = cx - aVec.x + local dy = cy - aVec.y + distance = math.sqrt(dx*dx + dy*dy) + end + end + + if distance < closestDistance then + closestDistance = distance + closestAirbase = airbase + closestSquadron = squadron + end + end + end + + if closestAirbase and closestDistance < ADVANCED_SETTINGS.cargoLandingEventRadius then + local abCoalition = closestAirbase:GetCoalition() + local coalitionKey = (abCoalition == coalition.side.RED) and "red" or "blue" + + -- Ensure the raw group name actually looks like a cargo aircraft before crediting + local rawNameUpCheck = tostring(rawName):upper() + local isCargoProxy = false + for _, pattern in pairs(ADVANCED_SETTINGS.cargoPatterns) do + if string.find(rawNameUpCheck, pattern) then + isCargoProxy = true + break + end + end + + if not isCargoProxy then + if ADVANCED_SETTINGS.verboseProxyLogging then + log("LANDING IGNORED (raw-proxy): " .. tostring(rawName) .. " is not a cargo-type name, skipping delivery proxy", true) + else + log("LANDING IGNORED (raw-proxy): " .. tostring(rawName) .. " is not a cargo-type name, skipping delivery proxy", true) + end + else + -- Build a small proxy object that exposes GetName and GetID so processCargoDelivery can use it + local cargoProxy = {} + function cargoProxy:GetName() + local okn, nm = pcall(function() + if rawGroup and rawGroup.getName then return rawGroup:getName() end + return tostring(rawName) + end) + return (okn and nm) and tostring(nm) or tostring(rawName) + end + function cargoProxy:GetID() + local okid, id = pcall(function() + if rawGroup and rawGroup.getID then return rawGroup:getID() end + if rawGroup and rawGroup.getID == nil and rawGroup.getController then + -- Try to hash name as fallback unique-ish id + return tostring(rawName) .. "_proxy" + end + return nil + end) + return (okid and id) and id or tostring(rawName) .. "_proxy" + end + + if ADVANCED_SETTINGS.verboseProxyLogging then + log("LANDING DELIVERY (raw-proxy): " .. tostring(rawName) .. " landed and delivered at " .. closestSquadron.airbaseName .. " (distance: " .. math.floor(closestDistance) .. "m) - using proxy object", true) + end + processCargoDelivery(cargoProxy, closestSquadron, abCoalition, coalitionKey) + end + else + if ADVANCED_SETTINGS.verboseProxyLogging then + log("LANDING DETECTED (raw-proxy): " .. tostring(rawName) .. " landed but no valid airbase found within range (closest: " .. (closestDistance and math.floor(closestDistance) .. "m" or "none") .. ")", true) + end + end + else + log("LANDING EVENT: Could not extract coordinate from raw DCS group for proxy processing: " .. tostring(rawName), true) + end + end + else + log("LANDING EVENT: rawGroup:getName() failed", true) + end + else + log("LANDING EVENT: raw DCS group retrieval failed", true) end end end end end --- Monitor cargo aircraft flyovers for squadron replenishment -local function monitorCargoReplenishment() - -- Process RED cargo aircraft - if TADC_SETTINGS.enableRed then - -- Use cached set for performance, create if needed - if not cachedSets.redCargo then - cachedSets.redCargo = SET_GROUP:New():FilterCoalitions("red"):FilterCategoryAirplane():FilterStart() - end - local redCargo = cachedSets.redCargo - - redCargo:ForEach(function(cargoGroup) - if cargoGroup and cargoGroup:IsAlive() then - local cargoName = cargoGroup:GetName():upper() - local isCargoAircraft = false - - -- Check if aircraft name matches cargo patterns - for _, pattern in pairs(ADVANCED_SETTINGS.cargoPatterns) do - if string.find(cargoName, pattern) then - isCargoAircraft = true - break - end - end - - if isCargoAircraft then - local cargoCoord = cargoGroup:GetCoordinate() - local cargoVelocity = cargoGroup:GetVelocityKMH() - -- DEBUG: log candidate details with timestamp for diagnosis - if ADVANCED_SETTINGS.enableDetailedLogging then - log(string.format("[LOAD2ND DEBUG] Evaluating cargo %s at time=%d vel=%.2f km/h coord=(%.1f,%.1f)", - cargoGroup:GetName(), timer.getTime(), cargoVelocity, cargoCoord:GetVec2().x, cargoCoord:GetVec2().y)) - end - - -- Check for flyover delivery - aircraft within range of airbase (no landing required) - -- Check which RED airbase it's near - for _, squadron in pairs(RED_SQUADRON_CONFIG) do - local airbase = AIRBASE:FindByName(squadron.airbaseName) - if airbase and airbase:GetCoalition() == coalition.side.RED then - local airbaseCoord = airbase:GetCoordinate() - local distance = cargoCoord:Get2DDistance(airbaseCoord) - - -- If within configured distance of airbase, consider it a flyover delivery - if distance < ADVANCED_SETTINGS.cargoLandingDistance then - log("FLYOVER DELIVERY: " .. cargoName .. " delivered supplies to " .. squadron.airbaseName .. " (distance: " .. math.floor(distance) .. "m, altitude: " .. math.floor(cargoCoord.y/0.3048) .. " ft)") - processCargoDelivery(cargoGroup, squadron, coalition.side.RED, "red") - end - end - end - end +-- Reassign squadron to an alternative airbase when primary airbase has issues +local function reassignSquadronToAlternativeAirbase(squadron, coalitionKey) + local coalitionSide = (coalitionKey == "red") and coalition.side.RED or coalition.side.BLUE + local coalitionName = (coalitionKey == "red") and "RED" or "BLUE" + local squadronConfig = getSquadronConfig(coalitionSide) + + -- Find alternative airbases (other squadrons' airbases that are operational) + local alternativeAirbases = {} + for _, altSquadron in pairs(squadronConfig) do + if altSquadron.airbaseName ~= squadron.airbaseName then + local usable, status = isAirbaseUsable(altSquadron.airbaseName, coalitionSide) + local healthStatus = airbaseHealthStatus[coalitionKey][altSquadron.airbaseName] or "operational" + + if usable and healthStatus == "operational" then + table.insert(alternativeAirbases, altSquadron.airbaseName) end - end) + end end - -- Process BLUE cargo aircraft - if TADC_SETTINGS.enableBlue then - -- Use cached set for performance, create if needed - if not cachedSets.blueCargo then - cachedSets.blueCargo = SET_GROUP:New():FilterCoalitions("blue"):FilterCategoryAirplane():FilterStart() - end - local blueCargo = cachedSets.blueCargo + if #alternativeAirbases > 0 then + -- Select random alternative airbase + local newAirbase = alternativeAirbases[math.random(1, #alternativeAirbases)] - blueCargo:ForEach(function(cargoGroup) - if cargoGroup and cargoGroup:IsAlive() then - local cargoName = cargoGroup:GetName():upper() - local isCargoAircraft = false + -- Update squadron configuration (this is a runtime change) + squadron.airbaseName = newAirbase + airbaseHealthStatus[coalitionKey][squadron.airbaseName] = "operational" -- Reset health for new assignment + + log("REASSIGNED: " .. coalitionName .. " Squadron " .. squadron.displayName .. " moved from " .. squadron.airbaseName .. " to " .. newAirbase) + MESSAGE:New(coalitionName .. " Squadron " .. squadron.displayName .. " reassigned to " .. newAirbase .. " due to airbase issues", 20):ToCoalition(coalitionSide) + else + log("WARNING: No alternative airbases available for " .. coalitionName .. " Squadron " .. squadron.displayName) + MESSAGE:New("WARNING: No alternative airbases available for " .. squadron.displayName, 30):ToCoalition(coalitionSide) + end +end + +-- Monitor for stuck aircraft at airbases +local function monitorStuckAircraft() + local currentTime = timer.getTime() + local stuckThreshold = 300 -- 5 minutes before considering aircraft stuck + local movementThreshold = 50 -- meters - aircraft must move at least this far to not be considered stuck + + for _, coalitionKey in ipairs({"red", "blue"}) do + local coalitionName = (coalitionKey == "red") and "RED" or "BLUE" + + for aircraftName, trackingData in pairs(aircraftSpawnTracking[coalitionKey]) do + if trackingData and trackingData.group and trackingData.group:IsAlive() then + local timeSinceSpawn = currentTime - trackingData.spawnTime - -- Check if aircraft name matches cargo patterns - for _, pattern in pairs(ADVANCED_SETTINGS.cargoPatterns) do - if string.find(cargoName, pattern) then - isCargoAircraft = true - break - end - end - - if isCargoAircraft then - local cargoCoord = cargoGroup:GetCoordinate() - local cargoVelocity = cargoGroup:GetVelocityKMH() - - -- Check for flyover delivery - aircraft within range of airbase (no landing required) - -- Check which BLUE airbase it's near - for _, squadron in pairs(BLUE_SQUADRON_CONFIG) do - local airbase = AIRBASE:FindByName(squadron.airbaseName) - if airbase and airbase:GetCoalition() == coalition.side.BLUE then - local airbaseCoord = airbase:GetCoordinate() - local distance = cargoCoord:Get2DDistance(airbaseCoord) + -- Only check aircraft that have been spawned for at least the threshold time + if timeSinceSpawn >= stuckThreshold then + local currentPos = trackingData.group:GetCoordinate() + if currentPos and trackingData.spawnPos then + local distanceMoved = trackingData.spawnPos:Get2DDistance(currentPos) + + -- Check if aircraft has moved less than threshold (stuck) + if distanceMoved < movementThreshold then + log("STUCK AIRCRAFT DETECTED: " .. aircraftName .. " at " .. trackingData.airbase .. + " has only moved " .. math.floor(distanceMoved) .. "m in " .. math.floor(timeSinceSpawn/60) .. " minutes") - -- If within configured distance of airbase, consider it a flyover delivery - if distance < ADVANCED_SETTINGS.cargoLandingDistance then - log("FLYOVER DELIVERY: " .. cargoName .. " delivered supplies to " .. squadron.airbaseName .. " (distance: " .. math.floor(distance) .. "m, altitude: " .. math.floor(cargoCoord.y/0.3048) .. " ft)") - processCargoDelivery(cargoGroup, squadron, coalition.side.BLUE, "blue") - end + -- Mark airbase as having stuck aircraft + airbaseHealthStatus[coalitionKey][trackingData.airbase] = "stuck-aircraft" + + -- Remove the stuck aircraft + trackingData.group:Destroy() + activeInterceptors[coalitionKey][aircraftName] = nil + aircraftSpawnTracking[coalitionKey][aircraftName] = nil + + -- Reassign squadron to alternative airbase + reassignSquadronToAlternativeAirbase(trackingData.squadron, coalitionKey) + + MESSAGE:New(coalitionName .. " aircraft stuck at " .. trackingData.airbase .. " - destroyed and squadron reassigned", 15):ToCoalition(coalitionKey == "red" and coalition.side.RED or coalition.side.BLUE) + else + -- Aircraft has moved sufficiently, remove from tracking (no longer needs monitoring) + log("Aircraft " .. aircraftName .. " has moved " .. math.floor(distanceMoved) .. "m - removing from stuck monitoring", true) + aircraftSpawnTracking[coalitionKey][aircraftName] = nil end end end + else + -- Clean up dead aircraft from tracking + aircraftSpawnTracking[coalitionKey][aircraftName] = nil end - end) + end end end @@ -1046,7 +1511,9 @@ local function findBestSquadron(threatCoord, threatSize, coalitionSide) return selected.squadron, selected.responseRatio, selected.zoneDescription end - log("No " .. coalitionName .. " squadron available for threat at coordinates") + if ADVANCED_SETTINGS.enableDetailedLogging then + log("No " .. coalitionName .. " squadron available for threat at coordinates") + end return nil, 0, "no available squadrons" end @@ -1093,7 +1560,9 @@ local function launchInterceptor(threatGroup, coalitionSide) local squadron, zoneResponseRatio, zoneDescription = findBestSquadron(threatCoord, threatSize, coalitionSide) if not squadron then - log("No " .. coalitionName .. " squadron available") + if ADVANCED_SETTINGS.enableDetailedLogging then + log("No " .. coalitionName .. " squadron available") + end return end @@ -1110,7 +1579,9 @@ local function launchInterceptor(threatGroup, coalitionSide) end end if not squadron then - log("No " .. coalitionName .. " squadron available") + if ADVANCED_SETTINGS.enableDetailedLogging then + log("No " .. coalitionName .. " squadron available") + end return end @@ -1173,11 +1644,25 @@ local function launchInterceptor(threatGroup, coalitionSide) displayName = squadron.displayName } + -- Track spawn position for stuck aircraft detection + local spawnPos = interceptor:GetCoordinate() + if spawnPos then + aircraftSpawnTracking[coalitionKey][interceptor:GetName()] = { + spawnPos = spawnPos, + spawnTime = timer.getTime(), + squadron = squadron, + airbase = squadron.airbaseName + } + log("Tracking spawn position for " .. interceptor:GetName() .. " at " .. squadron.airbaseName, true) + end + -- Emergency cleanup (safety net) SCHEDULER:New(nil, function() if activeInterceptors[coalitionKey][interceptor:GetName()] then log("Emergency cleanup of " .. coalitionName .. " " .. interceptor:GetName() .. " (should have RTB'd)") activeInterceptors[coalitionKey][interceptor:GetName()] = nil + -- Also clean up spawn tracking + aircraftSpawnTracking[coalitionKey][interceptor:GetName()] = nil end end, {}, coalitionSettings.emergencyCleanupTime) end @@ -1503,13 +1988,55 @@ local function initializeSystem() end -- Start schedulers - -- Set up event handler for cargo landing detection + -- Set up event handler for cargo landing detection (handled via MOOSE EVENTHANDLER wrapper below) + + -- Re-register world event handler for robust detection (handles raw DCS initiators and race cases) world.addEventHandler(cargoEventHandler) + + -- MOOSE-style EVENTHANDLER wrapper for readability: logs EventData but does NOT delegate to avoid double-processing + if EVENTHANDLER then + local TADC_CARGO_LANDING_HANDLER = EVENTHANDLER:New() + function TADC_CARGO_LANDING_HANDLER:OnEventLand(EventData) + -- Convert MOOSE EventData to raw world.event format and reuse existing handler logic + if ADVANCED_SETTINGS.enableDetailedLogging then + -- Log presence and types of key fields + local function safeName(obj) + if not obj then return "" end + local ok, n = pcall(function() + if obj.GetName then return obj:GetName() end + if obj.getName then return obj:getName() end + return nil + end) + return (ok and n) and tostring(n) or "" + end + + local iniUnitPresent = EventData.IniUnit ~= nil + local iniGroupPresent = EventData.IniGroup ~= nil + local placePresent = EventData.Place ~= nil + local iniUnitName = safeName(EventData.IniUnit) + local iniGroupName = safeName(EventData.IniGroup) + local placeName = safeName(EventData.Place) + + log("MOOSE LAND EVENT: IniUnitPresent=" .. tostring(iniUnitPresent) .. ", IniUnitName=" .. tostring(iniUnitName) .. ", IniGroupPresent=" .. tostring(iniGroupPresent) .. ", IniGroupName=" .. tostring(iniGroupName) .. ", PlacePresent=" .. tostring(placePresent) .. ", PlaceName=" .. tostring(placeName), true) + end + + local rawEvent = { + id = world.event.S_EVENT_LAND, + initiator = EventData.IniUnit or EventData.IniGroup or nil, + place = EventData.Place or nil, + -- Provide the original EventData for potential fallback use + _moose_original = EventData + } + -- Log and return; the world event handler `cargoEventHandler` will handle the actual processing. + return + end + -- Register the MOOSE handler + TADC_CARGO_LANDING_HANDLER:HandleEvent(EVENTS.Land) + end SCHEDULER:New(nil, detectThreats, {}, 5, TADC_SETTINGS.checkInterval) SCHEDULER:New(nil, monitorInterceptors, {}, 10, TADC_SETTINGS.monitorInterval) SCHEDULER:New(nil, checkAirbaseStatus, {}, 30, TADC_SETTINGS.statusReportInterval) - SCHEDULER:New(nil, monitorCargoReplenishment, {}, 15, TADC_SETTINGS.cargoCheckInterval) SCHEDULER:New(nil, cleanupOldDeliveries, {}, 60, 3600) -- Cleanup old delivery records every hour -- Start periodic squadron summary broadcast @@ -1706,5 +2233,37 @@ MENU_MISSION_COMMAND:New("Show TADC System Status", menuRoot, function() MESSAGE:New(status, 20):ToAll() end) +-- 10. Check for Stuck Aircraft (manual trigger) +MENU_MISSION_COMMAND:New("Check for Stuck Aircraft", menuRoot, function() + monitorStuckAircraft() + MESSAGE:New("Stuck aircraft check completed", 10):ToAll() +end) + +-- 11. Show Airbase Health Status +MENU_MISSION_COMMAND:New("Show Airbase Health Status", menuRoot, function() + local lines = {"Airbase Health Status:"} + for _, coalitionKey in ipairs({"red", "blue"}) do + local coalitionName = (coalitionKey == "red") and "RED" or "BLUE" + table.insert(lines, coalitionName .. " Coalition:") + for airbaseName, status in pairs(airbaseHealthStatus[coalitionKey]) do + table.insert(lines, " " .. airbaseName .. ": " .. status) + end + end + MESSAGE:New(table.concat(lines, "\n"), 20):ToAll() +end) + +-- Initialize airbase health status for all configured airbases +for _, coalitionKey in ipairs({"red", "blue"}) do + local squadronConfig = getSquadronConfig(coalitionKey == "red" and coalition.side.RED or coalition.side.BLUE) + for _, squadron in pairs(squadronConfig) do + if not airbaseHealthStatus[coalitionKey][squadron.airbaseName] then + airbaseHealthStatus[coalitionKey][squadron.airbaseName] = "operational" + end + end +end + +-- Set up periodic stuck aircraft monitoring (every 2 minutes) +SCHEDULER:New(nil, monitorStuckAircraft, {}, 120, 120) + diff --git a/DCS_Kola/Operation_Polar_Shield/Simple_TADC.lua b/DCS_Kola/Operation_Polar_Shield/Simple_TADC.lua deleted file mode 100644 index 473f982..0000000 --- a/DCS_Kola/Operation_Polar_Shield/Simple_TADC.lua +++ /dev/null @@ -1,613 +0,0 @@ --- Simple TADC - Just Works --- Detect blue aircraft, launch red fighters, make them intercept - --- Configuration -local TADC_CONFIG = { - checkInterval = 30, -- Check for threats every 30 seconds - maxActiveCAP = 24, -- Max fighters airborne at once - squadronCooldown = 900, -- Squadron cooldown after launch (15 minutes) - interceptRatio = 0.8, -- Launch interceptors per threat (see chart below) -} ---[[ -INTERCEPT RATIO CHART - How many interceptors launch per threat aircraft: - -Threat Size: 1 2 4 8 12 16 (aircraft) -==================================================================== -interceptRatio 0.2: 1 1 1 2 3 4 (conservative) -interceptRatio 0.5: 1 1 2 4 6 8 (light response) -interceptRatio 0.8: 1 2 4 7 10 13 (balanced) -interceptRatio 1.0: 1 2 4 8 12 16 (1:1 parity) -interceptRatio 1.2: 2 3 5 10 15 20 (slight advantage) -interceptRatio 1.4: 2 3 6 12 17 23 (good advantage) <- DEFAULT -interceptRatio 1.6: 2 4 7 13 20 26 (strong response) -interceptRatio 1.8: 2 4 8 15 22 29 (overwhelming) -interceptRatio 2.0: 2 4 8 16 24 32 (overkill) - -TACTICAL EFFECTS: -• 0.2-0.5: Minimal response, may be overwhelmed by large formations -• 0.8-1.0: Realistic parity, balanced dogfights -• 1.2-1.4: Red advantage, good for challenging blue players -• 1.6-1.8: Strong defense, difficult penetration -• 1.9-2.0: Nearly impenetrable, may exhaust squadron pool quickly - -SQUADRON IMPACT: -• Low ratios (0.2-0.8): Squadrons available longer, sustained defense -• High ratios (1.6-2.0): Rapid squadron depletion, gaps in coverage -• Sweet spot (1.0-1.4): Balanced response with good coverage duration ---]] - --- Define squadron configurations with their designated airbases and patrol zones -local squadronConfigs = { - -- Fixed-wing fighters patrol RED BORDER zone - { - templateName = "FIGHTER_SWEEP_RED_Kilpyavr", - displayName = "Kilpyavr CAP", - airbaseName = "Kilpyavr", - aircraft = 12, -- Maximum aircraft in squadron - skill = AI.Skill.GOOD, - altitude = 15000, - speed = 300, - patrolTime = 20, - type = "FIGHTER" - }, - { - templateName = "FIGHTER_SWEEP_RED_Severomorsk-1", - displayName = "Severomorsk-1 CAP", - airbaseName = "Severomorsk-1", - aircraft = 16, -- Maximum aircraft in squadron - skill = AI.Skill.GOOD, - altitude = 20000, - speed = 350, - patrolTime = 25, - type = "FIGHTER" - }, - { - templateName = "FIGHTER_SWEEP_RED_Severomorsk-3", - displayName = "Severomorsk-3 CAP", - airbaseName = "Severomorsk-3", - aircraft = 14, -- Maximum aircraft in squadron - skill = AI.Skill.GOOD, - altitude = 25000, - speed = 400, - patrolTime = 30, - type = "FIGHTER" - }, - { - templateName = "FIGHTER_SWEEP_RED_Murmansk", - displayName = "Murmansk CAP", - airbaseName = "Murmansk International", - aircraft = 18, -- Maximum aircraft in squadron - skill = AI.Skill.GOOD, - altitude = 18000, - speed = 320, - patrolTime = 22, - type = "FIGHTER" - }, - { - templateName = "FIGHTER_SWEEP_RED_Monchegorsk", - displayName = "Monchegorsk CAP", - airbaseName = "Monchegorsk", - aircraft = 10, -- Maximum aircraft in squadron - skill = AI.Skill.GOOD, - altitude = 22000, - speed = 380, - patrolTime = 25, - type = "FIGHTER" - }, - { - templateName = "FIGHTER_SWEEP_RED_Olenya", - displayName = "Olenya CAP", - airbaseName = "Olenya", - aircraft = 20, -- Maximum aircraft in squadron - skill = AI.Skill.GOOD, - altitude = 30000, - speed = 450, - patrolTime = 35, - type = "FIGHTER" - }, - --[[] - -- Helicopter squadron patrols HELO BORDER zone - { - templateName = "HELO_SWEEP_RED_Afrikanda", - displayName = "Afrikanda Helo CAP", - airbaseName = "Afrikanda", - aircraft = 4, - skill = AI.Skill.GOOD, - altitude = 1000, - speed = 150, - patrolTime = 30, - type = "HELICOPTER" - } - --]] -} - --- Track active missions -local activeInterceptors = {} -local lastLaunchTime = {} -local assignedThreats = {} -- Track which threats already have interceptors assigned -local squadronCooldowns = {} -- Track squadron cooldowns after launch - --- Squadron aircraft tracking -local squadronAircraftCounts = {} -- Current available aircraft per squadron -local cargoReplenishmentAmount = 4 -- Aircraft added per cargo delivery - --- Initialize squadron aircraft counts -for _, squadron in pairs(squadronConfigs) do - squadronAircraftCounts[squadron.templateName] = squadron.aircraft -end - --- Simple logging -local function log(message) - env.info("[Simple TADC] " .. message) -end - --- Monitor cargo aircraft landings for squadron replenishment -local function monitorCargoReplenishment() - -- Find all red cargo aircraft - local redCargo = SET_GROUP:New():FilterCoalitions("red"):FilterCategoryAirplane():FilterStart() - - redCargo:ForEach(function(cargoGroup) - if cargoGroup and cargoGroup:IsAlive() then - -- Check if cargo aircraft contains "CARGO" or "TRANSPORT" in name - local cargoName = cargoGroup:GetName():upper() - if string.find(cargoName, "CARGO") or string.find(cargoName, "TRANSPORT") or - string.find(cargoName, "C130") or string.find(cargoName, "C-130") or - string.find(cargoName, "AN26") or string.find(cargoName, "AN-26") then - - -- Check if landed at any squadron airbase - local cargoCoord = cargoGroup:GetCoordinate() - local cargoVelocity = cargoGroup:GetVelocityKMH() - - -- Consider aircraft "landed" if velocity is very low - if cargoVelocity < 5 then - -- Check which airbase it's near - for _, squadron in pairs(squadronConfigs) do - local airbase = AIRBASE:FindByName(squadron.airbaseName) - if airbase and airbase:GetCoalition() == coalition.side.RED then - local airbaseCoord = airbase:GetCoordinate() - local distance = cargoCoord:Get2DDistance(airbaseCoord) - - -- If within 3km of airbase, consider it a delivery - if distance < 3000 then - -- Check if we haven't already processed this delivery - local deliveryKey = cargoName .. "_" .. squadron.airbaseName - if not _G.processedDeliveries then - _G.processedDeliveries = {} - end - - if not _G.processedDeliveries[deliveryKey] then - -- Process replenishment - local currentCount = squadronAircraftCounts[squadron.templateName] or 0 - local maxCount = squadron.aircraft - local newCount = math.min(currentCount + cargoReplenishmentAmount, maxCount) - local actualAdded = newCount - currentCount - - if actualAdded > 0 then - squadronAircraftCounts[squadron.templateName] = newCount - log("CARGO DELIVERY: " .. cargoName .. " delivered " .. actualAdded .. - " aircraft to " .. squadron.displayName .. - " (" .. newCount .. "/" .. maxCount .. ")") - - -- Mark delivery as processed - _G.processedDeliveries[deliveryKey] = timer.getTime() - else - log("CARGO DELIVERY: " .. squadron.displayName .. " already at max capacity") - end - end - end - end - end - end - end - end - end) -end - --- Send interceptor back to base -local function sendInterceptorHome(interceptor) - if not interceptor or not interceptor:IsAlive() then - return - end - - -- Find nearest friendly airbase - local interceptorCoord = interceptor:GetCoordinate() - local nearestAirbase = nil - local shortestDistance = math.huge - - -- Check all squadron airbases to find the nearest one that's still friendly - for _, squadron in pairs(squadronConfigs) do - local airbase = AIRBASE:FindByName(squadron.airbaseName) - if airbase and airbase:GetCoalition() == coalition.side.RED and airbase:IsAlive() then - local airbaseCoord = airbase:GetCoordinate() - local distance = interceptorCoord:Get2DDistance(airbaseCoord) - if distance < shortestDistance then - shortestDistance = distance - nearestAirbase = airbase - end - end - end - - if nearestAirbase then - local airbaseCoord = nearestAirbase:GetCoordinate() - local rtbAltitude = 3000 -- RTB at 3000 feet - local rtbCoord = airbaseCoord:SetAltitude(rtbAltitude * 0.3048) -- Convert feet to meters - - -- Clear current tasks and route home - interceptor:ClearTasks() - interceptor:RouteAirTo(rtbCoord, 250 * 0.5144, "BARO") -- RTB at 250 knots - - log("Sending " .. interceptor:GetName() .. " back to " .. nearestAirbase:GetName()) - - -- Schedule cleanup after they should have landed (give them time to get home) - local flightTime = math.ceil(shortestDistance / (250 * 0.5144)) + 300 -- Flight time + 5 min buffer - SCHEDULER:New(nil, function() - if activeInterceptors[interceptor:GetName()] then - activeInterceptors[interceptor:GetName()] = nil - log("Cleaned up " .. interceptor:GetName() .. " after RTB") - end - end, {}, flightTime) - else - log("No friendly airbase found for " .. interceptor:GetName() .. ", will clean up normally") - end -end - --- Check if airbase is still usable -local function isAirbaseUsable(airbaseName) - local airbase = AIRBASE:FindByName(airbaseName) - if not airbase then - return false, "not found" - elseif airbase:GetCoalition() ~= coalition.side.RED then - return false, "captured by " .. (airbase:GetCoalition() == coalition.side.BLUE and "Blue" or "Neutral") - elseif not airbase:IsAlive() then - return false, "destroyed" - else - return true, "operational" - end -end - --- Count active red fighters -local function countActiveFighters() - local count = 0 - for _, interceptorData in pairs(activeInterceptors) do - if interceptorData and interceptorData.group and interceptorData.group:IsAlive() then - count = count + interceptorData.group:GetSize() - end - end - return count -end - --- Find best squadron to launch -local function findBestSquadron(threatCoord) - local bestSquadron = nil - local shortestDistance = math.huge - local currentTime = timer.getTime() - - for _, squadron in pairs(squadronConfigs) do - -- Check if squadron is on cooldown - local squadronAvailable = true - if squadronCooldowns[squadron.templateName] then - local cooldownEnd = squadronCooldowns[squadron.templateName] - if currentTime < cooldownEnd then - local timeLeft = math.ceil((cooldownEnd - currentTime) / 60) - log("Squadron " .. squadron.displayName .. " on cooldown for " .. timeLeft .. " more minutes") - squadronAvailable = false - else - -- Cooldown expired, remove it - squadronCooldowns[squadron.templateName] = nil - log("Squadron " .. squadron.displayName .. " cooldown expired, available for launch") - end - end - - if squadronAvailable then - -- Check if squadron has available aircraft - local availableAircraft = squadronAircraftCounts[squadron.templateName] or 0 - if availableAircraft <= 0 then - log("Squadron " .. squadron.displayName .. " has no aircraft available (" .. availableAircraft .. "/" .. squadron.aircraft .. ")") - squadronAvailable = false - end - end - - if squadronAvailable then - -- Check if airbase is still under Red control - local airbase = AIRBASE:FindByName(squadron.airbaseName) - if not airbase then - log("Warning: Airbase " .. squadron.airbaseName .. " not found") - elseif airbase:GetCoalition() ~= coalition.side.RED then - log("Warning: Airbase " .. squadron.airbaseName .. " no longer under Red control") - elseif not airbase:IsAlive() then - log("Warning: Airbase " .. squadron.airbaseName .. " is destroyed") - else - -- Airbase is valid, check if squadron can spawn - local spawn = SPAWN:New(squadron.templateName) - if spawn then - -- Get squadron's airbase - local template = GROUP:FindByName(squadron.templateName) - if template then - local airbaseCoord = template:GetCoordinate() - if airbaseCoord then - local distance = airbaseCoord:Get2DDistance(threatCoord) - if distance < shortestDistance then - shortestDistance = distance - bestSquadron = squadron - end - end - end - end - end - end - end - - return bestSquadron -end - --- Launch interceptor -local function launchInterceptor(threatGroup) - if not threatGroup or not threatGroup:IsAlive() then - return - end - - local threatCoord = threatGroup:GetCoordinate() - local threatName = threatGroup:GetName() - local threatSize = threatGroup:GetSize() -- Get the number of aircraft in the threat group - - -- Check if threat already has interceptors assigned - if assignedThreats[threatName] then - local assignedInterceptors = assignedThreats[threatName] - local aliveCount = 0 - - -- Check if assigned interceptors are still alive - if type(assignedInterceptors) == "table" then - for _, interceptor in pairs(assignedInterceptors) do - if interceptor and interceptor:IsAlive() then - aliveCount = aliveCount + 1 - end - end - else - -- Handle legacy single interceptor assignment - if assignedInterceptors and assignedInterceptors:IsAlive() then - aliveCount = 1 - end - end - - if aliveCount > 0 then - return -- Still being intercepted - else - -- All interceptors are dead, clear the assignment - assignedThreats[threatName] = nil - end - end - - -- Calculate how many interceptors to launch (at least match threat size, up to ratio) - local interceptorsNeeded = math.max(threatSize, math.ceil(threatSize * TADC_CONFIG.interceptRatio)) - - -- Check if we have capacity - if countActiveFighters() + interceptorsNeeded > TADC_CONFIG.maxActiveCAP then - interceptorsNeeded = TADC_CONFIG.maxActiveCAP - countActiveFighters() - if interceptorsNeeded <= 0 then - log("Max fighters airborne, skipping launch") - return - end - end - - -- Find best squadron - local squadron = findBestSquadron(threatCoord) - if not squadron then - log("No squadron available") - return - end - - -- Limit interceptors to available aircraft - local availableAircraft = squadronAircraftCounts[squadron.templateName] or 0 - interceptorsNeeded = math.min(interceptorsNeeded, availableAircraft) - - if interceptorsNeeded <= 0 then - log("Squadron " .. squadron.displayName .. " has no aircraft to launch") - return - end - - -- Launch multiple interceptors to match threat - local spawn = SPAWN:New(squadron.templateName) - local interceptors = {} - - for i = 1, interceptorsNeeded do - local interceptor = spawn:Spawn() - - if interceptor then - table.insert(interceptors, interceptor) - - -- Wait a moment for initialization - SCHEDULER:New(nil, function() - if interceptor and interceptor:IsAlive() then - -- Set aggressive AI - interceptor:OptionROEOpenFire() - interceptor:OptionROTVertical() - - -- Route to threat - local currentThreatCoord = threatGroup:GetCoordinate() - if currentThreatCoord then - local interceptCoord = currentThreatCoord:SetAltitude(squadron.altitude * 0.3048) -- Convert feet to meters - interceptor:RouteAirTo(interceptCoord, squadron.speed * 0.5144, "BARO") -- Convert kts to m/s - - -- Attack the threat - local attackTask = { - id = 'AttackGroup', - params = { - groupId = threatGroup:GetID(), - weaponType = 'Auto', - attackQtyLimit = 0, - priority = 1 - } - } - interceptor:PushTask(attackTask, 1) - end - end - end, {}, 3) - - -- Track the interceptor with squadron info - activeInterceptors[interceptor:GetName()] = { - group = interceptor, - squadron = squadron.templateName, - displayName = squadron.displayName - } - - -- Emergency cleanup (safety net - should normally RTB before this) - SCHEDULER:New(nil, function() - if activeInterceptors[interceptor:GetName()] then - log("Emergency cleanup of " .. interceptor:GetName() .. " (should have RTB'd)") - activeInterceptors[interceptor:GetName()] = nil - end - end, {}, 7200) -- Emergency cleanup after 2 hours - end - end - - -- Log the launch and track assignment - if #interceptors > 0 then - -- Decrement squadron aircraft count - local currentCount = squadronAircraftCounts[squadron.templateName] or 0 - squadronAircraftCounts[squadron.templateName] = math.max(0, currentCount - #interceptors) - local remainingCount = squadronAircraftCounts[squadron.templateName] - - log("Launched " .. #interceptors .. " x " .. squadron.displayName .. " to intercept " .. - threatSize .. " x " .. threatName .. " (Remaining: " .. remainingCount .. "/" .. squadron.aircraft .. ")") - assignedThreats[threatName] = interceptors -- Track which interceptors are assigned to this threat - lastLaunchTime[threatName] = timer.getTime() - - -- Apply cooldown immediately when squadron launches - local currentTime = timer.getTime() - squadronCooldowns[squadron.templateName] = currentTime + TADC_CONFIG.squadronCooldown - local cooldownMinutes = TADC_CONFIG.squadronCooldown / 60 - log("Squadron " .. squadron.displayName .. " LAUNCHED! Applying " .. cooldownMinutes .. " minute cooldown") - end -end - --- Main threat detection loop -local function detectThreats() - log("Scanning for threats...") - - -- Clean up dead threats from tracking - local currentThreats = {} - - -- Find all blue aircraft - local blueAircraft = SET_GROUP:New():FilterCoalitions("blue"):FilterCategoryAirplane():FilterStart() - local threatCount = 0 - - blueAircraft:ForEach(function(blueGroup) - if blueGroup and blueGroup:IsAlive() then - threatCount = threatCount + 1 - currentThreats[blueGroup:GetName()] = true - log("Found threat: " .. blueGroup:GetName() .. " (" .. blueGroup:GetTypeName() .. ")") - - -- Launch interceptor for this threat - launchInterceptor(blueGroup) - end - end) - - -- Clean up assignments for threats that no longer exist and send interceptors home - for threatName, assignedInterceptors in pairs(assignedThreats) do - if not currentThreats[threatName] then - log("Threat " .. threatName .. " eliminated, sending interceptors home...") - - -- Send assigned interceptors back to base - if type(assignedInterceptors) == "table" then - for _, interceptor in pairs(assignedInterceptors) do - if interceptor and interceptor:IsAlive() then - sendInterceptorHome(interceptor) - end - end - else - -- Handle legacy single interceptor assignment - if assignedInterceptors and assignedInterceptors:IsAlive() then - sendInterceptorHome(assignedInterceptors) - end - end - - assignedThreats[threatName] = nil - end - end - - -- Count assigned threats - local assignedCount = 0 - for _ in pairs(assignedThreats) do assignedCount = assignedCount + 1 end - - log("Scan complete: " .. threatCount .. " threats, " .. countActiveFighters() .. " active fighters, " .. - assignedCount .. " assigned") -end - --- Monitor interceptor groups for cleanup when destroyed -local function monitorInterceptors() - -- Check all active interceptors for cleanup - for interceptorName, interceptorData in pairs(activeInterceptors) do - if interceptorData and interceptorData.group then - if not interceptorData.group:IsAlive() then - -- Interceptor group is destroyed - just clean up tracking - local displayName = interceptorData.displayName - log("Interceptor from " .. displayName .. " destroyed: " .. interceptorName) - - -- Remove from active tracking - activeInterceptors[interceptorName] = nil - end - end - end -end - --- Periodic airbase status check -local function checkAirbaseStatus() - log("=== AIRBASE STATUS REPORT ===") - local usableCount = 0 - local currentTime = timer.getTime() - - for _, squadron in pairs(squadronConfigs) do - local usable, status = isAirbaseUsable(squadron.airbaseName) - - -- Add aircraft count to status - local aircraftCount = squadronAircraftCounts[squadron.templateName] or 0 - local maxAircraft = squadron.aircraft - local aircraftStatus = " Aircraft: " .. aircraftCount .. "/" .. maxAircraft - - -- Check if squadron is on cooldown - local cooldownStatus = "" - if squadronCooldowns[squadron.templateName] then - local cooldownEnd = squadronCooldowns[squadron.templateName] - if currentTime < cooldownEnd then - local timeLeft = math.ceil((cooldownEnd - currentTime) / 60) - cooldownStatus = " (COOLDOWN: " .. timeLeft .. "m)" - end - end - - local fullStatus = status .. aircraftStatus .. cooldownStatus - - if usable and cooldownStatus == "" and aircraftCount > 0 then - usableCount = usableCount + 1 - log("✓ " .. squadron.airbaseName .. " - " .. fullStatus) - else - log("✗ " .. squadron.airbaseName .. " - " .. fullStatus) - end - end - - log("Status: " .. usableCount .. "/" .. #squadronConfigs .. " airbases operational") -end - --- Start the system -log("Simple TADC starting...") -log("Squadrons configured: " .. #squadronConfigs) - --- Run detection every interval -SCHEDULER:New(nil, detectThreats, {}, 5, TADC_CONFIG.checkInterval) - --- Run interceptor monitoring every 30 seconds -SCHEDULER:New(nil, monitorInterceptors, {}, 10, 30) - --- Run airbase status check every 2 minutes -SCHEDULER:New(nil, checkAirbaseStatus, {}, 30, 120) - --- Monitor cargo aircraft for squadron replenishment every 15 seconds -SCHEDULER:New(nil, monitorCargoReplenishment, {}, 15, 15) - -log("Simple TADC operational!") -log("Aircraft replenishment: " .. cargoReplenishmentAmount .. " aircraft per cargo delivery") - --- Log initial squadron aircraft counts -for _, squadron in pairs(squadronConfigs) do - local count = squadronAircraftCounts[squadron.templateName] - log("Initial: " .. squadron.displayName .. " has " .. count .. "/" .. squadron.aircraft .. " aircraft") -end \ No newline at end of file diff --git a/Moose_TADC/Moose_TADC_CargoDispatcher.lua b/Moose_TADC/Moose_TADC_CargoDispatcher.lua new file mode 100644 index 0000000..f45711a --- /dev/null +++ b/Moose_TADC/Moose_TADC_CargoDispatcher.lua @@ -0,0 +1,679 @@ +--[[ +═══════════════════════════════════════════════════════════════════════════════ + Moose_TDAC_CargoDispatcher.lua + Automated Logistics System for TADC Squadron Replenishment +═══════════════════════════════════════════════════════════════════════════════ + +DESCRIPTION: + This script monitors RED and BLUE squadrons for low aircraft counts and automatically dispatches CARGO aircraft from a list of supply airfields to replenish them. It spawns cargo aircraft and routes them to destination airbases. Delivery detection and replenishment is handled by the main TADC system. + +CONFIGURATION: + - Update static templates and airfield lists as needed for your mission. + - Set thresholds and supply airfields in CARGO_SUPPLY_CONFIG. + - Replace static templates with actual group templates from the mission editor for realism. + +REQUIRES: + - MOOSE framework (for SPAWN, AIRBASE, etc.) + - Optional: MIST for deep copy of templates + +═══════════════════════════════════════════════════════════════════════════════ +]] + +--[[ + GLOBAL STATE AND CONFIGURATION + -------------------------------------------------------------------------- + Tracks all active cargo missions and dispatcher configuration. +]] +if not cargoMissions then + cargoMissions = { red = {}, blue = {} } +end + +-- Dispatcher config (interval in seconds) +if not DISPATCHER_CONFIG then + -- default interval (seconds) and a slightly larger grace period to account for slow servers/networks + 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 + -------------------------------------------------------------------------- + Set supply airfields, cargo template names, and resupply thresholds for each coalition. +]] +local CARGO_SUPPLY_CONFIG = { + red = { + supplyAirfields = { "Sochi-Adler", "Gudauta", "Sukhumi-Babushara", "Nalchik", "Beslan", "Maykop-Khanskaya" }, -- replace with your RED supply airbase names + cargoTemplate = "CARGO_RED_AN26", -- replace with your RED cargo aircraft template name + threshold = 0.90 -- ratio below which to trigger resupply (testing) + }, + blue = { + supplyAirfields = { "Batumi", "Kobuleti", "Senaki-Kolkhi", "Kutaisi", "Soganlug" }, -- replace with your BLUE supply airbase names + cargoTemplate = "CARGO_BLUE_C130", -- replace with your BLUE cargo aircraft template name + threshold = 0.90 -- ratio below which to trigger resupply (testing) + } +} + + + +--[[ + UTILITY STUBS + -------------------------------------------------------------------------- + selectRandomAirfield: Picks a random airfield from a list. + announceToCoalition: Stub for in-game coalition messaging. + Replace with your own logic as needed. +]] +if not selectRandomAirfield then + function selectRandomAirfield(airfieldList) + if type(airfieldList) == "table" and #airfieldList > 0 then + return airfieldList[math.random(1, #airfieldList)] + end + return nil + end +end + +-- Stub for announceToCoalition (replace with your own logic if needed) +if not announceToCoalition then + function announceToCoalition(coalitionKey, message) + -- Replace with actual in-game message logic + env.info("[ANNOUNCE] [" .. tostring(coalitionKey) .. "]: " .. tostring(message)) + end +end + + +--[[ + LOGGING + -------------------------------------------------------------------------- + Advanced logging configuration and helper function for debug output. +]] +local ADVANCED_LOGGING = { + enableDetailedLogging = false, + logPrefix = "[TDAC Cargo]" +} + +-- Logging function (must be defined before any log() calls) +local function log(message, detailed) + if not detailed or ADVANCED_LOGGING.enableDetailedLogging then + env.info(ADVANCED_LOGGING.logPrefix .. " " .. message) + end +end + +log("═══════════════════════════════════════════════════════════════════════════════", true) +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 + +-- Validate dispatcher configuration: check that supply airfields exist and templates appear valid +local function validateDispatcherConfig() + local problems = {} + + -- Check supply airfields exist + for coalitionKey, cfg in pairs(CARGO_SUPPLY_CONFIG) do + if cfg and cfg.supplyAirfields and type(cfg.supplyAirfields) == 'table' then + for _, abName in ipairs(cfg.supplyAirfields) do + local ok, ab = pcall(function() return AIRBASE:FindByName(abName) end) + if not ok or not ab then + table.insert(problems, string.format("Missing airbase for %s supply list: '%s'", tostring(coalitionKey), tostring(abName))) + end + end + else + table.insert(problems, string.format("Missing or invalid supplyAirfields for coalition '%s'", tostring(coalitionKey))) + end + + -- Check cargo template presence (best-effort using SPAWN:New if available) + if cfg and cfg.cargoTemplate and type(cfg.cargoTemplate) == 'string' and cfg.cargoTemplate ~= '' then + local okSpawn, spawnObj = pcall(function() return SPAWN:New(cfg.cargoTemplate) end) + if not okSpawn or not spawnObj then + -- SPAWN:New may not be available at load time; warn but don't fail hard + table.insert(problems, string.format("Cargo template suspicious or missing: '%s' (coalition: %s)", tostring(cfg.cargoTemplate), tostring(coalitionKey))) + end + else + table.insert(problems, string.format("Missing cargoTemplate for coalition '%s'", tostring(coalitionKey))) + end + end + + if #problems == 0 then + log("TDAC Dispatcher config validation passed ✓", true) + MESSAGE:New("TDAC Dispatcher config validation passed ✓", 15):ToAll() + return true, {} + else + 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 + return false, problems + end +end + +-- Expose console helper to run the check manually +function _G.TDAC_RunConfigCheck() + local ok, problems = validateDispatcherConfig() + if ok then + return true, "OK" + else + return false, problems + end +end + + + +--[[ + getSquadronStatus(squadron, coalitionKey) + -------------------------------------------------------------------------- + Returns the current, max, and ratio of aircraft for a squadron. + If you track current aircraft in a table, update this logic accordingly. + Returns: currentCount, maxCount, ratio +]] +local function getSquadronStatus(squadron, coalitionKey) + local current = squadron.current or squadron.count or squadron.aircraft or 0 + local max = squadron.max or squadron.aircraft or 1 + if squadron.templateName and _G.squadronAircraftCounts and _G.squadronAircraftCounts[coalitionKey] then + current = _G.squadronAircraftCounts[coalitionKey][squadron.templateName] or current + end + local ratio = (max > 0) and (current / max) or 0 + return current, max, ratio +end + + + +--[[ + hasActiveCargoMission(coalitionKey, airbaseName) + -------------------------------------------------------------------------- + Returns true if there is an active (not completed/failed) cargo mission for the given airbase. +]] +local function hasActiveCargoMission(coalitionKey, airbaseName) + for _, mission in pairs(cargoMissions[coalitionKey]) do + if mission.destination == airbaseName then + -- Ignore completed or failed missions + if mission.status == "completed" or mission.status == "failed" then + -- not active + else + -- Consider mission active only if the group is alive OR we're still within the grace window + local stillActive = false + if mission.group and mission.group.IsAlive and mission.group:IsAlive() then + stillActive = true + else + local pending = mission._pendingStartTime + local grace = mission._gracePeriod or DISPATCHER_CONFIG.gracePeriod or 8 + if pending and (timer.getTime() - pending) <= grace then + stillActive = true + end + end + if stillActive then + log("Active cargo mission found for " .. airbaseName .. " (" .. coalitionKey .. ")") + return true + end + end + end + end + log("No active cargo mission for " .. airbaseName .. " (" .. coalitionKey .. ")") + return false +end + +--[[ + trackCargoMission(coalitionKey, mission) + -------------------------------------------------------------------------- + Adds a new cargo mission to the tracking table and logs it. +]] +local function trackCargoMission(coalitionKey, mission) + table.insert(cargoMissions[coalitionKey], mission) + log("Tracking new cargo mission: " .. (mission.group and mission.group:GetName() or "nil group") .. " from " .. mission.origin .. " to " .. mission.destination) +end + +--[[ + cleanupCargoMissions() + -------------------------------------------------------------------------- + Removes failed cargo missions from the tracking table if their group is no longer alive. +]] +local function cleanupCargoMissions() + for _, coalitionKey in ipairs({"red", "blue"}) do + for i = #cargoMissions[coalitionKey], 1, -1 do + local m = cargoMissions[coalitionKey][i] + if m.status == "failed" then + if not (m.group and m.group:IsAlive()) then + log("Cleaning up failed cargo mission: " .. (m.group and m.group:GetName() or "nil group") .. " status: failed") + table.remove(cargoMissions[coalitionKey], i) + end + end + end + end +end + +--[[ + dispatchCargo(squadron, coalitionKey) + -------------------------------------------------------------------------- + Spawns a cargo aircraft from a supply airfield to the destination squadron airbase. + Uses static templates for each coalition, assigns a unique group name, and sets a custom route. + Tracks the mission and schedules route assignment with a delay to ensure group is alive. +]] +local function dispatchCargo(squadron, coalitionKey) + local config = CARGO_SUPPLY_CONFIG[coalitionKey] + local origin + local attempts = 0 + local maxAttempts = 10 + repeat + origin = selectRandomAirfield(config.supplyAirfields) + attempts = attempts + 1 + -- Ensure origin is not the same as destination + if origin == squadron.airbaseName then + origin = nil + end + until origin or attempts >= maxAttempts + + -- enforce cooldown per destination to avoid immediate retries + lastDispatchAttempt[coalitionKey] = lastDispatchAttempt[coalitionKey] or {} + local last = lastDispatchAttempt[coalitionKey][squadron.airbaseName] + if last and (timer.getTime() - last) < CARGO_DISPATCH_COOLDOWN then + log("Skipping dispatch to " .. squadron.airbaseName .. " (cooldown active)") + return + end + if not origin then + log("No valid origin airfield found for cargo dispatch to " .. squadron.airbaseName .. " (avoiding same origin/destination)") + return + end + local destination = squadron.airbaseName + local cargoTemplate = config.cargoTemplate + -- Safety: check if destination has suitable parking for larger transports. If not, warn in log. + local okParking = true + -- Only check for likely large transports (C-130 / An-26 are large-ish) — keep conservative + if cargoTemplate and (string.find(cargoTemplate:upper(), "C130") or string.find(cargoTemplate:upper(), "C-17") or string.find(cargoTemplate:upper(), "C17") or string.find(cargoTemplate:upper(), "AN26") ) then + okParking = destinationHasSuitableParking(destination) + if not okParking then + log("WARNING: Destination '" .. tostring(destination) .. "' may not have suitable parking for " .. tostring(cargoTemplate) .. ". Skipping dispatch to prevent despawn.") + return + end + end + local groupName = cargoTemplate .. "_to_" .. destination .. "_" .. math.random(1000,9999) + + 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, + origin = origin, + destination = destination, + squadron = squadron, + status = "pending", + -- Anchor a pending start time now to avoid the monitor loop expiring a mission + -- before MOOSE has a chance to finalize the OnSpawnGroup callback. + _pendingStartTime = timer.getTime(), + _spawnPos = nil, + _gracePeriod = DISPATCHER_CONFIG.gracePeriod or 8 + } + + -- Helper to finalize mission after successful spawn + local function finalizeMissionAfterSpawn(spawnedGroup, spawnPos) + mission.group = spawnedGroup + mission._spawnPos = spawnPos + trackCargoMission(coalitionKey, mission) + lastDispatchAttempt[coalitionKey][squadron.airbaseName] = timer.getTime() + end + + -- MOOSE-only spawn-by-name flow + if type(cargoTemplate) ~= 'string' or cargoTemplate == '' then + log("ERROR: cargoTemplate for coalition '" .. tostring(coalitionKey) .. "' must be a valid mission template name string. Aborting dispatch.") + announceToCoalition(coalitionKey, "Resupply mission to " .. destination .. " aborted (invalid cargo template)!") + return + end + + -- Use a per-dispatch RAT object to spawn and route cargo aircraft. + -- Create a unique alias to avoid naming collisions and let RAT handle routing/landing. + local alias = cargoTemplate .. "_TO_" .. destination .. "_" .. tostring(math.random(1000,9999)) + log("DEBUG: Attempting RAT spawn for template: '" .. cargoTemplate .. "' alias: '" .. alias .. "'", true) + + local okNew, rat = pcall(function() return RAT:New(cargoTemplate, alias) end) + if not okNew or not rat then + log("ERROR: RAT:New failed for template '" .. tostring(cargoTemplate) .. "'. Error: " .. tostring(rat)) + if debug and debug.traceback then + log("TRACEBACK: " .. tostring(debug.traceback(rat)), true) + end + announceToCoalition(coalitionKey, "Resupply mission to " .. destination .. " failed (spawn init error)!") + return + end + + -- Configure RAT for a single, non-respawning dispatch + rat:SetDeparture(origin) + rat:SetDestination(destination) + rat:NoRespawn() + rat:SetSpawnLimit(1) + rat:SetSpawnDelay(1) + -- Ensure RAT takes off immediately from the runway (hot start) instead of staying parked + if rat.SetTakeoffHot then rat:SetTakeoffHot() end + -- Ensure RAT will look for parking and not despawn the group immediately on landing. + -- This makes the group taxi to parking and come to a stop so other scripts (e.g. Load2nd) + -- that detect parked/stopped cargo aircraft can register the delivery. + if rat.SetParkingScanRadius then rat:SetParkingScanRadius(80) end + if rat.SetParkingSpotSafeON then rat:SetParkingSpotSafeON() end + if rat.SetDespawnAirOFF then rat:SetDespawnAirOFF() end + -- Check on runway to ensure proper landing behavior (distance in meters) + if rat.CheckOnRunway then rat:CheckOnRunway(true, 75) end + + rat:OnSpawnGroup(function(spawnedGroup) + -- Mark the canonical start time when MOOSE reports the group exists + mission._pendingStartTime = timer.getTime() + + local spawnPos = nil + local dcsGroup = spawnedGroup:GetDCSObject() + if dcsGroup then + local units = dcsGroup:getUnits() + if units and #units > 0 then + spawnPos = units[1]:getPoint() + end + end + + log("RAT spawned cargo aircraft group: " .. tostring(spawnedGroup:GetName())) + + -- Temporary debug: log group state every 10s for 10 minutes to trace landing/parking behavior + local debugChecks = 60 -- 60 * 10s = 10 minutes + local checkInterval = 10 + local function debugLogState(iter) + if iter > debugChecks then return end + local ok, err = pcall(function() + local name = spawnedGroup:GetName() + local dcs = spawnedGroup:GetDCSObject() + if dcs then + local units = dcs:getUnits() + if units and #units > 0 then + local u = units[1] + local pos = u:getPoint() + -- Use dot accessor to test for function existence; colon-call to invoke + local vel = (u.getVelocity and u:getVelocity()) or {x=0,y=0,z=0} + local speed = math.sqrt((vel.x or 0)^2 + (vel.y or 0)^2 + (vel.z or 0)^2) + local controller = dcs:getController() + local airbaseObj = AIRBASE:FindByName(destination) + local dist = nil + if airbaseObj then + local dest = airbaseObj:GetCoordinate():GetVec2() + local dx = pos.x - dest.x + local dz = pos.z - dest.y + dist = math.sqrt(dx*dx + dz*dz) + end + 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("[TDAC DEBUG] %s state check %d: DCS group has no units", tostring(spawnedGroup:GetName()), iter), true) + end + else + 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("[TDAC DEBUG] Error during debugLogState: " .. tostring(err), true) + end + timer.scheduleFunction(function() debugLogState(iter + 1) end, {}, timer.getTime() + checkInterval) + end + timer.scheduleFunction(function() debugLogState(1) end, {}, timer.getTime() + checkInterval) + + -- RAT should handle routing/taxi/parking. Finalize mission tracking now. + finalizeMissionAfterSpawn(spawnedGroup, spawnPos) + mission.status = "enroute" + mission._pendingStartTime = timer.getTime() + announceToCoalition(coalitionKey, "CARGO aircraft departing (airborne) for " .. destination .. ". Defend it!") + end) + + local okSpawn, errSpawn = pcall(function() rat:Spawn(1) end) + if not okSpawn then + log("ERROR: rat:Spawn() failed for template '" .. tostring(cargoTemplate) .. "'. Error: " .. tostring(errSpawn)) + if debug and debug.traceback then + log("TRACEBACK: " .. tostring(debug.traceback(errSpawn)), true) + end + return + end +end + + +-- Parking diagnostics helper +-- Call from DCS console: _G.TDAC_LogAirbaseParking("Luostari Pechenga") +function _G.TDAC_LogAirbaseParking(airbaseName) + if type(airbaseName) ~= 'string' then + log("TDAC Parking helper: airbaseName must be a string", true) + return false + end + local base = AIRBASE:FindByName(airbaseName) + if not base then + log("TDAC Parking helper: AIRBASE:FindByName returned nil for '" .. tostring(airbaseName) .. "'", true) + return false + end + local function spotsFor(term) + local ok, n = pcall(function() return base:GetParkingSpotsNumber(term) end) + if not ok then return nil end + return n + end + local openBig = spotsFor(AIRBASE.TerminalType.OpenBig) + local openMed = spotsFor(AIRBASE.TerminalType.OpenMed) + local openMedOrBig = spotsFor(AIRBASE.TerminalType.OpenMedOrBig) + local runway = spotsFor(AIRBASE.TerminalType.Runway) + 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 + + +-- Pre-dispatch safety check: ensure destination can accommodate larger transport types +destinationHasSuitableParking = function(destination, preferredTermTypes) + local base = AIRBASE:FindByName(destination) + if not base then return false end + preferredTermTypes = preferredTermTypes or { AIRBASE.TerminalType.OpenBig, AIRBASE.TerminalType.OpenMedOrBig, AIRBASE.TerminalType.OpenMed } + for _, term in ipairs(preferredTermTypes) do + local ok, n = pcall(function() return base:GetParkingSpotsNumber(term) end) + if ok and n and n > 0 then + return true + end + end + return false +end + + +--[[ + monitorSquadrons() + -------------------------------------------------------------------------- + Checks all squadrons for each coalition. If a squadron is below the resupply threshold and has no active cargo mission, + triggers a supply request and dispatches a cargo aircraft. +]] +local function monitorSquadrons() + for _, coalitionKey in ipairs({"red", "blue"}) do + local config = CARGO_SUPPLY_CONFIG[coalitionKey] + local squadrons = (coalitionKey == "red") and RED_SQUADRON_CONFIG or BLUE_SQUADRON_CONFIG + for _, squadron in ipairs(squadrons) do + local current, max, ratio = getSquadronStatus(squadron, coalitionKey) + log("Squadron status: " .. squadron.displayName .. " (" .. coalitionKey .. ") " .. current .. "/" .. max .. " ratio: " .. string.format("%.2f", ratio)) + if ratio <= config.threshold and not hasActiveCargoMission(coalitionKey, squadron.airbaseName) then + log("Supply request triggered for " .. squadron.displayName .. " at " .. squadron.airbaseName) + announceToCoalition(coalitionKey, "Supply requested for " .. squadron.airbaseName .. "! Squadron: " .. squadron.displayName) + dispatchCargo(squadron, coalitionKey) + end + end + end +end + +--[[ + monitorCargoMissions() + -------------------------------------------------------------------------- + Monitors all cargo missions, updates their status, and cleans up failed ones. + Handles mission failure after a grace period. +]] +local function monitorCargoMissions() + for _, coalitionKey in ipairs({"red", "blue"}) do + for _, mission in ipairs(cargoMissions[coalitionKey]) do + if mission.group == nil then + log("[DEBUG] Mission group object is nil for mission to " .. tostring(mission.destination), true) + else + log("[DEBUG] Mission group: " .. tostring(mission.group:GetName()) .. ", IsAlive(): " .. tostring(mission.group:IsAlive()), true) + local dcsGroup = mission.group:GetDCSObject() + if dcsGroup then + local units = dcsGroup:getUnits() + if units and #units > 0 then + local pos = units[1]:getPoint() + log(string.format("[DEBUG] Group position: x=%.1f y=%.1f z=%.1f", pos.x, pos.y, pos.z), true) + else + log("[DEBUG] No units found in DCS group for mission to " .. tostring(mission.destination), true) + end + else + log("[DEBUG] DCS group object is nil for mission to " .. tostring(mission.destination), true) + end + end + + local graceElapsed = mission._pendingStartTime and (timer.getTime() - mission._pendingStartTime > (mission._gracePeriod or 8)) + + -- Only allow mission to be failed after grace period, and only if group is truly dead. + -- Some DCS/MOOSE group objects may momentarily report IsAlive() == false while units still exist, so + -- also check DCS object/unit presence before declaring failure. + if (mission.status == "pending" or mission.status == "enroute") and graceElapsed then + local isAlive = mission.group and mission.group:IsAlive() + local dcsGroup = mission.group and mission.group:GetDCSObject() + local unitsPresent = false + if dcsGroup then + local units = dcsGroup:getUnits() + unitsPresent = units and (#units > 0) + end + if not isAlive and not unitsPresent then + mission.status = "failed" + log("Cargo mission failed (after grace period): " .. (mission.group and mission.group:GetName() or "nil group") .. " to " .. mission.destination) + announceToCoalition(coalitionKey, "Resupply mission to " .. mission.destination .. " failed!") + else + log("DEBUG: Mission appears to still have DCS units despite IsAlive=false; skipping failure for " .. tostring(mission.destination), true) + end + end + end + end + cleanupCargoMissions() +end + +--[[ + MAIN DISPATCHER LOOP + -------------------------------------------------------------------------- + Runs the main dispatcher logic on a timer interval. +]] +local function cargoDispatcherMain() + log("═══════════════════════════════════════════════════════════════════════════════", true) + log("Cargo Dispatcher main loop running.", true) + monitorSquadrons() + monitorCargoMissions() + -- Schedule the next run inside a protected call to avoid unhandled errors + timer.scheduleFunction(function() + local ok, err = pcall(cargoDispatcherMain) + if not ok then + log("FATAL: cargoDispatcherMain crashed on scheduled run: " .. tostring(err)) + -- do not reschedule to avoid crash loops + end + end, {}, timer.getTime() + DISPATCHER_CONFIG.interval) +end + +-- Start the dispatcher +local ok, err = pcall(cargoDispatcherMain) +if not ok then + log("FATAL: cargoDispatcherMain crashed on startup: " .. tostring(err)) +end + +log("═══════════════════════════════════════════════════════════════════════════════", true) +-- End Moose_TDAC_CargoDispatcher.lua + + +-- Diagnostic helper: call from DCS console to test spawn-by-name and routing. +-- 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("[TDAC TEST] Starting test spawn for template: " .. tostring(templateName), true) + local ok, err + if type(templateName) ~= 'string' then + 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("[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("[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("[TDAC TEST] Spawned pos x=%.1f y=%.1f z=%.1f", pos.x, pos.y, pos.z), true) + end + end + if destinationAirbase then + local okAssign, errAssign = pcall(function() + local base = AIRBASE:FindByName(destinationAirbase) + if base and spawnedGroup and spawnedGroup.RouteToAirbase then + spawnedGroup:RouteToAirbase(base, AI_Task_Land.Runway) + log("[TDAC TEST] RouteToAirbase assigned to " .. tostring(destinationAirbase), true) + else + log("[TDAC TEST] RouteToAirbase not available or base not found", true) + end + end) + if not okAssign then + 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 + end) + + ok, err = pcall(function() spawnByName:Spawn() end) + if not ok then + 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("[TDAC TEST] spawnByName:Spawn() returned successfully", true) + return true +end + + +log("═══════════════════════════════════════════════════════════════════════════════", true) +-- End Moose_TDAC_CargoDispatcher.lua + diff --git a/Moose_TADC/Moose_TADC_Load2nd.lua b/Moose_TADC/Moose_TADC_Load2nd.lua index e1d4e49..15ae8e0 100644 --- a/Moose_TADC/Moose_TADC_Load2nd.lua +++ b/Moose_TADC/Moose_TADC_Load2nd.lua @@ -215,6 +215,9 @@ local ADVANCED_SETTINGS = { -- Distance from airbase to consider cargo "delivered" via flyover (meters) -- Aircraft flying within this range will count as supply delivery (no landing required) cargoLandingDistance = 3000, + -- Distance from airbase to consider a landing as delivered (wheel touchdown) + -- Use a slightly larger radius than 1000m to account for runway offsets from airbase center + cargoLandingEventRadius = 2000, -- Velocity below which aircraft is considered "landed" (km/h) cargoLandedVelocity = 5, @@ -224,8 +227,10 @@ local ADVANCED_SETTINGS = { rtbSpeed = 430, -- Return to base speed (knots) -- Logging settings - enableDetailedLogging = true, -- Set to false to reduce log spam + enableDetailedLogging = false, -- Set to false to reduce log spam logPrefix = "[Universal TADC]", -- Prefix for all log messages + -- Proxy/raw-fallback verbose logging (set true to debug proxy behavior) + verboseProxyLogging = false, } --[[ @@ -259,6 +264,18 @@ squadronAircraftCounts = { blue = {} } +-- Aircraft spawn tracking for stuck detection +local aircraftSpawnTracking = { + red = {}, -- groupName -> {spawnPos, spawnTime, squadron, airbase} + blue = {} +} + +-- Airbase health status +local airbaseHealthStatus = { + red = {}, -- airbaseName -> "operational"|"stuck-aircraft"|"unusable" + blue = {} +} + -- Logging function local function log(message, detailed) if not detailed or ADVANCED_SETTINGS.enableDetailedLogging then @@ -642,44 +659,51 @@ end -- Process cargo delivery for a squadron local function processCargoDelivery(cargoGroup, squadron, coalitionSide, coalitionKey) - -- Initialize processed deliveries table + -- Simple delivery processor: dedupe by group ID and credit supplies directly. if not _G.processedDeliveries then _G.processedDeliveries = {} end - - -- Create unique delivery key including timestamp to prevent race conditions - -- Note: Key doesn't include airbase to prevent double-counting if aircraft moves between airbases - local deliveryKey = cargoGroup:GetName() .. "_" .. coalitionKey:upper() .. "_" .. cargoGroup:GetID() - - if not _G.processedDeliveries[deliveryKey] then - -- Mark delivery as processed immediately to prevent race conditions - _G.processedDeliveries[deliveryKey] = timer.getTime() - -- Process replenishment - local currentCount = squadronAircraftCounts[coalitionKey][squadron.templateName] or 0 - local maxCount = squadron.aircraft - local newCount = math.min(currentCount + TADC_SETTINGS[coalitionKey].cargoReplenishmentAmount, maxCount) - local actualAdded = newCount - currentCount - - if actualAdded > 0 then - squadronAircraftCounts[coalitionKey][squadron.templateName] = newCount - local msg = coalitionKey:upper() .. " CARGO DELIVERY: " .. cargoGroup:GetName() .. " delivered " .. actualAdded .. - " aircraft to " .. squadron.displayName .. - " (" .. newCount .. "/" .. maxCount .. ")" - log(msg) - MESSAGE:New(msg, 20):ToCoalition(coalitionSide) - USERSOUND:New("Cargo_Delivered.ogg"):ToCoalition(coalitionSide) - -- Notify dispatcher (if available) so it can mark the matching mission completed immediately - if type(_G.TDAC_CargoDelivered) == 'function' then - pcall(function() - _G.TDAC_CargoDelivered(cargoGroup:GetName(), squadron.airbaseName, coalitionKey) - end) - end - else - local msg = coalitionKey:upper() .. " CARGO DELIVERY: " .. squadron.displayName .. " already at max capacity" - log(msg, true) - MESSAGE:New(msg, 15):ToCoalition(coalitionSide) - USERSOUND:New("Cargo_Delivered.ogg"):ToCoalition(coalitionSide) - end + + -- Use group ID + squadron airbase as dedupe key to avoid double crediting when the same group + -- triggers multiple events or moves between airbases rapidly. + local okId, grpId = pcall(function() return cargoGroup and cargoGroup.GetID and cargoGroup:GetID() end) + local groupIdStr = (okId and grpId) and tostring(grpId) or "" + local deliveryKey = groupIdStr .. "_" .. tostring(squadron.airbaseName) + + -- Diagnostic log: show group name, id, and delivery key when processor invoked + local okName, grpName = pcall(function() return cargoGroup and cargoGroup.GetName and cargoGroup:GetName() end) + local groupNameStr = (okName and grpName) and tostring(grpName) or "" + log("PROCESS CARGO: invoked for group=" .. groupNameStr .. " id=" .. groupIdStr .. " targetAirbase=" .. tostring(squadron.airbaseName) .. " deliveryKey=" .. deliveryKey, true) + + if _G.processedDeliveries[deliveryKey] then + -- Already processed recently, ignore + log("PROCESS CARGO: deliveryKey " .. deliveryKey .. " already processed at " .. tostring(_G.processedDeliveries[deliveryKey]), true) + return + end + + -- Mark processed immediately + _G.processedDeliveries[deliveryKey] = timer.getTime() + + -- Credit the squadron + local currentCount = squadronAircraftCounts[coalitionKey][squadron.templateName] or 0 + local maxCount = squadron.aircraft or 0 + local addAmount = TADC_SETTINGS[coalitionKey].cargoReplenishmentAmount or 0 + local newCount = math.min(currentCount + addAmount, maxCount) + local actualAdded = newCount - currentCount + + if actualAdded > 0 then + squadronAircraftCounts[coalitionKey][squadron.templateName] = newCount + local msg = coalitionKey:upper() .. " CARGO DELIVERY: " .. cargoGroup:GetName() .. " delivered " .. actualAdded .. + " aircraft to " .. (squadron.displayName or squadron.templateName) .. + " (" .. newCount .. "/" .. maxCount .. ")" + log(msg) + MESSAGE:New(msg, 20):ToCoalition(coalitionSide) + USERSOUND:New("Cargo_Delivered.ogg"):ToCoalition(coalitionSide) + else + local msg = coalitionKey:upper() .. " CARGO DELIVERY: " .. (squadron.displayName or squadron.templateName) .. " already at max capacity" + log(msg, true) + MESSAGE:New(msg, 10):ToCoalition(coalitionSide) + USERSOUND:New("Cargo_Delivered.ogg"):ToCoalition(coalitionSide) end end @@ -688,141 +712,582 @@ local cargoEventHandler = {} function cargoEventHandler:onEvent(event) if event.id == world.event.S_EVENT_LAND then local unit = event.initiator + + -- Safe unit name retrieval + local unitName = "unknown" + if unit and type(unit) == "table" then + local ok, name = pcall(function() return unit:GetName() end) + if ok and name then + unitName = name + end + end + + log("LANDING EVENT: Received S_EVENT_LAND for unit: " .. unitName, true) + if unit and type(unit) == "table" and unit.IsAlive and unit:IsAlive() then local group = unit:GetGroup() if group and type(group) == "table" and group.IsAlive and group:IsAlive() then - local cargoName = group:GetName():upper() + -- Safe group name retrieval + local cargoName = "unknown" + local ok, name = pcall(function() return group:GetName():upper() end) + if ok and name then + cargoName = name + end + + log("LANDING EVENT: Processing group: " .. cargoName, true) + local isCargoAircraft = false -- Check if aircraft name matches cargo patterns for _, pattern in pairs(ADVANCED_SETTINGS.cargoPatterns) do if string.find(cargoName, pattern) then isCargoAircraft = true + log("LANDING EVENT: Matched cargo pattern '" .. pattern .. "' for " .. cargoName, true) break end end if isCargoAircraft then - local cargoCoord = unit:GetCoordinate() - local coalitionSide = unit:GetCoalition() - local coalitionKey = (coalitionSide == coalition.side.RED) and "red" or "blue" + -- Safe coordinate and coalition retrieval + local cargoCoord = nil + local ok, coord = pcall(function() return unit:GetCoordinate() end) + if ok and coord then + cargoCoord = coord + end - -- Check which airbase it's near - local squadronConfig = getSquadronConfig(coalitionSide) - for _, squadron in pairs(squadronConfig) do - local airbase = AIRBASE:FindByName(squadron.airbaseName) - if airbase and airbase:GetCoalition() == coalitionSide then - local airbaseCoord = airbase:GetCoordinate() - local distance = cargoCoord:Get2DDistance(airbaseCoord) - - -- If within configured distance of airbase, consider it a landing delivery - if distance < ADVANCED_SETTINGS.cargoLandingDistance then - log("LANDING DELIVERY: " .. cargoName .. " landed and delivered at " .. squadron.airbaseName .. " (distance: " .. math.floor(distance) .. "m)") - processCargoDelivery(group, squadron, coalitionSide, coalitionKey) + log("LANDING EVENT: Cargo aircraft " .. cargoName .. " at coord: " .. tostring(cargoCoord), true) + + if cargoCoord then + local closestAirbase = nil + local closestDistance = math.huge + local closestSquadron = nil + + -- Search RED squadron configs + for _, squadron in pairs(RED_SQUADRON_CONFIG) do + local airbase = AIRBASE:FindByName(squadron.airbaseName) + if airbase then + local distance = cargoCoord:Get2DDistance(airbase:GetCoordinate()) + log("LANDING EVENT: Checking distance to " .. squadron.airbaseName .. ": " .. math.floor(distance) .. "m", true) + if distance < closestDistance then + closestDistance = distance + closestAirbase = airbase + closestSquadron = squadron + end end end + + -- Search BLUE squadron configs + for _, squadron in pairs(BLUE_SQUADRON_CONFIG) do + local airbase = AIRBASE:FindByName(squadron.airbaseName) + if airbase then + local distance = cargoCoord:Get2DDistance(airbase:GetCoordinate()) + log("LANDING EVENT: Checking distance to " .. squadron.airbaseName .. ": " .. math.floor(distance) .. "m", true) + if distance < closestDistance then + closestDistance = distance + closestAirbase = airbase + closestSquadron = squadron + end + end + end + + if closestAirbase then + local abCoalition = closestAirbase:GetCoalition() + local coalitionKey = (abCoalition == coalition.side.RED) and "red" or "blue" + if closestDistance < ADVANCED_SETTINGS.cargoLandingEventRadius then + log("LANDING DELIVERY: " .. cargoName .. " landed and delivered at " .. closestSquadron.airbaseName .. " (distance: " .. math.floor(closestDistance) .. "m)") + processCargoDelivery(group, closestSquadron, abCoalition, coalitionKey) + else + log("LANDING DETECTED: " .. cargoName .. " landed but no valid airbase found within range (closest: " .. (closestDistance and math.floor(closestDistance) .. "m" or "none") .. ")") + end + else + log("LANDING DETECTED: " .. cargoName .. " landed but no configured squadron airbases available to check", true) + end + else + log("LANDING EVENT: Could not get coordinates for cargo aircraft " .. cargoName, true) end + else + log("LANDING EVENT: " .. cargoName .. " is not a cargo aircraft", true) + end + else + log("LANDING EVENT: Group is nil or not alive", true) + end + else + -- Fallback: unit was nil or not alive (race/despawn). Try to retrieve group and name safely + log("LANDING EVENT: Unit is nil or not alive - attempting fallback group retrieval", true) + + local fallbackGroup = nil + local okGetGroup, grp = pcall(function() + if unit and type(unit) == "table" and unit.GetGroup then + return unit:GetGroup() + end + -- Try event.initiator (may be raw DCS object) + if event and event.initiator and type(event.initiator) == 'table' and event.initiator.GetGroup then + return event.initiator:GetGroup() + end + return nil + end) + + if okGetGroup and grp then + fallbackGroup = grp + end + + if fallbackGroup then + -- Try to get group name even if group:IsAlive() is false + local okName, gname = pcall(function() return fallbackGroup:GetName():upper() end) + local cargoName = "unknown" + if okName and gname then + cargoName = gname + end + + log("LANDING EVENT (fallback): Processing group: " .. cargoName, true) + + local isCargoAircraft = false + for _, pattern in pairs(ADVANCED_SETTINGS.cargoPatterns) do + if string.find(cargoName, pattern) then + isCargoAircraft = true + log("LANDING EVENT (fallback): Matched cargo pattern '" .. pattern .. "' for " .. cargoName, true) + break + end + end + + if isCargoAircraft then + -- Try to get coordinate and coalition via multiple safe methods + local cargoCoord = nil + local okCoord, coord = pcall(function() + if unit and unit.GetCoordinate then return unit:GetCoordinate() end + if fallbackGroup and fallbackGroup.GetCoordinate then return fallbackGroup:GetCoordinate() end + return nil + end) + if okCoord and coord then cargoCoord = coord end + + log("LANDING EVENT (fallback): Cargo aircraft " .. cargoName .. " at coord: " .. tostring(cargoCoord), true) + + if cargoCoord then + local closestAirbase = nil + local closestDistance = math.huge + local closestSquadron = nil + + for _, squadron in pairs(RED_SQUADRON_CONFIG) do + local airbase = AIRBASE:FindByName(squadron.airbaseName) + if airbase then + local distance = cargoCoord:Get2DDistance(airbase:GetCoordinate()) + log("LANDING EVENT (fallback): Checking distance to " .. squadron.airbaseName .. ": " .. math.floor(distance) .. "m", true) + if distance < closestDistance then + closestDistance = distance + closestAirbase = airbase + closestSquadron = squadron + end + end + end + + for _, squadron in pairs(BLUE_SQUADRON_CONFIG) do + local airbase = AIRBASE:FindByName(squadron.airbaseName) + if airbase then + local distance = cargoCoord:Get2DDistance(airbase:GetCoordinate()) + log("LANDING EVENT (fallback): Checking distance to " .. squadron.airbaseName .. ": " .. math.floor(distance) .. "m", true) + if distance < closestDistance then + closestDistance = distance + closestAirbase = airbase + closestSquadron = squadron + end + end + end + + if closestAirbase then + local abCoalition = closestAirbase:GetCoalition() + local coalitionKey = (abCoalition == coalition.side.RED) and "red" or "blue" + if closestDistance < ADVANCED_SETTINGS.cargoLandingEventRadius then + log("LANDING DELIVERY (fallback): " .. cargoName .. " landed and delivered at " .. closestSquadron.airbaseName .. " (distance: " .. math.floor(closestDistance) .. "m)") + processCargoDelivery(fallbackGroup, closestSquadron, abCoalition, coalitionKey) + else + log("LANDING DETECTED (fallback): " .. cargoName .. " landed but no valid airbase found within range (closest: " .. (closestDistance and math.floor(closestDistance) .. "m" or "none") .. ")") + end + else + log("LANDING EVENT (fallback): No configured squadron airbases available to check", true) + end + else + log("LANDING EVENT (fallback): Could not get coordinates for cargo aircraft " .. cargoName, true) + end + else + log("LANDING EVENT (fallback): " .. cargoName .. " is not a cargo aircraft", true) + end + else + log("LANDING EVENT: Fallback group retrieval failed", true) + -- Additional fallback: try raw DCS object methods (lowercase) and resolve by name + local okRaw, rawGroup = pcall(function() + if event and event.initiator and type(event.initiator) == 'table' and event.initiator.getGroup then + return event.initiator:getGroup() + end + return nil + end) + + if okRaw and rawGroup then + -- Try to get raw group name + local okRawName, rawName = pcall(function() + if rawGroup.getName then return rawGroup:getName() end + return nil + end) + + if okRawName and rawName then + local rawNameUp = tostring(rawName):upper() + log("LANDING EVENT: Resolved raw DCS group name: " .. rawNameUp, true) + + -- Try to find MOOSE GROUP by that name + local okFind, mooseGroup = pcall(function() return GROUP:FindByName(rawNameUp) end) + if okFind and mooseGroup and type(mooseGroup) == 'table' then + log("LANDING EVENT: Found MOOSE GROUP for raw name: " .. rawNameUp, true) + -- Reuse the fallback logic using mooseGroup + local cargoName = rawNameUp + local isCargoAircraft = false + for _, pattern in pairs(ADVANCED_SETTINGS.cargoPatterns) do + if string.find(cargoName, pattern) then + isCargoAircraft = true + break + end + end + if isCargoAircraft then + -- Try to get coordinate from raw group if possible + local cargoCoord = nil + local okPoint, point = pcall(function() + if rawGroup.getController then + -- Raw DCS unit list -> first unit point + local dcs = rawGroup + if dcs.getUnits then + local units = dcs:getUnits() + if units and #units > 0 and units[1].getPoint then + return units[1]:getPoint() + end + end + end + return nil + end) + if okPoint and point then cargoCoord = point end + + -- If we have a coordinate, find nearest squadron and process + if cargoCoord then + local closestAirbase = nil + local closestDistance = math.huge + local closestSquadron = nil + + for _, squadron in pairs(RED_SQUADRON_CONFIG) do + local airbase = AIRBASE:FindByName(squadron.airbaseName) + if airbase then + local distance = math.huge + if type(cargoCoord) == 'table' and cargoCoord.Get2DDistance then + local okDist, d = pcall(function() return cargoCoord:Get2DDistance(airbase:GetCoordinate()) end) + if okDist and d then distance = d end + else + local okVec, aVec = pcall(function() return airbase:GetCoordinate():GetVec2() end) + if okVec and aVec and type(aVec) == 'table' then + local cx, cy + if cargoCoord.x and cargoCoord.z then + cx, cy = cargoCoord.x, cargoCoord.z + elseif cargoCoord.x and cargoCoord.y then + cx, cy = cargoCoord.x, cargoCoord.y + elseif cargoCoord[1] and cargoCoord[3] then + cx, cy = cargoCoord[1], cargoCoord[3] + elseif cargoCoord[1] and cargoCoord[2] then + cx, cy = cargoCoord[1], cargoCoord[2] + end + if cx and cy then + local dx = cx - aVec.x + local dy = cy - aVec.y + distance = math.sqrt(dx*dx + dy*dy) + end + end + end + + if distance < closestDistance then + closestDistance = distance + closestAirbase = airbase + closestSquadron = squadron + end + end + end + + for _, squadron in pairs(BLUE_SQUADRON_CONFIG) do + local airbase = AIRBASE:FindByName(squadron.airbaseName) + if airbase then + local distance = math.huge + if type(cargoCoord) == 'table' and cargoCoord.Get2DDistance then + local okDist, d = pcall(function() return cargoCoord:Get2DDistance(airbase:GetCoordinate()) end) + if okDist and d then distance = d end + else + local okVec, aVec = pcall(function() return airbase:GetCoordinate():GetVec2() end) + if okVec and aVec and type(aVec) == 'table' then + local cx, cy + if cargoCoord.x and cargoCoord.z then + cx, cy = cargoCoord.x, cargoCoord.z + elseif cargoCoord.x and cargoCoord.y then + cx, cy = cargoCoord.x, cargoCoord.y + elseif cargoCoord[1] and cargoCoord[3] then + cx, cy = cargoCoord[1], cargoCoord[3] + elseif cargoCoord[1] and cargoCoord[2] then + cx, cy = cargoCoord[1], cargoCoord[2] + end + if cx and cy then + local dx = cx - aVec.x + local dy = cy - aVec.y + distance = math.sqrt(dx*dx + dy*dy) + end + end + end + + if distance < closestDistance then + closestDistance = distance + closestAirbase = airbase + closestSquadron = squadron + end + end + end + + if closestAirbase and closestDistance < ADVANCED_SETTINGS.cargoLandingEventRadius then + local abCoalition = closestAirbase:GetCoalition() + local coalitionKey = (abCoalition == coalition.side.RED) and "red" or "blue" + log("LANDING DELIVERY (raw-fallback): " .. rawNameUp .. " landed and delivered at " .. closestSquadron.airbaseName .. " (distance: " .. math.floor(closestDistance) .. "m)") + processCargoDelivery(mooseGroup, closestSquadron, abCoalition, coalitionKey) + else + log("LANDING DETECTED (raw-fallback): " .. rawNameUp .. " landed but no valid airbase found within range (closest: " .. (closestDistance and math.floor(closestDistance) .. "m" or "none") .. ")") + end + else + log("LANDING EVENT: Could not extract coordinate from raw DCS group: " .. tostring(rawName), true) + end + else + log("LANDING EVENT: Raw group " .. tostring(rawName) .. " is not a cargo aircraft", true) + end + else + log("LANDING EVENT: Could not find MOOSE GROUP for raw name: " .. tostring(rawName) .. " - attempting raw-group proxy processing", true) + + -- Even if we can't find a MOOSE GROUP, try to extract coordinates from the raw DCS group + local okPoint2, point2 = pcall(function() + if rawGroup and rawGroup.getUnits then + local units = rawGroup:getUnits() + if units and #units > 0 and units[1].getPoint then + return units[1]:getPoint() + end + end + return nil + end) + + if okPoint2 and point2 then + local cargoCoord = point2 + -- Find nearest configured squadron airbase (RED + BLUE) + local closestAirbase = nil + local closestDistance = math.huge + local closestSquadron = nil + + for _, squadron in pairs(RED_SQUADRON_CONFIG) do + local airbase = AIRBASE:FindByName(squadron.airbaseName) + if airbase then + local distance = math.huge + local okVec, aVec = pcall(function() return airbase:GetCoordinate():GetVec2() end) + if okVec and aVec and type(aVec) == 'table' then + local cx, cy + if cargoCoord.x and cargoCoord.z then + cx, cy = cargoCoord.x, cargoCoord.z + elseif cargoCoord.x and cargoCoord.y then + cx, cy = cargoCoord.x, cargoCoord.y + elseif cargoCoord[1] and cargoCoord[3] then + cx, cy = cargoCoord[1], cargoCoord[3] + elseif cargoCoord[1] and cargoCoord[2] then + cx, cy = cargoCoord[1], cargoCoord[2] + end + if cx and cy then + local dx = cx - aVec.x + local dy = cy - aVec.y + distance = math.sqrt(dx*dx + dy*dy) + end + end + + if distance < closestDistance then + closestDistance = distance + closestAirbase = airbase + closestSquadron = squadron + end + end + end + + for _, squadron in pairs(BLUE_SQUADRON_CONFIG) do + local airbase = AIRBASE:FindByName(squadron.airbaseName) + if airbase then + local distance = math.huge + local okVec, aVec = pcall(function() return airbase:GetCoordinate():GetVec2() end) + if okVec and aVec and type(aVec) == 'table' then + local cx, cy + if cargoCoord.x and cargoCoord.z then + cx, cy = cargoCoord.x, cargoCoord.z + elseif cargoCoord.x and cargoCoord.y then + cx, cy = cargoCoord.x, cargoCoord.y + elseif cargoCoord[1] and cargoCoord[3] then + cx, cy = cargoCoord[1], cargoCoord[3] + elseif cargoCoord[1] and cargoCoord[2] then + cx, cy = cargoCoord[1], cargoCoord[2] + end + if cx and cy then + local dx = cx - aVec.x + local dy = cy - aVec.y + distance = math.sqrt(dx*dx + dy*dy) + end + end + + if distance < closestDistance then + closestDistance = distance + closestAirbase = airbase + closestSquadron = squadron + end + end + end + + if closestAirbase and closestDistance < ADVANCED_SETTINGS.cargoLandingEventRadius then + local abCoalition = closestAirbase:GetCoalition() + local coalitionKey = (abCoalition == coalition.side.RED) and "red" or "blue" + + -- Ensure the raw group name actually looks like a cargo aircraft before crediting + local rawNameUpCheck = tostring(rawName):upper() + local isCargoProxy = false + for _, pattern in pairs(ADVANCED_SETTINGS.cargoPatterns) do + if string.find(rawNameUpCheck, pattern) then + isCargoProxy = true + break + end + end + + if not isCargoProxy then + if ADVANCED_SETTINGS.verboseProxyLogging then + log("LANDING IGNORED (raw-proxy): " .. tostring(rawName) .. " is not a cargo-type name, skipping delivery proxy", true) + else + log("LANDING IGNORED (raw-proxy): " .. tostring(rawName) .. " is not a cargo-type name, skipping delivery proxy", true) + end + else + -- Build a small proxy object that exposes GetName and GetID so processCargoDelivery can use it + local cargoProxy = {} + function cargoProxy:GetName() + local okn, nm = pcall(function() + if rawGroup and rawGroup.getName then return rawGroup:getName() end + return tostring(rawName) + end) + return (okn and nm) and tostring(nm) or tostring(rawName) + end + function cargoProxy:GetID() + local okid, id = pcall(function() + if rawGroup and rawGroup.getID then return rawGroup:getID() end + if rawGroup and rawGroup.getID == nil and rawGroup.getController then + -- Try to hash name as fallback unique-ish id + return tostring(rawName) .. "_proxy" + end + return nil + end) + return (okid and id) and id or tostring(rawName) .. "_proxy" + end + + if ADVANCED_SETTINGS.verboseProxyLogging then + log("LANDING DELIVERY (raw-proxy): " .. tostring(rawName) .. " landed and delivered at " .. closestSquadron.airbaseName .. " (distance: " .. math.floor(closestDistance) .. "m) - using proxy object", true) + end + processCargoDelivery(cargoProxy, closestSquadron, abCoalition, coalitionKey) + end + else + if ADVANCED_SETTINGS.verboseProxyLogging then + log("LANDING DETECTED (raw-proxy): " .. tostring(rawName) .. " landed but no valid airbase found within range (closest: " .. (closestDistance and math.floor(closestDistance) .. "m" or "none") .. ")", true) + end + end + else + log("LANDING EVENT: Could not extract coordinate from raw DCS group for proxy processing: " .. tostring(rawName), true) + end + end + else + log("LANDING EVENT: rawGroup:getName() failed", true) + end + else + log("LANDING EVENT: raw DCS group retrieval failed", true) end end end end end --- Monitor cargo aircraft flyovers for squadron replenishment -local function monitorCargoReplenishment() - -- Process RED cargo aircraft - if TADC_SETTINGS.enableRed then - -- Use cached set for performance, create if needed - if not cachedSets.redCargo then - cachedSets.redCargo = SET_GROUP:New():FilterCoalitions("red"):FilterCategoryAirplane():FilterStart() - end - local redCargo = cachedSets.redCargo - - redCargo:ForEach(function(cargoGroup) - if cargoGroup and cargoGroup:IsAlive() then - local cargoName = cargoGroup:GetName():upper() - local isCargoAircraft = false - - -- Check if aircraft name matches cargo patterns - for _, pattern in pairs(ADVANCED_SETTINGS.cargoPatterns) do - if string.find(cargoName, pattern) then - isCargoAircraft = true - break - end - end - - if isCargoAircraft then - local cargoCoord = cargoGroup:GetCoordinate() - local cargoVelocity = cargoGroup:GetVelocityKMH() - -- DEBUG: log candidate details with timestamp for diagnosis - if ADVANCED_SETTINGS.enableDetailedLogging then - log(string.format("[LOAD2ND DEBUG] Evaluating cargo %s at time=%d vel=%.2f km/h coord=(%.1f,%.1f)", - cargoGroup:GetName(), timer.getTime(), cargoVelocity, cargoCoord:GetVec2().x, cargoCoord:GetVec2().y)) - end - - -- Check for flyover delivery - aircraft within range of airbase (no landing required) - -- Check which RED airbase it's near - for _, squadron in pairs(RED_SQUADRON_CONFIG) do - local airbase = AIRBASE:FindByName(squadron.airbaseName) - if airbase and airbase:GetCoalition() == coalition.side.RED then - local airbaseCoord = airbase:GetCoordinate() - local distance = cargoCoord:Get2DDistance(airbaseCoord) - - -- If within configured distance of airbase, consider it a flyover delivery - if distance < ADVANCED_SETTINGS.cargoLandingDistance then - log("FLYOVER DELIVERY: " .. cargoName .. " delivered supplies to " .. squadron.airbaseName .. " (distance: " .. math.floor(distance) .. "m, altitude: " .. math.floor(cargoCoord.y/0.3048) .. " ft)") - processCargoDelivery(cargoGroup, squadron, coalition.side.RED, "red") - end - end - end - end +-- Reassign squadron to an alternative airbase when primary airbase has issues +local function reassignSquadronToAlternativeAirbase(squadron, coalitionKey) + local coalitionSide = (coalitionKey == "red") and coalition.side.RED or coalition.side.BLUE + local coalitionName = (coalitionKey == "red") and "RED" or "BLUE" + local squadronConfig = getSquadronConfig(coalitionSide) + + -- Find alternative airbases (other squadrons' airbases that are operational) + local alternativeAirbases = {} + for _, altSquadron in pairs(squadronConfig) do + if altSquadron.airbaseName ~= squadron.airbaseName then + local usable, status = isAirbaseUsable(altSquadron.airbaseName, coalitionSide) + local healthStatus = airbaseHealthStatus[coalitionKey][altSquadron.airbaseName] or "operational" + + if usable and healthStatus == "operational" then + table.insert(alternativeAirbases, altSquadron.airbaseName) end - end) + end end - -- Process BLUE cargo aircraft - if TADC_SETTINGS.enableBlue then - -- Use cached set for performance, create if needed - if not cachedSets.blueCargo then - cachedSets.blueCargo = SET_GROUP:New():FilterCoalitions("blue"):FilterCategoryAirplane():FilterStart() - end - local blueCargo = cachedSets.blueCargo + if #alternativeAirbases > 0 then + -- Select random alternative airbase + local newAirbase = alternativeAirbases[math.random(1, #alternativeAirbases)] - blueCargo:ForEach(function(cargoGroup) - if cargoGroup and cargoGroup:IsAlive() then - local cargoName = cargoGroup:GetName():upper() - local isCargoAircraft = false + -- Update squadron configuration (this is a runtime change) + squadron.airbaseName = newAirbase + airbaseHealthStatus[coalitionKey][squadron.airbaseName] = "operational" -- Reset health for new assignment + + log("REASSIGNED: " .. coalitionName .. " Squadron " .. squadron.displayName .. " moved from " .. squadron.airbaseName .. " to " .. newAirbase) + MESSAGE:New(coalitionName .. " Squadron " .. squadron.displayName .. " reassigned to " .. newAirbase .. " due to airbase issues", 20):ToCoalition(coalitionSide) + else + log("WARNING: No alternative airbases available for " .. coalitionName .. " Squadron " .. squadron.displayName) + MESSAGE:New("WARNING: No alternative airbases available for " .. squadron.displayName, 30):ToCoalition(coalitionSide) + end +end + +-- Monitor for stuck aircraft at airbases +local function monitorStuckAircraft() + local currentTime = timer.getTime() + local stuckThreshold = 300 -- 5 minutes before considering aircraft stuck + local movementThreshold = 50 -- meters - aircraft must move at least this far to not be considered stuck + + for _, coalitionKey in ipairs({"red", "blue"}) do + local coalitionName = (coalitionKey == "red") and "RED" or "BLUE" + + for aircraftName, trackingData in pairs(aircraftSpawnTracking[coalitionKey]) do + if trackingData and trackingData.group and trackingData.group:IsAlive() then + local timeSinceSpawn = currentTime - trackingData.spawnTime - -- Check if aircraft name matches cargo patterns - for _, pattern in pairs(ADVANCED_SETTINGS.cargoPatterns) do - if string.find(cargoName, pattern) then - isCargoAircraft = true - break - end - end - - if isCargoAircraft then - local cargoCoord = cargoGroup:GetCoordinate() - local cargoVelocity = cargoGroup:GetVelocityKMH() - - -- Check for flyover delivery - aircraft within range of airbase (no landing required) - -- Check which BLUE airbase it's near - for _, squadron in pairs(BLUE_SQUADRON_CONFIG) do - local airbase = AIRBASE:FindByName(squadron.airbaseName) - if airbase and airbase:GetCoalition() == coalition.side.BLUE then - local airbaseCoord = airbase:GetCoordinate() - local distance = cargoCoord:Get2DDistance(airbaseCoord) + -- Only check aircraft that have been spawned for at least the threshold time + if timeSinceSpawn >= stuckThreshold then + local currentPos = trackingData.group:GetCoordinate() + if currentPos and trackingData.spawnPos then + local distanceMoved = trackingData.spawnPos:Get2DDistance(currentPos) + + -- Check if aircraft has moved less than threshold (stuck) + if distanceMoved < movementThreshold then + log("STUCK AIRCRAFT DETECTED: " .. aircraftName .. " at " .. trackingData.airbase .. + " has only moved " .. math.floor(distanceMoved) .. "m in " .. math.floor(timeSinceSpawn/60) .. " minutes") - -- If within configured distance of airbase, consider it a flyover delivery - if distance < ADVANCED_SETTINGS.cargoLandingDistance then - log("FLYOVER DELIVERY: " .. cargoName .. " delivered supplies to " .. squadron.airbaseName .. " (distance: " .. math.floor(distance) .. "m, altitude: " .. math.floor(cargoCoord.y/0.3048) .. " ft)") - processCargoDelivery(cargoGroup, squadron, coalition.side.BLUE, "blue") - end + -- Mark airbase as having stuck aircraft + airbaseHealthStatus[coalitionKey][trackingData.airbase] = "stuck-aircraft" + + -- Remove the stuck aircraft + trackingData.group:Destroy() + activeInterceptors[coalitionKey][aircraftName] = nil + aircraftSpawnTracking[coalitionKey][aircraftName] = nil + + -- Reassign squadron to alternative airbase + reassignSquadronToAlternativeAirbase(trackingData.squadron, coalitionKey) + + MESSAGE:New(coalitionName .. " aircraft stuck at " .. trackingData.airbase .. " - destroyed and squadron reassigned", 15):ToCoalition(coalitionKey == "red" and coalition.side.RED or coalition.side.BLUE) + else + -- Aircraft has moved sufficiently, remove from tracking (no longer needs monitoring) + log("Aircraft " .. aircraftName .. " has moved " .. math.floor(distanceMoved) .. "m - removing from stuck monitoring", true) + aircraftSpawnTracking[coalitionKey][aircraftName] = nil end end end + else + -- Clean up dead aircraft from tracking + aircraftSpawnTracking[coalitionKey][aircraftName] = nil end - end) + end end end @@ -1046,7 +1511,9 @@ local function findBestSquadron(threatCoord, threatSize, coalitionSide) return selected.squadron, selected.responseRatio, selected.zoneDescription end - log("No " .. coalitionName .. " squadron available for threat at coordinates") + if ADVANCED_SETTINGS.enableDetailedLogging then + log("No " .. coalitionName .. " squadron available for threat at coordinates") + end return nil, 0, "no available squadrons" end @@ -1093,7 +1560,9 @@ local function launchInterceptor(threatGroup, coalitionSide) local squadron, zoneResponseRatio, zoneDescription = findBestSquadron(threatCoord, threatSize, coalitionSide) if not squadron then - log("No " .. coalitionName .. " squadron available") + if ADVANCED_SETTINGS.enableDetailedLogging then + log("No " .. coalitionName .. " squadron available") + end return end @@ -1110,7 +1579,9 @@ local function launchInterceptor(threatGroup, coalitionSide) end end if not squadron then - log("No " .. coalitionName .. " squadron available") + if ADVANCED_SETTINGS.enableDetailedLogging then + log("No " .. coalitionName .. " squadron available") + end return end @@ -1173,11 +1644,25 @@ local function launchInterceptor(threatGroup, coalitionSide) displayName = squadron.displayName } + -- Track spawn position for stuck aircraft detection + local spawnPos = interceptor:GetCoordinate() + if spawnPos then + aircraftSpawnTracking[coalitionKey][interceptor:GetName()] = { + spawnPos = spawnPos, + spawnTime = timer.getTime(), + squadron = squadron, + airbase = squadron.airbaseName + } + log("Tracking spawn position for " .. interceptor:GetName() .. " at " .. squadron.airbaseName, true) + end + -- Emergency cleanup (safety net) SCHEDULER:New(nil, function() if activeInterceptors[coalitionKey][interceptor:GetName()] then log("Emergency cleanup of " .. coalitionName .. " " .. interceptor:GetName() .. " (should have RTB'd)") activeInterceptors[coalitionKey][interceptor:GetName()] = nil + -- Also clean up spawn tracking + aircraftSpawnTracking[coalitionKey][interceptor:GetName()] = nil end end, {}, coalitionSettings.emergencyCleanupTime) end @@ -1503,13 +1988,55 @@ local function initializeSystem() end -- Start schedulers - -- Set up event handler for cargo landing detection + -- Set up event handler for cargo landing detection (handled via MOOSE EVENTHANDLER wrapper below) + + -- Re-register world event handler for robust detection (handles raw DCS initiators and race cases) world.addEventHandler(cargoEventHandler) + + -- MOOSE-style EVENTHANDLER wrapper for readability: logs EventData but does NOT delegate to avoid double-processing + if EVENTHANDLER then + local TADC_CARGO_LANDING_HANDLER = EVENTHANDLER:New() + function TADC_CARGO_LANDING_HANDLER:OnEventLand(EventData) + -- Convert MOOSE EventData to raw world.event format and reuse existing handler logic + if ADVANCED_SETTINGS.enableDetailedLogging then + -- Log presence and types of key fields + local function safeName(obj) + if not obj then return "" end + local ok, n = pcall(function() + if obj.GetName then return obj:GetName() end + if obj.getName then return obj:getName() end + return nil + end) + return (ok and n) and tostring(n) or "" + end + + local iniUnitPresent = EventData.IniUnit ~= nil + local iniGroupPresent = EventData.IniGroup ~= nil + local placePresent = EventData.Place ~= nil + local iniUnitName = safeName(EventData.IniUnit) + local iniGroupName = safeName(EventData.IniGroup) + local placeName = safeName(EventData.Place) + + log("MOOSE LAND EVENT: IniUnitPresent=" .. tostring(iniUnitPresent) .. ", IniUnitName=" .. tostring(iniUnitName) .. ", IniGroupPresent=" .. tostring(iniGroupPresent) .. ", IniGroupName=" .. tostring(iniGroupName) .. ", PlacePresent=" .. tostring(placePresent) .. ", PlaceName=" .. tostring(placeName), true) + end + + local rawEvent = { + id = world.event.S_EVENT_LAND, + initiator = EventData.IniUnit or EventData.IniGroup or nil, + place = EventData.Place or nil, + -- Provide the original EventData for potential fallback use + _moose_original = EventData + } + -- Log and return; the world event handler `cargoEventHandler` will handle the actual processing. + return + end + -- Register the MOOSE handler + TADC_CARGO_LANDING_HANDLER:HandleEvent(EVENTS.Land) + end SCHEDULER:New(nil, detectThreats, {}, 5, TADC_SETTINGS.checkInterval) SCHEDULER:New(nil, monitorInterceptors, {}, 10, TADC_SETTINGS.monitorInterval) SCHEDULER:New(nil, checkAirbaseStatus, {}, 30, TADC_SETTINGS.statusReportInterval) - SCHEDULER:New(nil, monitorCargoReplenishment, {}, 15, TADC_SETTINGS.cargoCheckInterval) SCHEDULER:New(nil, cleanupOldDeliveries, {}, 60, 3600) -- Cleanup old delivery records every hour -- Start periodic squadron summary broadcast @@ -1706,5 +2233,37 @@ MENU_MISSION_COMMAND:New("Show TADC System Status", menuRoot, function() MESSAGE:New(status, 20):ToAll() end) +-- 10. Check for Stuck Aircraft (manual trigger) +MENU_MISSION_COMMAND:New("Check for Stuck Aircraft", menuRoot, function() + monitorStuckAircraft() + MESSAGE:New("Stuck aircraft check completed", 10):ToAll() +end) + +-- 11. Show Airbase Health Status +MENU_MISSION_COMMAND:New("Show Airbase Health Status", menuRoot, function() + local lines = {"Airbase Health Status:"} + for _, coalitionKey in ipairs({"red", "blue"}) do + local coalitionName = (coalitionKey == "red") and "RED" or "BLUE" + table.insert(lines, coalitionName .. " Coalition:") + for airbaseName, status in pairs(airbaseHealthStatus[coalitionKey]) do + table.insert(lines, " " .. airbaseName .. ": " .. status) + end + end + MESSAGE:New(table.concat(lines, "\n"), 20):ToAll() +end) + +-- Initialize airbase health status for all configured airbases +for _, coalitionKey in ipairs({"red", "blue"}) do + local squadronConfig = getSquadronConfig(coalitionKey == "red" and coalition.side.RED or coalition.side.BLUE) + for _, squadron in pairs(squadronConfig) do + if not airbaseHealthStatus[coalitionKey][squadron.airbaseName] then + airbaseHealthStatus[coalitionKey][squadron.airbaseName] = "operational" + end + end +end + +-- Set up periodic stuck aircraft monitoring (every 2 minutes) +SCHEDULER:New(nil, monitorStuckAircraft, {}, 120, 120) + diff --git a/Moose_TADC/TADC_Example.miz b/Moose_TADC/TADC_Example.miz index a79c59efa358d6d3fd1c517e4585e754fd365480..a60df40b9de423b9ea052b00fb3abe24097e8c60 100644 GIT binary patch delta 43943 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