Main/resources/[carscripts]/sn_vehicleKey/server.lua

439 lines
15 KiB
Lua
Raw Permalink Normal View History

2025-06-07 08:51:21 +02:00
local CB = exports["kimi_callbacks"]
local QBCore = exports['qb-core']:GetCoreObject()
-- create a new key
CB:Register("VKC:createNewKey", function(source, plate, count)
local src = source
if (plate == nil or count == nil) then
print("^1[ERROR] \"plate\" or \"count\" was nil while creating new key for id " .. tostring(src))
return false
end
local Player = QBCore.Functions.GetPlayer(src)
if (Player) then
local trimmedPlate = plate:gsub("^%s*(.-)%s*$", "%1"):upper()
if (Player.Functions.GetMoney('cash') >= Config.Costs.newKey) then
local results = MySQL.Sync.fetchAll("SELECT count FROM vehicle_keys WHERE owner = @owner AND (plate = @plate OR plate = @trimmedPlate)", {
["@owner"] = Player.PlayerData.citizenid,
["@plate"] = plate,
["@trimmedPlate"] = trimmedPlate
})
local rows = 0
if (#results > 0) then
rows = MySQL.Sync.execute("UPDATE vehicle_keys SET count = count + @count WHERE owner = @owner AND (plate = @plate OR plate = @trimmedPlate)", {
["@owner"] = Player.PlayerData.citizenid,
["@plate"] = plate,
["@trimmedPlate"] = trimmedPlate,
["@count"] = count
})
else
rows = MySQL.Sync.execute("INSERT INTO vehicle_keys (owner, plate, count) VALUES (@owner, @trimmedPlate, @count)", {
["@owner"] = Player.PlayerData.citizenid,
["@trimmedPlate"] = trimmedPlate,
["@count"] = count
})
end
if (rows == 0) then
return false
end
Player.Functions.RemoveMoney('cash', Config.Costs.newKey)
else
return "noMoney"
end
else
print("^1[ERROR] \"playerData\" was nil while creating new key for id " .. tostring(src))
return false
end
return true
end)
-- remove a key from a plate
CB:Register("VKC:removeKey", function(source, plate, num)
local src = source
if (plate == nil or num == nil) then
print("^1[ERROR] \"plate\" or \"num\" was nil while removing a key for id " .. tostring(src))
return false
end
local Player = QBCore.Functions.GetPlayer(src)
if (Player) then
local trimmedPlate = plate:gsub("^%s*(.-)%s*$", "%1"):upper()
local rows = MySQL.Sync.execute("DELETE FROM vehicle_keys WHERE owner = @owner and (plate = @plate OR plate = @trimmedPlate) and count = @num", {
["@owner"] = Player.PlayerData.citizenid,
["@plate"] = plate,
["@trimmedPlate"] = trimmedPlate,
["@num"] = num
})
if (rows == 0) then
rows = MySQL.Sync.execute("UPDATE vehicle_keys SET count = count - @num WHERE owner = @owner and (plate = @plate OR plate = @trimmedPlate)", {
["@owner"] = Player.PlayerData.citizenid,
["@plate"] = plate,
["@trimmedPlate"] = trimmedPlate,
["@num"] = num
})
end
if (rows == 0) then
return false
end
else
print("^1[ERROR] \"playerData\" was nil while removing a key for id " .. tostring(src))
return false
end
return true
end)
-- remove a key from a plate
CB:Register("VKC:giveKeyToPlayer", function(source, plate, playerId)
local src = source
if (plate == nil or playerId == nil) then
print("^1[ERROR] \"plate\" or \"playerId\" was nil while giving a key for id " .. tostring(src))
return false
end
local trimmedPlate = plate:gsub("^%s*(.-)%s*$", "%1"):upper()
local Playera = QBCore.Functions.GetPlayer(src) --MARK
local Playerb = QBCore.Functions.GetPlayer(playerId)
if (Playera and Playerb) then
local rows = MySQL.Sync.execute("DELETE FROM vehicle_keys WHERE owner = @owner and (plate = @plate OR plate = @trimmedPlate) and count = 1", {
["@owner"] = Playera.PlayerData.citizenid,
["@plate"] = plate,
["@trimmedPlate"] = trimmedPlate
})
if (rows == 0) then
rows = MySQL.Sync.execute("UPDATE vehicle_keys SET count = count - 1 WHERE owner = @owner and (plate = @plate OR plate = @trimmedPlate)", {
["@owner"] = Playera.PlayerData.citizenid,
["@plate"] = plate,
["@trimmedPlate"] = trimmedPlate
})
end
if (rows == 0) then
return false
else
local results = MySQL.Sync.fetchAll("SELECT count FROM vehicle_keys WHERE owner = @owner AND (plate = @plate OR plate = @trimmedPlate)", {
["@owner"] = Playerb.PlayerData.citizenid,
["@plate"] = plate,
["@trimmedPlate"] = trimmedPlate
})
rows = 0
if (#results > 0) then
rows = MySQL.Sync.execute("UPDATE vehicle_keys SET count = count + 1 WHERE owner = @owner AND (plate = @plate OR plate = @trimmedPlate)", {
["@owner"] = Playerb.PlayerData.citizenid,
["@plate"] = plate,
["@trimmedPlate"] = trimmedPlate
})
else
rows = MySQL.Sync.execute("INSERT INTO vehicle_keys (owner, plate, count) VALUES (@owner, @trimmedPlate, 1)", {
["@owner"] = Playerb.PlayerData.citizenid,
["@trimmedPlate"] = trimmedPlate
})
end
if (rows == 0) then
return false
end
end
else
print("^1[ERROR] \"playerData\" or \"playerData2\" was nil while giving a key for id " .. tostring(src))
return false
end
TriggerClientEvent("VKC:giveKeyNotif", playerId, trimmedPlate)
return true
end)
-- remove all keys from a plate
CB:Register("VKC:removeAllKeys", function(source, plate)
local src = source
if (plate == nil) then
print("^1[ERROR] \"plate\" was nil while removing all keys for " .. tostring(src))
return false
end
local Player = QBCore.Functions.GetPlayer(src)
if (Player) then
local trimmedPlate = plate:gsub("^%s*(.-)%s*$", "%1"):upper()
if (Player.Functions.GetMoney(Config.Costs.GetMoney) >= Config.Costs.exchangeLocks) then
MySQL.Sync.execute("DELETE FROM vehicle_keys WHERE plate = @trimmedPlate", {
["@trimmedPlate"] = trimmedPlate
})
Player.Functions.RemoveMoney(Config.Costs.GetMoney, Config.Costs.exchangeLocks)
return true
else
return "noMoney"
end
end
return false
end)
-- get all owned vehicles from player
function GetPlayerVehicleData(playerId)
if (playerId == nil) then
print("^1[ERROR] Parameter \"playerId\" was nil while triggering server export \"GetOwnedVehicles\"!")
return
end
local Player = QBCore.Functions.GetPlayer(playerId)
local vehicles = {}
if (Player) then
local results = MySQL.Sync.fetchAll("SELECT plate, vehicle FROM player_vehicles WHERE citizenid = @owner", {
["@owner"] = Player.PlayerData.citizenid
})
for i = 1, #results, 1 do
print(json.encode(results[i]))
table.insert(vehicles, {
results[i].plate,
results[i].vehicle})
--json.decode(results[i].vehicles).model})
end
else
print("^1[ERROR] \"playerData\" was nil while getting owned vehicles for id " .. tostring(playerId))
end
print(json.encode(vehicles))
return vehicles
end
CB:Register("VKC:getPlayerVehicleData", GetPlayerVehicleData)
-- get all owned keys from player
function GetPlayerKeys(playerId)
if (playerId == nil) then
print("^1[ERROR] Parameter \"playerId\" was nil while triggering server export \"GetOwnedKeys\"!")
return
end
local keys = {}
local Player = QBCore.Functions.GetPlayer(playerId)
if (Player) then
local results = MySQL.Sync.fetchAll("SELECT vehicle_keys.plate, vehicle_keys.count, player_vehicles.vehicle FROM vehicle_keys INNER JOIN player_vehicles ON vehicle_keys.plate = player_vehicles.plate WHERE vehicle_keys.owner = @owner", {
["@owner"] = Player.PlayerData.citizenid
})
for i = 1, #results, 1 do
table.insert(keys, {
plate = results[i].plate,
count = results[i].count,
model = results[i].vehicle --json.decode(results[i].vehicle).model
})
end
else
print("^1[ERROR] \"playerData\" was nil while getting owned keys for id " .. tostring(playerId))
end
return keys
end
CB:Register("VKC:getPlayerKeys", GetPlayerKeys)
-- return if playerId is owner of vehicle
function IsVehicleOwner(playerId, plate)
if (playerId == nil) then
print("^1[ERROR] Parameter \"playerId\" was nil while triggering server export \"IsVehicleOwner\"!")
return
end
if (plate == nil) then
print("^1[ERROR] Parameter \"plate\" was nil while triggering server export \"IsVehicleOwner\"!")
return
end
local Player = QBCore.Functions.GetPlayer(playerId)
if (Player) then
local trimmedPlate = plate:gsub("^%s*(.-)%s*$", "%1"):upper()
local results = MySQL.Sync.fetchAll("SELECT plate FROM player_vehicles WHERE citizenid = @owner and (plate = @plate OR plate = @trimmedPlate)", {
["@owner"] = Player.PlayerData.citizenid,
["@plate"] = plate,
["@trimmedPlate"] = trimmedPlate
})
if (#results > 0) then
return true
end
else
print("^1[ERROR] \"playerData\" was nil while getting vehicle ownership for id " .. tostring(playerId))
end
return false
end
CB:Register("VKC:isVehicleOwner", IsVehicleOwner)
-- return if playerId is owner of key
function IsKeyOwner(playerId, plate, model)
if (playerId == nil) then
print("^1[ERROR] Parameter \"playerId\" was nil while triggering server export \"IsKeyOwner\"!")
return
end
if (plate == nil) then
print("^1[ERROR] Parameter \"plate\" was nil while triggering server export \"IsKeyOwner\"!")
return
end
if (model == nil) then
print("^1[ERROR] Parameter \"model\" was nil while triggering server export \"IsKeyOwner\"!")
return
end
local Player = QBCore.Functions.GetPlayer(playerId)
if (Player) then
local trimmedPlate = plate:gsub("^%s*(.-)%s*$", "%1"):upper()
if (IsJobVehicle(Player.PlayerData.job.name, trimmedPlate, model)) then
return true
end
local results = MySQL.Sync.fetchAll("SELECT plate FROM vehicle_keys WHERE owner = @owner and (plate = @plate OR plate = @trimmedPlate)", {
["@owner"] = Player.PlayerData.citizenid,
["@plate"] = plate,
["@trimmedPlate"] = trimmedPlate
})
if (#results > 0) then
return true
end
else
print("^1[ERROR] \"playerData\" was nil while getting key ownership for id " .. tostring(playerId))
end
return false
end
exports["kimi_callbacks"]:Register("VKC:isKeyOwner", IsKeyOwner)
-- return if playerId is owner of vehicle or key
function IsVehicleOrKeyOwner(playerId, plate, model)
if (playerId == nil) then
print("^1[ERROR] Parameter \"playerId\" was nil while triggering server export \"IsVehicleOrKeyOwner\"!")
return
end
if (plate == nil) then
print("^1[ERROR] Parameter \"plate\" was nil while triggering server export \"IsVehicleOrKeyOwner\"!")
return
end
if (model == nil) then
print("^1[ERROR] Parameter \"model\" was nil while triggering server export \"IsVehicleOrKeyOwner\"!")
return
end
local Player = QBCore.Functions.GetPlayer(playerId)
if (Player) then
local trimmedPlate = plate:gsub("^%s*(.-)%s*$", "%1"):upper()
if (IsJobVehicle(Player.PlayerData.job.name, trimmedPlate, model)) then
return true
end
local results = MySQL.Sync.fetchAll("SELECT plate FROM player_vehicles WHERE citizenid = @owner and (plate = @plate OR plate = @trimmedPlate)", {
["@owner"] = Player.PlayerData.citizenid,
["@plate"] = plate,
["@trimmedPlate"] = trimmedPlate
})
if (#results > 0) then
return true
end
results = MySQL.Sync.fetchAll("SELECT plate FROM vehicle_keys WHERE owner = @owner and (plate = @plate OR plate = @trimmedPlate)", {
["@owner"] = Player.PlayerData.citizenid,
["@plate"] = plate,
["@trimmedPlate"] = trimmedPlate
})
if (#results > 0) then
return true
end
else
print("^1[ERROR] \"playerData\" was nil while getting vehicle or key ownership for id " .. tostring(playerId))
end
return false
end
CB:Register("VKC:isVehicleOrKeyOwner", IsVehicleOrKeyOwner)
-- if the given vehicle is a job vehicle
function IsJobVehicle(job, plate, model)
local jobData = Config.JobVehicles[job]
if (jobData == nil) then
return false
end
for i, m in ipairs(jobData.models) do
if (m == model) then
return true
end
end
for i, p in ipairs(jobData.plates) do
if (plate:find(p:upper())) then
return true
end
end
return false
end
-- toggle door lock over network to ensure it always works
RegisterServerEvent("VKC:toggleLockNet")
AddEventHandler("VKC:toggleLockNet", function(vehicleNetId, unlocked)
local vehicle = NetworkGetEntityFromNetworkId(vehicleNetId)
if (DoesEntityExist(vehicle)) then
local entityOwner = NetworkGetEntityOwner(vehicle)
TriggerClientEvent("VKC:toggleLockOnPlayer", entityOwner, vehicleNetId, unlocked)
end
end)
RegisterServerEvent("VKC:playDoorLockSoundNet")
AddEventHandler("VKC:playDoorLockSoundNet", function(vehicleNetId, lock)
TriggerClientEvent("VKC:playDoorLockSound", -1, vehicleNetId, lock)
end)
RegisterServerEvent('VKC:setvehkey')
AddEventHandler('VKC:setvehkey', function(plate)
local _source = source
local xPlayer = QBCore.Functions.GetPlayer(_source)
MySQL.query("INSERT INTO vehicle_keys(owner, plate, count) VALUES (?, ?, ?)", {xPlayer.PlayerData.citizenid, plate, 1})
end)
RegisterServerEvent('VKC:delvehkey')
AddEventHandler('VKC:delvehkey', function(plate, owner)
local _source = source
if owner then
local xPlayer = QBCore.Functions.GetPlayer(_source)
MySQL.query("DELETE FROM vehicle_keys WHERE plate = ? and owner = ?", {plate, xPlayer.PlayerData.citizenid})
else
MySQL.query("DELETE FROM vehicle_keys WHERE plate = ?", {plate})
end
end)