forked from Simnation/Main
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
|