mirror of
https://github.com/esx-framework/esx_core.git
synced 2026-08-31 10:18:54 +00:00
Major improvements, see desc
- Fixed selling same vehicle multiple times - Fixed selling <no> vehicle - Major security improvements - Removed buying vehicle for society - Code cleanup - Fixed depopping vehicle not working (not respecting network owner)
This commit is contained in:
+156
-261
@@ -6,7 +6,7 @@ local CurrentActionData = {}
|
||||
local IsInShopMenu = false
|
||||
local Categories = {}
|
||||
local Vehicles = {}
|
||||
local LastVehicles = {}
|
||||
local currentDisplayVehicle
|
||||
local CurrentVehicleData
|
||||
|
||||
ESX = nil
|
||||
@@ -42,6 +42,16 @@ Citizen.CreateThread(function()
|
||||
end
|
||||
end)
|
||||
|
||||
function getVehicleLabelFromModel(model)
|
||||
for k,v in ipairs(Vehicles) do
|
||||
if v.model == model then
|
||||
return v.name
|
||||
end
|
||||
end
|
||||
|
||||
return
|
||||
end
|
||||
|
||||
RegisterNetEvent('esx:playerLoaded')
|
||||
AddEventHandler('esx:playerLoaded', function(xPlayer)
|
||||
ESX.PlayerData = xPlayer
|
||||
@@ -71,26 +81,33 @@ AddEventHandler('esx_vehicleshop:sendVehicles', function(vehicles)
|
||||
Vehicles = vehicles
|
||||
end)
|
||||
|
||||
function DeleteShopInsideVehicles()
|
||||
while #LastVehicles > 0 do
|
||||
local vehicle = LastVehicles[1]
|
||||
function DeleteDisplayVehicleInsideShop()
|
||||
local attempt = 0
|
||||
|
||||
ESX.Game.DeleteVehicle(vehicle)
|
||||
table.remove(LastVehicles, 1)
|
||||
if currentDisplayVehicle and DoesEntityExist(currentDisplayVehicle) then
|
||||
while DoesEntityExist(currentDisplayVehicle) and not NetworkHasControlOfEntity(currentDisplayVehicle) and attempt < 100 do
|
||||
Citizen.Wait(100)
|
||||
NetworkRequestControlOfEntity(currentDisplayVehicle)
|
||||
attempt = attempt + 1
|
||||
end
|
||||
|
||||
if DoesEntityExist(currentDisplayVehicle) and NetworkHasControlOfEntity(currentDisplayVehicle) then
|
||||
ESX.Game.DeleteVehicle(currentDisplayVehicle)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
function ReturnVehicleProvider()
|
||||
ESX.TriggerServerCallback('esx_vehicleshop:getCommercialVehicles', function(vehicles)
|
||||
local elements = {}
|
||||
local returnPrice
|
||||
|
||||
for i=1, #vehicles, 1 do
|
||||
returnPrice = ESX.Math.Round(vehicles[i].price * 0.75)
|
||||
for k,v in ipairs(vehicles) do
|
||||
local returnPrice = ESX.Math.Round(v.price * 0.75)
|
||||
local vehicleLabel = getVehicleLabelFromModel(v.vehicle)
|
||||
|
||||
table.insert(elements, {
|
||||
label = ('%s [<span style="color:orange;">%s</span>]'):format(vehicles[i].name, _U('generic_shopitem', ESX.Math.GroupDigits(returnPrice))),
|
||||
value = vehicles[i].name
|
||||
label = ('%s [<span style="color:orange;">%s</span>]'):format(vehicleLabel, _U('generic_shopitem', ESX.Math.GroupDigits(returnPrice))),
|
||||
value = v.vehicle
|
||||
})
|
||||
end
|
||||
|
||||
@@ -145,7 +162,7 @@ function OpenShopMenu()
|
||||
if IsModelInCdimage(GetHashKey(Vehicles[i].model)) then
|
||||
table.insert(vehiclesByCategory[Vehicles[i].category], Vehicles[i])
|
||||
else
|
||||
print(('esx_vehicleshop: vehicle "%s" does not exist'):format(Vehicles[i].model))
|
||||
print(('[esx_vehicleshop] [^3ERROR^7] Vehicle "%s" does not exist'):format(Vehicles[i].model))
|
||||
end
|
||||
end
|
||||
|
||||
@@ -190,147 +207,58 @@ function OpenShopMenu()
|
||||
}}, function(data2, menu2)
|
||||
if data2.current.value == 'yes' then
|
||||
if Config.EnablePlayerManagement then
|
||||
ESX.TriggerServerCallback('esx_vehicleshop:buyVehicleSociety', function(hasEnoughMoney)
|
||||
if hasEnoughMoney then
|
||||
ESX.TriggerServerCallback('esx_vehicleshop:buyCarDealerVehicle', function(success)
|
||||
if success then
|
||||
IsInShopMenu = false
|
||||
|
||||
DeleteShopInsideVehicles()
|
||||
|
||||
local playerPed = PlayerPedId()
|
||||
DeleteDisplayVehicleInsideShop()
|
||||
|
||||
CurrentAction = 'shop_menu'
|
||||
CurrentActionMsg = _U('shop_menu')
|
||||
CurrentActionData = {}
|
||||
|
||||
local playerPed = PlayerPedId()
|
||||
FreezeEntityPosition(playerPed, false)
|
||||
SetEntityVisible(playerPed, true)
|
||||
SetEntityCoords(playerPed, Config.Zones.ShopEntering.Pos)
|
||||
|
||||
menu2.close()
|
||||
menu.close()
|
||||
|
||||
ESX.ShowNotification(_U('vehicle_purchased'))
|
||||
else
|
||||
ESX.ShowNotification(_U('broke_company'))
|
||||
end
|
||||
end, 'cardealer', vehicleData.model)
|
||||
end, vehicleData.model)
|
||||
else
|
||||
local playerData = ESX.GetPlayerData()
|
||||
local generatedPlate = GeneratePlate()
|
||||
|
||||
if Config.EnableSocietyOwnedVehicles and playerData.job.grade_name == 'boss' then
|
||||
ESX.UI.Menu.Open('default', GetCurrentResourceName(), 'shop_confirm_buy_type', {
|
||||
title = _U('purchase_type'),
|
||||
align = 'top-left',
|
||||
elements = {
|
||||
{label = _U('staff_type'), value = 'personnal'},
|
||||
{label = _U('society_type'), value = 'society'}
|
||||
}}, function(data3, menu3)
|
||||
ESX.TriggerServerCallback('esx_vehicleshop:buyVehicle', function(success)
|
||||
if success then
|
||||
IsInShopMenu = false
|
||||
menu2.close()
|
||||
menu.close()
|
||||
DeleteDisplayVehicleInsideShop()
|
||||
|
||||
if data3.current.value == 'personnal' then
|
||||
|
||||
ESX.TriggerServerCallback('esx_vehicleshop:buyVehicle', function(hasEnoughMoney)
|
||||
if hasEnoughMoney then
|
||||
IsInShopMenu = false
|
||||
|
||||
menu3.close()
|
||||
menu2.close()
|
||||
menu.close()
|
||||
DeleteShopInsideVehicles()
|
||||
|
||||
ESX.Game.SpawnVehicle(vehicleData.model, Config.Zones.ShopOutside.Pos, Config.Zones.ShopOutside.Heading, function(vehicle)
|
||||
TaskWarpPedIntoVehicle(playerPed, vehicle, -1)
|
||||
|
||||
local newPlate = GeneratePlate()
|
||||
local vehicleProps = ESX.Game.GetVehicleProperties(vehicle)
|
||||
vehicleProps.plate = newPlate
|
||||
SetVehicleNumberPlateText(vehicle, newPlate)
|
||||
|
||||
if Config.EnableOwnedVehicles then
|
||||
TriggerServerEvent('esx_vehicleshop:setVehicleOwned', vehicleProps)
|
||||
end
|
||||
|
||||
ESX.ShowNotification(_U('vehicle_purchased'))
|
||||
end)
|
||||
|
||||
FreezeEntityPosition(playerPed, false)
|
||||
SetEntityVisible(playerPed, true)
|
||||
else
|
||||
ESX.ShowNotification(_U('not_enough_money'))
|
||||
end
|
||||
end, vehicleData.model)
|
||||
|
||||
elseif data3.current.value == 'society' then
|
||||
|
||||
ESX.TriggerServerCallback('esx_vehicleshop:buyVehicleSociety', function(hasEnoughMoney)
|
||||
if hasEnoughMoney then
|
||||
IsInShopMenu = false
|
||||
|
||||
menu3.close()
|
||||
menu2.close()
|
||||
menu.close()
|
||||
|
||||
DeleteShopInsideVehicles()
|
||||
|
||||
ESX.Game.SpawnVehicle(vehicleData.model, Config.Zones.ShopOutside.Pos, Config.Zones.ShopOutside.Heading, function(vehicle)
|
||||
TaskWarpPedIntoVehicle(playerPed, vehicle, -1)
|
||||
|
||||
local newPlate = GeneratePlate()
|
||||
local vehicleProps = ESX.Game.GetVehicleProperties(vehicle)
|
||||
vehicleProps.plate = newPlate
|
||||
SetVehicleNumberPlateText(vehicle, newPlate)
|
||||
TriggerServerEvent('esx_vehicleshop:setVehicleOwnedSociety', playerData.job.name, vehicleProps)
|
||||
ESX.ShowNotification(_U('vehicle_purchased'))
|
||||
end)
|
||||
|
||||
FreezeEntityPosition(playerPed, false)
|
||||
SetEntityVisible(playerPed, true)
|
||||
else
|
||||
ESX.ShowNotification(_U('broke_company'))
|
||||
end
|
||||
end, playerData.job.name, vehicleData.model)
|
||||
|
||||
end
|
||||
end, function(data3, menu3)
|
||||
menu3.close()
|
||||
end)
|
||||
else
|
||||
ESX.TriggerServerCallback('esx_vehicleshop:buyVehicle', function(hasEnoughMoney)
|
||||
if hasEnoughMoney then
|
||||
IsInShopMenu = false
|
||||
menu2.close()
|
||||
menu.close()
|
||||
DeleteShopInsideVehicles()
|
||||
|
||||
ESX.Game.SpawnVehicle(vehicleData.model, Config.Zones.ShopOutside.Pos, Config.Zones.ShopOutside.Heading, function(vehicle)
|
||||
TaskWarpPedIntoVehicle(playerPed, vehicle, -1)
|
||||
|
||||
local newPlate = GeneratePlate()
|
||||
local vehicleProps = ESX.Game.GetVehicleProperties(vehicle)
|
||||
vehicleProps.plate = newPlate
|
||||
SetVehicleNumberPlateText(vehicle, newPlate)
|
||||
|
||||
if Config.EnableOwnedVehicles then
|
||||
TriggerServerEvent('esx_vehicleshop:setVehicleOwned', vehicleProps)
|
||||
end
|
||||
|
||||
ESX.ShowNotification(_U('vehicle_purchased'))
|
||||
end)
|
||||
ESX.Game.SpawnVehicle(vehicleData.model, Config.Zones.ShopOutside.Pos, Config.Zones.ShopOutside.Heading, function(vehicle)
|
||||
TaskWarpPedIntoVehicle(playerPed, vehicle, -1)
|
||||
SetVehicleNumberPlateText(vehicle, generatedPlate)
|
||||
|
||||
FreezeEntityPosition(playerPed, false)
|
||||
SetEntityVisible(playerPed, true)
|
||||
else
|
||||
ESX.ShowNotification(_U('not_enough_money'))
|
||||
end
|
||||
end, vehicleData.model)
|
||||
end
|
||||
end)
|
||||
else
|
||||
ESX.ShowNotification(_U('not_enough_money'))
|
||||
end
|
||||
end, vehicleData.model, generatedPlate)
|
||||
end
|
||||
else
|
||||
menu2.close()
|
||||
end
|
||||
end, function(data2, menu2)
|
||||
menu2.close()
|
||||
end)
|
||||
end, function(data, menu)
|
||||
menu.close()
|
||||
DeleteShopInsideVehicles()
|
||||
DeleteDisplayVehicleInsideShop()
|
||||
local playerPed = PlayerPedId()
|
||||
|
||||
CurrentAction = 'shop_menu'
|
||||
@@ -346,22 +274,22 @@ function OpenShopMenu()
|
||||
local vehicleData = vehiclesByCategory[data.current.name][data.current.value + 1]
|
||||
local playerPed = PlayerPedId()
|
||||
|
||||
DeleteShopInsideVehicles()
|
||||
DeleteDisplayVehicleInsideShop()
|
||||
WaitForVehicleToLoad(vehicleData.model)
|
||||
|
||||
ESX.Game.SpawnLocalVehicle(vehicleData.model, Config.Zones.ShopInside.Pos, Config.Zones.ShopInside.Heading, function(vehicle)
|
||||
table.insert(LastVehicles, vehicle)
|
||||
currentDisplayVehicle = vehicle
|
||||
TaskWarpPedIntoVehicle(playerPed, vehicle, -1)
|
||||
FreezeEntityPosition(vehicle, true)
|
||||
SetModelAsNoLongerNeeded(vehicleData.model)
|
||||
end)
|
||||
end)
|
||||
|
||||
DeleteShopInsideVehicles()
|
||||
DeleteDisplayVehicleInsideShop()
|
||||
WaitForVehicleToLoad(firstVehicleData.model)
|
||||
|
||||
ESX.Game.SpawnLocalVehicle(firstVehicleData.model, Config.Zones.ShopInside.Pos, Config.Zones.ShopInside.Heading, function(vehicle)
|
||||
table.insert(LastVehicles, vehicle)
|
||||
currentDisplayVehicle = vehicle
|
||||
TaskWarpPedIntoVehicle(playerPed, vehicle, -1)
|
||||
FreezeEntityPosition(vehicle, true)
|
||||
SetModelAsNoLongerNeeded(firstVehicleData.model)
|
||||
@@ -374,16 +302,16 @@ function WaitForVehicleToLoad(modelHash)
|
||||
if not HasModelLoaded(modelHash) then
|
||||
RequestModel(modelHash)
|
||||
|
||||
BeginTextCommandBusyString('STRING')
|
||||
BeginTextCommandBusyspinnerOn('STRING')
|
||||
AddTextComponentSubstringPlayerName(_U('shop_awaiting_model'))
|
||||
EndTextCommandBusyString(4)
|
||||
EndTextCommandBusyspinnerOn(4)
|
||||
|
||||
while not HasModelLoaded(modelHash) do
|
||||
Citizen.Wait(0)
|
||||
DisableAllControlActions(0)
|
||||
end
|
||||
|
||||
RemoveLoadingPrompt()
|
||||
BusyspinnerOff()
|
||||
end
|
||||
end
|
||||
|
||||
@@ -402,7 +330,6 @@ function OpenResellerMenu()
|
||||
{label = _U('get_rented_vehicles'), value = 'get_rented_vehicles'},
|
||||
{label = _U('set_vehicle_owner_sell'), value = 'set_vehicle_owner_sell'},
|
||||
{label = _U('set_vehicle_owner_rent'), value = 'set_vehicle_owner_rent'},
|
||||
{label = _U('set_vehicle_owner_sell_society'), value = 'set_vehicle_owner_sell_society'},
|
||||
{label = _U('deposit_stock'), value = 'put_stock'},
|
||||
{label = _U('take_stock'), value = 'get_stock'}
|
||||
}}, function(data, menu)
|
||||
@@ -417,125 +344,94 @@ function OpenResellerMenu()
|
||||
elseif action == 'pop_vehicle' then
|
||||
OpenPopVehicleMenu()
|
||||
elseif action == 'depop_vehicle' then
|
||||
DeleteShopInsideVehicles()
|
||||
if currentDisplayVehicle then
|
||||
DeleteDisplayVehicleInsideShop()
|
||||
else
|
||||
ESX.ShowNotification(_U('no_current_vehicle'))
|
||||
end
|
||||
elseif action == 'return_provider' then
|
||||
ReturnVehicleProvider()
|
||||
elseif action == 'create_bill' then
|
||||
|
||||
local closestPlayer, closestDistance = ESX.Game.GetClosestPlayer()
|
||||
if closestPlayer == -1 or closestDistance > 3.0 then
|
||||
ESX.ShowNotification(_U('no_players'))
|
||||
return
|
||||
end
|
||||
|
||||
ESX.UI.Menu.Open('dialog', GetCurrentResourceName(), 'set_vehicle_owner_sell_amount', {
|
||||
title = _U('invoice_amount')
|
||||
}, function(data2, menu2)
|
||||
local amount = tonumber(data2.value)
|
||||
if closestPlayer ~= -1 and closestDistance < 3 then
|
||||
ESX.UI.Menu.Open('dialog', GetCurrentResourceName(), 'set_vehicle_owner_sell_amount', {
|
||||
title = _U('invoice_amount')
|
||||
}, function(data2, menu2)
|
||||
local amount = tonumber(data2.value)
|
||||
|
||||
if amount == nil then
|
||||
ESX.ShowNotification(_U('invalid_amount'))
|
||||
else
|
||||
menu2.close()
|
||||
local closestPlayer, closestDistance = ESX.Game.GetClosestPlayer()
|
||||
|
||||
if closestPlayer == -1 or closestDistance > 3.0 then
|
||||
ESX.ShowNotification(_U('no_players'))
|
||||
if amount == nil then
|
||||
ESX.ShowNotification(_U('invalid_amount'))
|
||||
else
|
||||
TriggerServerEvent('esx_billing:sendBill', GetPlayerServerId(closestPlayer), 'society_cardealer', _U('car_dealer'), tonumber(data2.value))
|
||||
end
|
||||
end
|
||||
end, function(data2, menu2)
|
||||
menu2.close()
|
||||
end)
|
||||
menu2.close()
|
||||
local closestPlayer, closestDistance = ESX.Game.GetClosestPlayer()
|
||||
|
||||
if closestPlayer == -1 or closestDistance > 3.0 then
|
||||
ESX.ShowNotification(_U('no_players'))
|
||||
else
|
||||
TriggerServerEvent('esx_billing:sendBill', GetPlayerServerId(closestPlayer), 'society_cardealer', _U('car_dealer'), tonumber(data2.value))
|
||||
end
|
||||
end
|
||||
end, function(data2, menu2)
|
||||
menu2.close()
|
||||
end)
|
||||
else
|
||||
ESX.ShowNotification(_U('no_players'))
|
||||
end
|
||||
elseif action == 'get_rented_vehicles' then
|
||||
OpenRentedVehiclesMenu()
|
||||
elseif action == 'set_vehicle_owner_sell' then
|
||||
if currentDisplayVehicle then
|
||||
local closestPlayer, closestDistance = ESX.Game.GetClosestPlayer()
|
||||
|
||||
local closestPlayer, closestDistance = ESX.Game.GetClosestPlayer()
|
||||
|
||||
if closestPlayer == -1 or closestDistance > 3.0 then
|
||||
ESX.ShowNotification(_U('no_players'))
|
||||
else
|
||||
local newPlate = GeneratePlate()
|
||||
local vehicleProps = ESX.Game.GetVehicleProperties(LastVehicles[#LastVehicles])
|
||||
local model = CurrentVehicleData.model
|
||||
vehicleProps.plate = newPlate
|
||||
SetVehicleNumberPlateText(LastVehicles[#LastVehicles], newPlate)
|
||||
|
||||
TriggerServerEvent('esx_vehicleshop:sellVehicle', model)
|
||||
TriggerServerEvent('esx_vehicleshop:addToList', GetPlayerServerId(closestPlayer), model, newPlate)
|
||||
|
||||
if Config.EnableOwnedVehicles then
|
||||
TriggerServerEvent('esx_vehicleshop:setVehicleOwnedPlayerId', GetPlayerServerId(closestPlayer), vehicleProps)
|
||||
ESX.ShowNotification(_U('vehicle_set_owned', vehicleProps.plate, GetPlayerName(closestPlayer)))
|
||||
else
|
||||
ESX.ShowNotification(_U('vehicle_sold_to', vehicleProps.plate, GetPlayerName(closestPlayer)))
|
||||
end
|
||||
end
|
||||
|
||||
elseif action == 'set_vehicle_owner_sell_society' then
|
||||
|
||||
local closestPlayer, closestDistance = ESX.Game.GetClosestPlayer()
|
||||
|
||||
if closestPlayer == -1 or closestDistance > 3.0 then
|
||||
ESX.ShowNotification(_U('no_players'))
|
||||
else
|
||||
ESX.TriggerServerCallback('esx:getOtherPlayerData', function(xPlayer)
|
||||
|
||||
local newPlate = GeneratePlate()
|
||||
local vehicleProps = ESX.Game.GetVehicleProperties(LastVehicles[#LastVehicles])
|
||||
local model = CurrentVehicleData.model
|
||||
if closestPlayer ~= -1 and closestDistance < 3 then
|
||||
local newPlate = GeneratePlate()
|
||||
local vehicleProps = ESX.Game.GetVehicleProperties(currentDisplayVehicle)
|
||||
vehicleProps.plate = newPlate
|
||||
SetVehicleNumberPlateText(LastVehicles[#LastVehicles], newPlate)
|
||||
TriggerServerEvent('esx_vehicleshop:sellVehicle', model)
|
||||
TriggerServerEvent('esx_vehicleshop:addToList', GetPlayerServerId(closestPlayer), model, newPlate)
|
||||
|
||||
if Config.EnableSocietyOwnedVehicles then
|
||||
TriggerServerEvent('esx_vehicleshop:setVehicleOwnedSociety', xPlayer.job.name, vehicleProps)
|
||||
ESX.ShowNotification(_U('vehicle_set_owned', vehicleProps.plate, GetPlayerName(closestPlayer)))
|
||||
else
|
||||
ESX.ShowNotification(_U('vehicle_sold_to', vehicleProps.plate, GetPlayerName(closestPlayer)))
|
||||
end
|
||||
|
||||
end, GetPlayerServerId(closestPlayer))
|
||||
end
|
||||
|
||||
elseif action == 'set_vehicle_owner_rent' then
|
||||
|
||||
ESX.UI.Menu.Open('dialog', GetCurrentResourceName(), 'set_vehicle_owner_rent_amount', {
|
||||
title = _U('rental_amount')
|
||||
}, function(data2, menu2)
|
||||
local amount = tonumber(data2.value)
|
||||
|
||||
if amount == nil then
|
||||
ESX.ShowNotification(_U('invalid_amount'))
|
||||
SetVehicleNumberPlateText(currentDisplayVehicle, newPlate)
|
||||
TriggerServerEvent('esx_vehicleshop:setVehicleOwnedPlayerId', GetPlayerServerId(closestPlayer), vehicleProps, CurrentVehicleData.model, CurrentVehicleData.name)
|
||||
currentDisplayVehicle = nil
|
||||
else
|
||||
menu2.close()
|
||||
|
||||
local closestPlayer, closestDistance = ESX.Game.GetClosestPlayer()
|
||||
|
||||
if closestPlayer == -1 or closestDistance > 5.0 then
|
||||
ESX.ShowNotification(_U('no_players'))
|
||||
else
|
||||
local newPlate = 'RENT' .. string.upper(ESX.GetRandomString(4))
|
||||
local vehicleProps = ESX.Game.GetVehicleProperties(LastVehicles[#LastVehicles])
|
||||
local model = CurrentVehicleData.model
|
||||
vehicleProps.plate = newPlate
|
||||
SetVehicleNumberPlateText(LastVehicles[#LastVehicles], newPlate)
|
||||
TriggerServerEvent('esx_vehicleshop:rentVehicle', model, vehicleProps.plate, GetPlayerName(closestPlayer), CurrentVehicleData.price, amount, GetPlayerServerId(closestPlayer))
|
||||
|
||||
if Config.EnableOwnedVehicles then
|
||||
TriggerServerEvent('esx_vehicleshop:setVehicleOwnedPlayerId', GetPlayerServerId(closestPlayer), vehicleProps)
|
||||
end
|
||||
|
||||
ESX.ShowNotification(_U('vehicle_set_rented', vehicleProps.plate, GetPlayerName(closestPlayer)))
|
||||
end
|
||||
ESX.ShowNotification(_U('no_players'))
|
||||
end
|
||||
end, function(data2, menu2)
|
||||
menu2.close()
|
||||
end)
|
||||
else
|
||||
ESX.ShowNotification(_U('no_current_vehicle'))
|
||||
end
|
||||
elseif action == 'set_vehicle_owner_rent' then
|
||||
if currentDisplayVehicle then
|
||||
local closestPlayer, closestDistance = ESX.Game.GetClosestPlayer()
|
||||
|
||||
if closestPlayer ~= -1 and closestDistance < 3 then
|
||||
ESX.UI.Menu.Open('dialog', GetCurrentResourceName(), 'set_vehicle_owner_rent_amount', {
|
||||
title = _U('rental_amount')
|
||||
}, function(data2, menu2)
|
||||
local amount = tonumber(data2.value)
|
||||
|
||||
if not amount then
|
||||
ESX.ShowNotification(_U('invalid_amount'))
|
||||
else
|
||||
menu2.close()
|
||||
local closestPlayer, closestDistance = ESX.Game.GetClosestPlayer()
|
||||
|
||||
if closestPlayer ~= -1 and closestDistance < 3 then
|
||||
local newPlate = 'RENT' .. string.upper(ESX.GetRandomString(4))
|
||||
local model = CurrentVehicleData.model
|
||||
SetVehicleNumberPlateText(currentDisplayVehicle, newPlate)
|
||||
TriggerServerEvent('esx_vehicleshop:rentVehicle', model, newPlate, amount, GetPlayerServerId(closestPlayer))
|
||||
currentDisplayVehicle = nil
|
||||
else
|
||||
ESX.ShowNotification(_U('no_players'))
|
||||
end
|
||||
end
|
||||
end, function(data2, menu2)
|
||||
menu2.close()
|
||||
end)
|
||||
else
|
||||
ESX.ShowNotification(_U('no_players'))
|
||||
end
|
||||
else
|
||||
ESX.ShowNotification(_U('no_current_vehicle'))
|
||||
end
|
||||
end
|
||||
end, function(data, menu)
|
||||
menu.close()
|
||||
@@ -550,10 +446,12 @@ function OpenPopVehicleMenu()
|
||||
ESX.TriggerServerCallback('esx_vehicleshop:getCommercialVehicles', function(vehicles)
|
||||
local elements = {}
|
||||
|
||||
for i=1, #vehicles, 1 do
|
||||
for k,v in ipairs(vehicles) do
|
||||
local vehicleLabel = getVehicleLabelFromModel(v.vehicle)
|
||||
|
||||
table.insert(elements, {
|
||||
label = ('%s [MSRP <span style="color:green;">%s</span>]'):format(vehicles[i].name, _U('generic_shopitem', ESX.Math.GroupDigits(vehicles[i].price))),
|
||||
value = vehicles[i].name
|
||||
label = ('%s [MSRP <span style="color:green;">%s</span>]'):format(vehicleLabel, _U('generic_shopitem', ESX.Math.GroupDigits(v.price))),
|
||||
value = v.vehicle
|
||||
})
|
||||
end
|
||||
|
||||
@@ -563,11 +461,10 @@ function OpenPopVehicleMenu()
|
||||
elements = elements
|
||||
}, function(data, menu)
|
||||
local model = data.current.value
|
||||
|
||||
DeleteShopInsideVehicles()
|
||||
DeleteDisplayVehicleInsideShop()
|
||||
|
||||
ESX.Game.SpawnVehicle(model, Config.Zones.ShopInside.Pos, Config.Zones.ShopInside.Heading, function(vehicle)
|
||||
table.insert(LastVehicles, vehicle)
|
||||
currentDisplayVehicle = vehicle
|
||||
|
||||
for i=1, #Vehicles, 1 do
|
||||
if model == Vehicles[i].model then
|
||||
@@ -586,10 +483,12 @@ function OpenRentedVehiclesMenu()
|
||||
ESX.TriggerServerCallback('esx_vehicleshop:getRentedVehicles', function(vehicles)
|
||||
local elements = {}
|
||||
|
||||
for i=1, #vehicles, 1 do
|
||||
for k,v in ipairs(vehicles) do
|
||||
local vehicleLabel = getVehicleLabelFromModel(v.name)
|
||||
|
||||
table.insert(elements, {
|
||||
label = ('%s: %s - <span style="color:orange;">%s</span>'):format(vehicles[i].playerName, vehicles[i].name, vehicles[i].plate),
|
||||
value = vehicles[i].name
|
||||
label = ('%s: %s - <span style="color:orange;">%s</span>'):format(v.playerName, vehicleLabel, v.plate),
|
||||
value = v.name
|
||||
})
|
||||
end
|
||||
|
||||
@@ -660,10 +559,12 @@ function OpenGetStocksMenu()
|
||||
local elements = {}
|
||||
|
||||
for i=1, #items, 1 do
|
||||
table.insert(elements, {
|
||||
label = 'x' .. items[i].count .. ' ' .. items[i].label,
|
||||
value = items[i].name
|
||||
})
|
||||
if items[i].count > 0 then
|
||||
table.insert(elements, {
|
||||
label = 'x' .. items[i].count .. ' ' .. items[i].label,
|
||||
value = items[i].name
|
||||
})
|
||||
end
|
||||
end
|
||||
|
||||
ESX.UI.Menu.Open('default', GetCurrentResourceName(), 'stocks_menu', {
|
||||
@@ -774,7 +675,6 @@ AddEventHandler('esx_vehicleshop:hasEnteredMarker', function(zone)
|
||||
end
|
||||
|
||||
elseif zone == 'GiveBackVehicle' and Config.EnablePlayerManagement then
|
||||
|
||||
local playerPed = PlayerPedId()
|
||||
|
||||
if IsPedInAnyVehicle(playerPed, false) then
|
||||
@@ -784,14 +684,11 @@ AddEventHandler('esx_vehicleshop:hasEnteredMarker', function(zone)
|
||||
CurrentActionMsg = _U('vehicle_menu')
|
||||
CurrentActionData = {vehicle = vehicle}
|
||||
end
|
||||
|
||||
elseif zone == 'ResellVehicle' then
|
||||
|
||||
local playerPed = PlayerPedId()
|
||||
|
||||
if IsPedSittingInAnyVehicle(playerPed) then
|
||||
|
||||
local vehicle = GetVehiclePedIsIn(playerPed, false)
|
||||
local vehicle = GetVehiclePedIsIn(playerPed, false)
|
||||
local vehicleData, model, resellPrice, plate
|
||||
|
||||
if GetPedInVehicleSeat(vehicle, -1) == playerPed then
|
||||
@@ -817,15 +714,12 @@ AddEventHandler('esx_vehicleshop:hasEnteredMarker', function(zone)
|
||||
plate = plate
|
||||
}
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
elseif zone == 'BossActions' and Config.EnablePlayerManagement and ESX.PlayerData.job ~= nil and ESX.PlayerData.job.name == 'cardealer' and ESX.PlayerData.job.grade_name == 'boss' then
|
||||
|
||||
CurrentAction = 'boss_actions_menu'
|
||||
CurrentActionMsg = _U('shop_menu')
|
||||
CurrentActionData = {}
|
||||
|
||||
end
|
||||
end)
|
||||
|
||||
@@ -842,13 +736,14 @@ AddEventHandler('onResourceStop', function(resource)
|
||||
if IsInShopMenu then
|
||||
ESX.UI.Menu.CloseAll()
|
||||
|
||||
DeleteShopInsideVehicles()
|
||||
local playerPed = PlayerPedId()
|
||||
|
||||
FreezeEntityPosition(playerPed, false)
|
||||
SetEntityVisible(playerPed, true)
|
||||
SetEntityCoords(playerPed, Config.Zones.ShopEntering.Pos)
|
||||
end
|
||||
|
||||
DeleteDisplayVehicleInsideShop()
|
||||
end
|
||||
end)
|
||||
|
||||
@@ -874,8 +769,8 @@ Citizen.CreateThread(function()
|
||||
SetBlipScale (blip, 1.0)
|
||||
SetBlipAsShortRange(blip, true)
|
||||
|
||||
BeginTextCommandSetBlipName("STRING")
|
||||
AddTextComponentString(_U('car_dealer'))
|
||||
BeginTextCommandSetBlipName('STRING')
|
||||
AddTextComponentSubstringPlayerName(_U('car_dealer'))
|
||||
EndTextCommandSetBlipName(blip)
|
||||
end)
|
||||
|
||||
@@ -979,4 +874,4 @@ Citizen.CreateThread(function()
|
||||
LoadInterior(interiorID)
|
||||
EnableInteriorProp(interiorID, 'csr_beforeMission') -- Load large window
|
||||
RefreshInterior(interiorID)
|
||||
end)
|
||||
end)
|
||||
|
||||
Reference in New Issue
Block a user