439 lines
		
	
	
		
			No EOL
		
	
	
		
			15 KiB
		
	
	
	
		
			Lua
		
	
	
	
	
	
			
		
		
	
	
			439 lines
		
	
	
		
			No EOL
		
	
	
		
			15 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) |