247 lines
		
	
	
	
		
			7.7 KiB
		
	
	
	
		
			Lua
		
	
	
	
	
	
			
		
		
	
	
			247 lines
		
	
	
	
		
			7.7 KiB
		
	
	
	
		
			Lua
		
	
	
	
	
	
local QBCore = exports['qb-core']:GetCoreObject()
 | 
						|
 | 
						|
-- Debug-Funktion
 | 
						|
local function Debug(msg)
 | 
						|
    print("^2[Grill 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 = 'nordi_bbq: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('nordi_bbq: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
 | 
						|
 | 
						|
-- Warte auf vollständige Initialisierung von QBCore
 | 
						|
CreateThread(function()
 | 
						|
    if not QBCore then
 | 
						|
        Debug("QBCore nicht gefunden, warte...")
 | 
						|
        while not QBCore do
 | 
						|
            QBCore = exports['qb-core']:GetCoreObject()
 | 
						|
            Wait(100)
 | 
						|
        end
 | 
						|
    end
 | 
						|
    
 | 
						|
    Debug("QBCore initialisiert")
 | 
						|
    
 | 
						|
    -- Registriere Grill-Props für qb-target
 | 
						|
    for _, prop in pairs(Config.GrillProps) do
 | 
						|
        Debug("Registriere Target für Prop: " .. tostring(prop))
 | 
						|
        exports['qb-target']:AddTargetModel(prop, {
 | 
						|
            options = {
 | 
						|
                {
 | 
						|
                    type = "client",
 | 
						|
                    event = "nordi_bbq:OpenGrillMenu",
 | 
						|
                    icon = "fas fa-fire",
 | 
						|
                    label = "Grillen",
 | 
						|
                }
 | 
						|
            },
 | 
						|
            distance = 2.0
 | 
						|
        })
 | 
						|
    end
 | 
						|
    
 | 
						|
    Debug("Target-Optionen registriert")
 | 
						|
end)
 | 
						|
 | 
						|
-- Event zum Öffnen des Grill-Menüs
 | 
						|
RegisterNetEvent('nordi_bbq:OpenGrillMenu', function()
 | 
						|
    Debug("Öffne Grill-Menü")
 | 
						|
    OpenGrillMenu()
 | 
						|
end)
 | 
						|
 | 
						|
-- Funktion zum Überprüfen der Zutaten
 | 
						|
function CheckIngredients(recipe, callback)
 | 
						|
    local hasItems = true
 | 
						|
    local missingItems = {}
 | 
						|
    local checkedItems = 0
 | 
						|
    local totalItems = 0
 | 
						|
    
 | 
						|
    if not recipe or not recipe.requires then
 | 
						|
        Debug("Rezept oder Anforderungen fehlen")
 | 
						|
        callback(false, {})
 | 
						|
        return
 | 
						|
    end
 | 
						|
    
 | 
						|
    for _, _ in pairs(recipe.requires) do
 | 
						|
        totalItems = totalItems + 1
 | 
						|
    end
 | 
						|
    
 | 
						|
    if totalItems == 0 then
 | 
						|
        callback(true, {})
 | 
						|
        return
 | 
						|
    end
 | 
						|
    
 | 
						|
    for _, item in pairs(recipe.requires) do
 | 
						|
        HasItem(item.item, item.amount, function(hasItem)
 | 
						|
            checkedItems = checkedItems + 1
 | 
						|
            
 | 
						|
            if not hasItem then
 | 
						|
                hasItems = false
 | 
						|
                table.insert(missingItems, {
 | 
						|
                    item = item.item,
 | 
						|
                    amount = item.amount
 | 
						|
                })
 | 
						|
            end
 | 
						|
            
 | 
						|
            if checkedItems == totalItems then
 | 
						|
                callback(hasItems, missingItems)
 | 
						|
            end
 | 
						|
        end)
 | 
						|
    end
 | 
						|
end
 | 
						|
 | 
						|
-- Funktion zum Anzeigen fehlender Zutaten
 | 
						|
function ShowMissingIngredients(missingItems)
 | 
						|
    local text = "Fehlende Zutaten:\n"
 | 
						|
    
 | 
						|
    for _, item in pairs(missingItems) do
 | 
						|
        local itemLabel = QBCore.Shared.Items[item.item] and QBCore.Shared.Items[item.item].label or item.item
 | 
						|
        text = text .. "- " .. itemLabel .. " (" .. item.amount .. "x)\n"
 | 
						|
    end
 | 
						|
    
 | 
						|
    QBCore.Functions.Notify(text, "error", 5000)
 | 
						|
end
 | 
						|
 | 
						|
-- Funktion zum Öffnen des Grill-Menüs
 | 
						|
function OpenGrillMenu()
 | 
						|
    Debug("Erstelle Grill-Menü")
 | 
						|
    
 | 
						|
    local menuOptions = {}
 | 
						|
    local recipesChecked = 0
 | 
						|
    local totalRecipes = 0
 | 
						|
    
 | 
						|
    -- Count total recipes
 | 
						|
    for _, _ in pairs(Config.GrillRecipes) do
 | 
						|
        totalRecipes = totalRecipes + 1
 | 
						|
    end
 | 
						|
    
 | 
						|
    -- Check each recipe
 | 
						|
    for _, recipe in pairs(Config.GrillRecipes) do
 | 
						|
        CheckIngredients(recipe, function(hasIngredients, missingItems)
 | 
						|
            recipesChecked = recipesChecked + 1
 | 
						|
            
 | 
						|
            -- Create menu option for this recipe
 | 
						|
            local status = hasIngredients and "~g~✓" or "~r~✗"
 | 
						|
            
 | 
						|
            -- Erstelle Beschreibung mit Zutaten
 | 
						|
            local description = recipe.description .. "\n\nZutaten:"
 | 
						|
            for _, item in pairs(recipe.requires) do
 | 
						|
                local itemLabel = QBCore.Shared.Items[item.item] and QBCore.Shared.Items[item.item].label or item.item
 | 
						|
                local hasItem = not table.find(missingItems, function(missingItem) return missingItem.item == item.item end)
 | 
						|
                local itemStatus = hasItem and "~g~✓" or "~r~✗"
 | 
						|
                description = description .. "\n- " .. item.amount .. "x " .. itemLabel .. " " .. itemStatus
 | 
						|
            end
 | 
						|
            
 | 
						|
            table.insert(menuOptions, {
 | 
						|
                title = recipe.label,
 | 
						|
                description = description,
 | 
						|
                icon = recipe.icon or "fas fa-drumstick-bite",
 | 
						|
                onSelect = function()
 | 
						|
                    StartGrilling(recipe)
 | 
						|
                end
 | 
						|
            })
 | 
						|
            
 | 
						|
            -- If all recipes checked, show the menu
 | 
						|
            if recipesChecked == totalRecipes then
 | 
						|
                ShowGrillMenu(menuOptions)
 | 
						|
            end
 | 
						|
        end)
 | 
						|
    end
 | 
						|
end
 | 
						|
 | 
						|
-- Helper function to find in table
 | 
						|
function table.find(t, cb)
 | 
						|
    for _, v in pairs(t) do
 | 
						|
        if cb(v) then
 | 
						|
            return true
 | 
						|
        end
 | 
						|
    end
 | 
						|
    return false
 | 
						|
end
 | 
						|
 | 
						|
-- Function to show the menu
 | 
						|
function ShowGrillMenu(menuOptions)
 | 
						|
    -- Registriere und zeige das Menü mit ox_lib
 | 
						|
    if lib and lib.registerContext then
 | 
						|
        lib.registerContext({
 | 
						|
            id = 'grill_menu',
 | 
						|
            title = 'Grill',
 | 
						|
            options = menuOptions
 | 
						|
        })
 | 
						|
        
 | 
						|
        lib.showContext('grill_menu')
 | 
						|
    else
 | 
						|
        Debug("FEHLER: ox_lib nicht verfügbar")
 | 
						|
        QBCore.Functions.Notify("Fehler beim Laden des Menüs", "error")
 | 
						|
    end
 | 
						|
end
 | 
						|
 | 
						|
-- Funktion zum Starten des Grillvorgangs
 | 
						|
function StartGrilling(recipe)
 | 
						|
    Debug("Starte Grillvorgang für: " .. recipe.label)
 | 
						|
    
 | 
						|
    -- Überprüfe Zutaten erneut
 | 
						|
    CheckIngredients(recipe, function(hasIngredients, missingItems)
 | 
						|
        if not hasIngredients then
 | 
						|
            ShowMissingIngredients(missingItems)
 | 
						|
            return
 | 
						|
        end
 | 
						|
        
 | 
						|
        -- Animation und Progressbar
 | 
						|
        local animDict = "amb@prop_human_bbq@male@base"
 | 
						|
        local anim = "base"
 | 
						|
        
 | 
						|
        RequestAnimDict(animDict)
 | 
						|
        while not HasAnimDictLoaded(animDict) do
 | 
						|
            Wait(10)
 | 
						|
        end
 | 
						|
        
 | 
						|
        QBCore.Functions.Progressbar("grill_food", "Grille " .. recipe.label .. "...", Config.GrillTime, false, true, {
 | 
						|
            disableMovement = true,
 | 
						|
            disableCarMovement = true,
 | 
						|
            disableMouse = false,
 | 
						|
            disableCombat = true,
 | 
						|
        }, {
 | 
						|
            animDict = animDict,
 | 
						|
            anim = anim,
 | 
						|
            flags = 49,
 | 
						|
        }, {}, {}, function() -- Success
 | 
						|
            Debug("Grillvorgang abgeschlossen")
 | 
						|
            TriggerServerEvent('nordi_bbq:server:GiveGrilledFood', recipe.item, recipe.requires)
 | 
						|
        end, function() -- Cancel
 | 
						|
            Debug("Grillvorgang abgebrochen")
 | 
						|
            QBCore.Functions.Notify("Grillvorgang abgebrochen", "error")
 | 
						|
        end)
 | 
						|
    end)
 | 
						|
end
 |