mirror of
https://github.com/esx-framework/esx_core.git
synced 2026-08-28 17:01:14 +00:00
Merge pull request #793 from fivemland/vehicleshop-refactor
refactor(esx_vehicleshop)
This commit is contained in:
@@ -1,42 +1,28 @@
|
|||||||
local HasAlreadyEnteredMarker, IsInShopMenu = false, false
|
local HasAlreadyEnteredMarker, IsInShopMenu = false, false
|
||||||
local CurrentAction, CurrentActionMsg, LastZone, currentDisplayVehicle, CurrentVehicleData
|
local CurrentAction, CurrentActionMsg, LastZone, currentDisplayVehicle, CurrentVehicleData
|
||||||
local CurrentActionData, Vehicles, Categories = {}, {}, {}
|
local CurrentActionData, Vehicles, Categories = {}, {}, {}
|
||||||
|
local VehiclesByModel = {}
|
||||||
|
local vehiclesByCategory = {}
|
||||||
|
|
||||||
function getVehicleFromModel(model)
|
function getVehicleFromModel(model)
|
||||||
for i = 1, #Vehicles do
|
return VehiclesByModel[model]
|
||||||
local vehicle = Vehicles[i]
|
|
||||||
if vehicle.model == model then
|
|
||||||
return vehicle
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
|
|
||||||
function getVehicles()
|
|
||||||
ESX.TriggerServerCallback('esx_vehicleshop:getCategories', function(categories)
|
|
||||||
Categories = categories
|
|
||||||
end)
|
|
||||||
|
|
||||||
ESX.TriggerServerCallback('esx_vehicleshop:getVehicles', function(vehicles)
|
|
||||||
Vehicles = vehicles
|
|
||||||
end)
|
|
||||||
end
|
|
||||||
|
|
||||||
AddEventHandler("onResourceStart", getVehicles)
|
|
||||||
|
|
||||||
function PlayerManagement()
|
function PlayerManagement()
|
||||||
if Config.EnablePlayerManagement then
|
if not Config.EnablePlayerManagement then
|
||||||
if ESX.PlayerData.job.name == 'cardealer' then
|
return
|
||||||
Config.Zones.ShopEntering.Type = 1
|
end
|
||||||
|
|
||||||
if ESX.PlayerData.job.grade_name == 'boss' then
|
if ESX.PlayerData.job.name ~= 'cardealer' then
|
||||||
Config.Zones.BossActions.Type = 1
|
Config.Zones.ShopEntering.Type = -1
|
||||||
end
|
Config.Zones.BossActions.Type = -1
|
||||||
|
Config.Zones.ResellVehicle.Type = -1
|
||||||
|
return
|
||||||
|
end
|
||||||
|
Config.Zones.ShopEntering.Type = 1
|
||||||
|
|
||||||
else
|
if ESX.PlayerData.job.grade_name == 'boss' then
|
||||||
Config.Zones.ShopEntering.Type = -1
|
Config.Zones.BossActions.Type = 1
|
||||||
Config.Zones.BossActions.Type = -1
|
|
||||||
Config.Zones.ResellVehicle.Type = -1
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
@@ -45,21 +31,35 @@ AddEventHandler('esx:playerLoaded', function(xPlayer)
|
|||||||
ESX.PlayerData = xPlayer
|
ESX.PlayerData = xPlayer
|
||||||
|
|
||||||
PlayerManagement()
|
PlayerManagement()
|
||||||
getVehicles()
|
TriggerServerEvent("esx_vehicleshop:getVehiclesAndCategories")
|
||||||
end)
|
end)
|
||||||
|
|
||||||
RegisterNetEvent('esx_vehicleshop:sendCategories')
|
RegisterNetEvent('esx_vehicleshop:updateVehiclesAndCategories', function(vehicles, categories, vehiclesByModel)
|
||||||
AddEventHandler('esx_vehicleshop:sendCategories', function(categories)
|
|
||||||
Categories = categories
|
|
||||||
end)
|
|
||||||
|
|
||||||
RegisterNetEvent('esx_vehicleshop:sendVehicles')
|
|
||||||
AddEventHandler('esx_vehicleshop:sendVehicles', function(vehicles)
|
|
||||||
Vehicles = vehicles
|
Vehicles = vehicles
|
||||||
|
Categories = categories
|
||||||
|
|
||||||
|
VehiclesByModel = vehiclesByModel
|
||||||
|
|
||||||
|
table.sort(Vehicles, function(a, b)
|
||||||
|
return a.name < b.name
|
||||||
|
end)
|
||||||
|
|
||||||
|
for _, vehicle in ipairs(Vehicles) do
|
||||||
|
if IsModelInCdimage(joaat(vehicle.model)) then
|
||||||
|
local category = vehicle.category
|
||||||
|
|
||||||
|
if not vehiclesByCategory[category] then
|
||||||
|
vehiclesByCategory[category] = {}
|
||||||
|
end
|
||||||
|
|
||||||
|
table.insert(vehiclesByCategory[category], vehicle)
|
||||||
|
else
|
||||||
|
print(('[^3WARNING^7] Ignoring vehicle ^5%s^7 due to invalid Model'):format(vehicle.model))
|
||||||
|
end
|
||||||
|
end
|
||||||
end)
|
end)
|
||||||
|
|
||||||
|
RegisterNetEvent('esx:setJob', PlayerManagement)
|
||||||
RegisterNetEvent('esx:setJob') AddEventHandler('esx:setJob', PlayerManagement)
|
|
||||||
|
|
||||||
function DeleteDisplayVehicleInsideShop()
|
function DeleteDisplayVehicleInsideShop()
|
||||||
local attempt = 0
|
local attempt = 0
|
||||||
@@ -81,7 +81,7 @@ function ReturnVehicleProvider()
|
|||||||
ESX.TriggerServerCallback('esx_vehicleshop:getCommercialVehicles', function(vehicles)
|
ESX.TriggerServerCallback('esx_vehicleshop:getCommercialVehicles', function(vehicles)
|
||||||
local elements = {}
|
local elements = {}
|
||||||
|
|
||||||
for k,v in ipairs(vehicles) do
|
for k, v in ipairs(vehicles) do
|
||||||
local returnPrice = ESX.Math.Round(v.price * 0.75)
|
local returnPrice = ESX.Math.Round(v.price * 0.75)
|
||||||
local vehicleLabel = getVehicleFromModel(v.vehicle).label
|
local vehicleLabel = getVehicleFromModel(v.vehicle).label
|
||||||
|
|
||||||
@@ -135,28 +135,9 @@ function OpenShopMenu()
|
|||||||
SetEntityVisible(playerPed, false)
|
SetEntityVisible(playerPed, false)
|
||||||
SetEntityCoords(playerPed, Config.Zones.ShopInside.Pos)
|
SetEntityCoords(playerPed, Config.Zones.ShopInside.Pos)
|
||||||
|
|
||||||
local vehiclesByCategory = {}
|
|
||||||
local elements = {}
|
local elements = {}
|
||||||
local firstVehicleData = nil
|
local firstVehicleData = nil
|
||||||
|
|
||||||
for i=1, #Categories, 1 do
|
|
||||||
vehiclesByCategory[Categories[i].name] = {}
|
|
||||||
end
|
|
||||||
|
|
||||||
for i=1, #Vehicles, 1 do
|
|
||||||
if IsModelInCdimage(joaat(Vehicles[i].model)) then
|
|
||||||
table.insert(vehiclesByCategory[Vehicles[i].category], Vehicles[i])
|
|
||||||
else
|
|
||||||
print(('[^3WARNING^7] Ignoring vehicle ^5%s^7 due to invalid Model'):format(Vehicles[i].model))
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
for k,v in pairs(vehiclesByCategory) do
|
|
||||||
table.sort(v, function(a, b)
|
|
||||||
return a.name < b.name
|
|
||||||
end)
|
|
||||||
end
|
|
||||||
|
|
||||||
for i=1, #Categories, 1 do
|
for i=1, #Categories, 1 do
|
||||||
local category = Categories[i]
|
local category = Categories[i]
|
||||||
local categoryVehicles = vehiclesByCategory[category.name]
|
local categoryVehicles = vehiclesByCategory[category.name]
|
||||||
@@ -439,7 +420,7 @@ function OpenPopVehicleMenu()
|
|||||||
local vehicleLabel = getVehicleFromModel(v.vehicle).label
|
local vehicleLabel = getVehicleFromModel(v.vehicle).label
|
||||||
|
|
||||||
table.insert(elements, {
|
table.insert(elements, {
|
||||||
label = ('%s [MSRP <span style="color:green;">%s</span>]'):format(vehicleLabel, TranslateCap('generic_shopitem', ESX.Math.GroupDigits(v.price))),
|
label = ('%s [<span style="color:green;">%s</span>]'):format(vehicleLabel, TranslateCap('generic_shopitem', ESX.Math.GroupDigits(v.price))),
|
||||||
value = v.vehicle
|
value = v.vehicle
|
||||||
})
|
})
|
||||||
end
|
end
|
||||||
@@ -630,21 +611,18 @@ function OpenPutStocksMenu()
|
|||||||
end)
|
end)
|
||||||
end
|
end
|
||||||
|
|
||||||
AddEventHandler('esx_vehicleshop:hasEnteredMarker', function(zone)
|
function hasEnteredMarker(zone)
|
||||||
if zone == 'ShopEntering' then
|
if zone == 'ShopEntering' then
|
||||||
|
if not Config.EnablePlayerManagement then
|
||||||
if Config.EnablePlayerManagement then
|
|
||||||
if ESX.PlayerData.job ~= nil and ESX.PlayerData.job.name == 'cardealer' then
|
|
||||||
CurrentAction = 'reseller_menu'
|
|
||||||
CurrentActionMsg = TranslateCap('shop_menu')
|
|
||||||
CurrentActionData = {}
|
|
||||||
end
|
|
||||||
else
|
|
||||||
CurrentAction = 'shop_menu'
|
CurrentAction = 'shop_menu'
|
||||||
CurrentActionMsg = TranslateCap('shop_menu')
|
CurrentActionMsg = TranslateCap('shop_menu')
|
||||||
CurrentActionData = {}
|
CurrentActionData = {}
|
||||||
end
|
end
|
||||||
|
if ESX.PlayerData.job ~= nil and ESX.PlayerData.job.name == 'cardealer' then
|
||||||
|
CurrentAction = 'reseller_menu'
|
||||||
|
CurrentActionMsg = TranslateCap('shop_menu')
|
||||||
|
CurrentActionData = {}
|
||||||
|
end
|
||||||
elseif zone == 'GiveBackVehicle' and Config.EnablePlayerManagement then
|
elseif zone == 'GiveBackVehicle' and Config.EnablePlayerManagement then
|
||||||
local playerPed = PlayerPedId()
|
local playerPed = PlayerPedId()
|
||||||
|
|
||||||
@@ -696,15 +674,15 @@ AddEventHandler('esx_vehicleshop:hasEnteredMarker', function(zone)
|
|||||||
CurrentActionMsg = TranslateCap('shop_menu')
|
CurrentActionMsg = TranslateCap('shop_menu')
|
||||||
CurrentActionData = {}
|
CurrentActionData = {}
|
||||||
end
|
end
|
||||||
end)
|
end
|
||||||
|
|
||||||
AddEventHandler('esx_vehicleshop:hasExitedMarker', function(zone)
|
function hasExitedMarker(zone)
|
||||||
if not IsInShopMenu then
|
if not IsInShopMenu then
|
||||||
ESX.UI.Menu.CloseAll()
|
ESX.UI.Menu.CloseAll()
|
||||||
end
|
end
|
||||||
ESX.HideUI()
|
ESX.HideUI()
|
||||||
CurrentAction = nil
|
CurrentAction = nil
|
||||||
end)
|
end
|
||||||
|
|
||||||
AddEventHandler('onResourceStop', function(resource)
|
AddEventHandler('onResourceStop', function(resource)
|
||||||
if resource == GetCurrentResourceName() then
|
if resource == GetCurrentResourceName() then
|
||||||
@@ -736,8 +714,8 @@ if Config.EnablePlayerManagement then
|
|||||||
end
|
end
|
||||||
|
|
||||||
-- Create Blips
|
-- Create Blips
|
||||||
CreateThread(function()
|
if Config.Blip.show then
|
||||||
if Config.Blip.show then
|
CreateThread(function()
|
||||||
local blip = AddBlipForCoord(Config.Zones.ShopEntering.Pos)
|
local blip = AddBlipForCoord(Config.Zones.ShopEntering.Pos)
|
||||||
|
|
||||||
SetBlipSprite (blip, Config.Blip.Sprite)
|
SetBlipSprite (blip, Config.Blip.Sprite)
|
||||||
@@ -748,8 +726,8 @@ CreateThread(function()
|
|||||||
BeginTextCommandSetBlipName('STRING')
|
BeginTextCommandSetBlipName('STRING')
|
||||||
AddTextComponentSubstringPlayerName(TranslateCap('car_dealer'))
|
AddTextComponentSubstringPlayerName(TranslateCap('car_dealer'))
|
||||||
EndTextCommandSetBlipName(blip)
|
EndTextCommandSetBlipName(blip)
|
||||||
end
|
end)
|
||||||
end)
|
end
|
||||||
|
|
||||||
-- Enter / Exit marker events & Draw Markers
|
-- Enter / Exit marker events & Draw Markers
|
||||||
CreateThread(function()
|
CreateThread(function()
|
||||||
@@ -777,12 +755,12 @@ CreateThread(function()
|
|||||||
if (isInMarker and not HasAlreadyEnteredMarker) or (isInMarker and LastZone ~= currentZone) then
|
if (isInMarker and not HasAlreadyEnteredMarker) or (isInMarker and LastZone ~= currentZone) then
|
||||||
HasAlreadyEnteredMarker, LastZone = true, currentZone
|
HasAlreadyEnteredMarker, LastZone = true, currentZone
|
||||||
LastZone = currentZone
|
LastZone = currentZone
|
||||||
TriggerEvent('esx_vehicleshop:hasEnteredMarker', currentZone)
|
hasEnteredMarker(currentZone)
|
||||||
end
|
end
|
||||||
|
|
||||||
if not isInMarker and HasAlreadyEnteredMarker then
|
if not isInMarker and HasAlreadyEnteredMarker then
|
||||||
HasAlreadyEnteredMarker = false
|
HasAlreadyEnteredMarker = false
|
||||||
TriggerEvent('esx_vehicleshop:hasExitedMarker', LastZone)
|
hasExitedMarker(LastZone)
|
||||||
end
|
end
|
||||||
|
|
||||||
if letSleep then
|
if letSleep then
|
||||||
|
|||||||
@@ -7,27 +7,13 @@ for i = 65, 90 do table.insert(Charset, string.char(i)) end
|
|||||||
for i = 97, 122 do table.insert(Charset, string.char(i)) end
|
for i = 97, 122 do table.insert(Charset, string.char(i)) end
|
||||||
|
|
||||||
function GeneratePlate()
|
function GeneratePlate()
|
||||||
local generatedPlate
|
math.randomseed(GetGameTimer())
|
||||||
local doBreak = false
|
|
||||||
|
|
||||||
while true do
|
local generatedPlate = string.upper(GetRandomLetter(Config.PlateLetters) .. (Config.PlateUseSpace and ' ' or '') .. GetRandomNumber(Config.PlateNumbers))
|
||||||
Wait(0)
|
|
||||||
math.randomseed(GetGameTimer())
|
|
||||||
if Config.PlateUseSpace then
|
|
||||||
generatedPlate = string.upper(GetRandomLetter(Config.PlateLetters) .. ' ' .. GetRandomNumber(Config.PlateNumbers))
|
|
||||||
else
|
|
||||||
generatedPlate = string.upper(GetRandomLetter(Config.PlateLetters) .. GetRandomNumber(Config.PlateNumbers))
|
|
||||||
end
|
|
||||||
|
|
||||||
ESX.TriggerServerCallback('esx_vehicleshop:isPlateTaken', function(isPlateTaken)
|
local isTaken = IsPlateTaken(generatedPlate)
|
||||||
if not isPlateTaken then
|
if isTaken then
|
||||||
doBreak = true
|
return GeneratePlate()
|
||||||
end
|
|
||||||
end, generatedPlate)
|
|
||||||
|
|
||||||
if doBreak then
|
|
||||||
break
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
|
|
||||||
return generatedPlate
|
return generatedPlate
|
||||||
@@ -35,33 +21,21 @@ end
|
|||||||
|
|
||||||
-- mixing async with sync tasks
|
-- mixing async with sync tasks
|
||||||
function IsPlateTaken(plate)
|
function IsPlateTaken(plate)
|
||||||
local callback = 'waiting'
|
local p = promise.new()
|
||||||
|
|
||||||
ESX.TriggerServerCallback('esx_vehicleshop:isPlateTaken', function(isPlateTaken)
|
ESX.TriggerServerCallback('esx_vehicleshop:isPlateTaken', function(isPlateTaken)
|
||||||
callback = isPlateTaken
|
p:resolve(isPlateTaken)
|
||||||
end, plate)
|
end, plate)
|
||||||
|
|
||||||
while type(callback) == 'string' do
|
return Citizen.Await(p)
|
||||||
Wait(0)
|
|
||||||
end
|
|
||||||
|
|
||||||
return callback
|
|
||||||
end
|
end
|
||||||
|
|
||||||
function GetRandomNumber(length)
|
function GetRandomNumber(length)
|
||||||
Wait(0)
|
Wait(0)
|
||||||
if length > 0 then
|
return length > 0 and GetRandomNumber(length - 1) .. NumberCharset[math.random(1, #NumberCharset)] or ''
|
||||||
return GetRandomNumber(length - 1) .. NumberCharset[math.random(1, #NumberCharset)]
|
|
||||||
else
|
|
||||||
return ''
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
|
|
||||||
function GetRandomLetter(length)
|
function GetRandomLetter(length)
|
||||||
Wait(0)
|
Wait(0)
|
||||||
if length > 0 then
|
return length > 0 and GetRandomLetter(length - 1) .. Charset[math.random(1, #Charset)] or ''
|
||||||
return GetRandomLetter(length - 1) .. Charset[math.random(1, #Charset)]
|
|
||||||
else
|
|
||||||
return ''
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -2,13 +2,13 @@ Locales['hu'] = {
|
|||||||
-- global menus
|
-- global menus
|
||||||
['not_enough_in_society'] = 'nincs elég ~r~tárgyad a vállalkozásban!',
|
['not_enough_in_society'] = 'nincs elég ~r~tárgyad a vállalkozásban!',
|
||||||
['player_cannot_hold'] = '~r~nincs elég helyed a leltárban!',
|
['player_cannot_hold'] = '~r~nincs elég helyed a leltárban!',
|
||||||
['vehicle_belongs'] = 'egy jármü engedélyel %s most már hozzád tartozik',
|
['vehicle_belongs'] = '%s rendszámú jármű már a tulajdonodban van.',
|
||||||
['broke_company'] = 'nincs elég pénz a vállalati számlán',
|
['broke_company'] = 'nincs elég pénz a vállalati számlán',
|
||||||
['license_missing'] = 'nincs jogosítványod tedd le!',
|
['license_missing'] = 'nincs jogosítványod tedd le!',
|
||||||
['purchase_type'] = 'a vásárlás típusa',
|
['purchase_type'] = 'a vásárlás típusa',
|
||||||
['society_type'] = 'vállalkozás',
|
['society_type'] = 'vállalkozás',
|
||||||
['staff_type'] = 'személyes használat',
|
['staff_type'] = 'személyes használat',
|
||||||
['buy_vehicle_shop'] = 'meg szeretnéd vásárolni %s ennyiért: %s NP-ért?',
|
['buy_vehicle_shop'] = 'meg szeretnéd vásárolni %s ennyiért: %s $-ért?',
|
||||||
['buy_vehicle'] = 'vásárlás',
|
['buy_vehicle'] = 'vásárlás',
|
||||||
['car_dealer'] = 'Autókereskedés',
|
['car_dealer'] = 'Autókereskedés',
|
||||||
['shop_awaiting_model'] = 'az autó töltése folyamantban kérlek várj',
|
['shop_awaiting_model'] = 'az autó töltése folyamantban kérlek várj',
|
||||||
@@ -26,23 +26,23 @@ Locales['hu'] = {
|
|||||||
['not_enough_money'] = 'nincs elég pénzed',
|
['not_enough_money'] = 'nincs elég pénzed',
|
||||||
['not_rental'] = 'ez nem ~r~bérelhetö autó',
|
['not_rental'] = 'ez nem ~r~bérelhetö autó',
|
||||||
['not_yours'] = 'ez az autó nem tartozik hozzád',
|
['not_yours'] = 'ez az autó nem tartozik hozzád',
|
||||||
['paid_rental'] = 'fizettél a kölcsönzönek: %s NP',
|
['paid_rental'] = 'fizettél a kölcsönzönek: %s $',
|
||||||
['pop_vehicle'] = 'tedd a jármüvet eladásra',
|
['pop_vehicle'] = 'tedd a jármüvet eladásra',
|
||||||
['rent_vehicle'] = 'Autókereskedö - Jármüvek bérlése',
|
['rent_vehicle'] = 'Autókereskedö - Jármüvek bérlése',
|
||||||
['return_provider_menu'] = 'Autókereskedö - Jámrü vissza adás a szollgáltatónak',
|
['return_provider_menu'] = 'Autókereskedö - Jámrü vissza adás a szollgáltatónak',
|
||||||
['rental_amount'] = 'bérlési költség',
|
['rental_amount'] = 'bérlési költség',
|
||||||
['sell_menu'] = 'nyomj [E] gombot hogy eladd a %s ennyiért %s NP',
|
['sell_menu'] = 'nyomj [E] gombot hogy eladd a %s ennyiért %s $',
|
||||||
['set_vehicle_owner_rent'] = 'jármü kijelölése [Location]',
|
['set_vehicle_owner_rent'] = 'jármü kijelölése [Location]',
|
||||||
['set_vehicle_owner_sell'] = 'jármü eladása',
|
['set_vehicle_owner_sell'] = 'jármü eladása',
|
||||||
['set_vehicle_owner_sell_society'] = 'jármü kijelölése [Sale] [Society]',
|
['set_vehicle_owner_sell_society'] = 'jármü kijelölése [Sale] [Society]',
|
||||||
['shop_menu'] = 'nyomj [E] gombot a vásárláshoz',
|
['shop_menu'] = 'nyomj [E] gombot a vásárláshoz',
|
||||||
['generic_shopitem'] = '%s NP',
|
['generic_shopitem'] = '%s $',
|
||||||
['vehicle_dealer'] = 'jármü - Autókereskedö',
|
['vehicle_dealer'] = 'jármü - Autókereskedö',
|
||||||
['vehicle_menu'] = 'nyomj [E] gombot hogy vissza add a bérelt jármüvet',
|
['vehicle_menu'] = 'nyomj [E] gombot hogy vissza add a bérelt jármüvet',
|
||||||
['vehicle_purchased'] = 'vásároltál egy jármüvet',
|
['vehicle_purchased'] = 'vásároltál egy jármüvet',
|
||||||
['vehicle_set_owned'] = 'jármü %s megvéve ennyiért: %s',
|
['vehicle_set_owned'] = 'jármü %s megvéve ennyiért: %s',
|
||||||
['vehicle_set_rented'] = 'jármü %s kibérelve ennyiért: %s',
|
['vehicle_set_rented'] = 'jármü %s kibérelve ennyiért: %s',
|
||||||
['vehicle_sold_for'] = 'A %s jármü eladva ennyiért %s NP',
|
['vehicle_sold_for'] = 'A %s jármü eladva ennyiért %s $',
|
||||||
['vehicle_sold_to'] = 'a jármü rendszámmal %s eladva neki: %s',
|
['vehicle_sold_to'] = 'a jármü rendszámmal %s eladva neki: %s',
|
||||||
['deposit_stock'] = 'beteszek a készletbe',
|
['deposit_stock'] = 'beteszek a készletbe',
|
||||||
['take_stock'] = 'kiveszek a készletböl',
|
['take_stock'] = 'kiveszek a készletböl',
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
local categories, vehicles = {}, {}
|
local categories, vehicles = {}, {}
|
||||||
|
local vehiclesByModel = {}
|
||||||
|
|
||||||
TriggerEvent('esx_phone:registerNumber', 'cardealer', TranslateCap('dealer_customers'), false, false)
|
TriggerEvent('esx_phone:registerNumber', 'cardealer', TranslateCap('dealer_customers'), false, false)
|
||||||
CreateThread(function()
|
CreateThread(function()
|
||||||
@@ -27,62 +28,50 @@ end)
|
|||||||
|
|
||||||
function SQLVehiclesAndCategories()
|
function SQLVehiclesAndCategories()
|
||||||
categories = MySQL.query.await('SELECT * FROM vehicle_categories')
|
categories = MySQL.query.await('SELECT * FROM vehicle_categories')
|
||||||
vehicles = MySQL.query.await('SELECT * FROM vehicles')
|
vehicles = MySQL.query.await('SELECT vehicles.*, vehicle_categories.label AS categoryLabel FROM vehicles JOIN vehicle_categories ON vehicles.category = vehicle_categories.name')
|
||||||
|
|
||||||
GetVehiclesAndCategories(categories, vehicles)
|
for _, vehicle in pairs(vehicles) do
|
||||||
end
|
vehiclesByModel[vehicle.model] = vehicle
|
||||||
|
|
||||||
function GetVehiclesAndCategories(categories, vehicles)
|
|
||||||
for i = 1, #vehicles do
|
|
||||||
local vehicle = vehicles[i]
|
|
||||||
for j = 1, #categories do
|
|
||||||
local category = categories[j]
|
|
||||||
if category.name == vehicle.category then
|
|
||||||
vehicle.categoryLabel = category.label
|
|
||||||
break
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
|
|
||||||
-- send information after db has loaded, making sure everyone gets vehicle information
|
TriggerClientEvent("esx_vehicleshop:updateVehiclesAndCategories", -1, vehicles, categories, vehiclesByModel)
|
||||||
TriggerClientEvent('esx_vehicleshop:sendCategories', -1, categories)
|
|
||||||
TriggerClientEvent('esx_vehicleshop:sendVehicles', -1, vehicles)
|
|
||||||
end
|
end
|
||||||
|
|
||||||
function getVehicleFromModel(model)
|
function getVehicleFromModel(model)
|
||||||
for i = 1, #vehicles do
|
return vehiclesByModel[model]
|
||||||
local vehicle = vehicles[i]
|
|
||||||
if vehicle.model == model then
|
|
||||||
return vehicle
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
return
|
|
||||||
end
|
end
|
||||||
|
|
||||||
|
RegisterNetEvent("esx_vehicleshop:getVehiclesAndCategories", function()
|
||||||
|
TriggerClientEvent("esx_vehicleshop:updateVehiclesAndCategories", source, vehicles, categories, vehiclesByModel)
|
||||||
|
end)
|
||||||
|
|
||||||
RegisterNetEvent('esx_vehicleshop:setVehicleOwnedPlayerId')
|
RegisterNetEvent('esx_vehicleshop:setVehicleOwnedPlayerId')
|
||||||
AddEventHandler('esx_vehicleshop:setVehicleOwnedPlayerId', function(playerId, vehicleProps, model, label)
|
AddEventHandler('esx_vehicleshop:setVehicleOwnedPlayerId', function(playerId, vehicleProps, model, label)
|
||||||
local xPlayer, xTarget = ESX.GetPlayerFromId(source), ESX.GetPlayerFromId(playerId)
|
local xPlayer, xTarget = ESX.GetPlayerFromId(source), ESX.GetPlayerFromId(playerId)
|
||||||
|
|
||||||
if xPlayer.job.name == 'cardealer' and xTarget then
|
if xPlayer.job.name ~= 'cardealer' or not xTarget then
|
||||||
MySQL.scalar('SELECT id FROM cardealer_vehicles WHERE vehicle = ?', {model},
|
return
|
||||||
function(id)
|
end
|
||||||
if id then
|
|
||||||
MySQL.update('DELETE FROM cardealer_vehicles WHERE id = ?', {id},
|
|
||||||
function(rowsChanged)
|
|
||||||
if rowsChanged == 1 then
|
|
||||||
MySQL.insert('INSERT INTO owned_vehicles (owner, plate, vehicle) VALUES (?, ?, ?)', {xTarget.identifier, vehicleProps.plate, json.encode(vehicleProps)},
|
|
||||||
function(id)
|
|
||||||
xPlayer.showNotification(TranslateCap('vehicle_set_owned', vehicleProps.plate, xTarget.getName()))
|
|
||||||
xTarget.showNotification(TranslateCap('vehicle_belongs', vehicleProps.plate))
|
|
||||||
end)
|
|
||||||
|
|
||||||
MySQL.insert('INSERT INTO vehicle_sold (client, model, plate, soldby, date) VALUES (?, ?, ?, ?, ?)', {xTarget.getName(), label, vehicleProps.plate, xPlayer.getName(), os.date('%Y-%m-%d %H:%M')})
|
MySQL.scalar('SELECT id FROM cardealer_vehicles WHERE vehicle = ?', {model},
|
||||||
end
|
function(id)
|
||||||
|
if not id then
|
||||||
|
return
|
||||||
|
end
|
||||||
|
|
||||||
|
MySQL.update('DELETE FROM cardealer_vehicles WHERE id = ?', {id},
|
||||||
|
function(rowsChanged)
|
||||||
|
if rowsChanged == 1 then
|
||||||
|
MySQL.insert('INSERT INTO owned_vehicles (owner, plate, vehicle) VALUES (?, ?, ?)', {xTarget.identifier, vehicleProps.plate, json.encode(vehicleProps)},
|
||||||
|
function(id)
|
||||||
|
xPlayer.showNotification(TranslateCap('vehicle_set_owned', vehicleProps.plate, xTarget.getName()))
|
||||||
|
xTarget.showNotification(TranslateCap('vehicle_belongs', vehicleProps.plate))
|
||||||
end)
|
end)
|
||||||
|
|
||||||
|
MySQL.insert('INSERT INTO vehicle_sold (client, model, plate, soldby, date) VALUES (?, ?, ?, ?, ?)', {xTarget.getName(), label, vehicleProps.plate, xPlayer.getName(), os.date('%Y-%m-%d %H:%M')})
|
||||||
end
|
end
|
||||||
end)
|
end)
|
||||||
end
|
end)
|
||||||
end)
|
end)
|
||||||
|
|
||||||
ESX.RegisterServerCallback('esx_vehicleshop:getSoldVehicles', function(source, cb)
|
ESX.RegisterServerCallback('esx_vehicleshop:getSoldVehicles', function(source, cb)
|
||||||
@@ -95,22 +84,28 @@ RegisterNetEvent('esx_vehicleshop:rentVehicle')
|
|||||||
AddEventHandler('esx_vehicleshop:rentVehicle', function(vehicle, plate, rentPrice, playerId)
|
AddEventHandler('esx_vehicleshop:rentVehicle', function(vehicle, plate, rentPrice, playerId)
|
||||||
local xPlayer, xTarget = ESX.GetPlayerFromId(source), ESX.GetPlayerFromId(playerId)
|
local xPlayer, xTarget = ESX.GetPlayerFromId(source), ESX.GetPlayerFromId(playerId)
|
||||||
|
|
||||||
if xPlayer.job.name == 'cardealer' and xTarget then
|
if xPlayer.job.name ~= 'cardealer' or not xTarget then
|
||||||
MySQL.single('SELECT id, price FROM cardealer_vehicles WHERE vehicle = ?', {vehicle},
|
return
|
||||||
function(result)
|
|
||||||
if result then
|
|
||||||
MySQL.update('DELETE FROM cardealer_vehicles WHERE id = ?', {result.id},
|
|
||||||
function(rowsChanged)
|
|
||||||
if rowsChanged == 1 then
|
|
||||||
MySQL.insert('INSERT INTO rented_vehicles (vehicle, plate, player_name, base_price, rent_price, owner) VALUES (?, ?, ?, ?, ?, ?)', {vehicle, plate, xTarget.getName(), result.price, rentPrice, xTarget.identifier},
|
|
||||||
function(id)
|
|
||||||
xPlayer.showNotification(TranslateCap('vehicle_set_rented', plate, xTarget.getName()))
|
|
||||||
end)
|
|
||||||
end
|
|
||||||
end)
|
|
||||||
end
|
|
||||||
end)
|
|
||||||
end
|
end
|
||||||
|
|
||||||
|
MySQL.single('SELECT id, price FROM cardealer_vehicles WHERE vehicle = ?', {vehicle},
|
||||||
|
function(result)
|
||||||
|
if not result then
|
||||||
|
return
|
||||||
|
end
|
||||||
|
|
||||||
|
MySQL.update('DELETE FROM cardealer_vehicles WHERE id = ?', {result.id},
|
||||||
|
function(rowsChanged)
|
||||||
|
if rowsChanged ~= 1 then
|
||||||
|
return
|
||||||
|
end
|
||||||
|
|
||||||
|
MySQL.insert('INSERT INTO rented_vehicles (vehicle, plate, player_name, base_price, rent_price, owner) VALUES (?, ?, ?, ?, ?, ?)', {vehicle, plate, xTarget.getName(), result.price, rentPrice, xTarget.identifier},
|
||||||
|
function(id)
|
||||||
|
xPlayer.showNotification(TranslateCap('vehicle_set_rented', plate, xTarget.getName()))
|
||||||
|
end)
|
||||||
|
end)
|
||||||
|
end)
|
||||||
end)
|
end)
|
||||||
|
|
||||||
RegisterNetEvent('esx_vehicleshop:getStockItem')
|
RegisterNetEvent('esx_vehicleshop:getStockItem')
|
||||||
@@ -125,13 +120,12 @@ AddEventHandler('esx_vehicleshop:getStockItem', function(itemName, count)
|
|||||||
if count > 0 and item.count >= count then
|
if count > 0 and item.count >= count then
|
||||||
|
|
||||||
-- can the player carry the said amount of x item?
|
-- can the player carry the said amount of x item?
|
||||||
if xPlayer.canCarryItem(itemName, count) then
|
if not xPlayer.canCarryItem(itemName, count) then
|
||||||
inventory.removeItem(itemName, count)
|
return xPlayer.showNotification(TranslateCap('player_cannot_hold'))
|
||||||
xPlayer.addInventoryItem(itemName, count)
|
|
||||||
xPlayer.showNotification(TranslateCap('have_withdrawn', count, item.label))
|
|
||||||
else
|
|
||||||
xPlayer.showNotification(TranslateCap('player_cannot_hold'))
|
|
||||||
end
|
end
|
||||||
|
inventory.removeItem(itemName, count)
|
||||||
|
xPlayer.addInventoryItem(itemName, count)
|
||||||
|
xPlayer.showNotification(TranslateCap('have_withdrawn', count, item.label))
|
||||||
else
|
else
|
||||||
xPlayer.showNotification(TranslateCap('not_enough_in_society'))
|
xPlayer.showNotification(TranslateCap('not_enough_in_society'))
|
||||||
end
|
end
|
||||||
@@ -156,14 +150,6 @@ AddEventHandler('esx_vehicleshop:putStockItems', function(itemName, count)
|
|||||||
end)
|
end)
|
||||||
end)
|
end)
|
||||||
|
|
||||||
ESX.RegisterServerCallback('esx_vehicleshop:getCategories', function(source, cb)
|
|
||||||
cb(categories)
|
|
||||||
end)
|
|
||||||
|
|
||||||
ESX.RegisterServerCallback('esx_vehicleshop:getVehicles', function(source, cb)
|
|
||||||
cb(vehicles)
|
|
||||||
end)
|
|
||||||
|
|
||||||
ESX.RegisterServerCallback('esx_vehicleshop:buyVehicle', function(source, cb, model, plate)
|
ESX.RegisterServerCallback('esx_vehicleshop:buyVehicle', function(source, cb, model, plate)
|
||||||
local xPlayer = ESX.GetPlayerFromId(source)
|
local xPlayer = ESX.GetPlayerFromId(source)
|
||||||
local modelPrice = getVehicleFromModel(model).price
|
local modelPrice = getVehicleFromModel(model).price
|
||||||
@@ -196,53 +182,57 @@ end)
|
|||||||
ESX.RegisterServerCallback('esx_vehicleshop:buyCarDealerVehicle', function(source, cb, model)
|
ESX.RegisterServerCallback('esx_vehicleshop:buyCarDealerVehicle', function(source, cb, model)
|
||||||
local xPlayer = ESX.GetPlayerFromId(source)
|
local xPlayer = ESX.GetPlayerFromId(source)
|
||||||
|
|
||||||
if xPlayer.job.name == 'cardealer' then
|
if xPlayer.job.name ~= 'cardealer' then
|
||||||
local modelPrice = getVehicleFromModel(model).price
|
return cb(false)
|
||||||
|
|
||||||
if modelPrice then
|
|
||||||
TriggerEvent('esx_addonaccount:getSharedAccount', 'society_cardealer', function(account)
|
|
||||||
if account.money >= modelPrice then
|
|
||||||
account.removeMoney(modelPrice)
|
|
||||||
|
|
||||||
MySQL.insert('INSERT INTO cardealer_vehicles (vehicle, price) VALUES (?, ?)', {model, modelPrice},
|
|
||||||
function(rowsChanged)
|
|
||||||
cb(true)
|
|
||||||
end)
|
|
||||||
else
|
|
||||||
cb(false)
|
|
||||||
end
|
|
||||||
end)
|
|
||||||
end
|
|
||||||
end
|
end
|
||||||
|
local modelPrice = getVehicleFromModel(model).price
|
||||||
|
|
||||||
|
if not modelPrice then
|
||||||
|
return cb(false)
|
||||||
|
end
|
||||||
|
TriggerEvent('esx_addonaccount:getSharedAccount', 'society_cardealer', function(account)
|
||||||
|
if account.money < modelPrice then
|
||||||
|
return cb(false)
|
||||||
|
end
|
||||||
|
|
||||||
|
account.removeMoney(modelPrice)
|
||||||
|
|
||||||
|
MySQL.insert('INSERT INTO cardealer_vehicles (vehicle, price) VALUES (?, ?)', {model, modelPrice},
|
||||||
|
function(rowsChanged)
|
||||||
|
cb(true)
|
||||||
|
end)
|
||||||
|
end)
|
||||||
end)
|
end)
|
||||||
|
|
||||||
RegisterNetEvent('esx_vehicleshop:returnProvider')
|
RegisterNetEvent('esx_vehicleshop:returnProvider')
|
||||||
AddEventHandler('esx_vehicleshop:returnProvider', function(vehicleModel)
|
AddEventHandler('esx_vehicleshop:returnProvider', function(vehicleModel)
|
||||||
local xPlayer = ESX.GetPlayerFromId(source)
|
local xPlayer = ESX.GetPlayerFromId(source)
|
||||||
|
|
||||||
if xPlayer.job.name == 'cardealer' then
|
if xPlayer.job.name ~= 'cardealer' then
|
||||||
MySQL.single('SELECT id, price FROM cardealer_vehicles WHERE vehicle = ?', {vehicleModel},
|
return
|
||||||
function(result)
|
|
||||||
if result then
|
|
||||||
local id = result.id
|
|
||||||
|
|
||||||
MySQL.update('DELETE FROM cardealer_vehicles WHERE id = ?', {id},
|
|
||||||
function(rowsChanged)
|
|
||||||
if rowsChanged == 1 then
|
|
||||||
TriggerEvent('esx_addonaccount:getSharedAccount', 'society_cardealer', function(account)
|
|
||||||
local price = ESX.Math.Round(result.price * 0.75)
|
|
||||||
local vehicleLabel = getVehicleFromModel(vehicleModel).label
|
|
||||||
|
|
||||||
account.addMoney(price)
|
|
||||||
xPlayer.showNotification(TranslateCap('vehicle_sold_for', vehicleLabel, ESX.Math.GroupDigits(price)))
|
|
||||||
end)
|
|
||||||
end
|
|
||||||
end)
|
|
||||||
else
|
|
||||||
print(('[^3WARNING^7] Player ^5%s^7 Attempted To Sell Invalid Vehicle - ^5%s^7!'):format(source, vehicleModel))
|
|
||||||
end
|
|
||||||
end)
|
|
||||||
end
|
end
|
||||||
|
MySQL.single('SELECT id, price FROM cardealer_vehicles WHERE vehicle = ?', {vehicleModel},
|
||||||
|
function(result)
|
||||||
|
if not result then
|
||||||
|
return print(('[^3WARNING^7] Player ^5%s^7 Attempted To Sell Invalid Vehicle - ^5%s^7!'):format(source, vehicleModel))
|
||||||
|
end
|
||||||
|
|
||||||
|
local id = result.id
|
||||||
|
|
||||||
|
MySQL.update('DELETE FROM cardealer_vehicles WHERE id = ?', {id},
|
||||||
|
function(rowsChanged)
|
||||||
|
if rowsChanged ~= 1 then
|
||||||
|
return
|
||||||
|
end
|
||||||
|
TriggerEvent('esx_addonaccount:getSharedAccount', 'society_cardealer', function(account)
|
||||||
|
local price = ESX.Math.Round(result.price * 0.75)
|
||||||
|
local vehicleLabel = getVehicleFromModel(vehicleModel).label
|
||||||
|
|
||||||
|
account.addMoney(price)
|
||||||
|
xPlayer.showNotification(TranslateCap('vehicle_sold_for', vehicleLabel, ESX.Math.GroupDigits(price)))
|
||||||
|
end)
|
||||||
|
end)
|
||||||
|
end)
|
||||||
end)
|
end)
|
||||||
|
|
||||||
ESX.RegisterServerCallback('esx_vehicleshop:getRentedVehicles', function(source, cb)
|
ESX.RegisterServerCallback('esx_vehicleshop:getRentedVehicles', function(source, cb)
|
||||||
@@ -265,20 +255,17 @@ end)
|
|||||||
ESX.RegisterServerCallback('esx_vehicleshop:giveBackVehicle', function(source, cb, plate)
|
ESX.RegisterServerCallback('esx_vehicleshop:giveBackVehicle', function(source, cb, plate)
|
||||||
MySQL.single('SELECT base_price, vehicle FROM rented_vehicles WHERE plate = ?', {plate},
|
MySQL.single('SELECT base_price, vehicle FROM rented_vehicles WHERE plate = ?', {plate},
|
||||||
function(result)
|
function(result)
|
||||||
if result then
|
if not result then
|
||||||
local vehicle = result.vehicle
|
return cb(false)
|
||||||
local basePrice = result.base_price
|
|
||||||
|
|
||||||
MySQL.update('DELETE FROM rented_vehicles WHERE plate = ?', {plate},
|
|
||||||
function(rowsChanged)
|
|
||||||
MySQL.insert('INSERT INTO cardealer_vehicles (vehicle, price) VALUES (?, ?)', {result.vehicle, result.base_price})
|
|
||||||
|
|
||||||
RemoveOwnedVehicle(plate)
|
|
||||||
cb(true)
|
|
||||||
end)
|
|
||||||
else
|
|
||||||
cb(false)
|
|
||||||
end
|
end
|
||||||
|
|
||||||
|
MySQL.update('DELETE FROM rented_vehicles WHERE plate = ?', {plate},
|
||||||
|
function()
|
||||||
|
MySQL.insert('INSERT INTO cardealer_vehicles (vehicle, price) VALUES (?, ?)', {result.vehicle, result.base_price})
|
||||||
|
|
||||||
|
RemoveOwnedVehicle(plate)
|
||||||
|
cb(true)
|
||||||
|
end)
|
||||||
end)
|
end)
|
||||||
end)
|
end)
|
||||||
|
|
||||||
@@ -296,36 +283,34 @@ ESX.RegisterServerCallback('esx_vehicleshop:resellVehicle', function(source, cb,
|
|||||||
|
|
||||||
if not resellPrice then
|
if not resellPrice then
|
||||||
print(('[^3WARNING^7] Player ^5%s^7 Attempted To Resell Invalid Vehicle - ^5%s^7!'):format(source, model))
|
print(('[^3WARNING^7] Player ^5%s^7 Attempted To Resell Invalid Vehicle - ^5%s^7!'):format(source, model))
|
||||||
cb(false)
|
return cb(false)
|
||||||
else
|
|
||||||
MySQL.single('SELECT * FROM rented_vehicles WHERE plate = ?', {plate},
|
|
||||||
function(result)
|
|
||||||
if result then -- is it a rented vehicle?
|
|
||||||
cb(false) -- it is, don't let the player sell it since he doesn't own it
|
|
||||||
else
|
|
||||||
MySQL.single('SELECT * FROM owned_vehicles WHERE owner = ? AND plate = ?', {xPlayer.identifier, plate},
|
|
||||||
function(result)
|
|
||||||
if result then -- does the owner match?
|
|
||||||
local vehicle = json.decode(result.vehicle)
|
|
||||||
|
|
||||||
if vehicle.model == model then
|
|
||||||
if vehicle.plate == plate then
|
|
||||||
xPlayer.addMoney(resellPrice, "Sold Vehicle")
|
|
||||||
RemoveOwnedVehicle(plate)
|
|
||||||
cb(true)
|
|
||||||
else
|
|
||||||
print(('[^3WARNING^7] Player ^5%s^7 Attempted To Resell Vehicle With Invalid Plate - ^5%s^7!'):format(source, plate))
|
|
||||||
cb(false)
|
|
||||||
end
|
|
||||||
else
|
|
||||||
print(('[^3WARNING^7] Player ^5%s^7 Attempted To Resell Vehicle With Invalid Model - ^5%s^7!'):format(source, model))
|
|
||||||
cb(false)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end)
|
|
||||||
end
|
|
||||||
end)
|
|
||||||
end
|
end
|
||||||
|
MySQL.single('SELECT * FROM rented_vehicles WHERE plate = ?', {plate},
|
||||||
|
function(result)
|
||||||
|
if result then -- is it a rented vehicle?
|
||||||
|
return cb(false) -- it is, don't let the player sell it since he doesn't own it
|
||||||
|
end
|
||||||
|
MySQL.single('SELECT * FROM owned_vehicles WHERE owner = ? AND plate = ?', {xPlayer.identifier, plate},
|
||||||
|
function(result)
|
||||||
|
if not result then -- does the owner match?
|
||||||
|
return
|
||||||
|
end
|
||||||
|
local vehicle = json.decode(result.vehicle)
|
||||||
|
|
||||||
|
if vehicle.model ~= model then
|
||||||
|
print(('[^3WARNING^7] Player ^5%s^7 Attempted To Resell Vehicle With Invalid Model - ^5%s^7!'):format(source, model))
|
||||||
|
return cb(false)
|
||||||
|
end
|
||||||
|
if vehicle.plate ~= plate then
|
||||||
|
print(('[^3WARNING^7] Player ^5%s^7 Attempted To Resell Vehicle With Invalid Plate - ^5%s^7!'):format(source, plate))
|
||||||
|
return cb(false)
|
||||||
|
end
|
||||||
|
|
||||||
|
xPlayer.addMoney(resellPrice, "Sold Vehicle")
|
||||||
|
RemoveOwnedVehicle(plate)
|
||||||
|
cb(true)
|
||||||
|
end)
|
||||||
|
end)
|
||||||
end
|
end
|
||||||
end)
|
end)
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user