diff --git a/client/client.lua b/client/client.lua index 646ea6a..6e8aa55 100644 --- a/client/client.lua +++ b/client/client.lua @@ -70,36 +70,84 @@ 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 veh = NetworkGetEntityFromNetworkId(vehicle) local ped = PlayerPedId() local pos = GetEntityCoords(ped) - local vehpos = GetEntityCoords(vehicle) + local vehpos = GetEntityCoords(veh) + local istracked = false local vehicleinfo = { - ["plate"] = QBCore.Functions.GetPlate(vehicle), - ["vehname"] = GetDisplayNameFromVehicleModel(GetEntityModel(vehicle)):lower(), - ["vehengine"] = GetVehicleEngineHealth(vehicle), - ["vehicle"] = vehicle + ["plate"] = QBCore.Functions.GetPlate(NetworkGetEntityFromNetworkId(vehicle)), + ["vehname"] = GetDisplayNameFromVehicleModel(GetEntityModel(NetworkGetEntityFromNetworkId(vehicle))), + ["vehengine"] = math.floor(GetVehicleEngineHealth(NetworkGetEntityFromNetworkId(vehicle))), + ["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 end end) +RegisterNUICallback('um-hackerphone:nuicallback:ping', function(vehicle, id) + 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))), + ["vehengine"] = math.floor(GetVehicleEngineHealth(NetworkGetEntityFromNetworkId(vehicle))), + ["vehicle"] = vehicle, + ["vehdistance"] = getDistanceFromVehicle(vehicle) + } + TriggerServerEvent('um-hackerphone:server:updatetracker', vehicleinfo) + 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 veh = NetworkGetEntityFromNetworkId(vehicle) + local vehpos = GetEntityCoords(veh) + local distance = math.floor(GetDistanceBetweenCoords(pos, vehpos)) + return distance +end + RegisterNetEvent("um-hackerphone:client:notify", function() SendNUIMessage({nuimessage = 'error'}) end) @@ -109,7 +157,10 @@ RegisterNUICallback("um-hackerphone:nuicallback:targetinformation", function() end) RegisterNUICallback("um-hackerphone:broken:vehicle", function(vehicle) - local vehpos = GetEntityCoords(vehicle) + local plate = QBCore.Functions.GetPlate(NetworkGetEntityFromNetworkId(vehicle)) + local vehpos = GetEntityCoords(NetworkGetEntityFromNetworkId(vehicle)) + TriggerServerEvent('um-hackerphone:server:removetracker', plate) + Wait(3) AddExplosion(vehpos.x, vehpos.y, vehpos.z, 7, 0.5, true, false, true) end) @@ -121,6 +172,11 @@ RegisterNUICallback("um-hackerphone:nuicallback:cam", function(camid) TriggerEvent("police:client:ActiveCamera", tonumber(camid)) end) +RegisterNUICallback("um-hackerphone:nuicallback:removetracker", function(vehicle) + 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/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/fxmanifest.lua b/fxmanifest.lua index 7245080..09bb186 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/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 78c1ab4..85b6939 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) { @@ -80,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") { @@ -89,23 +93,29 @@ 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.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.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) + clearInterval(this.interval) } else { - this.timer-- + this.timer-- } }, 1000) } diff --git a/nui/ui.html b/nui/ui.html index 2906170..980a89f 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}}
  • - + + diff --git a/server/dbm.lua b/server/dbm.lua new file mode 100644 index 0000000..56e1683 --- /dev/null +++ b/server/dbm.lua @@ -0,0 +1,41 @@ +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 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 \ No newline at end of file diff --git a/server/server.lua b/server/server.lua index 6e803fd..820735f 100644 --- a/server/server.lua +++ b/server/server.lua @@ -48,3 +48,43 @@ 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) + +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) + +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) + +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 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 new file mode 100644 index 0000000..aef6ba1 --- /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 (`id`), + KEY `id` (`id`) +) ENGINE=INNODB DEFAULT CHARSET=UTF8MB4; \ No newline at end of file