Files
community_bridge/modules/shops/_default/server.lua
T
MrNewb 343af95794 Remove example scripts and update core logic
Deleted all files in the examples directory to clean up unused or test scripts. Updated fxmanifest.lua to enable ox_lib initialization. Improved error handling and entity tracking in utility functions, added prop removal, and made minor localization and code style adjustments throughout the codebase. Significant reword of inventory module, notification module, and framework module. Added support for wasabi_uikit, added support for keep-progressbars,
2025-12-14 16:22:35 -05:00

87 lines
3.8 KiB
Lua

---@diagnostic disable: duplicate-set-field
Shops = Shops or {}
local registeredShops = {}
local Language = Language or Require("modules/locales/shared.lua")
local locales = Language.Locale
---This can open a shop for the client
---@param src number
---@param shopName string
---@return boolean
Shops.OpenShop = function(src, shopName)
if not shopName and not registeredShops[shopName] then return false, print("community_bridge PLAYERID "..src.." attempted to open invalid shop: "..shopName) end
TriggerClientEvent('community_bridge:Client:openShop', src, 'shop', shopName, registeredShops[shopName])
return true
end
---This will create a shop to use on the client side, shops must be registered server side and exsist in the shop inventory table to allow any purchases passed.
---@param shopName string
---@param shopInventory table
---@param shopCoords table
---@param shopGroups table
---@return boolean
Shops.CreateShop = function(shopName, shopInventory, shopCoords, shopGroups)
if not shopName and not shopInventory and not shopCoords then return false end
if registeredShops[shopName] then return true end
registeredShops[shopName] = {name = shopName, inventory = shopInventory, shopCoords = shopCoords, groups = shopGroups}
return true
end
---This is an internal event to complete a shop transaction, it will verify pass items and amounts are registered to the created shop. Please do not use this function directly.
---@param src number
---@param shopName string
---@param item string
---@param amount number
---@param account string
---@return nil
Shops.CompleteCheckout = function(src, shopName, item, amount, account)
if not src or not shopName or not item or not amount or not account then return end
if not amount or amount <= 0 then return end
local shopData = registeredShops[shopName]
if not shopData then return end
local itemData = nil
for _, data in pairs(shopData.inventory) do
if data.name == item then
itemData = data
break
end
end
if not itemData or not itemData.price then return print("community_bridge Player ID "..src.." attempted to purchase invalid item from shop: "..shopName) end
if itemData.count and itemData.count <= 0 then return Notify.SendNotify(src, locales('Shops.NotEnoughStock'), "error", 5000) end
local totalCost = tonumber(itemData.price) * amount
local balance = Framework.GetAccountBalance(src, account)
if not balance then return end
if balance <= 0 then return Notify.SendNotify(src, locales('Shops.NotEnoughMoney'), "error", 5000) end
if balance < totalCost then return Notify.SendNotify(src, locales('Shops.NotEnoughMoney'), "error", 5000) end
if not Framework.RemoveAccountBalance(src, account, totalCost) then return end
local success = Inventory.AddItem(src, itemData.name, amount)
if not success then
Framework.AddAccountBalance(src, account, totalCost)
return Notify.SendNotify(src, locales('Shops.PurchaseFailed'), "error", 5000)
end
local itemLabel = Inventory.GetItemInfo(itemData.name).label or itemData.name
Notify.SendNotify(src, locales('Shops.PurchasedItem', itemLabel), "success", 5000)
end
---This is an internal event to complete a checkout, complete with multiple validations. Please do not use this event directly.
---@param shopName string
---@param item string
---@param amount number
---@param account string
RegisterNetEvent("community_bridge:Server:completeCheckout", function(shopName, item, amount, account)
local src = source
if not shopName or not item or not account or not amount then return end
if account ~= "money" and account ~= "bank" then return end
amount = tonumber(amount)
if not amount or amount <= 0 then return end
Shops.CompleteCheckout(src, shopName, item, amount, account)
end)
return Shops