1
0
Fork 0
forked from Simnation/Main
Main/resources/[carscripts]/qb-vehicle-tracker/server/server.lua

142 lines
5.2 KiB
Lua
Raw Normal View History

2025-07-01 07:06:04 +02:00
local QBCore = exports['qb-core']:GetCoreObject()
local config = require 'config'
2025-07-01 08:02:31 +02:00
-- Database functions
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 })
end
local function deleteTracker(vehiclePlate)
return MySQL.prepare.await('DELETE FROM `vehicle_trackers` WHERE `vehiclePlate` = ?', { vehiclePlate })
end
local function getTracker(serialNumber)
return MySQL.single.await('SELECT `serialNumber`, `vehiclePlate` FROM `vehicle_trackers` WHERE `serialNumber` = ? LIMIT 1', { serialNumber })
end
local function isTracked(vehiclePlate)
return MySQL.scalar.await('SELECT `serialNumber` FROM `vehicle_trackers` WHERE `vehiclePlate` = ? LIMIT 1', { vehiclePlate })
end
local function getPlayerTrackers(owner)
return MySQL.query.await('SELECT `serialNumber`, `vehiclePlate` FROM `vehicle_trackers` WHERE `owner` = ?', { owner })
end
-- Utility functions
local function getRandomSerialNumber()
return lib.string.random('...........')
end
local function trim(plate)
return (plate:gsub("^%s*(.-)%s*$", "%1"))
end
local function getVehicleNetworkIdByPlate(vehiclePlate)
local vehicles = GetAllVehicles()
for _, vehicle in ipairs(vehicles) do
if trim(GetVehicleNumberPlateText(vehicle)) == trim(vehiclePlate) then
return NetworkGetNetworkIdFromEntity(vehicle)
end
end
return nil
end
local function isPlayerNearVehicle(playerCoords, vehiclePlate)
local vehicle = lib.getClosestVehicle(playerCoords, 3.0, true)
if not vehicle or not DoesEntityExist(vehicle) or GetVehicleNumberPlateText(vehicle) ~= vehiclePlate then
return false
end
return true
end
2025-07-01 07:06:04 +02:00
-- QB Usable Items
QBCore.Functions.CreateUseableItem(config.trackerItem, function(source, item)
2025-07-01 08:02:31 +02:00
TriggerClientEvent('qb_vehicle_tracker:client:placeTracker', source, item.slot, getRandomSerialNumber())
2025-07-01 07:06:04 +02:00
end)
QBCore.Functions.CreateUseableItem(config.trackerTabletItem, function(source, item)
2025-07-01 08:02:31 +02:00
local Player = QBCore.Functions.GetPlayer(source)
TriggerClientEvent('qb_vehicle_tracker:client:showTrackerMenu', source, Player.PlayerData.citizenid)
2025-07-01 07:06:04 +02:00
end)
QBCore.Functions.CreateUseableItem(config.trackerScannerItem, function(source, item)
TriggerClientEvent('qb_vehicle_tracker:client:scanTracker', source, item.slot)
end)
-- Event Handler
AddEventHandler('onResourceStart', function(resourceName)
2025-07-01 08:02:31 +02:00
if GetCurrentResourceName() == resourceName then
deleteOldTrackers()
2025-07-01 07:06:04 +02:00
end
end)
-- Callbacks
lib.callback.register('qb_vehicle_tracker:getTrackedVehicleBySerial', function(_, serialNumber)
if type(serialNumber) ~= "string" or string.len(serialNumber) < 11 then return end
2025-07-01 08:02:31 +02:00
local tracker = getTracker(serialNumber)
2025-07-01 07:06:04 +02:00
if not tracker then return end
2025-07-01 08:02:31 +02:00
local vehicleNetworkID = getVehicleNetworkIdByPlate(tracker.vehiclePlate)
2025-07-01 07:06:04 +02:00
if not vehicleNetworkID then return end
local vehicleEntity = NetworkGetEntityFromNetworkId(vehicleNetworkID)
if not DoesEntityExist(vehicleEntity) then return end
local vehCoords = GetEntityCoords(vehicleEntity)
return tracker.vehiclePlate, vector2(vehCoords.x, vehCoords.y)
end)
lib.callback.register('qb_vehicle_tracker:isVehicleTracked', function(source, vehiclePlate)
2025-07-01 08:02:31 +02:00
if type(vehiclePlate) ~= "string" or not isPlayerNearVehicle(GetEntityCoords(GetPlayerPed(source)), vehiclePlate) then
2025-07-01 07:06:04 +02:00
return false
end
2025-07-01 08:02:31 +02:00
return isTracked(trim(vehiclePlate))
2025-07-01 07:06:04 +02:00
end)
lib.callback.register('qb_vehicle_tracker:placeTracker', function(source, vehiclePlate, slot, serialNumber)
if type(vehiclePlate) ~= "string" or type(serialNumber) ~= "string" or string.len(serialNumber) < 11 then return false end
2025-07-01 08:02:31 +02:00
if not isPlayerNearVehicle(GetEntityCoords(GetPlayerPed(source)), vehiclePlate) then return false end
2025-07-01 07:06:04 +02:00
local Player = QBCore.Functions.GetPlayer(source)
2025-07-01 08:02:31 +02:00
if not addTracker(serialNumber, trim(vehiclePlate), Player.PlayerData.citizenid) then return false end
Player.Functions.RemoveItem(config.trackerItem, 1, slot)
TriggerClientEvent('inventory:client:ItemBox', source, QBCore.Shared.Items[config.trackerItem], 'remove')
2025-07-01 07:06:04 +02:00
return true
end)
lib.callback.register('qb_vehicle_tracker:removeTracker', function(source, vehiclePlate, slot)
2025-07-01 08:02:31 +02:00
if type(vehiclePlate) ~= "string" or not isPlayerNearVehicle(GetEntityCoords(GetPlayerPed(source)), vehiclePlate) then
2025-07-01 07:06:04 +02:00
return false
end
2025-07-01 08:02:31 +02:00
if not deleteTracker(trim(vehiclePlate)) then return false end
2025-07-01 07:06:04 +02:00
local Player = QBCore.Functions.GetPlayer(source)
if Player.Functions.RemoveItem(config.trackerScannerItem, 1, slot) then
TriggerClientEvent('inventory:client:ItemBox', source, QBCore.Shared.Items[config.trackerScannerItem], 'remove')
end
return true
2025-07-01 08:02:31 +02:00
end)
lib.callback.register('qb_vehicle_tracker:getPlayerTrackers', function(source, citizenid)
local Player = QBCore.Functions.GetPlayer(source)
if Player.PlayerData.citizenid ~= citizenid then return {} end
return getPlayerTrackers(citizenid)
end)