333 lines
		
	
	
	
		
			9.9 KiB
		
	
	
	
		
			Lua
		
	
	
	
	
	
			
		
		
	
	
			333 lines
		
	
	
	
		
			9.9 KiB
		
	
	
	
		
			Lua
		
	
	
	
	
	
| local QBCore = exports['qb-core']:GetCoreObject()
 | |
| local activeTrackings = {}
 | |
| local trackingBlips = {}
 | |
| local inTrackingZone = false
 | |
| local currentLocation = nil
 | |
| 
 | |
| -- Safety check for Config
 | |
| if not Config then
 | |
|     Config = {}
 | |
|     Config.TrackingLocations = {
 | |
|         {
 | |
|             coords = vector3(369.79, -1588.01, 29.43),
 | |
|             radius = 2.0,
 | |
|             job = {"police"},
 | |
|             label = "Polizei Tracking System"
 | |
|         }
 | |
|     }
 | |
|     Config.EnableCommand = true
 | |
|     Config.Command = "tracking"
 | |
|     Config.InteractKey = 38
 | |
|     print("^1Warning: Config not loaded properly, using default values^7")
 | |
| end
 | |
| 
 | |
| -- Command to open tracking menu (if enabled in config)
 | |
| if Config.EnableCommand then
 | |
|     RegisterCommand(Config.Command, function()
 | |
|         local PlayerData = QBCore.Functions.GetPlayerData()
 | |
|         local job = PlayerData.job.name
 | |
|         
 | |
|         -- Überprüfe ob Job berechtigt ist
 | |
|         local allowedJobs = {'police', 'ambulance', 'mechanic'} -- Füge hier weitere Jobs hinzu
 | |
|         local hasPermission = false
 | |
|         
 | |
|         for _, allowedJob in pairs(allowedJobs) do
 | |
|             if job == allowedJob then
 | |
|                 hasPermission = true
 | |
|                 break
 | |
|             end
 | |
|         end
 | |
|         
 | |
|         if not hasPermission then
 | |
|             QBCore.Functions.Notify('Du hast keine Berechtigung für das Tracking-System!', 'error')
 | |
|             return
 | |
|         end
 | |
|         
 | |
|         OpenTrackingMenu()
 | |
|     end)
 | |
| end
 | |
| 
 | |
| -- Rest of your client.lua code...
 | |
| 
 | |
| 
 | |
| -- Check if player is near a tracking location
 | |
| CreateThread(function()
 | |
|     while true do
 | |
|         local playerPed = PlayerPedId()
 | |
|         local playerCoords = GetEntityCoords(playerPed)
 | |
|         local sleep = 1000
 | |
|         local isInZone = false
 | |
|         local currentLocationData = nil
 | |
|         
 | |
|         for _, location in pairs(Config.TrackingLocations) do
 | |
|             local distance = #(playerCoords - location.coords)
 | |
|             
 | |
|             if distance < location.radius then
 | |
|                 sleep = 0
 | |
|                 isInZone = true
 | |
|                 currentLocationData = location
 | |
|                 break
 | |
|             end
 | |
|         end
 | |
|         
 | |
|         if isInZone and not inTrackingZone then
 | |
|             inTrackingZone = true
 | |
|             currentLocation = currentLocationData
 | |
|             -- Check if player has the required job for this location
 | |
|             local PlayerData = QBCore.Functions.GetPlayerData()
 | |
|             local hasRequiredJob = false
 | |
|             
 | |
|             for _, jobName in pairs(currentLocation.job) do
 | |
|                 if PlayerData.job.name == jobName then
 | |
|                     hasRequiredJob = true
 | |
|                     break
 | |
|                 end
 | |
|             end
 | |
|             
 | |
|             if hasRequiredJob then
 | |
|                 -- Show DrawText UI
 | |
|                 exports['qb-core']:DrawText(currentLocation.label, 'left')
 | |
|             end
 | |
|         elseif not isInZone and inTrackingZone then
 | |
|             inTrackingZone = false
 | |
|             currentLocation = nil
 | |
|             exports['qb-core']:HideText()
 | |
|         end
 | |
|         
 | |
|         Wait(sleep)
 | |
|     end
 | |
| end)
 | |
| 
 | |
| -- Key press detection for tracking locations
 | |
