From 7fd4b36bb45fd4ba50b1aeb7b81cfa857b9d4754 Mon Sep 17 00:00:00 2001 From: Nordi98 Date: Tue, 1 Jul 2025 08:39:38 +0200 Subject: [PATCH] ed --- .../qb-vehicle-tracker/client/client.lua | 124 ++++++++++++++++-- .../qb-vehicle-tracker/locales/en.json | 18 ++- 2 files changed, 130 insertions(+), 12 deletions(-) diff --git a/resources/[carscripts]/qb-vehicle-tracker/client/client.lua b/resources/[carscripts]/qb-vehicle-tracker/client/client.lua index 1cb326cf5..52a09524d 100644 --- a/resources/[carscripts]/qb-vehicle-tracker/client/client.lua +++ b/resources/[carscripts]/qb-vehicle-tracker/client/client.lua @@ -144,16 +144,54 @@ RegisterNetEvent('qb_vehicle_tracker:client:scanTracker', function(slot) playSound('TIMER_STOP', 'HUD_MINI_GAME_SOUNDSET') - local alert = lib.alertDialog({ - header = locale('vt_alert_title'), - content = locale('vt_alert_description'), - centered = true, - cancel = true - }) - - if alert == 'confirm' then - TriggerEvent('qb_vehicle_tracker:client:removeTracker', slot) + -- Create scanner options menu + local options = { + { + title = locale('vt_remove_tracker') or "Remove Tracker", + description = locale('vt_remove_description') or "Remove the tracking device from this vehicle", + icon = 'trash', + onSelect = function() + TriggerEvent('qb_vehicle_tracker:client:removeTracker', slot) + end + }, + { + title = locale('vt_locate_owner') or "Locate Tracker Owner", + description = locale('vt_locate_owner_description') or "Try to trace the signal back to the owner", + icon = 'satellite-dish', + onSelect = function() + TriggerEvent('qb_vehicle_tracker:client:locateTrackerOwner', GetVehicleNumberPlateText(vehicle)) + end + } + } + + -- Add police-only option to get phone number + local Player = QBCore.Functions.GetPlayerData() + local isPolice = false + for _, jobName in pairs(config.policeJobs) do + if Player.job.name == jobName then + isPolice = true + break + end end + + if isPolice then + table.insert(options, { + title = locale('vt_get_phone') or "Get Owner's Phone Number", + description = locale('vt_get_phone_description') or "Try to extract the owner's phone number", + icon = 'phone', + onSelect = function() + TriggerEvent('qb_vehicle_tracker:client:getTrackerOwnerPhone', GetVehicleNumberPlateText(vehicle)) + end + }) + end + + lib.registerContext({ + id = 'scanner_menu', + title = locale('vt_scanner_menu_header') or "Tracker Scanner", + options = options + }) + + lib.showContext('scanner_menu') end, GetVehicleNumberPlateText(vehicle)) else uiNotify(locale('vt_pb_cancelled'), 'error') @@ -212,7 +250,6 @@ RegisterNetEvent('qb_vehicle_tracker:client:removeTracker', function(slot) uiNotify(locale('vt_pb_cancelled'), 'error') end end, vehPlate) - end) RegisterNetEvent('qb_vehicle_tracker:client:locateTracker', function(serialNumber) @@ -242,6 +279,73 @@ RegisterNetEvent('qb_vehicle_tracker:client:locateTracker', function(serialNumbe end, serialNumber) end) +-- New events for advanced scanner features +RegisterNetEvent('qb_vehicle_tracker:client:locateTrackerOwner', function(vehiclePlate) + -- Perform a skill check + local success = lib.skillCheck({'easy', 'medium', 'medium'}, {'w', 'a', 's', 'd'}) + + if success then + lib.callback('qb_vehicle_tracker:getTrackerOwnerLocation', false, function(ownerCoords) + if not ownerCoords then + uiNotify(locale('vt_owner_not_found') or "Could not trace the signal back to the owner", 'error') + return + end + + local blip = AddBlipForCoord(ownerCoords.x, ownerCoords.y, 0.0) + + SetBlipSprite(blip, 280) + SetBlipColour(blip, 1) + SetBlipAlpha(blip, 250) + SetBlipDisplay(blip, 2) + SetBlipScale(blip, 1.0) + PulseBlip(blip) + SetBlipAsShortRange(blip, false) + BeginTextCommandSetBlipName('STRING') + AddTextComponentSubstringPlayerName(locale('vt_tracker_owner') or "Tracker Owner") + EndTextCommandSetBlipName(blip) + SetNewWaypoint(ownerCoords.x, ownerCoords.y) + + -- Store the blip with a unique key + local uniqueKey = "owner_" .. vehiclePlate + trackedVehicles[uniqueKey] = blip + + playSound('Hack_Success', 'DLC_HEIST_BIOLAB_PREP_HACKING_SOUNDS') + uiNotify(locale('vt_owner_located') or "Successfully traced signal to the owner's location", 'success') + + -- Remove the blip after some time + SetTimeout(60000, function() + if trackedVehicles[uniqueKey] then + RemoveBlip(trackedVehicles[uniqueKey]) + trackedVehicles[uniqueKey] = nil + end + end) + end, vehiclePlate) + else + uiNotify(locale('vt_trace_failed') or "Failed to trace the signal", 'error') + playSound('Failure', 'DLC_HEIST_HACKING_SNAKE_SOUNDS') + end +end) + +RegisterNetEvent('qb_vehicle_tracker:client:getTrackerOwnerPhone', function(vehiclePlate) + -- Perform a more difficult skill check for police + local success = lib.skillCheck({'medium', 'medium', 'hard'}, {'w', 'a', 's', 'd'}) + + if success then + lib.callback('qb_vehicle_tracker:getTrackerOwnerPhone', false, function(phoneNumber) + if not phoneNumber then + uiNotify(locale('vt_phone_not_found') or "Could not extract phone number from the tracker", 'error') + return + end + + playSound('Hack_Success', 'DLC_HEIST_BIOLAB_PREP_HACKING_SOUNDS') + uiNotify((locale('vt_phone_found') or "Phone number extracted: ") .. phoneNumber, 'success') + end, vehiclePlate) + else + uiNotify(locale('vt_phone_extraction_failed') or "Failed to extract phone number", 'error') + playSound('Failure', 'DLC_HEIST_HACKING_SNAKE_SOUNDS') + end +end) + CreateThread(function() while true do Wait(3000) diff --git a/resources/[carscripts]/qb-vehicle-tracker/locales/en.json b/resources/[carscripts]/qb-vehicle-tracker/locales/en.json index 2ab4c0ef2..8578907d2 100644 --- a/resources/[carscripts]/qb-vehicle-tracker/locales/en.json +++ b/resources/[carscripts]/qb-vehicle-tracker/locales/en.json @@ -16,7 +16,7 @@ "vt_pb_cancelled": "Cancelled", "vt_alert_title": "GPS Tracker Found!", "vt_alert_description": "You have found a GPS Tracker! Do you want to remove it?", - "vt_no_trackers_found": "You don't have any active trackers", + "vt_no_trackers_found": "You don't have any active trackers", "vt_vehicle_plate": "Vehicle Plate", "vt_serial_number": "Serial Number", "vt_name_tracker": "Name Your Tracker", @@ -27,5 +27,19 @@ "vt_locate_tracker": "Locate Vehicle", "vt_locate_description": "Show the vehicle's location on the map", "vt_rename_tracker": "Rename Tracker", - "vt_rename_description": "Change the name of this tracker" + "vt_rename_description": "Change the name of this tracker", + "vt_scanner_menu_header": "Tracker Scanner", + "vt_remove_tracker": "Remove Tracker", + "vt_remove_description": "Remove the tracking device from this vehicle", + "vt_locate_owner": "Locate Tracker Owner", + "vt_locate_owner_description": "Try to trace the signal back to the owner", + "vt_get_phone": "Get Owner's Phone Number", + "vt_get_phone_description": "Try to extract the owner's phone number", + "vt_owner_not_found": "Could not trace the signal back to the owner", + "vt_tracker_owner": "Tracker Owner", + "vt_owner_located": "Successfully traced signal to the owner's location", + "vt_trace_failed": "Failed to trace the signal", + "vt_phone_not_found": "Could not extract phone number from the tracker", + "vt_phone_found": "Phone number extracted: ", + "vt_phone_extraction_failed": "Failed to extract phone number" } \ No newline at end of file