123 lines
		
	
	
	
		
			4.9 KiB
		
	
	
	
		
			Lua
		
	
	
	
	
	
			
		
		
	
	
			123 lines
		
	
	
	
		
			4.9 KiB
		
	
	
	
		
			Lua
		
	
	
	
	
	
| -- Initialize the Framework variable and purchaseLocks table
 | |
| local Framework = nil
 | |
| local purchaseLocks = {}
 | |
| 
 | |
| -- Determine the framework being used (ESX or QBCore) and get the shared object
 | |
| if RY.Options.FrameWork == 'esx' then
 | |
|     Framework = exports['es_extended']:getSharedObject()  
 | |
| elseif RY.Options.FrameWork == 'qb' then
 | |
|     Framework = exports['qb-core']:GetCoreObject()
 | |
| end
 | |
| 
 | |
| -- Register the server event for handling the checkout process
 | |
| RegisterServerEvent('ry-shops:goToCheckout')
 | |
| AddEventHandler('ry-shops:goToCheckout', function(totalPayment, basket, paymentType, useBlackMoney)
 | |
|     local _source = source
 | |
| 
 | |
|     -- If a purchase is already in progress for the player, do nothing
 | |
|     if purchaseLocks[_source] then
 | |
|         return
 | |
|     end
 | |
| 
 | |
|     -- Lock the purchase process for the player
 | |
|     purchaseLocks[_source] = true
 | |
| 
 | |
|     -- Function to handle payment and item delivery
 | |
|     local function payAndGiveItem(xPlayer, totalPayment, basket, paymentType, useBlackMoney)
 | |
|         local playerMoney = 0
 | |
|         local purchaseCompleted = string.gsub(RY.Messages.purchaseCompleted, "%%total%%", totalPayment)
 | |
|         local noMoney = string.gsub(RY.Messages.noMoney, "%%total%%", totalPayment)
 | |
|         local paymentSuccess = false
 | |
| 
 | |
|         -- Payment logic for ESX framework
 | |
|         if RY.Options.FrameWork == 'esx' then
 | |
|             if useBlackMoney then
 | |
|                 playerMoney = xPlayer.getAccount(RY.Options.accountBlackMoney).money
 | |
|                 if playerMoney >= totalPayment then
 | |
|                     xPlayer.removeAccountMoney(RY.Options.accountBlackMoney, totalPayment)
 | |
|                     paymentSuccess = true
 | |
|                 end
 | |
|             else
 | |
|                 if paymentType == 'cash' then
 | |
|                     playerMoney = xPlayer.getAccount('money').money
 | |
|                     if playerMoney >= totalPayment then
 | |
|                         xPlayer.removeMoney(totalPayment)
 | |
|                         paymentSuccess = true
 | |
|                     end
 | |
|                 elseif paymentType == 'bank' then
 | |
|                     playerMoney = xPlayer.getAccount('bank').money
 | |
|                     if playerMoney >= totalPayment then
 | |
|                         xPlayer.removeAccountMoney('bank', totalPayment)
 | |
|                         paymentSuccess = true
 | |
|                     end
 | |
|                 end
 | |
|             end
 | |
|         -- Payment logic for QBCore framework
 | |
|         elseif RY.Options.FrameWork == 'qb' then
 | |
|             if useBlackMoney then
 | |
|                 playerMoney = xPlayer.PlayerData.money[RY.Options.accountBlackMoney]
 | |
|                 if playerMoney >= totalPayment then
 | |
|                     xPlayer.Functions.RemoveMoney(RY.Options.accountBlackMoney, totalPayment)
 | |
|                     paymentSuccess = true
 | |
|                 end
 | |
|             else
 | |
|                 if paymentType == 'cash' then
 | |
|                     playerMoney = xPlayer.PlayerData.money["cash"]
 | |
|                     if playerMoney >= totalPayment then
 | |
|                         xPlayer.Functions.RemoveMoney("cash", totalPayment)
 | |
|                         paymentSuccess = true
 | |
|                     end
 | |
|                 elseif paymentType == 'bank' then
 | |
|                     playerMoney = xPlayer.PlayerData.money["bank"]
 | |
|                     if playerMoney >= totalPayment then
 | |
|                         xPlayer.Functions.RemoveMoney("bank", totalPayment)
 | |
|                         paymentSuccess = true
 | |
|                     end
 | |
|                 end
 | |
|             end
 | |
|         end
 | |
| 
 | |
|         -- If payment is successful, add items to player's inventory
 | |
|         if paymentSuccess then
 | |
|             if RY.Options.FrameWork == 'esx' then
 | |
|                 for _, item in pairs(basket) do
 | |
|                     xPlayer.addInventoryItem(item.itemName, item.itemQuantity)
 | |
|                 end
 | |
|             elseif RY.Options.FrameWork == 'qb' then
 | |
|                 for _, item in pairs(basket) do
 | |
|                     xPlayer.Functions.AddItem(item.itemName, item.itemQuantity)
 | |
|                 end
 | |
|             end
 | |
|             -- Notify the player of successful purchase
 | |
|             TriggerClientEvent('ry-shops:notification', _source, purchaseCompleted)
 | |
|         else
 | |
|             -- Notify the player of insufficient funds
 | |
|             TriggerClientEvent('ry-shops:notification', _source, noMoney)
 | |
|         end
 | |
|     end
 | |
| 
 | |
|     -- Get the player object based on the framework
 | |
|     local xPlayer
 | |
|     if RY.Options.FrameWork == 'esx' then
 | |
|         xPlayer = Framework.GetPlayerFromId(_source)
 | |
|     elseif RY.Options.FrameWork == 'qb' then
 | |
|         xPlayer = Framework.Functions.GetPlayer(_source)
 | |
|     end
 | |
| 
 | |
|     -- If player object is valid, process payment and item delivery
 | |
|     if xPlayer then
 | |
|         payAndGiveItem(xPlayer, totalPayment, basket, paymentType, useBlackMoney)
 | |
|     end
 | |
| 
 | |
|     -- Unlock the purchase process for the player after 1 second
 | |
|     Citizen.SetTimeout(1000, function()
 | |
|         purchaseLocks[_source] = nil
 | |
|     end)
 | |
| end)
 | |
| 
 | |
| -- Clear purchase lock when a player disconnects
 | |
| AddEventHandler('playerDropped', function()
 | |
|     local _source = source
 | |
|     purchaseLocks[_source] = nil
 | |
| end)
 | |
| 
 | 
