local spawnedObjects = {} local imageDisplayed = false RegisterNetEvent('pl_printer:notification') AddEventHandler('pl_printer:notification', function(message, type) if Config.Notify == 'ox' then TriggerEvent('ox_lib:notify', {description = message, type = type or "success"}) elseif Config.Notify == 'esx' then Notification(message) elseif Config.Notify == 'okok' then TriggerEvent('okokNotify:Alert', message, 6000, type) elseif Config.Notify == 'qb' then Notification(message, type) elseif Config.Notify == 'wasabi' then exports.wasabi_notify:notify('Printer', message, 6000, type, false, 'fas fa-ghost') elseif Config.Notify == 'custom' then -- Add your custom notifications here end end) function disableControls() SetEntityInvincible(PlayerPedId(), true) FreezeEntityPosition(PlayerPedId(), true) end function enableControls() SetEntityInvincible(PlayerPedId(), false) FreezeEntityPosition(PlayerPedId(), false) end -- Event für QB-Core Inventar RegisterNetEvent("pl_printer:showImageQB") AddEventHandler("pl_printer:showImageQB", function(imageName) print("[DEBUG] Received showImageQB event with imageName: " .. tostring(imageName)) TriggerServerEvent('pl_printer:fetchImageLink', imageName) end) -- Hauptevent zum Anzeigen des Bildes RegisterNetEvent("pl_printer:showImage") AddEventHandler("pl_printer:showImage", function(imageUrl) print("[DEBUG] Received showImage event with URL: " .. tostring(imageUrl)) if not imageDisplayed then imageDisplayed = true SetNuiFocus(true, true) -- Extrahiere den Dateinamen aus der URL für die Dokument-ID local documentId = imageUrl:match(".*/(.*)$") or "unknown" SendNUIMessage({ action = "show", imageUrl = imageUrl, documentId = documentId -- Füge die Dokument-ID hinzu }) disableControls() else print("[DEBUG] Image already displayed, ignoring request") end end) -- NUI-Callback zum Schließen des Bildes RegisterNUICallback('hideFrame', function(data, cb) print("[DEBUG] Hiding image frame") imageDisplayed = false SetNuiFocus(false, false) enableControls() -- Füge einen Callback hinzu, wenn er benötigt wird if cb then cb('ok') end end) -- Sicherheits-Callback für den Fall, dass die Seite neu geladen wird RegisterNUICallback('pageLoaded', function(data, cb) print("[DEBUG] NUI page loaded") -- Stelle sicher, dass der Focus zurückgesetzt wird, falls die Seite neu geladen wurde if not imageDisplayed then SetNuiFocus(false, false) end if cb then cb('ok') end end) -- Event zum Öffnen des Druckermenüs RegisterNetEvent("pl_printer:openprinter") AddEventHandler("pl_printer:openprinter", function() local input = lib.inputDialog('Print Menu', { {type = 'input', label = Locale("image_link"), description = Locale("image_url"), required = true}, {type = 'number', label = Locale("copies"), description = Locale("image_url"), required = true, placeholder='1', icon = 'hashtag'}, }) if input then if input[1] and input[2] then print("[DEBUG] Sending image data to server: " .. input[1] .. ", copies: " .. input[2]) TriggerServerEvent('pl_printer:insertImageData', input[1], input[2]) else _debug('[DEBUG] '..'Invalid Input'..'') end end end) -- Target-System-Konfiguration for _, model in ipairs(Config.PrinterModel) do if GetResourceState('qb-target') == 'started' then exports['qb-target']:AddTargetModel(model, { options = { { icon = 'fa-solid fa-print', label = Locale("prints"), action = function(data) TriggerEvent('pl_printer:openprinter') end, }, }, distance = 2 }) elseif GetResourceState('qtarget') == 'started' or GetResourceState('ox_target') == 'started' then exports.ox_target:addModel(model, { { name = 'printer_interaction', label = Locale("prints"), icon = 'fa-solid fa-print', onSelect = function(data) TriggerEvent('pl_printer:openprinter') end, distance = 2, } }) end end -- Funktion zum Spawnen von Objekten local function spawnObject(object, coords, heading) lib.requestModel(object) if not HasModelLoaded(object) then _debug('[DEBUG] '..object..' failed to load.'..'') return end local entity = CreateObject(object, coords.x, coords.y, coords.z, true, true, true) if DoesEntityExist(entity) then SetEntityHeading(entity, heading) FreezeEntityPosition(entity, true) table.insert(spawnedObjects, entity) else _debug('[DEBUG] '..' Failed to spawn object: '..object..'') end end -- Funktion zum Löschen von gespawnten Objekten local function deleteSpawnedObjects() for _, obj in ipairs(spawnedObjects) do if DoesEntityExist(obj) then DeleteObject(obj) end end spawnedObjects = {} end -- Resource-Start-Event AddEventHandler('onResourceStart', function(resourceName) if GetCurrentResourceName() ~= resourceName then return end for _, location in ipairs(Config.Locations) do spawnObject(location.object, location.coords, location.heading) end end) -- Resource-Stop-Event AddEventHandler('onResourceStop', function(resourceName) if GetCurrentResourceName() ~= resourceName then return end deleteSpawnedObjects() end) -- Funktion für Spieler-Login function onPlayerLoaded() Wait(3000) for _, location in ipairs(Config.Locations) do spawnObject(location.object, location.coords, location.heading) end end -- Debug-Hilfsfunktion function _debug(...) if Config.Debug then print(...) end end -- Notfall-Thread zum Zurücksetzen des NUI-Focus, falls etwas schief geht Citizen.CreateThread(function() while true do Citizen.Wait(1000) if imageDisplayed then -- Prüfe, ob ESC gedrückt wurde (Fallback für den Fall, dass der NUI-Callback nicht funktioniert) if IsControlJustReleased(0, 177) then -- ESC-Taste print("[DEBUG] ESC key detected in thread, resetting focus") imageDisplayed = false SetNuiFocus(false, false) enableControls() SendNUIMessage({ action = "hide" }) end else Citizen.Wait(1000) -- Längere Wartezeit, wenn kein Bild angezeigt wird end end end) -- Füge diesen Code hinzu, um das HTML zu aktualisieren, wenn die Ressource neu gestartet wird AddEventHandler('onResourceStart', function(resourceName) if GetCurrentResourceName() == resourceName then -- Stelle sicher, dass der NUI-Focus zurückgesetzt wird SetNuiFocus(false, false) imageDisplayed = false enableControls() end end) -- Füge diesen Code hinzu, um den NUI-Focus zurückzusetzen, wenn der Spieler stirbt AddEventHandler('playerSpawned', function() if imageDisplayed then imageDisplayed = false SetNuiFocus(false, false) enableControls() SendNUIMessage({ action = "hide" }) end end)