| CreateThread(function()
 | |
|     while true do
 | |
|         local sleep = 1000
 | |
|         
 | |
|         if inTrackingZone and currentLocation then
 | |
|             sleep = 0
 | |
|             -- Check if player has the required job for this location
 | |
|             local PlayerData = QBCore.Functions.GetPlayerData()
 | |
|             local hasRequiredJob = false
 | |
|             
 | |
|             for _, jobName in pairs(currentLocation.job) do
 | |
|                 if PlayerData.job.name == jobName then
 | |
|                     hasRequiredJob = true
 | |
|                     break
 | |
|                 end
 | |
|             end
 | |
|             
 | |
|             if hasRequiredJob and IsControlJustPressed(0, Config.InteractKey) then
 | |
|                 exports['qb-core']:HideText()
 | |
|                 OpenTrackingMenu()
 | |
|             end
 | |
|         end
 | |
|         
 | |
|         Wait(sleep)
 | |
|     end
 | |
| end)
 | |
| 
 | |
| function OpenTrackingMenu()
 | |
|     local options = {
 | |
|         {
 | |
|             title = 'Fahrzeug orten',
 | |
|             description = 'Fahrzeug über Kennzeichen orten',
 | |
|             icon = 'fas fa-search',
 | |
|             onSelect = function()
 | |
|                 TrackVehicle()
 | |
|             end
 | |
|         },
 | |
|         {
 | |
|             title = 'Aktive Trackings',
 | |
|             description = 'Zeige alle aktiven Trackings',
 | |
|             icon = 'fas fa-list',
 | |
|             onSelect = function()
 | |
|                 ShowActiveTrackings()
 | |
|             end
 | |
|         },
 | |
|         {
 | |
|             title = 'Tracking beenden',
 | |
|             description = 'Beende ein aktives Tracking',
 | |
|             icon = 'fas fa-times',
 | |
|             onSelect = function()
 | |
|                 StopTracking()
 | |
|             end
 | |
|         }
 | |
|     }
 | |
|     
 | |
|     lib.registerContext({
 | |
|         id = 'tracking_menu',
 | |
|         title = 'Fahrzeug Tracking System',
 | |
|         options = options
 | |
|     })
 | |
|     
 | |
|     lib.showContext('tracking_menu')
 | |
| end
 | |
| 
 | |
| function TrackVehicle()
 | |
|     local input = lib.inputDialog('Fahrzeug Tracking', {
 | |
|         {
 | |
|             type = 'input',
 | |
|             label = 'Kennzeichen',
 | |
|             description = 'Gib das Kennzeichen des Fahrzeugs ein',
 | |
|             required = true,
 | |
|             max = 8
 | |
|         }
 | |
|     })
 | |
|     
 | |
|     if not input then return end
 | |
|     
 | |
|     local plate = string.upper(input[1])
 | |
|     
 | |
|     QBCore.Functions.TriggerCallback('tracking:server:trackVehicle', function(success, message, vehicleData)
 | |
|         if success then
 | |
|             QBCore.Functions.Notify('Fahrzeug wird getrackt!', 'success')
 | |
|             StartTracking(plate, vehicleData)
 | |
|         else
 | |
|             QBCore.Functions.Notify(message, 'error')
 | |
|         end
 | |
|     end, plate)
 | |
| end
 | |
| 
 | |
| function StartTracking(plate, vehicleData)
 | |
|     if activeTrackings[plate] then
 | |
|         QBCore.Functions.Notify('Fahrzeug wird bereits getrackt!', 'error')
 | |
|         return
 | |
|     end
 | |
|     
 | |
|     activeTrackings[plate] = {
 | |
|         vehicle = vehicleData.vehicle,
 | |
|         coords = vehicleData.coords,
 | |
|         lastUpdate = GetGameTimer(),
 | |
|         owner = vehicleData.owner or "Unbekannt"
 | |
|     }
 | |
|     
 | |
|     -- Erstelle Blip
 | |
|     local blip = AddBlipForCoord(vehicleData.coords.x, vehicleData.coords.y, vehicleData.coords.z)
 | |
|     SetBlipSprite(blip, 225)
 | |
|     SetBlipDisplay(blip, 4)
 | |
|     SetBlipScale(blip, 0.8)
 | |
|     SetBlipColour(blip, 1)
 | |
|     SetBlipAsShortRange(blip, false)
 | |
|     BeginTextCommandSetBlipName("STRING")
 | |
|     AddTextComponentString("Tracking: " .. plate)
 | |
|     EndTextCommandSetBlipName(blip)
 | |
|     
 | |
|     trackingBlips[plate] = blip
 | |
|     
 | |
|     -- Zeige Besitzerinformation an
 | |
|     QBCore.Functions.Notify('Fahrzeug gehört: ' .. activeTrackings[plate].owner, 'info', 5000)
 | |
|     
 | |
|     -- Starte Update Loop
 | |
|     CreateThread(function()
 | |
|         while activeTrackings[plate] do
 | |
|             TriggerServerEvent('tracking:server:updateVehicleLocation', plate)
 | |
|             Wait(5000) -- Update alle 5 Sekunden
 | |
|         end
 | |
|     end)
 | |
