2026-04-14 15:54:53 +02:00

82 lines
2.2 KiB
Lua

-- MercyV Live Map - Server HTTP Endpoint
-- Liefert alle Online-Spieler mit Positionen fuer das Admin Panel
local API_KEY = GetConvar('livemap_api_key', '')
-- ESX Framework Referenz (optional)
local ESX = nil
Citizen.CreateThread(function()
while ESX == nil do
TriggerEvent('esx:getSharedObject', function(obj) ESX = obj end)
Citizen.Wait(1000)
end
print('[mercyv-livemap] ESX geladen - Live Map bereit')
end)
SetHttpHandler(function(req, res)
-- CORS Header
res.writeHead(200, {
['Content-Type'] = 'application/json',
['Access-Control-Allow-Origin'] = '*'
})
-- Nur GET erlauben
if req.method ~= 'GET' then
res.send(json.encode({ error = 'Method not allowed' }))
return
end
-- API-Key pruefen
local authHeader = req.headers['Authorization'] or req.headers['authorization'] or ''
local expectedAuth = 'Bearer ' .. API_KEY
if API_KEY == '' or authHeader ~= expectedAuth then
res.send(json.encode({ error = 'Unauthorized' }))
return
end
-- Alle Online-Spieler sammeln
local players = {}
local playerList = GetPlayers()
for _, playerId in ipairs(playerList) do
local ped = GetPlayerPed(playerId)
local coords = GetEntityCoords(ped)
local heading = GetEntityHeading(ped)
local name = GetPlayerName(playerId)
-- Job-Daten via ESX (falls verfuegbar)
local job = nil
if ESX then
local xPlayer = ESX.GetPlayerFromId(tonumber(playerId))
if xPlayer then
local playerJob = xPlayer.getJob()
if playerJob then
job = {
name = playerJob.name,
label = playerJob.label,
grade_label = playerJob.grade_label
}
end
end
end
table.insert(players, {
id = tonumber(playerId),
name = name,
coords = {
x = coords.x,
y = coords.y,
z = coords.z
},
heading = heading,
job = job
})
end
res.send(json.encode(players))
end)
print('[mercyv-livemap] HTTP Endpoint aktiv')