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)