| end
 | |
| 
 | |
| function ShowActiveTrackings()
 | |
|     local options = {}
 | |
|     
 | |
|     if next(activeTrackings) == nil then
 | |
|         options[#options + 1] = {
 | |
|             title = 'Keine aktiven Trackings',
 | |
|             description = 'Derzeit werden keine Fahrzeuge getrackt',
 | |
|             icon = 'fas fa-info-circle'
 | |
|         }
 | |
|     else
 | |
|         for plate, data in pairs(activeTrackings) do
 | |
|             local distance = #(GetEntityCoords(PlayerPedId()) - vector3(data.coords.x, data.coords.y, data.coords.z))
 | |
|             options[#options + 1] = {
 | |
|                 title = 'Kennzeichen: ' .. plate,
 | |
|                 description = 'Besitzer: ' .. data.owner .. ' | Entfernung: ' .. math.floor(distance) .. 'm | Letztes Update: ' .. math.floor((GetGameTimer() - data.lastUpdate) / 1000) .. 's',
 | |
|                 icon = 'fas fa-car',
 | |
|                 onSelect = function()
 | |
|                     SetNewWaypoint(data.coords.x, data.coords.y)
 | |
|                     QBCore.Functions.Notify('Wegpunkt zum Fahrzeug gesetzt!', 'success')
 | |
|                 end
 | |
|             }
 | |
|         end
 | |
|     end
 | |
|     
 | |
|     lib.registerContext({
 | |
|         id = 'active_trackings',
 | |
|         title = 'Aktive Trackings',
 | |
|         menu = 'tracking_menu',
 | |
|         options = options
 | |
|     })
 | |
|     
 | |
|     lib.showContext('active_trackings')
 | |
| end
 | |
| 
 | |
| function StopTracking()
 | |
|     local options = {}
 | |
|     
 | |
|     if next(activeTrackings) == nil then
 | |
|         options[#options + 1] = {
 | |
|             title = 'Keine aktiven Trackings',
 | |
|             description = 'Derzeit werden keine Fahrzeuge getrackt',
 | |
|             icon = 'fas fa-info-circle'
 | |
|         }
 | |
|     else
 | |
|         for plate, data in pairs(activeTrackings) do
 | |
|             options[#options + 1] = {
 | |
|                 title = 'Stoppe: ' .. plate,
 | |
|                 description = 'Tracking für dieses Fahrzeug beenden',
 | |
|                 icon = 'fas fa-stop',
 | |
|                 onSelect = function()
 | |
|                     StopVehicleTracking(plate)
 | |
|                 end
 | |
|             }
 | |
|         end
 | |
|     end
 | |
|     
 | |
|     lib.registerContext({
 | |
|         id = 'stop_tracking',
 | |
|         title = 'Tracking beenden',
 | |
|         menu = 'tracking_menu',
 | |
|         options = options
 | |
|     })
 | |
|     
 | |
|     lib.showContext('stop_tracking')
 | |
| end
 | |
| 
 | |
| function StopVehicleTracking(plate)
 | |
|     if activeTrackings[plate] then
 | |
|         activeTrackings[plate] = nil
 | |
|         
 | |
|         if trackingBlips[plate] then
 | |
|             RemoveBlip(trackingBlips[plate])
 | |
|             trackingBlips[plate] = nil
 | |
|         end
 | |
|         
 | |
|         TriggerServerEvent('tracking:server:stopTracking', plate)
 | |
|         QBCore.Functions.Notify('Tracking für ' .. plate .. ' beendet!', 'success')
 | |
|     end
 | |
| end
 | |
| 
 | |
| -- Update Tracking Position
 | |
| RegisterNetEvent('tracking:client:updatePosition', function(plate, coords)
 | |
|     if activeTrackings[plate] then
 | |
|         activeTrackings[plate].coords = coords
 | |
|         activeTrackings[plate].lastUpdate = GetGameTimer()
 | |
|         
 | |
|         if trackingBlips[plate] then
 | |
|             SetBlipCoords(trackingBlips[plate], coords.x, coords.y, coords.z)
 | |
|         end
 | |
|     end
 | |
| end)
 | |
| 
 | |
| -- Cleanup beim Disconnect
 | |
| AddEventHandler('onResourceStop', function(resourceName)
 | |
|     if GetCurrentResourceName() == resourceName then
 | |
|         for plate, blip in pairs(trackingBlips) do
 | |
|             RemoveBlip(blip)
 | |
|         end
 | |
|         
 | |
|         -- Hide DrawText if active when resource stops
 | |
|         if inTrackingZone then
 | |
|             exports['qb-core']:HideText()
 | |
|         end
 | |
|     end
 | |
| end)
 | 
