2025-08-05 00:18:35 +02:00
local QBCore = exports [ ' qb-core ' ] : GetCoreObject ( )
local activeTrackings = { }
-- Callback für Fahrzeug Tracking
QBCore.Functions . CreateCallback ( ' tracking:server:trackVehicle ' , function ( source , cb , plate )
local src = source
local Player = QBCore.Functions . GetPlayer ( src )
if not Player then
cb ( false , ' Spieler nicht gefunden! ' )
return
end
-- Überprüfe Job Berechtigung
local allowedJobs = { ' police ' , ' ambulance ' , ' mechanic ' }
local hasPermission = false
for _ , job in pairs ( allowedJobs ) do
if Player.PlayerData . job.name == job then
hasPermission = true
break
end
end
if not hasPermission then
cb ( false , ' Keine Berechtigung! ' )
return
end
2025-08-05 09:39:08 +02:00
-- Suche Fahrzeug in der Datenbank mit Collation-Fix
MySQL.Async . fetchAll ( ' SELECT pv.*, p.charinfo FROM player_vehicles pv LEFT JOIN players p ON pv.citizenid COLLATE utf8mb4_general_ci = p.citizenid COLLATE utf8mb4_general_ci WHERE pv.plate = ? ' , { plate } , function ( result )
2025-08-05 00:18:35 +02:00
if result [ 1 ] then
2025-08-05 09:31:49 +02:00
-- Extrahiere Besitzerinformationen
local ownerInfo = " Unbekannt "
if result [ 1 ] . charinfo then
local charInfo = json.decode ( result [ 1 ] . charinfo )
if charInfo then
ownerInfo = charInfo.firstname .. " " .. charInfo.lastname
end
end
2025-08-05 00:18:35 +02:00
-- Suche das Fahrzeug in der Welt
local vehicles = GetAllVehicles ( )
local foundVehicle = nil
local vehicleCoords = nil
for _ , vehicle in pairs ( vehicles ) do
if DoesEntityExist ( vehicle ) then
local vehiclePlate = GetVehicleNumberPlateText ( vehicle )
if vehiclePlate and string.gsub ( vehiclePlate , ' ^%s*(.-)%s*$ ' , ' %1 ' ) == plate then
foundVehicle = vehicle
vehicleCoords = GetEntityCoords ( vehicle )
break
end
end
end
if foundVehicle and vehicleCoords then
activeTrackings [ plate ] = {
vehicle = foundVehicle ,
coords = { x = vehicleCoords.x , y = vehicleCoords.y , z = vehicleCoords.z } ,
2025-08-05 09:31:49 +02:00
tracker = src ,
owner = ownerInfo
2025-08-05 00:18:35 +02:00
}
cb ( true , ' Fahrzeug gefunden! ' , {
vehicle = foundVehicle ,
2025-08-05 09:31:49 +02:00
coords = { x = vehicleCoords.x , y = vehicleCoords.y , z = vehicleCoords.z } ,
owner = ownerInfo
2025-08-05 00:18:35 +02:00
} )
else
cb ( false , ' Fahrzeug nicht in der Welt gefunden! ' )
end
else
cb ( false , ' Fahrzeug mit diesem Kennzeichen existiert nicht! ' )
end
end )
end )
-- Update Fahrzeug Position
RegisterNetEvent ( ' tracking:server:updateVehicleLocation ' , function ( plate )
local src = source
if activeTrackings [ plate ] and activeTrackings [ plate ] . tracker == src then
local vehicle = activeTrackings [ plate ] . vehicle
if DoesEntityExist ( vehicle ) then
local coords = GetEntityCoords ( vehicle )
activeTrackings [ plate ] . coords = { x = coords.x , y = coords.y , z = coords.z }
TriggerClientEvent ( ' tracking:client:updatePosition ' , src , plate , { x = coords.x , y = coords.y , z = coords.z } )
else
-- Fahrzeug existiert nicht mehr
activeTrackings [ plate ] = nil
TriggerClientEvent ( ' QBCore:Notify ' , src , ' Tracking verloren - Fahrzeug nicht mehr verfügbar! ' , ' error ' )
end
end
end )
-- Stoppe Tracking
RegisterNetEvent ( ' tracking:server:stopTracking ' , function ( plate )
local src = source
if activeTrackings [ plate ] and activeTrackings [ plate ] . tracker == src then
activeTrackings [ plate ] = nil
end
end )
-- Cleanup bei Disconnect
AddEventHandler ( ' playerDropped ' , function ( )
local src = source
for plate , data in pairs ( activeTrackings ) do
if data.tracker == src then
activeTrackings [ plate ] = nil
end
end
end )