mirror of
https://github.com/Pax1601/DCSOlympus.git
synced 2025-10-29 16:56:34 +00:00
136 lines
3.9 KiB
Lua
136 lines
3.9 KiB
Lua
local version = 'v0.1.0-alpha'
|
|
|
|
Olympus = {}
|
|
Olympus.groupIndex = 0
|
|
Olympus.groupStep = 40
|
|
|
|
function Olympus.notify(message, displayFor)
|
|
trigger.action.outText(message, displayFor)
|
|
end
|
|
|
|
function Olympus.setMissionData(arg, time)
|
|
local missionData = {}
|
|
|
|
-- Bullseye data
|
|
local bullseyes = {}
|
|
for i = 0, 2 do
|
|
local bullseyeVec3 = coalition.getMainRefPoint(i)
|
|
local bullseyeLatitude, bullseyeLongitude, bullseyeAltitude = coord.LOtoLL(bullseyeVec3)
|
|
bullseyes[i] = {}
|
|
bullseyes[i]["latitude"] = bullseyeLatitude
|
|
bullseyes[i]["longitude"] = bullseyeLongitude
|
|
end
|
|
|
|
-- Units tactical data
|
|
local unitsData = {}
|
|
|
|
local startIndex = Olympus.groupIndex
|
|
local endIndex = startIndex + Olympus.groupStep
|
|
local index = 0
|
|
for groupName, gp in pairs(mist.DBs.groupsByName) do
|
|
index = index + 1
|
|
if index > startIndex then
|
|
if groupName ~= nil then
|
|
local group = Group.getByName(groupName)
|
|
if group ~= nil then
|
|
local controller = group:getController()
|
|
for index, unit in pairs(group:getUnits()) do
|
|
local table = {}
|
|
table["targets"] = {}
|
|
table["targets"]["visual"] = controller:getDetectedTargets(1)
|
|
table["targets"]["radar"] = controller:getDetectedTargets(4)
|
|
table["targets"]["rwr"] = controller:getDetectedTargets(16)
|
|
table["targets"]["other"] = controller:getDetectedTargets(2, 8, 32)
|
|
|
|
table["hasTask"] = controller:hasTask()
|
|
|
|
table["ammo"] = unit:getAmmo()
|
|
table["fuel"] = unit:getFuel()
|
|
table["life"] = unit:getLife() / unit:getLife0()
|
|
unitsData[unit:getObjectID()] = table
|
|
end
|
|
end
|
|
end
|
|
end
|
|
if index >= endIndex then
|
|
break
|
|
end
|
|
end
|
|
if index ~= endIndex then
|
|
Olympus.groupIndex = 0
|
|
else
|
|
Olympus.groupIndex = endIndex
|
|
end
|
|
|
|
-- Airbases data
|
|
local base = world.getAirbases()
|
|
local airbases = {}
|
|
for i = 1, #base do
|
|
local info = {}
|
|
local latitude, longitude, altitude = coord.LOtoLL(Airbase.getPoint(base[i]))
|
|
info["callsign"] = Airbase.getCallsign(base[i])
|
|
local coalitionID = Airbase.getCoalition(base[i])
|
|
if coalitionID == 0 then
|
|
info["coalition"] = "neutral"
|
|
elseif coalitionID == 1 then
|
|
info["coalition"] = "red"
|
|
else
|
|
info["coalition"] = "blue"
|
|
end
|
|
info["latitude"] = latitude
|
|
info["longitude"] = longitude
|
|
if Airbase.getUnit(base[i]) then
|
|
info["unitId"] = Airbase.getUnit(base[i]):getID()
|
|
end
|
|
airbases[i] = info
|
|
end
|
|
|
|
local mission = {}
|
|
mission.theatre = env.mission.theatre
|
|
|
|
-- Assemble missionData table
|
|
missionData["bullseyes"] = bullseyes
|
|
missionData["unitsData"] = unitsData
|
|
missionData["airbases"] = airbases
|
|
missionData["mission"] = mission
|
|
|
|
local command = "Olympus.missionData = " .. Olympus.serializeTable(missionData) .. "\n" .. "Olympus.OlympusDLL.setMissionData()"
|
|
net.dostring_in("export", command)
|
|
return time + 1
|
|
end
|
|
|
|
function Olympus.serializeTable(val, name, skipnewlines, depth)
|
|
skipnewlines = skipnewlines or false
|
|
depth = depth or 0
|
|
|
|
local tmp = string.rep(" ", depth)
|
|
if name then
|
|
if type(name) == "number" then
|
|
tmp = tmp .. "[" .. name .. "]" .. " = "
|
|
else
|
|
tmp = tmp .. name .. " = "
|
|
end
|
|
end
|
|
|
|
if type(val) == "table" then
|
|
tmp = tmp .. "{" .. (not skipnewlines and "\n" or "")
|
|
for k, v in pairs(val) do
|
|
tmp = tmp .. Olympus.serializeTable(v, k, skipnewlines, depth + 1) .. "," .. (not skipnewlines and "\n" or "")
|
|
end
|
|
tmp = tmp .. string.rep(" ", depth) .. "}"
|
|
elseif type(val) == "number" then
|
|
tmp = tmp .. tostring(val)
|
|
elseif type(val) == "string" then
|
|
tmp = tmp .. string.format("%q", val)
|
|
elseif type(val) == "boolean" then
|
|
tmp = tmp .. (val and "true" or "false")
|
|
else
|
|
tmp = tmp .. "\"[inserializeable datatype:" .. type(val) .. "]\""
|
|
end
|
|
|
|
return tmp
|
|
end
|
|
|
|
timer.scheduleFunction(Olympus.setMissionData, {}, timer.getTime() + 1)
|
|
Olympus.notify("OlympusMission " .. version .. " script loaded correctly", 10)
|