From 21cdb3d8cb4de853802ba348b6f67d42a90d1b24 Mon Sep 17 00:00:00 2001 From: Marcus McCormick Date: Sat, 12 Nov 2022 22:07:12 -0600 Subject: [PATCH 1/6] New Functionality: - Trackers now track vehicle distance from player. - When viewing Tracker vehicles, there is now a Ping button. This refreshes the status of the vehicle (health, distance from player) --- client/client.lua | 28 ++++++++++++++++++++++++++-- config.js | 4 +++- nui/assets/js/app.js | 37 +++++++++++++++++++++++-------------- nui/ui.html | 2 ++ 4 files changed, 54 insertions(+), 17 deletions(-) diff --git a/client/client.lua b/client/client.lua index 646ea6a..b5d0700 100644 --- a/client/client.lua +++ b/client/client.lua @@ -78,8 +78,9 @@ RegisterNetEvent("um-hackerphone:client:vehicletracker", function() local vehicleinfo = { ["plate"] = QBCore.Functions.GetPlate(vehicle), ["vehname"] = GetDisplayNameFromVehicleModel(GetEntityModel(vehicle)):lower(), - ["vehengine"] = GetVehicleEngineHealth(vehicle), - ["vehicle"] = vehicle + ["vehengine"] = math.floor(GetVehicleEngineHealth(vehicle)), + ["vehicle"] = vehicle, + ["vehdistance"] = getDistanceFromVehicle(vehicle) } if #(pos - vehpos) < 2 then Anim() @@ -100,6 +101,29 @@ RegisterNetEvent("um-hackerphone:client:vehicletracker", function() end end) +RegisterNUICallback('um-hackerphone:nuicallback:ping', function(vehicle, id) + local ped = PlayerPedId() + local pos = GetEntityCoords(ped) + local vehpos = GetEntityCoords(vehicle) + local vehicleinfo = { + ["plate"] = QBCore.Functions.GetPlate(vehicle), + ["vehname"] = GetDisplayNameFromVehicleModel(GetEntityModel(vehicle)):lower(), + ["vehengine"] = math.floor(GetVehicleEngineHealth(vehicle)), + ["vehicle"] = vehicle, + ["vehdistance"] = getDistanceFromVehicle(vehicle) + } + SendNUIMessage({nuimessage = 'ping', vehicleinfo = vehicleinfo}) + return getDistanceFromVehicle(vehicle) +end) + +function getDistanceFromVehicle(vehicle) + local ped = PlayerPedId() + local pos = GetEntityCoords(ped) + local vehpos = GetEntityCoords(vehicle) + local distance = math.floor(GetDistanceBetweenCoords(pos, vehpos)) + return distance +end + RegisterNetEvent("um-hackerphone:client:notify", function() SendNUIMessage({nuimessage = 'error'}) end) diff --git a/config.js b/config.js index 9473ab0..1eb93fb 100644 --- a/config.js +++ b/config.js @@ -2,7 +2,7 @@ UMHackerPhone = []; UMHackerPhone.CloseKey = "Escape" -UMHackerPhone.BlackoutSeconds = 10 +UMHackerPhone.BlackoutSeconds = 45 UMHackerPhone.Cams = { [1] : "Pacific Bank CAM#1", @@ -51,6 +51,7 @@ UMHackerPhone.Lang = { userinfo: "User Information", vehicle: "Vehicle", vehicletrack: "Vehicle Tracking", + distance: "Distance: ", blackout: "Blackout", plate: "Plate: ", model: "Model: ", @@ -63,4 +64,5 @@ UMHackerPhone.Lang = { explosion: "Explosion", hackpower: "Hack power station", fixpower: "Fix power station Seconds: ", + ping: "Ping", } \ No newline at end of file diff --git a/nui/assets/js/app.js b/nui/assets/js/app.js index 78c1ab4..05137b5 100644 --- a/nui/assets/js/app.js +++ b/nui/assets/js/app.js @@ -48,7 +48,7 @@ const hackerphone = Vue.createApp({ break; case "vbool": this.vbool = true - this.carlists.push({trackerid: 'Tracker - ' + d.vehicleinfo.vehicle, vehicleinfoplate: d.vehicleinfo.plate, vehicleinfoname: d.vehicleinfo.vehname, vehicleinfoengine: d.vehicleinfo.vehengine, vehicle: d.vehicleinfo.vehicle}); + this.carlists.push({trackerid: 'Tracker - ' + d.vehicleinfo.vehicle, vehicleinfoplate: d.vehicleinfo.plate, vehicleinfoname: d.vehicleinfo.vehname, vehicleinfoengine: d.vehicleinfo.vehengine, vehicle: d.vehicleinfo.vehicle, vehicledistance: d.vehicleinfo.vehdistance}); break; case "cbool": this.cbool = true @@ -59,6 +59,10 @@ const hackerphone = Vue.createApp({ this.erroricon = "fa-mobile-screen" this.pageReset() break; + case "ping": + this.vbool = true + this.carlists.push({trackerid: 'Tracker - ' + d.vehicleinfo.vehicle, vehicleinfoplate: d.vehicleinfo.plate, vehicleinfoname: d.vehicleinfo.vehname, vehicleinfoengine: d.vehicleinfo.vehengine, vehicle: d.vehicleinfo.vehicle, vehicledistance: d.vehicleinfo.vehdistance}); + break; } }, postMessage: function(url,data) { @@ -92,22 +96,27 @@ const hackerphone = Vue.createApp({ x.remove() } }, + pingButton: function(key, id) { + this.newlocation = this.postMessage('um-hackerphone:nuicallback:ping', key, id) + const x = document.getElementById(id); + x.remove() + }, blackoutButton: function(post) { - this.hackblackout = true - if (!this.timerready) { - this.postMessage(post) - this.timerready = true - this.interval = setInterval(() => { - if (this.timer === 0) { - this.hackblackout = false - this.timerready = false - this.postMessage(post) - this.timer = UMHackerPhone.BlackoutSeconds - clearInterval(this.interval) + this.hackblackout = true /* set blackout to true */ + if (!this.timerready) { /* if the time has not been triggered to start*/ + this.postMessage(post) + this.timerready = true /* set time start trigger to True */ + this.interval = setInterval(() => { /* every second (1000ms, as noted at end of this function) do this */ + if (this.timer === 0) { /* if timer has hit zero */ + this.hackblackout = false /* stop blackout */ + this.timerready = false /*turn timer trigger back off*/ + this.postMessage(post) + this.timer = UMHackerPhone.BlackoutSeconds /*set timer back to value from config.js*/ + clearInterval(this.interval) /* set timer interval back to null */ } else { - this.timer-- + this.timer-- /* subtract 1 from the timer */ } - }, 1000) + }, 1000)/* time interval, 1000ms=1s */ } }, vehicleExplosion: function(post,key,id) { diff --git a/nui/ui.html b/nui/ui.html index 2906170..24593fb 100644 --- a/nui/ui.html +++ b/nui/ui.html @@ -45,9 +45,11 @@

{{item.trackerid}}

  • {{lang.plate}} {{item.vehicleinfoplate}}
  • {{lang.model}} {{item.vehicleinfoname}}
  • {{lang.engine}}{{item.vehicleinfoengine}}
  • +
  • {{lang.distance}}{{item.vehicledistance}}
  • + From 511c7ae36d741900c8f967432e68e1e9f1a70d97 Mon Sep 17 00:00:00 2001 From: Marcus McCormick Date: Sat, 12 Nov 2022 22:14:04 -0600 Subject: [PATCH 2/6] Cleanup --- config.js | 2 +- nui/assets/js/app.js | 26 +++++++++++++------------- 2 files changed, 14 insertions(+), 14 deletions(-) diff --git a/config.js b/config.js index 1eb93fb..d78e37d 100644 --- a/config.js +++ b/config.js @@ -2,7 +2,7 @@ UMHackerPhone = []; UMHackerPhone.CloseKey = "Escape" -UMHackerPhone.BlackoutSeconds = 45 +UMHackerPhone.BlackoutSeconds = 10 UMHackerPhone.Cams = { [1] : "Pacific Bank CAM#1", diff --git a/nui/assets/js/app.js b/nui/assets/js/app.js index 05137b5..7deaafa 100644 --- a/nui/assets/js/app.js +++ b/nui/assets/js/app.js @@ -102,21 +102,21 @@ const hackerphone = Vue.createApp({ x.remove() }, blackoutButton: function(post) { - this.hackblackout = true /* set blackout to true */ - if (!this.timerready) { /* if the time has not been triggered to start*/ - this.postMessage(post) - this.timerready = true /* set time start trigger to True */ - this.interval = setInterval(() => { /* every second (1000ms, as noted at end of this function) do this */ - if (this.timer === 0) { /* if timer has hit zero */ - this.hackblackout = false /* stop blackout */ - this.timerready = false /*turn timer trigger back off*/ - this.postMessage(post) - this.timer = UMHackerPhone.BlackoutSeconds /*set timer back to value from config.js*/ - clearInterval(this.interval) /* set timer interval back to null */ + this.hackblackout = true + if (!this.timerready) { + this.postMessage(post) + this.timerready = true + this.interval = setInterval(() => { + if (this.timer === 0) { + this.hackblackout = false + this.timerready = false + this.postMessage(post) + this.timer = UMHackerPhone.BlackoutSeconds + clearInterval(this.interval) } else { - this.timer-- /* subtract 1 from the timer */ + this.timer-- } - }, 1000)/* time interval, 1000ms=1s */ + }, 1000) } }, vehicleExplosion: function(post,key,id) { From 1c30541eba4be1dfa48de3d9a7f4bd3dd6d6f1a2 Mon Sep 17 00:00:00 2001 From: Marcus McCormick Date: Wed, 16 Nov 2022 03:12:51 -0600 Subject: [PATCH 3/6] Added distance tracking for vehicles that have a tracker placed on them. Swapped data gathering of vehicle info to be NetID based. Next Change: Storing Vehicle data in database for persistence. --- client/client.lua | 52 ++++++++++++++++++++++++++++---------------- config.js | 2 +- nui/assets/js/app.js | 26 +++++++++++----------- 3 files changed, 47 insertions(+), 33 deletions(-) diff --git a/client/client.lua b/client/client.lua index b5d0700..f1ac0a0 100644 --- a/client/client.lua +++ b/client/client.lua @@ -70,15 +70,16 @@ RegisterNetEvent("um-hackerphone:client:centralchip", function() end) RegisterNetEvent("um-hackerphone:client:vehicletracker", function() - local vehicle = QBCore.Functions.GetClosestVehicle() + local vehicle = NetworkGetNetworkIdFromEntity(QBCore.Functions.GetClosestVehicle()) if vehicle ~= nil and vehicle ~= 0 then local ped = PlayerPedId() local pos = GetEntityCoords(ped) - local vehpos = GetEntityCoords(vehicle) + local veh = NetworkGetEntityFromNetworkId(vehicle) + local vehpos = GetEntityCoords(veh) local vehicleinfo = { - ["plate"] = QBCore.Functions.GetPlate(vehicle), - ["vehname"] = GetDisplayNameFromVehicleModel(GetEntityModel(vehicle)):lower(), - ["vehengine"] = math.floor(GetVehicleEngineHealth(vehicle)), + ["plate"] = QBCore.Functions.GetPlate(NetworkGetEntityFromNetworkId(vehicle)), + ["vehname"] = GetDisplayNameFromVehicleModel(GetEntityModel(NetworkGetEntityFromNetworkId(vehicle))), + ["vehengine"] = math.floor(GetVehicleEngineHealth(NetworkGetEntityFromNetworkId(vehicle))), ["vehicle"] = vehicle, ["vehdistance"] = getDistanceFromVehicle(vehicle) } @@ -102,24 +103,37 @@ RegisterNetEvent("um-hackerphone:client:vehicletracker", function() end) RegisterNUICallback('um-hackerphone:nuicallback:ping', function(vehicle, id) - local ped = PlayerPedId() - local pos = GetEntityCoords(ped) - local vehpos = GetEntityCoords(vehicle) - local vehicleinfo = { - ["plate"] = QBCore.Functions.GetPlate(vehicle), - ["vehname"] = GetDisplayNameFromVehicleModel(GetEntityModel(vehicle)):lower(), - ["vehengine"] = math.floor(GetVehicleEngineHealth(vehicle)), - ["vehicle"] = vehicle, - ["vehdistance"] = getDistanceFromVehicle(vehicle) - } - SendNUIMessage({nuimessage = 'ping', vehicleinfo = vehicleinfo}) - return getDistanceFromVehicle(vehicle) + -- Swapped to Network + if DoesEntityExist(NetworkGetEntityFromNetworkId(vehicle)) then + local ped = PlayerPedId() + local pos = GetEntityCoords(ped) + local veh = NetworkGetEntityFromNetworkId(vehicle) + local vehpos = GetEntityCoords(veh) + local vehicleinfo = { + ["plate"] = QBCore.Functions.GetPlate(NetworkGetEntityFromNetworkId(vehicle)), + ["vehname"] = GetDisplayNameFromVehicleModel(GetEntityModel(NetworkGetEntityFromNetworkId(vehicle))):lower(), + ["vehengine"] = math.floor(GetVehicleEngineHealth(NetworkGetEntityFromNetworkId(vehicle))), + ["vehicle"] = vehicle, + ["vehdistance"] = getDistanceFromVehicle(vehicle) + } + SendNUIMessage({nuimessage = 'vbool', vehicleinfo = vehicleinfo}) + else + local vehicleinfo = { + ["plate"] = "CORRUPTED", + ["vehname"] = "CORRUPTED", + ["vehengine"] = "CORRUPTED", + ["vehicle"] = "CORRUPTED", + ["vehdistance"] = "CORRUPTED" + } + SendNUIMessage({nuimessage = 'vbool', vehicleinfo = vehicleinfo}) + end end) function getDistanceFromVehicle(vehicle) local ped = PlayerPedId() local pos = GetEntityCoords(ped) - local vehpos = GetEntityCoords(vehicle) + local veh = NetworkGetEntityFromNetworkId(vehicle) + local vehpos = GetEntityCoords(veh) local distance = math.floor(GetDistanceBetweenCoords(pos, vehpos)) return distance end @@ -133,7 +147,7 @@ RegisterNUICallback("um-hackerphone:nuicallback:targetinformation", function() end) RegisterNUICallback("um-hackerphone:broken:vehicle", function(vehicle) - local vehpos = GetEntityCoords(vehicle) + local vehpos = GetEntityCoords(NetworkGetEntityFromNetworkId(vehicle)) AddExplosion(vehpos.x, vehpos.y, vehpos.z, 7, 0.5, true, false, true) end) diff --git a/config.js b/config.js index d78e37d..1eb93fb 100644 --- a/config.js +++ b/config.js @@ -2,7 +2,7 @@ UMHackerPhone = []; UMHackerPhone.CloseKey = "Escape" -UMHackerPhone.BlackoutSeconds = 10 +UMHackerPhone.BlackoutSeconds = 45 UMHackerPhone.Cams = { [1] : "Pacific Bank CAM#1", diff --git a/nui/assets/js/app.js b/nui/assets/js/app.js index 7deaafa..05137b5 100644 --- a/nui/assets/js/app.js +++ b/nui/assets/js/app.js @@ -102,21 +102,21 @@ const hackerphone = Vue.createApp({ x.remove() }, blackoutButton: function(post) { - this.hackblackout = true - if (!this.timerready) { - this.postMessage(post) - this.timerready = true - this.interval = setInterval(() => { - if (this.timer === 0) { - this.hackblackout = false - this.timerready = false - this.postMessage(post) - this.timer = UMHackerPhone.BlackoutSeconds - clearInterval(this.interval) + this.hackblackout = true /* set blackout to true */ + if (!this.timerready) { /* if the time has not been triggered to start*/ + this.postMessage(post) + this.timerready = true /* set time start trigger to True */ + this.interval = setInterval(() => { /* every second (1000ms, as noted at end of this function) do this */ + if (this.timer === 0) { /* if timer has hit zero */ + this.hackblackout = false /* stop blackout */ + this.timerready = false /*turn timer trigger back off*/ + this.postMessage(post) + this.timer = UMHackerPhone.BlackoutSeconds /*set timer back to value from config.js*/ + clearInterval(this.interval) /* set timer interval back to null */ } else { - this.timer-- + this.timer-- /* subtract 1 from the timer */ } - }, 1000) + }, 1000)/* time interval, 1000ms=1s */ } }, vehicleExplosion: function(post,key,id) { From 7d4b6f1f4b821a1f1507a49874e8d088456566af Mon Sep 17 00:00:00 2001 From: Marcus McCormick Date: Wed, 16 Nov 2022 12:15:46 -0600 Subject: [PATCH 4/6] DB Integration start --- fxmanifest.lua | 4 ++-- server/dbm.lua | 52 ++++++++++++++++++++++++++++++++++++++++++++++++++ trackers.sql | 11 +++++++++++ 3 files changed, 65 insertions(+), 2 deletions(-) create mode 100644 server/dbm.lua create mode 100644 trackers.sql diff --git a/fxmanifest.lua b/fxmanifest.lua index 7245080..f0e90f5 100644 --- a/fxmanifest.lua +++ b/fxmanifest.lua @@ -1,7 +1,7 @@ fx_version 'cerulean' game 'gta5' -author 'uyuyorum' +author 'uyuyorum, Mickeystix' description 'UM - Hacker Phone' version '2.0.0' ui_page 'nui/ui.html' @@ -16,4 +16,4 @@ files { } client_scripts {'client/anim.lua','client/client.lua'} -server_script 'server/server.lua' \ No newline at end of file +server_scripts {'@oxmysql/lib/MySQL.lua','server/server.lua','server/dbm.lua'} \ No newline at end of file diff --git a/server/dbm.lua b/server/dbm.lua new file mode 100644 index 0000000..f819dd3 --- /dev/null +++ b/server/dbm.lua @@ -0,0 +1,52 @@ +local QBCore = exports['qb-core']:GetCoreObject() + +-- Get CitizenIDs from Player License +function GetCitizenID(license) + local result = MySQL.query.await("SELECT citizenid FROM players WHERE license = ?", {license,}) + if result ~= nil then + return result + else + print("Cannot find a CitizenID for License: "..license) + return nil + end +end + +function GetNameFromId(cid) + local result = MySQL.scalar.await('SELECT charinfo FROM players WHERE citizenid = @citizenid', { ['@citizenid'] = cid }) + if result ~= nil then + local charinfo = json.decode(result) + local fullname = charinfo['firstname']..' '..charinfo['lastname'] + return fullname + else + --print('Player does not exist') + return nil + end + -- return exports.oxmysql:executeSync('SELECT firstname, lastname FROM `users` WHERE id = :id LIMIT 1', { id = cid }) +end + +function GetPlayerVehicles(cid, cb) + return MySQL.query.await('SELECT id, plate, vehicle FROM player_vehicles WHERE citizenid=:cid', { cid = cid }) +end + +function GetPlayerProperties(cid, cb) + local result = MySQL.query.await('SELECT houselocations.label, houselocations.coords FROM player_houses INNER JOIN houselocations ON player_houses.house = houselocations.name where player_houses.citizenid = ?', {cid}) + return result +end + +function GetPlayerDataById(id) + local Player = QBCore.Functions.GetPlayerByCitizenId(id) + if Player ~= nil then + local response = {citizenid = Player.PlayerData.citizenid, charinfo = Player.PlayerData.charinfo, metadata = Player.PlayerData.metadata, job = Player.PlayerData.job} + return response + else + return MySQL.single.await('SELECT citizenid, charinfo, job, metadata FROM players WHERE citizenid = ? LIMIT 1', { id }) + end + + -- return exports.oxmysql:executeSync('SELECT citizenid, charinfo, job FROM players WHERE citizenid = ? LIMIT 1', { id }) +end + +function GetOwnerName(cid) + local result = MySQL.scalar.await('SELECT charinfo FROM `players` WHERE LOWER(`citizenid`) = ? LIMIT 1', {cid}) + return result + -- return exports.oxmysql:scalarSync('SELECT charinfo FROM `players` WHERE id=:cid LIMIT 1', { cid = cid}) +end diff --git a/trackers.sql b/trackers.sql new file mode 100644 index 0000000..b3f0a6e --- /dev/null +++ b/trackers.sql @@ -0,0 +1,11 @@ +CREATE TABLE IF NOT EXISTS `trackers` ( + `id` INT(11) NOT NULL AUTO_INCREMENT, + `cid` VARCHAR(50) DEFAULT NULL, + `vid` VARCHAR(50) DEFAULT NULL, + `plate` VARCHAR(50) DEFAULT NULL, + `model` VARCHAR(50) DEFAULT NULL, + `engine` FLOAT DEFAULT '1000', + `distance` FLOAT DEFAULT NULL, + PRIMARY KEY (`cid`), + KEY `id` (`id`) +) ENGINE=INNODB DEFAULT CHARSET=UTF8MB4; \ No newline at end of file From 61b6dd7205ba5fdfbc60353b9d444054a575e6ba Mon Sep 17 00:00:00 2001 From: Marcus McCormick Date: Thu, 17 Nov 2022 01:54:37 -0600 Subject: [PATCH 5/6] --Interim DB integration updat-- Inject the trackers.sql into existing db. Trackers now create a database entry. Only one tracker can be placed on a vehicle at a time. Explode/Disable deletes the db entry as well as UI entry. Trackers are now ready to be made fully persistent - Next step is to integrate into the tracker UI so that trackers populate from database upon leaving/rejoining sessions (aka log off and back on), providing true persistence. --- client/client.lua | 45 ++++++++++++++++++++++++++++++-------------- fxmanifest.lua | 2 +- nui/assets/js/app.js | 27 +++++++++++++------------- nui/ui.html | 2 +- server/dbm.lua | 13 +------------ server/server.lua | 30 +++++++++++++++++++++++++++++ server/utils.lua | 10 ++++++++++ trackers.sql | 2 +- 8 files changed, 89 insertions(+), 42 deletions(-) create mode 100644 server/utils.lua diff --git a/client/client.lua b/client/client.lua index f1ac0a0..b32ea1e 100644 --- a/client/client.lua +++ b/client/client.lua @@ -72,10 +72,11 @@ end) RegisterNetEvent("um-hackerphone:client:vehicletracker", function() local vehicle = NetworkGetNetworkIdFromEntity(QBCore.Functions.GetClosestVehicle()) if vehicle ~= nil and vehicle ~= 0 then + local veh = NetworkGetEntityFromNetworkId(vehicle) local ped = PlayerPedId() local pos = GetEntityCoords(ped) - local veh = NetworkGetEntityFromNetworkId(vehicle) local vehpos = GetEntityCoords(veh) + local istracked = false local vehicleinfo = { ["plate"] = QBCore.Functions.GetPlate(NetworkGetEntityFromNetworkId(vehicle)), ["vehname"] = GetDisplayNameFromVehicleModel(GetEntityModel(NetworkGetEntityFromNetworkId(vehicle))), @@ -83,19 +84,28 @@ RegisterNetEvent("um-hackerphone:client:vehicletracker", function() ["vehicle"] = vehicle, ["vehdistance"] = getDistanceFromVehicle(vehicle) } + if #(pos - vehpos) < 2 then - Anim() - exports['ps-ui']:Circle(function(success) - if success then - SendNUIMessage({nuimessage = 'vbool', vehicleinfo = vehicleinfo}) - ClearPedTasks(ped) - QBCore.Functions.Notify('Tracker connected to vehicle', "success") - TriggerServerEvent('um-hackerphone:server:removeitem',"tracker") + QBCore.Functions.TriggerCallback('um-hackerphone:server:isvehicletracked', function(result) + istracked = result --Just checking if the vehicle (with same plate) is already being tracked in db + if istracked == false then + Anim() + exports['ps-ui']:Circle(function(success) + if success then + SendNUIMessage({nuimessage = 'vbool', vehicleinfo = vehicleinfo}) + ClearPedTasks(ped) + QBCore.Functions.Notify('Tracker connected to vehicle', "success") + TriggerServerEvent('um-hackerphone:server:removeitem',"tracker") + TriggerServerEvent('um-hackerphone:server:newtracker', ped, veh, vehicleinfo) + else + ClearPedTasks(ped) + QBCore.Functions.Notify('Failed to connect', "error") + end + end, 5, 10) else - ClearPedTasks(ped) - QBCore.Functions.Notify('Failed to connect', "error") + QBCore.Functions.Notify('This vehicle is already being tracked', "error") end - end, 5, 10) + end, vehicleinfo.plate) else QBCore.Functions.Notify('No cars nearby', "error") end @@ -103,7 +113,6 @@ RegisterNetEvent("um-hackerphone:client:vehicletracker", function() end) RegisterNUICallback('um-hackerphone:nuicallback:ping', function(vehicle, id) - -- Swapped to Network if DoesEntityExist(NetworkGetEntityFromNetworkId(vehicle)) then local ped = PlayerPedId() local pos = GetEntityCoords(ped) @@ -111,7 +120,7 @@ RegisterNUICallback('um-hackerphone:nuicallback:ping', function(vehicle, id) local vehpos = GetEntityCoords(veh) local vehicleinfo = { ["plate"] = QBCore.Functions.GetPlate(NetworkGetEntityFromNetworkId(vehicle)), - ["vehname"] = GetDisplayNameFromVehicleModel(GetEntityModel(NetworkGetEntityFromNetworkId(vehicle))):lower(), + ["vehname"] = GetDisplayNameFromVehicleModel(GetEntityModel(NetworkGetEntityFromNetworkId(vehicle))), ["vehengine"] = math.floor(GetVehicleEngineHealth(NetworkGetEntityFromNetworkId(vehicle))), ["vehicle"] = vehicle, ["vehdistance"] = getDistanceFromVehicle(vehicle) @@ -125,7 +134,7 @@ RegisterNUICallback('um-hackerphone:nuicallback:ping', function(vehicle, id) ["vehicle"] = "CORRUPTED", ["vehdistance"] = "CORRUPTED" } - SendNUIMessage({nuimessage = 'vbool', vehicleinfo = vehicleinfo}) + --SendNUIMessage({nuimessage = 'vbool', vehicleinfo = vehicleinfo}) end end) @@ -147,8 +156,10 @@ RegisterNUICallback("um-hackerphone:nuicallback:targetinformation", function() end) RegisterNUICallback("um-hackerphone:broken:vehicle", function(vehicle) + local plate = QBCore.Functions.GetPlate(NetworkGetEntityFromNetworkId(vehicle)) local vehpos = GetEntityCoords(NetworkGetEntityFromNetworkId(vehicle)) AddExplosion(vehpos.x, vehpos.y, vehpos.z, 7, 0.5, true, false, true) + TriggerServerEvent('um-hackerphone:server:removetracker', plate) end) RegisterNUICallback('um-hackerphone:nuicallback:blackout', function() @@ -159,6 +170,12 @@ RegisterNUICallback("um-hackerphone:nuicallback:cam", function(camid) TriggerEvent("police:client:ActiveCamera", tonumber(camid)) end) +RegisterNUICallback("um-hackerphone:nuicallback:removetracker", function(vehicle) + print("here") + local plate = QBCore.Functions.GetPlate(NetworkGetEntityFromNetworkId(vehicle)) + TriggerServerEvent('um-hackerphone:server:removetracker', plate) +end) + RegisterNUICallback("um-hackerphone:nuicallback:escape", function() SetNuiFocusKeepInput(false) SetNuiFocus(false,false) diff --git a/fxmanifest.lua b/fxmanifest.lua index f0e90f5..09bb186 100644 --- a/fxmanifest.lua +++ b/fxmanifest.lua @@ -16,4 +16,4 @@ files { } client_scripts {'client/anim.lua','client/client.lua'} -server_scripts {'@oxmysql/lib/MySQL.lua','server/server.lua','server/dbm.lua'} \ No newline at end of file +server_scripts {'@oxmysql/lib/MySQL.lua','server/server.lua','server/utils.lua','server/dbm.lua'} \ No newline at end of file diff --git a/nui/assets/js/app.js b/nui/assets/js/app.js index 05137b5..85b6939 100644 --- a/nui/assets/js/app.js +++ b/nui/assets/js/app.js @@ -84,7 +84,7 @@ const hackerphone = Vue.createApp({ this.pageReset(tvariable) } }, - generalButton: function(task,id) { + generalButton: function(task, id, vehicle) { const x = document.getElementById(id); if (task === "toggle") { if (x.style.display === "none") { @@ -93,30 +93,31 @@ const hackerphone = Vue.createApp({ x.style.display = "none"; } }else if (task === "delete") { + this.postMessage("um-hackerphone:nuicallback:removetracker", vehicle) x.remove() } }, pingButton: function(key, id) { - this.newlocation = this.postMessage('um-hackerphone:nuicallback:ping', key, id) + this.postMessage('um-hackerphone:nuicallback:ping', key, id) const x = document.getElementById(id); x.remove() }, blackoutButton: function(post) { - this.hackblackout = true /* set blackout to true */ - if (!this.timerready) { /* if the time has not been triggered to start*/ + this.hackblackout = true + if (!this.timerready) { this.postMessage(post) - this.timerready = true /* set time start trigger to True */ - this.interval = setInterval(() => { /* every second (1000ms, as noted at end of this function) do this */ - if (this.timer === 0) { /* if timer has hit zero */ - this.hackblackout = false /* stop blackout */ - this.timerready = false /*turn timer trigger back off*/ + this.timerready = true + this.interval = setInterval(() => { + if (this.timer === 0) { + this.hackblackout = false + this.timerready = false this.postMessage(post) - this.timer = UMHackerPhone.BlackoutSeconds /*set timer back to value from config.js*/ - clearInterval(this.interval) /* set timer interval back to null */ + this.timer = UMHackerPhone.BlackoutSeconds + clearInterval(this.interval) } else { - this.timer-- /* subtract 1 from the timer */ + this.timer-- } - }, 1000)/* time interval, 1000ms=1s */ + }, 1000) } }, vehicleExplosion: function(post,key,id) { diff --git a/nui/ui.html b/nui/ui.html index 24593fb..980a89f 100644 --- a/nui/ui.html +++ b/nui/ui.html @@ -48,7 +48,7 @@

    {{item.trackerid}}

  • {{lang.distance}}{{item.vehicledistance}}
  • - + diff --git a/server/dbm.lua b/server/dbm.lua index f819dd3..56e1683 100644 --- a/server/dbm.lua +++ b/server/dbm.lua @@ -28,11 +28,6 @@ function GetPlayerVehicles(cid, cb) return MySQL.query.await('SELECT id, plate, vehicle FROM player_vehicles WHERE citizenid=:cid', { cid = cid }) end -function GetPlayerProperties(cid, cb) - local result = MySQL.query.await('SELECT houselocations.label, houselocations.coords FROM player_houses INNER JOIN houselocations ON player_houses.house = houselocations.name where player_houses.citizenid = ?', {cid}) - return result -end - function GetPlayerDataById(id) local Player = QBCore.Functions.GetPlayerByCitizenId(id) if Player ~= nil then @@ -43,10 +38,4 @@ function GetPlayerDataById(id) end -- return exports.oxmysql:executeSync('SELECT citizenid, charinfo, job FROM players WHERE citizenid = ? LIMIT 1', { id }) -end - -function GetOwnerName(cid) - local result = MySQL.scalar.await('SELECT charinfo FROM `players` WHERE LOWER(`citizenid`) = ? LIMIT 1', {cid}) - return result - -- return exports.oxmysql:scalarSync('SELECT charinfo FROM `players` WHERE id=:cid LIMIT 1', { cid = cid}) -end +end \ No newline at end of file diff --git a/server/server.lua b/server/server.lua index 6e803fd..8430d4b 100644 --- a/server/server.lua +++ b/server/server.lua @@ -48,3 +48,33 @@ RegisterNetEvent('um-hackerphone:server:targetinformation', function() end end) +RegisterNetEvent('um-hackerphone:server:newtracker', function(ped, vid, vehicle) + local src = source + local PlayerData = GetPlayerData(src) + local citizenid = PlayerData.citizenid + local newtracker = MySQL.insert.await('INSERT INTO `trackers` (`cid`, `vid`, `plate`, `model`, `engine`, `distance`) VALUES (:cid, :vid, :plate, :model, :engine, :distance)',{ + cid = citizenid, + vid = vid, + plate = vehicle.plate, + model = vehicle.vehname, + engine = vehicle.vehengine, + distance = vehicle.vehdistance, + }) +end) + +--Deleted vehicle from db +RegisterNetEvent('um-hackerphone:server:removetracker', function(plate) + local result = MySQL.single.await("SELECT * FROM `trackers` WHERE plate=:plate", { plate = plate }) + if result then + MySQL.update("DELETE FROM `trackers` WHERE plate=:plate", { plate = plate}) + end +end) +--Check if vehicle is already in db +QBCore.Functions.CreateCallback('um-hackerphone:server:isvehicletracked', function(source, cb, plate) + local result = MySQL.single.await("SELECT * FROM `trackers` WHERE plate=:plate", { plate = plate }) + if result ~= nil then + cb(true) + else + cb(false) + end +end) \ No newline at end of file diff --git a/server/utils.lua b/server/utils.lua new file mode 100644 index 0000000..f7ee2db --- /dev/null +++ b/server/utils.lua @@ -0,0 +1,10 @@ +local QBCore = exports['qb-core']:GetCoreObject() + +function GetPlayerData(source) + local Player = QBCore.Functions.GetPlayer(source) + return Player.PlayerData +end + +function GetNameFromPlayerData(PlayerData) + return ('%s %s'):format(PlayerData.charinfo.firstname, PlayerData.charinfo.lastname) +end diff --git a/trackers.sql b/trackers.sql index b3f0a6e..aef6ba1 100644 --- a/trackers.sql +++ b/trackers.sql @@ -6,6 +6,6 @@ CREATE TABLE IF NOT EXISTS `trackers` ( `model` VARCHAR(50) DEFAULT NULL, `engine` FLOAT DEFAULT '1000', `distance` FLOAT DEFAULT NULL, - PRIMARY KEY (`cid`), + PRIMARY KEY (`id`), KEY `id` (`id`) ) ENGINE=INNODB DEFAULT CHARSET=UTF8MB4; \ No newline at end of file From af0e6772acf205ef74d591233cf13c8103c32f1e Mon Sep 17 00:00:00 2001 From: Marcus McCormick Date: Thu, 17 Nov 2022 03:07:17 -0600 Subject: [PATCH 6/6] Refactors. Added function to update db on ping. --- client/client.lua | 5 +++-- server/server.lua | 16 +++++++++++++--- 2 files changed, 16 insertions(+), 5 deletions(-) diff --git a/client/client.lua b/client/client.lua index b32ea1e..6e8aa55 100644 --- a/client/client.lua +++ b/client/client.lua @@ -125,6 +125,7 @@ RegisterNUICallback('um-hackerphone:nuicallback:ping', function(vehicle, id) ["vehicle"] = vehicle, ["vehdistance"] = getDistanceFromVehicle(vehicle) } + TriggerServerEvent('um-hackerphone:server:updatetracker', vehicleinfo) SendNUIMessage({nuimessage = 'vbool', vehicleinfo = vehicleinfo}) else local vehicleinfo = { @@ -158,8 +159,9 @@ end) RegisterNUICallback("um-hackerphone:broken:vehicle", function(vehicle) local plate = QBCore.Functions.GetPlate(NetworkGetEntityFromNetworkId(vehicle)) local vehpos = GetEntityCoords(NetworkGetEntityFromNetworkId(vehicle)) - AddExplosion(vehpos.x, vehpos.y, vehpos.z, 7, 0.5, true, false, true) TriggerServerEvent('um-hackerphone:server:removetracker', plate) + Wait(3) + AddExplosion(vehpos.x, vehpos.y, vehpos.z, 7, 0.5, true, false, true) end) RegisterNUICallback('um-hackerphone:nuicallback:blackout', function() @@ -171,7 +173,6 @@ RegisterNUICallback("um-hackerphone:nuicallback:cam", function(camid) end) RegisterNUICallback("um-hackerphone:nuicallback:removetracker", function(vehicle) - print("here") local plate = QBCore.Functions.GetPlate(NetworkGetEntityFromNetworkId(vehicle)) TriggerServerEvent('um-hackerphone:server:removetracker', plate) end) diff --git a/server/server.lua b/server/server.lua index 8430d4b..820735f 100644 --- a/server/server.lua +++ b/server/server.lua @@ -62,14 +62,13 @@ RegisterNetEvent('um-hackerphone:server:newtracker', function(ped, vid, vehicle) }) end) ---Deleted vehicle from db RegisterNetEvent('um-hackerphone:server:removetracker', function(plate) - local result = MySQL.single.await("SELECT * FROM `trackers` WHERE plate=:plate", { plate = plate }) + local result = MySQL.single.await("SELECT * FROM `trackers` WHERE plate = :plate", { plate = plate }) if result then MySQL.update("DELETE FROM `trackers` WHERE plate=:plate", { plate = plate}) end end) ---Check if vehicle is already in db + QBCore.Functions.CreateCallback('um-hackerphone:server:isvehicletracked', function(source, cb, plate) local result = MySQL.single.await("SELECT * FROM `trackers` WHERE plate=:plate", { plate = plate }) if result ~= nil then @@ -77,4 +76,15 @@ QBCore.Functions.CreateCallback('um-hackerphone:server:isvehicletracked', functi else cb(false) end +end) + +RegisterNetEvent('um-hackerphone:server:updatetracker', function(vehicleinfo) + local result = MySQL.single.await("SELECT * FROM `trackers` WHERE plate=:plate", { plate = vehicleinfo.plate }) + if result then + MySQL.update('UPDATE trackers SET engine = ?, distance = ? WHERE plate = ?', { + vehicleinfo.vehengine, + vehicleinfo.vehdistance, + vehicleinfo.plate + }) + end end) \ No newline at end of file