diff --git a/resources/[inventory]/nordi_hookah/client.lua b/resources/[inventory]/nordi_hookah/client.lua index 4930d56c6..30b2b8142 100644 --- a/resources/[inventory]/nordi_hookah/client.lua +++ b/resources/[inventory]/nordi_hookah/client.lua @@ -1,216 +1,70 @@ -local QBCore = exports['qb-core']:GetCoreObject() +Config = {} --- Debug Print Funktion -local function Debug(msg) - print("^2[Shisha Debug] ^7" .. msg) -end +-- Debug-Modus +Config.DebugPoly = false -- Auf true setzen, um Box-Zonen zu sehen --- Ü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) +-- 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", +} --- 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) +-- Progressbar Dauer in ms +Config.PrepareTime = 5000 +Config.SmokeTime = 15000 --- 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) +-- 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}, + } + }, +}