1
0
Fork 0
forked from Simnation/Main
This commit is contained in:
Nordi98 2025-07-02 18:45:20 +02:00
parent 0d4416dbb4
commit d0f50224d7
4 changed files with 82 additions and 19 deletions

View file

@ -296,30 +296,42 @@ 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, trackerName) lib.callback('qb_vehicle_tracker:getTrackedVehicleBySerial', false, function(veh, vehCoords, trackerName, isLastKnown)
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)
SetBlipSprite(blip, 161) SetBlipSprite(blip, 161)
SetBlipColour(blip, 1) SetBlipColour(blip, isLastKnown and 3 or 1) -- Use yellow for last known position, red for current
SetBlipAlpha(blip, 250) SetBlipAlpha(blip, 250)
SetBlipDisplay(blip, 2) SetBlipDisplay(blip, 2)
SetBlipScale(blip, 2.5) SetBlipScale(blip, 2.5)
PulseBlip(blip) PulseBlip(blip)
SetBlipAsShortRange(blip, false) SetBlipAsShortRange(blip, false)
BeginTextCommandSetBlipName('STRING') BeginTextCommandSetBlipName('STRING')
AddTextComponentSubstringPlayerName(trackerName or ('Tracker ' .. veh))
local blipName = trackerName or ('Tracker ' .. veh)
if isLastKnown then
blipName = blipName .. " (Last Known)"
end
AddTextComponentSubstringPlayerName(blipName)
EndTextCommandSetBlipName(blip) EndTextCommandSetBlipName(blip)
SetNewWaypoint(vehCoords.x , vehCoords.y) SetNewWaypoint(vehCoords.x, vehCoords.y)
trackedVehicles[serialNumber] = blip trackedVehicles[serialNumber] = blip
playSound('10_SEC_WARNING', 'HUD_MINI_GAME_SOUNDSET') playSound('10_SEC_WARNING', 'HUD_MINI_GAME_SOUNDSET')
if isLastKnown then
uiNotify(locale('vt_last_known_position') or "Showing last known position of vehicle", 'info')
else
uiNotify(locale('vt_connection_success'), 'success') uiNotify(locale('vt_connection_success'), 'success')
end
end, serialNumber) end, serialNumber)
end) end)
-- New events for advanced scanner features -- New events for advanced scanner features
RegisterNetEvent('qb_vehicle_tracker:client:locateTrackerOwner', function(vehiclePlate) RegisterNetEvent('qb_vehicle_tracker:client:locateTrackerOwner', function(vehiclePlate)
-- Determine which skill check difficulty to use based on player job -- Determine which skill check difficulty to use based on player job

View file

@ -41,5 +41,7 @@
"vt_trace_failed": "Failed to trace the signal", "vt_trace_failed": "Failed to trace the signal",
"vt_phone_not_found": "Could not extract phone number from the tracker", "vt_phone_not_found": "Could not extract phone number from the tracker",
"vt_phone_found": "Phone number extracted: ", "vt_phone_found": "Phone number extracted: ",
"vt_phone_extraction_failed": "Failed to extract phone number" "vt_phone_extraction_failed": "Failed to extract phone number",
"vt_last_known_position":"Showing last known position of vehicle"
} }

View file

