-- 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')