forked from Simnation/Main
503 lines
17 KiB
Lua
503 lines
17 KiB
Lua
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)
|
|
|
|
-- Fahrzeugbesitz an einen anderen Spieler übertragen
|
|
CB:Register("VKC:transferVehicleOwnership", function(source, plate, targetPlayerId)
|
|
local src = source
|
|
|
|
if (plate == nil or targetPlayerId == nil) then
|
|
print("^1[ERROR] \"plate\" or \"targetPlayerId\" was nil while transferring vehicle ownership for id " .. tostring(src))
|
|
return false
|
|
end
|
|
|
|
local Player = QBCore.Functions.GetPlayer(src)
|
|
local TargetPlayer = QBCore.Functions.GetPlayer(targetPlayerId)
|
|
|
|
if (not Player or not TargetPlayer) then
|
|
print("^1[ERROR] Player or target player not found while transferring vehicle ownership")
|
|
return false
|
|
end
|
|
|
|
local trimmedPlate = plate:gsub("^%s*(.-)%s*$", "%1"):upper()
|
|
|
|
-- Überprüfen, ob der Spieler das Fahrzeug besitzt
|
|
local isOwner = IsVehicleOwner(src, trimmedPlate)
|
|
if not isOwner then
|
|
return false
|
|
end
|
|
|
|
-- Fahrzeugmodell für die Benachrichtigung abrufen
|
|
local vehicleModel = nil
|
|
local results = MySQL.Sync.fetchAll("SELECT vehicle FROM player_vehicles WHERE plate = @plate AND citizenid = @owner", {
|
|
["@plate"] = trimmedPlate,
|
|
["@owner"] = Player.PlayerData.citizenid
|
|
})
|
|
|
|
if #results > 0 then
|
|
vehicleModel = results[1].vehicle
|
|
end
|
|
|
|
-- Besitz in der Datenbank übertragen
|
|
local success = MySQL.Sync.execute("UPDATE player_vehicles SET citizenid = @newOwner WHERE plate = @plate AND citizenid = @oldOwner", {
|
|
["@newOwner"] = TargetPlayer.PlayerData.citizenid,
|
|
["@plate"] = trimmedPlate,
|
|
["@oldOwner"] = Player.PlayerData.citizenid
|
|
})
|
|
|
|
if success > 0 then
|
|
-- Alle Schlüssel auf den neuen Besitzer übertragen
|
|
MySQL.Sync.execute("DELETE FROM vehicle_keys WHERE plate = @plate", {
|
|
["@plate"] = trimmedPlate
|
|
})
|
|
|
|
-- Einen Schlüssel dem neuen Besitzer geben
|
|
MySQL.Sync.execute("INSERT INTO vehicle_keys (owner, plate, count) VALUES (@owner, @plate, 1)", {
|
|
["@owner"] = TargetPlayer.PlayerData.citizenid,
|
|
["@plate"] = trimmedPlate
|
|
})
|
|
|
|
-- Den Zielspieler benachrichtigen
|
|
TriggerClientEvent("VKC:vehicleTransferNotif", targetPlayerId, trimmedPlate, vehicleModel)
|
|
|
|
return true
|
|
end
|
|
|
|
return false
|
|
end)
|