173 lines
		
	
	
	
		
			6.2 KiB
		
	
	
	
		
			Lua
		
	
	
	
	
	
			
		
		
	
	
			173 lines
		
	
	
	
		
			6.2 KiB
		
	
	
	
		
			Lua
		
	
	
	
	
	
local shopItems = {}
 | 
						|
 | 
						|
-- openMenu is called when the player enters a shop location
 | 
						|
-- it checks if the player's current job is allowed to access the shop
 | 
						|
-- if allowed, it caches the shop's items and sends them to the client to display
 | 
						|
function openMenu(lastLocation)
 | 
						|
    -- check if the shop has job restrictions
 | 
						|
    if RY.Locations[lastLocation].jobRestrictions.enabled then
 | 
						|
        local playerJob = nil
 | 
						|
        
 | 
						|
        -- get the player's current job
 | 
						|
        if RY.Options.FrameWork == 'esx' then
 | 
						|
            playerJob = Framework.GetPlayerData().job.name
 | 
						|
        elseif RY.Options.FrameWork == 'qb' then
 | 
						|
            playerJob = Framework.Functions.GetPlayerData().job.name
 | 
						|
        end
 | 
						|
 | 
						|
        -- if the player's job is not allowed to access the shop, return
 | 
						|
        if not RY.Locations[lastLocation].jobRestrictions.jobs[playerJob] then
 | 
						|
            return
 | 
						|
        end
 | 
						|
    end
 | 
						|
 | 
						|
    -- cache the last location
 | 
						|
    cache.lastLocation = lastLocation
 | 
						|
   
 | 
						|
    -- cache the shop's items
 | 
						|
    shopItems = {}
 | 
						|
    for k,v in pairs(RY.Locations[cache.lastLocation].shopItems) do
 | 
						|
        -- create a new item with the item's id, name, label, image, price, category and quantity
 | 
						|
        table.insert(shopItems, {
 | 
						|
            itemID = k,
 | 
						|
            itemName = v.itemName,
 | 
						|
            itemLabel = v.itemLabel,
 | 
						|
            itemImage = v.itemImage,
 | 
						|
            itemPrice = v.itemPrice,
 | 
						|
            itemCategory = v.itemCategory,
 | 
						|
            itemQuantity = 1,
 | 
						|
            itemTotal = v.itemPrice
 | 
						|
        })
 | 
						|
    end
 | 
						|
 | 
						|
    -- blur the screen and send the data to the client to display
 | 
						|
    TriggerScreenblurFadeIn(1)
 | 
						|
    SendNUIMessage({
 | 
						|
        action = 'openMenu',
 | 
						|
        data = {
 | 
						|
            shopItems = shopItems,
 | 
						|
            shopName = RY.Locations[cache.lastLocation].shopName,
 | 
						|
            categorys = RY.Locations[cache.lastLocation].categorysConfig,
 | 
						|
            useBlackMoney = RY.Locations[cache.lastLocation].useBlackMoney
 | 
						|
        }
 | 
						|
    })
 | 
						|
    SetNuiFocus(true, true)
 | 
						|
    inMenu = true
 | 
						|
end
 | 
						|
 | 
						|
-- goToCheckout triggers a server event to process the checkout for a shop
 | 
						|
-- totalPayment: the total amount to be paid
 | 
						|
-- basket: the list of items the player wants to purchase
 | 
						|
-- paymentType: the type of payment (e.g., cash, bank)
 | 
						|
-- useBlackMoney: boolean indicating whether black money should be used
 | 
						|
function goToCheckout(totalPayment, basket, paymentType, useBlackMoney)
 | 
						|
    -- Trigger the server event to handle the checkout process
 | 
						|
    TriggerServerEvent('ry-shops:goToCheckout', totalPayment, basket, paymentType, useBlackMoney)
 | 
						|
end
 | 
						|
 | 
						|
-- Returns the player's current job name
 | 
						|
-- @return string The player's current job name
 | 
						|
function GetPlayerJob()
 | 
						|
    -- Check if the framework is set and handle potential null references
 | 
						|
    if RY.Options.FrameWork then
 | 
						|
        -- If the framework is ESX, return the player's job name from the ESX player data
 | 
						|
        if RY.Options.FrameWork == 'esx' then
 | 
						|
            local playerData = Framework.GetPlayerData()
 | 
						|
            if playerData and playerData.job then
 | 
						|
                return playerData.job.name
 | 
						|
            end
 | 
						|
        -- If the framework is QBCore, return the player's job name from the QBCore player data
 | 
						|
        elseif RY.Options.FrameWork == 'qb' then
 | 
						|
            local playerData = Framework.Functions.GetPlayerData()
 | 
						|
            if playerData and playerData.job then
 | 
						|
                return playerData.job.name
 | 
						|
            end
 | 
						|
        end
 | 
						|
    end
 | 
						|
