From 3a764e7c314d9479f4b2f9c0eb9273613dfdf114 Mon Sep 17 00:00:00 2001 From: Nordi98 Date: Tue, 1 Jul 2025 08:20:46 +0200 Subject: [PATCH] edi --- .../qb-vehicle-tracker/client/client.lua | 70 +++++++++++++++++-- .../qb-vehicle-tracker/locales/en.json | 11 ++- .../qb-vehicle-tracker/server/server.lua | 46 ++++++++++-- .../sql/vehicle_trackers.sql | 1 + 4 files changed, 114 insertions(+), 14 deletions(-) diff --git a/resources/[carscripts]/qb-vehicle-tracker/client/client.lua b/resources/[carscripts]/qb-vehicle-tracker/client/client.lua index b7cf8c03a..1cb326cf5 100644 --- a/resources/[carscripts]/qb-vehicle-tracker/client/client.lua +++ b/resources/[carscripts]/qb-vehicle-tracker/client/client.lua @@ -28,6 +28,31 @@ local function playSound(audioName, audioDict) end) end +local function promptTrackerName(serialNumber, currentName) + local input = lib.inputDialog(locale('vt_name_tracker') or 'Name Your Tracker', { + { + type = 'input', + label = locale('vt_tracker_name') or 'Tracker Name', + description = locale('vt_name_description') or 'Enter a name to help identify this tracker', + default = currentName or '', + required = true + } + }) + + if not input or input[1] == '' then return false end + + -- Update the tracker name on the server + lib.callback('qb_vehicle_tracker:updateTrackerName', false, function(success) + if success then + uiNotify(locale('vt_name_updated') or 'Tracker name updated', 'success') + else + uiNotify(locale('vt_name_failed') or 'Failed to update tracker name', 'error') + end + end, serialNumber, input[1]) + + return true +end + -- Events RegisterNetEvent('qb_vehicle_tracker:client:showTrackerMenu', function(citizenid) lib.callback('qb_vehicle_tracker:getPlayerTrackers', false, function(trackers) @@ -38,12 +63,45 @@ RegisterNetEvent('qb_vehicle_tracker:client:showTrackerMenu', function(citizenid local options = {} for _, tracker in ipairs(trackers) do + local displayName = tracker.name or tracker.vehiclePlate + table.insert(options, { - title = (locale('vt_vehicle_plate') or "Vehicle Plate") .. ': ' .. tracker.vehiclePlate, - description = (locale('vt_serial_number') or "Serial Number") .. ': ' .. tracker.serialNumber, - event = 'qb_vehicle_tracker:client:locateTracker', + title = displayName, + description = (locale('vt_vehicle_plate') or "Vehicle Plate") .. ': ' .. tracker.vehiclePlate, + metadata = { + {label = locale('vt_serial_number') or "Serial Number", value = tracker.serialNumber} + }, icon = 'car', - args = tracker.serialNumber + onSelect = function() + -- Show submenu for this tracker + lib.registerContext({ + id = 'tracker_options_' .. tracker.serialNumber, + title = displayName, + menu = 'vt_menu', + options = { + { + title = locale('vt_locate_tracker') or "Locate Vehicle", + description = locale('vt_locate_description') or "Show the vehicle's location on the map", + icon = 'location-dot', + onSelect = function() + TriggerEvent('qb_vehicle_tracker:client:locateTracker', tracker.serialNumber) + end + }, + { + title = locale('vt_rename_tracker') or "Rename Tracker", + description = locale('vt_rename_description') or "Change the name of this tracker", + icon = 'pen', + onSelect = function() + promptTrackerName(tracker.serialNumber, tracker.name) + -- Refresh the menu after renaming + Wait(500) + TriggerEvent('qb_vehicle_tracker:client:showTrackerMenu', citizenid) + end + } + } + }) + lib.showContext('tracker_options_' .. tracker.serialNumber) + end }) end @@ -160,7 +218,7 @@ end) RegisterNetEvent('qb_vehicle_tracker:client:locateTracker', function(serialNumber) if serialNumber == nil then uiNotify(locale('vt_not_placed'), 'error') return end - lib.callback('qb_vehicle_tracker:getTrackedVehicleBySerial', false, function(veh, vehCoords) + lib.callback('qb_vehicle_tracker:getTrackedVehicleBySerial', false, function(veh, vehCoords, trackerName) if veh == nil then uiNotify(locale('vt_unable_connect'), 'error') return end local blip = AddBlipForCoord(vehCoords.x , vehCoords.y, 0.0) @@ -173,7 +231,7 @@ RegisterNetEvent('qb_vehicle_tracker:client:locateTracker', function(serialNumbe PulseBlip(blip) SetBlipAsShortRange(blip, false) BeginTextCommandSetBlipName('STRING') - AddTextComponentSubstringPlayerName('Tracker ' .. veh) + AddTextComponentSubstringPlayerName(trackerName or ('Tracker ' .. veh)) EndTextCommandSetBlipName(blip) SetNewWaypoint(vehCoords.x , vehCoords.y) diff --git a/resources/[carscripts]/qb-vehicle-tracker/locales/en.json b/resources/[carscripts]/qb-vehicle-tracker/locales/en.json index 07194471e..2ab4c0ef2 100644 --- a/resources/[carscripts]/qb-vehicle-tracker/locales/en.json +++ b/resources/[carscripts]/qb-vehicle-tracker/locales/en.json @@ -18,5 +18,14 @@ "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_vehicle_plate": "Vehicle Plate", - "vt_serial_number": "Serial Number" + "vt_serial_number": "Serial Number", + "vt_name_tracker": "Name Your Tracker", + "vt_tracker_name": "Tracker Name", + "vt_name_description": "Enter a name to help identify this tracker", + "vt_name_updated": "Tracker name updated successfully", + "vt_name_failed": "Failed to update tracker name", + "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" } \ No newline at end of file diff --git a/resources/[carscripts]/qb-vehicle-tracker/server/server.lua b/resources/[carscripts]/qb-vehicle-tracker/server/server.lua index f6d8cb7fd..dc5f5b702 100644 --- a/resources/[carscripts]/qb-vehicle-tracker/server/server.lua +++ b/resources/[carscripts]/qb-vehicle-tracker/server/server.lua @@ -6,9 +6,9 @@ local function deleteOldTrackers() return MySQL.query.await('DELETE FROM `vehicle_trackers` WHERE startedAt < (NOW() - INTERVAL 7 DAY)') end -local function addTracker(serialNumber, vehiclePlate, owner) - return MySQL.prepare.await('INSERT INTO `vehicle_trackers` (`serialNumber`, `vehiclePlate`, `owner`) VALUES (?, ?, ?)', - { serialNumber, vehiclePlate, owner }) +local function addTracker(serialNumber, vehiclePlate, owner, name) + return MySQL.prepare.await('INSERT INTO `vehicle_trackers` (`serialNumber`, `vehiclePlate`, `owner`, `name`) VALUES (?, ?, ?, ?)', + { serialNumber, vehiclePlate, owner, name }) end local function deleteTracker(vehiclePlate) @@ -16,7 +16,7 @@ local function deleteTracker(vehiclePlate) end local function getTracker(serialNumber) - return MySQL.single.await('SELECT `serialNumber`, `vehiclePlate` FROM `vehicle_trackers` WHERE `serialNumber` = ? LIMIT 1', { serialNumber }) + return MySQL.single.await('SELECT `serialNumber`, `vehiclePlate`, `name` FROM `vehicle_trackers` WHERE `serialNumber` = ? LIMIT 1', { serialNumber }) end local function isTracked(vehiclePlate) @@ -24,7 +24,12 @@ local function isTracked(vehiclePlate) end local function getPlayerTrackers(owner) - return MySQL.query.await('SELECT `serialNumber`, `vehiclePlate` FROM `vehicle_trackers` WHERE `owner` = ?', { owner }) + return MySQL.query.await('SELECT `serialNumber`, `vehiclePlate`, `name` FROM `vehicle_trackers` WHERE `owner` = ?', { owner }) +end + +local function updateTrackerName(serialNumber, name) + return MySQL.prepare.await('UPDATE `vehicle_trackers` SET `name` = ? WHERE `serialNumber` = ?', + { name, serialNumber }) end -- Utility functions @@ -94,7 +99,7 @@ lib.callback.register('qb_vehicle_tracker:getTrackedVehicleBySerial', function(_ local vehCoords = GetEntityCoords(vehicleEntity) - return tracker.vehiclePlate, vector2(vehCoords.x, vehCoords.y) + return tracker.vehiclePlate, vector2(vehCoords.x, vehCoords.y), tracker.name end) lib.callback.register('qb_vehicle_tracker:isVehicleTracked', function(source, vehiclePlate) @@ -110,7 +115,8 @@ lib.callback.register('qb_vehicle_tracker:placeTracker', function(source, vehicl if not isPlayerNearVehicle(GetEntityCoords(GetPlayerPed(source)), vehiclePlate) then return false end local Player = QBCore.Functions.GetPlayer(source) - if not addTracker(serialNumber, trim(vehiclePlate), Player.PlayerData.citizenid) then return false end + local defaultName = "Tracker " .. trim(vehiclePlate) + if not addTracker(serialNumber, trim(vehiclePlate), Player.PlayerData.citizenid, defaultName) then return false end Player.Functions.RemoveItem(config.trackerItem, 1, slot) TriggerClientEvent('inventory:client:ItemBox', source, QBCore.Shared.Items[config.trackerItem], 'remove') @@ -139,3 +145,29 @@ lib.callback.register('qb_vehicle_tracker:getPlayerTrackers', function(source, c return getPlayerTrackers(citizenid) end) + +lib.callback.register('qb_vehicle_tracker:updateTrackerName', function(source, serialNumber, name) + if type(serialNumber) ~= "string" or string.len(serialNumber) < 11 or type(name) ~= "string" then return false end + + local Player = QBCore.Functions.GetPlayer(source) + + -- Get the tracker to verify it exists + local tracker = getTracker(serialNumber) + if not tracker then return false end + + -- Verify the player owns trackers with this serial number + local playerTrackers = getPlayerTrackers(Player.PlayerData.citizenid) + local isOwner = false + + for _, t in ipairs(playerTrackers) do + if t.serialNumber == serialNumber then + isOwner = true + break + end + end + + if not isOwner then return false end + + -- Update the name + return updateTrackerName(serialNumber, name) +end) diff --git a/resources/[carscripts]/qb-vehicle-tracker/sql/vehicle_trackers.sql b/resources/[carscripts]/qb-vehicle-tracker/sql/vehicle_trackers.sql index 06036dd22..2b14ed5e3 100644 --- a/resources/[carscripts]/qb-vehicle-tracker/sql/vehicle_trackers.sql +++ b/resources/[carscripts]/qb-vehicle-tracker/sql/vehicle_trackers.sql @@ -2,6 +2,7 @@ CREATE TABLE IF NOT EXISTS `vehicle_trackers` ( `serialNumber` varchar(11) NOT NULL, `vehiclePlate` varchar(11) NOT NULL, `owner` varchar(50) NULL, + `name` varchar(50) NULL, `startedAt` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, UNIQUE KEY `serialNumber` (`serialNumber`), KEY `vehiclePlate` (`vehiclePlate`)