1
0
Fork 0
forked from Simnation/Main
This commit is contained in:
Nordi98 2025-07-01 08:20:46 +02:00
parent 10000b6b8c
commit 3a764e7c31
4 changed files with 114 additions and 14 deletions

View file

@ -28,6 +28,31 @@ local function playSound(audioName, audioDict)
end) end)
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 -- Events
RegisterNetEvent('qb_vehicle_tracker:client:showTrackerMenu', function(citizenid) RegisterNetEvent('qb_vehicle_tracker:client:showTrackerMenu', function(citizenid)
lib.callback('qb_vehicle_tracker:getPlayerTrackers', false, function(trackers) lib.callback('qb_vehicle_tracker:getPlayerTrackers', false, function(trackers)
@ -38,12 +63,45 @@ RegisterNetEvent('qb_vehicle_tracker:client:showTrackerMenu', function(citizenid
local options = {} local options = {}
for _, tracker in ipairs(trackers) do for _, tracker in ipairs(trackers) do
local displayName = tracker.name or tracker.vehiclePlate
table.insert(options, { table.insert(options, {
title = (locale('vt_vehicle_plate') or "Vehicle Plate") .. ': ' .. tracker.vehiclePlate, title = displayName,
description = (locale('vt_serial_number') or "Serial Number") .. ': ' .. tracker.serialNumber, description = (locale('vt_vehicle_plate') or "Vehicle Plate") .. ': ' .. tracker.vehiclePlate,
event = 'qb_vehicle_tracker:client:locateTracker', metadata = {
{label = locale('vt_serial_number') or "Serial Number", value = tracker.serialNumber}
},
icon = 'car', 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 end
@ -160,7 +218,7 @@ end)
RegisterNetEvent('qb_vehicle_tracker:client:locateTracker', function(serialNumber) RegisterNetEvent('qb_vehicle_tracker:client:locateTracker', function(serialNumber)
if serialNumber == nil then uiNotify(locale('vt_not_placed'), 'error') return end 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 if veh == nil then uiNotify(locale('vt_unable_connect'), 'error') return end
local blip = AddBlipForCoord(vehCoords.x , vehCoords.y, 0.0) local blip = AddBlipForCoord(vehCoords.x , vehCoords.y, 0.0)
@ -173,7 +231,7 @@ RegisterNetEvent('qb_vehicle_tracker:client:locateTracker', function(serialNumbe
PulseBlip(blip) PulseBlip(blip)
SetBlipAsShortRange(blip, false) SetBlipAsShortRange(blip, false)
BeginTextCommandSetBlipName('STRING') BeginTextCommandSetBlipName('STRING')
AddTextComponentSubstringPlayerName('Tracker ' .. veh) AddTextComponentSubstringPlayerName(trackerName or ('Tracker ' .. veh))
EndTextCommandSetBlipName(blip) EndTextCommandSetBlipName(blip)
SetNewWaypoint(vehCoords.x , vehCoords.y) SetNewWaypoint(vehCoords.x , vehCoords.y)

View file

@ -18,5 +18,14 @@
"vt_alert_description": "You have found a GPS Tracker! Do you want to remove it?", "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_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"
} }

View file

@ -6,9 +6,9 @@ local function deleteOldTrackers()
return MySQL.query.await('DELETE FROM `vehicle_trackers` WHERE startedAt < (NOW() - INTERVAL 7 DAY)') return MySQL.query.await('DELETE FROM `vehicle_trackers` WHERE startedAt < (NOW() - INTERVAL 7 DAY)')
end end
local function addTracker(serialNumber, vehiclePlate, owner) local function addTracker(serialNumber, vehiclePlate, owner, name)
return MySQL.prepare.await('INSERT INTO `vehicle_trackers` (`serialNumber`, `vehiclePlate`, `owner`) VALUES (?, ?, ?)', return MySQL.prepare.await('INSERT INTO `vehicle_trackers` (`serialNumber`, `vehiclePlate`, `owner`, `name`) VALUES (?, ?, ?, ?)',
{ serialNumber, vehiclePlate, owner }) { serialNumber, vehiclePlate, owner, name })
end end
local function deleteTracker(vehiclePlate) local function deleteTracker(vehiclePlate)
@ -16,7 +16,7 @@ local function deleteTracker(vehiclePlate)
end end
local function getTracker(serialNumber) 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 end
local function isTracked(vehiclePlate) local function isTracked(vehiclePlate)
@ -24,7 +24,12 @@ local function isTracked(vehiclePlate)
end end
local function getPlayerTrackers(owner) 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 end
-- Utility functions -- Utility functions
@ -94,7 +99,7 @@ lib.callback.register('qb_vehicle_tracker:getTrackedVehicleBySerial', function(_
local vehCoords = GetEntityCoords(vehicleEntity) local vehCoords = GetEntityCoords(vehicleEntity)
return tracker.vehiclePlate, vector2(vehCoords.x, vehCoords.y) return tracker.vehiclePlate, vector2(vehCoords.x, vehCoords.y), tracker.name
end) end)
lib.callback.register('qb_vehicle_tracker:isVehicleTracked', function(source, vehiclePlate) 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 if not isPlayerNearVehicle(GetEntityCoords(GetPlayerPed(source)), vehiclePlate) then return false end
local Player = QBCore.Functions.GetPlayer(source) 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) Player.Functions.RemoveItem(config.trackerItem, 1, slot)
TriggerClientEvent('inventory:client:ItemBox', source, QBCore.Shared.Items[config.trackerItem], 'remove') 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) return getPlayerTrackers(citizenid)
end) 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)

View file

@ -2,6 +2,7 @@ CREATE TABLE IF NOT EXISTS `vehicle_trackers` (
`serialNumber` varchar(11) NOT NULL, `serialNumber` varchar(11) NOT NULL,
`vehiclePlate` varchar(11) NOT NULL, `vehiclePlate` varchar(11) NOT NULL,
`owner` varchar(50) NULL, `owner` varchar(50) NULL,
`name` varchar(50) NULL,
`startedAt` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, `startedAt` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
UNIQUE KEY `serialNumber` (`serialNumber`), UNIQUE KEY `serialNumber` (`serialNumber`),
KEY `vehiclePlate` (`vehiclePlate`) KEY `vehiclePlate` (`vehiclePlate`)