end
 | 
						|
 | 
						|
-- SetupTargets adds a target for the player to interact with at the given coordinates
 | 
						|
-- @param k string The key of the shop
 | 
						|
-- @param v table The table containing the shop data
 | 
						|
-- @param coords vector3 The coordinates to place the target
 | 
						|
function SetupTargets(k, v, coords)
 | 
						|
    if RY.Options.oxTarget then
 | 
						|
        -- Add a target for the player to interact with at the given coordinates
 | 
						|
        -- The target is a box zone with the specified size and rotation
 | 
						|
        -- The target has one option: to open the shop menu
 | 
						|
        exports.ox_target:addBoxZone({
 | 
						|
            coords = coords,
 | 
						|
            size = vector3(3, 3, 3),
 | 
						|
            rotation = 45,
 | 
						|
            debug = false,
 | 
						|
            options = {
 | 
						|
                {
 | 
						|
                    name = 'shop' .. k,
 | 
						|
                    event = 'ry-shops:openMenu',
 | 
						|
                    args = { location = k },
 | 
						|
                    icon = v.oxTargetConfig.icon,
 | 
						|
                    label = v.oxTargetConfig.label
 | 
						|
                }
 | 
						|
            }
 | 
						|
        })
 | 
						|
    end
 | 
						|
end
 | 
						|
 | 
						|
-- Returns the shared object of the framework
 | 
						|
-- @return table The shared object of the framework
 | 
						|
function getFramework()
 | 
						|
    -- If the framework is ESX, return the shared object of ESX
 | 
						|
    if RY.Options.FrameWork == 'esx' then
 | 
						|
        return exports['es_extended']:getSharedObject()
 | 
						|
    -- If the framework is QBCore, return the shared object of QBCore
 | 
						|
    elseif RY.Options.FrameWork == 'qb' then
 | 
						|
        return exports['qb-core']:GetCoreObject()
 | 
						|
    end
 | 
						|
end
 | 
						|
 | 
						|
-- Closes the shop menu and resets the state
 | 
						|
-- Triggers the screen blur to fade out over 1 second
 | 
						|
-- Sends a message to the NUI to close the menu
 | 
						|
-- Disables focus on the NUI
 | 
						|
-- Sets the inMenu variable to false
 | 
						|
function closeMenu()
 | 
						|
	-- Trigger the screen blur to fade out over 1 second
 | 
						|
	TriggerScreenblurFadeOut(1000)
 | 
						|
	
 | 
						|
	-- Send a message to the NUI to close the menu
 | 
						|
	SendNUIMessage({action = "closeMenu"})
 | 
						|
	
 | 
						|
	-- Disable focus on the NUI
 | 
						|
	SetNuiFocus(false, false)
 | 
						|
	
 | 
						|
	-- Set the inMenu variable to false
 | 
						|
	inMenu = false
 | 
						|
end
 | 
						|
 | 
						|
function DrawText3D(x, y, z, text)
 | 
						|
    -- Set the scale of the text
 | 
						|
    SetTextScale(0.35, 0.35)
 | 
						|
    -- Set the font of the text
 | 
						|
    SetTextFont(4)
 | 
						|
    -- Make the text proportional
 | 
						|
    SetTextProportional(1)
 | 
						|
    -- Set the color of the text (white with an alpha of 215)
 | 
						|
    SetTextColour(255, 255, 255, 215)
 | 
						|
    -- Prepare the text for drawing
 | 
						|
    SetTextEntry("STRING")
 | 
						|
    -- Center the text
 | 
						|
    SetTextCentre(true)
 | 
						|
    -- Add the text to be drawn
 | 
						|
    AddTextComponentString(text)
 | 
						|
    -- Set the origin for drawing the text
 | 
						|
    SetDrawOrigin(x, y, z, 0)
 | 
						|
    -- Draw the text at the specified origin
 | 
						|
    DrawText(0.0, 0.0)
 | 
						|
 | 
						|
    -- Calculate the background rectangle width based on text length
 | 
						|
    local factor = (string.len(text)) / 370
 | 
						|
    -- Draw a background rectangle behind the text
 | 
						|
    DrawRect(0.0, 0.0 + 0.0125, 0.017 + factor, 0.03, 0, 0, 0, 75)
 | 
						|
    -- Clear the drawing origin
 | 
						|
    ClearDrawOrigin()
 | 
						|
end
 |