mirror of
https://github.com/dcs-retribution/dcs-retribution.git
synced 2025-11-10 15:41:24 +00:00
254 lines
7.4 KiB
Lua
254 lines
7.4 KiB
Lua
--[[
|
|
Export script for LotATC drawings
|
|
|
|
Allows to export certain DCS Retribution objects as predefined drawing in LotATC.
|
|
|
|
This script runs at mission startup and generates a drawing JSON file to be imported
|
|
in LotATC.
|
|
]]
|
|
|
|
LotAtcExportConfig = {
|
|
["exportRedAA"] = false,
|
|
["exportBlueAA"] = false,
|
|
["exportSymbols"] = false,
|
|
["exportVersion"] = "2.2.0",
|
|
["drawingBasePath"] = nil,
|
|
["redColor"] = "#7FE32000",
|
|
["blueColor"] = "#7F0084FF"
|
|
}
|
|
|
|
local function factionName(isFriend)
|
|
if isFriend then
|
|
return "BLUE"
|
|
else
|
|
return "RED"
|
|
end
|
|
end
|
|
|
|
local function uuid()
|
|
local random = math.random
|
|
local template ='xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'
|
|
return string.gsub(template, '[xy]', function (c)
|
|
local v = (c == 'x') and random(0, 0xf) or random(8, 0xb)
|
|
return string.format('%x', v)
|
|
end)
|
|
end
|
|
|
|
local function ends_with(str, ending)
|
|
return ending == "" or str:sub(-#ending) == ending
|
|
end
|
|
|
|
local function combine(path1, path2)
|
|
if not ends_with(path1, "\\") then
|
|
path1 = path1 .. "\\"
|
|
end
|
|
|
|
return path1 .. path2
|
|
end
|
|
|
|
local function lotatcExport_get_aa_nato_name(unit, isFriend)
|
|
if not redIADS or not blueIADS then
|
|
return nil
|
|
end
|
|
|
|
-- logger:info(string.format("DCSRetribution|LotATC Export plugin - try get NATO name for unit %s", unit.dcsGroupName))
|
|
|
|
local iads = redIADS
|
|
if isFriend then
|
|
iads = blueIADS
|
|
end
|
|
|
|
local samSite = iads:getSAMSiteByGroupName(unit.dcsGroupName)
|
|
if samSite and samSite.natoName then
|
|
-- logger:info(string.format("DCSRetribution|LotATC Export plugin - NATO name is %s", samSite.natoName))
|
|
return samSite.natoName
|
|
else
|
|
return nil
|
|
end
|
|
end
|
|
|
|
local function lotatcExport_get_name(unit, isFriend)
|
|
local classification = "SAM"
|
|
|
|
if string.find(unit.dcsGroupName, "|EWR|", 1, true) then
|
|
classification = "EWR"
|
|
elseif string.find(unit.dcsGroupName, "|AA", 1, true) then
|
|
classification = "AAA"
|
|
end
|
|
|
|
local natoName = lotatcExport_get_aa_nato_name(unit, isFriend)
|
|
|
|
local name = nil
|
|
if not natoName then
|
|
name = string.format("%s|%s", unit.name, classification)
|
|
else
|
|
name = string.format("%s|%s|%s", unit.name, classification, natoName)
|
|
end
|
|
|
|
return name, classification
|
|
end
|
|
|
|
local function lotatc_write_json(filename, json)
|
|
logger:info(string.format("DCSRetribution|LotATC Export plugin - writing %s", filename))
|
|
|
|
local function Write()
|
|
local fp = io.open(filename, 'w')
|
|
if fp then
|
|
fp:write(json)
|
|
fp:close()
|
|
end
|
|
end
|
|
|
|
if pcall(Write) then
|
|
else
|
|
logger:error("Unable to write LotATC export file to %s", filename)
|
|
end
|
|
end
|
|
|
|
local function lotatcExport_threat_circles_for_faction(faction, color, isFriend)
|
|
local drawings = {}
|
|
|
|
for _,aa in pairs(faction) do
|
|
logger:info(string.format("DCSRetribution|LotATC Export plugin - exporting threat circle for %s", aa.dcsGroupName))
|
|
|
|
local convLat, convLon = coord.LOtoLL({x = aa.positionX, y = 0, z = aa.positionY})
|
|
|
|
local name = lotatcExport_get_name(aa, isFriend)
|
|
|
|
table.insert(drawings,
|
|
{
|
|
["author"] = "DCSRetribution",
|
|
["brushStyle"] = 1,
|
|
["color"] = color,
|
|
["colorBg"] = "#00000000",
|
|
["id"] = string.format("{%s}", uuid()),
|
|
["longitude"] = convLon,
|
|
["latitude"] = convLat,
|
|
["radius"] = tonumber(aa.range),
|
|
["lineWidth"] = 2,
|
|
["name"] = name,
|
|
["shared"] = true,
|
|
["timestamp"] = "",
|
|
["type"] = "circle",
|
|
["text"] = name,
|
|
["font"] = {
|
|
["color"] = color,
|
|
["font"] = "Lato"
|
|
}
|
|
})
|
|
end
|
|
|
|
local lotatcData = {
|
|
["name"] = "Threat Circles " .. factionName(isFriend),
|
|
["enable"] = "true",
|
|
["version"] = LotAtcExportConfig.exportVersion,
|
|
["drawings"] = drawings
|
|
}
|
|
|
|
local drawings_json = json:encode(lotatcData)
|
|
return drawings_json
|
|
end
|
|
|
|
local function lotatcExport_symbols_for_faction(faction, color, isFriend)
|
|
local drawings = {}
|
|
|
|
for _,aa in pairs(faction) do
|
|
logger:info(string.format("DCSRetribution|LotATC Export plugin - exporting AA symbol for %s", aa.dcsGroupName))
|
|
|
|
local convLat, convLon = coord.LOtoLL({x = aa.positionX, y = 0, z = aa.positionY})
|
|
|
|
local name = lotatcExport_get_name(aa, isFriend)
|
|
|
|
local classification = "hostile"
|
|
if isFriend then
|
|
classification = "friend"
|
|
end
|
|
|
|
local sub_dimension = "none"
|
|
|
|
if string.find(aa.dcsGroupName, "|EWR|", 1, true) then
|
|
sub_dimension = "ew"
|
|
end
|
|
|
|
table.insert(drawings,
|
|
{
|
|
["author"] = "DCSRetribution",
|
|
["brushStyle"] = 1,
|
|
["classification"] = {
|
|
["classification"] = classification,
|
|
["dimension"] = "land_unit",
|
|
["sub_dimension"] = sub_dimension
|
|
},
|
|
["color"] = color,
|
|
["colorBg"] = "#33FF0000",
|
|
["font"] = {
|
|
["color"] = color,
|
|
["font"] = "Lato"
|
|
},
|
|
["id"] = string.format("{%s}", uuid()),
|
|
["longitude"] = convLon,
|
|
["latitude"] = convLat,
|
|
["lineWidth"] = 2,
|
|
["name"] = name,
|
|
["shared"] = true,
|
|
["timestamp"] = "",
|
|
["type"] = "symbol",
|
|
["text"] = name
|
|
})
|
|
end
|
|
|
|
local lotatcData = {
|
|
["name"] = "Threat Symbols " .. factionName(isFriend),
|
|
["enable"] = "true",
|
|
["version"] = LotAtcExportConfig.exportVersion,
|
|
["drawings"] = drawings,
|
|
}
|
|
|
|
local drawings_json = json:encode(lotatcData)
|
|
return drawings_json
|
|
end
|
|
|
|
local function lotatc_export_faction(faction, color, factionPath, isFriend)
|
|
local exportBasePathFaction = combine(LotAtcExportConfig.drawingBasePath, factionPath)
|
|
lfs.mkdir(exportBasePathFaction)
|
|
|
|
local exportFileName = combine(exportBasePathFaction, "threatZones.json")
|
|
local json = lotatcExport_threat_circles_for_faction(faction, color, isFriend)
|
|
lotatc_write_json(exportFileName, json)
|
|
|
|
if LotAtcExportConfig.exportSymbols then
|
|
exportFileName = combine(exportBasePathFaction, "threatSymbols.json")
|
|
json = lotatcExport_symbols_for_faction(faction, color, isFriend);
|
|
lotatc_write_json(exportFileName, json)
|
|
end
|
|
end
|
|
|
|
function LotatcExport()
|
|
|
|
if not json then
|
|
local message = "Unable to export LotATC drawings, JSON library is not loaded!"
|
|
logger:error(message)
|
|
return
|
|
end
|
|
|
|
if not LotAtcExportConfig.drawingBasePath then
|
|
local message = "No writable export path for LotATC drawings. Set environment variable LOTATC_DRAWINGS_DIR pointing to your export path."
|
|
logger:error(message)
|
|
return
|
|
end
|
|
|
|
local message = "Export LotATC drawings to "..LotAtcExportConfig.drawingBasePath
|
|
logger:info(message)
|
|
|
|
-- The RED AA is exported to the blue folder and vice versa. If a BLUE GCI connects he/she
|
|
-- wants to see the RED AA.
|
|
|
|
if LotAtcExportConfig.exportRedAA then
|
|
lotatc_export_faction(dcsRetribution.RedAA, LotAtcExportConfig.redColor, [[blue\]], false)
|
|
end
|
|
|
|
if LotAtcExportConfig.exportBlueAA then
|
|
lotatc_export_faction(dcsRetribution.BlueAA, LotAtcExportConfig.blueColor, [[red\]], true)
|
|
end
|
|
end
|