esx_xp icon indicating copy to clipboard operation
esx_xp copied to clipboard

sloved- closed

Open hamood192244 opened this issue 5 years ago • 20 comments
trafficstars

hello i want help for esx_vehicleshop

how to lock and unlock vehicles with ranks for example

if i have [rank 20] i can unlock models for buy it and there some cars i have to get [rank 30] to unlock

it's possible if its possible how ?

I wish you a happy and fulfilling day <3

Hamood

hamood192244 avatar Oct 04 '20 16:10 hamood192244

Check the FAQ

For esx_vehicleshop you could do something like this:

  • Add reward vehicles to config.lua in esx_vehicleshop:
Config.RewardVehicles = {
    20 = {
        models = { "voltic", "tyrus" },
        locked = true
    },
    30 = {
        models = { "voltic2", "turismor" },
        locked = true
    }
}
  • Perform a check in the OpenShopMenu() function in client/main.lua of esx_vehicleshop to see if the model is locked and either prevent it from being shown or prevent it from being purchased until player is at the correct rank.

  • Listen for the esx_xp:rankUp event and set the vehicles as unlocked:

AddEventHandler("esx_xp:rankUp", function(newRank, previousRank)
    local Rewards = Config.RewardVehicles[newRank]
    if Rewards ~= nil and type(Rewards) == "table" then
        Rewards.locked = false
    end
end)

Mobius1 avatar Oct 04 '20 16:10 Mobius1

Thank you so much for your answer and help <3

but there small problem i do your steps and there error show to me wen i paste the "Config.RewardVehicles" config.lua in esx_vehicleshop

https://gyazo.com/8f90b57e24a3516bfb7649c6abc34ae4

i hope you know the problem

Thank you so much

hamood192244 avatar Oct 04 '20 20:10 hamood192244

Sorry, there were missing commas on the models lines. I'vwe updated it.

Mobius1 avatar Oct 05 '20 08:10 Mobius1

i check there another problem

Config.RewardVehicles = { 20 = { models = { "voltic", "tyrus" }, locked = true }, 30 = { models = { "voltic2", "turismor" }, locked = true } }

20 and 30 should in this place no number it's wrong when i replace it with letters the script run with out errors

hamood192244 avatar Oct 05 '20 10:10 hamood192244

i don't know in programing but i'm learning i think should like that maybe ?

https://gyazo.com/762067fab18f6e92ba8d52412ad59163

i know it's wrong XD

https://gyazo.com/762067fab18f6e92ba8d52412ad59163

hamood192244 avatar Oct 05 '20 10:10 hamood192244

This worked for me. It prevents purchase of the vehicles until the player reaches the correct rank.

  • Edit Config.RewardCars:
Config.RewardCars = {
    {
        models = { "vxr", "17toylc" },
        rank = 10
    },
    {
        models = { "bison", "landv6" },
        rank = 20
    }	
}
  • In client/main.lua add the following function above the OpenShopMenu() function:
function IsVehicleLocked(tab, model)
    for k, v in pairs(tab) do
        for k2, vmodel in pairs(v.models) do
            if vmodel == model then
                return tonumber(v.rank)
            end
        end
    end
    return false
end
  • In client/main.lua find the OpenShopMenu() function and find the following line:
table.insert(options, ('%s <span style="color:green;">%s</span>'):format(vehicle.name, _U('generic_shopitem', ESX.Math.GroupDigits(vehicle.price))))

Replace that line with the following code:

local rankLocked = IsVehicleLocked(Config.RewardCars, vehicle.model)

-- Hide price and show locked text if player rank is less than required rank
if rankLocked ~= false and ESX.GetPlayerData().rank < rankLocked then
    table.insert(options, ('%s <span style="color:green;">%s</span>'):format(vehicle.name, _U('generic_shopitem', "Locked (" .. rankLocked .. ")")))
else
    table.insert(options, ('%s <span style="color:green;">%s</span>'):format(vehicle.name, _U('generic_shopitem', ESX.Math.GroupDigits(vehicle.price))))
