From e69f440a3c65e51ca92efd0ebd65fa57af76ccd3 Mon Sep 17 00:00:00 2001 From: Nordi98 Date: Wed, 25 Jun 2025 03:26:36 +0200 Subject: [PATCH] Update client.lua --- resources/[inventory]/nordi_hookah/client.lua | 278 +++++++++++++----- 1 file changed, 212 insertions(+), 66 deletions(-) diff --git a/resources/[inventory]/nordi_hookah/client.lua b/resources/[inventory]/nordi_hookah/client.lua index 30b2b8142..4930d56c6 100644 --- a/resources/[inventory]/nordi_hookah/client.lua +++ b/resources/[inventory]/nordi_hookah/client.lua @@ -1,70 +1,216 @@ -Config = {} +local QBCore = exports['qb-core']:GetCoreObject() --- Debug-Modus -Config.DebugPoly = false -- Auf true setzen, um Box-Zonen zu sehen +-- Debug Print Funktion +local function Debug(msg) + print("^2[Shisha Debug] ^7" .. msg) +end --- Welche Props sollen als Shisha funktionieren? -Config.ShishaProps = { - "sf_prop_sf_g_bong_01a", -- Funktionierendes Modell - "prop_bong_01", - "hei_heist_sh_bong_01", - "prop_hookah_01", - "prop_sh_bong_01", - "v_res_m_bong", -} +-- Überprüfen, ob qb-target verfügbar ist +CreateThread(function() + Wait(1000) + Debug("Überprüfe, ob qb-target verfügbar ist...") + + if exports['qb-target'] then + Debug("qb-target Export ist verfügbar") + else + Debug("FEHLER: qb-target Export ist NICHT verfügbar!") + end +end) --- Progressbar Dauer in ms -Config.PrepareTime = 5000 -Config.SmokeTime = 15000 +-- Registriere Target für das funktionierende Shisha-Prop +CreateThread(function() + Wait(2000) -- Warte etwas länger, um sicherzustellen, dass alles geladen ist + Debug("Registriere Target für Shisha-Props...") + + -- Registriere das funktionierende Modell + local workingModel = "sf_prop_sf_g_bong_01a" + Debug("Registriere Target für funktionierendes Modell: " .. workingModel) + + exports['qb-target']:AddTargetModel(workingModel, { + options = { + { + type = "client", + event = "nordi_shisha:client:OpenMenu", + icon = 'fas fa-smoking', + label = 'Shisha rauchen', + } + }, + distance = 2.0 + }) + + Debug("Target für Modell registriert: " .. workingModel) + + -- Versuche auch andere Modelle zu registrieren + for _, propName in ipairs(Config.ShishaProps) do + if propName ~= workingModel then + Debug("Versuche zusätzliches Modell zu registrieren: " .. propName) + + exports['qb-target']:AddTargetModel(propName, { + options = { + { + type = "client", + event = "nordi_shisha:client:OpenMenu", + icon = 'fas fa-smoking', + label = 'Shisha rauchen', + } + }, + distance = 2.0 + }) + end + end +end) --- Verfügbare Shisha-Optionen -Config.ShishaOptions = { - { - label = "Apfel Shisha", - description = "Fruchtige Apfel-Shisha", - icon = "fa-solid fa-smoking", - requires = { - {item = "shisha_tobacco", amount = 1}, - } - }, - { - label = "Minze Shisha", - description = "Erfrischende Minz-Shisha", - icon = "fa-solid fa-smoking", - requires = { - {item = "shisha_tobacco", amount = 1}, - } - }, - { - label = "Wassermelone Shisha", - description = "Süße Wassermelonen-Shisha", - icon = "fa-solid fa-smoking", - requires = { - {item = "shisha_tobacco", amount = 1}, - } - }, - { - label = "Traube Shisha", - description = "Aromatische Trauben-Shisha", - icon = "fa-solid fa-smoking", - requires = { - {item = "shisha_tobacco", amount = 1}, - } - }, - { - label = "Blaubeere Shisha", - description = "Süße Blaubeeren-Shisha", - icon = "fa-solid fa-smoking", - requires = { - {item = "shisha_tobacco", amount = 1}, - } - }, - { - label = "Doppel-Apfel Shisha", - description = "Intensive Doppel-Apfel-Shisha", - icon = "fa-solid fa-smoking", - requires = { - {item = "shisha_tobacco", amount = 2}, - } - }, -} +-- Event Handler für das Öffnen des Menüs +RegisterNetEvent('nordi_shisha:client:OpenMenu') +AddEventHandler('nordi_shisha:client:OpenMenu', function() + Debug("Öffne Menü...") + OpenShishaMenu() +end) + +function CheckIngredients(requirements) + local hasItems = true + local missingItems = {} + + 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 + end + + return hasItems, missingItems +end + +function ShowMissingIngredientsWarning(missingItems) + local warningText = "Fehlende Zutaten:\n" + for _, item in ipairs(missingItems) do + local itemLabel = QBCore.Shared.Items[item.item].label + warningText = warningText .. "- " .. itemLabel .. " (benötigt: " .. item.required .. ")\n" + end + + QBCore.Functions.Notify(warningText, "error", 5000) +end + +function OpenShishaMenu() + Debug("Erstelle Menüoptionen...") + local options = {} + + 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 + PrepareAndSmokeShisha(shisha) + else + ShowMissingIngredientsWarning(missingItems) + end + end + }) + end + + Debug("Zeige Menü...") + lib.registerContext({ + id = 'shisha_menu', + title = 'Shisha', + options = options + }) + + lib.showContext('shisha_menu') +end + +function PrepareAndSmokeShisha(selectedShisha) + Debug("Starte Shisha-Vorbereitung...") + local player = PlayerPedId() + local animDict = "anim@heists@humane_labs@finale@keycards" + local anim = "ped_a_enter_loop" + + RequestAnimDict(animDict) + while not HasAnimDictLoaded(animDict) do + Wait(0) + end + + QBCore.Functions.Progressbar("prepare_shisha", selectedShisha.label.." wird vorbereitet...", Config.PrepareTime or 5000, false, true, { + disableMovement = true, + disableCarMovement = true, + disableMouse = false, + disableCombat = true, + }, { + animDict = animDict, + anim = anim, + flags = 49, + }, {}, {}, function() -- Erfolg + Debug("Shisha-Vorbereitung erfolgreich, löse Server-Event aus...") + TriggerServerEvent('shisha-script:consumeTobacco', selectedShisha.requires) + -- Nach erfolgreicher Vorbereitung direkt rauchen + SmokeShisha(selectedShisha) + end, function() -- Abgebrochen + Debug("Shisha-Vorbereitung abgebrochen") + QBCore.Functions.Notify("Vorbereitung abgebrochen", "error") + end) +end + +function SmokeShisha(selectedShisha) + local ped = PlayerPedId() + local propName = "v_corp_lngestoolfd" -- Dieses Modell wird aus dem Stream-Ordner geladen + local propBone = 28422 + + local propCoords = vector3(0.0, 0.0, -0.03) + local propRotation = vector3(0.0, 0.0, 0.0) + + local animDict = "amb@world_human_aa_smoke@male@idle_a" + local animName = "idle_c" + + RequestModel(GetHashKey(propName)) + while not HasModelLoaded(GetHashKey(propName)) do + Wait(0) + end + + RequestAnimDict(animDict) + while not HasAnimDictLoaded(animDict) do + Wait(0) + end + + local prop = CreateObject(GetHashKey(propName), 0.0, 0.0, 0.0, true, true, true) + AttachEntityToEntity(prop, ped, GetPedBoneIndex(ped, propBone), propCoords.x, propCoords.y, propCoords.z, propRotation.x, propRotation.y, propRotation.z, true, true, false, true, 1, true) + + TaskPlayAnim(ped, animDict, animName, 8.0, -8.0, -1, 49, 0, false, false, false) + + QBCore.Functions.Progressbar("smoke_shisha", selectedShisha.label.." rauchen...", Config.SmokeTime or 10000, false, true, { + disableMovement = false, + disableCarMovement = false, + disableMouse = false, + disableCombat = true, + }, {}, {}, {}, function() -- Erfolg + ClearPedTasks(ped) + DeleteObject(prop) + TriggerEvent("evidence:client:SetStatus", "weedsmell", 300) + TriggerServerEvent('hud:server:RelieveStress', math.random(15, 25)) + QBCore.Functions.Notify("Du fühlst dich entspannt...", "success") + end, function() -- Abgebrochen + ClearPedTasks(ped) + DeleteObject(prop) + end) +end + +-- Debug Event +RegisterNetEvent('shisha-script:debug') +AddEventHandler('shisha-script:debug', function(msg) + Debug(msg) +end)