2025-09-16 12:16:58 +02:00

94 lines
3.8 KiB
Lua

-- ====================================================================================
-- TUM.SUPPORTJTAC - HANDLES FRIENDLY JTAC SMOKE MARKERS AND LASING
-- ====================================================================================
-- ====================================================================================
TUM.supportJTAC = {}
do
local JTAC_CALLSIGNS = {
"Anvil",
"Axeman",
"Badger",
"Darknight",
"Deathstar",
"Eyeball",
"Ferret",
"Finger",
"Firefly",
"Hammer",
"Jaguar",
"Mantis",
"Moonbeam",
"Pinpoint",
"Playboy",
"Pointer",
"Shaba",
"Warrior",
"Whiplash",
}
local SMOKE_DURATION = 300 -- in seconds
local SMOKE_MARKER_PENALTY = -25
local jtacName = {}
local lastSmoke = {}
local function spawnSmoke(args)
trigger.action.smoke(args.point3, args.smokeColor)
end
local function doCommandSmoke(index)
local obj = TUM.objectives.getObjective(index)
if not obj then return end
-- Pick a smoke color
local smokeColor = DCSEx.table.getRandom({ trigger.smokeColor.Red, trigger.smokeColor.Orange }) -- TODO: green or blue smoke when marking friendlies
local smokeColorName = "red"
if smokeColor == trigger.smokeColor.Orange then smokeColorName = "orange" end
TUM.radio.playForCoalition(TUM.settings.getPlayerCoalition(), "playerJTACSmoke", { jtacName[index], obj.name }, TUM.mission.getPlayerCallsign(), false)
if not lastSmoke[index] then lastSmoke[index] = -3600 end
if lastSmoke[index] + SMOKE_DURATION > timer.getAbsTime() then
TUM.radio.playForCoalition(TUM.settings.getPlayerCoalition(), "jtacSmokeAlreadyOut", { jtacName[index], obj.name }, jtacName[index], true)
return
end
if obj.completed then
TUM.radio.playForCoalition(TUM.settings.getPlayerCoalition(), "jtacSmokeNoTarget", { jtacName[index] }, jtacName[index], true)
return
end
if obj.isAirbaseTarget or obj.isSceneryTarget then
TUM.radio.playForCoalition(TUM.settings.getPlayerCoalition(), "jtacSmokeOK", { jtacName[index], smokeColorName }, jtacName[index], true, spawnSmoke, { point3 = obj.point3, smokeColor = smokeColor })
else
for _,id in ipairs(obj.unitsID) do
if not DCSEx.table.contains(obj.completedUnitsID, id) then
local unit = DCSEx.world.getUnitByID(id)
if unit and unit:isActive() and unit:getLife() > 0 then
TUM.radio.playForCoalition(TUM.settings.getPlayerCoalition(), "jtacSmokeOK", { jtacName[index], smokeColorName }, jtacName[index], true, spawnSmoke, { point3 = unit:getPoint(), smokeColor = smokeColor })
lastSmoke[index] = timer.getAbsTime()
TUM.playerScore.award(SMOKE_MARKER_PENALTY, "called for smoke marker")
return
end
end
end
end
TUM.radio.playForCoalition(TUM.settings.getPlayerCoalition(), "jtacSmokeNoTarget", { jtacName[index] }, jtacName[index], true)
end
function TUM.supportJTAC.setupJTACOnObjective(index, menuRoot)
local obj = TUM.objectives.getObjective(index)
if not obj then return end
jtacName[index] = DCSEx.table.getRandom(JTAC_CALLSIGNS)
lastSmoke[index] = -3600
local objectiveDB = Library.tasks[obj.taskID]
if not DCSEx.table.contains(objectiveDB.flags, DCSEx.enums.taskFlag.ALLOW_JTAC) then return end -- No JTAC for this objective
missionCommands.addCommand("Smoke marker on target ("..tostring(SMOKE_MARKER_PENALTY).."xp)", menuRoot, doCommandSmoke, index)
end
end