@ -3,7 +3,7 @@ local config = require 'config'
-- Database functions -- Database functions
local function deleteOldTrackers() local function deleteOldTrackers()
return MySQL.query.await('DELETE FROM `vehicle_trackers` WHERE startedAt < (NOW() - INTERVAL 7 DAY)') return true
end end
local function addTracker(serialNumber, vehiclePlate, owner, name, phoneNumber) local function addTracker(serialNumber, vehiclePlate, owner, name, phoneNumber)
@ -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`, `name`, `phoneNumber`, `owner` FROM `vehicle_trackers` WHERE `serialNumber` = ? LIMIT 1', { serialNumber }) return MySQL.single.await('SELECT `serialNumber`, `vehiclePlate`, `name`, `phoneNumber`, `owner`, `lastKnownX`, `lastKnownY`, `lastKnownZ`, `lastUpdated` FROM `vehicle_trackers` WHERE `serialNumber` = ? LIMIT 1', { serialNumber })
end end
local function isTracked(vehiclePlate) local function isTracked(vehiclePlate)
@ -32,6 +32,12 @@ local function updateTrackerName(serialNumber, name)
{ name, serialNumber }) { name, serialNumber })
end end
-- New function to update tracker position
local function updateTrackerPosition(serialNumber, coords)
return MySQL.prepare.await('UPDATE `vehicle_trackers` SET `lastKnownX` = ?, `lastKnownY` = ?, `lastKnownZ` = ? WHERE `serialNumber` = ?',
{ coords.x, coords.y, coords.z, serialNumber })
end
-- Utility functions -- Utility functions
local function getRandomSerialNumber() local function getRandomSerialNumber()
return lib.string.random('...........') return lib.string.random('...........')
@ -88,7 +94,7 @@ end)
-- Event Handler -- Event Handler
AddEventHandler('onResourceStart', function(resourceName) AddEventHandler('onResourceStart', function(resourceName)
if GetCurrentResourceName() == resourceName then if GetCurrentResourceName() == resourceName then
deleteOldTrackers() -- deleteOldTrackers() -- Comment out to prevent deletion after 7 days
end end
end) end)
@ -99,15 +105,30 @@ lib.callback.register('qb_vehicle_tracker:getTrackedVehicleBySerial', function(_
local tracker = getTracker(serialNumber) local tracker = getTracker(serialNumber)
if not tracker then return end if not tracker then return end
-- Try to find the vehicle in the world
local vehicleNetworkID = getVehicleNetworkIdByPlate(tracker.vehiclePlate) local vehicleNetworkID = getVehicleNetworkIdByPlate(tracker.vehiclePlate)
if not vehicleNetworkID then return end
-- If vehicle is found in the world
if vehicleNetworkID then
local vehicleEntity = NetworkGetEntityFromNetworkId(vehicleNetworkID) local vehicleEntity = NetworkGetEntityFromNetworkId(vehicleNetworkID)
if not DoesEntityExist(vehicleEntity) then return end if DoesEntityExist(vehicleEntity) then
local vehCoords = GetEntityCoords(vehicleEntity) local vehCoords = GetEntityCoords(vehicleEntity)
-- Update the last known position in the database
updateTrackerPosition(serialNumber, vehCoords)
return tracker.vehiclePlate, vector2(vehCoords.x, vehCoords.y), tracker.name return tracker.vehiclePlate, vector2(vehCoords.x, vehCoords.y), tracker.name
end
end
-- If vehicle is not found in the world, check if we have a last known position
if tracker.lastKnownX and tracker.lastKnownY then
-- Return the last known position
return tracker.vehiclePlate, vector2(tracker.lastKnownX, tracker.lastKnownY), tracker.name, true -- true indicates this is a last known position
end
-- No current or last known position available
return nil
end) end)
lib.callback.register('qb_vehicle_tracker:isVehicleTracked', function(source, vehiclePlate) lib.callback.register('qb_vehicle_tracker:isVehicleTracked', function(source, vehiclePlate)
@ -128,6 +149,13 @@ lib.callback.register('qb_vehicle_tracker:placeTracker', function(source, vehicl
if not addTracker(serialNumber, trim(vehiclePlate), Player.PlayerData.citizenid, defaultName, phoneNumber) then return false end if not addTracker(serialNumber, trim(vehiclePlate), Player.PlayerData.citizenid, defaultName, phoneNumber) then return false end
-- Try to get initial position
local vehicle = lib.getClosestVehicle(GetEntityCoords(GetPlayerPed(source)), 3.0, true)
if vehicle and DoesEntityExist(vehicle) then
local vehCoords = GetEntityCoords(vehicle)
updateTrackerPosition(serialNumber, vehCoords)
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')
@ -182,7 +210,7 @@ lib.callback.register('qb_vehicle_tracker:updateTrackerName', function(source, s
return updateTrackerName(serialNumber, name) return updateTrackerName(serialNumber, name)
end) end)
-- New callbacks for advanced scanner features -- Callbacks for advanced scanner features
lib.callback.register('qb_vehicle_tracker:getTrackerOwnerLocation', function(source, vehiclePlate) lib.callback.register('qb_vehicle_tracker:getTrackerOwnerLocation', function(source, vehiclePlate)
if type(vehiclePlate) ~= "string" then return nil end if type(vehiclePlate) ~= "string" then return nil end
@ -227,3 +255,24 @@ lib.callback.register('qb_vehicle_tracker:getTrackerOwnerPhone', function(source
return tracker.phoneNumber return tracker.phoneNumber
end) end)
-- Add this thread to periodically update positions of all tracked vehicles
CreateThread(function()
while true do
Wait(300000) -- Update every 5 minutes
-- Get all tracked vehicles
local trackers = MySQL.query.await('SELECT `serialNumber`, `vehiclePlate` FROM `vehicle_trackers`')
for _, tracker in ipairs(trackers) do
local vehicleNetworkID = getVehicleNetworkIdByPlate(tracker.vehiclePlate)
if vehicleNetworkID then
local vehicleEntity = NetworkGetEntityFromNetworkId(vehicleNetworkID)
if DoesEntityExist(vehicleEntity) then
local vehCoords = GetEntityCoords(vehicleEntity)
updateTrackerPosition(tracker.serialNumber, vehCoords)
end
end
end
end
end)

Binary file not shown.

Before

Width:  |  Height:  |  Size: 36 KiB

After

Width:  |  Height:  |  Size: 65 KiB

Before After
Before After