Skip to content
This repository has been archived by the owner on Apr 6, 2023. It is now read-only.

Vehicle Distance Tracking and Update Ping (Swap vehicle data to NetID base - preparing for SQL storing) #7

Open
wants to merge 7 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
90 changes: 73 additions & 17 deletions client/client.lua
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand All @@ -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)

Expand All @@ -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)
Expand Down
4 changes: 3 additions & 1 deletion config.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ UMHackerPhone = [];

UMHackerPhone.CloseKey = "Escape"

UMHackerPhone.BlackoutSeconds = 10
UMHackerPhone.BlackoutSeconds = 45

UMHackerPhone.Cams = {
[1] : "Pacific Bank CAM#1",
Expand Down Expand Up @@ -51,6 +51,7 @@ UMHackerPhone.Lang = {
userinfo: "User Information",
vehicle: "Vehicle",
vehicletrack: "Vehicle Tracking",
distance: "Distance: ",
blackout: "Blackout",
plate: "Plate: ",
model: "Model: ",
Expand All @@ -63,4 +64,5 @@ UMHackerPhone.Lang = {
explosion: "Explosion",
hackpower: "Hack power station",
fixpower: "Fix power station Seconds: ",
ping: "Ping",
}
4 changes: 2 additions & 2 deletions fxmanifest.lua
Original file line number Diff line number Diff line change
@@ -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'
Expand All @@ -16,4 +16,4 @@ files {
}

client_scripts {'client/anim.lua','client/client.lua'}
server_script 'server/server.lua'
server_scripts {'@oxmysql/lib/MySQL.lua','server/server.lua','server/utils.lua','server/dbm.lua'}
36 changes: 23 additions & 13 deletions nui/assets/js/app.js
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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) {
Expand All @@ -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") {
Expand All @@ -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)
}
Expand Down
4 changes: 3 additions & 1 deletion nui/ui.html
Original file line number Diff line number Diff line change
Expand Up @@ -45,9 +45,11 @@ <h3><i class="fa-solid fa-location-crosshairs"></i> {{item.trackerid}}</h3>
<li>{{lang.plate}} <span>{{item.vehicleinfoplate}}</span></li>
<li>{{lang.model}} <span>{{item.vehicleinfoname}}</span></li>
<li>{{lang.engine}}<span>{{item.vehicleinfoengine}}</span></li>
<li>{{lang.distance}}<span>{{item.vehicledistance}}</span></li>
</ul>
<button @click="vehicleExplosion('um-hackerphone:broken:vehicle', item.vehicle, item.trackerid)"><i class="fa-solid fa-burst"></i> {{lang.explosion}}</button>
<button @click="generalButton('delete', item.trackerid)"><i class="fa-solid fa-ban"></i> {{lang.disabletracker}}</button>
<button @click="generalButton('delete', item.trackerid, item.vehicle)"><i class="fa-solid fa-ban"></i> {{lang.disabletracker}}</button>
<button @click="pingButton(item.vehicle, item.trackerid)"><i class="fa-solid fa-wifi"></i> {{lang.ping}}</button>
</div>
</div>
</div>
Expand Down
41 changes: 41 additions & 0 deletions server/dbm.lua
Original file line number Diff line number Diff line change
@@ -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
40 changes: 40 additions & 0 deletions server/server.lua
Original file line number Diff line number Diff line change
Expand Up @@ -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)
10 changes: 10 additions & 0 deletions server/utils.lua
Original file line number Diff line number Diff line change
@@ -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
11 changes: 11 additions & 0 deletions trackers.sql
Original file line number Diff line number Diff line change
@@ -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;