diff --git a/resources/[inventory]/nordi_hookah/client.lua b/resources/[inventory]/nordi_hookah/client.lua index c1e9ad529..393c8cb28 100644 --- a/resources/[inventory]/nordi_hookah/client.lua +++ b/resources/[inventory]/nordi_hookah/client.lua @@ -5,6 +5,44 @@ local function Debug(msg) print("^2[Shisha Debug] ^7" .. msg) end +-- Cache system for item checks +local itemCheckCache = {} +local lastCheckTime = {} +local checkCooldown = 1000 -- 1 second cooldown between checks for the same item + +-- Function to check if player has an item +local function HasItem(itemName, amount, callback) + -- Check cache first (to avoid spamming the server) + local cacheKey = itemName .. "_" .. amount + local currentTime = GetGameTimer() + if itemCheckCache[cacheKey] ~= nil and lastCheckTime[cacheKey] and + (currentTime - lastCheckTime[cacheKey]) < checkCooldown then + callback(itemCheckCache[cacheKey]) + return + end + + -- Create a unique event name for this check + local uniqueEventName = 'shisha-script:itemCheckResult:' .. math.random(100000, 999999) + + -- Register the event handler + local eventHandler = RegisterNetEvent(uniqueEventName) + AddEventHandler(uniqueEventName, function(hasItem) + itemCheckCache[cacheKey] = hasItem + lastCheckTime[cacheKey] = GetGameTimer() + callback(hasItem) + end) + + -- Request the check from server with our unique event name + TriggerServerEvent('shisha-script:checkItem', itemName, amount, uniqueEventName) + + -- Set a timeout to prevent hanging if something goes wrong + SetTimeout(1000, function() + if not lastCheckTime[cacheKey] or (currentTime - lastCheckTime[cacheKey]) >= checkCooldown then + callback(false) + end + end) +end + -- Check if qb-target is available CreateThread(function() Wait(1000) @@ -68,22 +106,34 @@ AddEventHandler('nordi_shisha:client:OpenMenu', function() end) -- Check if player has required ingredients -function CheckIngredients(requirements) +function CheckIngredients(requirements, callback) local hasItems = true local missingItems = {} + local checkedItems = 0 + local totalItems = #requirements - for _, requirement in ipairs(requirements) do - local hasItem = QBCore.Functions.HasItem(requirement.item, requirement.amount) - if not hasItem then - hasItems = false - table.insert(missingItems, { - item = requirement.item, - required = requirement.amount - }) - end + if totalItems == 0 then + callback(true, {}) + return end - return hasItems, missingItems + for _, requirement in ipairs(requirements) do + HasItem(requirement.item, requirement.amount, function(hasItem) + checkedItems = checkedItems + 1 + + if not hasItem then + hasItems = false + table.insert(missingItems, { + item = requirement.item, + required = requirement.amount + }) + end + + if checkedItems == totalItems then + callback(hasItems, missingItems) + end + end) + end end -- Show warning for missing ingredients @@ -101,33 +151,55 @@ end function OpenShishaMenu() Debug("Erstelle Menüoptionen...") local options = {} + local shishaChecked = 0 + local totalShishas = #Config.ShishaOptions for _, shisha in ipairs(Config.ShishaOptions) do - local hasIngredients, missing = CheckIngredients(shisha.requires) - local description = shisha.description .. "\n\nBenötigt:" - - for _, req in ipairs(shisha.requires) do - local itemLabel = QBCore.Shared.Items[req.item].label - local hasItem = QBCore.Functions.HasItem(req.item, req.amount) - local status = hasItem and "~g~✓" or "~r~✗" - description = description .. "\n- " .. req.amount .. "x " .. itemLabel .. " " .. status - end - - table.insert(options, { - title = shisha.label, - description = description, - icon = shisha.icon, - onSelect = function() - local canMake, missingItems = CheckIngredients(shisha.requires) - if canMake then - PrepareShisha(shisha) - else - ShowMissingIngredientsWarning(missingItems) - end + CheckIngredients(shisha.requires, function(hasIngredients, missingItems) + shishaChecked = shishaChecked + 1 + + local description = shisha.description .. "\n\nBenötigt:" + + for _, req in ipairs(shisha.requires) do + local itemLabel = QBCore.Shared.Items[req.item].label + local hasItem = not table.find(missingItems, function(item) return item.item == req.item end) + local status = hasItem and "~g~✓" or "~r~✗" + description = description .. "\n- " .. req.amount .. "x " .. itemLabel .. " " .. status end - }) + + table.insert(options, { + title = shisha.label, + description = description, + icon = shisha.icon, + onSelect = function() + CheckIngredients(shisha.requires, function(canMake, missingItems) + if canMake then + PrepareShisha(shisha) + else + ShowMissingIngredientsWarning(missingItems) + end + end) + end + }) + + if shishaChecked == totalShishas then + ShowShishaMenu(options) + end + end) end +end +-- Helper function to find in table +function table.find(t, cb) + for _, v in ipairs(t) do + if cb(v) then + return true + end + end + return false +end + +function ShowShishaMenu(options) Debug("Zeige Menü...") lib.registerContext({ id = 'shisha_menu', diff --git a/resources/[inventory]/nordi_hookah/server.lua b/resources/[inventory]/nordi_hookah/server.lua index fb532f6fe..676609eab 100644 --- a/resources/[inventory]/nordi_hookah/server.lua +++ b/resources/[inventory]/nordi_hookah/server.lua @@ -5,6 +5,31 @@ local function Debug(msg) print("^2[Shisha Debug] ^7" .. msg) end +-- Function to check if player has an item +local function HasItem(source, itemName, amount) + local items = exports["tgiann-inventory"]:GetPlayerItems(source) + if not items then return false end + + local count = 0 + for _, item in pairs(items) do + if item.name == itemName then + count = count + item.count + if count >= amount then + return true + end + end + end + + return false +end + +-- Event for client to check if player has an item +RegisterNetEvent('shisha-script:checkItem', function(itemName, amount, callbackEvent) + local src = source + local hasItem = HasItem(src, itemName, amount) + TriggerClientEvent(callbackEvent, src, hasItem) +end) + RegisterNetEvent('shisha-script:consumeTobacco') AddEventHandler('shisha-script:consumeTobacco', function(requirements) Debug("Tabak-Verbrauch-Event ausgelöst") @@ -15,7 +40,7 @@ AddEventHandler('shisha-script:consumeTobacco', function(requirements) -- Überprüfe nochmal die Zutaten local hasAllItems = true for _, requirement in ipairs(requirements) do - if not Player.Functions.HasItem(requirement.item, requirement.amount) then + if not HasItem(src, requirement.item, requirement.amount) then hasAllItems = false break end @@ -25,7 +50,7 @@ AddEventHandler('shisha-script:consumeTobacco', function(requirements) Debug("Spieler hat alle benötigten Items") -- Entferne die benötigten Items for _, requirement in ipairs(requirements) do - Player.Functions.RemoveItem(requirement.item, requirement.amount) + exports["tgiann-inventory"]:RemoveItem(src, requirement.item, requirement.amount) TriggerClientEvent('inventory:client:ItemBox', src, QBCore.Shared.Items[requirement.item], "remove") end