forked from Simnation/Main
ed
This commit is contained in:
parent
0d4416dbb4
commit
d0f50224d7
4 changed files with 82 additions and 19 deletions
|
@ -296,30 +296,42 @@ 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, 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
|
||||
|
||||
local blip = AddBlipForCoord(vehCoords.x , vehCoords.y, 0.0)
|
||||
local blip = AddBlipForCoord(vehCoords.x, vehCoords.y, 0.0)
|
||||
|
||||
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)
|
||||
SetBlipDisplay(blip, 2)
|
||||
SetBlipScale(blip, 2.5)
|
||||
PulseBlip(blip)
|
||||
SetBlipAsShortRange(blip, false)
|
||||
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)
|
||||
SetNewWaypoint(vehCoords.x , vehCoords.y)
|
||||
SetNewWaypoint(vehCoords.x, vehCoords.y)
|
||||
|
||||
trackedVehicles[serialNumber] = blip
|
||||
|
||||
playSound('10_SEC_WARNING', 'HUD_MINI_GAME_SOUNDSET')
|
||||
uiNotify(locale('vt_connection_success'), 'success')
|
||||
|
||||
if isLastKnown then
|
||||
uiNotify(locale('vt_last_known_position') or "Showing last known position of vehicle", 'info')
|
||||
else
|
||||
uiNotify(locale('vt_connection_success'), 'success')
|
||||
end
|
||||
end, serialNumber)
|
||||
end)
|
||||
|
||||
|
||||
-- New events for advanced scanner features
|
||||
RegisterNetEvent('qb_vehicle_tracker:client:locateTrackerOwner', function(vehiclePlate)
|
||||
-- Determine which skill check difficulty to use based on player job
|
||||
|
|
|
@ -41,5 +41,7 @@
|
|||
"vt_trace_failed": "Failed to trace the signal",
|
||||
"vt_phone_not_found": "Could not extract phone number from the tracker",
|
||||
"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"
|
||||
|
||||
}
|
|
@ -3,7 +3,7 @@ local config = require 'config'
|
|||
|
||||
-- Database functions
|
||||
local function deleteOldTrackers()
|
||||
return MySQL.query.await('DELETE FROM `vehicle_trackers` WHERE startedAt < (NOW() - INTERVAL 7 DAY)')
|
||||
return true
|
||||
end
|
||||
|
||||
local function addTracker(serialNumber, vehiclePlate, owner, name, phoneNumber)
|
||||
|
@ -16,7 +16,7 @@ local function deleteTracker(vehiclePlate)
|
|||
end
|
||||
|
||||
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
|
||||
|
||||
local function isTracked(vehiclePlate)
|
||||
|
@ -32,6 +32,12 @@ local function updateTrackerName(serialNumber, name)
|
|||
{ name, serialNumber })
|
||||
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
|
||||
local function getRandomSerialNumber()
|
||||
return lib.string.random('...........')
|
||||
|
@ -88,7 +94,7 @@ end)
|
|||
-- Event Handler
|
||||
AddEventHandler('onResourceStart', function(resourceName)
|
||||
if GetCurrentResourceName() == resourceName then
|
||||
deleteOldTrackers()
|
||||
-- deleteOldTrackers() -- Comment out to prevent deletion after 7 days
|
||||
end
|
||||
end)
|
||||
|
||||
|
@ -99,15 +105,30 @@ lib.callback.register('qb_vehicle_tracker:getTrackedVehicleBySerial', function(_
|
|||
local tracker = getTracker(serialNumber)
|
||||
if not tracker then return end
|
||||
|
||||
-- Try to find the vehicle in the world
|
||||
local vehicleNetworkID = getVehicleNetworkIdByPlate(tracker.vehiclePlate)
|
||||
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), tracker.name
|
||||
|
||||
-- If vehicle is found in the world
|
||||
if vehicleNetworkID then
|
||||
local vehicleEntity = NetworkGetEntityFromNetworkId(vehicleNetworkID)
|
||||
if DoesEntityExist(vehicleEntity) then
|
||||
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
|
||||
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)
|
||||
|
||||
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
|
||||
|
||||
-- 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)
|
||||
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)
|
||||
end)
|
||||
|
||||
-- New callbacks for advanced scanner features
|
||||
-- Callbacks for advanced scanner features
|
||||
lib.callback.register('qb_vehicle_tracker:getTrackerOwnerLocation', function(source, vehiclePlate)
|
||||
if type(vehiclePlate) ~= "string" then return nil end
|
||||
|
||||
|
@ -227,3 +255,24 @@ lib.callback.register('qb_vehicle_tracker:getTrackerOwnerPhone', function(source
|
|||
|
||||
return tracker.phoneNumber
|
||||
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 |
Loading…
Add table
Add a link
Reference in a new issue