end
  • In client/main.lua find the OpenShopMenu() function and find the following line:
ESX.UI.Menu.Open('default', GetCurrentResourceName(), 'shop_confirm', {

Add this code above that line:

-- Prevent purchase if player rank is less than required rank
local rankLocked = IsVehicleLocked(Config.RewardCars, vehicleData.model)
if rankLocked ~= false and ESX.GetPlayerData().rank < rankLocked then
    ESX.ShowNotification("~r~ERROR: ~w~You can't purchase this car until you reach Rank " .. rankLocked)
    return false
end

Mobius1 avatar Oct 05 '20 13:10 Mobius1

thank youu so much

it's work but there small small problem

`local rankLocked = IsVehicleLocked(Config.RewardCars, vehicle.model)

-- Hide price and show locked text if player rank is less than required rank if rankLocked ~= false and ESX.GetPlayerData().rank < rankLocked then table.insert(options, ('%s %s'):format(vehicle.name, _U('generic_shopitem', "Locked (" .. rankLocked .. ")"))) else table.insert(options, ('%s %s'):format(vehicle.name, _U('generic_shopitem', ESX.Math.GroupDigits(vehicle.price)))) end`

https://gyazo.com/1930875913330df0be34efcd5c4e1678

there problem here

when i start the script with out this it's start and the rank system work but don't show the You can't purchase this car until you reach Rank just showing the price and i can't buy it becuse it's work

but when insert the if rankLocked ~= false and ESX.GetPlayerData().rank < rankLocked then

doesn't work

showing in F8 problem

https://gyazo.com/c4641e49d93d2826b2aa63e33010354b

hamood192244 avatar Oct 05 '20 14:10 hamood192244

do you have discord ?

hamood192244 avatar Oct 05 '20 17:10 hamood192244

I know I'm bothering you but I'm sorry We are close to finish this Can you help a little And I really appreciate what you do here

all hearts in the world to you <3 <3 <3 <3

hamood192244 avatar Oct 06 '20 21:10 hamood192244

t

hamood192244 avatar Oct 08 '20 11:10 hamood192244


function IsVehicleLocked(tab, model)
    for k, v in pairs(tab) do
        for k2, vmodel in pairs(v.models) do
            if vmodel == model then
                return tonumber(v.rank)
            end
        end
    end
    return false
end

function OpenShopMenu()
	if #Vehicles == 0 then
		print('[esx_vehicleshop] [^3ERROR^7] No vehicles found')
		return
	end

	IsInShopMenu = true

	StartShopRestriction()
	ESX.UI.Menu.CloseAll()

	local playerPed = PlayerPedId()

	FreezeEntityPosition(playerPed, true)
	SetEntityVisible(playerPed, false)
	SetEntityCoords(playerPed, Config.Zones.ShopInside.Pos)

	local vehiclesByCategory = {}
	local elements           = {}
	local firstVehicleData   = nil

	for i=1, #Categories, 1 do
		vehiclesByCategory[Categories[i].name] = {}
	end

	for i=1, #Vehicles, 1 do
		if IsModelInCdimage(GetHashKey(Vehicles[i].model)) then
			table.insert(vehiclesByCategory[Vehicles[i].category], Vehicles[i])
		else
			print(('[esx_vehicleshop] [^3ERROR^7] Vehicle "%s" does not exist'):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
		local category         = Categories[i]
		local categoryVehicles = vehiclesByCategory[category.name]
		local options          = {}

		for j=1, #categoryVehicles, 1 do
			local vehicle = categoryVehicles[j]

			if i == 1 and j == 1 then
				firstVehicleData = vehicle
			end

			local rankLocked = IsVehicleLocked(Config.RewardCars, vehicle.model)

-- Hide price and show locked text if player rank is less than required rank
if rankLocked ~= false and ESX.GetPlayerData().rank < rankLocked then
    table.insert(options, ('%s <span style="color:green;">%s</span>'):format(vehicle.name, _U('generic_shopitem', "Locked (" .. rankLocked .. ")")))
else
    table.insert(options, ('%s <span style="color:green;">%s</span>'):format(vehicle.name, _U('generic_shopitem', ESX.Math.GroupDigits(vehicle.price))))
end
		end

		table.sort(options)

		table.insert(elements, {
			name    = category.name,
			label   = category.label,
			value   = 0,
			type    = 'slider',
			max     = #Categories[i],
			options = options
		})
	end

	ESX.UI.Menu.Open('default', GetCurrentResourceName(), 'vehicle_shop', {
		title    = _U('car_dealer'),
		align    = 'top-left',
		elements = elements
	}, function(data, menu)
		local vehicleData = vehiclesByCategory[data.current.name][data.current.value + 1]
		
		
		-- Prevent purchase if player rank is less than required rank
local rankLocked = IsVehicleLocked(Config.RewardCars, vehicleData.model)
if rankLocked ~= false and ESX.GetPlayerData().rank < rankLocked then
    ESX.ShowNotification("~r~ERROR: ~w~You can't purchase this car until you reach Rank " .. rankLocked)
    return false
end
		

		ESX.UI.Menu.Open('default', GetCurrentResourceName(), 'shop_confirm', {
			title = _U('buy_vehicle_shop', vehicleData.name, ESX.Math.GroupDigits(vehicleData.price)),
			align = 'top-left',
			elements = {
				{label = _U('no'),  value = 'no'},
				{label = _U('yes'), value = 'yes'}
		}}, function(data2, menu2)
			if data2.current.value == 'yes' then
				if Config.EnablePlayerManagement then
					ESX.TriggerServerCallback('esx_vehicleshop:buyCarDealerVehicle', function(success)
						if success then
							IsInShopMenu = false
							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, vehicleData.model)
				else
					local generatedPlate = GeneratePlate()

					ESX.TriggerServerCallback('esx_vehicleshop:buyVehicle', function(success)
						if success then
							IsInShopMenu = false
							menu2.close()
							menu.close()
							DeleteDisplayVehicleInsideShop()

							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)
							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)

I do like that there some misstake?

hamood192244 avatar Oct 08 '20 20:10 hamood192244

Mobius1

hamood192244 avatar Oct 09 '20 15:10 hamood192244

can you help please </3

hamood192244 avatar Oct 10 '20 09:10 hamood192244

1

hamood192244 avatar Oct 10 '20 20:10 hamood192244

hello

hamood192244 avatar Oct 11 '20 23:10 hamood192244

Mobius1 can u help please </3

hamood192244 avatar Oct 24 '20 13:10 hamood192244

l

hamood192244 avatar Oct 27 '20 16:10 hamood192244

hello @Mobius1
is it possible to communicate with you on discord ?

omarabbaas avatar Oct 31 '20 21:10 omarabbaas

Will provide a guide on a simple esx_vehicleshop integration, currently working on esx_properties ❤️

gandie avatar Nov 16 '20 13:11 gandie

esx_vehicleshop - buy cars by rank

Same approach as on esx_weaponshop, using corresponding SQL-tables to store required rank information.

SQL

alter table sesx.vehicles add column rank int default 0;

-- rank cars by price, not sure this is good/balanced
update sesx.vehicles set rank = 5 where price > 50000;
update sesx.vehicles set rank = 10 where price > 100000;
update sesx.vehicles set rank = 15 where price > 250000;

Code

Client

Author: Lars Bergmann
Date:   Mon Nov 16 15:53:04 2020 +0100

    Vehicleshop rank integration

diff --git a/resources/[esx]/esx_vehicleshop/client/main.lua b/resources/[esx]/esx_vehicleshop/client/main.lua
index a6d2a2b..b1977f9 100644
--- a/resources/[esx]/esx_vehicleshop/client/main.lua
+++ b/resources/[esx]/esx_vehicleshop/client/main.lua
@@ -161,7 +161,7 @@ function OpenShopMenu()
 				firstVehicleData = vehicle
 			end
 
-			table.insert(options, ('%s <span style="color:green;">%s</span>'):format(vehicle.name, _U('generic_shopitem', ESX.Math.GroupDigits(vehicle.price))))
+			table.insert(options, ('%s <span style="color:green;">%s</span> (%s)'):format(vehicle.name, _U('generic_shopitem', ESX.Math.GroupDigits(vehicle.price)), vehicle.rank))
 		end
 
 		table.insert(elements, {
@@ -228,8 +228,8 @@ function OpenShopMenu()
 
 							if data3.current.value == 'personnal' then
 
-								ESX.TriggerServerCallback('esx_vehicleshop:buyVehicle', function(hasEnoughMoney)
-									if hasEnoughMoney then
+								ESX.TriggerServerCallback('esx_vehicleshop:buyVehicle', function(msg)
+									if msg == 'ok' then
 										IsInShopMenu = false
 
 										menu3.close()
@@ -254,8 +254,10 @@ function OpenShopMenu()
 
 										FreezeEntityPosition(playerPed, false)
 										SetEntityVisible(playerPed, true)
-									else
+									elseif msg == 'money' then
 										ESX.ShowNotification(_U('not_enough_money'))
+									else
+										ESX.ShowNotification('Rank too low!')
 									end
 								end, vehicleData.model)
 
@@ -294,8 +296,8 @@ function OpenShopMenu()
 							menu3.close()
 						end)
 					else
-						ESX.TriggerServerCallback('esx_vehicleshop:buyVehicle', function(hasEnoughMoney)
-							if hasEnoughMoney then
+						ESX.TriggerServerCallback('esx_vehicleshop:buyVehicle', function(msg)
+							if msg == 'ok' then
 								IsInShopMenu = false
 								menu2.close()
 								menu.close()
@@ -318,8 +320,10 @@ function OpenShopMenu()
 
 								FreezeEntityPosition(playerPed, false)
 								SetEntityVisible(playerPed, true)
-							else
+							elseif msg == 'money' then
 								ESX.ShowNotification(_U('not_enough_money'))
+							else
+								ESX.ShowNotification("Rank too low!")
 							end
 						end, vehicleData.model)
 					end
@@ -979,4 +983,4 @@ Citizen.CreateThread(function()
 	LoadInterior(interiorID)
 	EnableInteriorProp(interiorID, 'csr_beforeMission') -- Load large window
 	RefreshInterior(interiorID)
-end)
\ No newline at end of file
+end)

Server

diff --git a/resources/[esx]/esx_vehicleshop/server/main.lua b/resources/[esx]/esx_vehicleshop/server/main.lua
index 0010802..55cf5a4 100644
--- a/resources/[esx]/esx_vehicleshop/server/main.lua
+++ b/resources/[esx]/esx_vehicleshop/server/main.lua
@@ -201,6 +201,7 @@ end)
 
 ESX.RegisterServerCallback('esx_vehicleshop:buyVehicle', function(source, cb, vehicleModel)
 	local xPlayer = ESX.GetPlayerFromId(source)
+	local playerRank = xPlayer.get("rank")
 	local vehicleData
 
 	for i=1, #Vehicles, 1 do
@@ -210,11 +211,18 @@ ESX.RegisterServerCallback('esx_vehicleshop:buyVehicle', function(source, cb, ve
 		end
 	end
 
+
+	if playerRank < vehicleData.rank then
+		xPlayer.showNotification("Rank too low!")
+		cb("rank")
+		return
+	end
+
 	if vehicleData and xPlayer.getMoney() >= vehicleData.price then
 		xPlayer.removeMoney(vehicleData.price)
-		cb(true)
+		cb("ok")
 	else
-		cb(false)
+		cb("money")
 	end
 end)

gandie avatar Nov 16 '20 15:11 gandie