145 lines
6.9 KiB
Lua
145 lines
6.9 KiB
Lua
|
|
local VEHICLES = exports.qbx_core:GetVehiclesByName()
|
||
|
|
|
||
|
|
local function generateOID()
|
||
|
|
local num = math.random(1, 10) .. math.random(111, 999)
|
||
|
|
return 'OC' .. num
|
||
|
|
end
|
||
|
|
|
||
|
|
lib.callback.register('qb-occasions:server:getVehicles', function()
|
||
|
|
local result = MySQL.query.await('SELECT * FROM occasion_vehicles')
|
||
|
|
if result[1] then
|
||
|
|
return result
|
||
|
|
end
|
||
|
|
end)
|
||
|
|
|
||
|
|
lib.callback.register('qb-occasions:server:getSellerInformation', function(_, citizenId)
|
||
|
|
local result = MySQL.query.await('SELECT * FROM players WHERE citizenid = ?', {citizenId})
|
||
|
|
if result[1] then
|
||
|
|
return result[1]
|
||
|
|
end
|
||
|
|
end)
|
||
|
|
|
||
|
|
lib.callback.register('qb-vehiclesales:server:CheckModelName', function(_, plate)
|
||
|
|
if plate then
|
||
|
|
return MySQL.scalar.await('SELECT vehicle FROM player_vehicles WHERE plate = ?', {plate})
|
||
|
|
end
|
||
|
|
end)
|
||
|
|
|
||
|
|
lib.callback.register('qbx_vehiclesales:server:spawnVehicle', function (source, vehicle, coords, warp)
|
||
|
|
local vehmods = json.decode(vehicle.mods)
|
||
|
|
local netId, veh = qbx.spawnVehicle({model = vehicle.model, spawnSource = coords, warp = warp, props = vehmods})
|
||
|
|
if not veh or veh == 0 then return end
|
||
|
|
|
||
|
|
SetVehicleNumberPlateText(veh, vehicle.plate)
|
||
|
|
TriggerClientEvent('vehiclekeys:client:SetOwner', source, vehicle.plate)
|
||
|
|
return netId
|
||
|
|
end)
|
||
|
|
|
||
|
|
lib.callback.register('qbx_vehiclesales:server:checkVehicleOwner', function(source, plate)
|
||
|
|
local player = exports.qbx_core:GetPlayer(source)
|
||
|
|
local result = MySQL.single.await('SELECT * FROM player_vehicles WHERE plate = ? AND citizenid = ?', {plate, player.PlayerData.citizenid})
|
||
|
|
|
||
|
|
if result and result.id then
|
||
|
|
local financeRow = MySQL.single.await('SELECT * FROM vehicle_financing WHERE vehicleId = ?', {result.id})
|
||
|
|
return true, financeRow?.balance
|
||
|
|
end
|
||
|
|
|
||
|
|
return false
|
||
|
|
end)
|
||
|
|
|
||
|
|
RegisterNetEvent('qb-occasions:server:ReturnVehicle', function(vehicleData)
|
||
|
|
local src = source
|
||
|
|
local player = exports.qbx_core:GetPlayer(src)
|
||
|
|
local result = MySQL.query.await('SELECT * FROM occasion_vehicles WHERE plate = ? AND occasionid = ?', {vehicleData.plate, vehicleData.oid})
|
||
|
|
|
||
|
|
if not result[1] then
|
||
|
|
exports.qbx_core:Notify(src, locale('error.vehicle_does_not_exist'), 'error', 3500)
|
||
|
|
return
|
||
|
|
end
|
||
|
|
|
||
|
|
if result[1].seller ~= player.PlayerData.citizenid then
|
||
|
|
exports.qbx_core:Notify(src, locale('error.not_your_vehicle'), 'error', 3500)
|
||
|
|
return
|
||
|
|
end
|
||
|
|
|
||
|
|
MySQL.insert('INSERT INTO player_vehicles (license, citizenid, vehicle, hash, mods, plate, state) VALUES (?, ?, ?, ?, ?, ?, ?)', {player.PlayerData.license, player.PlayerData.citizenid, vehicleData.model, joaat(vehicleData.model), vehicleData.mods, vehicleData.plate, 0})
|
||
|
|
MySQL.query('DELETE FROM occasion_vehicles WHERE occasionid = ? AND plate = ?', {vehicleData.oid, vehicleData.plate})
|
||
|
|
TriggerClientEvent('qb-occasions:client:ReturnOwnedVehicle', src, result[1])
|
||
|
|
TriggerClientEvent('qb-occasion:client:refreshVehicles', -1)
|
||
|
|
end)
|
||
|
|
|
||
|
|
RegisterNetEvent('qb-occasions:server:sellVehicle', function(vehiclePrice, vehicleData)
|
||
|
|
local src = source
|
||
|
|
local player = exports.qbx_core:GetPlayer(src)
|
||
|
|
MySQL.query('DELETE FROM player_vehicles WHERE plate = ? AND vehicle = ?',{vehicleData.plate, vehicleData.model})
|
||
|
|
MySQL.insert('INSERT INTO occasion_vehicles (seller, price, description, plate, model, mods, occasionid) VALUES (?, ?, ?, ?, ?, ?, ?)',{player.PlayerData.citizenid, vehiclePrice, vehicleData.desc, vehicleData.plate, vehicleData.model,json.encode(vehicleData.mods), generateOID()})
|
||
|
|
TriggerEvent('qb-log:server:CreateLog', 'vehicleshop', 'Vehicle for Sale', 'red','**' .. GetPlayerName(src) .. '** has a ' .. vehicleData.model .. ' priced at ' .. vehiclePrice)
|
||
|
|
TriggerClientEvent('qb-occasion:client:refreshVehicles', -1)
|
||
|
|
end)
|
||
|
|
|
||
|
|
---@param model number
|
||
|
|
---@return number price defaults to 0
|
||
|
|
local function getVehPrice(model)
|
||
|
|
for _, v in pairs(VEHICLES) do
|
||
|
|
if v.hash == model then
|
||
|
|
return tonumber(v.price)
|
||
|
|
end
|
||
|
|
end
|
||
|
|
return 0
|
||
|
|
end
|
||
|
|
|
||
|
|
RegisterNetEvent('qb-occasions:server:sellVehicleBack', function(vehData)
|
||
|
|
local src = source
|
||
|
|
local player = exports.qbx_core:GetPlayer(src)
|
||
|
|
local plate = vehData.plate
|
||
|
|
local price = getVehPrice(vehData.model)
|
||
|
|
local payout = math.floor(price * 0.5) -- This will give you half of the cars value
|
||
|
|
player.Functions.AddMoney('bank', payout)
|
||
|
|
exports.qbx_core:Notify(src, (locale('success.sold_car_for_price'):format(payout)), 'success', 5500)
|
||
|
|
MySQL.query('DELETE FROM player_vehicles WHERE plate = ?', {plate})
|
||
|
|
end)
|
||
|
|
|
||
|
|
RegisterNetEvent('qb-occasions:server:buyVehicle', function(vehicleData)
|
||
|
|
local src = source
|
||
|
|
local player = exports.qbx_core:GetPlayer(src)
|
||
|
|
local result = MySQL.query.await('SELECT * FROM occasion_vehicles WHERE plate = ? AND occasionid = ?',{vehicleData.plate, vehicleData.oid})
|
||
|
|
if not result[1] or not next(result[1]) then return end
|
||
|
|
if player.PlayerData.money.bank < result[1].price then
|
||
|
|
exports.qbx_core:Notify(src, locale('error.not_enough_money'), 'error', 3500)
|
||
|
|
return
|
||
|
|
end
|
||
|
|
|
||
|
|
local sellerCitizenId = result[1].seller
|
||
|
|
local sellerData = exports.qbx_core:GetPlayerByCitizenId(sellerCitizenId)
|
||
|
|
local newPrice = math.ceil((result[1].price / 100) * 77)
|
||
|
|
player.Functions.RemoveMoney('bank', result[1].price)
|
||
|
|
MySQL.insert(
|
||
|
|
'INSERT INTO player_vehicles (license, citizenid, vehicle, hash, mods, plate, state) VALUES (?, ?, ?, ?, ?, ?, ?)', {
|
||
|
|
player.PlayerData.license,
|
||
|
|
player.PlayerData.citizenid, result[1].model,
|
||
|
|
GetHashKey(result[1].model),
|
||
|
|
result[1].mods,
|
||
|
|
result[1].plate,
|
||
|
|
0
|
||
|
|
})
|
||
|
|
if sellerData then
|
||
|
|
sellerData.Functions.AddMoney('bank', newPrice)
|
||
|
|
else
|
||
|
|
local buyerData = MySQL.query.await('SELECT * FROM players WHERE citizenid = ?',{sellerCitizenId})
|
||
|
|
if buyerData[1] then
|
||
|
|
local buyerMoney = json.decode(buyerData[1].money)
|
||
|
|
buyerMoney.bank = buyerMoney.bank + newPrice
|
||
|
|
MySQL.update('UPDATE players SET money = ? WHERE citizenid = ?', {json.encode(buyerMoney), sellerCitizenId})
|
||
|
|
end
|
||
|
|
end
|
||
|
|
TriggerEvent('qb-log:server:CreateLog', 'vehicleshop', 'bought', 'green', '**' .. GetPlayerName(src) .. '** has bought for ' .. result[1].price .. ' (' .. result[1].plate ..') from **' .. sellerCitizenId .. '**')
|
||
|
|
TriggerClientEvent('qb-occasions:client:BuyFinished', src, result[1])
|
||
|
|
TriggerClientEvent('qb-occasion:client:refreshVehicles', -1)
|
||
|
|
MySQL.query('DELETE FROM occasion_vehicles WHERE plate = ? AND occasionid = ?',{result[1].plate, result[1].occasionid})
|
||
|
|
TriggerEvent('qb-phone:server:sendNewMailToOffline', sellerCitizenId, {
|
||
|
|
sender = locale('mail.sender'),
|
||
|
|
subject = locale('mail.subject'),
|
||
|
|
message = (locale('mail.message'):format(newPrice, VEHICLES[result[1].model].name))
|
||
|
|
})
|
||
|
|
end)
|