forked from Simnation/Main
edi
This commit is contained in:
parent
10000b6b8c
commit
3a764e7c31
4 changed files with 114 additions and 14 deletions
|
@ -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)
|
||||||
|
|
||||||
|
|
|
@ -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"
|
||||||
}
|
}
|
|
@ -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)
|
||||||
|
|
|
@ -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`)
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue